From da2cdeda12ba24952ab4e986227ce8a429bb2cd1 Mon Sep 17 00:00:00 2001 From: Olivier PEREZ <olivier@olivierperez.fr> Date: Sun, 29 Mar 2015 22:13:22 +0200 Subject: [PATCH] Smartysize infos_creation, and rename it to create_poll --- app/classes/Framadate/Utils.php | 4 + app/inc/config.template.php | 4 +- app/inc/i18n.php | 2 +- choix_autre.php => create_classic_poll.php | 4 +- choix_date.php => create_date_poll.php | 4 +- create_poll.php | 210 +++++++++++++++++++++ creation_sondage.php | 2 +- css/style.css | 4 +- infos_sondage.php | 4 +- tpl/create_poll.tpl | 179 ++++++++++++++++++ tpl/index.tpl | 4 +- 11 files changed, 407 insertions(+), 14 deletions(-) rename choix_autre.php => create_classic_poll.php (99%) rename choix_date.php => create_date_poll.php (99%) create mode 100644 create_poll.php create mode 100644 tpl/create_poll.tpl diff --git a/app/classes/Framadate/Utils.php b/app/classes/Framadate/Utils.php index 7fc9d726..9eb11efa 100644 --- a/app/classes/Framadate/Utils.php +++ b/app/classes/Framadate/Utils.php @@ -182,4 +182,8 @@ class Utils { return $cleaned; } + + public static function fromPostOrEmpty($postKey) { + return !empty($_POST[$postKey]) ? Utils::htmlEscape($_POST[$postKey]) : ''; + } } diff --git a/app/inc/config.template.php b/app/inc/config.template.php index 585b1da5..d1208ebf 100644 --- a/app/inc/config.template.php +++ b/app/inc/config.template.php @@ -81,9 +81,9 @@ $config = [ 'show_what_is_that' => true, // display "how to use" section 'show_the_software' => true, // display technical information about the software 'show_cultivate_your_garden' => true, // display "developpement and administration" information - /* choix_autre.php / choix_date.php */ + /* create_classic_poll.php / create_date_poll.php */ 'default_poll_duration' => 180, // default values for the new poll duration (number of days). - /* choix_autre.php */ + /* create_classic_poll.php */ 'user_can_add_img_or_link' => true, // user can add link or URL when creating his poll. ]; diff --git a/app/inc/i18n.php b/app/inc/i18n.php index dde62478..0ba5ad5b 100644 --- a/app/inc/i18n.php +++ b/app/inc/i18n.php @@ -39,7 +39,7 @@ if (isset($_POST['lang']) && is_string($_POST['lang']) && in_array($_POST['lang' $html_lang = substr($locale, 0, 2); /* Date Format */ -$date_format['txt_full'] = __('Date\\FULL'); //summary in choix_date.php and removal date in choix_(date|autre).php +$date_format['txt_full'] = __('Date\\FULL'); //summary in create_date_poll.php and removal date in choix_(date|autre).php $date_format['txt_short'] = __('Date\\SHORT'); // radio title $date_format['txt_day'] = __('Date\\DAY'); $date_format['txt_date'] = __('Date\\DATE'); diff --git a/choix_autre.php b/create_classic_poll.php similarity index 99% rename from choix_autre.php rename to create_classic_poll.php index 38beabb1..0089adba 100644 --- a/choix_autre.php +++ b/create_classic_poll.php @@ -180,7 +180,7 @@ if (empty($_SESSION['form']->title) || empty($_SESSION['form']->admin_name) || ( $end_date_str = utf8_encode(strftime('%d/%m/%Y', $max_time)); //textual date echo ' - <form name="formulaire" action="' . Utils::get_server_name() . 'choix_autre.php" method="POST" class="form-horizontal" role="form"> + <form name="formulaire" action="' . Utils::get_server_name() . 'create_classic_poll.php" method="POST" class="form-horizontal" role="form"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <div class="well summary"> @@ -224,7 +224,7 @@ if (empty($_SESSION['form']->title) || empty($_SESSION['form']->admin_name) || ( bandeau_titre(__('Step 2 classic\\Poll subjects (2 on 3)')); echo ' - <form name="formulaire" action="' . Utils::get_server_name() . 'choix_autre.php" method="POST" class="form-horizontal" role="form"> + <form name="formulaire" action="' . Utils::get_server_name() . 'create_classic_poll.php" method="POST" class="form-horizontal" role="form"> <div class="row"> <div class="col-md-8 col-md-offset-2">'; echo ' diff --git a/choix_date.php b/create_date_poll.php similarity index 99% rename from choix_date.php rename to create_date_poll.php index 66cdd31e..e39dbf72 100644 --- a/choix_date.php +++ b/create_date_poll.php @@ -178,7 +178,7 @@ if (!isset($_SESSION['form']->title) || !isset($_SESSION['form']->admin_name) || $end_date_str = utf8_encode(strftime('%d/%m/%Y', $max_time)); //textual date echo ' - <form name="formulaire" action="' . Utils::get_server_name() . 'choix_date.php" method="POST" class="form-horizontal" role="form"> + <form name="formulaire" action="' . Utils::get_server_name() . 'create_date_poll.php" method="POST" class="form-horizontal" role="form"> <div class="row" id="selected-days"> <div class="col-md-8 col-md-offset-2"> <h3>'. __('Step 3\\Confirm the creation of your poll') .'</h3> @@ -222,7 +222,7 @@ if (!isset($_SESSION['form']->title) || !isset($_SESSION['form']->admin_name) || bandeau_titre(__('Step 2 date\\Poll dates (2 on 3)')); echo ' - <form name="formulaire" action="' . Utils::get_server_name() . 'choix_date.php" method="POST" class="form-horizontal" role="form"> + <form name="formulaire" action="' . Utils::get_server_name() . 'create_date_poll.php" method="POST" class="form-horizontal" role="form"> <div class="row" id="selected-days"> <div class="col-md-10 col-md-offset-1"> <h3>'. __('Step 2 date\\Choose the dates of your poll') .'</h3> diff --git a/create_poll.php b/create_poll.php new file mode 100644 index 00000000..5ae484ee --- /dev/null +++ b/create_poll.php @@ -0,0 +1,210 @@ +<?php +/** + * This software is governed by the CeCILL-B license. If a copy of this license + * is not distributed with this file, you can obtain one at + * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt + * + * Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ + * Authors of Framadate/OpenSondate: Framasoft (https://github.com/framasoft) + * + * ============================= + * + * Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence + * ne se trouve pas avec ce fichier vous pouvez l'obtenir sur + * http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt + * + * Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ + * Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft) + */ + +use Framadate\Form; +use Framadate\Utils; + +include_once __DIR__ . '/app/inc/init.php'; + +const GO_TO_STEP_2 = 'gotostep2'; + +if (!isset($_SESSION['form'])) { + $_SESSION['form'] = new Form(); +} + +// Type de sondage +if (isset($_GET['type']) && $_GET['type'] == 'date' || + isset($_POST['type']) && $_POST['type'] == 'date' +) { + $poll_type = 'date'; + $_SESSION['form']->choix_sondage = $poll_type; +} else { + $poll_type = 'classic'; + $_SESSION['form']->choix_sondage = $poll_type; +} + +// We clean the data +$goToStep2 = filter_input(INPUT_POST, GO_TO_STEP_2, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => '/^(date|classic)$/']]); +$title = filter_input(INPUT_POST, 'title', FILTER_SANITIZE_STRING); +$name = filter_input(INPUT_POST, 'name', FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => NAME_REGEX]]); +$mail = filter_input(INPUT_POST, 'mail', FILTER_VALIDATE_EMAIL); +$description = filter_input(INPUT_POST, 'description', FILTER_SANITIZE_STRING); +$editable = filter_input(INPUT_POST, 'editable', FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => BOOLEAN_REGEX]]); +$receiveNewVotes = filter_input(INPUT_POST, 'receiveNewVotes', FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => BOOLEAN_REGEX]]); +$receiveNewComments = filter_input(INPUT_POST, 'receiveNewComments', FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => BOOLEAN_REGEX]]); + + +// On initialise également les autres variables +$error_on_mail = false; +$error_on_title = false; +$error_on_name = false; +$error_on_description = false; + +// +if (!empty($_POST[GO_TO_STEP_2])) { + $_SESSION['form']->title = $title; + $_SESSION['form']->admin_name = $name; + $_SESSION['form']->admin_mail = $mail; + $_SESSION['form']->description = $description; + $_SESSION['form']->editable = ($editable !== null); + $_SESSION['form']->receiveNewVotes = ($receiveNewVotes !== null); + $_SESSION['form']->receiveNewComments = ($receiveNewComments !== null); + + if ($config['use_smtp'] == true) { + if (empty($mail)) { + $error_on_mail = true; + } + } + + if ($title !== $_POST['title']) { + $error_on_title = true; + } + + if ($name !== $_POST['name']) { + $error_on_name = true; + } + + if ($description !== $_POST['description']) { + $error_on_description = true; + } + + // Si pas d'erreur dans l'adresse alors on change de page vers date ou autre + if ($config['use_smtp'] == true) { + $email_OK = $mail && !$error_on_mail; + } else { + $email_OK = true; + } + + if ($title && $name && $email_OK && !$error_on_title && !$error_on_description && !$error_on_name) { + + if ($goToStep2 == 'date') { + header('Location:create_date_poll.php'); + exit(); + } + + if ($goToStep2 == 'classic') { + header('Location:create_classic_poll.php'); + exit(); + } + + } else { + // Title Erreur ! + $title = __('Generic', 'Error!') . ' - ' . __('Step 1', 'Poll creation (1 on 3)'); + } +} else { + // Title OK (formulaire pas encore rempli) + $title = __('Step 1', 'Poll creation (1 on 3)'); +} + +// Prepare error messages +$errors = array( + 'title' => array( + 'msg' => '', + 'aria' => '', + 'class' => '' + ), + 'description' => array( + 'msg' => '', + 'aria' => '', + 'class' => '' + ), + 'name' => array( + 'msg' => '', + 'aria' => '', + 'class' => '' + ), + 'email' => array( + 'msg' => '', + 'aria' => '', + 'class' => '' + ) +); + +// TODO Move it to TPL +if (!empty($_POST[GO_TO_STEP_2])) { + if (empty($_POST['title'])) { + $errors['title']['aria'] = 'aria-describeby="poll_title_error" '; + $errors['title']['class'] = ' has-error'; + $errors['title']['msg'] = __('Error', 'Enter a title'); + } elseif ($error_on_title) { + $errors['title']['aria'] = 'aria-describeby="poll_title_error" '; + $errors['title']['class'] = ' has-error'; + $errors['title']['msg'] = __('Error', 'Something is wrong with the format'); + } + + if ($error_on_description) { + $errors['description']['aria'] = 'aria-describeby="poll_comment_error" '; + $errors['description']['class'] = ' has-error'; + $errors['description']['msg'] = __('Error', 'Something is wrong with the format'); + } + + if (empty($_POST['name'])) { + $errors['name']['aria'] = 'aria-describeby="poll_name_error" '; + $errors['name']['class'] = ' has-error'; + $errors['name']['msg'] = __('Error', 'Enter a name'); + } elseif ($error_on_name) { + $errors['name']['aria'] = 'aria-describeby="poll_name_error" '; + $errors['name']['class'] = ' has-error'; + $errors['name']['msg'] = __('Error', 'Something is wrong with the format'); + } + + if (empty($_POST['mail'])) { + $errors['email']['aria'] = 'aria-describeby="poll_name_error" '; + $errors['email']['class'] = ' has-error'; + $errors['email']['msg'] = __('Error', 'Enter an email address'); + } elseif ($error_on_mail) { + $errors['email']['aria'] = 'aria-describeby="poll_email_error" '; + $errors['email']['class'] = ' has-error'; + $errors['email']['msg'] = __('Error', 'The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.'); + } +} + +// Checkbox checked ? +if ($_SESSION['form']->editable) { + $editable = 'checked'; +} + +if ($_SESSION['form']->receiveNewVotes) { + $receiveNewVotes = 'checked'; +} + +if ($_SESSION['form']->receiveNewComments) { + $receiveNewComments = 'checked'; +} + + +$useRemoteUser = USE_REMOTE_USER && isset($_SERVER['REMOTE_USER']); + +$smarty->assign('title', $title); +$smarty->assign('useRemoteUser', $useRemoteUser); +$smarty->assign('errors', $errors); +$smarty->assign('use_smtp', $config['use_smtp']); +$smarty->assign('goToStep2', GO_TO_STEP_2); + +$smarty->assign('poll_type', $poll_type); +$smarty->assign('poll_title', Utils::fromPostOrEmpty('title')); +$smarty->assign('poll_description', Utils::fromPostOrEmpty('description')); +$smarty->assign('poll_name', Utils::fromPostOrEmpty('name')); +$smarty->assign('poll_mail', Utils::fromPostOrEmpty('mail')); +$smarty->assign('poll_editable', Utils::fromPostOrEmpty('editable')); +$smarty->assign('poll_receiveNewVotes', Utils::fromPostOrEmpty('receiveNewVotes')); +$smarty->assign('poll_receiveNewComments', Utils::fromPostOrEmpty('receiveNewComments')); +$smarty->assign('form', $_SESSION['form']); + +$smarty->display('create_poll.tpl'); diff --git a/creation_sondage.php b/creation_sondage.php index 948d43bc..469ed751 100644 --- a/creation_sondage.php +++ b/creation_sondage.php @@ -67,7 +67,7 @@ function ajouter_sondage() } $sondage_admin = $sondage.random(8); - $date_fin = $_SESSION["champdatefin"]; // provided by choix_autre.php or choix_date.php + $date_fin = $_SESSION["champdatefin"]; // provided by create_classic_poll.php or create_date_poll.php $_SESSION["champdatefin"]=""; //clean param cause 2 polls created by the same user in the same session can be affected by this param during the 2nd creation. $sql = 'INSERT INTO sondage (id_sondage, commentaires, mail_admin, nom_admin, titre, id_sondage_admin, date_fin, format, mailsonde) diff --git a/css/style.css b/css/style.css index 02b5fa7e..469f0199 100644 --- a/css/style.css +++ b/css/style.css @@ -320,7 +320,7 @@ table.results .btn-link.btn-sm { box-shadow: 0px 3px 5px rgba(0, 0, 0, 0.125) inset; } -/* choix_date.php */ +/* create_date_poll.php */ #selected-days .form-group { margin-left:0; margin-right:0; @@ -346,7 +346,7 @@ table.results .btn-link.btn-sm { border:none; background:transparent; } -/* choix_autre.php */ +/* create_classic_poll.php */ .md-a-img { text-decoration:none !important; } diff --git a/infos_sondage.php b/infos_sondage.php index 0a0058c9..d3fbc87e 100644 --- a/infos_sondage.php +++ b/infos_sondage.php @@ -99,12 +99,12 @@ if (!empty($_POST['poursuivre'])) { if ($title && $name && $email_OK && ! $error_on_title && ! $error_on_description && ! $error_on_name) { if ( $poursuivre == 'creation_sondage_date' ) { - header('Location:choix_date.php'); + header('Location:create_date_poll.php'); exit(); } if ( $poursuivre == 'creation_sondage_autre' ) { - header('Location:choix_autre.php'); + header('Location:create_classic_poll.php'); exit(); } diff --git a/tpl/create_poll.tpl b/tpl/create_poll.tpl new file mode 100644 index 00000000..ec0e665b --- /dev/null +++ b/tpl/create_poll.tpl @@ -0,0 +1,179 @@ +{extends file='page.tpl'} + +{block name=main} + <div class="row" style="display:none" id="form-block"> + <div class="col-md-8 col-md-offset-2"> + <form name="formulaire" id="formulaire" action="" method="POST" class="form-horizontal" role="form"> + + <div class="alert alert-info"> + <p> + {__('Step 1', 'You are in the poll creation section.')}<br/> + {__('Step 1', 'Required fields cannot be left blank.')} + </p> + </div> + <div class="form-group '.$errors['title']['class'].'"> + <label for="poll_title" class="col-sm-4 control-label">{__('Step 1', 'Poll title')} *</label> + + <div class="col-sm-8"> + <input id="poll_title" type="text" name="title" class="form-control" {$errors['title']['aria']} + value="{$poll_title}"/> + </div> + </div> + {if !empty($errors['title']['msg'])} + <div class="alert alert-danger"> + <p id="poll_title_error"> + {$errors['title']['msg']} + </p> + </div> + {/if} + + <div class="form-group '.$errors['description']['class'].'"> + <label for="poll_comments" class="col-sm-4 control-label">{__('Generic', 'Description')}</label> + + <div class="col-sm-8"> + <textarea id="poll_comments" name="description" + class="form-control" {$errors['description']['aria']} + rows="5">{$poll_description}</textarea> + </div> + </div> + {if !empty($errors['description']['msg'])} + <div class="alert alert-danger"> + <p id="poll_title_error"> + {$errors['description']['msg']} + </p> + </div> + {/if} + + <div class="form-group '.$errors['name']['class'].'"> + <label for="yourname" class="col-sm-4 control-label">{__('Generic', 'Your name')} *</label> + + <div class="col-sm-8"> + {if $useRemoteUser} + <input type="hidden" name="name" value="{$form->admin_name}" />{$form->admin_name} + {else} + <input id="yourname" type="text" name="name" class="form-control" {$errors['name']['aria']} value="{$poll_name}" /> + {/if} + </div> + </div> + {if !empty($errors['name']['msg'])} + <div class="alert alert-danger"> + <p id="poll_title_error"> + {$errors['name']['msg']} + </p> + </div> + {/if} + + {if $use_smtp} + <div class="form-group '.$errors['email']['class'].'"> + <label for="email" class="col-sm-4 control-label"> + {__('Generic', 'Your email address')} *<br/> + <span class="small">{__('Generic', '(in the format name@mail.com)')}</span> + </label> + + <div class="col-sm-8"> + {if $useRemoteUser} + <input type="hidden" name="mail" value="{$form->admin_mail}">{$form->admin_mail} + {else} + <input id="email" type="text" name="mail" class="form-control" {$errors['email']['aria']} value="{$poll_mail}" /> + {/if} + </div> + </div> + {if !empty($errors['email']['msg'])} + <div class="alert alert-danger"> + <p id="poll_title_error"> + {$errors['email']['msg']} + </p> + </div> + {/if} + + {/if} + + <div class="form-group"> + <div class="col-sm-offset-4 col-sm-8"> + <div class="checkbox"> + <label> + <input type=checkbox name="editable" {if $poll_editable}checked{/if} id="editable"> + {__('Step 1', 'Voters can modify their vote themselves.')} + </label> + </div> + </div> + </div> + + + {if $use_smtp} + <div class="form-group"> + <div class="col-sm-offset-4 col-sm-8"> + <div class="checkbox"> + <label> + <input type=checkbox name="receiveNewVotes" {if $poll_receiveNewVotes}checked{/if} + id="receiveNewVotes"> + {__('Step 1', 'To receive an email for each new vote.')} + </label> + </div> + </div> + </div> + <div class="form-group"> + <div class="col-sm-offset-4 col-sm-8"> + <div class="checkbox"> + <label> + <input type=checkbox name="receiveNewComments" {if $poll_receiveNewComments}checked{/if} + id="receiveNewComments"> + {__('Step 1', 'To receive an email for each new comment.')} + </label> + </div> + </div> + </div> + {/if} + + + + + + + + <p class="text-right"> + <input type="hidden" name="type" value="$poll_type"/> + <button name="{$goToStep2}" value="{$poll_type}" type="submit" + class="btn btn-success">{__('Step 1', 'Go to step 2')}</button> + </p> + + <script type="text/javascript">document.formulaire.title.focus();</script> + + </form> + </div> + </div> + <noscript> + <div class="alert alert-danger"> + {__('Step 1', 'Javascript is disabled on your browser. Its activation is required to create a poll.')} + </div> + </noscript> + <div id="cookie-warning" class="alert alert-danger" style="display:none"> + {__('Step 1', 'Cookies are disabled on your browser. Theirs activation is required to create a poll.')} + </div> + <script> + {* TODO Put this in a JS file *} + // Check Javascript is enabled, if it is it will execute this script + (function () { + // Check cookies are enabled too + var cookieEnabled = function () { + var cookieEnabled = navigator.cookieEnabled; + + // if not IE4+ nor NS6+ + if (!cookieEnabled && typeof navigator.cookieEnabled === "undefined") { + document.cookie = "testcookie"; + cookieEnabled = document.cookie.indexOf("testcookie") != -1; + } + + return cookieEnabled; + }; + + if (cookieEnabled()) { + // Show the form block + document.getElementById("form-block").setAttribute("style", ""); + } else { + // Show the warning about cookies + document.getElementById("cookie-warning").setAttribute("style", ""); + } + })(); + </script> +{/block} \ No newline at end of file diff --git a/tpl/index.tpl b/tpl/index.tpl index ddd8cd77..d3af42bf 100644 --- a/tpl/index.tpl +++ b/tpl/index.tpl @@ -4,7 +4,7 @@ <div class="row"> <div class="col-md-6 text-center"> <p class="home-choice"> - <a href="{$SERVER_URL}infos_sondage.php?choix_sondage=date" class="opacity" role="button"> + <a href="{$SERVER_URL}create_poll.php?type=date" class="opacity" role="button"> <img class="img-responsive center-block" src="{'images/date.png'|resource}" alt=""/> <br/> <span class="btn btn-primary btn-lg"> @@ -16,7 +16,7 @@ </div> <div class="col-md-6 text-center"> <p class="home-choice"> - <a href="{$SERVER_URL}infos_sondage.php?choix_sondage=autre" class="opacity" role="button"> + <a href="{$SERVER_URL}create_poll.php?type=autre" class="opacity" role="button"> <img alt="" class="img-responsive center-block" src="{'images/classic.png'|resource}"/> <br/> <span class="btn btn-info btn-lg"> -- GitLab