Browse Source

mise à niveau

master
afornerot 2 years ago
parent
commit
ba27cb51b3
  1. 225
      README.md
  2. 3
      src/ninesurvey-1.0/.gitignore
  3. 2
      src/ninesurvey-1.0/config/packages/one_upload.yaml
  4. 37
      src/ninesurvey-1.0/config/routes.yaml
  5. 7
      src/ninesurvey-1.0/config/services.yaml
  6. 0
      src/ninesurvey-1.0/public/uploads/logo/logo.png
  7. 213
      src/ninesurvey-1.0/src/Command/AppInitCommand.php
  8. 115
      src/ninesurvey-1.0/src/Controller/ConfigController.php
  9. 75
      src/ninesurvey-1.0/src/Controller/CropController.php
  10. 1
      src/ninesurvey-1.0/src/Controller/GroupController.php
  11. 4
      src/ninesurvey-1.0/src/Controller/SecurityController.php
  12. 67
      src/ninesurvey-1.0/src/Controller/UserController.php
  13. 202
      src/ninesurvey-1.0/src/Entity/Config.php
  14. 165
      src/ninesurvey-1.0/src/Form/ConfigType.php
  15. 26
      src/ninesurvey-1.0/src/Form/UserType.php
  16. 15
      src/ninesurvey-1.0/src/Repository/ConfigRepository.php
  17. 73
      src/ninesurvey-1.0/src/Service/sessionInit.php
  18. 131
      src/ninesurvey-1.0/src/Service/uploadListener.php
  19. 94
      src/ninesurvey-1.0/templates/Config/edit.html.twig
  20. 60
      src/ninesurvey-1.0/templates/Config/list.html.twig
  21. 42
      src/ninesurvey-1.0/templates/Config/logo.html.twig
  22. 78
      src/ninesurvey-1.0/templates/Config/render.html.twig
  23. 6
      src/ninesurvey-1.0/templates/Crop/crop01.html.twig
  24. 80
      src/ninesurvey-1.0/templates/Crop/crop02.html.twig
  25. 17
      src/ninesurvey-1.0/templates/Home/login.html.twig
  26. 2
      src/ninesurvey-1.0/templates/Include/javascript.js.twig
  27. 7
      src/ninesurvey-1.0/templates/Include/sidebar.html.twig
  28. 168
      src/ninesurvey-1.0/templates/Include/style.css.twig
  29. 24
      src/ninesurvey-1.0/templates/User/edit.html.twig
  30. 7
      src/ninesurvey-1.0/templates/User/list.html.twig
  31. 41
      src/ninesurvey-1.0/templates/base.html.twig

225
README.md

@ -1,224 +1,3 @@
# 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 logrotate/nineskeletor en logrotate/nineXXXX
- Modifier logrotate/nineXXXX 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
- Modifier src/nineXXXX-1.0/webpack.config.js et remplacer tout les nineskeletor en nineXXXX
- 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
- 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
# Prototype Ninesurvey
Une alternative à Opensondage
## Compilier les asset
- installer nodejs
- installer npm
- installer n
- passer sur la verison 8 de node
- yarn encore dev
- yarn encore prod
# Description du squelette
## 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
### Tag morris
- raphael = https://www.npmjs.com/package/raphael
- morris.js = https://www.npmjs.com/package/morris.js
### 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
### Tag dropzone
- dropzone = https://www.npmjs.com/package/dropzone
## 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

3
src/ninesurvey-1.0/.gitignore vendored

@ -29,4 +29,7 @@ yarn-error.log
!/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

2
src/ninesurvey-1.0/config/packages/one_upload.yaml

@ -2,6 +2,8 @@ oneup_uploader:
mappings:
avatar:
frontend: dropzone
logo:
frontend: dropzone
document:
frontend: dropzone
namer: app.upload.samename

37
src/ninesurvey-1.0/config/routes.yaml

@ -28,6 +28,31 @@ app_logoutcas:
path: /logoutcas
defaults: { _controller: App\Controller\SecurityController:logout }
#== Config ========================================================================================================
app_config:
path: /admin/config
defaults: { _controller: App\Controller\ConfigController:list }
app_config_render:
path: /admin/config/render/{category}
defaults: { _controller: App\Controller\ConfigController:listrender }
app_config_submit:
path: /admin/config/submit
defaults: { _controller: App\Controller\ConfigController:submit }
app_config_update:
path: /admin/config/update/{id}
defaults: { _controller: App\Controller\ConfigController:update }
app_config_delete:
path: /admin/config/delete/{id}
defaults: { _controller: App\Controller\ConfigController:delete }
app_config_logo:
path: /admin/config/logo
defaults: { _controller: App\Controller\ConfigController:logo }
#== Sonde ================================================================================================================
app_sonde:
path: /sonde
@ -35,11 +60,11 @@ app_sonde:
#== Crop =========================================================================================================
app_crop01:
path: /user/crop01
path: /user/crop01/{type}/{reportinput}
defaults: { _controller: App\Controller\CropController:crop01 }
app_crop02:
path: /user/crop02
path: /user/crop02/{type}/{reportinput}
defaults: { _controller: App\Controller\CropController:crop02 }
oneup_uploader:
@ -76,10 +101,18 @@ app_user:
path: /admin/user
defaults: { _controller: App\Controller\UserController:list }
app_user_submit:
path: /admin/user/submit
defaults: { _controller: App\Controller\UserController:submit }
app_user_update:
path: /admin/user/update/{id}
defaults: { _controller: App\Controller\UserController:update }
app_user_delete:
path: /admin/user/delete/{id}
defaults: { _controller: App\Controller\UserController:delete }
app_user_select:
path: /user/user/select
defaults: { _controller: App\Controller\UserController:select }

7
src/ninesurvey-1.0/config/services.yaml

@ -80,6 +80,13 @@ services:
# add more service definitions when explicit configuration is needed
# please note that last definitions always *replace* previous ones
app.session.init:
public: true
class: App\Service\sessionInit
arguments: ["@service_container","@doctrine.orm.entity_manager","@session",]
tags:
- { name: kernel.event_listener, event: kernel.request, method: onDomainParse }
app.password.encoder:
public: true
class: App\Service\passwordEncoder

0
src/ninesurvey-1.0/public/images/logo.png → src/ninesurvey-1.0/public/uploads/logo/logo.png

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

213
src/ninesurvey-1.0/src/Command/AppInitCommand.php

@ -14,6 +14,8 @@ use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\Id\AssignedGenerator;
use App\Entity\User;
use App\Entity\Config;
class AppInitCommand extends Command
{
@ -56,6 +58,195 @@ class AppInitCommand extends Command
// Création du compte admin si non existant
$this->insertUser("admin","admin");
// colorbgbody = Couleur des fonds de page
$this->insertConfig(
1, // order
"site", // category
"appname", // id
"Titre de votre site", // title
"", // value
"string", // type,
true, // visible
true, // changeable
false, // required
"", // grouped
"Titre de votre site"
);
$this->insertConfig(
2, // order
"site", // category
"appsubname", // id
"Sous-titre de votre site", // title
"", // value
"string", // type,
true, // visible
true, // changeable
false, // required
"", // grouped
"Sous-titre de votre site"
);
$this->insertConfig(
3, // order
"site", // category
"appdescription", // id
"Description de votre site", // title
"", // value
"editor", // type,
true, // visible
true, // changeable
false, // required
"", // grouped
"Description de votre site"
);
// colorbgbody = Couleur des fonds de page
$this->insertConfig(
1, // order
"colorbgbody", // category
"colorbgbodydark", // id
"Couleur de fond fonçée", // title
"", // value
"color", // type,
true, // visible
true, // changeable
false, // required
"", // grouped
"La couleur de fond quand le site a besoin d'avoir une couleur de fond foncée"
);
$this->insertConfig(
2, // order
"colorbgbody", // category
"colorbgbodylight", // id
"Couleur de fond claire", // title
"", // value
"color", // type,
true, // visible
true, // changeable
false, // required
"", // grouped
"La couleur de fond quand le site a besoin d'avoir une couleur de fond claire"
);
// colorfttitle = Couleur des fontes titre
$this->insertConfig(
1, // order
"colorfttitle", // category
"colorfttitledark", // id
"Couleur des titres sur fond fonçé", // title
"", // value
"color", // type,
true, // visible
true, // changeable
false, // required
"", // grouped
"La couleur des titres sur fond fonçé"
);
$this->insertConfig(
2, // order
"colorfttitle", // category
"colorfttitlelight", // id
"Couleur des titres sur fond claire", // title
"", // value
"color", // type,
true, // visible
true, // changeable
false, // required
"", // grouped
"La couleur des titres sur fond claire"
);
// colorftbody = Couleur des fontes titre
$this->insertConfig(
1, // order
"colorftbody", // category
"colorftbodydark", // id
"Couleur de la police sur fond fonçé", // title
"", // value
"color", // type,
true, // visible
true, // changeable
false, // required
"", // grouped
"La couleur de la police sur fond fonçé"
);
$this->insertConfig(
2, // order
"colorftbody", // category
"colorftbodylight", // id
"Couleur de la police sur fond claire", // title
"", // value
"color", // type,
true, // visible
true, // changeable
false, // required
"", // grouped
"La couleur de la police sur fond claire"
);
// font = nom des polices
$this->insertConfig(
1, // order
"font", // category
"fonttitle", // id
"Police pour les titres", // title
"", // value
"font", // type,
true, // visible
true, // changeable
false, // required
"", // grouped
"La couleur de la police de votre site"
);
$this->insertConfig(
2, // order
"font", // category
"fontbody", // id
"Police principale", // title
"", // value
"font", // type,
true, // visible
true, // changeable
false, // required
"", // grouped
"Nom de la police principale"
);
// logo =
$this->insertConfig(
1, // order
"logo", // category
"logodark", // id
"Logo sur fond fonçé", // title
"", // value
"logo", // type,
true, // visible
true, // changeable
false, // required
"", // grouped
"Logo sur fond fonçé"
);
$this->insertConfig(
2, // order
"logo", // category
"logolight", // id
"Logo sur fond clair", // title
"", // value
"logo", // type,
true, // visible
true, // changeable
false, // required
"", // grouped
"Logo sur fond clair"
);
$output->writeln('');
return 1;
@ -90,6 +281,28 @@ class AppInitCommand extends Command
}
protected function insertConfig($order,$category,$id,$title,$value,$type,$visible,$changeable,$required,$grouped,$help) {
$entity=$this->em->getRepository("App:Config")->find($id);
if(!$entity) {
$entity= new Config();
$entity->setId($id);
$entity->setValue($value);
}
$entity->setCategory($category);
$entity->setOrder($order);
$entity->setTitle($title);
$entity->setType($type);
$entity->setVisible($visible);
$entity->setChangeable($changeable);
$entity->setRequired($required);
$entity->setGrouped($grouped);
$entity->setHelp($help);
$this->em->persist($entity);
$this->em->flush();
}
private function writelnred($string) {
$this->output->writeln('<fg=red>'.$string.'</>');
$this->filesystem->appendToFile($this->rootlog.'cron.log', $string."\n");

115
src/ninesurvey-1.0/src/Controller/ConfigController.php

@ -0,0 +1,115 @@
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Form\FormError;
use App\Entity\Config as Entity;
use App\Form\ConfigType as Form;
class ConfigController extends AbstractController
{
private $data = "config";
private $route = "app_config";
private $render = "Config/";
private $entity = "App:Config";
public function list()
{
$em = $this->getDoctrine()->getManager();
$datas = $em->getRepository($this->entity)->findBy(["visible"=>true]);
return $this->render($this->render.'list.html.twig',[
$this->data."s" => $datas,
"useheader" => true,
"usesidebar" => true,
]);
}
public function listrender($category)
{
$em = $this->getDoctrine()->getManager();
$datas = $em->getRepository($this->entity)->findBy(["visible"=>true,"category"=>$category]);
return $this->render($this->render.'render.html.twig',[
$this->data."s" => $datas,
"useheader" => true,
"usesidebar" => true,
]);
}
public function update($id,Request $request)
{
// Initialisation de l'enregistrement
$em = $this->getDoctrine()->getManager();
$data=$em->getRepository($this->entity)->find($id);
if(!$data->getValue())
$data->setValue($this->get('session')->get($data->getId()));
// Création du formulaire
$form = $this->createForm(Form::class,$data,array("mode"=>"update","id"=>$data->getId(),"type"=>$data->getType(),"required"=>$data->getRequired()));
// Récupération des data du formulaire
$form->handleRequest($request);
// Sur erreur
$this->getErrorForm($id,$form,$request,$data,"update");
// Sur validation
if ($form->get('submit')->isClicked() && $form->isValid()) {
$data = $form->getData();
$em->persist($data);
$em->flush();
// Retour à la liste
return $this->redirectToRoute($this->route);
}
// Affichage du formulaire
return $this->render($this->render.'edit.html.twig', [
'useheader' => true,
'usesidebar' => true,
$this->data => $data,
'mode' => 'update',
'form' => $form->createView()
]);
}
public function delete($id,Request $request)
{
// Récupération de l'enregistrement courant
$em = $this->getDoctrine()->getManager();
$config=$em->getRepository($this->entity)->find($id);
if(!$config->getRequired()) {
$config->setValue("");
$em = $this->getDoctrine()->getManager();
$em->persist($config);
$em->flush();
}
return $this->redirectToRoute('app_config');
}
public function logo()
{
return $this->render($this->render.'logo.html.twig');
}
protected function getErrorForm($id,$form,$request,$data) {
if ($form->get('submit')->isClicked() && !$form->isValid()) {
$this->get('session')->getFlashBag()->clear();
$validator = $this->get('validator');
$errors = $validator->validate($data);
foreach( $errors as $error ) {
$request->getSession()->getFlashBag()->add("error", $error->getMessage());
}
$errors = $form->getErrors();
foreach( $errors as $error ) {
$request->getSession()->getFlashBag()->add("error", $error->getMessage());
}
}
}
}

75
src/ninesurvey-1.0/src/Controller/CropController.php

@ -4,48 +4,81 @@ namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Filesystem\Filesystem;
class CropController extends AbstractController
{
// Etape 01 - Téléchargement de l'image
public function crop01()
public function crop01($type,$reportinput)
{
return $this->render('Crop/crop01.html.twig',[
'useheader' => false,
'usemenu' => false,
'usesidebar' => false,
'type' => $type,
'reportinput' => $reportinput
]);
}
// Etape 02 - Couper votre l'image
public function crop02(Request $request)
public function crop02($type,$reportinput,Request $request)
{
// Récupération de l'image à cropper
$large_image_location = "uploads/avatar/".$this->get('session')->get('uploadavatar');
$file=$request->query->get('file');
$large_image_location = "uploads/$type/$file";
// Récupérer les tailles de l'image
$width = $this->getWidth($large_image_location);
$height = $this->getHeight($large_image_location);
// Définir le pourcentage de réduction de l'image
$max_height=400000;
$max_width=800;
$scale = $max_height/$height;
if(($width*$scale)>$max_width) {
$scale = $max_width/$width;
// Définir le pourcentage de réduction de l'image
switch ($type) {
case "illustration":
$max_height=0;
$ratio="1:1";
break;
case "avatar":
$max_height=900;
$max_width=900;
$ratio="1:1";
break;
case "hero":
$max_height=1600;
$max_width=1600;
$ratio="16:9";
break;
case "image":
$max_height=1600;
$max_width=1600;
$ratio="1:1";
break;
}
if($max_height>0) {
$scale = $max_height/$height;
if(($width*$scale)>$max_width) {
$scale = $max_width/$width;
}
$this->resizeImage($large_image_location,$width,$height,$scale);
}
$this->resizeImage($large_image_location,$width,$height,$scale);
else $scale=1;
// Construction du formulaire
$submited=false;
$form = $this->createFormBuilder()
->add('submit',SubmitType::class,array("label" => "Valider","attr" => array("class" => "btn btn-success","onclick" => "reportThumb()")))
->add('x',HiddenType::class)
->add('y',HiddenType::class)
->add('w',HiddenType::class)
->add('h',HiddenType::class)
->add('xs',HiddenType::class)
->add('ys',HiddenType::class)
->add('ws',HiddenType::class)
->add('hs',HiddenType::class)
->getForm();
// Récupération des data du formulaire
@ -55,16 +88,20 @@ class CropController extends AbstractController
if ($form->get('submit')->isClicked() && $form->isValid()) {
// Récupération des valeurs du formulaire
$data = $form->getData();
$thumb_image_location = "uploads/avatar/thumb_".$this->get('session')->get('uploadavatar');;
$cropped = $this->resizeThumbnailImage($thumb_image_location, $large_image_location,$data["w"],$data["h"],$data["x"],$data["y"],$scale);
$thumb_image_location = "uploads/$type/thumb_".$file;
$cropped = $this->resizeThumbnailImage($thumb_image_location, $large_image_location,$data["ws"],$data["hs"],$data["xs"],$data["ys"],$scale);
$submited=true;
}
return $this->render('Crop/crop02.html.twig', [
'useheader' => false,
'usemenu' => false,
'usesidebar' => false,
'form' => $form->createView(),
'form' => $form->createView(),
'type' => $type,
'file' => $file,
'ratio' => $ratio,
"reportinput" => $reportinput,
"submited" => $submited
]);
}
@ -77,7 +114,6 @@ class CropController extends AbstractController
// Cacul de la largeur
protected function getWidth($image) {
dump($image);
$size = getimagesize($image);
$width = $size[0];
return $width;
@ -125,6 +161,9 @@ class CropController extends AbstractController
}
protected function resizeThumbnailImage($thumb_image_name, $image, $width, $height, $start_width, $start_height, $scale){
$fs = new Filesystem();
$fs->remove($thumb_image_name);
list($imagewidth, $imageheight, $imageType) = getimagesize($image);
$imageType = image_type_to_mime_type($imageType);

1
src/ninesurvey-1.0/src/Controller/GroupController.php

@ -107,6 +107,7 @@ class GroupController extends AbstractController
// Controle avant suppression
$error=false;
if($id<0) $error=true;
if($error)
return $this->redirectToRoute($this->route."_update",["id"=>$id]);
else {

4
src/ninesurvey-1.0/src/Controller/SecurityController.php

@ -26,7 +26,7 @@ class SecurityController extends AbstractController
{
$auth_mode=$this->getParameter("appAuth");
switch($auth_mode) {
case "MYSQL":
case "SQL":
return $this->loginMYSQL($request,$authenticationUtils);
break;
@ -140,7 +140,7 @@ class SecurityController extends AbstractController
public function logout() {
$auth_mode=$this->getParameter("appAuth");
switch($auth_mode) {
case "MYSQL":
case "SQL":
return $this->logoutMYSQL();
break;

67
src/ninesurvey-1.0/src/Controller/UserController.php

@ -29,6 +29,45 @@ class UserController extends AbstractController
]);
}
public function submit(Request $request)
{
// Uniquement possible si appMasteridentity = SQL
if($this->getParameter("appMasteridentity") != "SQL") return $this->redirectToRoute($this->route);
// Initialisation de l'enregistrement
$em = $this->getDoctrine()->getManager();
$data = new Entity();
$data->setAvatar("noavatar.png");
// Création du formulaire
$form = $this->createForm(Form::class,$data,array("mode"=>"submit","appAuth"=>$this->getParameter("appAuth"),"appMasteridentity"=>$this->getParameter("appMasteridentity")));
// Récupération des data du formulaire
$form->handleRequest($request);
// Sur erreur
$this->getErrorForm(null,$form,$request,$data,"submit");
// Sur validation
if ($form->get('submit')->isClicked() && $form->isValid()) {
$data = $form->getData();
$em->persist($data);
$em->flush();
// Retour à la liste
return $this->redirectToRoute($this->route);
}
// Affichage du formulaire
return $this->render($this->render.'edit.html.twig', [
'useheader' => true,
'usesidebar' => true,
$this->data => $data,
'mode' => 'submit',
'form' => $form->createView()
]);
}
public function update($id,Request $request)
{
// Initialisation de l'enregistrement
@ -37,7 +76,7 @@ class UserController extends AbstractController
$oldpassword=$data->getPassword();
// Création du formulaire
$form = $this->createForm(Form::class,$data,array("mode"=>"update","appAuth"=>$this->getParameter("appAuth")));
$form = $this->createForm(Form::class,$data,array("mode"=>"update","appAuth"=>$this->getParameter("appAuth"),"appMasteridentity"=>$this->getParameter("appMasteridentity")));
// Récupération des data du formulaire
$form->handleRequest($request);
@ -71,6 +110,30 @@ class UserController extends AbstractController
]);
}
public function delete($id,Request $request)
{
// Uniquement possible si appMasteridentity = SQL
if($this->getParameter("appMasteridentity") != "SQL") return $this->redirectToRoute($this->route);
// Initialisation de l'enregistrement
$em = $this->getDoctrine()->getManager();
$data=$em->getRepository($this->entity)->find($id);
// Controle avant suppression
$error=false;
if($id<0) $error=true;
if($error)
return $this->redirectToRoute($this->route."_update",["id"=>$id]);
else {
$em->remove($data);
$em->flush();
// Retour à la liste
return $this->redirectToRoute($this->route);
}
}
public function profil(Request $request)
{
// Initialisation de l'enregistrement
@ -79,7 +142,7 @@ class UserController extends AbstractController
$oldpassword=$data->getPassword();
// Création du formulaire
$form = $this->createForm(Form::class,$data,array("mode"=>"profil","appAuth"=>$this->getParameter("appAuth")));
$form = $this->createForm(Form::class,$data,array("mode"=>"profil","appAuth"=>$this->getParameter("appAuth"),"appMasteridentity"=>$this->getParameter("appMasteridentity")));
// Récupération des data du formulaire
$form->handleRequest($request);

202
src/ninesurvey-1.0/src/Entity/Config.php

@ -0,0 +1,202 @@
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Cron
*
* @ORM\Table(name="config")
* @ORM\Entity(repositoryClass="App\Repository\ConfigRepository")
*/
class Config
{ /**
* @ORM\Id
* @ORM\Column(type="string")
*/
protected $id;
/**
* @ORM\Column(type="string", length=250)
*/
protected $title;
/**
* @ORM\Column(type="text")
*/
protected $value;
/**
* @ORM\Column(name="roworder", type="string")
*/
protected $order;
/**
* @ORM\Column(type="boolean")
*/
protected $visible;
/**
* @ORM\Column(type="boolean")
*/
protected $changeable;
/**
* @ORM\Column(type="boolean")
*/
protected $required;
/**
* @ORM\Column(type="string")
*/
protected $type;
/**
* @ORM\Column(type="string")
*/
protected $grouped;
/**
* @ORM\Column(type="string")
*/
protected $category;
/**
* @ORM\Column(type="text")
*/
protected $help;
public function getId(): ?string
{
return $this->id;
}
public function setId(string $id): self
{
$this->id = $id;
return $this;
}
public function getValue(): ?string
{
return $this->value;
}
public function setValue(string $value): self
{
$this->value = $value;
return $this;
}
public function getOrder(): ?string
{
return $this->order;
}
public function setOrder(string $order): self
{
$this->order = $order;
return $this;
}
public function getVisible(): ?bool
{
return $this->visible;
}
public function setVisible(bool $visible): self
{
$this->visible = $visible;
return $this;
}
public function getChangeable(): ?bool
{
return $this->changeable;
}
public function setChangeable(bool $changeable): self
{
$this->changeable = $changeable;
return $this;
}
public function getRequired(): ?bool
{
return $this->required;
}
public function setRequired(bool $required): self
{
$this->required = $required;
return $this;
}
public function getType(): ?string
{
return $this->type;
}
public function setType(string $type): self
{
$this->type = $type;
return $this;
}
public function getGrouped(): ?string
{
return $this->grouped;
}
public function setGrouped(string $grouped): self
{
$this->grouped = $grouped;
return $this;
}
public function getCategory(): ?string
{
return $this->category;
}
public function setCategory(string $category): self
{
$this->category = $category;
return $this;
}
public function getHelp(): ?string
{
return $this->help;
}
public function setHelp(string $help): self
{
$this->help = $help;
return $this;
}
public function getTitle(): ?string
{
return $this->title;
}
public function setTitle(string $title): self
{
$this->title = $title;
return $this;
}
}

165
src/ninesurvey-1.0/src/Form/ConfigType.php

@ -0,0 +1,165 @@
<?php
namespace App\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use FOS\CKEditorBundle\Form\Type\CKEditorType;
class ConfigType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('submit',
SubmitType::class,
array("label" => "Valider",
"attr" => array("class" => "btn btn-success")));
$builder->add('id',
TextType::class,
array("label" =>"Clé",
"label_attr" => array("style" => 'margin-top:15px;'),
"attr" => array("class" => "form-control"),
'disabled' => true));
switch($options["type"]) {
case "string":
$builder->add('value',
TextType::class,
array("label" => "Valeur",
"label_attr" => array("style" => 'margin-top:15px;'),
"attr" => array("class" => "form-control"),
'required' => ($options["required"]==0?false:true)));
break;
case "boolean":
$choices=["oui" => "1","non" => "0"];
$builder->add("value", ChoiceType::class,
array("label" =>"Valeur",
"label_attr" => array("style" => 'margin-top:15px;'),
"attr" => array("class" => "form-control"),
'required' => ($options["required"]==0?false:true),
"choices" => $choices));
break;
case "integer":
$builder->add("value",
IntegerType::class, [
"label" =>"Valeur",
"label_attr" => array("style" => 'margin-top:15px;'),
"attr" => array("class" => "form-control","min" => "0"),
"required" => ($options["required"]==0?false:true),
]
);
break;
case "pourcentage":
$builder->add("value",
IntegerType::class, [
"label" =>"Valeur",
"label_attr" => array("style" => 'margin-top:15px;'),
"attr" => array("class" => "form-control","min" => "0", "max"=>"100"),
"required" => ($options["required"]==0?false:true),
]
);
break;
case "font":
$choices=[
"ABeeZee-Regular" => "ABeeZee-Regular",
"Acme-Regular" => "Acme-Regular",
"AlfaSlabOne-Regular" => "AlfaSlabOne-Regular",
"Anton-Regular" => "Anton-Regular",
"Baloo-Regular" => "Baloo-Regular",
"CarterOne-Regular" => "CarterOne-Regular",
"Chewy-Regular" => "Chewy-Regular",
"Courgette-Regular" => "Courgette-Regular",
"FredokaOne-Regular" => "FredokaOne-Regular",
"Grandstander" => "Grandstander",
"Helvetica" => "Helvetica",
"Justanotherhand-Regular" => "Justanotherhand-Regular",
"Lato-Regular" => "Lato-Regular",
"LexendDeca-Regular" => "LexendDeca-Regular",
"LuckiestGuy-Regular" => "LuckiestGuy-Regular",
"Overpass-Black" => "Overpass-Black",
"PassionOne" => "PassionOne",
"Peacesans" => "Peacesans",
"Redressed" => "Redressed",
"Righteous-Regular" => "Righteous-Regular",
"Roboto-Regular" => "Roboto-Regular",
"RubikMonoOne-Regular" => "RubikMonoOne-Regular",
"SigmarOne-Regular" => "SigmarOne-Regular",
"Signika-Regular" => "Signika-Regular",
"Teko-Bold" => "Teko-Bold",
"Viga-Regular" => "Viga-Regular",
];
$builder->add("value", ChoiceType::class,
array("label" =>"Valeur",
"label_attr" => array("style" => 'margin-top:15px;'),
"attr" => array("class" => "form-control"),
'required' => ($options["required"]==0?false:true),
"choices" => $choices));
break;
case "editor":
$builder->add('value',
CKEditorType::class,[
"required" => ($options["required"]==0?false:true),
"config" => [
'uiColor' => '#ffffff',
'height' => 600,
'filebrowserUploadRoute' => 'app_ckeditor_upload',
'language' => 'fr',
]
]
);
break;
case "logo":
$builder->add('value',HiddenType::class);
break;
case "hero":
$builder->add('value',HiddenType::class);
break;
case "image":
$builder->add('value',HiddenType::class);
break;
case "color":
$builder->add('value',
TextType::class,
array("label" => "Valeur",
"label_attr" => array("style" => 'margin-top:15px;'),
"attr" => array("class" => "pick-a-color form-control"),
'required' => ($options["required"]==0?false:true)));
break;
}
$builder->add('help',
TextareaType::class,
array("label" =>"Aide",
"attr" => array("class" => "form-control", "style" => "margin-top:15px; height: 200px;"),
'required' => false,
'disabled' => true));
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'App\Entity\Config',
'mode' => "string",
'id' => "string",
'type' => "string",
'required' => "string",
));
}
}

26
src/ninesurvey-1.0/src/Form/UserType.php

@ -37,7 +37,7 @@ class UserType extends AbstractType
$builder->add('username',
TextType::class, [
"label" =>"Login",
"disabled" => true,
"disabled" => ($options["appMasteridentity"]!="SQL"||$options["mode"]!="submit"),
"attr" => ["autocomplete" => "off"],
]
);
@ -82,7 +82,7 @@ class UserType extends AbstractType
$builder->add('lastname',
TextType::class, [
"label" =>"Nom",
"disabled" => true,
"disabled" => ($options["appMasteridentity"]!="SQL"),
]
);
@ -90,13 +90,13 @@ class UserType extends AbstractType
TextType::class, [
"label" =>"Prénom",
"required" => false,
"disabled" => true, ]
"disabled" => ($options["appMasteridentity"]!="SQL"), ]
);
$builder->add('email',
EmailType::class, [
"label" =>"Email",
"disabled" => true,
"disabled" => ($options["appMasteridentity"]!="SQL"),
]
);
@ -107,14 +107,26 @@ class UserType extends AbstractType
]
);
if($options["appMasteridentity"]=="SQL") {
$builder->add('password',
RepeatedType::class, [
"type" => PasswordType::class,
"required" => ($options["mode"]=="submit"?true:false),
"options" => array("always_empty" => true),
"first_options" => array("label" => "Mot de Passe","attr" => array("class" => "form-control", "style" => "margin-bottom:15px", "autocomplete" => "new-password")),
"second_options" => array('label' => 'Confirmer Mot de Passe',"attr" => array("class" => "form-control", "style" => "margin-bottom:15px"))
]
);
}
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'App\Entity\User',
'mode' => 'string',
'appAuth' => 'string',
'data_class' => 'App\Entity\User',
'mode' => 'string',
'appAuth' => 'string',
'appMasteridentity' => 'string',
));
}
}

15
src/ninesurvey-1.0/src/Repository/ConfigRepository.php

@ -0,0 +1,15 @@
<?php
namespace App\Repository;
use App\Entity\Config;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Persistence\ManagerRegistry;
class ConfigRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Config::class);
}
}

73
src/ninesurvey-1.0/src/Service/sessionInit.php

@ -0,0 +1,73 @@
<?php
namespace App\Service;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpFoundation\Session\Session;
use Doctrine\ORM\EntityManager;
class sessionInit {
private $container;
protected $em;
protected $session;
public function __construct(ContainerInterface $container, EntityManager $em,Session $session)
{
$this->container = $container;
$this->session = $session;
$this->em = $em;
}
public function onDomainParse(RequestEvent $event) {
$configs = $this->em->getRepository("App:Config")->findAll();
foreach($configs as $config) {
$this->session->set($config->getId(), strval($config->getValue()));
}
// Valeur par défaut appname
if($this->session->get("appname")=="")
$this->session->set("appname", $this->container->getParameter('appName'));
// Valeur par defaut colorbgbodydark = #343a40
if($this->session->get("colorbgbodydark")=="")
$this->session->set("colorbgbodydark", '#343a40');
// Valeur par defaut colorbgbodydark = #ffffff
if($this->session->get("colorbgbodylight")=="")
$this->session->set("colorbgbodylight", '#ffffff');
// Valeur par defaut colorfttitledark = #ffffff
if($this->session->get("colorfttitledark")=="")
$this->session->set("colorfttitledark", '#ffffff');
// Valeur par defaut colorfttitlelight = #343a40
if($this->session->get("colorfttitlelight")=="")
$this->session->set("colorfttitlelight", '#343a40');
// Valeur par defaut colorftbodydark = #ffffff
if($this->session->get("colorftbodydark")=="")
$this->session->set("colorftbodydark", '#ffffff');
// Valeur par defaut colorftbodylight = #343a40
if($this->session->get("colorftbodylight")=="")
$this->session->set("colorftbodylight", '#343a40');
// Valeur par defaut fonttitle = FredokaOne-Regular
if($this->session->get("fonttitle")=="")
$this->session->set("fonttitle", 'FredokaOne-Regular');
// Valeur par defaut fontbody = Roboto-Regular
if($this->session->get("fontbody")=="")
$this->session->set("fontbody", 'Roboto-Regular');
// Valeur par defaut logo
if($this->session->get("logodark")==""&&$this->session->get("logolight")=="") {
$this->session->set("logodark", "logo.png");
$this->session->set("logolight", "logo.png");
}
elseif($this->session->get("logodark")=="")
$this->session->set("logodark", $this->session->get("logolight"));
elseif($this->session->get("logolight")=="")
$this->session->set("logolight", $this->session->get("logodark"));
}
}

131
src/ninesurvey-1.0/src/Service/uploadListener.php

@ -88,139 +88,12 @@ class uploadListener
$type=$event->getType();
switch($type) {
case "avatar":
default:
$file=$event->getFile();
$filename=$file->getFilename();
$this->session->set('uploadavatar', $filename);
break;
case "document":
// Récupérer la requete
$request = $event->getRequest();
$nameentity = $request->get('nameentity');
$identity = $request->get('identity');
$directory=$nameentity."/".$identity;
// Recherche de l'entité lié
switch($nameentity) {
case "activity":
$entity=$this->em->getRepository("App:Activity")->find($identity);
break;
case "corrected":
$entity=$this->em->getRepository("App:Activity")->find($identity);
break;
case "answer":
$entity=$this->em->getRepository("App:Answer")->find($identity);
break;
case "answercorrected":
$entity=$this->em->getRepository("App:Answer")->find($identity);
break;
}
// Uniquement si lié à une entité
if(!$entity)
return false;
// Information sur le fichier téléchargé
$file=$event->getFile();
$filename=$file->getFilename();
$pathname=$file->getPath();
$minetype=$file->GetMimeType();
$extention=strtolower($file->GetExtension());
// Déplacer le fichier dans la cible
$fs = new Filesystem();
$fgexit=$fs->exists($pathname."/".$directory."/".$filename);
$file->move($pathname."/".$directory, $filename);
$havethumb=false;
// Création d'un thumb dans le cas d'un fichier de type image
if (in_array(strtolower($file->GetExtension()), array('jpg', 'jpeg', 'jpe', 'png', 'gif', 'bmp'))) {
$fs = new Filesystem();
$fs->copy($pathname."/".$directory."/".$filename,$pathname."/".$directory."/thumb/".$filename);
$max_width=350;
$width = $this->getWidth($pathname."/".$directory."/thumb/".$filename);
$height = $this->getHeight($pathname."/".$directory."/thumb/".$filename);
$scale = $max_width/$width;
$this->resizeImage($pathname."/".$directory."/thumb/".$filename,$width,$height,$scale);
$havethumb=true;
}
// Création d'un thumb dans le cas d'un fichier de type pdf