75 Commits

Author SHA1 Message Date
af5c6f9626 renforcer par un uuid la génération auto d'un password 2022-09-15 14:54:34 +02:00
87c9d362f2 suppression de variable d'environnement inutile 2022-09-15 14:48:36 +02:00
50322de0ff use cache for minio 2022-08-31 12:05:06 +02:00
d539a2a740 adaptation pour minio 2022-08-31 11:20:22 +02:00
d2fde8a871 reset test no unlink upload minio 2022-08-30 20:41:50 +02:00
296252e7fb test no unlink upload minio 2022-08-30 20:39:12 +02:00
7a3faf4b31 upload init move to media 2022-08-30 20:00:41 +02:00
270bbfceb4 reglage css 2022-08-29 12:09:22 +02:00
5f07c26693 updgrade yarn & composer 2022-08-29 10:39:58 +02:00
84bcecb9dc cron on reconfigure 2022-08-28 15:13:09 +02:00
12463fe1b2 login app hydra 2022-08-28 13:25:20 +02:00
c3328a1ba0 integration hydra apps 2022-08-27 18:24:56 +02:00
21fb28a6f0 hydra passwordless 2022-08-26 15:13:22 +02:00
7962e2ca9a correctifs 2022-08-26 11:46:17 +02:00
10b93e9873 correctifs 2022-08-26 11:39:12 +02:00
9cf7ff655b correctifs 2022-08-25 19:25:45 +02:00
953cee63eb mise en place de minio 2022-08-24 14:40:10 +02:00
f97bac6e5e redis session 2022-08-22 16:24:02 +02:00
7fdf41aac8 erreur sur ldapadd organisation 2022-08-22 13:13:10 +02:00
4922fb1c89 maj reconfigure 2022-07-29 14:44:52 +02:00
b6cb6ca57a revue start migration 2022-07-29 09:38:04 +02:00
93f238ff60 enlever l'init de l'apps du composer install 2022-07-28 16:13:01 +02:00
df9e7a3e69 first commit symfony 6 2022-07-26 16:03:53 +02:00
8181ca1c39 first commit symfony 6 2022-07-25 17:16:08 +02:00
2bba3d5695 first commit symfony 6 2022-07-25 09:34:16 +02:00
52736bc3f8 first commit symfony 6 2022-07-22 14:06:35 +00:00
dd85dcd74a first commit symfony 6 2022-07-22 13:35:04 +00:00
4cdabaa4e3 first commit symfony 6 2022-07-21 16:33:00 +02:00
7d0a07816c first commit symfony 6 2022-07-21 16:21:21 +02:00
c26e1e64ca first commit symfony 6 2022-07-21 16:20:16 +02:00
5c4961748b first commit symfony 6 2022-07-21 16:15:47 +02:00
d9bfbb6b3c la master va devenir la branch symfony 6 2022-07-21 16:07:13 +02:00
d58efd8841 Synchronisation scribe niveaux + eleves classes + profs classes (ref #34132) 2022-05-10 09:23:38 +02:00
691e0bd00f first commit 2022-05-09 15:55:05 +02:00
27f797dac3 synchro modif 2022-05-09 15:25:57 +02:00
d24cb0f5e3 svg 2022-03-21 10:20:02 +01:00
d00a4e5a12 svg 2022-03-20 21:13:59 +01:00
d8db726fc4 ajout variable activer_revprox si non existante 2021-12-08 09:50:15 +01:00
9052eee01d templetisation du service wssnineboard 2021-12-07 14:58:29 +01:00
2cff02d95e templetisation du service wssnineboard 2021-12-07 14:51:12 +01:00
58f3b7daf8 websocket server by service 2021-12-07 14:05:21 +01:00
49085bcc6f secretkey for amonecole 2021-12-06 17:04:22 +01:00
fec9980c6b configuration reverse proxy wss 2021-12-06 16:12:17 +01:00
7fbe3ab465 conf proxy wss 2021-12-06 14:42:37 +01:00
0c48b87692 casdebug 2021-03-11 15:01:24 +01:00
9e899cd73d sonde dnma alone 2021-02-17 12:52:01 +01:00
5dc5ea4644 sonde dnma alone 2021-02-17 11:13:49 +01:00
3ca1bf3d31 ano ckeditor 2021-02-03 13:41:46 +01:00
6f70f97ebb gestion synchro no mail 2021-01-21 17:18:26 +01:00
a5a57cc9e0 gestion synchro no mail 2021-01-21 16:23:14 +01:00
d883e3453c livraison des lib manquantes 2021-01-13 15:21:42 +01:00
627ae06eb0 retour sur derniere ligne cron 2020-12-16 11:35:38 +01:00
e4fe1d90b4 svg 2020-11-26 16:09:11 +01:00
c0def72147 websocket 2020-11-23 13:08:51 +01:00
e7dcd35f04 svg 2020-11-15 17:48:52 +01:00
31491b4840 mise à niveau 2020-11-13 17:52:57 +01:00
faccc4b643 mise à niveau proxy et asset 2020-11-13 13:32:07 +01:00
54d2049f06 refonte sonde 2020-10-23 15:21:10 +02:00
d4bc3dadd4 refonte sonde 2020-10-23 15:11:06 +02:00
82c70cc917 revu filtre sso 2020-10-23 14:47:05 +02:00
c35ddd8e0d mise à niveau log 2020-10-19 11:06:14 +02:00
13758c10fa reconfigure nine 2020-10-05 16:10:04 +02:00
43307f22cb Mise à jour de 'README.md' 2020-10-02 16:36:14 +02:00
a7434f5a49 nommer la session 2020-07-20 11:14:57 +02:00
54ffb73121 systeme de script en moulinette sur reconfigure 2020-07-10 11:07:42 +02:00
eb23661e1b correctif purgeFile 2020-07-08 17:21:23 +02:00
d773f10099 correctif purgeFile 2020-07-08 17:17:05 +02:00
afb74179f8 passage à symfony 5.1 2020-07-08 16:55:17 +02:00
ce8eaaeaba plus de var dico pour api key 2020-07-08 16:01:11 +02:00
6083829367 plus de var dico pour api key 2020-07-08 15:58:21 +02:00
74db908c15 plus de var dico pour api key 2020-07-08 15:57:06 +02:00
5bad73b8fd plus de template sur la génération de la key 2020-07-08 15:52:00 +02:00
fef4a492ae ajout log rotate 2020-07-08 15:06:07 +02:00
48c4e580dc Merge branch 'master' of https://forge.cadoles.com/afornerot/nineskeletor 2020-07-08 14:56:36 +02:00
9d1d2f6f49 localisation du cron.log 2020-07-08 14:56:03 +02:00
3525 changed files with 53408 additions and 45412 deletions

140
.env Normal file
View File

@ -0,0 +1,140 @@
# Symfony
APP_ENV=prod
APP_SECRET=changeme
# Messenger
MESSENGER_TRANSPORT_DSN=doctrine://default?auto_setup=0
# Database
DATABASE_URL="postgresql://symfony:ChangeMe@127.0.0.1:5432/app?serverVersion=13&charset=utf8"
# Redis Session
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
# Mailer
MAILER_METHOD=smtp
MAILER_DSN=smtp://127.0.0.1:1025
MAILER_NOREPLY=noreply@noreply.fr
# Basic
APP_WEBURL=127.0.0.1:8000
APP_MASTERIDENTITY=SQL # SQL | SSO | LDAP
APP_AUTH=SQL # SQL | CAS| LDAP | OPENID | à faire SAML
APP_ALIAS=/
APP_NAME=Nineskeletor
APP_MODEREGISTRATION= # null | BYADMIN | BYUSER
APP_ADMINS='["admin"]'
APP_NIVEAU01LABEL="Niveau 01"
APP_NIVEAU02LABEL="Niveau 02"
# Synchronisation
APP_SYNCHRO= # Synchronisation null | LDAP2NINE | NINE2LDAP | NINE2NINE
APP_SYNDCHROPURGENIVEAU01=1 # Purger les niveau01s obsolète en cas de synchronisation
APP_SYNDCHROPURGENIVEAU02=1 # Purger les niveau02s obsolète en cas de synchronisation
APP_SYNDCHROPURGEGROUP=1 # Purger les groups obsolète en cas de synchronisation
APP_SYNDCHROPURGEUSER=1 # Purger les users obsolète en cas de synchronisation
# LDAP
LDAP_HOST= # host du serveur ldap
LDAP_PORT= # port du serveur ldap
LDAP_USETLS=0 # connection TLS 0/1
LDAP_USERWRITER=0 # LDAP_USER compte writer ? 0/1
LDAP_USER= # DN compte access ldap
LDAP_PASSWORD= # Password comte access ldap
LDAP_BASEDN= # Base DN ex:o=gouv,c=fr
LDAP_BASEORGANISATION= # Base Organisation ex:ou=nine,o=gouv,c=fr
LDAP_BASENIVEAU01= # Base Niveau01 ex:ou=niveau01,ou=nine,o=gouv,c=fr
LDAP_BASENIVEAU02= # Base Niveau02 ex:ou=niveau02,ou=nine,o=gouv,c=fr
LDAP_BASEGROUP= # Base Group ex:ou=groups,ou=nine,o=gouv,c=fr
LDAP_BASEUSER= # Base User ex:ou=users,ou=nine,o=gouv,c=fr
LDAP_USERNAME=uid # Attribut id d'un user
LDAP_FIRSTNAME=givenname # Attribut firstname d'un user
LDAP_LASTNAME=sn # Attribut lastname d'un user
LDAP_EMAIL=mail # Attribut email d'un user
LDAP_AVATAR= # Attribut avatar d'un user
LDAP_MEMBEROF=memberof # Attribut memberof d'un user
LDAP_GROUPGID=gidnumber # Attribut gid d'un groupe
LDAP_GROUPNAME=cn # Attribut name d'un groupe
LDAP_GROUPMEMBER=memberuid # Attribut stockant les membres d'un groupe
LDAP_GROUPMEMBERISDN=0 # LDAP_GROUPMEMBER stocke un uid ou un dn ? 0/1
LDAP_FILTERGROUP=(cn=*) # requete ldap pour rechercher les groupes
LDAP_FILTERUSER=(uid=*) # requete ldap pour rechercher les users
LDAP_AUTOSUBMIT=1 # if APP_AUTH = LDAP autocréer les users non existant
LDAP_AUTOUPDATE=1 # if APP_AUTH = LDAP automodifier les users existant
# If APP_AUTH = CAS
CAS_HOST=
CAS_PORT=
CAS_PATH=
CAS_USERNAME=username
CAS_EMAIL=email
CAS_LASTNAME=lastname
CAS_FIRSTNAME=firstname
CAS_AVATAR=
CAS_NIVEAU01=
CAS_GROUP=
CAS_AUTOSUBMIT=1 # if APP_AUTH = CAS autocréer les users non existant
CAS_AUTOUPDATE=1 # if APP_AUTH = CAS automodifier les users existant
# If APP_AUTH = OPENID
OAUTH_CLIENTID=
OAUTH_CLIENTSECRET=
OAUTH_LOGINURL=
OAUTH_LOGOUTURL=
OAUTH_TOKENURL=
OAUTH_USERINFO=
OAUTH_USERNAME=username
OAUTH_EMAIL=email
OAUTH_LASTNAME=lastname
OAUTH_FIRSTNAME=firstname
OAUTH_AVATAR=
OAUTH_NIVEAU01=
OAUTH_GROUP=
OAUTH_AUTOSUBMIT=1 # if APP_AUTH = OPENID autocréer les users non existant
OAUTH_AUTOUPDATE=1 # if APP_AUTH = OPENID automodifier les users existant
# IF APP_SYNCHRO=NINE2NINE
NINE_URL=
NINE_SECRET=
# If APP_MODEREGISTRATION != NULL
APP_MODEREGISTRATIONTERM=6 # Temps en heure de la durée de validité de l'inscription
# Proxy
PROXY_USE=0
PROXY_HOST=
PROXY_PORT=
# Audit
AUDIT_USE=0
# Sonde statistic
SONDE_USE=0
SONDE_URL=
# Mercure
MERCURE_URL=https://127.0.0.1/.well-known/mercure
MERCURE_PUBLIC_URL=https://127.0.0.1/.well-known/mercure
MERCURE_JWT_SECRET="!changeme!changeme!changeme!changeme!changeme!changeme!"
# Minio
MINIO_URL=http://127.0.0.1:9000
MINIO_KEY=minio
MINIO_SECRET=changeme
MINIO_BUCKET=nine
MINIO_ROOT=
MINIO_PATH_STYLE=1
MINIO_SECURE=0
# Hydra apps
HYDRA_LOGINCHALLENGE="http://127.0.0.1:4445/oauth2/auth/requests/login?login_challenge="
HYDRA_LOGINCHALLENGEACCEPT="http://127.0.0.1:4445/oauth2/auth/requests/login/accept?login_challenge="
HYDRA_CONSENTCHALLENGE="http://127.0.0.1:4445/oauth2/auth/requests/consent?consent_challenge="
HYDRA_CONSENTCHALLENGEACCEPT="http://127.0.0.1:4445/oauth2/auth/requests/consent/accept?consent_challenge="
# Lock
LOCK_DSN="postgresql://symfony:ChangeMe@127.0.0.1:5432/app?serverVersion=13&charset=utf8"
# Sentry
SENTRY_DSN=

29
.gitignore vendored Normal file
View File

@ -0,0 +1,29 @@
/docker-compose.override.yml
/.env.local
/.env.local.php
/.env.*.local
/config/secrets/prod/prod.decrypt.private.php
/public/bundles/
/var/
/vendor/
/node_modules/
/public/build/
npm-debug.log
yarn-error.log
/phpunit.xml
.phpunit.result.cache
.phpunit.result.cache
/phpunit.xml
/uploads
!/public/uploads/avatar
/public/uploads/avatar/*
!/public/uploads/avatar/admin.jpg
!/public/uploads/avatar/noavatar.jpg
!/public/uploads/avatar/system.jpg
!/public/uploads/avatar
/public/uploads/logo/*
!/public/uploads/logo/logo.png
/public/uploads/ckeditor

3
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"esbonio.sphinx.confDir": ""
}

View File

@ -1,26 +0,0 @@
################################
# Makefile
################################
SOURCE=nineskeletor
VERSION=1.0
EOLE_VERSION=2.7
EOLE_RELEASE=2.7.1
PKGAPPS=web
################################
# Début de zone à ne pas éditer
################################
include eole.mk
include apps.mk
################################
# Fin de zone à ne pas éditer
################################
# Makefile rules dedicated to application
# if exists
ifneq (, $(strip $(wildcard $(SOURCE).mk)))
include $(SOURCE).mk
endif

356
README.md Normal file → Executable file
View File

@ -1,222 +1,154 @@
# Renommer le squelette
## Dupliquer nineskeletor et renommer en nineXXXX
Puis effectuer les changement suivants
- Renommer db/nineskeletor-create-0.sql en db/nineXXXX-create-0.sql
- Modifier db/nineXXXX-create-0.sql et changer le nom de la base de données en nineXXXX
- Renommer dicos/90_nineskeletor.xml en dicos/90_nineXXXX.xml
- Modifier dicos/nineXXXX-nineXXXX.xml et remplacer tout les nineskeletor en nineXXXX
- Renommer postservice/90-nineskeletor en postservice/90-nineXXXX
- Modifier postservice/90-nineXXXX et remplacer tout les nineskeletor en nineXXXX
- Renommer pretemplate/25-nineskeletor en pretemplate/25-nineXXXX
- Modifier pretemplate/25-nineXXXX et remplacer tout les nineskeletor en nineXXXX
- Renommer src/nineskeletor-1.0 en src/nineXXXX-1.0
- Renommer sso/filtres/nineskeletor.ini en sso/filtres/nineXXXX.ini
- Renommer sso/filtres/nineskeletor_apps.ini en sso/filtres/nineXXXX_apps.ini
- Modifier sso/filtres/nineXXXX_apps.ini et remplacer tout les nineskeletor en nineXXXX
- Renommer tmpl/nineskeletor.cron en tmpl/nineXXXX.cron
- Modifier tmpl/nineXXXX.cron et remplacer tout les nineskeletor en nineXXXX
- Renommer tmpl/nineskeletor-apache.conf en tmpl/nineXXXX-apache.conf
- Modifier tmpl/nineXXXX-apache.conf et remplacer tout les nineskeletor en nineXXXX
- Renommer tmpl/nineskeletor-db.yml en tmpl/nineXXXX-db.yml
- Modifier tmpl/nineXXXX-db.yml et remplacer tout les nineskeletor en nineXXXX
- Renommer tmpl/nineskeletor-env.local en tmpl/nineXXXX-env.local
- Modifier tmpl/nineXXXX-env.local et remplacer tout les nineskeletor en nineXXXX
- Modifier src/webpack.config.js et remplacer tout les nineskeletor en nineXXXX
- Renommer tmpl/nineskeletor-proxy.sh en tmpl/nineXXXX-proxy.sh
- Modifier Makefile et remplacer tout les nineskeletor en nineXXXX
- Remplacer logo public/images/logo.png
# NINESKELETOR
## Compilier les asset
- installer nodejs
- installer npm
- installer n
- passer sur la verison 8 de node
- yarn encore dev
- yarn encore prod
Squelette applicatif symfony
# Description du squelette
## Installation for local dev
```
curl -1sLf 'https://dl.cloudsmith.io/public/symfony/stable/setup.deb.sh' | sudo -E bash
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
apt-get update
apt-get install git docker-compose composer symfony-cli php php-xml php-zip php-gd php-curl php-pgsql yarn
git clone https://forge.cadoles.com/Cadoles/nineskeletor.git
cd nineskeletor
symfony server:ca:install
cp .env .env.local
```
Change in .env.local APP_SECRET variabile
This secret is the init password for admin user
## Bundle
- DebugBundle
- DoctrineBundle
- DoctrineMigrationsBundle
- FOSCKEditorBundle
- FOSRestBundle
- FrameworkBundle
- KnpSnappyBundle
- MakerBundle
- MonologBundle
- NelmioApiDocBundle
- OneupUploaderBundle
- SecurityBundle
- SensioFrameworkExtraBundle
- SwiftmailerBundle
- TetranzSelect2EntityBundle
- TwigBundle
- TwigExtraBundle
- WebProfilerBundle
- WebpackEncoreBundle
## Asset
### Tag app
- jQuery = https://www.npmjs.com/package/jquery
- bootstrap = https://www.npmjs.com/package/bootstrap
- datatables.net-bs4 = https://www.npmjs.com/package/datatables.net-bs4
- fontawsome-free = https://www.npmjs.com/package/@fortawesome/fontawesome-free
- moment = https://www.npmjs.com/package/moment
- select2 = https://www.npmjs.com/package/select2
- crop-select-js = https://www.npmjs.com/package/crop-select-js
- tempusdominus-bootstrap-4 = https://www.npmjs.com/package/tempusdominus-bootstrap-4
- spectrum-colorpicker2 = https://www.npmjs.com/package/spectrum-colorpicker2
Change in .env.local MERCURE_JWT_SECRET variable
And report this secret in docker-compose.yml MERCURE_PUBLISHER_JWT_KEY and MERCURE_SUBSCRIBER_JWT_KEY
### Tag morris
- raphael = https://www.npmjs.com/package/raphael
- morris.js = https://www.npmjs.com/package/morris.js
And finish with
```
bin/reconfigure.sh
```
### Tag fullcalendar
- @fullcalendar/core = https://www.npmjs.com/package/@fullcalendar/core
- @fullcalendar/interaction = https://www.npmjs.com/package/@fullcalendar/interaction
- @fullcalendar/daygrid = https://www.npmjs.com/package/@fullcalendar/daygrid
## Run for local
### Tag dropzone
- dropzone = https://www.npmjs.com/package/dropzone
```
symfony server:start
```
## Installation for apache
exec installation for local dev except /bin/reconfigure.sh
Between
Change in .env.local APP_WEBURL variable
For sample
```
APP_WEBURL=MyDomaine
```
Change in .env.local MERCURE variable like
The /hub alias must be the same on Apache configuration ProxyPass and ProxyPassReverse
```
MERCURE_URL=http://MyDomaine/hub/.well-known/mercure
MERCURE_PUBLIC_URL=http://MyDomaine/hub/.well-known/mercure
```
Create the file docker-compose.override.yml like
The port 9090 must be the same in the apache configuration ProxyPass and ProxyPassReverse
```
version: '3'
services:
mercure:
ports:
- "9090:80"
environment:
SERVER_NAME: ':80'
MERCURE_PUBLISHER_JWT_KEY: '!ChangeMe!'
MERCURE_SUBSCRIBER_JWT_KEY: '!ChangeMe!'
MERCURE_EXTRA_DIRECTIVES: |
cors_origins http://MyDomaine
```
And finish with
```
bin/reconfigure.sh
```
After install and configure apache
```
apt-get install apache libmodapache2
a2enmod rewrite proxy_http
service apache2 restart
```
sample apache configuration in /etc/apache2/site-available/000-
```
<VirtualHost *:80>
DocumentRoot /var/www/html/nineskeletor/public
CustomLog /var/log/apache2/access.log common
ErrorLog /var/log/apache2/error.log
<Directory /var/www/html/nineskeletor/public>
DirectoryIndex index.php
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI}::$0 ^(/.+)/(.*)::\2$
RewriteRule .* - [E=BASE:%1]
RewriteCond %{HTTP:Authorization} .+
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0]
RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ %{ENV:BASE}/index.php [L]
</IfModule>
<IfModule !mod_rewrite.c>
<IfModule mod_alias.c>
RedirectMatch 307 ^/$ /index.php/
</IfModule>
</IfModule>
</Directory>
# For mercure server
ProxyPass /hub/ http://localhost:9090/
ProxyPassReverse /hub/ http://localhost:9090/
</VirtualHost>
<VirtualHost *:1080>
# For mailer server
ProxyPass / http://localhost:1080/
ProxyPassReverse / http://localhost:1080/
</VirtualHost>
```
## Cron Job
Make sure the cron job is running all the minute
You can copy this bin/nineskeletor.cron in your crontab
```
cp /var/www/html/nineskeletor/bin/nineskeletor.cron /etc/cron.d/nineskeletor
```
## Messenger worker
Make sure the messenger consume the bus
Needed to send mail
You can copy this bin/nineskeletor.service in your systemd
```
cp /var/www/html/nineskeletor/bin/nineskeletor.service /etc/systemd/system/
systemctl enable nineskeletor.service
systemctl start nineskeletor.service
```
## Parameters
Provient du template env.local
- appEnv = PROD
- appSecret = valeur du fichier .key autogénéré au premier reconfigure
- appWeburl = Valeur du dicos web_url
- appAuth = Valeur du dicos CAS
- appAlias = En dur l'alias web
- appName = Nom de l'application
- appCron = En dur à true pour activer le système de cron
- appMasteridentity = Valeur du dicos soit Ninegate soit LDAP
- appMasterurl = Si appMasteridentity la valeur du dicos correspondant à l'url du Ninegate maître
- appMasterkey = Si appMasteridentity la valeur du dicos correspondant à la clé d'API du Ninegate maître
- databaseName = En dur le nom de la base
- databaseUser = En dur le user de la base
- databasePassword = Autogénéré par le reconfigure
- databaseHost = Valeur du dicos pour le host de la base
- appMailmethod = Valeur du dicos soit sendmail soit smtp. sendmail par défaut si exim est activé sur le serveur
- appMailurl = Si smtp url calculé combinant smtphost smtpport smtpencryption smtpauthmode smtpuser smtppwd
- appMailnoreply = Valeur du dicos du noreplay
- ldapModel = si masteridentity à LDAP soit open soit scribe
- ldapHost = Valeur dicos Host LDAP
- ldapPort = Valeur dicos Port LDAP
- ldapUser = Valeur dicos User LDAP
- ldapPassword = Valeur dicos Password LDAP
- ldapBasedn = Valeur dicos Basedn LDAP
- ldapUsername = si Scribe en dur sinon valeur du dicos champs annuaire utilisé comme username
- ldapFirstname = si Scribe en dur sinon valeur du dicos champs annuaire utilisé comme firstname
- ldapLastname = si Scribe en dur sinon valeur du dicos champs annuaire utilisé comme lastname
- ldapEmail = si Scribe en dur sinon valeur du dicos champs annuaire utilisé comme email
- ldapFiltergroup = si Scribe en dur sinon valeur du dicos filtre ldap de recherche des groupes
- ldapFilteruser = si Scribe en dur sinon valeur du dicos filtre ldap des groupes
- ldapAdmins = Liste des admins obligatoire = Admin + valeur dicos
- casHost = Valeur dicos du host SSO
- casPort = Valeur dicos du Porst SSO
- casPath = Valeur dicos du Path SSO
- casUsername = Valeur en dur correspondant au filtre sso du username
- casEmail = Valeur en dur correspondant au filtre sso du email
- casLastname = Valeur en dur correspondant au filtre sso du lastname
- casFirstname = Valeur en dur correspondant au filtre sso du fistname
- proxyUse = Valeur dicos utiliser oui/non un proxy
- proxyHost = Si oui valeurs du dicos du host proxy
- proxyPort = Si oui valeurs du dicos du post proxy
- sondeUse = Valeur dicos utiliser oui/non une sonde statistique
- sondeUrl = Si oui url de la sonde statistique
## Sécurité
4 rôles possibles
- ROLE_ADMIN
- ROLE_MODO
- ROLE_MASTER
- ROLE_USER
4 routes protégés
- /user = accèssible à ROLE_USER / ROLE_MASTER / ROLE_MODO / ROLE_ADMIN
- /master = accèssible à ROLE_MASTER / ROLE_MODO / ROLE_ADMIN
- /modo = = accèssible à ROLE_MODO / ROLE_ADMIN
- /admin = = accèssible à ROLE_ADMIN
## Job
Nineskeletor intègre un système de job.
Ce système va exécuter des commandes symfony à interval régulier.
De base les jobs suivants sont livrés :
- app:sendMail = toutes les minutes = Execution du spool de mail en attente
- app:dumpBdd = toutes les nuits à 2h00 = Dump de la base
- app:purgeFile = toutes les nuits à 3h00 = Suppresion des fichiers obsolètes
- app:synchroUsers = toutes les nuites à 3h00 = Synchronisation des comptes utilisateurs soit via LDAP soit via Ninegate
Pour ajouter un job à la listes, modifier la commande app:initCron qui sera exécutée à chaque reconfigure
## Service
- app.password.encoder = encodage password sur la methode que l'annuaire
- app.upload.listener = action à réaliser sur upload via oneupload
- app.upload.samename = permet d'uploader un fichier et préserver le nom de fichier via oneupload
- app.ldap.service = fonction ldap
- app.sendmail.transport = executuion du spool de mail via sendmail
- app.mail.service = fonction envoit de mail
- app.twig.extension = extention twig
## Twig
### Twig Constantes
Variables globales twig reprises des parametres symfony
- appAlias
- appAuth
- appName
- appCron
- appMasteridentity
- sondeUse
- sondeUrl
### Twig Extention
App\Twig\AppExtension
- filtre = urlAvatar à placer avec user.avatar afin de définir l'url complète de l'avatar du user
### Twig Template de base
#### templates/base.html.twig
Deux paramétres non obligatoire
- useheader = permet d'afficher ou non la bannière dans la page = false par défaut
- usesidebar = permet d'afficher oun non la sidebar dans la page = false par défaut
Block
- block encorelinktags = pour déclarer des encore_link_tags spécifique à la page (encorelinktags app est intégré de base)
- block localstyle = pour déclarer des propriétés css spécifique à page (Include/style.css.twig est intégré de base)
- block body = le corps de la page
- block encorescripttags pour déclarer des encore_script_tags spécifique à la page (encorescripttags app est intégré de base)
- block localjavascript = pour déclarer du js spécifique à la page (Include/javascript.js.twig est intégré de base)
#### templates/Include/style.css.twig
Style de l'applicaiton en surcouche de bootstrap
#### templates/Include/sidebar.html.twig
La sidebar de l'application quand elle est affichée
#### templates/Include/javascript.js.twig
Librairie js de l'application
- object a et button s'ils ont un attribut data-method et data_confirm proposeront une confirmation à l'utilisateur avant de poursuivre l'action
- ModalLoad(idmodal,titre,url) = permet d'afficher en modal l'url indiqué en parametre. Par défaut on dispose de la modal #mymodal
#### templates/Form/fields.htms.twig
Mise en forme de champs de formulaire

64
apps.mk
View File

@ -1,64 +0,0 @@
#
# NE PAS EDITER CE FICHIER
#
# Voir Makefile
##########################
# Application web envole #
##########################
ifneq (, $(filter oui web, $(PKGAPPS)))
#
# Sanity check
#
ifeq (, $(filter-out X.X, $(strip $(VERSION))))
$(error $$(VERSION) variable has incorrect value '$(VERSION)')
endif
# Where to store web application files
WEB_PATH := $(DESTDIR)/var/www/html
# Envole
sharenvole_PROG_DIR := $(DESTDIR)/usr/share/envole/$(SOURCE)
src_$(SOURCE)-$(VERSION)_REC_DIR := $(WEB_PATH)/$(SOURCE)
src_plugins-$(VERSION)_REC_DIR := $(WEB_PATH)/$(SOURCE)/plugin
src_lang-$(VERSION)_REC_DIR := $(WEB_PATH)/$(SOURCE)/lang
endif
##########################
# Application EOLE flask #
##########################
ifneq (, $(filter flask, $(PKGAPPS)))
#
# Sanity check
#
ifeq (, $(filter-out XXX, $(strip $(FLASK_MODULE))))
$(error $$(FLASK_MODULE) variable has incorrect value '$(FLASK_MODULE)')
endif
ifeq (, $(strip $(wildcard src/$(FLASK_MODULE).conf)))
$(error missing eoleflask configuration file 'src/$(FLASK_MODULE).conf')
endif
# Everything is related to mount point
APPS_MOUNT_POINT := $(shell sed -ne 's|^"MOUNT_POINT"[[:space:]]*:[[:space:]]*"/\([^"]*\)",|\1|p' \
src/$(FLASK_MODULE).conf)
ifeq (, $(strip $(APPS_MOUNT_POINT)))
$(error no "MOUNT_POINT" in eoleflask configuration file 'src/$(FLASK_MODULE).conf')
endif
# eole-flask configuration
src_DATA_DIR := $(DESTDIR)/etc/eole/flask/available
# Where to store flask application files
FLASK_PATH := $(eole_DIR)/flask/$(APPS_MOUNT_POINT)
# static files
src_$(FLASK_MODULE)_static_REC_DIR := $(FLASK_PATH)/static
src_$(FLASK_MODULE)_templates_REC_DIR := $(FLASK_PATH)/templates
src_$(FLASK_MODULE)_instance_REC_DIR := $(FLASK_PATH)/resources
endif

51
assets/app.js Normal file
View File

@ -0,0 +1,51 @@
// JQuery
window.$ = window.jQuery = require('jquery');
// JQueryui
require('jquery-ui');
// Bootstrap
require('bootstrap');
require('bootstrap/dist/css/bootstrap.css');
// Fontawesome
require('@fortawesome/fontawesome-free/css/all.css');
// Datatables
require('datatables.net-bs4');
require('datatables.net-bs4/css/dataTables.bootstrap4.min.css');
require('./js/datatables.init.js');
// Select2
require('select2');
require('select2/dist/js/i18n/fr.js');
require('select2/dist/css/select2.css');
require('@ttskch/select2-bootstrap4-theme/dist/select2-bootstrap4.css');
$(() => {
$('.select2entity').select2(
{
theme: 'bootstrap4',
language: "fr"
}
);
});
// Spectrum-colorpicker2
require('spectrum-colorpicker2/dist/spectrum.min.js');
require('spectrum-colorpicker2/dist/spectrum.min.css');
// CropSelectJs
require('crop-select-js/crop-select-js.min.css');
window.CropSelectJs = require('crop-select-js/crop-select-js.min.js');
// Start the Stimulus application
import './bootstrap';
// App sytle
import './styles/font.css';
import './styles/app.css';
// App js
require('./js/app.js');

11
assets/bootstrap.js vendored Normal file
View File

@ -0,0 +1,11 @@
import { startStimulusApp } from '@symfony/stimulus-bridge';
// Registers Stimulus controllers from controllers.json and in the controllers/ directory
export const app = startStimulusApp(require.context(
'@symfony/stimulus-bridge/lazy-controller-loader!./controllers',
true,
/\.[jt]sx?$/
));
// register any custom, 3rd party controllers here
// app.register('some_controller_name', SomeImportedController);

View File

@ -0,0 +1,259 @@
CKEDITOR.dialog.add( 'html5video', function( editor ) {
return {
title: editor.lang.html5video.title,
minWidth: 500,
minHeight: 100,
contents: [ {
id: 'info',
label: editor.lang.html5video.infoLabel,
elements: [
{
type: 'vbox',
padding: 0,
children: [
{
type: 'hbox',
widths: [ '365px', '110px' ],
align: 'right',
children: [ {
type: 'text',
id: 'url',
label: editor.lang.html5video.allowed,
required: true,
validate: CKEDITOR.dialog.validate.notEmpty( editor.lang.html5video.urlMissing ),
setup: function( widget ) {
this.setValue( widget.data.src );
},
commit: function( widget ) {
widget.setData( 'src', this.getValue() );
}
},
{
type: 'button',
id: 'browse',
// v-align with the 'txtUrl' field.
// TODO: We need something better than a fixed size here.
style: 'display:inline-block;margin-top:14px;',
align: 'center',
label: editor.lang.common.browseServer,
hidden: true,
filebrowser: 'info:url'
} ]
} ]
},
{
type: 'checkbox',
id: 'responsive',
label: editor.lang.html5video.responsive,
setup: function( widget ) {
this.setValue( widget.data.responsive );
},
commit: function( widget ) {
widget.setData( 'responsive', this.getValue()?'true':'' );
}
},
{
type: 'vbox',
padding: 0,
children: [{
type: 'hbox',
widths: [ '365px', '110px' ],
align: 'right',
children: [ {
type: 'text',
id: 'poster',
label: editor.lang.html5video.poster,
setup: function( widget ) {
this.setValue( widget.data.poster );
},
commit: function( widget ) {
widget.setData( 'poster', this.getValue() );
}
},
{
type: 'button',
id: 'browseposter',
// v-align with the 'txtUrl' field.
// TODO: We need something better than a fixed size here.
style: 'display:inline-block;margin-top:14px;',
align: 'center',
label: editor.lang.common.browseServer,
hidden: true,
filebrowser:{action:"Browse",target:"info:poster",url:editor.config.filebrowserImageBrowseUrl}
} ]
}]
},
{
type: 'checkbox',
id: 'controls',
label: editor.lang.html5video.controls,
setup: function (widget) {
this.setValue(widget.data.controls);
},
commit: function (widget) {
widget.setData('controls', this.getValue() ? 'true' : '');
}
},
{
type: 'hbox',
id: 'size',
children: [ {
type: 'text',
id: 'width',
label: editor.lang.common.width,
setup: function( widget ) {
if ( widget.data.width ) {
this.setValue( widget.data.width );
}
},
commit: function( widget ) {
widget.setData( 'width', this.getValue() );
}
},
{
type: 'text',
id: 'height',
label: editor.lang.common.height,
setup: function( widget ) {
if ( widget.data.height ) {
this.setValue( widget.data.height );
}
},
commit: function( widget ) {
widget.setData( 'height', this.getValue() );
}
},
]
},
{
type: 'hbox',
id: 'alignment',
children: [ {
type: 'radio',
id: 'align',
label: editor.lang.common.align,
items: [
[editor.lang.common.alignCenter, 'center'],
[editor.lang.common.alignLeft, 'left'],
[editor.lang.common.alignRight, 'right'],
[editor.lang.common.alignNone, 'none']
],
'default': 'center',
setup: function( widget ) {
if ( widget.data.align ) {
this.setValue( widget.data.align );
}
},
commit: function( widget ) {
widget.setData( 'align', this.getValue() );
}
} ]
} ]
},
{
id: 'Upload',
hidden: true,
filebrowser: 'uploadButton',
label: editor.lang.html5video.upload,
elements: [ {
type: 'file',
id: 'upload',
label: editor.lang.html5video.btnUpload,
style: 'height:40px',
size: 38
},
{
type: 'fileButton',
id: 'uploadButton',
filebrowser: 'info:url',
label: editor.lang.html5video.btnUpload,
'for': [ 'Upload', 'upload' ]
} ]
},
{
id: 'advanced',
label: editor.lang.html5video.advanced,
elements: [ {
type: 'vbox',
padding: 10,
children: [ {
type: 'hbox',
widths: ["33%", "33%", "33%"],
children: [ {
type: 'radio',
id: 'autoplay',
label: editor.lang.html5video.autoplay,
items: [
[editor.lang.html5video.yes, 'yes'],
[editor.lang.html5video.no, 'no']
],
'default': 'no',
setup: function( widget ) {
if ( widget.data.autoplay ) {
this.setValue( widget.data.autoplay );
}
},
commit: function( widget ) {
widget.setData( 'autoplay', this.getValue() );
}
},
{
type: 'radio',
id: 'loop',
label: editor.lang.html5video.loop,
items: [
[editor.lang.html5video.yes, 'yes'],
[editor.lang.html5video.no, 'no']
],
'default': 'no',
setup: function( widget ) {
if ( widget.data.loop ) {
this.setValue( widget.data.loop );
}
},
commit: function( widget ) {
widget.setData( 'loop', this.getValue() );
}
},
{
type: 'radio',
id: 'allowdownload',
label: editor.lang.html5video.allowdownload,
items: [
[editor.lang.html5video.yes, 'yes'],
[editor.lang.html5video.no, 'no']
],
'default': 'no',
setup: function( widget ) {
if ( widget.data.allowdownload ) {
this.setValue(widget.data.allowdownload);
}
},
commit: function( widget ) {
widget.setData( 'allowdownload', this.getValue() );
}
} ]
},
{
type: 'hbox',
children: [ {
type: "text",
id: 'advisorytitle',
label: editor.lang.html5video.advisorytitle,
'default': '',
setup: function( widget ) {
if ( widget.data.advisorytitle ) {
this.setValue(widget.data.advisorytitle);
}
},
commit: function( widget ) {
widget.setData( 'advisorytitle', this.getValue() );
}
} ]
} ]
} ]
} ]
};
} );

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -0,0 +1,20 @@
CKEDITOR.plugins.setLang( 'html5video', 'bg', {
button: 'Вмъква HTML5 видео',
title: 'HTML5 видео',
infoLabel: 'Видео',
allowed: 'Допустими файлови разширения: MP4, WebM, Ogv',
urlMissing: 'URL адресът на източника на видео липсва.',
videoProperties: 'Свойства на видео',
upload: 'Качване',
btnUpload: 'Изпрати на сървъра',
advanced: 'Разширено',
autoplay: 'Автоматично изпълнение',
allowdownload: 'Позволено изтегляне?',
advisorytitle: 'Заглавие',
yes: 'Да',
no: 'Не',
loop: 'Циклично изпълнение',
responsive: 'Адаптивна ширина',
controls: 'Показване на контролите',
poster: 'URL миниатюра'
} );

View File

@ -0,0 +1,20 @@
CKEDITOR.plugins.setLang( 'html5video', 'ca', {
button: "Insereix un vídeo HTML5",
title: "Vídeo HTML5",
infoLabel: "Informació del vídeo",
allowed: "Extensions d'arxius permeses: MP4, WebM, Ogv",
urlMissing: "Falta l'URL de la font de vídeo.",
videoProperties: "Propietats de vídeo",
upload: "Pujar",
btnUpload: "Envia-lo al servidor",
advanced: "Avançat",
autoplay: "Reproducció automàtica?",
allowdownload: 'Allow download?',
advisorytitle: 'Advisory title',
yes: "Sí",
no: "No",
loop: "Bucle?",
responsive: "Ample adaptatiu",
controls: "Mostra els controls",
poster: "Miniatura"
} );

View File

@ -0,0 +1,17 @@
CKEDITOR.plugins.setLang( 'html5video', 'de', {
button: 'HTML5 Video einfügen',
title: 'HTML5 Video',
infoLabel: 'Video Infos',
allowed: 'Erlaubte Dateierweiterungen: MP4, WebM, Ogv',
urlMissing: 'Sie haben keine URL zur Video-Datei angegeben.',
videoProperties: 'Video-Einstellungen',
upload: 'Hochladen',
btnUpload: 'Zum Server senden',
advanced: 'Erweitert',
autoplay: 'Autoplay?',
allowdownload: 'Allow download?',
advisorytitle: 'Advisory title',
yes: 'Ja',
no: 'Nein',
controls: 'Steuerelemente anzeigen'
} );

View File

@ -0,0 +1,20 @@
CKEDITOR.plugins.setLang( 'html5video', 'en', {
button: 'Insert HTML5 video',
title: 'HTML5 video',
infoLabel: 'Video info',
allowed: 'Allowed file extensions: MP4, WebM, Ogv',
urlMissing: 'Video source URL is missing.',
videoProperties: 'Video properties',
upload: 'Upload',
btnUpload: 'Send it to the server',
advanced: 'Advanced',
autoplay: 'Autoplay?',
allowdownload: 'Allow download?',
advisorytitle: 'Advisory title',
yes: 'Yes',
no: 'No',
loop: 'Loop?',
responsive: 'Responsive width',
controls: 'Show controls',
poster: 'Thumbnail'
} );

View File

@ -0,0 +1,18 @@
CKEDITOR.plugins.setLang( 'html5video', 'es', {
button: 'Insertar video HTML5',
title: 'Video HTML5',
infoLabel: 'Información del video',
allowed: 'Extensiones de archivo permitidas: MP4, WebM, Ogv',
urlMissing: 'La URL del video no puede estar vacía.',
videoProperties: 'Propiedades del video',
upload: 'Cargar',
btnUpload: 'Enviar al servidor',
advanced: 'Avanzado',
autoplay: '¿Reproducir automáticamente?',
allowdownload: 'Allow download?',
advisorytitle: 'Advisory title',
yes: 'Sí',
no: 'No',
responsive: '¿Responsive?',
controls: 'Mostrar controles'
} );

View File

@ -0,0 +1,17 @@
CKEDITOR.plugins.setLang( 'html5video', 'eu', {
button: 'Txertatu HTML5 bideoa',
title: 'HTML5 bideoa',
infoLabel: 'Bideoaren informazioa',
allowed: 'Baimendutako fitxategi luzapenak: MP4, WebM, Ogv',
urlMissing: 'Bideoaren URLak ezin du hutsik egon.',
videoProperties: 'Bideoaren propietateak',
upload: 'Kargatu',
btnUpload: 'Bidali zerbitzarira',
advanced: 'Aurreratua',
autoplay: 'Automatikoki erreproduzitu?',
allowdownload: 'Allow download?',
advisorytitle: 'Advisory title',
yes: 'Bai',
no: 'Ez',
controls: 'Erakutsi kontrolak?'
} );

View File

@ -0,0 +1,18 @@
CKEDITOR.plugins.setLang( 'html5video', 'fa', {
button: 'وارد کردن ویدیوی HTML5',
title: 'ویدیوی HTML5',
infoLabel: 'اطلاعات ویدیو',
allowed: 'پسوندهای مجاز فایل: MP4, WebM, Ogv',
urlMissing: 'URL منبع ویدیو پیدا نشد.',
videoProperties: 'خواهص ویدیو',
upload: 'بارگذاری',
btnUpload: 'ارسال به سرور',
advanced: 'پیشرفته',
autoplay: 'پخش خودکار؟',
allowdownload: 'Allow download?',
advisorytitle: 'Advisory title',
yes: 'بله',
no: 'خیر',
responsive: 'عرض واکنشگرا',
controls: 'نمایش کنترل؟'
} );

View File

@ -0,0 +1,17 @@
CKEDITOR.plugins.setLang( 'html5video', 'fr', {
button: 'Insérer un lecteur video HTML5',
title: 'HTML5 video',
infoLabel: 'Informations video',
allowed: 'Extensions de fichiers autorisées: MP4, WebM, Ogv',
urlMissing: 'URL de la source video manquante. Veuillez la renseigner.',
videoProperties: 'Propriétés Video',
upload: 'Télécharger',
btnUpload: 'Envoyer vers le serveur',
advanced: 'Avancé',
autoplay: 'Jouer automatiquement ?',
allowdownload: 'Allow download?',
advisorytitle: 'Advisory title',
yes: 'Oui',
no: 'Non',
controls: 'Afficher les contrôles ?'
} );

View File

@ -0,0 +1,18 @@
CKEDITOR.plugins.setLang('html5video', 'he', {
button: 'הוסף וידאו HTML5',
title: 'וידאו HTML5',
infoLabel: 'מידע וידאו',
allowed: 'סוגי קבצים מורשים: MP4, WebM, Ogv',
urlMissing: 'כתובת הוידאו חסרה',
videoProperties: 'מאפייני וידאו',
upload: 'העלה',
btnUpload: 'שלח לשרת',
advanced: 'מתקדם',
autoplay: 'ניגון אוטומטי?',
allowdownload: 'Allow download?',
advisorytitle: 'Advisory title',
yes: 'כן',
no: 'לא',
responsive: 'רוחב רספונסיבי'
});

View File

@ -0,0 +1,20 @@
CKEDITOR.plugins.setLang( 'html5video', 'ko', {
button: 'HTML5 비디오 추가하기',
title: 'HTML5 비디오',
infoLabel: '비디오 정보',
allowed: '허용된 파일 확장자들: MP4, WebM, Ogv',
urlMissing: '비디오 Url이 없습니다.',
videoProperties: '비디오 속성',
upload: '업로드',
btnUpload: '서버로 전송',
advanced: '고급',
autoplay: '자동재생?',
allowdownload: 'Allow download?',
advisorytitle: 'Advisory title',
yes: '네',
no: '아니오',
loop: '무한반복?',
responsive: '반응형 너비',
controls: '컨트롤 보여주기',
poster: '썸네일'
} );

View File

@ -0,0 +1,18 @@
CKEDITOR.plugins.setLang( 'html5video', 'pl', {
button: 'Wstaw HTML5 video',
title: 'HTML5 video',
infoLabel: 'Informacje',
allowed: 'Dozwolone typy plików: MP4, WebM, Ogv',
urlMissing: 'Nie znaleziono URL do pliku video.',
videoProperties: 'Właściwości',
upload: 'Wrzuć plik',
btnUpload: 'Wyślij na serwer',
advanced: 'Zaawansowane',
autoplay: 'Autoodtwarzanie?',
allowdownload: 'Allow download?',
advisorytitle: 'Advisory title',
yes: 'Tak',
no: 'Nie',
responsive: 'Szerokość responsywna',
controls: 'Pokaż kontrolki'
} );

View File

@ -0,0 +1,18 @@
CKEDITOR.plugins.setLang( 'html5video', 'pt-br', {
button: 'Inserir vídeo HTML5',
title: 'HTML5 video',
infoLabel: 'Informações do Vídeo',
allowed: 'Extensões permitidas: MP4, WebM, Ogv',
urlMissing: 'O URL do vídeo está faltando.',
videoProperties: 'Propriedades do vídeo',
upload: 'Upload',
btnUpload: 'Enviar para o servidor',
advanced: 'Avançado',
autoplay: 'Autoplay?',
allowdownload: 'Allow download?',
advisorytitle: 'Advisory title',
yes: 'Sim',
no: 'Não',
responsive: 'Largura responsiva',
controls: 'Exibir controles'
} );

View File

@ -0,0 +1,18 @@
CKEDITOR.plugins.setLang( 'html5video', 'pt', {
button: 'Inserir vídeo HTML5',
title: 'HTML5 video',
infoLabel: 'Informações do Vídeo',
allowed: 'Extensões permitidas: MP4, WebM, Ogv',
urlMissing: 'O URL do vídeo está faltando.',
videoProperties: 'Propriedades do vídeo',
upload: 'Upload',
btnUpload: 'Enviar para o servidor',
advanced: 'Avançado',
autoplay: 'Autoplay?',
allowdownload: 'Allow download?',
advisorytitle: 'Advisory title',
yes: 'Sim',
no: 'Não',
responsive: 'Largura responsiva',
controls: 'Exibir controles'
} );

View File

@ -0,0 +1,21 @@
CKEDITOR.plugins.setLang( 'html5video', 'ru', {
button: 'Вставить HTML5 видео',
title: 'HTML5 видео',
infoLabel: 'Видео',
allowed: 'Допустимые расширения файлов: MP4, WebM, Ogv',
urlMissing: 'Не выбран источник видео',
videoProperties: 'Свойства видео',
upload: 'Загрузить',
btnUpload: 'Загрузить на сервер',
advanced: 'Дополнительно',
autoplay: 'Автовоспроизведение',
allowdownload: 'Разрешить загрузку',
advisorytitle: 'Заголовок',
yes: 'Да',
no: 'Нет',
responsive: 'Адаптивная ширина',
controls: 'Показать элементы управления',
loop: 'Зациклить',
poster: 'Постер',
advisorytitle: 'Пояснительный текст'
} );

View File

@ -0,0 +1,17 @@
CKEDITOR.plugins.setLang( 'html5video', 'uk', {
button: 'Вставити HTML5 відео',
title: 'HTML5 відео',
infoLabel: 'Інформація',
allowed: 'Допустимі розширення файлів: MP4, WebM, Ogv',
urlMissing: 'Не обрано джерела відео',
videoProperties: 'Властивості відео',
upload: 'Відвантажити',
btnUpload: 'Відвантажити на сервер',
advanced: 'Додатково',
autoplay: 'Автовідтворення?',
allowdownload: 'Allow download?',
advisorytitle: 'Advisory title',
yes: 'Так',
no: 'Ні',
controls: 'Показати елементи керування?'
} );

View File

@ -0,0 +1,17 @@
CKEDITOR.plugins.setLang( 'html5video', 'uz', {
button: 'HTML5 video qoshing',
title: 'HTML5 video',
infoLabel: 'Video ma\'lumot',
allowed: 'Ruxsat etilgan kengaytmalar: MP4, WebM, Ogv',
urlMissing: 'Video\'ning URL manbasi topilmadi.',
videoProperties: 'Video xususiyatlari',
upload: 'Yuklash',
btnUpload: 'Serverga jonatish',
advanced: 'Kengaytrilgan',
autoplay: 'Avtoijro?',
allowdownload: 'Allow download?',
advisorytitle: 'Advisory title',
yes: 'Ha',
no: 'Yoq',
controls: 'Tekshiruvlarni korsatish'
} );

View File

@ -0,0 +1,18 @@
CKEDITOR.plugins.setLang( 'html5video', 'zh-cn', {
button: '发布HTML5视频',
title: 'HTML5视频',
infoLabel: '视频信息',
allowed: '支持格式: MP4, WebM, Ogv',
urlMissing: '视频url',
videoProperties: '视频属性',
upload: '上传视频',
btnUpload: '上传',
advanced: '高级',
autoplay: '自动播放',
allowdownload: 'Allow download?',
advisorytitle: 'Advisory title',
yes: '是',
no: '否',
responsive: '自动宽度',
controls: '显示控件?'
} );

View File

@ -0,0 +1,196 @@
CKEDITOR.plugins.add( 'html5video', {
requires: 'widget',
lang: 'bg,ca,de,en,eu,es,ru,uk,fr,ko,pt,pt-br,pl',
icons: 'html5video',
init: function( editor ) {
editor.widgets.add( 'html5video', {
button: editor.lang.html5video.button,
template: '<div class="ckeditor-html5-video"></div>',
/*
* Allowed content rules (http://docs.ckeditor.com/#!/guide/dev_allowed_content_rules):
* - div-s with text-align,float,margin-left,margin-right inline style rules and required ckeditor-html5-video class.
* - video tags with src, controls, width and height attributes.
*/
allowedContent: 'div[data-responsive](!ckeditor-html5-video){text-align,float,margin-left,margin-right}; video[src,poster,controls,autoplay,width, height,loop]{max-width,height};',
requiredContent: 'div(ckeditor-html5-video); video[src];',
upcast: function( element ) {
return element.name === 'div' && element.hasClass( 'ckeditor-html5-video' );
},
dialog: 'html5video',
init: function() {
var src = '';
var autoplay = '';
var loop = '';
var controls = '';
var align = this.element.getStyle( 'text-align' );
var width = '';
var height = '';
var poster = '';
// If there's a child (the video element)
if ( this.element.getChild( 0 ) ) {
// get it's attributes.
src = this.element.getChild( 0 ).getAttribute( 'src' );
width = this.element.getChild( 0 ).getAttribute( 'width' );
height = this.element.getChild( 0 ).getAttribute( 'height' );
autoplay = this.element.getChild(0).getAttribute('autoplay');
allowdownload = !this.element.getChild( 0 ).getAttribute( 'controlslist' );
loop = this.element.getChild( 0 ).getAttribute( 'loop' );
advisorytitle = this.element.getChild( 0 ).getAttribute( 'title' );
controls = this.element.getChild(0).getAttribute('controls');
responsive = this.element.getAttribute( 'data-responsive' );
poster = this.element.getChild( 0 ).getAttribute( 'poster' );
}
if ( src ) {
this.setData( 'src', src );
if ( align ) {
this.setData( 'align', align );
} else {
this.setData( 'align', 'none' );
}
if ( width ) {
this.setData( 'width', width );
}
if ( height ) {
this.setData( 'height', height );
}
if ( autoplay ) {
this.setData( 'autoplay', 'yes' );
}
if ( allowdownload ) {
this.setData( 'allowdownload', 'yes' );
}
if ( loop ) {
this.setData( 'loop', 'yes' );
}
if ( advisorytitle ) {
this.setData( 'advisorytitle', advisorytitle );
}
if ( responsive ) {
this.setData( 'responsive', responsive );
}
if (controls) {
this.setData('controls', controls);
}
if ( poster ) {
this.setData('poster', poster);
}
}
},
data: function() {
// If there is an video source
if ( this.data.src ) {
// and there isn't a child (the video element)
if ( !this.element.getChild( 0 ) ) {
// Create a new <video> element.
var videoElement = new CKEDITOR.dom.element( 'video' );
// Set the controls attribute.
if (this.data.controls) {
videoElement.setAttribute('controls', 'controls');
}
// Append it to the container of the plugin.
this.element.append( videoElement );
}
this.element.getChild( 0 ).setAttribute( 'src', this.data.src );
if (this.data.width) this.element.getChild( 0 ).setAttribute( 'width', this.data.width );
if (this.data.height) this.element.getChild( 0 ).setAttribute( 'height', this.data.height );
if ( this.data.responsive ) {
this.element.setAttribute("data-responsive", this.data.responsive);
this.element.getChild( 0 ).setStyle( 'max-width', '100%' );
this.element.getChild( 0 ).setStyle( 'height', 'auto' );
} else {
this.element.removeAttribute("data-responsive");
this.element.getChild( 0 ).removeStyle( 'max-width' );
this.element.getChild( 0 ).removeStyle( 'height' );
}
if (this.data.poster) this.element.getChild( 0 ).setAttribute('poster', this.data.poster);
}
this.element.removeStyle( 'float' );
this.element.removeStyle( 'margin-left' );
this.element.removeStyle( 'margin-right' );
if ( this.data.align === 'none' ) {
this.element.removeStyle( 'text-align' );
} else {
this.element.setStyle( 'text-align', this.data.align );
}
if ( this.data.align === 'left' ) {
this.element.setStyle( 'float', this.data.align );
this.element.setStyle( 'margin-right', '10px' );
} else if ( this.data.align === 'right' ) {
this.element.setStyle( 'float', this.data.align );
this.element.setStyle( 'margin-left', '10px' );
}
if ( this.element.getChild( 0 ) ) {
if ( this.data.autoplay === 'yes' ) {
this.element.getChild( 0 ).setAttribute( 'autoplay', 'autoplay' );
} else {
this.element.getChild( 0 ).removeAttribute( 'autoplay' );
}
if ( this.data.loop === 'yes' ) {
this.element.getChild( 0 ).setAttribute( 'loop', 'loop' );
} else {
this.element.getChild( 0 ).removeAttribute( 'loop' );
}
if ( this.data.allowdownload === 'yes' ) {
this.element.getChild( 0 ).removeAttribute( 'controlslist' );
} else {
this.element.getChild( 0 ).setAttribute( 'controlslist', 'nodownload' );
}
if ( this.data.advisorytitle ) {
this.element.getChild( 0 ).setAttribute( 'title', this.data.advisorytitle );
} else {
this.element.getChild( 0 ).removeAttribute( 'title' );
}
if (this.data.controls) {
this.element.getChild(0).setAttribute('controls', 'controls');
} else {
this.element.getChild(0).removeAttribute('controls');
}
}
}
} );
if ( editor.contextMenu ) {
editor.addMenuGroup( 'html5videoGroup' );
editor.addMenuItem( 'html5videoPropertiesItem', {
label: editor.lang.html5video.videoProperties,
icon: 'html5video',
command: 'html5video',
group: 'html5videoGroup'
});
editor.contextMenu.addListener( function( element ) {
if ( element &&
element.getChild( 0 ) &&
element.getChild( 0 ).hasClass &&
element.getChild( 0 ).hasClass( 'ckeditor-html5-video' ) ) {
return { html5videoPropertiesItem: CKEDITOR.TRISTATE_OFF };
}
});
}
CKEDITOR.dialog.add( 'html5video', this.path + 'dialogs/html5video.js' );
}
} );

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,24 @@
CKEDITOR.plugins.setLang('youtube', 'ar', {
button : 'شيفرة تضمين اليوتيوب',
title : 'شيفرة تضمين اليوتيوب',
txtEmbed : 'الصق شيفرة التضمين هنا',
txtUrl : 'الصق رابط فيديو اليوتيوب',
txtWidth : 'العرض',
txtHeight : 'الطول',
chkRelated : 'اظهر الفيديوهات المقترحة في نهاية الفيديو',
txtStartAt : 'ابدأ عند (ss او mm:ss او hh:mm:ss)',
chkPrivacy : 'تفعيل وضع تحسين الخصوصية',
chkOlderCode : 'استخدم شيفرة التضمين القديمة',
chkAutoplay : 'Autoplay',
chkControls: 'إظهار عناصر التحكم بالمشغّل',
noCode : 'يجب عليك ادخال شيفرة التضمين او الرابط',
invalidEmbed : 'شيفرة التضمين التي قمت بإدخالها تبدو غير صحيحة',
invalidUrl : 'الرابط الذي قمت بإدخاله يبدو غير صحيح',
or : 'او',
noWidth : 'يجب عليك ادخال العرض',
invalidWidth : 'يجب عليك ادخال عرض صحيح',
noHeight : 'يجب عليك ادخال الطول',
invalidHeight : 'يجب عليك ادخال طول صحيح',
invalidTime : 'يجب عليك ادخال وقت بداية صحيح',
txtResponsive : 'Responsive video'
});

View File

@ -0,0 +1,25 @@
CKEDITOR.plugins.setLang('youtube', 'bg', {
button : 'Вмъкни YouTube видео',
title : 'Вграждане на YouTube видео',
txtEmbed : 'Въведете кода за вграждане тук',
txtUrl : 'Въведете YouTube видео URL',
txtWidth : 'Ширина',
txtHeight : 'Височина',
chkRelated : 'Показва предложени видеоклипове в края на клипа',
txtStartAt : 'Стартирай в (ss или mm:ss или hh:mm:ss)',
chkPrivacy : 'Активирай режим за поверителност',
chkOlderCode : 'Използвай стар код за вграждане',
chkAutoplay: 'Авто стартиране',
chkControls: 'Показва контролите на плейъра',
noCode : 'Трябва да въведете код за вграждане или URL адрес',
invalidEmbed : 'Кодът за вграждане, който сте въвели, не изглежда валиден',
invalidUrl : 'Въведеният URL адрес не изглежда валиден',
or : 'или',
noWidth : 'Трябва да заложите ширината',
invalidWidth : 'Заложете валидна ширина',
noHeight : 'Трябва да заложите височина',
invalidHeight : 'Заложете валидна височина',
invalidTime : 'Заложете валидно време за стартиране',
txtResponsive : 'Напасва по ширина (игнорира Ширина и Височина)',
txtNoEmbed : 'Само видео изображение и връзка'
});

View File

@ -0,0 +1,25 @@
CKEDITOR.plugins.setLang('youtube', 'cs', {
button : 'Vložit video YouTube',
title : 'Vložit video YouTube',
txtEmbed : 'Zde vložte kód pro vložení',
txtUrl : 'Vložte adresu URL videa YouTube',
txtWidth : 'Šířka',
txtHeight : 'Výška',
chkRelated : 'Po dohrání videa zobrazit navrhovaná videa',
txtStartAt : 'Začít přehrávat v čase (ss nebo mm:ss nebo hh:mm:ss)',
chkPrivacy : 'Povolit režim s rozšířeným soukromím',
chkOlderCode : 'Použít starý kód pro vložení',
chkAutoplay : 'Automatické spuštění přehrávání',
chkControls : 'Zobrazit ovladače přehrávání',
noCode : 'Musíte vložit kód pro vložení nebo adresu URL',
invalidEmbed : 'Vložený kód pro vložení zřejmě není platný',
invalidUrl : 'Zadaná adresa URL zřejmě není platná',
or : 'nebo',
noWidth : 'Musíte zadat šířku',
invalidWidth : 'Zadejte platnou šířku',
noHeight : 'Musíte zadat výšku',
invalidHeight : 'Zadejte platnou výšku',
invalidTime : 'Zadejte platný počáteční čas',
txtResponsive : 'Responzivní design (ignorovat výšku a šířku, uzpůsobit šířce)',
txtNoEmbed : 'Pouze obrázek videa s odkazem'
});

View File

@ -0,0 +1,24 @@
CKEDITOR.plugins.setLang('youtube', 'de', {
button : 'YouTube Video einbinden',
title : 'YouTube Video einbinden',
txtEmbed : 'Embed Code hier einfügen',
txtUrl : 'YouTube Video URL hier einfügen',
txtWidth : 'Breite',
txtHeight : 'Höhe',
chkRelated : 'Vorschläge am Ende des Videos einblenden',
txtStartAt : 'Start bei Position (ss oder mm:ss oder hh:mm:ss)',
chkPrivacy : 'Erweiterten Datenschutzmodus aktivieren',
chkOlderCode : 'Benutze alten Embed Code',
chkAutoplay : 'Autoplay',
chkControls : 'Player-Steuerelemente anzeigen',
noCode : 'Sie müssen einen Embed Code oder URL angeben',
invalidEmbed : 'Der angegebene Embed Code scheint nicht gültig zu sein.',
invalidUrl : 'Die angegebene URL scheint nicht gültig zu sein.',
or : 'oder',
noWidth : 'Geben Sie eine Breite an',
invalidWidth : 'Geben Sie eine gültige Breite an',
noHeight : 'Geben Sie eine Höhe an',
invalidHeight : 'Geben Sie eine gültige Höhe an',
invalidTime : 'Geben Sie eine gültige Startzeit an',
txtResponsive : 'Automatische Größe (ignoriert Breite und Höhe)'
});

View File

@ -0,0 +1,23 @@
CKEDITOR.plugins.setLang('youtube', 'el', {
button: 'Ενσωμάτωση Youtube βίντεο',
title: 'Ενσωμάτωση Youtube βίντεο',
txtEmbed: 'Επικόλλησε τον κώδικα ενσωμάτωσης',
txtUrl: 'Επικόλλησε το URL του βίντεο',
txtWidth: 'Πλάτος',
txtHeight: 'Ύψος',
chkRelated: 'Εμφάνιση προτεινόμενων βίντεο μόλις ολοκληρωθεί',
txtStartAt: 'Χρόνος εκκίνησης (ss or mm:ss or hh:mm:ss)',
chkPrivacy: 'Ενεργοποίηση λειτουργίας ενισχυμένου απορρήτου',
chkOlderCode: 'Χρήση παλαιού κώδικα ενσωμάτωσης',
chkAutoplay: 'Αυτόματη εκκίνηση',
chkControls: 'Εμφάνιση στοιχείων ελέγχου προγράμματος αναπαραγωγής',
noCode: 'Χρειάζεται κώδικας ενσωμάτωσης ή URL',
invalidEmbed: 'Ο κώδικας ενσωμάτωσης που εισήγατε δεν μοιάζει σωστός',
invalidUrl: 'Το URL που εισήγατε δεν μοιάζει σωστό',
or: 'ή',
noWidth: 'Συμπληρώστε το πλάτος',
invalidWidth: 'Λανθασμένο πλάτος',
noHeight: 'Συμπληρώστε το ύψος',
invalidHeight: 'Λανθασμένο ύψος',
invalidTime: 'Λανθασμένος χρόνος εκκίνησης'
});

View File

@ -0,0 +1,25 @@
CKEDITOR.plugins.setLang('youtube', 'en', {
button : 'Embed YouTube Video',
title : 'Embed YouTube Video',
txtEmbed : 'Paste Embed Code Here',
txtUrl : 'Paste YouTube Video URL',
txtWidth : 'Width',
txtHeight : 'Height',
chkRelated : 'Show suggested videos at the video\'s end',
txtStartAt : 'Start at (ss or mm:ss or hh:mm:ss)',
chkPrivacy : 'Enable privacy-enhanced mode',
chkOlderCode : 'Use old embed code',
chkAutoplay: 'Autoplay',
chkControls: 'Show player controls',
noCode : 'You must input an embed code or URL',
invalidEmbed : 'The embed code you\'ve entered doesn\'t appear to be valid',
invalidUrl : 'The URL you\'ve entered doesn\'t appear to be valid',
or : 'or',
noWidth : 'You must inform the width',
invalidWidth : 'Inform a valid width',
noHeight : 'You must inform the height',
invalidHeight : 'Inform a valid height',
invalidTime : 'Inform a valid start time',
txtResponsive : 'Make Responsive (ignore width and height, fit to width)',
txtNoEmbed : 'Video image and link only'
});

View File

@ -0,0 +1,24 @@
CKEDITOR.plugins.setLang('youtube', 'es', {
button : 'Embed YouTube video',
title : 'Embed YouTube video',
txtEmbed : 'Pegar el código embed',
txtUrl : 'Pegar la URL al video de Youtube',
txtWidth : 'Anchura',
txtHeight : 'Altura',
chkRelated : 'Mostrar videos sugeridos al final de este video',
txtStartAt : 'Comenzar en (ss or mm:ss or hh:mm:ss)',
chkPrivacy : 'Habilitar el modo privacy-enhanced',
chkOlderCode : 'Usar código embed viejo',
chkAutoplay: 'Autoplay',
chkControls: 'Mostrar controles del reproductor',
noCode : 'Debes de introducir un código embed o URL',
invalidEmbed : 'El código embed introducido parece no ser valido',
invalidUrl : 'La URL introducida parece no ser valida',
or : 'o',
noWidth : 'Debes de dar la anchura',
invalidWidth : 'Da una anchura valida',
noHeight : 'Debes dar una altura valida',
invalidHeight : 'Da una altura valida',
invalidTime : 'Da un tiempo de valido',
txtResponsive : 'Hacer responsivo (ignorar anchura y altura, ajustar a la anchura)'
});

View File

@ -0,0 +1,24 @@
CKEDITOR.plugins.setLang('youtube', 'et', {
button : 'Lisa YouTube video',
title : 'YouTube video lisamine',
txtEmbed : 'Kleepige manustatud kood siia',
txtUrl : 'Kleepige YouTube video veebiaadress',
txtWidth : 'Laius',
txtHeight : 'Kõrgus',
chkRelated : 'Näita soovitatud videosi antud video lõppus',
txtStartAt : 'Alguskoht: (ss või mm:ss või hh:mm:ss)',
chkPrivacy : 'Aktiveerige privaatsust täiendav režiim',
chkOlderCode : 'Kasutage vana manuskoodi',
chkAutoplay: 'Automaatesitlus',
chkControls : 'Kuva pleieri nupud',
noCode : 'Te peate sisestama video manuskoodi või veebiaadressi',
invalidEmbed : 'Manuskood mille sisestasite ei paista olevat korrektne',
invalidUrl : 'Veebiaadress mille sisestasite ei paista olevat korrektne',
or : 'või',
noWidth : 'Te peate sisestama video laiuse',
invalidWidth : 'Sisestage korrektne laius',
noHeight : 'Te peate sisestama video kõrguse',
invalidHeight : 'Sisestage korrektne kõrgus',
invalidTime : 'Sisestage korrektne algusaeg',
txtResponsive : 'Aktiveerige ekraani laiusega ühilduv režiim'
});

View File

@ -0,0 +1,25 @@
CKEDITOR.plugins.setLang('youtube', 'eu', {
button : 'Kapsulatu YouTube-ko bideoa',
title : 'Kapsulatu YouTube-ko bideoa',
txtEmbed : 'Itsatsi kapsulatzeko kodea hemen',
txtUrl : 'Itsatsi YouTube-ko bideoaren URLa',
txtWidth : 'Zabalera',
txtHeight : 'Altuera',
chkRelated : 'Erakutsi gomendatutako bideoak amaieran',
txtStartAt : 'Hasi hemendik (ss edo mm:ss edo hh:mm:ss)',
chkPrivacy : 'Gaitu pribatutasun hobetuko modua',
chkOlderCode : 'Erabili kapsulatzeko kode zaharra',
chkAutoplay: 'Erreproduzitu automatikoki',
chkControls: 'Erakutsi erreproduzigailuaren kontrolak',
noCode : 'Kapsulatzeko kode bat edo URL bat sartu behar duzu',
invalidEmbed : 'Sartu duzun kapsulatzeko kodea ez da baliozkoa',
invalidUrl : 'Sartu duzun URLa ez da baliozkoa',
or : 'edo',
noWidth : 'Zabalera sartu behar duzu',
invalidWidth : 'Sartu baliozko zabalera bat',
noHeight : 'Altuera sartu behar duzu',
invalidHeight : 'Sartu baliozko altuera bat',
invalidTime : 'Sartu baliozko hasierako denbora bat',
txtResponsive : 'Egin moldagarria (ez ikusia egin zabalera eta altuerari, zabalerara doitu)',
txtNoEmbed : 'Bideoaren irudia eta esteka soilik'
});

View File

@ -0,0 +1,24 @@
CKEDITOR.plugins.setLang('youtube', 'fi', {
button : 'Upota YouTube-video',
title : 'Upota YouTube-video',
txtEmbed : 'Syötä YouTube-videon upotuskoodi',
txtUrl : 'Syötä YouTube-videon www-osoite',
txtWidth : 'Leveys',
txtHeight : 'Korkeus',
chkRelated : 'Näytä suositukset lopussa',
txtStartAt : 'Aloitusaika (ss tai mm:ss tai tt:mm:ss)',
chkPrivacy : 'Aktivoi yksityisyyttä parantava tila',
chkOlderCode : 'Käytä vanhaa upotuskoodia',
chkAutoplay: 'Soita automaattisesti',
chkControls : 'Näytä soittimen ohjaimet',
noCode : 'Sinun täytyy syötää upotuskoodi tai www-osoite',
invalidEmbed : 'Upotuskoodi on virheellinen',
invalidUrl : 'Www-osoite on virheellinen',
or : 'tai',
noWidth : 'Syötä leveys',
invalidWidth : 'Leveys on virheellinen',
noHeight : 'Syötä korkeus',
invalidHeight : 'Korkeus on virheellinen',
invalidTime : 'Aloitusaika on virheellinen',
txtResponsive : 'Responsiivinen leveys (sovita leveys)'
});

View File

@ -0,0 +1,25 @@
CKEDITOR.plugins.setLang('youtube', 'fr', {
button : 'Insérer une vidéo Youtube',
title : 'Insérer une vidéo youtube',
txtEmbed : 'Coller le code embed ici',
txtUrl : 'Coller l\'url de la vidéo ici',
txtWidth : 'Largeur',
txtHeight : 'Hauteur',
chkRelated : 'Montrer les suggestions de vidéo à la fin',
txtStartAt : 'Commencer à (ss ou mm:ss ou hh:mm:ss)',
chkPrivacy : 'Activer la protection de la vie privée',
chkOlderCode : 'Utiliser l\'ancien code embed',
chkAutoplay : 'Autoplay',
chkControls : 'Afficher les commandes du lecteur',
noCode : 'Vous devez entrer un code embed ou une url',
invalidEmbed : 'Le code embed est invalide',
invalidUrl : 'L\'url est invalide',
or : 'ou',
noWidth : 'Vous devez saisir une largeur',
invalidWidth : 'La largeur saisie est invalide',
noHeight : 'Vous devez saisir une hauteur',
invalidHeight : 'La hauteur saisie est invalide',
invalidTime : 'Le temps de départ de la vidéo est invalide',
txtResponsive : 'Responsive video',
txtNoEmbed : 'Vidéo image et lien seulement'
});

View File

@ -0,0 +1,24 @@
CKEDITOR.plugins.setLang('youtube', 'he', {
button : 'שבץ וידאו של YouTube',
title : 'שבץ וידאו של YouTube',
txtEmbed : 'הדבק את קוד השיבוץ כאן',
txtUrl : 'הדבק כתובת וידאו YouTube',
txtWidth : 'אורך',
txtHeight : 'גובה',
chkRelated : 'הצג סרטונים מומלצים בסוף הודיאו',
txtStartAt : 'התחל ב (ss או mm:ss או hh:mm:ss)',
chkPrivacy : 'הפעל מצב פרטיות המשופרת',
chkOlderCode : 'השתמש בקוד הטמעה ישן',
chkAutoplay: 'הפעלה אוטומטית',
chkControls : 'הצג פקדי נגן',
noCode : 'אתה חייב להזין קוד embed כתובת וידאו אתר',
invalidEmbed : 'קוד ההטמעה שהוזן אינו נראה חוקי',
invalidUrl : 'כתובת הוידאו אינה נראת חוקית',
or : 'או',
noWidth : 'חובה להזין אורך',
invalidWidth : 'האורך שהוזן שגוי',
noHeight : 'חובה להזין גובה',
invalidHeight : 'הגובה שהוזן שגוי',
invalidTime : 'זמן התחלה שהוזן שגוי',
txtResponsive : 'הפוך לרספונסיבי (התעלם מרוחב וגובה, התאם לרוחב)'
});

View File

@ -0,0 +1,25 @@
CKEDITOR.plugins.setLang('youtube', 'hu', {
button : 'Youtube videó beillesztése',
title : 'Youtube videó beillesztése',
txtEmbed : 'Illessze be a beágyazott kódot',
txtUrl : 'Illessze be a Youtube videó URL-jét',
txtWidth : 'Szélesség',
txtHeight : 'Magasság',
txtStartAt : 'Kezdő időpont (ss vagy mm:ss vagy hh:mm:ss)',
chkRelated : 'Ajánlott videók megjelenítése, amikor a videó befejeződik',
chkPrivacy : 'Fokozott adatvédelmi mód engedélyezése',
chkOlderCode : 'Régi beágyazott kód használata',
chkAutoplay : 'Automatikus lejátszás',
chkControls : 'Lejátszásvezérlők mutatása',
noCode : 'A beágyazott kód, vagy az URL megadása kötelező',
invalidEmbed : 'A beágyazott kód érvénytelen',
invalidUrl : 'A megadott URL érvénytelen',
or : 'vagy',
noWidth : 'A szélesség megadása kötelező',
invalidWidth : 'Érvényes szélességet adjon meg',
noHeight : 'A magasság megadása kötelező',
invalidHeight : 'Érvényes magasságot adjon meg',
invalidTime : 'Érvényes kezdő időpontot adjon meg',
txtResponsive : 'Reszponzív videó',
txtNoEmbed : 'Csak kép és hivatkozás jelenjen meg'
});

View File

@ -0,0 +1,24 @@
CKEDITOR.plugins.setLang('youtube', 'it', {
button : 'Incorpora video Youtube',
title : 'Incorpora video Youtube',
txtEmbed : 'Incolla qui il codice di incorporamento',
txtUrl : 'Incolla l\'URL del video Youtube',
txtWidth : 'Larghezza',
txtHeight : 'Altezza',
chkRelated : 'Mostra i video suggeriti dopo il video',
txtStartAt : 'Inizia a (ss o mm:ss o hh:mm:ss)',
chkPrivacy : 'Abilita la protezione della privacy',
chkOlderCode : 'Usa il vecchio codice di incorporamento',
chkAutoplay : 'Autoplay',
chkControls : 'Mostra i controlli del player',
noCode : 'Devi inserire un codice di incorporamento o un URL',
invalidEmbed : 'Il codice di incorporamento inserito non sembra valido',
invalidUrl : 'L\'URL inserito non sembra valido',
or : 'o',
noWidth : 'Devi indicare la larghezza',
invalidWidth : 'Indica una larghezza valida',
noHeight : 'Devi indicare l\'altezza',
invalidHeight : 'Indica un\'altezza valida',
invalidTime : 'Indica un tempo di inizio valido',
txtResponsive : 'Responsive video'
});

View File

@ -0,0 +1,24 @@
CKEDITOR.plugins.setLang('youtube', 'ja', {
button : 'Youtube動画埋め込み',
title : 'Youtube動画埋め込み',
txtEmbed : '埋め込みコードを貼り付けてください',
txtUrl : 'URLを貼り付けてください',
txtWidth : '幅',
txtHeight : '高さ',
chkRelated : '動画が終わったら関連動画を表示する',
txtStartAt : '開始時間(秒)',
chkPrivacy : 'プライバシー強化モードを有効にする',
chkOlderCode : '以前の埋め込みコードを使用する',
chkAutoplay : '自動再生',
chkControls: 'プレーヤーのコントロールを表示する',
noCode : '埋め込みコードまたはURLを入力してください',
invalidEmbed : '不適切な埋め込みコードが入力されました',
invalidUrl : '不適切なURLが入力されました',
or : 'または',
noWidth : '幅を指定してください',
invalidWidth : '幅指定に誤りがあります',
noHeight : '高さを指定してください',
invalidHeight : '高さ指定に誤りがあります',
invalidTime : '開始時間を正の整数で入力してください',
txtResponsive : 'レスポンシブ表示'
});

View File

@ -0,0 +1,25 @@
CKEDITOR.plugins.setLang('youtube', 'ko', {
button : '유투브 비디오 삽입',
title : '유투브 비디오 삽입',
txtEmbed : '여기 embed 코드를 붙여넣으세요',
txtUrl : '유투브 주소(URL)를 붙여넣으세요',
txtWidth : '너비',
txtHeight : '높이',
chkRelated : '비디오 마지막에 추천 영상 보이기',
txtStartAt : '시작 시점 (ss 또는 mm:ss 또는 hh:mm:ss)',
chkPrivacy : '개인정보 보호 모드 활성화',
chkOlderCode : '옛날 embed 코드 사용',
chkAutoplay: '자동 재생',
chkControls: '플레이어 컨트롤 표시',
noCode : 'embed 코드 또는 URL을 입력해야 합니다',
invalidEmbed : '입력하신 embed 코드가 유효하지 않습니다',
invalidUrl : '입력하신 주소(URL)가 유효하지 않습니다',
or : '또는',
noWidth : '너비를 알려주세요',
invalidWidth : '너비가 유효하지 않습니다',
noHeight : '높이를 알려주세요',
invalidHeight : '높이가 유효하지 않습니다',
invalidTime : '시작 시점이 유효하지 않습니다',
txtResponsive : '반응형 너비 (입력한 너비와 높이를 무시하고 창 너비에 맞춤)',
txtNoEmbed : '비디오 이미지와 링크만 달기'
});

View File

@ -0,0 +1,24 @@
CKEDITOR.plugins.setLang('youtube', 'nb', {
button : 'Bygg inn YouTube-video',
title : 'Bygg inn YouTube-video',
txtEmbed : 'Lim inn embed-kode her',
txtUrl : 'Lim inn YouTube video-URL',
txtWidth : 'Bredde',
txtHeight : 'Høyde',
chkRelated : 'Vis foreslåtte videoer når videoen er ferdig',
txtStartAt : 'Start ved (ss eller mm:ss eller hh:mm:ss)',
chkPrivacy : 'Bruk personverntilpasset modus',
chkOlderCode : 'Bruk gammel embedkode',
chkAutoplay: 'Spill automatisk',
chkControls: 'Vis spillerkontrollene',
noCode : 'Du må legge inn en embed-kode eller URL',
invalidEmbed : 'Emded-koden du la inn ser ikke ut til å være gyldig',
invalidUrl : 'URLen du la inn ser ikke ut til å være gyldig',
or : 'eller',
noWidth : 'Du må legge inn bredde',
invalidWidth : 'Legg inn en gyldig bredde',
noHeight : 'Du må legge inn høyde',
invalidHeight : 'Legg inn en gyldig høyde',
invalidTime : 'Legg inn gyldig starttid',
txtResponsive : 'Gjør responsiv (ignorer bredde og høyde, tilpass bredde på sida)'
});

View File

@ -0,0 +1,25 @@
CKEDITOR.plugins.setLang('youtube', 'nl', {
button : 'Youtube video insluiten',
title : 'Youtube video insluiten',
txtEmbed : 'Plak embedcode hier',
txtUrl : 'Plak video URL',
txtWidth : 'Breedte',
txtHeight : 'Hoogte',
chkRelated : 'Toon gesuggereerde video aan het einde van de video',
txtStartAt : 'Starten op (ss of mm:ss of hh:mm:ss)',
chkPrivacy : 'Privacy-enhanced mode inschakelen',
chkOlderCode : 'Gebruik oude embedcode',
chkAutoplay: 'Automatisch starten',
chkControls: 'Afspeelbediening weergeven',
noCode : 'U moet een embedcode of url ingeven',
invalidEmbed : 'De ingegeven embedcode lijkt niet geldig',
invalidUrl : 'De ingegeven url lijkt niet geldig',
or : 'of',
noWidth : 'U moet een breedte ingeven',
invalidWidth : 'U moet een geldige breedte ingeven',
noHeight : 'U moet een hoogte ingeven',
invalidHeight : 'U moet een geldige starttijd ingeven',
invalidTime : 'Inform a valid start time',
txtResponsive : 'Responsive video',
txtNoEmbed : 'Alleen video afbeelding en link'
});

View File

@ -0,0 +1,24 @@
CKEDITOR.plugins.setLang('youtube', 'nn', {
button : 'Bygg inn YouTube-video',
title : 'Bygg inn YouTube-video',
txtEmbed : 'Lim inn embed-kode her',
txtUrl : 'Lim inn YouTube video-URL',
txtWidth : 'Breidde',
txtHeight : 'Høgde',
chkRelated : 'Vis foreslåtte videoar når videoen er ferdig',
txtStartAt : 'Start ved (ss eller mm:ss eller hh:mm:ss)',
chkPrivacy : 'Bruk personverntilpassa modus',
chkOlderCode : 'Bruk gamal embedkode',
chkAutoplay: 'Spel automatisk',
chkControls: 'Vis spillerkontrollene',
noCode : 'Du må leggja inn ein embed-kode eller URL',
invalidEmbed : 'Emded-koden du la inn ser ikkje ut til å vera gyldig',
invalidUrl : 'URLen du la inn ser ikkje ut til å vera gyldig',
or : 'eller',
noWidth : 'Du må leggja inn breidde',
invalidWidth : 'Legg inn ei gyldig breidde',
noHeight : 'Du må leggja inn høgde',
invalidHeight : 'Legg inn ei gyldig høgde',
invalidTime : 'Legg inn gyldig starttid',
txtResponsive : 'Gjer responsiv (ignorer breidde og høgde, tilpass breidda på sida)'
});

View File

@ -0,0 +1,24 @@
CKEDITOR.plugins.setLang('youtube', 'pl', {
button : 'Załącznik wideo z YouTube',
title : 'Załącznik wideo z YouTube',
txtEmbed : 'Wklej kod do umieszczenia',
txtUrl : 'Wklej adres URL do wideo z YouTube',
txtWidth : 'Szerokość',
txtHeight : 'Wysokość',
chkRelated : 'Pokaż sugerowane filmy po zakończeniu odtwarzania',
txtStartAt : 'Rozpocznij od (ss lub mm:ss lub gg:mm:ss)',
chkPrivacy : 'Włącz rozszerzony tryb prywatności',
chkOlderCode : 'Użyj starego kodu',
chkAutoplay: 'Autoodtwarzanie',
chkControls: 'Pokaż elementy sterujące odtwarzacza',
noCode : 'Musisz wprowadzić kod lub adres URL',
invalidEmbed : 'Wprowadzony kod nie jest poprawny',
invalidUrl : 'Wprowadzony adres URL nie jest poprawny',
or : 'lub',
noWidth : 'Musisz wpisać szerokość',
invalidWidth : 'Wprowadzona szerokość nie jest poprawna',
noHeight : 'Musisz wprowadzić wysokość',
invalidHeight : 'Wprowadzona wysokość nie jest poprawna',
invalidTime : 'Musisz wprowadzić poprawny czas rozpoczęcia',
txtResponsive : 'El. responsywny (ignoruj szerokość i wysokość, dopasuj do szerokości)'
});

View File

@ -0,0 +1,25 @@
CKEDITOR.plugins.setLang('youtube', 'pt-br', {
button : 'Inserir Vídeo do Youtube',
title : 'Inserir Vídeo do Youtube',
txtEmbed : 'Cole aqui o código embed de um vídeo do Youtube',
txtUrl : 'Cole aqui uma URL de um vídeo do Youtube',
txtWidth : 'Largura',
txtHeight : 'Altura',
chkRelated : 'Mostrar vídeos sugeridos ao final do vídeo',
txtStartAt : 'Iniciar em (ss ou mm:ss ou hh:mm:ss)',
chkPrivacy : 'Ativar o modo de privacidade aprimorada',
chkOlderCode : 'Usar código de incorporação antigo',
chkAutoplay : 'Reproduzir automaticamente',
chkControls: 'Mostrar controles do player',
noCode : 'Você precisa informar um código embed ou uma URL',
invalidEmbed : 'O código informado não parece ser válido',
invalidUrl : 'A URL informada não parece ser válida',
or : 'ou',
noWidth : 'Você deve informar a largura do vídeo',
invalidWidth : 'Informe uma largura válida',
noHeight : 'Você deve informar a altura do vídeo',
invalidHeight : 'Informe uma altura válida',
invalidTime : 'O tempo informado é inválido',
txtResponsive : 'Vídeo responsivo',
txtNoEmbed : 'Somente imagem e link para o vídeo'
});

View File

@ -0,0 +1,25 @@
CKEDITOR.plugins.setLang('youtube', 'pt', {
button : 'Inserir Vídeo do Youtube',
title : 'Inserir Vídeo do Youtube',
txtEmbed : 'Cole aqui o código embed de um vídeo do Youtube',
txtUrl : 'Cole aqui uma URL de um vídeo do Youtube',
txtWidth : 'Largura',
txtHeight : 'Altura',
chkRelated : 'Mostrar vídeos sugeridos quando o vídeo terminar',
txtStartAt : 'Iniciar em (ss ou mm:ss ou hh:mm:ss)',
chkPrivacy : 'Ativar o modo de privacidade otimizada',
chkOlderCode : 'Usar código de incorporação antigo',
chkAutoplay : 'Reproduzir automaticamente',
chkControls: 'Mostrar controles do player',
noCode : 'Você precisa informar um código embed ou uma URL',
invalidEmbed : 'O código informado não parece ser válido',
invalidUrl : 'A URL informada não parece ser válida',
or : 'ou',
noWidth : 'Você deve informar a largura do vídeo',
invalidWidth : 'Informe uma largura válida',
noHeight : 'Você deve informar a altura do vídeo',
invalidHeight : 'Informe uma altura válida',
invalidTime : 'O tempo informado é inválido',
txtResponsive : 'Vídeo responsivo',
txtNoEmbed : 'Somente imagem e link para o vídeo'
});

View File

@ -0,0 +1,25 @@
CKEDITOR.plugins.setLang('youtube', 'ru', {
button : 'Вставить YouTube видео',
title : 'Вставить YouTube видео',
txtEmbed : 'Вставьте HTML-код сюда',
txtUrl : 'Вставьте адрес видео (URL)',
txtWidth : 'Ширина',
txtHeight : 'Высота',
chkRelated : 'Показать похожие видео после завершения просмотра',
txtStartAt : 'Начать с (сс или мм:сс или чч:мм:сс)',
chkPrivacy : 'Включить режим повышенной конфиденциальности',
chkOlderCode : 'Использовать старый код вставки',
chkAutoplay: 'Автозапуск',
chkControls: 'Показать панель управления',
noCode : 'Вы должны ввести HTML-код или адрес',
invalidEmbed : 'Ваш HTML-код не похож на правильный',
invalidUrl : 'Ваш адрес видео не похож на правильный',
or : 'или',
noWidth : 'Вы должны указать ширину',
invalidWidth : 'Укажите правильную ширину',
noHeight : 'Вы должны указать высоту',
invalidHeight : 'Укажите правильную высоту',
invalidTime : 'Укажите правильное время начала',
txtResponsive : 'Растягиваемое видео',
txtNoEmbed : 'Не встраивать видео (обложка-ссылка на YouTube)'
});

View File

@ -0,0 +1,24 @@
CKEDITOR.plugins.setLang('youtube', 'sk', {
button : 'Vložiť YouTube video',
title : 'Vložiť YouTube video',
txtEmbed : 'Vložiť Youtube Embed Video kódu',
txtUrl : 'Vložiť pomocou YouTube video URL',
txtWidth : 'Šírka',
txtHeight : 'Výška',
chkRelated : 'Zobraziť odporúčané videá po prehratí',
txtStartAt : 'Začať prehrávanie videa (ss alebo mm:ss alebo hh:mm:ss)',
chkPrivacy : 'Povoliť pokročilý mód súkromia',
chkOlderCode : 'Použiť starú metódu vkladania',
chkAutoplay: 'Automatické prehrávanie',
chkControls: 'Zobraziť ovládacie prvky prehrávača',
noCode : 'Musíte vložiť Youtube Embed kód alebo URL',
invalidEmbed : 'Vložený kód nie je valídny',
invalidUrl : 'Vložená URL nie je platná',
or : 'alebo',
noWidth : 'Prosím, zadajte šírku videa',
invalidWidth : 'Zadajte valídnu šírku videa',
noHeight : 'Prosím, zadajte výšku videa',
invalidHeight : 'Zadajte valídnu výšku videa',
invalidTime : 'Zadajte valídny formát začiatku prehrávania videa',
txtResponsive : 'Prispôsobit rozmery videa rozmerom obrazovky (ignoruje šírku a výšku, prispôsobí sa šírke obrazovky)'
});

View File

@ -0,0 +1,24 @@
CKEDITOR.plugins.setLang('youtube', 'tr', {
button : 'Youtube Video Gömün (Embed)',
title : 'Youtube Video',
txtEmbed : 'Youtube gömülü kodu (embed) buraya yapıştırınız',
txtUrl : 'Youtube linkinizi buraya yapıştırınız',
txtWidth : 'Genişlik',
txtHeight : 'Yükseklik',
chkRelated : 'Önerilen videoları video bitiminde göster',
txtStartAt : 'Video başlangıç anı (ss ya da dd:ss ya da ss:dd:ss)',
chkPrivacy : 'Gizlilik modunu etkinleştir',
chkOlderCode : 'Eski gömülü kodu (embed) kullan',
chkAutoplay: 'Otomatik',
chkControls: 'Oynatıcı kontrollerini göster',
noCode : 'Gömülü kod (embed) veya url yapıştırmak zorundasınız',
invalidEmbed : 'Verdiğiniz gömülü kod (embed) ile video bulunamadı',
invalidUrl : 'Verdiğiniz linkte video bulunamadı',
or : 'ya da',
noWidth : 'Genişliği belirtmek zorundasınız',
invalidWidth : 'Bir genişlik belirtin',
noHeight : 'Yükseliği belirtmek zorundasınız',
invalidHeight : 'Yükseklik belirtin',
invalidTime : 'Başlangıç anını doğru girin, örneğin: 13 (13. saniye) ya da 12:25 (12. dakika 25. saniye) ya da 01.25.33 (1 saat 25 dakika 33 saniye)',
txtResponsive : 'Responsive video'
});

View File

@ -0,0 +1,25 @@
CKEDITOR.plugins.setLang('youtube', 'uk', {
button : 'Вставити YouTube-відео',
title : 'Вставити YouTube-відео',
txtEmbed : 'Вставте HTML-код сюди',
txtUrl : 'Вставте URL-адресу сюди',
txtWidth : 'Ширина',
txtHeight : 'Висота',
chkRelated : 'Показати пропоновані відео в кінці',
txtStartAt : 'Почати з (сс або хх:сс або гг:хх:сс)',
chkPrivacy : 'Увімкнути режим підвищеної конфіденційності',
chkOlderCode : 'Використовувати старий код вставки',
chkAutoplay: 'Автовідтворення',
chkControls: 'Показувати елементи управління плеєром',
noCode : 'Ви повинні ввести HTML-код або URL-адресу',
invalidEmbed : 'Код вставки, який ви додали не вірний',
invalidUrl : 'URL-адреса, яку ви додали не вірна',
or : 'або',
noWidth : 'Укажіть ширину',
invalidWidth : 'Укажіть правильну ширину',
noHeight : 'Укажіть висоту',
invalidHeight : 'Укажіть правильну висоту',
invalidTime : 'Укажіть правильний час початку',
txtResponsive : 'Адаптивне (таке, яке розтягується) відео',
txtNoEmbed : 'Додати лише обкладинку та посилання на YouTube'
});

View File

@ -0,0 +1,24 @@
CKEDITOR.plugins.setLang('youtube', 'vi', {
button : 'Embed Youtube Video',
title : 'Nhúng Video Youtube',
txtEmbed : 'Dãn mã nhúng Embed vào đây',
txtUrl : 'Dãn đường dẫn video Youtube',
txtWidth : 'Rộng',
txtHeight : 'Cao',
chkRelated : 'Hiển thị các video được đề xuất khi video kết thúc',
txtStartAt : 'Bắt đầu (ss hoặc mm:ss hoặc hh:mm:ss)',
chkPrivacy : 'Kích hoạt chế độ bảo mật nâng cao',
chkOlderCode : 'Sử dụng mã nhúng cũ',
chkAutoplay: 'Tự động chạy video',
chkControls: 'Hiển thị các điều khiển trình phát',
noCode : 'Bạn phải nhập mã nhúng hoặc URL',
invalidEmbed : 'Mã nhúng bạn đã nhập không đúng',
invalidUrl : 'URL bạn đã nhập không đúng',
or : 'hoặc',
noWidth : 'Bạn phải chiều rộng',
invalidWidth : 'Chiều rộng hợp lệ',
noHeight : 'Bạn phải chiều cao',
invalidHeight : 'Chiều cao hợp lệ',
invalidTime : 'Thời gian bắt đầu không đúng',
txtResponsive : 'Responsive video'
});

View File

@ -0,0 +1,24 @@
CKEDITOR.plugins.setLang('youtube', 'zh', {
button: '嵌入 Youtube 影片',
title: '嵌入 Youtube 影片',
txtEmbed: '貼上嵌入碼',
txtUrl: '貼上 Youtube 影片 URL',
txtWidth: '寬',
txtHeight: '高',
txtResponsive: '使用自適應縮放模式 (忽略設定的長寬, 以寬為基準縮放)',
chkRelated: '影片結束時顯示建議影片',
txtStartAt: '開始時間 (ss or mm:ss or hh:mm:ss)',
chkPrivacy: '啟用加強隱私模式',
chkOlderCode: '使用舊的嵌入碼',
chkAutoplay: '自動播放',
chkControls: '显示播放器控件',
noCode: '必須輸入嵌入碼',
invalidEmbed: '錯誤的嵌入碼',
invalidUrl: '錯誤的URL',
or: '或',
noWidth: '必須設定寬',
invalidWidth: '寬設定錯誤',
noHeight: '必須設定高',
invalidHeight: '高設定錯誤',
invalidTime: '開始時間設定錯誤'
});

View File

@ -0,0 +1,449 @@
/*
* Youtube Embed Plugin
*
* @author Jonnas Fonini <jonnasfonini@gmail.com>
* @version 2.1.14
*/
(function () {
CKEDITOR.plugins.add('youtube', {
lang: [ 'en', 'bg', 'pt', 'pt-br', 'ja', 'hu', 'it', 'fr', 'tr', 'ru', 'de', 'ar', 'nl', 'pl', 'vi', 'zh', 'el', 'he', 'es', 'nb', 'nn', 'fi', 'et', 'sk', 'cs', 'ko', 'eu', 'uk'],
init: function (editor) {
editor.addCommand('youtube', new CKEDITOR.dialogCommand('youtube', {
allowedContent: 'div{*}(*); iframe{*}[!width,!height,!src,!frameborder,!allowfullscreen,!allow]; object param[*]; a[*]; img[*]'
}));
editor.ui.addButton('Youtube', {
label : editor.lang.youtube.button,
toolbar : 'insert',
command : 'youtube',
icon : this.path + 'images/icon.png'
});
CKEDITOR.dialog.add('youtube', function (instance) {
var video,
disabled = editor.config.youtube_disabled_fields || [];
return {
title : editor.lang.youtube.title,
minWidth : 510,
minHeight : 200,
onShow: function () {
for (var i = 0; i < disabled.length; i++) {
this.getContentElement('youtubePlugin', disabled[i]).disable();
}
},
contents :
[{
id : 'youtubePlugin',
expand : true,
elements :
[{
id : 'txtEmbed',
type : 'textarea',
label : editor.lang.youtube.txtEmbed,
onChange : function (api) {
handleEmbedChange(this, api);
},
onKeyUp : function (api) {
handleEmbedChange(this, api);
},
validate : function () {
if (this.isEnabled()) {
if (!this.getValue()) {
alert(editor.lang.youtube.noCode);
return false;
}
else
if (this.getValue().length === 0 || this.getValue().indexOf('//') === -1) {
alert(editor.lang.youtube.invalidEmbed);
return false;
}
}
}
},
{
type : 'html',
html : editor.lang.youtube.or + '<hr>'
},
{
type : 'hbox',
widths : [ '70%', '15%', '15%' ],
children :
[
{
id : 'txtUrl',
type : 'text',
label : editor.lang.youtube.txtUrl,
onChange : function (api) {
handleLinkChange(this, api);
},
onKeyUp : function (api) {
handleLinkChange(this, api);
},
validate : function () {
if (this.isEnabled()) {
if (!this.getValue()) {
alert(editor.lang.youtube.noCode);
return false;
}
else{
video = ytVidId(this.getValue());
if (this.getValue().length === 0 || video === false)
{
alert(editor.lang.youtube.invalidUrl);
return false;
}
}
}
}
},
{
type : 'text',
id : 'txtWidth',
width : '60px',
label : editor.lang.youtube.txtWidth,
'default' : editor.config.youtube_width != null ? editor.config.youtube_width : '640',
validate : function () {
if (this.getValue()) {
var width = parseInt (this.getValue()) || 0;
if (width === 0) {
alert(editor.lang.youtube.invalidWidth);
return false;
}
}
else {
alert(editor.lang.youtube.noWidth);
return false;
}
}
},
{
type : 'text',
id : 'txtHeight',
width : '60px',
label : editor.lang.youtube.txtHeight,
'default' : editor.config.youtube_height != null ? editor.config.youtube_height : '360',
validate : function () {
if (this.getValue()) {
var height = parseInt(this.getValue()) || 0;
if (height === 0) {
alert(editor.lang.youtube.invalidHeight);
return false;
}
}
else {
alert(editor.lang.youtube.noHeight);
return false;
}
}
}
]
},
{
type : 'hbox',
widths : [ '55%', '45%' ],
children :
[
{
id : 'chkResponsive',
type : 'checkbox',
label : editor.lang.youtube.txtResponsive,
'default' : editor.config.youtube_responsive != null ? editor.config.youtube_responsive : false
},
{
id : 'chkNoEmbed',
type : 'checkbox',
label : editor.lang.youtube.txtNoEmbed,
'default' : editor.config.youtube_noembed != null ? editor.config.youtube_noembed : false
}
]
},
{
type : 'hbox',
widths : [ '55%', '45%' ],
children :
[
{
id : 'chkRelated',
type : 'checkbox',
'default' : editor.config.youtube_related != null ? editor.config.youtube_related : true,
label : editor.lang.youtube.chkRelated
},
{
id : 'chkOlderCode',
type : 'checkbox',
'default' : editor.config.youtube_older != null ? editor.config.youtube_older : false,
label : editor.lang.youtube.chkOlderCode
}
]
},
{
type : 'hbox',
widths : [ '55%', '45%' ],
children :
[
{
id : 'chkPrivacy',
type : 'checkbox',
label : editor.lang.youtube.chkPrivacy,
'default' : editor.config.youtube_privacy != null ? editor.config.youtube_privacy : false
},
{
id : 'chkAutoplay',
type : 'checkbox',
'default' : editor.config.youtube_autoplay != null ? editor.config.youtube_autoplay : false,
label : editor.lang.youtube.chkAutoplay
}
]
},
{
type : 'hbox',
widths : [ '55%', '45%'],
children :
[
{
id : 'txtStartAt',
type : 'text',
label : editor.lang.youtube.txtStartAt,
validate : function () {
if (this.getValue()) {
var str = this.getValue();
if (!/^(?:(?:([01]?\d|2[0-3]):)?([0-5]?\d):)?([0-5]?\d)$/i.test(str)) {
alert(editor.lang.youtube.invalidTime);
return false;
}
}
}
},
{
id : 'chkControls',
type : 'checkbox',
'default' : editor.config.youtube_controls != null ? editor.config.youtube_controls : true,
label : editor.lang.youtube.chkControls
}
]
}
]
}
],
onOk: function()
{
var content = '';
var responsiveStyle = '';
if (this.getContentElement('youtubePlugin', 'txtEmbed').isEnabled()) {
content = this.getValueOf('youtubePlugin', 'txtEmbed');
}
else {
var url = 'https://', params = [], startSecs, paramAutoplay='';
var width = this.getValueOf('youtubePlugin', 'txtWidth');
var height = this.getValueOf('youtubePlugin', 'txtHeight');
if (this.getContentElement('youtubePlugin', 'chkPrivacy').getValue() === true) {
url += 'www.youtube-nocookie.com/';
}
else {
url += 'www.youtube.com/';
}
url += 'embed/' + video;
if (this.getContentElement('youtubePlugin', 'chkRelated').getValue() === false) {
params.push('rel=0');
}
if (this.getContentElement('youtubePlugin', 'chkAutoplay').getValue() === true) {
params.push('autoplay=1');
paramAutoplay='autoplay';
}
if (this.getContentElement('youtubePlugin', 'chkControls').getValue() === false) {
params.push('controls=0');
}
startSecs = this.getValueOf('youtubePlugin', 'txtStartAt');
if (startSecs) {
var seconds = hmsToSeconds(startSecs);
params.push('start=' + seconds);
}
if (params.length > 0) {
url = url + '?' + params.join('&');
}
if (this.getContentElement('youtubePlugin', 'chkResponsive').getValue() === true) {
content += '<div class="youtube-embed-wrapper" style="position:relative;padding-bottom:56.25%;padding-top:30px;height:0;overflow:hidden">';
responsiveStyle = 'style="position:absolute;top:0;left:0;width:100%;height:100%"';
}
if (this.getContentElement('youtubePlugin', 'chkOlderCode').getValue() === true) {
url = url.replace('embed/', 'v/');
url = url.replace(/&/g, '&amp;');
if (url.indexOf('?') === -1) {
url += '?';
}
else {
url += '&amp;';
}
url += 'hl=' + (this.getParentEditor().config.language ? this.getParentEditor().config.language : 'en') + '&amp;version=3';
content += '<object width="' + width + '" height="' + height + '" ' + responsiveStyle + '>';
content += '<param name="movie" value="' + url + '"></param>';
content += '<param name="allowFullScreen" value="true"></param>';
content += '<param name="allowscriptaccess" value="always"></param>';
content += '<embed src="' + url + '" type="application/x-shockwave-flash" ';
content += 'width="' + width + '" height="' + height + '" '+ responsiveStyle + ' allowscriptaccess="always" ';
content += 'allowfullscreen="true"></embed>';
content += '</object>';
}
else
if (this.getContentElement('youtubePlugin', 'chkNoEmbed').getValue() === true) {
var imgSrc = 'https://img.youtube.com/vi/' + video + '/sddefault.jpg';
content += '<a href="' + url + '" ><img width="' + width + '" height="' + height + '" src="' + imgSrc + '" ' + responsiveStyle + '/></a>';
}
else {
content += '<iframe ' + (paramAutoplay ? 'allow="' + paramAutoplay + ';" ' : '') + 'width="' + width + '" height="' + height + '" src="' + url + '" ' + responsiveStyle;
content += 'frameborder="0" allowfullscreen></iframe>';
}
if (this.getContentElement('youtubePlugin', 'chkResponsive').getValue() === true) {
content += '</div>';
}
}
var element = CKEDITOR.dom.element.createFromHtml(content);
var instance = this.getParentEditor();
instance.insertElement(element);
}
};
});
}
});
})();
function handleLinkChange(el, api) {
var video = ytVidId(el.getValue());
var time = ytVidTime(el.getValue());
if (el.getValue().length > 0) {
el.getDialog().getContentElement('youtubePlugin', 'txtEmbed').disable();
}
else if (!disabled.length || !disabled.includes('txtEmbed')) {
el.getDialog().getContentElement('youtubePlugin', 'txtEmbed').enable();
}
if (video && time) {
var seconds = timeParamToSeconds(time);
var hms = secondsToHms(seconds);
el.getDialog().getContentElement('youtubePlugin', 'txtStartAt').setValue(hms);
}
}
function handleEmbedChange(el, api) {
if (el.getValue().length > 0) {
el.getDialog().getContentElement('youtubePlugin', 'txtUrl').disable();
}
else {
el.getDialog().getContentElement('youtubePlugin', 'txtUrl').enable();
}
}
/**
* JavaScript function to match (and return) the video Id
* of any valid Youtube Url, given as input string.
* @author: Stephan Schmitz <eyecatchup@gmail.com>
* @url: http://stackoverflow.com/a/10315969/624466
*/
function ytVidId(url) {
var p = /^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$/;
return (url.match(p)) ? RegExp.$1 : false;
}
/**
* Matches and returns time param in YouTube Urls.
*/
function ytVidTime(url) {
var p = /t=([0-9hms]+)/;
return (url.match(p)) ? RegExp.$1 : false;
}
/**
* Converts time in hms format to seconds only
*/
function hmsToSeconds(time) {
var arr = time.split(':'), s = 0, m = 1;
while (arr.length > 0) {
s += m * parseInt(arr.pop(), 10);
m *= 60;
}
return s;
}
/**
* Converts seconds to hms format
*/
function secondsToHms(seconds) {
var h = Math.floor(seconds / 3600);
var m = Math.floor((seconds / 60) % 60);
var s = seconds % 60;
var pad = function (n) {
n = String(n);
return n.length >= 2 ? n : "0" + n;
};
if (h > 0) {
return pad(h) + ':' + pad(m) + ':' + pad(s);
}
else {
return pad(m) + ':' + pad(s);
}
}
/**
* Converts time in youtube t-param format to seconds
*/
function timeParamToSeconds(param) {
var componentValue = function (si) {
var regex = new RegExp('(\\d+)' + si);
return param.match(regex) ? parseInt(RegExp.$1, 10) : 0;
};
return componentValue('h') * 3600
+ componentValue('m') * 60
+ componentValue('s');
}
/**
* Converts seconds into youtube t-param value, e.g. 1h4m30s
*/
function secondsToTimeParam(seconds) {
var h = Math.floor(seconds / 3600);
var m = Math.floor((seconds / 60) % 60);
var s = seconds % 60;
var param = '';
if (h > 0) {
param += h + 'h';
}
if (m > 0) {
param += m + 'm';
}
if (s > 0) {
param += s + 's';
}
return param;
}

4
assets/controllers.json Normal file
View File

@ -0,0 +1,4 @@
{
"controllers": [],
"entrypoints": []
}

View File

@ -0,0 +1,16 @@
import { Controller } from '@hotwired/stimulus';
/*
* This is an example Stimulus controller!
*
* Any element with a data-controller="hello" attribute will cause
* this controller to be executed. The name "hello" comes from the filename:
* hello_controller.js -> "hello"
*
* Delete this file or adapt it for your use!
*/
export default class extends Controller {
connect() {
this.element.textContent = 'Hello Stimulus! Edit me in assets/controllers/hello_controller.js';
}
}

19
assets/dropzone.js Normal file
View File

@ -0,0 +1,19 @@
require('dropzone/dist/dropzone.css');
/*
window.Dropzone = require('dropzone/dist/dropzone.js');
*/
const { Dropzone } = require("dropzone");
document.addEventListener('DOMContentLoaded', function() {
var elt = document.getElementById('mydropzone');
console.log($(elt).data("maxfiles"))
var mydropzone = new Dropzone(elt, {
acceptedMimeTypes: $(elt).data("acceptedMimeTypes"),
maxFiles: $(elt).data("maxFiles"),
success: function( file, response ){
dropzonesuccess(file,response);
},
});
global.mydropzone=mydropzone;
});

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
assets/fonts/Teko-Bold.ttf Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

62
assets/js/app.js Normal file
View File

@ -0,0 +1,62 @@
$(document).ready(function() {
// Color
$(".pick-a-color").spectrum(
{
type: "text",
showAlpha: false
}
);
$(".pick-a-color").attr("autocomplete","off");
// method confirm
var doit = true;
$("a[data-method]").on('click',function(){
if($(this).data('confirm')){
doit = confirm($(this).data('confirm'));
if(!doit) return false;
}
});
$("button[data-method]").on('click',function(){
if($(this).data('confirm')){
doit = confirm($(this).data('confirm'));
if(!doit) return false;
}
});
// Modal
$(".btn-modal").click(function() {
$("#"+$(this).data("modalid")+" .modal-title").text($(this).data("modaltitle"));
$("#"+$(this).data("modalid")+" iframe").attr("src",$(this).data("modalurl"));
$("#"+$(this).data("modalid")).modal("show");
});
// Resize
resize();
// Focus
$("#page").focus();
});
$( window ).resize(function() {
resize();
});
function resize() {
if($("#header").is(":visible")){
$(".navbar-logo").hide();
$("#menulink").hide();
$("#header").hide();
}
else {
$(".navbar-logo").show();
$("#menulink").show();
$("#header").show();
}
$("main").css("height",$(window).height()-$(".header").height());
$("#page").css("height",$(window).height()-$(".header").height());
$("#sidebar").css("min-height",$("body").height()-$(".header").height());
}

View File

@ -0,0 +1,31 @@
$(document).ready(function() {
$.extend( $.fn.dataTable.defaults, {
responsive: true,
"iDisplayLength": 1000,
"scrollX": true,
"oLanguage": {
"sThousands": " ",
"sProcessing": "Traitement en cours...",
"sSearch": "Rechercher&nbsp;:",
"sLengthMenu": "Afficher _MENU_ &eacute;l&eacute;ments",
"sInfo": "Affichage de l'&eacute;lement _START_ &agrave; _END_ sur _TOTAL_ &eacute;l&eacute;ments",
"sInfoEmpty": "Affichage de l'&eacute;lement 0 &agrave; 0 sur 0 &eacute;l&eacute;ments",
"sInfoFiltered": "(filtr&eacute; de _MAX_ &eacute;l&eacute;ments au total)",
"sInfoPostFix": "",
"sLoadingRecords": "Chargement en cours...",
"sZeroRecords": "Aucun &eacute;l&eacute;ment &agrave; afficher",
"sEmptyTable": "Aucune donnée disponible dans le tableau",
"oPaginate": {
"sFirst": "Premier",
"sPrevious": "Pr&eacute;c&eacute;dent",
"sNext": "Suivant",
"sLast": "Dernier"
},
"oAria": {
"sSortAscending": ": activer pour trier la colonne par ordre croissant",
"sSortDescending": ": activer pour trier la colonne par ordre décroissant"
}
},
//"stateSave": true
});
});

222
assets/styles/app.css Normal file
View File

@ -0,0 +1,222 @@
/* COLOR */
body {
background-color: var(--colorbgbodylight);
color: var(--colorftbodylight);
}
.header {
color: var(--colorfttitledark);
}
.header a, #sidebar a, #sidebar hr{
color: var(--colorfttitledark);
}
.header a:hover, #sidebar a:hover {
color: var(--colorfttitledark);
text-decoration:none;
}
.navbar {
background-color: var(--colorbgbodydark);
}
.table,
.table-hover > tbody > tr:hover > *,
.table-striped > tbody > tr:nth-of-type(odd) > * {
color: var(--colorftbodylight);
}
/* FONT */
body {
font-family: var(--fontbody);
}
h1, h2, h3, .navbar-brand, .card-header, .modal-header h4, .widgetheader .title {
font-family: var(--fonttitle);
color: var(--colorfttitlelight);
}
h1 { font-size: var(--fontsizeh1); }
h2 { font-size: var(--fontsizeh2); }
h3 { font-size: var(--fontsizeh3); }
h4 { font-size: var(--fontsizeh4); }
.card-header .custom-control, .grid-item-title h2 {
font-family: var(--fontbody);
}
/* GLOBAL */
html, body {
height:100%;
}
a {
text-decoration: none;
cursor: pointer;
color: var(--colorfttitlelight);
}
a:hover {
color: var(--colorfttitlelight-darker);
}
main {
display:flex;
overflow:hidden;
}
.dataTable {
border-style: solid none solid solid;
border-width: 1px;
}
.avatar {
width:30px;
height:30px;
background-color: var(--colorbgbodydark);
border-radius: 100%;
}
.select2,.select2-container .select2-search--inline {
width:100%!important;
}
/* HEADER */
.header h1 {
text-transform: uppercase;
padding-left: 10px;
padding-top: 15px;
margin: 0px;
line-height:var(--lineheighth1);
}
.header h1 small {
font-size:60%;
}
#header .nav-link {
padding:0.5rem;
}
@media (max-width: 991px) {
#header {
display:none !important;
}
}
/* NAVBAR */
.nav {
vertical-align: middle;
}
.navbar-logo {
padding: 0 0 0 0.5rem !important;
}
.navbar-logo img{
height:20px;
}
.navbar i {
font-size: 20px;
min-width: 30px;
height:20px;
}
/* MENU */
#menu {
height:50px;
padding: 0px 0px 0px 10px !important;
}
#menu .navbar-logo {
margin-right: 10px;
}
@media (max-width: 991px) {
#menu {
display:flex !important;
height: auto;
padding: 0px !important;
}
.navbar-logo {
padding: 10px 5px 10px 10px !important;
}
.navbar-logo img {
height:40px;
}
.navbar i {
font-size: 20px;
min-width: 30px;
height:20px;
}
#switchHeader {
display:none;
}
}
/* SIDEBAR */
#sidebar {
background-color: var(--colorbgbodydark);
width: 100%;
max-width:300px;
overflow-y: auto;
}
#sidebar span {
padding-left: 5px;
}
#sidebar .nav-pills .nav-link {
border-radius:0px;
}
#sidebar .nav-pills .nav-link.active {
background-color: var(--colorbgbodydark-darker);
}
#sidebar .nav-link-items {
display: none;
}
#sidebar .nav-link-item {
padding-left: 2em;
}
@media (max-width: 991px) {
#sidebar {
max-width:65px;
}
#sidebar span {
display: none;
}
#sidebar i {
font-size: 25px;
}
#sidebar .nav-link-item {
padding-left: 1rem;
}
#sidebar .nav-link-section {
display:block;
margin-bottom: 10px;
}
#sidebar .nav-link-title {
display:none;
}
#sidebar .nav-link-items {
display:block !important;
border-bottom: 1px solid var(--colorfttitledark);
}
}
/* PAGE */
#page {
overflow-y: auto;
width:100%;
}

181
assets/styles/font.css Normal file
View File

@ -0,0 +1,181 @@
@font-face {
font-family: 'Redressed';
src: url('../fonts/Redressed-webfont.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Acme-Regular';
src: url('../fonts/Acme-Regular-webfont.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Peacesans';
src: url('../fonts/Peacesans-webfont.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Roboto-Regular';
src: url('../fonts/Roboto-Regular-webfont.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Justanotherhand-Regular';
src: url('../fonts/Justanotherhand-Regular-webfont.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Lato-Regular';
src: url('../fonts/Lato-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'ABeeZee-Regular';
src: url('../fonts/ABeeZee-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'AlfaSlabOne-Regular';
src: url('../fonts/AlfaSlabOne-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Anton-Regular';
src: url('../fonts/Anton-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'FredokaOne-Regular';
src: url('../fonts/FredokaOne-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Overpass-Black';
src: url('../fonts/Overpass-Black.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Righteous-Regular';
src: url('../fonts/Righteous-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Signika-Regular';
src: url('../fonts/Signika-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Teko-Bold';
src: url('../fonts/Teko-Bold.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'LuckiestGuy-Regular';
src: url('../fonts/LuckiestGuy-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Baloo-Regular';
src: url('../fonts/Baloo-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'CarterOne-Regular';
src: url('../fonts/CarterOne-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Chewy-Regular';
src: url('../fonts/Chewy-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Courgette-Regular';
src: url('../fonts/Courgette-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'LexendDeca-Regular';
src: url('../fonts/LexendDeca-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'RubikMonoOne-Regular';
src: url('../fonts/RubikMonoOne-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'SigmarOne-Regular';
src: url('../fonts/SigmarOne-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Viga-Regular';
src: url('../fonts/Viga-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Grandstander';
src: url('../fonts/Grandstander-Black.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'PassionOne';
src: url('../fonts/PassionOne-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Theboldfont';
src: url('../fonts/theboldfont.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}

17
bin/console Executable file
View File

@ -0,0 +1,17 @@
#!/usr/bin/env php
<?php
use App\Kernel;
use Symfony\Bundle\FrameworkBundle\Console\Application;
if (!is_file(dirname(__DIR__).'/vendor/autoload_runtime.php')) {
throw new LogicException('Symfony Runtime is missing. Try running "composer require symfony/runtime".');
}
require_once dirname(__DIR__).'/vendor/autoload_runtime.php';
return function (array $context) {
$kernel = new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']);
return new Application($kernel);
};

12
bin/messager.sh Executable file
View File

@ -0,0 +1,12 @@
#!/bin/bash
SERVICE="messager.sh"
pgrep -x "$SERVICE" >/tmp/messager.pid
NB=$(wc -l < /tmp/messager.pid)
if [ ${NB} -gt 1 ]
then
echo "$SERVICE is running"
else
echo "$SERVICE stopped"
/var/www/html/nineskeletor/bin/console messenger:consume async --memory-limit=512m --env=prod
fi

1
bin/nineskeletor.cron Normal file
View File

@ -0,0 +1 @@
* * * * * www-data /var/www/html/nineskeletor/bin/console app:Cron &>/dev/null

13
bin/nineskeletor.service Normal file
View File

@ -0,0 +1,13 @@
[Unit]
StartLimitIntervalSec=20s
StartLimitBurst=5
[Service]
ExecStart=/usr/bin/php -d memory_limit=-1 /var/www/html/nineskeletor/bin/console messenger:consume async --memory-limit=512m --env=prod
Restart=always
RestartSec=1
TimeoutSec=300
User=www-data
[Install]
WantedBy=multi-user.target

19
bin/phpunit Executable file
View File

@ -0,0 +1,19 @@
#!/usr/bin/env php
<?php
if (!ini_get('date.timezone')) {
ini_set('date.timezone', 'UTC');
}
if (is_file(dirname(__DIR__).'/vendor/phpunit/phpunit/phpunit')) {
define('PHPUNIT_COMPOSER_INSTALL', dirname(__DIR__).'/vendor/autoload.php');
require PHPUNIT_COMPOSER_INSTALL;
PHPUnit\TextUI\Command::main();
} else {
if (!is_file(dirname(__DIR__).'/vendor/symfony/phpunit-bridge/bin/simple-phpunit.php')) {
echo "Unable to find the `simple-phpunit.php` script in `vendor/symfony/phpunit-bridge/bin/`.\n";
exit(1);
}
require dirname(__DIR__).'/vendor/symfony/phpunit-bridge/bin/simple-phpunit.php';
}

Some files were not shown because too many files have changed in this diff Show More