Bonjour,

J'ai externalisé du code dans un behavior Tag qui me permet d'ajouter des tags dans un champ texte "tag_string" (chaque mot clé est espacé par des virgules). Le code marche très bien, mais les tags sont utilisé pour différentes entités. Ce qui m'oblige à réecrire le même getter (_getTagString) pour chaque entité.

Y a-t-il moyen de mettre un getter dans un Behavior ?

Merci

7 réponses


Daniel68
Auteur
Réponse acceptée

Les Traits fonctionnent parfaitement. J'ai opté pour cette solution qui me semble la plus logique.
@Lartak si tu repasses par là et que tu à la solution pour "tout" faire dans le behavior je suis preneur.

Bonjour,

Ton getter fait il quelque chose de "spécial" ? Peux tu montrer le code de ta méthode _getTagString ?

Bonsoir.
As-tu au moins regardé dans la documentation comment créer/utiliser les behavior ?
Si c'est le cas, tu aurais du trouver la réponse à ta question.

Daniel68
Auteur

Bonsoir et merci pour vos retours.
J'ai beau cherché je ne trouve pas. J'ai essayé avec les tableaux de configuration, avec " implementMethod" ou encore en appelant ma méthode dans l'initialize, mais ça ne remplis pas automatiquement le formulaire.

Voici mon code pour _getTagString():

public function _getTagString() {
        if (isset($this->_properties['tag_string'])) {
            return $this->_properties['tag_string'];
        }
        if (empty($this->tags)) {
            return '';
        }
        $tags = new Collection($this->tags);
        $str = $tags->reduce(function ($string, $tag) {
            return $string . $tag->name . ', ';
        }, '');
        return trim($str, ', ');
  }

Cette methode marche si je l'utilise dans le fichier Table de l'entité, mais ne marche pas dans le behavior (même en passant $entity depuis initialize et quelques autres modifications).

Daniel68
Auteur

Bonjour,
Je reviens vers vous car je ne trouve toujours pas.
@Lartak tu me dis que c'est possible mais je ne vois aucun callback que je peux utiliser avant le rendu de la vue dans un behavior.
Je peux créer une méthode tagString() et l'utiliser dans mes fichiers table, mais ça m'oblige quand même à redéfinir le getter dans chacune des entités qui en a besoin.
Ce que j'essaye de faire c'est de définir un accesseur dans mon behavior.

Bonjour,

Dans ton premier post tu dis :
Ce qui m'oblige à réecrire le même getter (_getTagString) pour chaque entité. Y a-t-il moyen de mettre un getter dans un Behavior ?
Quand tu parles d'entité tu parles de tes classes XxxTable (qui hérite de Table) ou des classes XxxEntity (qui hérite d'Entity) ?
Car un Behavior est fait pour être utilisé dans tes classes qui héritent de Table avec addBehavior(...).

Dans ton cas, il me semble que tu veuilles réutiliser du code dans différentes Entity donc pas de Behavior utilisable.

Pour faire ce que tu demandes, créer une classe (TagStringEntity par exemple) contenant ta méthode _getTagString, ensuite tes classes XxxEntity héritent de Entity et de TagStringEntity (héritage multiple) ; ou alors TagStringEntity hérite de Entity et tes classes XxxEntity hérite de TagStringEntity ; dernière possibilité regardait du côté des traits ...

Dans le cas ou tu veuilles utiliser un Behavior, la solution serait de définir une methode (pas un getter, tagString par exemple) qui prendrait une Entity en paramètre et tu doit adapter le code de ton getter pour l'appliquer sur l'entité passée en paramètre. Ensuite tu l'utiliserai depuis un controller comme cela :

$tagString = $this->Model->tagString($enity);
Daniel68
Auteur

Merci Ferias pour ta réponse.
Quand je parle d'entité (là ou mon getter doit être) je parle du fichier Model/Entity/XXX.php qui hérite d'Entity.
D'après la doc Behavior (lien) je peux dans $_defaultConfig spécifier la clé "field".
J'ai donc essayé de créer une mixin qui retournerait le resultat dans le champ field, qui s'execute dans l'initialize. Mais ça ne marche pas.

Je reste étonné que le behavior ne peut pas "configurer le retour d'un champ". Si quelqu'un à la solution ?
Je n'ai jamais utilisé les traits mais d'après la doc cela me semble être une solution. je vais essayer de lancer un getter avec, et viens vous faire un retour.
Encore merci pour votre aide