Bonjour à tous,

Bon je bloque encore :( Mes règles de validation fonctionnent mais aucune erreur n'apparait.

J'ai fait un debug de $this->validationErrors qui effectivemment renvoi toujours null.

J'ai bien fait gaffe à ce que mon beforeSave renvoi true.

Je n'ai pas d'éventuelle redirection qui viderais mon validationErrors (J'ai lu ça sur internet).

Et voici mon code :

Modèle

public $validate = array(
        'name' => array(
            array(
                'rule' => 'alphanumeric',
                'required' => true,
                'allowEmpty' => false,
                'message' => "Votre titre n'est pas valide"
            )
        ),
        'description' => array(
            array(
                'rule' => 'alphanumeric',
                'required' => true,
                'allowEmpty' => false,
                'message' => "Votre description n'est pas valide"
            )
        )
    );

Contrôleur:

public function add(){

        if ($this->request->is('post')) {

            // On défini l'utilisateur de l'évènement
            $this->request->data['user_id'] = $this->Auth->user(['id']);

            // On scinde la date globale pour avoir la date de début et la date de fin
            $this->request->data['date_debut'] = substr($this->request->data['dates'], 0, 19);
            $this->request->data['date_fin'] = substr($this->request->data['dates'], 24, 20);

            // Création de l'évènement en base de données
            $this->Evenement->create();
            if ($this->Evenement->save($this->request->data, true)) {
                $this->Session->setFlash(__('Votre évènement à bien été créé.'));
                //return $this->redirect(array('action' => 'index'));
            }
            $this->Session->setFlash(__('Impossible d\'ajouter l\'évènement.'));
        }

        debug($this->validationErrors);

    }

et ma vue classiquement un formulaire à l'aide du helper.

J'ai remarqué que sur mon formulaire de connexion je n'ai pas d'erreurs non plus.. Donc j'imagine que j'ai la même erreur des deux côtés mais je ne voit pas trop quoi ..

En vous remerciant fortement les amis !

Bryan.

8 réponses


connected
Réponse acceptée

Je pense avoir trouvé :

<?php echo $this->form->create('Evenement'); ?>

Doit être remplacé par :

<?php echo $this->Form->create('Evenement'); ?>

Chez moi quand je le laisse le f de form en minuscule les erreurs ne s'affichent pas, mais s'il est en majuscule j'ai bien les erreurs qui s'affichent.

bryou16
Auteur

Bon alors,

En faisant un debug($this->Evenement->validationErrors); j'ai bien les messages d'erreurs. Mais rien ne s'affiche dans la vue :(

Salut,

est-ce que tu affiches bien les erreurs dans ta vue ?
Avec :

$this->Session->flash()
bryou16
Auteur

Salut :)

Oui j'ai bien l'affichage des flash mais ce sont les erreurs de validation que je n'arrive pas à obtenir. Quand je fait un debug de validationErrors j'ai bien les erreurs qui sont créées mais elle ne s'affiche pas dans la vue ..

Re,

Ok, je vais essayé de reproduire ton erreur :

  • quelle version de Cake est-ce que tu uilises exactement ?
  • est-ce que je pourrais avoir ton AppController.php, et la view add.ctp correspondant à ton action ?

Merci :)

bryou16
Auteur

Alors,

add.ctp

 <?php $this->Html->css(array(
        '/css/plugins/daterangepicker/daterangepicker-bs3.css',
        '/css/plugins/timepicker/bootstrap-timepicker.min.css'), null, array('inline' =>  false)); ?>

        <!-- Content Header (Page header) -->
        <section class="content-header">
          <h1>
            Calendrier
            <small>Ajouter un évènement</small>
          </h1>
          <ol class="breadcrumb">
            <li><a href="<?= $this->Html->url(array('controller' => 'Accueil', 'action' => 'index')); ?>"><i class="fa fa-dashboard"></i> Home</a></li>
            <li class="active"><a href="#">Ajouter un évènement</a></li>
          </ol>
        </section>

        <!-- Main content -->
        <section class="content">
          <div class="row">
            <div class="col-xs-12">

              <!-- general form elements -->
              <div class="box box-primary">
                <div class="box-header with-border">
                  <h3 class="box-title">Ajoutez des évènements à votre calendrier</h3>
                </div><!-- /.box-header -->

                <!-- Information -->
                <div class="alert alert-warning alert-dismissable">
                    <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
                    <h4><i class="icon fa fa-warning"></i> Attention</h4>
                    attention.
                </div>

                <div class="alert alert-info alert-dismissable">
                    <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
                    <h4><i class="icon fa fa-info"></i>Information</h4>
                    info.
                </div>

                <!-- form start -->
                <?php echo $this->form->create('Evenement'); ?>

                  <div class="box-body">

                      <!-- Date input-->
                      <div class="form-group">
                        <label>Période de l'évènement</label> (Attention aux horaires)
                        <div class="input-group">
                          <div class="input-group-addon">
                            <i class="fa fa-clock-o"></i>
                          </div>
                          <input type="text" name="dates" class="form-control pull-right" id="reservationtime"/>
                      </div>
                      <!-- /.input group -->

                      </br>

                      <!-- Titre input-->
                      <?= $this->Form->input('name', array(
                                                              'div'         =>  'form-group',
                                                              'class'       =>  'form-control',
                                                              'placeholder' =>  'Titre de l\'évènement',
                                                              'label'       =>  'Titre')); ?>

                      <!-- Description input-->
                      <?= $this->Form->input('description', array(
                                                              'div'         =>  'form-group',
                                                              'class'       =>  'form-control',
                                                              'placeholder' =>  'Description de l\'évènement ...',
                                                              'label'       =>  'Description',
                                                              'type'        =>  'textarea')); ?>

                  </div><!-- /.box-body -->

                  <!-- Submit form -->
                  <?= $this->Form->end(array(
                                                'label' =>  'Ajouter au calendrier',
                                                'class' =>  'btn btn-primary',
                                                'div'   =>  'box-footer')); ?>

                </form>
              </div><!-- /.box -->

            </div><!-- /.col -->
          </div><!-- /.row -->
        </section><!-- /.content -->
        <?php $this->Html->script('https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.2/moment.min.js',array('inline' => false)); ?>
        <?php $this->Html->script('plugins/daterangepicker/daterangepicker.js',array('inline' => false)); ?>
        <?php $this->Html->script('plugins/timepicker/bootstrap-timepicker.min.js',array('inline' => false)); ?>

        <?= $this->Html->scriptStart($options = array('inline'=>false)); ?>
        moment.locale('fr', {
            months : "janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),
            monthsShort : "janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),
            weekdays : "dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),
            weekdaysShort : "dim._lun._mar._mer._jeu._ven._sam.".split("_"),
            weekdaysMin : "Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),
            longDateFormat : {
                LT : "HH:mm",
                LTS : "HH:mm:ss",
                L : "DD/MM/YYYY",
                LL : "D MMMM YYYY",
                LLL : "D MMMM YYYY LT",
                LLLL : "dddd D MMMM YYYY LT"
            },
            calendar : {
                sameDay: "[Aujourd'hui à] LT",
                nextDay: '[Demain à] LT',
                nextWeek: 'dddd [à] LT',
                lastDay: '[Hier à] LT',
                lastWeek: 'dddd [dernier à] LT',
                sameElse: 'L'
            },
            relativeTime : {
                future : "dans %s",
                past : "il y a %s",
                s : "quelques secondes",
                m : "une minute",
                mm : "%d minutes",
                h : "une heure",
                hh : "%d heures",
                d : "un jour",
                dd : "%d jours",
                M : "un mois",
                MM : "%d mois",
                y : "une année",
                yy : "%d années"
            },
            ordinalParse : /\d{1,2}(er|ème)/,
            ordinal : function (number) {
                return number + (number === 1 ? 'er' : 'ème');
            },
            meridiemParse: /PD|MD/,
            isPM: function (input) {
                return input.charAt(0) === 'M';
            },
            // in case the meridiem units are not separated around 12, then implement
            // this function (look at locale/id.js for an example)
            // meridiemHour : function (hour, meridiem) {
            //     return /* 0-23 hour, given meridiem token and hour 1-12 */
            // },
            meridiem : function (hours, minutes, isLower) {
                return hours < 12 ? 'PD' : 'MD';
            },
            week : {
                dow : 1, // Monday is the first day of the week.
                doy : 4  // The week that contains Jan 4th is the first week of the year.
            }
        });

        $(function () {

        //Date range picker
        $('#reservation').daterangepicker();
        //Date range picker with time picker
        $('#reservationtime').daterangepicker({timePicker: true, timePickerIncrement: 1, format: 'YYYY-MM-DD h:mm:ss A'});

        //Date range as a button
        $('#daterange-btn').daterangepicker(
                {
                  ranges: {
                    'Today': [moment(), moment()],
                    'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
                    'Last 7 Days': [moment().subtract(6, 'days'), moment()],
                    'Last 30 Days': [moment().subtract(29, 'days'), moment()],
                    'This Month': [moment().startOf('month'), moment().endOf('month')],
                    'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]
                  },
                  startDate: moment().subtract(29, 'days'),
                  endDate: moment()
                },
        function (start, end) {
          $('#reportrange span').html(start.format('YYYY, MMMM D') + ' - ' + end.format('MMMM D, YYYY'));
        }
        );

        //iCheck for checkbox and radio inputs
        $('input[type="checkbox"].minimal, input[type="radio"].minimal').iCheck({
          checkboxClass: 'icheckbox_minimal-blue',
          radioClass: 'iradio_minimal-blue'
        });
        //Red color scheme for iCheck
        $('input[type="checkbox"].minimal-red, input[type="radio"].minimal-red').iCheck({
          checkboxClass: 'icheckbox_minimal-red',
          radioClass: 'iradio_minimal-red'
        });
        //Flat red color scheme for iCheck
        $('input[type="checkbox"].flat-red, input[type="radio"].flat-red').iCheck({
          checkboxClass: 'icheckbox_flat-green',
          radioClass: 'iradio_flat-green'
        });

        //Colorpicker
        $(".my-colorpicker1").colorpicker();
        //color picker with addon
        $(".my-colorpicker2").colorpicker();

        //Timepicker
        $(".timepicker").timepicker({
          showInputs: false
        });
      });
        <?= $this->Html->scriptEnd(); ?>

et le AppController

<?php
/**
 * Application level Controller
 *
 * This file is application-wide controller file. You can put all
 * application-wide controller-related methods here.
 *
 * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
 * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 * @link          http://cakephp.org CakePHP(tm) Project
 * @package       app.Controller
 * @since         CakePHP(tm) v 0.2.9
 * @license       http://www.opensource.org/licenses/mit-license.php MIT License
 */

App::uses('Controller', 'Controller');

/**
 * Application Controller
 *
 * Add your application-wide methods in the class below, your controllers
 * will inherit them.
 *
 * @package     app.Controller
 * @link        http://book.cakephp.org/2.0/en/controllers.html#the-app-controller
 */
class AppController extends Controller {

    public $components = array( 'Session',
                'Cookie', 
                'Auth'  => array(
                      'authenticate'  => array(
                                'Form'  =>  array(
                                      'scope' =>  array('User.active' => true)
                                      )
                                  ),
                      'authorize'   =>  array('Controller'),
                      'loginRedirect' => array('controller' => 'Accueil', 'action' => 'index'),
                      'logoutRedirect' => array('controller' => 'Users', 'action' => 'logout')
                        )
                );

    public function isAuthorized($user = null) {

        return false;
    }

    public $helpers = array('Html', 'Form', 'Session');

    /**
     * beforeFilter callback
     *
     * @return void
     */
    public function beforeFilter() {

        parent::beforeFilter();

        if($this->Auth->user(['id']))
        {

            $idauth = $this->Auth->user(['id']);

            /**
             * Déclaration des informations de l'utilisateur
             */

            $infos_user = $this->Auth->user();

            $this->set('infos_user',$infos_user);

            /**
             * Déclaration de la liste des évènements en cours 
             */

            $this->loadModel('Evenement');

            $today = new DateTime();

            $req_events = $this->Evenement->find('all', Array(
                                                    'conditions'    =>  array(
                                                                'Evenement.user_id'         =>  $idauth,
                                                                'Evenement.type_evenement'  =>  '1',
                                                                'Evenement.date_debut >'    =>  $today->format('Y-m-d H:i:s')

                                                                )
                                                        )
                                            );

            $this->set('Events_in_progress',$req_events);

            /**
             * Déclaration des messages reçus
             */

            $this->loadModel('Mail');

            $req_mails_recus = $this->Mail->find('all', Array(
                                                    'conditions'    =>  array(
                                                                'Mail.destinataire_id'  =>  $idauth
                                                                )
                                                        )
                                            );

            $this->set('Mails_recus',$req_mails_recus);

            $req_mails_recus_non_lu = $this->Mail->find('all', Array(
                                                    'conditions'    =>  array(
                                                                'Mail.destinataire_id'  =>  $idauth,
                                                                'Mail.lu'               =>  '1'         
                                                                )
                                                        )
                                            );

            $this->set('Mails_recus_non_lu',$req_mails_recus_non_lu);

        }

    }

    public static function temps_relatif($date) {

        // Déduction de la date donnée à la date actuelle
        $time = time() - strtotime($date); 

        // Calcule si le temps est passé ou à venir
        if ($time > 0) {
            $when = "il y a";
        } else if ($time < 0) {
            $when = "dans environ";
        } else {
            return "il y a moins d'une seconde";
        }
        $time = abs($time); 

        // Tableau des unités et de leurs valeurs en secondes
        $times = array( 31104000 =>  'an{s}',       // 12 * 30 * 24 * 60 * 60 secondes
                        2592000  =>  'mois',        // 30 * 24 * 60 * 60 secondes
                        86400    =>  'jour{s}',     // 24 * 60 * 60 secondes
                        3600     =>  'heure{s}',    // 60 * 60 secondes
                        60       =>  'minute{s}',   // 60 secondes
                        1        =>  'seconde{s}'); // 1 seconde         

        foreach ($times as $seconds => $unit) {
            // Calcule le delta entre le temps et l'unité donnée
            $delta = round($time / $seconds); 

            // Si le delta est supérieur à 1
            if ($delta >= 1) {
                // L'unité est au singulier ou au pluriel ?
                if ($delta == 1) {
                    $unit = str_replace('{s}', '', $unit);
                } else {
                    $unit = str_replace('{s}', 's', $unit);
                }
                // Retourne la chaine adéquate
                return $when." ".$delta." ".$unit;
            }
        }
    }

Pour ma version c'est cakePHP 2.7 :)

Merci beaucoup :)

Je suis en train d'essayer de reproduire l'erreur sans succès pour le moment, je continue. Mais au passage je pense à tes erreurs d'authentification qui ne s'affichent pas, si tu rajoutes ceci en haut de ton form de login (login.ctp)

<?php echo $this->Session->flash('auth'); ?>

Est-ce que ça fonctionne ?

bryou16
Auteur

Super !!!!!

Merci beaucoup ! C'était juste là sous mes yeux ! Un grand merci !