Bonjour,
voila depuis cet apm, j'ai un soucis qui semble insurmontable.

J'ai créé un helper, qui, pour faire court, permet de parcourir une liste de mot clef et de retourner un chaine a l'ensemble de mes vues ou il est appelé.

Par exemple, dans une vue j'appelle mon helper de cette facon :

<?php echo $this->Keyword->findKeywords("ma chaine de caractères"); ?>

et le helper est le suivant :

<?php
class KeywordHelper extends AppHelper {
    function findKeywords($text) {
        $keyword = "chaine";
        echo str_ireplace($keyword, "<a href='#' class='keywordlink'>$keyword</a>", $text);
    }
}   
?>

Cependant, le keyword dans mon helper, devrai être le resultat d'un find qui se trouve dans appcontroller, ce tableau ($result) est bien accessible dans toutes mes vues mais pas dans mon helper.

Voici appController

function beforeFilter() {
        $this->loadModel('allKeywords');
        $result = $this->allKeywords->find('all', array(  ));
        $this->set(compact('result'));
    }

Comment faire pour récupérer $result que mon helper?
Merci infiniment pour votre aide !

7 réponses


Appeler un modèle depuis un helper c'est assez anti MVC. Dans ton cas, moi je serais parti sur un behavior qui, dans une petite méthode beforeSave, analyse et traite tes mots clés dans le contenu.

Emodroid
Auteur

Alors je veux bien un peu plus de détail ou un exemple de ta solution amethyste, en gros j'ai besoin d'une fonction globale qui est capable de lire les variables traitée dans appController.

Merci beaucoup pour ton aide !

Bé par exemple, commence par relier entre eux tes 2 modèles (Article hasMany Keyword). Ensuite, dans la fonction beforeSave du modèle Article, tu analyses le champ de texte, de la même manière que tu le faisais dans ton helper. Sauf que cette fois, tu as accès aux keywords en faisant un simple $this->Keyword->find('list'); depuis le modèle Article. Finalement remplace ton champ texte par le nouveau, cake va ensuite sauvegarder.

Passe simpelment ton $result comme second argument de ton helper et tu y aura accés !

Dans ta vue

<?php echo $this->Keyword->findKeywords("ma chaine de caractères", $result); ?>

Dans ton helper

function findKeywords($text, $keyword = null) {
    if (empty($keyword)) {
        return;
    }
    echo str_ireplace($keyword, "<a href='#' class='keywordlink'>$keyword</a>", $text);
}
Emodroid
Auteur

Merci GzZmo, l'idée est bon mais mon fonction keywords() je vais l'appeler des milliers de fois, ca m'arrange pas trop mais si y a pas d'autre solution, je prend :)

L'idée, pour réduire la charge, c'est d'enregistrer ton contenu directement avec les liens sur les keywords à la création ou la modification, au lieu de changer le contenu à chaque affichage. Donc le helper n'est pas approprié, sauf si tu as un maxi portefeuille et que tu peux pallier avec du hardware ...

Tu pourrais faire ta requête une fois dans ton AppController (ou dans un Component que tu lancerai dans l'AppController), tu passes le résultat de cette requête en session, comme ca tu ne fais qu'une fois ta requète et tu y as accès partout (controllers, views, helpers) avec $this->Session->read(...);