2010-12-16 6 views
1

Hey Leute, ich habe die Symfony admin generator für ein Modul verwendet.Symfony Admin Generator Formular Objekt

Alles funktioniert, aber wenn das Formular für mein Modell instanziiert wird, muss ich meine eigene Option übergeben.

Ich könnte dies selbst tun durch Überschreiben der executeNew, executeCreate Funktionen in myModuleActions.class.php (die myModuleAutoActions erweitert).

Aber ich hatte auf eine bessere Lösung gehofft?

Vielleicht ist das Überschreiben einer der Konfigurationsklassen der richtige Weg. Ich muss im Grunde das aktuelle sf_user Objekt ($this->getUser) als eine "sf_user" -Option für das Formular hinzufügen, um die Verwendung von sfContext in der myModuleForm zu vermeiden.

Irgendwelche Ideen?

+0

Das Überschreiben der "sfModelGeneratorConfiguration :: getForm" -Methode in myModuleGeneratorConfiguration könnte funktionieren, würde mich aber immer noch dazu veranlassen, sfContext zu verwenden, um das aktuelle sf_user-Objekt abzurufen – jolly18

Antwort

1

Willkommen bei Stack Overflow, jolly18.

Ich würde nur sfContext verwenden. In meiner App habe ich beispielsweise ein Unterformular, das ein neues Notizobjekt erstellt und den Benutzer zuordnet. In meiner configure() der Form habe ich:

$new_note->setAuthor(sfContext::getInstance()->getUser()->getUsername()); 

ich the book calls this "The fastest but ugly way" sehen, weil es macht „zwischen der Form und dem Kontext eine große Kopplung, so dass die Prüfung und Wiederverwertbarkeit schwieriger.“ Aber in der Praxis ... das funktioniert gut und ich kann weitermachen.

1

Ich habe dieses Problem für eine Weile konfrontiert, aber Symfony überrascht mich immer mit einem ordentlichen Code, den ich nicht kannte.

Ich nehme an, Sie verwenden sfPropelPlugin, ganz normal, wenn Sie den im Cache generierten Code auschecken (Hinweis: Dieser Code wird verfügbar sein, sobald Sie versuchten, das Modul aus dem Browser zu öffnen, so versuchen Sie es zuerst zu sehen wir bekommen nicht in Schwierigkeiten: P) Sie so etwas wie sehen können:

cache/{application_name}(generally frontend or backend)/dev(enviromnemt)/autoModule_name(look here for the module)/:

  • lib
  • Aktion

T Der Aktionsordner enthält eine action.class.php-Datei, die alle Aktionen definiert, die vom Generator generiert werden (executeNew, Edit, Create, Update, usw.). Wenn Sie ein, die Umsetzung von executeNew und executeEdit anschaut, kann man sehen, dass sie eine Konfiguration instace die tatsächliche Form fragen, hier angezeigt ein Beispiel:

public function executeNew(sfWebRequest $request) 
    { 
    $this->form = $this->configuration->getForm(); 
    $this->PaymentOrder = $this->form->getObject(); 
    } 

Die Konfiguration var containt eine Instanz einer Konfigurationsklasse definiert in der lib-Ordner, den ich bereits erwähnt habe. Diese Klasse passt das Formular an die Objektanforderungen an (in der Regel durch Festlegen einer neuen Objektinstanz).

Also hier kommt die Magie, die Klassen, die Sie in Ihrem Modul sehen, von denen im Cache, also von reiner Logik, wenn Sie die getForm() Methode im Hauptmodul/lib Ordner auf Ihre Bedürfnisse anpassen, müssen Sie nicht hacken Sie Formulare, indem Sie Benutzerschätzer erhalten, wo Sie nicht sollten.

Hoffe, das hilft!

1

wenn Modul wurde mit Admin-Generator erzeugt:

in apps/backend/modules/books/actions/actions.class.php

modifizieren: in

executeEdit(){ 

//leave rest unchanged 

$values=array('activity_id'=>$activity_id, 'book_id'=>$book_id, 'todo_id'=>$todo_id, 'user_id'=>$this->getUser()->getGuardUser()->getId()); 


    $this->form = new TabelBooksForm($TabelBooks, $values); 
} 

modifizieren: in

executeNew(){ 

//leave rest unchanged 

$values=array('activity_id'=>$activity_id, 'book_id'=>$book_id, 'todo_id'=>$todo_id, 'user_id'=>$this->getUser()->getGuardUser()->getId()); 

    $this->form = new TabelBooksForm(array(), $values); 
} 

in TabelBooksForm.class.php

public function configure() 
    { 

    if ($this->isNew()) { 
    $this->setWidget('book_id', new sfWidgetFormInputHidden()); 
    $this->setDefault('book_id', $this->getOption('book_id'));  

    $this->setWidget('activity_id', new sfWidgetFormInputHidden()); 
    $this->setDefault('activity_id', $this->getOption('activity_id'));  

    $this->setWidget('todo_id', new sfWidgetFormInputHidden()); 
    $this->setDefault('todo_id', $this->getOption('todo_id')); 
    } 
}