Bonjour,
manque d'expérience, peut etre.

Dans mon controller ConfisController et dans l'action edit, j'ai ceci

Configure::write('Site.name',$data'Config']'sitename']);
                Configure::write('Site.status',$data'Config']'sitestatus']);
                Configure::write('Site.homepage',$data'Config']'page_id']);
                Configure::write('Mail.usesmtp',$data'Config']'mailusesmtp']);

                Configure::write('Mail.smtpauth',$data'Config']'mailsmtpauth']);
                Configure::write('Mail.smtpuser',$data'Config']'mailsmtpuser']);
                Configure::write('Mail.smtpport',$data'Config']'mailsmtpport']);
                Configure::write('Mail.smtphosts',$data'Config']'mailsmtphosts']);
                Configure::write('Mail.charset',$data'Config']'mailcharset']);
                Configure::write('Mail.encoding',$data'Config']'mailencoding']);

Ca se trouve juste après le save() du formaulire.

Dans mon layout j'ai
Configure::read('Site.sitename');

Dans l'action index de PagesController, j'ai
$this->redirect(array('action'=>'show',Configure::read('Site.homepage')));

etc.

J'ai constaté que mes read retourne toujours null.

Aussi, quand je sauve ma configuration, mon layout affiche bien
Configure::read('Site.sitename');

mais quand je change de page, il ne l'affiche plus.

Ne erais-je pas pouvoir ce svaleur sauvegardée?

Maintenant, es-ce que c'est local ou ou Configure:write conserve les valeurs sur le serveur? Si je vais sur un autre ordinateur, il garde ces valeurs?

Merci

12 réponses


Maintenant, es-ce que c'est local ou ou Configure:write conserve les valeurs sur le serveur? Si je vais sur un autre ordinateur, il garde ces valeurs?

Ces valeurs sont écrites en dur dans un fichier PHP donc c'est commun à tous les utilisateurs. Si tu veux faire une édition d'une valeur contenue dans un Configure, tu vas devoir être obligé de modifier le fichier tout entier. Il n'y a pas de base de données pour ces valeurs.

Voici comment fait Croogo : https://github.com/croogo/croogo/blob/master/Plugin/Install/Lib/InstallManager.php#L62

Bonjour,

Je cherche désespérement une solution pour stocker des valeurs, autre que dans la base de donnée pour pouvoir les utiliser partout dans l'application (layout, view, component, controller etc)

Dans mon controller ConfigController, j'ai un formulaire qui stok les données dans une base de donnée. Afin de ne pas faire requete et simplifier mon code, j'aimerais qu'au moment de la sauvgarde dans la base de donnée, sauver ces données dans un fichier ou variable.

Ainsi que je lirai ce fichier pour afficher le nom du site dans le layout, mettre les parametre SMTP dans le fichier mail.php, redirigé le site s'il est offline, cacher des bloques si les news son inactif etc.

J'ai essayé plusieurs solutions. Dans l'action admin_edit de mon controller ConfigsController, j'ai essayé ces deux solution

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

                Configure::write('Site.name',$data'Config']'sitename']);
                Configure::write('Site.status',$data'Config']'sitestatus']);
                Configure::write('Site.homepage',$data'Config']'page_id']);
                Configure::write('Mail.usesmtp',$data'Config']'mailusesmtp']);
                Configure::write('Mail.smtpauth',$data'Config']'mailsmtpauth']);
                Configure::write('Mail.smtpuser',$data'Config']'mailsmtpuser']);
                Configure::write('Mail.smtpport',$data'Config']'mailsmtpport']);
                Configure::write('Mail.smtphosts',$data'Config']'mailsmtphosts']);
                Configure::write('Mail.charset',$data'Config']'mailcharset']);
                Configure::write('Mail.encoding',$data'Config']'mailencoding']);

Par exemple, dans le cas de set('config',$config);
éa variable $config est vide dans layout alors qu'elle ne l'est pas dans ConfigsController.

Idem pour Configure::write(), que je vais sur une autre page elle est vide.

Alors j'aurais voulu savoir si vous pouviez me donenr une solution ou me dire comment faire.

Milles mercis

Ces valeurs sont écrites en dur dans un fichier PHP. ...] Si tu veux faire une édition d'une valeur contenue dans un Configure, tu vas devoir être obligé de modifier le fichier tout entier.
Tu ne peux pas les modifier comme tu le souhaites. Configure::write ne s'écrit qu'une seule fois, de préférence dans le fichier app/Config/core.php. Si tu veux pouvoir les modifier en dynamique (via un formulaire par exemple), tu vas devoir t'inspirer du lien que je t'ai donné pour faire l'édition.

Les valeurs écrites dans Configure ne sont pas faites pour être modifiées normalement, pourquoi souhaites tu le faire ?

Il peut y avoir trois solutions à ton problème :

  1. Proposer à l'utilisateur d'ouvrir le fichier de conf et d'écrire dedans (c'est ce que propose un bon nombre d'applications, comme phpmyadmin par exemple). C'est à mon sens une bonne solution, elle est facile à mettre en oeuvre, rapide et simple d'utilisation.
  2. Créer une méthode qui va lire le fichier de conf et faire la modification dynamiquement (cf lien). Plus compliqué, elle à l'avantage de simplifier l'édition pour l'utilisateur.
  3. Créer un fichier à part dans un format différent, comme le json ou le Yaml par exemple, dans lequel tu pourras faire des modifications plus facilement.

La méthode 2 et 3 se ressemblent grandement, la méthode 3 est peut être la plus facile à mettre en oeuvre. Mais elle demande la création d'un nouveau fichier.

Salut,
Ok!
Dans ce que tu écris, cela concerne uniquement le Configure::?

J'essaye encore avec

$this->set("config",$config);

et dans mon layout j'arrive finalement faire

<?= $config'sitename'] ?>

Mais malheureusement ca ne fonction pas das l'action index de mon controller PagesController.

pourtant

$this->set("config",$config);

est défini dans AppController qui est hérité par les autres controller

Es-ce normal?

Le jSon semble aussi une bonne solution.

Bonjour.
Je n'ai pas trop compris ce que tu cherches à faire, mais vu les données que tu présentes, voici mon analyse.
Pour commencer, le nom du site, ce n'est pas quelque chose qui doit être changé régulièrement, ce n'est pas bon pour le référencement Web.
Ensuite, la page demandé à l'appel du site, ça ne se fait que via le routing, tu ne peux donc pas la changer dynamiquement, tu es obligé de la saisir manuellement dans routes.php

Router::connect()

, à moins de faire par exemple une condition dans l' AppController , mais je ne suis pas sur que ça fasse parti des bonnes pratiques, en plus de ça, toujours pour le référencement, ce n'est pas bon et si l'utilisateur à besoin de mettre le site hors-ligne souvent, c'est qu'il ne sait pas trop ce qu'il fait.
Pour ce qui est des paramètres d'envoi de mail, ça se passe dans database.php , il y a la possibilité d'y définir plusieurs configurations, ensuite le composant CakeEmail fait le reste.
En gros, ce que je veux dire, c'est que ce ne sont pas des données qui ont besoin d'être modifiées régulièrement.
Je ne sais pas ce que tu veux faire exactement, mais je ne te conseille pas de mettre en place un système de changement de ce genre de données.

Petit récapitulatif :

routes.php => pour le routing du site et donc la page d'accueil
database.php => pour la/les configuration(s) d'envoi d'email
AppController => pour transmettre des données à travers tous les controller du site (dans un beforeRender par exemple)

Salut,

merci pour tes réponses. Je veux permettre a un utilisateur de configurer son interface comme le font tous les CMS.
Ceci se fait depuis ConfigsController/admin/edit.

Il n'est pas question de changer fréquement le nom du site mais de le définir par un utilisateur, tout comme la page d'accueil, etc.

J'aimerais donc qu'une fois ces valeurs définies, les stoskée dans une variable que je puisse utiliser dans ma balise <title>

En effet, la reditection de /Pages/index devrait se faire depuis routes.php, mais dans meme cas je vais devoir recupérer la valeur de la page d'accueil qui a été défini par l'utilisateur pour la variable Sitehomepage.

J'ai juste besoin de savoir comme stosker ces valeurs sans devoir faire des requete MySQL a chaque fois.

Voilà, voili

Dans ce cas là, tu auras plus de travail que tu ne le pense, car il faudrait que tu régénère une page, comme routes.php par exemple pour définir la page d'accueil du site tout comme pour email.php , c'est d'ailleurs le mieux, par contre cela veut dire que tu veux faire comme Croogo ?
Mettre à disposition pour plusieurs personnes une application basée sur le CMS CakePHP ?

Une fois que le nom du site et que la configuration d'envoi de mail est renseignée la première fois, tu génères un nouveau fichier routes.php et un fichier email.php (je viens d'ailleurs de m'apercevoir que je me suis trompé de nom de fichier dans mon post précédent), par la suite tu n'auras plus besoin de garder les variables pour ces données dans l'application, vu que les données seront écrites dans les fichiers correspondants.
Pour ce qui est du nom du site, si tu ne veux pas le récupérer depuis la base de données à chaque rendu de l'application, tu l'écris directement en dur (avec du code PHP bien sûr) à la fin du fichier bootstrap.php , comme-ça, dans le layout il y aura juste besoin d'un

Configure::read('Site.sitename');

et tu n'auras plus aucune variable à lire via Configure , à part celle-ci.

mmmh, je suis désolé, mais ce me semble compliqué.... ,...généré un nouveau fichier routes.php, sans écraser le précédent. Je suis encore novice. Je me demandais si d'enregistrer ces informations dans en json ne serait pas mieux. Mais suis face encore au problème de comment faire avec json, j'ai lu la doc ,mais....

Tu seras quand même obligé de supprimer le précédent pour le fichier routes.php , je ne t'ai pas mis tous les détails, mais juste l'idée.
Car tu ne veux pas faire appel à la base de données pour ces valeurs, mais faire lire ces valeurs supplémentaire en permanence au framework, alors que ce sont pour la plupart des données qui sont déjà présente dans des fichiers de celui-ci, ce n'est pas forcément mieux et ne fera pas moins de charge au serveur, donc le meilleur moyen c'est de les écrires dans les fichiers correspondant au CMS.
Il te faudra faire un unset du fichier routes.php juste avant de générer le nouveau fichier.
Je ne connais pas exactement le comportement qu'aura le framwork pendant cette étape, mais niveau théorique c'est comme ça que tu devrais faire.
Pour le fichier email.php , à la base il s'appelle email.php.default , donc il n'y aura aucun soucis de ce côté là

Bon je crois alors que j'ai eu une mauvaise idée. Mais je suis comme meme étonné qu'il n'y ait pas de méthode pour pouvoir exploiter simplement une infomation soit dans le layout, view, controller etc.

C'est totalement faisable, la preuve, j'ai fais un système similaire déjà : https://github.com/prbaron/CakePHP-Install. Le plugin date un peu, je ne l'ai pas testé sur une version > 2.2.x.

Si tu veux un code plus à jour, je te conseille le repository Github de Croogo, c'est un CMS basé sur CakePHP.

Je n'ai à aucun moment dit que ce n'était pas possible, je dis que c'est simplement dommage de vouloir demander au framwork de lire des données supplémentaires, alors qu'il les lit nativement dans certains de ces fichiers.
Je te conseille juste de faire un peu de code PHP pour éviter des manipulations supplémentaires de la part du framework.