Sondage 1.2
Le module sondage permet d'interroger des membres ou des utilisateurs et d'afficher réponses des autres membres ce que le module formulaire ne permet pas.
This commit is contained in:
parent
d695123b57
commit
9957d86037
1
sondage/enum.json
Normal file
1
sondage/enum.json
Normal file
@ -0,0 +1 @@
|
||||
{"name":"sondage","realName":"Sondage","version":"1.2","update":"0.0","delete":true,"dataDirectory":""}
|
426
sondage/sondage.php
Normal file
426
sondage/sondage.php
Normal file
@ -0,0 +1,426 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file is part of Zwii.
|
||||
*
|
||||
* For full copyright and license information, please see the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*
|
||||
* @author Rémi Jean <remi.jean@outlook.com>
|
||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
|
||||
* @license GNU General Public License, version 3
|
||||
* @link http://zwiicms.com/
|
||||
*/
|
||||
|
||||
|
||||
class sondage extends common {
|
||||
|
||||
const VERSION = '1.2';
|
||||
const REALNAME = 'Sondage';
|
||||
const DELETE = true;
|
||||
const UPDATE = '0.0';
|
||||
const DATADIRECTORY = ''; // Contenu localisé inclus par défaut (page.json et module.json)
|
||||
|
||||
public static $actions = [
|
||||
'config' => self::GROUP_MODERATOR,
|
||||
'data' => self::GROUP_MODERATOR,
|
||||
'result' => self::GROUP_VISITOR,
|
||||
'delete' => self::GROUP_MODERATOR,
|
||||
'deleteall' => self::GROUP_MODERATOR,
|
||||
'index' => self::GROUP_VISITOR,
|
||||
'export2csv' => self::GROUP_MODERATOR,
|
||||
'output2csv' => self::GROUP_MODERATOR
|
||||
];
|
||||
|
||||
public static $data = [];
|
||||
|
||||
public static $pages = [];
|
||||
|
||||
public static $pagination;
|
||||
|
||||
const TYPE_MAIL = 'mail';
|
||||
const TYPE_SELECT = 'select';
|
||||
const TYPE_TEXT = 'text';
|
||||
const TYPE_TEXTAREA = 'textarea';
|
||||
const TYPE_DATETIME = "date";
|
||||
const TYPE_CHECKBOX = "checkbox";
|
||||
|
||||
|
||||
public static $types = [
|
||||
self::TYPE_TEXT => 'Champ texte',
|
||||
self::TYPE_TEXTAREA => 'Grand champ texte',
|
||||
self::TYPE_MAIL => 'Champ mail',
|
||||
self::TYPE_SELECT => 'Sélection',
|
||||
self::TYPE_DATETIME => 'Date',
|
||||
self::TYPE_CHECKBOX => 'Case à cocher'
|
||||
];
|
||||
// Nombre d'objets par page
|
||||
public static $itemsList = [
|
||||
6 => '6 réponses',
|
||||
9 => '9 réponses',
|
||||
18 => '18 réponses'
|
||||
];
|
||||
|
||||
public static $listUsers = [
|
||||
];
|
||||
|
||||
/**
|
||||
* Configuration
|
||||
*/
|
||||
public function config() {
|
||||
// Liste des utilisateurs
|
||||
$userIdsFirstnames = helper::arraycollumn($this->getData(['user']), 'firstname');
|
||||
ksort($userIdsFirstnames);
|
||||
self::$listUsers [] = '';
|
||||
foreach($userIdsFirstnames as $userId => $userFirstname) {
|
||||
self::$listUsers [] = $userId;
|
||||
}
|
||||
// Soumission du formulaire
|
||||
if($this->isPost()) {
|
||||
// Configuration
|
||||
// Option sélectionnée sans page choisie
|
||||
$this->setData([
|
||||
'module',
|
||||
$this->getUrl(0),
|
||||
'config',
|
||||
[
|
||||
'button' => $this->getInput('formConfigButton'),
|
||||
'capcha' => $this->getInput('formConfigCapcha', helper::FILTER_BOOLEAN),
|
||||
'group' => $this->getInput('formConfigGroup', helper::FILTER_INT),
|
||||
'user' => self::$listUsers [$this->getInput('formConfigUser', helper::FILTER_INT)],
|
||||
'mail' => $this->getInput('formConfigMail') ,
|
||||
'pageId' => $this->getInput('formConfigPageIdToggle', helper::FILTER_BOOLEAN) === true ? $this->getInput('formConfigPageId', helper::FILTER_ID) : '',
|
||||
'subject' => $this->getInput('formConfigSubject'),
|
||||
'itemsperPage' => $this->getInput('formConfigItemsperPage', helper::FILTER_INT)
|
||||
]
|
||||
]);
|
||||
// Génération des données vides
|
||||
$this->setData(['module', $this->getUrl(0), 'data', []]);
|
||||
// Génération des champs
|
||||
$inputs = [];
|
||||
foreach($this->getInput('formConfigPosition', null) as $index => $position) {
|
||||
$inputs[] = [
|
||||
'name' => $this->getInput('formConfigName[' . $index . ']'),
|
||||
'position' => helper::filter($position, helper::FILTER_INT),
|
||||
'required' => $this->getInput('formConfigRequired[' . $index . ']', helper::FILTER_BOOLEAN),
|
||||
'type' => $this->getInput('formConfigType[' . $index . ']'),
|
||||
'values' => $this->getInput('formConfigValues[' . $index . ']')
|
||||
];
|
||||
}
|
||||
$this->setData(['module', $this->getUrl(0), 'input', $inputs]);
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'notification' => 'Modifications enregistrées',
|
||||
'redirect' => helper::baseUrl() . $this->getUrl(),
|
||||
'state' => true
|
||||
]);
|
||||
}
|
||||
// Liste des pages
|
||||
foreach($this->getHierarchy(null, false) as $parentPageId => $childrenPageIds) {
|
||||
self::$pages[$parentPageId] = $this->getData(['page', $parentPageId, 'title']);
|
||||
foreach($childrenPageIds as $childKey) {
|
||||
self::$pages[$childKey] = ' ' . $this->getData(['page', $childKey, 'title']);
|
||||
}
|
||||
}
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => 'Configuration du module',
|
||||
'vendor' => [
|
||||
'html-sortable',
|
||||
'flatpickr'
|
||||
],
|
||||
'view' => 'config'
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Données enregistrées
|
||||
*/
|
||||
public function data() {
|
||||
$data = $this->getData(['module', $this->getUrl(0), 'data']);
|
||||
if(is_array($data)) {
|
||||
// Pagination
|
||||
$pagination = helper::pagination($data, $this->getUrl(),$this->getData(['module', $this->getUrl(0),'config', 'itemsperPage']));
|
||||
// Liste des pages
|
||||
self::$pagination = $pagination['pages'];
|
||||
// Inverse l'ordre du tableau
|
||||
$dataIds = array_reverse(array_keys($data));
|
||||
$data = array_reverse($data);
|
||||
// Données en fonction de la pagination
|
||||
for($i = $pagination['first']; $i < $pagination['last']; $i++) {
|
||||
$content = '';
|
||||
foreach($data[$i] as $input => $value) {
|
||||
$content .= $input . ' : ' . $value . '<br>';
|
||||
}
|
||||
self::$data[] = [
|
||||
$content,
|
||||
template::button('formDataDelete' . $dataIds[$i], [
|
||||
'class' => 'formDataDelete red',
|
||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $dataIds[$i] . '/' . $_SESSION['csrf'],
|
||||
'value' => template::ico('cancel')
|
||||
])
|
||||
];
|
||||
}
|
||||
}
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => 'Données enregistrées',
|
||||
'view' => 'data'
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Réponses enregistrées
|
||||
*/
|
||||
public function result() {
|
||||
$data = $this->getData(['module', $this->getUrl(0), 'data']);
|
||||
if($data) {
|
||||
// Pagination
|
||||
$pagination = helper::pagination($data, $this->getUrl(),$this->getData(['module', $this->getUrl(0),'config', 'itemsperPage']));
|
||||
// Liste des pages
|
||||
self::$pagination = $pagination['pages'];
|
||||
// Inverse l'ordre du tableau
|
||||
$dataIds = array_reverse(array_keys($data));
|
||||
$data = array_reverse($data);
|
||||
// Données en fonction de la pagination
|
||||
for($i = $pagination['first']; $i < $pagination['last']; $i++) {
|
||||
$content = '';
|
||||
foreach($data[$i] as $input => $value) {
|
||||
$content .= $input . ' : ' . $value . '<br>';
|
||||
}
|
||||
self::$data[] = [
|
||||
$content
|
||||
];
|
||||
}
|
||||
}
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => 'Réponses',
|
||||
'view' => 'result'
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Export CSV
|
||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
|
||||
*/
|
||||
public function export2csv() {
|
||||
// Jeton incorrect
|
||||
if ($this->getUrl(2) !== $_SESSION['csrf']) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data',
|
||||
'notification' => 'Action interdite'
|
||||
]);
|
||||
} else {
|
||||
$data = $this->getData(['module', $this->getUrl(0), 'data']);
|
||||
if ($data !== []) {
|
||||
$csvfilename = 'data-'.date('dmY').'-'.date('hm').'-'.rand(10,99).'.csv';
|
||||
if (!file_exists(self::FILE_DIR.'source/data')) {
|
||||
mkdir(self::FILE_DIR.'source/data', 0755);
|
||||
}
|
||||
$fp = fopen(self::FILE_DIR.'source/data/'.$csvfilename, 'w');
|
||||
fputcsv($fp, array_keys($data[1]), ';','"');
|
||||
foreach ($data as $fields) {
|
||||
fputcsv($fp, $fields, ';','"');
|
||||
}
|
||||
fclose($fp);
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'notification' => 'Export CSV effectué dans le gestionnaire de fichiers<br />sous le nom '.$csvfilename,
|
||||
'redirect' => helper::baseUrl() . $this->getUrl(0) .'/data',
|
||||
'state' => true
|
||||
]);
|
||||
} else {
|
||||
$this->addOutput([
|
||||
'notification' => 'Aucune donnée à exporter',
|
||||
'redirect' => helper::baseUrl() . $this->getUrl(0) .'/data'
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Suppression
|
||||
*/
|
||||
public function deleteall() {
|
||||
// Jeton incorrect
|
||||
if ($this->getUrl(2) !== $_SESSION['csrf']) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data',
|
||||
'notification' => 'Action interdite'
|
||||
]);
|
||||
} else {
|
||||
$data = ($this->getData(['module', $this->getUrl(0), 'data']));
|
||||
if (count($data) > 0 ) {
|
||||
// Suppression multiple
|
||||
for ($i = 1; $i <= count($data) ; $i++) {
|
||||
echo $this->deleteData(['module', $this->getUrl(0), 'data', $i]);
|
||||
}
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data',
|
||||
'notification' => 'Données supprimées',
|
||||
'state' => true
|
||||
]);
|
||||
} else {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data',
|
||||
'notification' => 'Aucune donnée à supprimer'
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Suppression
|
||||
*/
|
||||
public function delete() {
|
||||
// Jeton incorrect
|
||||
if ($this->getUrl(3) !== $_SESSION['csrf']) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data',
|
||||
'notification' => 'Action interdite'
|
||||
]);
|
||||
} else {
|
||||
// La donnée n'existe pas
|
||||
if($this->getData(['module', $this->getUrl(0), 'data', $this->getUrl(2)]) === null) {
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'access' => false
|
||||
]);
|
||||
}
|
||||
// Suppression
|
||||
else {
|
||||
$this->deleteData(['module', $this->getUrl(0), 'data', $this->getUrl(2)]);
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data',
|
||||
'notification' => 'Donnée supprimée',
|
||||
'state' => true
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Accueil
|
||||
*/
|
||||
public function index() {
|
||||
// Soumission du formulaire
|
||||
if($this->isPost()) {
|
||||
// Check la capcha
|
||||
if(
|
||||
$this->getData(['module', $this->getUrl(0), 'config', 'capcha'])
|
||||
AND $this->getInput('formCapcha', helper::FILTER_INT) !== $this->getInput('formCapchaFirstNumber', helper::FILTER_INT) + $this->getInput('formCapchaSecondNumber', helper::FILTER_INT))
|
||||
{
|
||||
self::$inputNotices['formCapcha'] = 'Incorrect';
|
||||
|
||||
}
|
||||
// Préparation le contenu du mail
|
||||
$data = [];
|
||||
$content = '';
|
||||
foreach($this->getData(['module', $this->getUrl(0), 'input']) as $index => $input) {
|
||||
// Filtre la valeur
|
||||
switch($input['type']) {
|
||||
case self::TYPE_MAIL:
|
||||
$filter = helper::FILTER_MAIL;
|
||||
break;
|
||||
case self::TYPE_TEXTAREA:
|
||||
$filter = helper::FILTER_STRING_LONG;
|
||||
break;
|
||||
case self::TYPE_DATETIME:
|
||||
$filter = helper::FILTER_STRING_SHORT; // Mettre TYPE_DATETIME pour récupérer un TIMESTAMP
|
||||
break;
|
||||
CASE self::TYPE_CHECKBOX:
|
||||
$filter = helper::FILTER_BOOLEAN;
|
||||
break;
|
||||
default:
|
||||
$filter = helper::FILTER_STRING_SHORT;
|
||||
}
|
||||
$value = $this->getInput('formInput[' . $index . ']', $filter, $input['required']);
|
||||
// Préparation des données pour la création dans la base
|
||||
$data[$this->getData(['module', $this->getUrl(0), 'input', $index, 'name'])] = $value;
|
||||
// Préparation des données pour le mail
|
||||
$content .= '<strong>' . $this->getData(['module', $this->getUrl(0), 'input', $index, 'name']) . ' :</strong> ' . $value . '<br>';
|
||||
}
|
||||
// Crée les données
|
||||
$this->setData(['module', $this->getUrl(0), 'data', helper::increment(1, $this->getData(['module', $this->getUrl(0), 'data'])), $data]);
|
||||
// Envoi du mail
|
||||
// Rechercher l'adresse en fonction du mail
|
||||
$sent = true;
|
||||
$singleuser = $this->getData(['user',
|
||||
$this->getData(['module', $this->getUrl(0), 'config', 'user']),
|
||||
'mail']);
|
||||
$singlemail = $this->getData(['module', $this->getUrl(0), 'config', 'mail']);
|
||||
$group = $this->getData(['module', $this->getUrl(0), 'config', 'group']);
|
||||
// Verification si le mail peut être envoyé
|
||||
if(
|
||||
self::$inputNotices === [] && (
|
||||
$group > 0 ||
|
||||
$singleuser !== '' ||
|
||||
$singlemail !== '' )
|
||||
) {
|
||||
// Utilisateurs dans le groupe
|
||||
$to = [];
|
||||
if ($group > 0){
|
||||
foreach($this->getData(['user']) as $userId => $user) {
|
||||
if($user['group'] >= $group) {
|
||||
$to[] = $user['mail'];
|
||||
}
|
||||
}
|
||||
}
|
||||
// Utilisateur désigné
|
||||
if (!empty($singleuser)) {
|
||||
$to[] = $singleuser;
|
||||
}
|
||||
// Mail désigné
|
||||
if (!empty($singlemail)) {
|
||||
$to[] = $singlemail;
|
||||
}
|
||||
if($to) {
|
||||
// Sujet du mail
|
||||
$subject = $this->getData(['module', $this->getUrl(0), 'config', 'subject']);
|
||||
if($subject === '') {
|
||||
$subject = 'Nouveau message en provenance de votre site';
|
||||
}
|
||||
// Envoi le mail
|
||||
$sent = $this->sendMail(
|
||||
$to,
|
||||
$subject,
|
||||
'Nouveau message en provenance de la page "' . $this->getData(['page', $this->getUrl(0), 'title']) . '" :<br><br>' .
|
||||
$content
|
||||
);
|
||||
}
|
||||
}
|
||||
// Redirection
|
||||
$redirect = $this->getData(['module', $this->getUrl(0), 'config', 'pageId']);
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'notification' => ($sent === true ? 'Formulaire soumis' : $sent),
|
||||
'redirect' => $redirect ? helper::baseUrl() . $redirect : '',
|
||||
'state' => ($sent === true ? true : null)
|
||||
]);
|
||||
}
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'showBarEditButton' => true,
|
||||
'showPageContent' => true,
|
||||
'view' => 'index',
|
||||
'vendor' => [
|
||||
'flatpickr'
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
1
sondage/vendor/html-sortable/html-sortable.min.js
vendored
Normal file
1
sondage/vendor/html-sortable/html-sortable.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
3
sondage/vendor/html-sortable/inc.json
vendored
Normal file
3
sondage/vendor/html-sortable/inc.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
[
|
||||
"html-sortable.min.js"
|
||||
]
|
23
sondage/view/config/config.css
Normal file
23
sondage/view/config/config.css
Normal file
@ -0,0 +1,23 @@
|
||||
/**
|
||||
* This file is part of Zwii.
|
||||
*
|
||||
* For full copyright and license information, please see the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*
|
||||
* @author Rémi Jean <remi.jean@outlook.com>
|
||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
|
||||
* @license GNU General Public License, version 3
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
|
||||
|
||||
/** NE PAS EFFACER
|
||||
* admin.css
|
||||
*/
|
||||
|
||||
|
||||
.formConfigInput {
|
||||
background: #FFF;
|
||||
}
|
163
sondage/view/config/config.js.php
Normal file
163
sondage/view/config/config.js.php
Normal file
@ -0,0 +1,163 @@
|
||||
/**
|
||||
* This file is part of Zwii.
|
||||
*
|
||||
* For full copyright and license information, please see the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*
|
||||
* @author Rémi Jean <remi.jean@outlook.com>
|
||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||
* @license GNU General Public License, version 3
|
||||
* @link http://zwiicms.com/
|
||||
*/
|
||||
|
||||
/**
|
||||
* Ajout d'un champ
|
||||
*/
|
||||
function add(inputUid, input) {
|
||||
// Nouveau champ
|
||||
var newInput = $($("#formConfigCopy").html());
|
||||
// Ajout de l'ID unique aux champs
|
||||
newInput.find("a, input, select").each(function() {
|
||||
var _this = $(this);
|
||||
_this.attr({
|
||||
id: _this.attr("id").replace("[]", "[" + inputUid + "]"),
|
||||
name: _this.attr("name").replace("[]", "[" + inputUid + "]")
|
||||
});
|
||||
});
|
||||
newInput.find("label").each(function() {
|
||||
var _this = $(this);
|
||||
_this.attr("for", _this.attr("for").replace("[]", "[" + inputUid + "]"));
|
||||
});
|
||||
// Attribue les bonnes valeurs
|
||||
if(input) {
|
||||
// Nom du champ
|
||||
newInput.find("[name='formConfigName[" + inputUid + "]']").val(input.name);
|
||||
// Type de champ
|
||||
newInput.find("[name='formConfigType[" + inputUid + "]']").val(input.type);
|
||||
// Largeur du champ
|
||||
newInput.find("[name='formConfigWidth[" + inputUid + "]']").val(input.width);
|
||||
// Valeurs du champ
|
||||
newInput.find("[name='formConfigValues[" + inputUid + "]']").val(input.values);
|
||||
// Champ obligatoire
|
||||
newInput.find("[name='formConfigRequired[" + inputUid + "]']").prop("checked", input.required);
|
||||
}
|
||||
// Ajout du nouveau champ au DOM
|
||||
$("#formConfigInputs")
|
||||
.append(newInput.hide())
|
||||
.find(".formConfigInput").last().show();
|
||||
// Cache le texte d'absence de champ
|
||||
$("#formConfigNoInput:visible").hide();
|
||||
// Check le type
|
||||
$(".formConfigType").trigger("change");
|
||||
// Actualise les positions
|
||||
position();
|
||||
}
|
||||
|
||||
/**
|
||||
* Calcul des positions
|
||||
*/
|
||||
function position() {
|
||||
$("#formConfigInputs").find(".formConfigPosition").each(function(i) {
|
||||
$(this).val(i + 1);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajout des champs déjà existant
|
||||
*/
|
||||
var inputUid = 0;
|
||||
var inputs = <?php echo json_encode($this->getData(['module', $this->getUrl(0), 'input'])); ?>;
|
||||
if(inputs) {
|
||||
var inputsPerPosition = <?php echo json_encode(helper::arraycollumn($this->getData(['module', $this->getUrl(0), 'input']), 'position', 'SORT_ASC')); ?>;
|
||||
$.each(inputsPerPosition, function(id) {
|
||||
add(inputUid, inputs[id]);
|
||||
inputUid++;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Afficher/cacher les options supplémentaires
|
||||
*/
|
||||
$(document).on("click", ".formConfigMoreToggle", function() {
|
||||
$(this).parents(".formConfigInput").find(".formConfigMore").slideToggle();
|
||||
});
|
||||
|
||||
/**
|
||||
* Crée un nouveau champ à partir des champs cachés
|
||||
*/
|
||||
$("#formConfigAdd").on("click", function() {
|
||||
add(inputUid);
|
||||
inputUid++;
|
||||
});
|
||||
|
||||
/**
|
||||
* Actions sur les champs
|
||||
*/
|
||||
// Tri entre les champs
|
||||
sortable("#formConfigInputs", {
|
||||
forcePlaceholderSize: true,
|
||||
containment: "#formConfigInputs",
|
||||
handle: ".formConfigMove"
|
||||
});
|
||||
$("#formConfigInputs")
|
||||
// Actualise les positions
|
||||
.on("sortupdate", function() {
|
||||
position();
|
||||
})
|
||||
// Suppression du champ
|
||||
.on("click", ".formConfigDelete", function() {
|
||||
var inputDOM = $(this).parents(".formConfigInput");
|
||||
// Cache le champ
|
||||
inputDOM.hide();
|
||||
// Supprime le champ
|
||||
inputDOM.remove();
|
||||
// Affiche le texte d'absence de champ
|
||||
if($("#formConfigInputs").find(".formConfigInput").length === 0) {
|
||||
$("#formConfigNoInput").show();
|
||||
}
|
||||
// Actualise les positions
|
||||
position();
|
||||
})
|
||||
// Affiche/cache le champ "Valeurs" en fonction des champs cachés
|
||||
.on("change", ".formConfigType", function() {
|
||||
var _this = $(this);
|
||||
if(_this.val() === "select") {
|
||||
_this.parents(".formConfigInput").find(".formConfigValuesWrapper").slideDown();
|
||||
}
|
||||
else {
|
||||
_this.parents(".formConfigInput").find(".formConfigValuesWrapper").slideUp();
|
||||
}
|
||||
});
|
||||
// Simule un changement de type au chargement de la page
|
||||
$(".formConfigType").trigger("change");
|
||||
|
||||
/**
|
||||
* Affiche/cache les options de la case à cocher du mail
|
||||
*/
|
||||
$("#formConfigMailOptionsToggle").on("change", function() {
|
||||
if($(this).is(":checked")) {
|
||||
$("#formConfigMailOptions").slideDown();
|
||||
}
|
||||
else {
|
||||
$("#formConfigMailOptions").slideUp(function() {
|
||||
$("#formConfigGroup").val("");
|
||||
$("#formConfigSubject").val("");
|
||||
$("#formConfigMail").val("");
|
||||
$("#formConfigUser").val("");
|
||||
});
|
||||
}
|
||||
}).trigger("change");
|
||||
|
||||
/**
|
||||
* Affiche/cache les options de la case à cocher de la redirection
|
||||
*/
|
||||
$("#formConfigPageIdToggle").on("change", function() {
|
||||
if($(this).is(":checked")) {
|
||||
$("#formConfigPageIdWrapper").slideDown();
|
||||
}
|
||||
else {
|
||||
$("#formConfigPageIdWrapper").slideUp(function() {
|
||||
$("#formConfigPageId").val("");
|
||||
});
|
||||
}
|
||||
}).trigger("change");
|
167
sondage/view/config/config.php
Normal file
167
sondage/view/config/config.php
Normal file
@ -0,0 +1,167 @@
|
||||
<div id="formConfigCopy" class="displayNone">
|
||||
<div class="formConfigInput">
|
||||
<?php echo template::hidden('formConfigPosition[]', [
|
||||
'class' => 'formConfigPosition'
|
||||
]); ?>
|
||||
<div class="row">
|
||||
<div class="col1">
|
||||
<?php echo template::button('formConfigMove[]', [
|
||||
'value' => template::ico('sort'),
|
||||
'class' => 'formConfigMove'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col5">
|
||||
<?php echo template::text('formConfigName[]', [
|
||||
'placeholder' => 'Intitulé'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col4">
|
||||
<?php echo template::select('formConfigType[]', $module::$types, [
|
||||
'class' => 'formConfigType'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col1">
|
||||
<?php echo template::button('formConfigMoreToggle[]', [
|
||||
'value' => template::ico('gear'),
|
||||
'class' => 'formConfigMoreToggle'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col1">
|
||||
<?php echo template::button('formConfigDelete[]', [
|
||||
'value' => template::ico('minus'),
|
||||
'class' => 'formConfigDelete'
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="formConfigMore displayNone">
|
||||
<?php echo template::text('formConfigValues[]', [
|
||||
'placeholder' => 'Liste des valeurs séparées par des virgules (valeur1,valeur2,...)',
|
||||
'class' => 'formConfigValues',
|
||||
'classWrapper' => 'displayNone formConfigValuesWrapper'
|
||||
]); ?>
|
||||
<?php echo template::checkbox('formConfigRequired[]', true, 'Champ obligatoire'); ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php echo template::formOpen('formConfigForm'); ?>
|
||||
<div class="row">
|
||||
<div class="col2">
|
||||
<?php echo template::button('formConfigBack', [
|
||||
'class' => '',
|
||||
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0),
|
||||
'ico' => 'left',
|
||||
'value' => 'Retour'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col3 offset5">
|
||||
<?php echo template::button('formConfigData', [
|
||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/data',
|
||||
'value' => 'Gérer les données'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col2">
|
||||
<?php echo template::submit('formConfigSubmit',[
|
||||
'class' => 'green'
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col12">
|
||||
<div class="block">
|
||||
<h4>Configuration</h4>
|
||||
<?php echo template::text('formConfigButton', [
|
||||
'help' => 'Laissez vide afin de conserver le texte par défaut.',
|
||||
'label' => 'Texte du bouton de soumission',
|
||||
'value' => $this->getData(['module', $this->getUrl(0), 'config', 'button'])
|
||||
]); ?>
|
||||
<?php echo template::checkbox('formConfigMailOptionsToggle', true, 'Envoyer par mail les données saisies :', [
|
||||
'checked' => (bool) $this->getData(['module', $this->getUrl(0), 'config', 'group']) ||
|
||||
!empty($this->getData(['module', $this->getUrl(0), 'config', 'user'])) ||
|
||||
!empty($this->getData(['module', $this->getUrl(0), 'config', 'mail'])),
|
||||
'help' => 'Sélectionnez au moins un groupe, un utilisateur ou saississez un email.'
|
||||
]); ?>
|
||||
<div id="formConfigMailOptions" class="displayNone">
|
||||
<div class="row">
|
||||
<div class="col11 offset1">
|
||||
<?php echo template::text('formConfigSubject', [
|
||||
'help' => 'Laissez vide afin de conserver le texte par défaut.',
|
||||
'label' => 'Sujet du mail',
|
||||
'value' => $this->getData(['module', $this->getUrl(0), 'config', 'subject'])
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
// Element 0 quand aucun membre a été sélectionné
|
||||
$groupMembers = [''] + $module::$groupNews;
|
||||
?>
|
||||
Destinataires :
|
||||
<div class="row">
|
||||
<div class="col6 offset1">
|
||||
<?php echo template::select('formConfigGroup', $groupMembers, [
|
||||
'label' => 'Les groupes hiérarchiques à partir du groupe :',
|
||||
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'group']),
|
||||
'help' => 'Editeurs = éditeurs + administrateurs<br/> Membres = membres + éditeurs + administrateurs'
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col6 offset1">
|
||||
<?php echo template::select('formConfigUser', $module::$listUsers, [
|
||||
'label' => 'Un membre :',
|
||||
'selected' => array_search($this->getData(['module', $this->getUrl(0), 'config', 'user']),$module::$listUsers)
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col6 offset1">
|
||||
<?php echo template::text('formConfigMail', [
|
||||
'label' => 'Une adresse email ou une liste de diffusion:',
|
||||
'value' => $this->getData(['module', $this->getUrl(0), 'config', 'mail'])
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php echo template::checkbox('formConfigPageIdToggle', true, 'Redirection après soumission du formulaire', [
|
||||
'checked' => (bool) $this->getData(['module', $this->getUrl(0), 'config', 'pageId'])
|
||||
]); ?>
|
||||
<div class="col6 offset1">
|
||||
<?php echo template::select('formConfigPageId', $module::$pages, [
|
||||
'classWrapper' => 'displayNone',
|
||||
'label' => 'Sélectionner une page du site :',
|
||||
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'pageId'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col6">
|
||||
<?php echo template::checkbox('formConfigCapcha', true, 'Capcha à remplir pour soumettre le formulaire', [
|
||||
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'capcha'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col6">
|
||||
<?php echo template::select('formConfigItemsperPage', $module::$itemsList, [
|
||||
'label' => 'Pagination des réponses',
|
||||
'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperPage'])
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="block">
|
||||
<h4>Liste des champs</h4>
|
||||
<div id="formConfigNoInput">
|
||||
<?php echo template::speech('Le formulaire ne contient aucun champ.'); ?>
|
||||
</div>
|
||||
<div id="formConfigInputs"></div>
|
||||
<div class="row">
|
||||
<div class="col1 offset11">
|
||||
<?php echo template::button('formConfigAdd', [
|
||||
'value' => template::ico('plus')
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php echo template::formClose(); ?>
|
||||
<div class="moduleVersion">Module version n°
|
||||
<?php echo $module::VERSION; ?>
|
||||
</div>
|
18
sondage/view/data/data.css
Normal file
18
sondage/view/data/data.css
Normal file
@ -0,0 +1,18 @@
|
||||
/**
|
||||
* This file is part of Zwii.
|
||||
*
|
||||
* For full copyright and license information, please see the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*
|
||||
* @author Rémi Jean <remi.jean@outlook.com>
|
||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
|
||||
* @license GNU General Public License, version 3
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
|
||||
|
||||
/** NE PAS EFFACER
|
||||
* admin.css
|
||||
*/
|
31
sondage/view/data/data.js.php
Normal file
31
sondage/view/data/data.js.php
Normal file
@ -0,0 +1,31 @@
|
||||
/**
|
||||
* This file is part of Zwii.
|
||||
*
|
||||
* For full copyright and license information, please see the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*
|
||||
* @author Rémi Jean <remi.jean@outlook.com>
|
||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||
* @license GNU General Public License, version 3
|
||||
* @link http://zwiicms.com/
|
||||
*/
|
||||
|
||||
/**
|
||||
* Confirmation de suppression
|
||||
*/
|
||||
$(".formDataDelete").on("click", function() {
|
||||
var _this = $(this);
|
||||
return core.confirm("Êtes-vous sûr de vouloir supprimer cette donnée ?", function() {
|
||||
$(location).attr("href", _this.attr("href"));
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* Confirmation de suppression de toutes les donénes
|
||||
*/
|
||||
$(".formDataDeleteAll").on("click", function() {
|
||||
var _this = $(this);
|
||||
return core.confirm("Êtes-vous sûr de vouloir supprimer toutes les données ?", function() {
|
||||
$(location).attr("href", _this.attr("href"));
|
||||
});
|
||||
});
|
35
sondage/view/data/data.php
Normal file
35
sondage/view/data/data.php
Normal file
@ -0,0 +1,35 @@
|
||||
<div class="row">
|
||||
<div class="col2">
|
||||
<?php echo template::button('formDataBack', [
|
||||
'class' => '',
|
||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/config',
|
||||
'ico' => 'left',
|
||||
'value' => 'Retour'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col2 offset6">
|
||||
<?php echo template::button('formDataDeleteAll', [
|
||||
'class' => 'formDataDeleteAll red',
|
||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/deleteall' . '/' . $_SESSION['csrf'],
|
||||
'ico' => 'cancel',
|
||||
'value' => 'Tout effacer'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col2">
|
||||
<?php echo template::button('formDataBack', [
|
||||
'class' => 'blue',
|
||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/export2csv' . '/' . $_SESSION['csrf'],
|
||||
'ico' => 'download',
|
||||
'value' => 'Export CSV'
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php if($module::$data): ?>
|
||||
<?php echo template::table([11, 1], $module::$data, ['Réponses', '']); ?>
|
||||
<?php echo $module::$pagination; ?>
|
||||
<?php else: ?>
|
||||
<?php echo template::speech('Aucune réponse !'); ?>
|
||||
<?php endif; ?>
|
||||
<div class="moduleVersion">Version n°
|
||||
<?php echo $module::VERSION; ?>
|
||||
</div>
|
24
sondage/view/index/index.js.php
Normal file
24
sondage/view/index/index.js.php
Normal file
@ -0,0 +1,24 @@
|
||||
/**
|
||||
* This file is part of Zwii.
|
||||
*
|
||||
* For full copyright and license information, please see the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*
|
||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||
* @copyright Copyright (C) 2008-2018, Frédéric Tempez
|
||||
* @license GNU General Public License, version 3
|
||||
* @link http://zwiicms.com/
|
||||
*/
|
||||
|
||||
/**
|
||||
* Paramétrage du format de date
|
||||
*/
|
||||
$(function() {
|
||||
$(".datepicker").flatpickr({
|
||||
altInput: true,
|
||||
altFormat: "d/m/Y",
|
||||
enableTime: false,
|
||||
locale: "fr",
|
||||
dateFormat: "d/m/Y"
|
||||
});
|
||||
});
|
67
sondage/view/index/index.php
Normal file
67
sondage/view/index/index.php
Normal file
@ -0,0 +1,67 @@
|
||||
<?php if($this->getData(['module', $this->getUrl(0), 'input'])): ?>
|
||||
<?php echo template::formOpen('formForm'); ?>
|
||||
<?php foreach($this->getData(['module', $this->getUrl(0), 'input']) as $index => $input): ?>
|
||||
<?php if($input['type'] === $module::TYPE_MAIL): ?>
|
||||
<?php echo template::mail('formInput[' . $index . ']', [
|
||||
'id' => 'formInput_' . $index,
|
||||
'label' => $input['name']
|
||||
]); ?>
|
||||
<?php elseif($input['type'] === $module::TYPE_SELECT): ?>
|
||||
<?php
|
||||
$values = array_flip(explode(',', $input['values']));
|
||||
foreach($values as $value => $key) {
|
||||
$values[$value] = trim($value);
|
||||
}
|
||||
?>
|
||||
<?php echo template::select('formInput[' . $index . ']', $values, [
|
||||
'id' => 'formInput_' . $index,
|
||||
'label' => $input['name']
|
||||
]); ?>
|
||||
<?php elseif($input['type'] === $module::TYPE_TEXT): ?>
|
||||
<?php echo template::text('formInput[' . $index . ']', [
|
||||
'id' => 'formInput_' . $index,
|
||||
'label' => $input['name']
|
||||
]); ?>
|
||||
<?php elseif($input['type'] === $module::TYPE_TEXTAREA): ?>
|
||||
<?php echo template::textarea('formInput[' . $index . ']', [
|
||||
'id' => 'formInput_' . $index,
|
||||
'label' => $input['name']
|
||||
]); ?>
|
||||
<?php elseif($input['type'] === $module::TYPE_DATETIME): ?>
|
||||
<?php echo template::date('formInput[' . $index . ']', [
|
||||
'id' => 'formInput_' . $index,
|
||||
'label' => $input['name'],
|
||||
'vendor' => 'flatpickr'
|
||||
]); ?>
|
||||
<?php elseif($input['type'] === $module::TYPE_CHECKBOX): ?>
|
||||
<?php echo template::checkbox('formInput[' . $index . ']', true, $input['name']
|
||||
); ?>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
<?php if($this->getData(['module', $this->getUrl(0), 'config', 'capcha'])): ?>
|
||||
<div class="row">
|
||||
<div class="col4">
|
||||
<?php echo template::capcha('formCapcha'); ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<div class="row">
|
||||
<div class="col2">
|
||||
<?php echo template::button('sondageResult', [
|
||||
'value' => 'Réponses',
|
||||
'class' => 'blue',
|
||||
'href' => helper::baseUrl() . $this->getUrl(0) . '/result' . '/' . $_SESSION['csrf']
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col2 offset8">
|
||||
<?php echo template::submit('formSubmit', [
|
||||
'value' => $this->getData(['module', $this->getUrl(0), 'config', 'button']) ? $this->getData(['module', $this->getUrl(0), 'config', 'button']) : 'Envoyer',
|
||||
'ico' => '',
|
||||
'class' => 'green'
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php echo template::formClose(); ?>
|
||||
<?php else: ?>
|
||||
<?php echo template::speech('Le formulaire ne contient aucun champ.'); ?>
|
||||
<?php endif; ?>
|
19
sondage/view/result/result.php
Normal file
19
sondage/view/result/result.php
Normal file
@ -0,0 +1,19 @@
|
||||
<div class="row">
|
||||
<div class="col2">
|
||||
<?php echo template::button('formDataBack', [
|
||||
'class' => '',
|
||||
'href' => helper::baseUrl() . $this->getUrl(0),
|
||||
'ico' => 'left',
|
||||
'value' => 'Retour'
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php if($module::$data): ?>
|
||||
<?php echo template::table([11, 1], $module::$data, ['Réponses', '']); ?>
|
||||
<?php echo $module::$pagination; ?>
|
||||
<?php else: ?>
|
||||
<?php echo template::speech('Aucune réponse !'); ?>
|
||||
<?php endif; ?>
|
||||
<div class="moduleVersion">Version n°
|
||||
<?php echo $module::VERSION; ?>
|
||||
</div>
|
Loading…
Reference in New Issue
Block a user