2009-12-13 6 views
0

J'utilise Symfony 1.2.9 (avec Propel ORM) pour créer un site Web. J'ai commencé à utiliser le générateur d'administration pour implémenter la fonctionnalité d'administration.Ajout d'interactions aux pages d'administration générées par le générateur d'administration

Cependant, je suis tombé sur un léger «problème». Mes modèles sont liés (par exemple, une table peut avoir plusieurs relations 1: N et plusieurs relations N: N). Je n'ai pas encore trouvé un moyen d'y remédier de manière satisfaisante. En tant que solution tactique (pour les vues de liste), j'ai décidé de montrer simplement l'objet parent, puis d'ajouter des interactions pour montrer les objets liés.

Je vais utiliser un modèle de blog pour illustrer cela.

Voici les relations pour un modèle de blog:

N: relation M avec blogroll (modèles un rouleau de blog) 1: N relation avec Blogpost (modèles un poste soumis à un blog)

I J'avais initialement prévu d'afficher la liste des articles de blog (paginés) pour un blog, quand il a été sélectionné, en utilisant AJAX, mais j'ai assez de mal avec le générateur d'admin tel qu'il est, donc j'ai mis de côté cette idée. jeter un peu de lumière sur la façon de le faire.

Au lieu de cela, ce que je fais maintenant (comme soln tactique/intermédiaire), est que j'ai ajouté des interactions à la vue de la liste qui permettent à un utilisateur de:

  1. Voir une liste du rouleau de blog le blog sur cette ligne

  2. Voir la liste des messages pour le blog sur cette ligne

  3. Ajouter un poste pour le blog sur tha ligne

Dans tout ce qui précède, j'ai écrit des actions qui vont essentiellement transmettre la requête à l'action appropriée (admin généré). Cependant, j'ai besoin de passer certains paramètres (comme l'id de blog etc), de sorte que la liste de blogue ou de blog, etc.

Je suis sûr qu'il ya une meilleure façon de faire ce que je veux faire, mais dans le cas où il n'y a pas ici mes questions:

  1. Comment puis-je obtenir l'objet qui se rapporte à un particulier rangée (de la
    cliqué sur le lien) dans la vue de la liste (par exemple l'objet de blog dans cet exemple)

  2. Une fois que je l'objet, je peux choisir d'extraire divers champs: id etc. Comment puis-je passer ces arguments à l'action générée par l'administrateur?

En ce qui concerne la deuxième question, je suppose que cela peut être la façon de le faire (je peux me tromper)

public function executeMyAddedBlogRollInteractionLink(sfWebRequest $request) 
{ 
    // get the object *somehow* (I'm guessing this may work) 
    $object = $this->getRoute()->getObject(); 

    // retrieve the required parameters from the object, and build a query string 
    $query_str=$object->getId(); 

    //forward the request to the generated code (action to display blogroll list in this case) 
    $this->forward('backendmodulename',"getblogrolllistaction?params=$query_string"); 
} 

Cela se sent comme un peu un hack, mais je suis Je ne sais pas comment faire autrement. Je ne suis pas non plus intéressé par l'envoi de params (qui peuvent inclure user_id etc via un GET, même un POST n'est pas beaucoup plus sûr, car il est assez facile de voir les demandes d'un navigateur).S'il y a une meilleure façon que ce que je suggère ci-dessus d'implémenter ce type d'administration qui est requis pour les objets avec 1 ou plusieurs relations M: N, je serai très heureux d'entendre la façon "recommandée" de le faire. Je me souviens d'avoir lu à propos du marquage de certaines actions comme internes. c'est-à-dire appelable à partir de seulement dans l'application. Je me demande si cela serait utile dans ce cas?

Répondre

0

Je suppose que votre application est appelée backend. Supposons qu'il existe deux modèles, BlogPost et BlogPostComment. Ceux-ci sont gérés à l'aide de modules générés par admin appelés blog_post et blog_post_comment. Je crois que vous voulez un lien pour chaque BlogPost affiché sur la page de liste à backend.php/blog_post. Les liens vous amènent à backend.php/blog_post_comment, qui ne devrait afficher que des commentaires relatifs à BlogPost.

Sous apps/backend/blog_post/modèles, créez un fichier appelé _commentslink.php et de mettre cela en elle:

<a href="<?php echo url_for('blog_post_comment_collection', array('action' => 'filter', 'blog_post_comment_filters[blogpost_id]'=>$blog_post->getId())) ?>">View Comments</a> 

Puis dans les applications/backend/blog_post/config/generator.yml, vous devez inclure cette partie dans les domaines de la vue de la liste:

.... 
param: 
    config: 
    list: 
     display: [ id, title, _commentslink ] 

Notez le _commentslink - le _ il dit d'utiliser une partie au lieu de chercher le terrain dans le modèle. Votre objet est disponible dans ce partiel comme < nom du modèle > - $ blog_post dans ce cas. Essentiellement, toute cette méthode fait des liens vers la même action que le filtre de la liste de commentaires, en lui transmettant la condition pertinente pour la filtrer par blogpost_id.

Si la protection CSRF est activée dans le backend, vous devez la désactiver ou cette méthode ne fonctionnera pas. Ceci est défini dans apps/backend/config/settings.yml. Il y aura un paramètre appelé csrf_secret - il devrait être défini sur false pour désactiver csrf.

Vous devriez essayer symfony 1.3/1.4 si vous avez besoin de support pour les relations 1: N dans les formulaires. 1.3 est dans mon expérience une mise à niveau relativement sans tracas de 1.2.x - 1.4 est la même chose, mais avec des fonctionnalités obsolètes supprimées.

+0

Bonjour ben - mes excuses pour le délai de réponse. En ce qui concerne votre suggestion ci-dessus, il y a un petit problème (au moins AFAI suis au courant). Les blogs et les blogs sont des modèles différents, appartiennent donc à différents modules. Il semblerait que dans votre solution, le modèle partiel doit être dans le même module ...? (* Soupir *) –

+0

Fondamentalement, je dois trouver un moyen de passer des paramètres d'un module à un autre, tout en utilisant des «interactions ajoutées» à la vue de la liste. C'est là que je viens de décoller ... –

+1

la _postlist partielle va dans le modèle de blog (j'aurais dû l'appeler liste de commentaires). Il est juste de le mettre là, c'est un lien vers une liste de commentaires relatifs à un article de blog particulier. – benlumley

Questions connexes