symfony admin生成器表单对象

时间:2010-12-16 12:19:06

标签: php forms symfony1 admin-generator

嘿伙计们,我已经使用Symfony admin generator作为模块。

一切正常,但是当我的模型的表单被实例化时,我需要传递我自己的选项。

我可以通过覆盖myModuleActions.class.php中的executeNew,executeCreate函数(扩展myModuleAutoActions)来自行完成。

但是我希望有一个更整洁的解决方案?

或许重写其中一个配置类是要走的路。我基本上需要将当前sf_user对象($this->getUser)添加为表单的“sf_user”选项,以避免在sfContext中使用myModuleForm

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

欢迎来到Stack Overflow,jolly18。

我只想使用sfContext。例如,在我的应用程序中,我有一个子窗体,它创建一个新的Note对象并将用户分配给它。在我的表格中configure()我有:

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

我看到the book calls this "The fastest but ugly way",因为它使“形式和上下文之间的大耦合,使测试和可重用性变得更加困难。”但在实践中......这很有效,我可以继续前进。

答案 1 :(得分:1)

我一直面对这个问题,但symfony总是让我惊讶于一些我不知道的简洁代码。

我假设您使用sfPropelPlugin,非常标准,如果您检查缓存中生成的代码(注意:一旦您尝试从浏览器打开模块,此代码就可用了,所以很多人试着看看它,所以我们不要遇到麻烦:P)你可能会看到类似的东西:

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

  • LIB
  • 动作

action文件夹包含一个action.class.php文件,该文件定义生成器生成的所有操作(executeNew,Edit,Create,Update等)。如果您查看executeNew和executeEdit的实现,您可以看到他们要求配置实例显示实际表单,这是一个示例:

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

配置var包含我前面提到的lib文件夹中定义的配置类的实例。该类调整表单以适应对象的需要(通常通过设置一个新的对象实例)。

所以这就是魔术,你在模块中看到的类从缓存中的类扩展,所以通过纯逻辑,如果你修改主模块/ lib文件夹中的getForm()方法以满足你的需要,你不必通过将用户评估者放在不应该的位置来破解表单。

希望这有帮助!

答案 2 :(得分:1)

如果使用admin-generator生成模块:

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

中的

修改:在

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);
}

修改:在

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);
}
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'));  
  }
}