Bonjour à vous.
Je débute sur CakePhp et j'aimerais solliciter votre aide.

J'ai, dans une BDD, des tâches (à effecturer) avec un nom, une date et une description. Je souhaiterais en fait imprimer une liste des tâches du jour choisi.

L'utilisateur saisi alors dans un champ une date (par exemple : 21/07/2015) et je veux lui afficher toutes les tâches avec la date qui est 21/07/2015.

Le souci est que la date est stockée dans le format fr : dd/mm/yyyy. Lorsque je le transmets comme variable, les "/" posent soucis.

Sauriez-vous comment je peux faire ? J'avais pensé à passer la variable de façon "cachée" mais je ne sais pas comment faire ...

Merci à vous.

14 réponses


Tu veux créer une route comme tasks/2015/07/21/print et pouvoir récupérer les trois composantes de ta date ?
(Je préviens, je n'ai jamais touché à CakePHP avant ton post, donc je ne te propose peut-être pas la meilleure solution).

Création de la route :

     $routes->connect(
        '/tasks/:date/:do', 
        ['controller' => 'Tasks', 'action' => ''],
        [
            'pass' => ['date', 'do'],
            'date' => '[0-9]{4}\/[0-9]{1,2}\/[0-9]{1,2}',
            'do'   => '[a-z]+'
        ]
    );

Et ta date est accessible dans le premier paramètre de la méthode de ton controller.

Jimmy
Auteur

A vrai dire même pas.
Même si la date n'est pas visible dans l'URL ce n'est pas grave, vu que derrière la page générée va être imprimée, l'URL importe peu.
Je veux juste être capable de transmettre la date.

Ta solution peut peut-être fonctionné mais peut-être y'a t il plus simple ? (sans créer de route)
Merci tout de même, je l'essaierais si je n'ai pas mieux :)

Pour transmettre une valeur, tu peux passer par la route, la POST (depuis un formulaire), ou alors utiliser les sessions.
Mais du coup je ne vois plus trop le problème posé par les « / ».

Jimmy
Auteur

C'est le POST que je souhaiterais faire, mais que je ne sais pas faire en fait lol
Je débute x)

Tu as un exemple assez complet dans la documentation, qui va pouvoir t'aider (pour CakePHP 3, par contre, mais il doit y avoir le même pour le 2). C'est le client qui va faire une requêtes POST avec les différentes valeurs issues du formulaire, et tu vas pouvoir les traiter / récupérer depuis ton code PHP côté serveur.

Jimmy
Auteur

Je me perds entre ce que je veux faire et ce que je sais faire.
Actuellement ce que je sais faire et qui fonctionnent pour des id's c'est cela :

function chercher(){
    $search = $this->Task->find('all', array('conditions' => array('Task.date =' => $donnees['chercher']['date'])));
    if (empty($search)) {
        $this->Session->setFlash('Aucune tâche trouvée à cette date. Merci de réessayer.', 'notif', array('type' => 'alert'));
        return $this->redirect($this->referer());
    } else {
        return $this->redirect(array('admin' => true, 'action' => 'imprimer', $donnees['chercher']['date']));
    }
}

function imprimer($date = null){
// ...
if ($date) {
if (!$this->request->is(array('post', 'put'))) {
                    $this->request->data = $this->Task->find('all', array('conditions' => array('Task.date =' => $date)));
                    if (empty($this->request->data)) {
                        $this->Session->setFlash('Aucune tâche trouvée à cette date. Merci de réessayer.', 'notif', array('type' => 'alert'));
                        return $this->redirect(array('action' => 'index'));
                    }
                } else {
                    $tasks = $this->Task->find('first', array('conditions' => array('Task.date' => $date, 'done =' => 0), 'order' => 'Task.created DESC'));
                    $this->set(compact('tasks'));
                }
}

Mais pour la date les "/" me donnent des erreurs.

L'URL que ça me génére étant : <domaine>/admin/planificateur/imprimer/21%2F07%2F2015

Est-ce que tu as bien la directive AllowEncodedSlashes on dans ton .htaccess ?

Jimmy
Auteur

Je suis sur un mutualisé OVH, pas sur qu'on peut changer ça ..

Si, tu peux créer un .htaccess à la racine de ton dossier d'hébergement mutualisé concernant ton site.

Jimmy
Auteur

J'ai déjà ceci dans le .htaccess

<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    (.*) app/webroot/$1 [L]
</IfModule>

# cache css/js/ico for 2 days
<FilesMatch "\.(css|js|ico)$">
  Header set Cache-Control "max-age=7200, must-revalidate"
</FilesMatch>

J'ai essayé de mettre la commande à plusieurs endroits mais j'ai une erreur 500.

Désolé, je n'ai pas de quoi tester :( Mais visiblement quelqu'un a le même soucis que toi : https://forum.ovh.com/showthread.php?78110-activer-AllowEncodedSlashes.
Bah du coup, il faut que tu regardes du côté de ce que j'ai dit avant : route spécifique avec la bonne regex pour la date, sessions ou formulaire !

Jimmy
Auteur

Oui apparement je ne suis pas le seul.
J'ai trouvé une solution en ciblant ma function "imprimer" directement depuis la création du formulaire :)
Je vais fouiller à ce niveau.

Merci.

Dans ton URL tu peux remplacer les / par des - et en PHP rempacer les - par des /

Ça résoudrait tes problèmes d'url

Passe le tout dans $this->request->data. En reprenant ton code, tu dois obtenir un truc du genre :

function chercher(){
    $search = $this->Task->find('all', array('conditions' => array('Task.date =' => $donnees['chercher']['date'])));
    if (empty($search)) {
        $this->Session->setFlash('Aucune tâche trouvée à cette date. Merci de réessayer.', 'notif', array('type' => 'alert'));
        return $this->redirect($this->referer());
    } else {
        $this->request->data = $donnes;
        return $this->redirect(array('admin' => true, 'action' => 'imprimer'));
    }
}

function imprimer($date = null){
// ...
if ($date || !empty($this->request->data)) {
if (!$this->request->is(array('post', 'put'))) {
                    $this->request->data = empty($this->request->data) ? $this->Task->find('all', array('conditions' => array('Task.date =' => $date))); : $this->request->data;
                    if (empty($this->request->data)) {
                        $this->Session->setFlash('Aucune tâche trouvée à cette date. Merci de réessayer.', 'notif', array('type' => 'alert'));
                        return $this->redirect(array('action' => 'index'));
                    }
                } else {
                    $tasks = $this->Task->find('first', array('conditions' => array('Task.date' => $date, 'done =' => 0), 'order' => 'Task.created DESC'));
                    $this->set(compact('tasks'));
                }
}