Bonjour,
J'ai installer le plugin "Taxonomy" et je voudrais savoir où mettre "$this->Personne->addTerm( 'chien', 'animal'); " ?
Dans le vue car j'ai mis :
"<?php echo $this->Personne->addTerm( 'chien', 'animal'); ?>"
et j'ai ça comme erreur:
"Missing Helper
Error: PersonneHelper could not be found.
Error: Create the class PersonneHelper below in file: app\View\Helper\PersonneHelper.php
<?php
class PersonneHelper extends AppHelper {
}"
merci de votre aide =)
Bonjour.
Ce n'est pas le helper, tu ne dois donc pas l'utiliser sur une vue, c'est lié au Behavior (comportement).
C'est dans l'action de ton controller que tu dois l'utiliser.
Que veux tu faire exactement ?
d'accordah d'accord ! donc pour créer mes tags je suis obligé de le faire dans le controller si je comprends bien ? =)
donc pour créer mes tags je suis obligé de le faire dans le controller si je comprends bien ? =)
Non, ce n'est pas obligatoire, c'est uniquement si tu veux ajouter un tag pour un type de tag, directement dans l'action de ton controller sans passer par un formulaire.
Si tu veux ajouter de nouveaux tag par rapport à un type de tag depuis une vue, il te faut utiliser la méthode input
du helper Taxonomy
, soit :
<?= $this->Taxonomy->input('animal', ['label' => 'Nouvel animal']) ?>
Étant donné que c'est un élément de formulaire, il te faudra le placer à l'intérieur d'un formulaire.
D'accord je te remercie =), j'ai ajouté au helper 'Taxonomy.Taxonomy' mais ça me mets:
"Missing Helper
Error: TaxonomyHelper could not be found.
Error: Create the class TaxonomyHelper below in file: app\View\Helper\TaxonomyHelper.php
<?php
class TaxonomyHelper extends AppHelper {
}"
je suis en version 2.8.3 de cakephp =)
et petite question
je fais pour la partie Personnes mais j'aimerai que pour la partie film j'ajoute plusieurs personnes, peut on le faire grace à ce plugin ? merci =)
En cochant les cases et en validant j'ai ça comme erreur, je ne comprends pas pourquoi mes champs sont vides ??
Warning (2): Invalid argument supplied for foreach() [APP\Plugin\Taxonomy\Model\Behavior\TaxonomyBehavior.php, line 21]
Error: TaxonomyHelper could not be found.
Est-ce que tu l'as bien chargé avec la syntaxe de Plugin dans ton AppController ?
C'est à dire comme-ça :
public $helpers = ['Taxonomy.Taxonomy'];
Car vu l'erreur qui t'es retournée il cherche le helper Taaxonomy dans le dossier par défaut et non dans un plugin.
J'aimerai que pour la partie film j'ajoute plusieurs personnes, peut on le faire grace à ce plugin ?
Ce n'est pas prévu pour ce genre d'utilisation, à moins que ces personnes ne soient utilisées que comme des tags et qu'il n'y a pas d'autres informations qui soient associées avec elles.
En cochant les cases et en validant j'ai ça comme erreur, je ne comprends pas pourquoi mes champs sont vides ??
Warning (2): Invalid argument supplied for foreach() [APP\Plugin\Taxonomy\Model\Behavior\TaxonomyBehavior.php, line 21]
Tu disais que tu avais un problème avec le helper qu'il t'affichait une erreur, ce problème est réglé ?
Ensuite, le helper Taxonomy n'st pas prévu pour des checkbox, mais pour un input de type text
, il sert à ajouter des tags et non à en sélectionner des existant normalement.
Pourrais-tu montrer le code correspondant ?
en fait je reprends juste le tuto de Grafikart sur hasAndBelongsToMany car le tuto Taxonomy est vraiment dur pour moi, mais même ça je n'arrive pas à sauvegarder une profession(tags dans le tuto) ^^'
public function afterSave($created, $options = array()){
if(!empty($this->data['Personne']['professions'])){
$professions = explode(',',$this->data['Personne']['professions']);
foreach($professions as $profession){
$profession = trim($profession);
if(!empty($profession)){
$d = $this->Profession->findByName($profession);
if(!empty($d)){
$this->Profession->id = $id['Profession']['id'];
}
else{
$this->Profession->create();
$this->Profession->save(array(
'name'=>$profession
));
}
$this->PersonnesProfession->creat();
$this->PersonnesProfession->save(array(
'personne_id' => $this->id,
'profession_id' => $this->Profession->id
));
}
}
}
return true;
}
comment implémente t-on afterSave?
c'est bon j'ai trouvé ! en fait j'utilise le plugin de l'upload et il utilise deja la fonction afterSave(); , comment faire pour activer les deux ? je mets le contenu de la methode dans l'autre ? ou je surcharge la méthode ?
Si tu utilises le plugin Taxonomy, il est inutile de vouloir sauvegarder les tags de ton côté puisque le plugin le fait déja pour toi.
Sinon, afterSave
est un callback
de modèle, il te faut donc créer la fonction dans le modèle correspondant et non dans le controller, voir sur ce tutoriel vidéo : Les Models » Méthodes After et Before.
Pour information, tu ne dois pas utiliser les Types Magiques de Recherche dans le model, ni utiliser le nom du modèle, il te faut faire :
$this->find(/* ... */);
Et non :
$this->Profession->find(/* ... */);
SI tu implémentes bien ton callback afterSave
et qu'il n'est pas exécuté, c'est que le behavior du plugin Upload prend la priorité sur ton modèle lié et qu'il y a eu une erreur lors du callback
du Plugin ou du moins d'une fonction qu'il appelle depuis son afterSave
.
Dans tous les cas, le callback afterSave
d'un plugin ou de quelconque Behavior n'est pas censé écraser ton callback et je ne pense pas que Grafikart ait fait une erreur dans ce sens dans les codes qu'il propose.
En fait dès que j'enleve l'appelle du plugin ça remarche je peux ajouter des tags hors là c'est le plugin de l'upload qui prend le dessus =/
public function afterSave(Model $model, $created, $options = array()){
$data = $model->data;
foreach($this->options[$model->alias]['fields'] as $field => $path){
if(
isset($data[$model->alias][$field . '_file']) &&
!empty($data[$model->alias][$field . '_file']['name']) &&
(
!$model->whitelist ||
empty($model->whitelist) ||
in_array($field, $model->whitelist)
)
){
$file = $data[$model->alias][$field . '_file'];
$extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
$path = $this->getUploadPath($model, $path, $extension);
$dirname = dirname($path);
if(!file_exists(WWW_ROOT . $dirname)){
mkdir(WWW_ROOT . $dirname, 0777, true);
}
$model->deleteOldUpload($field);
$model->move_uploaded_file(
$file['tmp_name'],
WWW_ROOT . $path
);
chmod(WWW_ROOT . $path, 0777);
$model->saveField($field, '/' . $path);
}
}
}
il n'y a pas moyen de surcharger la méthode ? Comme ça on peut appeler les deux fonctions
Pour information, et c'est dans la documentation :
Tous les callbacks des behaviors sont lancés avant les callbacks du model
Source : Behaviors (Comportements) » Callbacks du Behavior.
Donc, quel que soit les callback que tu auras sur tes modèles, ils ne seront pas interprétés avant ceux des Behavior.
Comment faire pour activer les deux ? je mets le contenu de la methode dans l'autre ? ou je surcharge la méthode ?
Si tu veux parler d'activer les Behavior, il suffit que tu les déclares dans la variables $actsAs
des modèles dans lesquels tu veux les utiliser, tu n'as pas besoin de modifier un Behavior/Plugin pour que les bahavior que tu définies dans ton modèle soient utilisés par ton application.
oui je sais pour le $actsAs, mais ce que je veux savoir c'est est ce possible de faire plusieurs methode afterSave()? =)
est ce possible de faire plusieurs methode afterSave()? =)
Tu ne peux en créer qu'une méthode par modèle (ce qui est logique étant donné qu'une classe ne peut pas avoir plus d'une méthode avec le même nom), mais rien n'empêche le fait que d'autres classes aient aussi un callback de ce même nom.
Si tu voulais demander si le fait que les Behavior des plugins Taxonomy et Upload aient également le callback et qu'ils s'exécutent les uns après les autres ne risque pas de poser de problème, la réponse est non, c'est justement l'intérêt.
du coup si je veux faire Profession (type tags) et Nationalité (aussi un type tags) je dois faire tout dans la même méthode ? =)
Si je comprends bien, tu n'utilises plus le plugin Taxonomy.
Dans ce cas, tu ne peux pas le faire dans le même modèle, il te faut le faire dans chaque modèle concerné : Profession dans le callback afetrSave du modèle Profession et Nationalite dans le callback afterSave du modèle Nationalite
.
pourtant dans le tuto il met bien dans post.php et pas dans tag.php. je voudrais ajouter les deux elements dans personne (dans le tuto ça ressemble à post) c'est ça le soucis :/
donc c'est impossible que deux aftersave() s'execute dans un meme formulaire ?
public $actsAs = array(
'Upload.Upload' => array(
'fields' => array(
'photo' => 'img/photos/:id1000/:id'
)
),
'containable'
);
dans mon model Personne
public function afterSave($created, $options = array()){
if(!empty($this->data['Personne']['professions'])){
$professions = explode(',',$this->data['Personne']['professions']);
foreach($professions as $profession){
$profession = trim($profession);
if(!empty($profession)){
$d = $this->Profession->findByName($profession);
if(!empty($d)){
$this->Profession->id = $d['Profession']['id'];
}
else{
$this->Profession->create();
$this->Profession->save(array(
'name'=>$profession
));
}
$this->PersonneProfession->create();
$this->PersonneProfession->save(array(
'personne_id' => $this->id,
'profession_id' => $this->Profession->id
));
}
}
}
return true;
}
j'appelle les deux normalement les deux devraient fonctionner car l'un est un plugin donc dans un autre model et l'autre est dans ce model