Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
tips_informatiques:programmation:php:cakephp [2010/06/03 10:10] nico |
tips_informatiques:programmation:php:cakephp [2012/02/07 14:36] (Version actuelle) |
||
---|---|---|---|
Ligne 52: | Ligne 52: | ||
A partir de là, il ne restera plus qu'à savoir d'où vient cette différence ! | A partir de là, il ne restera plus qu'à savoir d'où vient cette différence ! | ||
+ | |||
+ | __Note__: | ||
+ | |||
+ | Une erreur courante empêchant le SecurityComponent de fonctionner est le fait de ne pas fermer les formulaires: | ||
+ | |||
+ | La fonction **submit($caption = null, $options = array())** du FormHelper ne fait qu'imprimer un bouton submit, mais ne ferme pas le formulaire ! Ce qui signifie un code HTML invalide, et dans le cas présent le fait de ne pas passer par la méthode **secure($fields = array())** nécessaire au fonctionnement du SecurityComponent. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ====== Erreurs de validation non-montrées ====== | ||
+ | |||
+ | __CakePHP__ : 1.3.x | ||
+ | |||
+ | Alors que j'utilisais la méthode //saveAll()// dans un controller, les erreurs de validations des Models n'étaient pas montrées. J'ai cherché pendant un moment ce qu'il se passait dans la méthode elle-même, avant de comprendre que le problème se trouvait plus loin dans le code. Je faisais un nouveau //read()// depuis le Model principal, ce qui a pour effet de réinitialiser la variables //$validationErrors// !... | ||
+ | |||
+ | Le code suivant explique ceci: | ||
+ | |||
+ | |||
+ | Ici les erreurs ne sont pas montrées: | ||
+ | <code php> | ||
+ | if (!empty($this->data)) | ||
+ | { | ||
+ | if ($this->User->saveAll($this->data, array('validate'=>'first'))) | ||
+ | { | ||
+ | $this->Session->setFlash('User saved'); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | $this->Session->setFlash('User not saved.'); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | $this->data = $this->User->read(null, $id); | ||
+ | </code> | ||
+ | |||
+ | |||
+ | Ici les erreurs sont montrées: | ||
+ | <code php> | ||
+ | if (!empty($this->data)) | ||
+ | { | ||
+ | if ($this->User->saveAll($this->data, array('validate'=>'first'))) | ||
+ | { | ||
+ | $this->Session->setFlash('User saved'); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | $this->Session->setFlash('User not saved.'); | ||
+ | } | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | $this->data = $this->User->read(null, $id); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ====== Encodage de la base de données ====== | ||
+ | |||
+ | __CakePHP__ : 1.3.x (probablement 1.2.x) | ||
+ | |||
+ | |||
+ | __Problème__ : | ||
+ | |||
+ | En faisant un export depuis une base de données MySQL vers une autre base de données, j'ai réalisé que les textes n'étaient pas encodés correctement dans la première. | ||
+ | |||
+ | Une des conséquences dans mon cas particulier était le fait que lors de l'import dans la seconde base de données, l'ensemble des caractères accentués était affiché dans le mauvais encodage une fois dans les pages web. Normal, puisque le script d'export SQL généré par phpMyAdmin contenait déjà ces caractères mal encodés. | ||
+ | |||
+ | Les deux bases de données contenaient pourtant des champs encodés en //utf8_unicode_ci//. | ||
+ | |||
+ | __Solution__ : | ||
+ | |||
+ | Le problème ne venait pas de l'encodage des champs dans MySQL, mais de la communication entre CakePHP et MySQL qui se faisait dans le mauvais encodage. | ||
+ | |||
+ | Mais il est possible de spécifier au driver MySQL l'encodage à utiliser dans le fichier de configuration de base de données de CakePHP: | ||
+ | |||
+ | <code php> | ||
+ | class DATABASE_CONFIG { | ||
+ | |||
+ | var $default = array( | ||
+ | 'driver' => 'mysql', | ||
+ | 'encoding' => 'utf8', //-> here the encoding is forced | ||
+ | 'persistent' => false, | ||
+ | 'host' => 'localhost', | ||
+ | 'login' => 'my_login', | ||
+ | 'password' => 'my_password', | ||
+ | 'database' => 'my_database', | ||
+ | 'prefix' => 'db_', | ||
+ | ); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | __Remarque__ : | ||
+ | |||
+ | Dans le cas où vous avez déjà des caractères mal encodés dans votre base de données, le script suivant peut vous permettre de remplacer ces caractères afin de pouvoir néanmoins utiliser le script SQL obtenu lors de l'export: [[tips_informatiques:Linux:Shell:Fichiers_Dossiers:Fichiers_Dossiers#Remplacer des caractères UTF-8 affichés en ISO-8859-1 dans un fichier | Remplacer des caractères UTF-8 affichés en ISO-8859-1 dans un fichier]] | ||
+ | |||
+ | |||
+ | |||
+ | ====== Bake des vues avec les vues hors CRUD ====== | ||
+ | |||
+ | __Problème__: | ||
+ | |||
+ | Un bake lancé avec un simple | ||
+ | |||
+ | <code> | ||
+ | $ cake bake | ||
+ | </code> | ||
+ | |||
+ | ne génère que les actions du CRUD. | ||
+ | |||
+ | __Solution__: | ||
+ | |||
+ | Lancer la commande de la façon suivante: | ||
+ | |||
+ | <code> | ||
+ | $ cake bake view all | ||
+ | </code> | ||
+ | |||
+ | De cette manière, bake recherche les templates pour toutes les actions présentes dans les contrôleurs, ce qui est en plus bien plus rapide pour générer toutes les vues :-) | ||
+ | |||
+ | __Cake 2__: | ||
+ | |||
+ | <code> | ||
+ | /path/to/project/app$ ../lib/Cake/Console/cake bake view Format admin_copy | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ====== Bake rapide d'un contrôleur avec actions publiques et admin ====== | ||
+ | |||
+ | __Commande__: | ||
+ | |||
+ | Lancer la commande de la façon suivante: | ||
+ | |||
+ | <code> | ||
+ | $ cake bake controller Comment public admin | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ====== find avec conditions sur un modèle obtenu par contain ====== | ||
+ | |||
+ | __Code__: | ||
+ | |||
+ | <code php> | ||
+ | $this->Structure->contain(array('Document' => array('fields' => array('id', 'pid', 'title', 'year'), | ||
+ | 'conditions' => array('year' => $years), | ||
+ | 'DocumentSubtype' => array('id', 'name', | ||
+ | 'DocumentType' => array('id', 'name')), | ||
+ | 'PublicationVector' => array('id', 'name'), | ||
+ | 'Author' => array('id', 'firstname', 'lastname', 'cn_individu')) | ||
+ | ) | ||
+ | ); | ||
+ | </code> |