嘿伙计们,我已经使用Symfony admin generator
作为模块。
一切正常,但是当我的模型的表单被实例化时,我需要传递我自己的选项。
我可以通过覆盖myModuleActions.class.php
中的executeNew,executeCreate函数(扩展myModuleAutoActions)来自行完成。
但是我希望有一个更整洁的解决方案?
或许重写其中一个配置类是要走的路。我基本上需要将当前sf_user
对象($this->getUser
)添加为表单的“sf_user
”选项,以避免在sfContext
中使用myModuleForm
。
有什么想法吗?
答案 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)/
:
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'));
}
}