1

嘿伙计们,我已经使用了Symfony admin generatorfor 模块。

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

我可以自己通过覆盖其中的 executeNew、executeCreate 函数来做到这一点myModuleActions.class.php(它扩展了 myModuleAutoActions)。

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

也许覆盖其中一个配置类是要走的路。我基本上需要将当前sf_user对象($this->getUser)添加sf_user为表单的“”选项,以避免sfContextmyModuleForm.

有任何想法吗?

4

3 回答 3

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'));  
  }
}
于 2012-06-28T03:55:13.207 回答
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();
  }

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

所以魔法来了,你在模块中看到的类是从缓存中的类扩展而来的,所以通过纯逻辑,如果你修改getForm()主模块/lib 文件夹中的方法以满足你的需要,你就不必通过获取用户来破解表单估价器在你不应该的地方。

希望这可以帮助!

于 2010-12-17T04:15:02.163 回答
1

欢迎来到 Stack Overflow,jolly18。

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

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

我看到这本书称其为“最快但最丑陋的方式”,因为它使“表单和上下文之间产生了很大的耦合,使得测试和可重用性变得更加困难”。但在实践中......这很好,我可以继续前进。

于 2010-12-16T19:13:30.190 回答