[Symfony] Admin generator et rubrique / sous rubrique

Mammouth du PHP | 965 Messages

24 juin 2009, 17:20

Bonjour à tous,

Je vais expliquer un problème que je rencontre souvent avec symfony :

Mettons que j'ai une liste d'annonce à créer, je fais ma table annonce et je configure l'admin generator, jusque là aucun soucis. Ensuite je voudrais rajouter à cette annonce une liste non exhaustive de photos, qui peuvent aller de 1 à 50 admettons. Cette liste de photo est donc lié à mon annonce.

C'est la que les problèmes commencent, j'ajoute donc une action dans object_action de mon admin generator pour avoir un icon 'liste des images', malheureusement pour moi j'ai creer une table annonce_image lié avec le annonce_image.ANNONCE_ID = annonce.ID. Donc impossible de rediriger dans le même module il faut éditer manuellement le _list_td_actions.php. Je n'ai pas trouver d'autre moyen il en existe ?

Donc j'ai bien ajouter mon action qui redirige maintenant vers annonce_image/list qui est aussi générée par l'admin generator.

Maintenant j'aimerais que dans cette liste je retrouve bien le nom de l'annonce associée, j'ai donc éditer manuellement l'action comme suit :
  
protected function addFiltersCriteria($c)
{
    parent::addFiltersCriteria($c);
 
    $c->add(AnnonceImagePeer::ANNONCE_ID, $this->getRequestParameter('id'));
}
Donc j'ai la jointure de faire et j'ai ajouter :

Code : Tout sélectionner

peer_method: doSelectJoinAnnonce
dans le generator.yml

Maintenant 2 questions :

1) comment je fais pour avoir le titre de l'annonce comme ça :

Code : Tout sélectionner

title: Liste des images pour l'annonce %%titre%%
2) comment je fais pour que dans chaque action il me retrouve bien l'ID pour faire les retour à tel ou tel action ?

Je pense que je nage avec tout ça et je sais pas si c'est la bonne méthode ce que je veux faire est vraiment simple mais impossible d'avoir des informations la dessus et j'ai l'impression d'être le premier à rencontrer ce genre de problème.

Quelqu'un pourrait-il m'éclaire ?

ViPHP
ViPHP | 2287 Messages

25 juin 2009, 11:47

Hello agité ( essayons tout de même de rester calmes :lol: )

Quelques explications (surtout pour ta première question, la deuxième je ne la comprends pas très bien désolé) :

Une interface d'admin générée est centrée sur une classe métier donnée (celle que tu fournis en ligne de commande pour créer le module). Tu la retrouves aussi tout au début du generator.yml, dans la clé generator/param/model_class :

Code : Tout sélectionner

generator: class: caliAdminGenerator param: # La classe métier qui donne la structure de base de ce module d'administration model_class: MailingSourceHasMarque theme: calimero
Pour les %%variable%%s du generator.yml, elles sont simplement substituées par un appel du type
$objet_metier->getVariable()
dans le code PHP généré.

Si tu as besoin d'appeler une donnée (par exemple "nom") depuis une table liée (dans mon exemple "marque"), il suffit donc d'écrire la méthode accesseur (getter) getNomMarque() dans ta classe métier.

A noter que le choix du nom de la méthode est libre (tant que tu respectes la convention lowerCamelCase), j'aurai pu choisir getTartempion() pour le même résultat. Je la nomme ainsi pour pouvoir relire le code plus facilement par habitude et que ça se marie bien avec du code utilisant les vrais getters de l'objet.

Cette méthode se chargera d'explorer l'objet lié et de retourner la valeur qui va bien pour ton generator.yml. Attention, charge à toi de bien t'assurer que l'exploration d'objet lié puisse se faire (Avec notamment une jointure si tu ne veux pas multiplier les requêtes SQL, ce qu'on a vu dans ton dernier post, et un petit test dans la méthode pour lancer une exception en cas de pépin dans l'appel d'objet lié).

Au delà de ton besoin, le truc intéressant c'est qu'une fois que tu as réalisé ce getter tu disposes maintenant d'un pseudo-champ "nom_marque" qui est utilisable dans ta list view, comme si il existait dans la table. Appelons ça un champ virtuel (la classe non ? 8-) )

Côté generator.yml :

Code : Tout sélectionner

list: # notre variable dans le titre title: Associations pour la marque %%nom_marque%% # cool, on peut aussi l'utiliser en tant que champ dans la list view ! display: [ mailing_source, nom_marque ]
Côté modèle (lib/model/MailingSourceHasMarque.php) on a :
Class MailingSourceHasMarque extends BaseMailingSourceHasMarque{
// ....
  public function getNomMarque(){
    // On retourne le nom de la marque liée en explorant les relations entre les objets.
    // Ma table mailing_source_has_marque a une clé étrangère marque_id renvoyant vers le
    // champ id de la table marque (qui a aussi un champ "nom", réel ou virtuel).
    if($marque=$this->getMarque()){
      return $marque->getNom();
    }
    // Si on arrive ici c'est que nous n'avons pas de marque correspondante 
    // (ça peut être le cas sur un objet nouvellement créé par exemple) :
    throw new Exception("La marque #".$this->getMarqueId()." n'existe pas");
  }
}

Pour la vue d'édition ce serait aussi possible, à condition d'écrire un setter et de tenir compte de quelques cas particuliers, notamment le cas de la création d'un nouvel objet (qui utilise aussi l'edit view mais sur un objet avec des propriétés par défaut, dont les clés étrangères ne sont pas initialisées et donc l'exploration des relations ne peut pas se faire).
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Mammouth du PHP | 965 Messages

25 juin 2009, 11:55

Merci pour ta réponse Calimero,

Voilà j'ai fais en sorte que la variable getTitre() soit présente au niveau du modèle :
  
public function getTitre()
{
  return $this->getTitre();
}
Je ne vois pas quoi écrire de mieux étant donné que j'ai fais la liaison dans le generator.yml à ce niveau :

Code : Tout sélectionner

list: peer_method: doSelectJoinAnnonce
Dans ma requête je retrouve bien la liaison donc je ne comprends pas que getTitre() ne marche pas même sans l'avoir dans le modèle il devrait retrouver le titre non ?

Hors j'ai une erreur de type :

Code : Tout sélectionner

Notice: Undefined variable: annonce_image in hxxx/web/cache/backend/dev/modules/autoAnnonce_image/templates/listSuccess.php on line 12 Fatal error: Call to a member function getTitre() on a non-object in /xxx/web/cache/backend/dev/modules/autoAnnonce_image/templates/listSuccess.php on line 12
Je rappel que je suis sous sf 1.0

La seconde question concerne donc les actions liés à l'annonce en cours par exemple je suis bien redirigée sur annonce_image/list/id/xx qui correspond à l'id de l'annonce.

J'aimerais que cette id soit transféré pour les action edit et save pour retourner sur la liste liée à cette annonce.

J'espère que c'est plus clair comme ça :)

ViPHP
ViPHP | 2287 Messages

25 juin 2009, 12:24

Voilà j'ai fais en sorte que la variable getTitre() soit présente au niveau du modèle :
  
public function getTitre()
{
  return $this->getTitre();
}
Je ne vois pas quoi écrire de mieux étant donné que j'ai fais la liaison dans le generator.yml à ce niveau :

Code : Tout sélectionner

list: peer_method: doSelectJoinAnnonce
Dans ma requête je retrouve bien la liaison donc je ne comprends pas que getTitre() ne marche pas même sans l'avoir dans le modèle il devrait retrouver le titre non ?

Hors j'ai une erreur de type :

Code : Tout sélectionner

Notice: Undefined variable: annonce_image in hxxx/web/cache/backend/dev/modules/autoAnnonce_image/templates/listSuccess.php on line 12 Fatal error: Call to a member function getTitre() on a non-object in /xxx/web/cache/backend/dev/modules/autoAnnonce_image/templates/listSuccess.php on line 12
Je rappel que je suis sous sf 1.0
Euh, si tu regarde bien la méthode que tu as écrite, tu comprendras qu'elle ne sert pas à grand-chose :lol: . Je pense que t'as dû louper un détail dans mon explication du post précédent, notamment au niveau de l'exploration des objets liés. Pense aussi à préciser dans quelle classe tu te situes quand tu copies une méthode comme ça stp, pour qu'on y voie clair :-)

La seconde question concerne donc les actions liés à l'annonce en cours par exemple je suis bien redirigée sur annonce_image/list/id/xx qui correspond à l'id de l'annonce.

J'aimerais que cette id soit transféré pour les action edit et save pour retourner sur la liste liée à cette annonce.

J'espère que c'est plus clair comme ça :)
Ok je vois mieux. Là par contre ça va pas être aussi simple, tu es pile dans le cas où le générateur montre ses limites.

Pour faire ça il va te falloir ajouter la transmission de ta variable id à différents endroits dans le code généré. Je te conseille d'abord d'aller voir dans /cache/ton_app/dev/modules/autoTonModule/ pour te familiariser avec le code généré et comment il fonctionne.

Si tu veux faire des modifications dans les actions et templates générées :
- Pour un template, il te suffit d'enregistrer ton fichier modifié dans le répertoire standard de ton module avec le même nom. Ton fichier va automatiquement être inclus en lieu et place de celui créé par le générateur dans /cache/...
- Pour une action, même principe sauf que là on parle de classes et donc il te suffit de surcharger la
méthode pour bénéficier de l'héritage qui est déjà en place entre la classe actions de ton module (au départ vide) et celle générée (dont la première hérite via le mot-clé extends). Ta méthode sera utilisée en lieu et place de celle générée.

Bien sûr je te recommande de ne pas surcharger en partant de zéro (méthodes et fichiers vides) mais en copiant/collant depuis les fichiers générés équivalents.

Si tu te lances là dedans, je te conseille en premier lieu de bien finaliser ton generator.yml avant de surcharger le code généré, car une fois que tu te lanceras dans les modifications tu constateras que la souplesse apportée par le generator.yml se perd un peu (proportionnellement au nombre de fichiers/méthodes que tu vas surcharger en fait, comme ils ne seront plus générés mais sous ta responsabilité, ça va "figer" la configuration du module).
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Mammouth du PHP | 965 Messages

26 juin 2009, 16:38

Ok merci pour tout Calimero j'vais rentrer dans le code et refaire les fichier créer par le generator je restais pourtant persuader qu'on pouvait faire quelque chose comme cela en bidouillant un peu le fichier generator.yml.

Ca reste tout de même un outil très pratique cela dit.

ViPHP
ViPHP | 2287 Messages

26 juin 2009, 16:47

Ok merci pour tout Calimero j'vais rentrer dans le code et refaire les fichier créer par le generator je restais pourtant persuader qu'on pouvait faire quelque chose comme cela en bidouillant un peu le fichier generator.yml.

Ca reste tout de même un outil très pratique cela dit.
Pour ton besoin, je ne pense pas qu'on puisse avoir mieux (ceci dit j'adorerais qu'un autre symfonien passant ici me contredise là-dessus :) )

J'ai travaillé un moment sur quelquechose qui couvre en partie ce que tu veux faire en utilisant les filtres. Ca peut marcher si tu n'as besoin de l'id parent que sur la list view. En revanche toi tu voulais aussi l'exploiter sur l'edit view (les filtres n'y sont pas transmis, et de plus la même edit view étant utilisée pour la création d'un enregistrement vierge, ça va pas le faire pour ce cas vu que la valeur ne peut pas être récupérée depuis l'objet en cours d'édition. Par contre, si tu es intéressé, j'ai vu une fois dans les snippets de symfony-project.org un bout de code pour transmettre la valeur d'un filtre à la vue d'édition dans le contexte d'une création, pouvant ainsi pallier ce manque, donc y'a peut-être quelquechose à creuser... Mais il faut avoir le temps et le goût d'expérimenter :D ).

N'hésite pas à poster ici si tu as d'autres questions ou si tu trouves mieux.
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Mammouth du PHP | 965 Messages

29 juin 2009, 12:05

Bon en ayant fait le generator.yml pour annonce_image j'ai ça :

Code : Tout sélectionner

generator: class: sfPropelAdminGenerator param: model_class: AnnonceImage theme: default list: peer_method: doSelectJoinAnnonce peer_count_method: doCountJoinAnnonce object_actions: _edit: ~ _delete: ~ actions: _create: ~ retour: { name: Retour à la liste des programme } title: Liste des images pour l'annonce %%titre_annonce%% display: [annonce, photo] edit: title: Fiche photo annonce fields: description: { params: size=80x3 } photo: type: admin_input_file_tag upload_dir: annonce params: include_link=annonce include_text="Voir photo // " include_remove=true actions: _list: ~ _save_and_list: ~ _save_and_add: ~
Et j'ai bien ajoute la méthode au modèle :
class AnnonceImage extends BaseAnnonceImage
{
  public function getTitreAnnonce()
  {
    if($annonce = $this->getAnnonce()) {
      return $annonce->getTitre();
    }
    
    throw new Exception("L'annonce : ".$this->getAnnonceId()." n'éxiste pas");
  }
Malheureusement ce message est indiqué :

Code : Tout sélectionner

Notice: Undefined variable: annonce_image in /xxx/web/cache/backend/dev/modules/autoAnnonce_image/templates/listSuccess.php on line 12 Fatal error: Call to a member function getTitreAnnonce() on a non-object in /xxx/web/cache/backend/dev/modules/autoAnnonce_image/templates/listSuccess.php on line 12
Et dans l'action executeList je me rends compte qu'il utilise sfPropelPager donc fatalement il ne doit rien trouver qui correspond à la variable $annonce_image.

ViPHP
ViPHP | 2287 Messages

29 juin 2009, 17:24

C'est parti pour le pavé. :lol:

D'abord on va voir un cas général sur le passage de paramètres entre l'action, son partial (template) et un sous-partial (pour rester simple on va oublier le générateur pour l'instant, vu qu'il respecte en tous points cette logique).

On va imaginer qu'on se trouve dans un projet (site) nommé myproject, dans une application nommée myapp, dans un module appelé mymodule et une action intitulée myaction. On a une variable à transmettre qui s'appelle myvariable et qui contient une valeur extrêmement utile : 123456.

----------------------------------------------------------
Exemple simple sans générateur :


Côté action, on a :
<?php
// fichier : /myproject/apps/myapp/modules/mymodule/actions/actions.class.php

// Il y a deux façons d'écrire ses actions pour un module (on peut aussi utiliser les deux dans un même module) : 
// 1: - soit une classe pour toutes les actions (le cas classique, ce que fait le générateur, et ce que nous faisons ici)
// 2: - soit une classe pour chaque action.

// Pour le cas n°1, le fichier contenant la classe s'appelle toujours module/actions/actions.class.php
// et la classe doit toujours hériter de sfActions (directement, comme ici, ou indirectement, comme avec le générateur)
class MymoduleActions extends sfActions{

  // Voici notre méthode spécifique à l'action :
  public function executeMyaction(){

    // Ici nous instancions notre variable :
    $variable = 123456;

    // Ici nous la rendons disponible dans le partial sous le nom myvariable :
    $this->myvariable = $variable;

    // une action qui se termine normalement doit toujours renvoyer cette valeur
    // (on peut aussi ne pas la spécifier, car symfony la rajoute par défaut)
    return sfView::SUCCESS;
  }
}
Côté partial, on a :
<!-- fichier : /myproject/apps/myapp/modules/mymodule/templates/myactionSuccess.php -->
<?php 
// On teste si la variable a bien été transmise :
  echo 'Premier fichier : '.$myvariable; // 123456
?>
<?php 
// Transmission explicite des variables au sous-template sous forme de paires clé => valeur
include_partial('mysubpartial', array(
  'myvariable' => $myvariable
)); 
?>
<!-- fichier : /myproject/apps/myapp/modules/mymodule/templates/_mysubpartial.php -->
<?php 
// On teste si la variable a bien été transmise :
  echo 'Second fichier : '.$myvariable; // 123456
?>
Exemple à l'appui on a donc vu que :
- Le premier partial (myactionSuccess) reçoit ses variables à partir des propriétés de l'objet action qui le lance.
- Les sous-partials reçoivent leurs variables de manière explicite lors de l'inclusion par le partial parent.

On peut se représenter les partials sous forme de hiérarchie (entre crochets, les variables transmises) :

Code : Tout sélectionner

-Action:myaction +--myactionSuccess [myvariable] +--_mysubpartial [myvariable]
----------------------------------------------------------
Avec le générateur :

Le générateur crée à ta place un certain nombre d'actions et leurs partials (et sous-partials) correspondants, dans un répertoire de cache (pour ne pas les mélanger avec ceux que tu écris).
Ce processus de génération est contrôlé par le fichier mymodule/config/generator.yml . La classe actions du répertoire principal de ton module étend par héritage de classes la classe action générée par le générateur
( qui s'appelle, elle, autoMymoduleActions ). A noter également que le processus d'inclusion de symfony (et include_partial() qu'on a vu plus haut utilise aussi ce principe) est capable d'aller chercher dans plusieurs répertoires avec une gestion de priorité. Conséquences :

- Si tu veux surcharger le code d'une action générée, il te suffit de réécrire la méthode concernée dans ta classe mymoduleActions en veillant à bien recopier l'en-tête (prototype) de la méthode ( sinon : erreur php )
- Si tu veux surcharger un partial, ou sous-partial, il te suffit de créer dans ton répertoire mymodule/templates/ un fichier de même nom. Il sera utilisé en lieu et place du fichier généré.
- Si tu surcharges un partial qui appele des sous-partials, il te faut bien respecter la chaîne d'inclusion des sous-partials en la réécrivant (à moins de savoir ce que tu fais). Mais tu peux aussi ajouter des paramètres aux appels à include_partial() et c'est surtout ça que tu as besoin de faire dans ton cas, agité.

Voici la hiérarchie du module créé par le générateur d'admin (pour une classe métier Myobject):

Code : Tout sélectionner

-Action:index (alias pour list) -Action:list +--listSuccess [pager, filters] +--_list_header [pager] +--_list_messages [pager] +--_filters [filters] +--_list [pager] +--_list_th_tabular +--_list_th_stacked +--_list_td_tabular [myobject] +--_list_td_stacked [myobject] +--_list_td_actions [myobject] +--_list_actions +--_list_footer [pager] -Action:create (alias pour edit) -Action:edit +--editSuccess [myobject, labels] +--_edit_header [myobject] +--_edit_messages [myobject, labels] +--_edit_form [myobject, labels] +--_edit_actions [myobject] +--_edit_footer [myobject]


Est-ce que tu vois mieux ce qui te reste à faire maintenant ? :wink:
----------------------------------------------------------
Le pager c'est quoi ?

C'est une classe symfony qui est capable de gérer une liste d'objet avec gestion d'affichage page par page. En gros c'est l'objet qui te permet d'avoir le gros tableau de ta list view, avec le total d'éléments trouvés... ainsi que la pagination |< < 1 2 3 > >|. Mais pour simplifier on peut le voir uniquement comme une liste d'objets, tout bêtement. On le lit dans une boucle et les objets sortent un à un.
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Mammouth du PHP | 965 Messages

30 juin 2009, 10:47

Bon je crois avoir compris le principe, mais certains points m'échappent.

J'ai refait les Templates :
_edit_actions.php
_list_actions.php
_list_td_actions.php
_photo.php (un partial pour afficher la photo)

Pour pouvoir passer d'une action à l'autre sans être bloquer tout ça sans jamais toucher de trop les fichiers maintenant c'est à l'enregistrement que je galère.

Dans les Templates édités je peux aller vers les listes, mais les actions "Create" et "Save" me posent problème, pour l'instant je fais passer le paramètre par $_GET de l'id de l'annonce comme ceci :
<?php
// auto-generated by sfPropelAdmin
// date: 2009/06/29 15:19:15
?>
<ul class="sf_admin_actions">
    <li><?php echo button_to(__('list'), 'annonce_image/list?id='.$sf_request->getParameter('id_ann'), array (
  'class' => 'sf_admin_action_list',
)) ?></li>
    <li><?php echo submit_tag(__('save and list'), array (
  'name' => 'save_and_list',
  'class' => 'sf_admin_action_save_and_list',
)) ?></li>
    <li><?php echo submit_tag(__('save and add'), array (
  'name' => 'save_and_add',
  'class' => 'sf_admin_action_save_and_add',
)) ?></li>
</ul>
Arrivé au moment de l'enregistrement et je fais ça :
  protected function updateAnnonceImageFromRequest()
  { 

    die($this->getRequestParameter('id_ann'));
    $annonce_image = $this->getRequestParameter('annonce_image');
    $this->annonce_image->setAnnonceId($annonce_id);
    
    parent::updateAnnonceImageFromRequest();
  }
Pour être sur d'avoir l'identifiant et en utilisant la méthode parent et bien ça ne fonctionne pas je ne comprends pas entre les forward et les redirect ce qui change mais le paramètre est perdu en cours de route.

Bon voilà j'ai presque réussi à faire ce que je voulais sans trop modifier les corps des templates c'est à dire les actions, pour l'action delete j'ai fais la même chose en ajoutant la redirection à la fin :
return $this->redirect('annonce_image/list?id='.$this->getRequestParameter('id_ann'));
Par contre pour les noms je pense avoir compris enfin afficher le titre de l'annonce, il faut que je reprenne l'action dans le cache que j'ajoute un
$this->annonce = AnnoncePeer::retrieveByPk($this->getRequestParameter('id');
et ensuite le gérer avec le generator.yml

ViPHP
ViPHP | 2287 Messages

30 juin 2009, 11:38

Bon je crois avoir compris le principe, mais certains points m'échappent.

J'ai refait les Templates :
_edit_actions.php
_list_actions.php
_list_td_actions.php
_photo.php (un partial pour afficher la photo)

Pour pouvoir passer d'une action à l'autre sans être bloquer tout ça sans jamais toucher de trop les fichiers maintenant c'est à l'enregistrement que je galère.

Dans les Templates édités je peux aller vers les listes, mais les actions "Create" et "Save" me posent problème, pour l'instant je fais passer le paramètre par $_GET de l'id de l'annonce comme ceci :
<?php
// auto-generated by sfPropelAdmin
// date: 2009/06/29 15:19:15
?>
<ul class="sf_admin_actions">
    <li><?php echo button_to(__('list'), 'annonce_image/list?id='.$sf_request->getParameter('id_ann'), array (
  'class' => 'sf_admin_action_list',
)) ?></li>
    <li><?php echo submit_tag(__('save and list'), array (
  'name' => 'save_and_list',
  'class' => 'sf_admin_action_save_and_list',
)) ?></li>
    <li><?php echo submit_tag(__('save and add'), array (
  'name' => 'save_and_add',
  'class' => 'sf_admin_action_save_and_add',
)) ?></li>
</ul>
Arrivé au moment de l'enregistrement et je fais ça :
  protected function updateAnnonceImageFromRequest()
  { 

    die($this->getRequestParameter('id_ann'));
    $annonce_image = $this->getRequestParameter('annonce_image');
    $this->annonce_image->setAnnonceId($annonce_id);
    
    parent::updateAnnonceImageFromRequest();
  }
Pour être sur d'avoir l'identifiant et en utilisant la méthode parent et bien ça ne fonctionne pas je ne comprends pas entre les forward et les redirect ce qui change mais le paramètre est perdu en cours de route.
Tu as bien compris le problème, il va te falloir surcharger executeEdit() et modifier les redirections pour prendre en compte ton id parent. Tout ça ça commence à faire beaucoup de code à surcharger, j'en conviens... :? Il se peut aussi que tu aies quelques autres méthodes à surcharger dans les actions, sur le même principe...

Bon voilà j'ai presque réussi à faire ce que je voulais sans trop modifier les corps des templates c'est à dire les actions, pour l'action delete j'ai fais la même chose en ajoutant la redirection à la fin :
return $this->redirect('annonce_image/list?id='.$this->getRequestParameter('id_ann'));
Si je te suis bien donc, pour la liste tout fonctionne bien. C'est bien ça ?
Par contre pour les noms je pense avoir compris enfin afficher le titre de l'annonce, il faut que je reprenne l'action dans le cache que j'ajoute un
$this->annonce = AnnoncePeer::retrieveByPk($this->getRequestParameter('id');
et ensuite le gérer avec le generator.yml
Nickel tout ça, en effet si tu as défini une méthode Annonce::__toString() ça passe tout seul et y'a même pas de méthode à ajouter :pouce:
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Mammouth du PHP | 965 Messages

30 juin 2009, 11:57

Ok maintenant j'ai résolu comme ça pour édition / sauvegarde :
  public function executeEdit()
  {
    $this->annonce_image = $this->getAnnonceImageOrCreate();

    if ($this->getRequest()->getMethod() == sfRequest::POST)
    { 
      $this->updateAnnonceImageFromRequest();

      $this->saveAnnonceImage($this->annonce_image);

      $this->setFlash('notice', 'Your modifications have been saved');

      if ($this->getRequestParameter('save_and_add'))
      {
        return $this->redirect('annonce_image/create?id_ann='.$this->getFlash('annonce_id'));
      }
      else if ($this->getRequestParameter('save_and_list'))
      {
        return $this->redirect('annonce_image/list?id='.$this->getFlash('annonce_id'));
      }
      else
      {
        return $this->redirect('annonce_image/edit?id='.$this->annonce_image->getId());
      }
    }
    else
    {
      $this->labels = $this->getLabels();
      $this->setFlash('annonce_id',$this->getRequestParameter('id_ann'));
    }
  }
Et ensuite un :
  protected function updateAnnonceImageFromRequest()
  { 
    $annonce_image = $this->getRequestParameter('annonce_image');
    $this->annonce_image->setAnnonceId($this->getFlash('annonce_id'));
    
    parent::updateAnnonceImageFromRequest();
  }
C'est moche mais j'ai rien trouver de mieux que seFlash getFlash pour pas surcharger le template.

Par contre pour les erreur il me redirige toujours vers /create/ et je ne vois pas ou modifier la redirection vu que ce n'est pas dans executeHandleErrorEdit() ?

ViPHP
ViPHP | 2287 Messages

30 juin 2009, 14:22

Peut-être que la réponse à ce souci peut se trouver là-dedans : http://www.symfony-project.org/book/1_0 ... ng_methods

Il me faudrait plus d'infos pour pouvoir comprendre et reproduire ton souci (dans quelles conditions te renvoie-t'il sur create, etc...).
if(!@work()){ Nespresso(); } else { what(); }
______________________________