【问题标题】:Symfony admin generator : add user id before savingSymfony 管理员生成器:在保存之前添加用户 ID
【发布时间】:2011-01-19 23:48:29
【问题描述】:

我正在创建自己的博客引擎来学习 Symfony,我有一个问题:

在为博客文章生成的管理页面中,我有一个作者下拉列表,用于指示作者 ID。

我想隐藏那个下拉列表,并在创建帖子时将 author_id 设置为当前登录用户的 id(但不是在编辑时)

我怎样才能做到这一点?

编辑 我已经试过了:

$request->setParameter(sprintf("%s[%s]", $this->form->getName(), "author_id"), $this->getUser()->getAttribute("user_id"));
$request->setParameter("content[author_id]", $this->getUser()->getAttribute("user_id"));
$request->setParameter("author_id", $this->getUser()->getAttribute("user_id"));
$request->setParameter("author_id", 2);
$request->setParameter("content[author_id]", 2);
$request->setParameter("author_id", "2");
$request->setParameter("content[author_id]", "2");

在 processForm() 和 executeCreate() 中

已解决!

最终代码为:

  public function executeCreate(sfWebRequest $request)
  {
    $form = $this->configuration->getForm();
    $params = $request->getParameter($form->getName());
    $params["author_id"] = $this->getUser()->getGuardUser()->getId();;
    $request->setParameter($form->getName(), $params);

    parent::executeCreate($request);

  }

【问题讨论】:

  • 我无法相信找到这方面的信息有多难。我是第一个想要保存文档作者的人吗?

标签: symfony1 sfdoctrineguard


【解决方案1】:

覆盖操作文件中的executeCreate 函数。将post数据绑定到表单时,将当前用户的id合并到其中。

第二次更新

我做了一些实验,这很有效:

class fooActions extends autoFooActions
{
  public function executeCreate(sfWebRequest $request)
  {
    $form = $this->configuration->getForm();
    $params = $request->getParameter($form->getName());
    $params["author_id"] = 123;
    $request->setParameter($form->getName(), $params);

    parent::executeCreate($request);
  }
}

【讨论】:

  • 这似乎是个好主意;你能详细一点吗?
  • 谢谢;它仍然无法保存,说 author_id 是必需的..我会尝试使其成为可选的。
  • 确保表单字段的值以formname[author_id] 发送,这是默认格式,所以我在我的代码中假设它。
  • 好像新的executeCreate没有被调用……我加了“$i = 3/0;”它没有抛出错误。
【解决方案2】:

使用 sfWidgetFormInputHidden 更改表单中的小部件并使用 sfUser 属性(在用户登录时定义)设置值

覆盖 executeCreate() 并设置 author_id 小部件(感谢 maerlyn :D)

public function executeCreate(sfWebRequest $request){
  parent::executeCreate($request);
    $this->form->setWidget('author_id', new sfWidgetFormInputHidden(array(),array('value'=>$this->getUser()->getAttribute('author_id'))) );
}

【讨论】:

  • 使用sfContext::getInstance() 是不好的做法。使用依赖注入。推荐阅读:webmozarts.com/2009/07/01/why-sfcontextgetinstance-is-bad
  • 正如 Maerlyn 建议的那样,使用上下文是一种不好的做法。只需将 author_id 作为选项传递到表单中即可。
  • 但其余的都有效吗? $this->setWidget('author_id', new sfWidgetFormInputHidden(array(),array('value'=>1))) 可以吗?
  • 它是有效的,但正如 Maerlyn 所说,强烈不推荐它.. :D
  • $this->form->setWidget AFTER parent::executeCreate ??
【解决方案3】:

在 Objects 中,解决方案是:(new and $this)

class fooActions extends autoFooActions
{
  public function executeCreate(sfWebRequest $request)
  {
    $this->form = new XxxxxForm();
    $params = $request->getParameter($this->form->getName());
    $params["author_id"] = 123;
    $request->setParameter($this->form->getName(), $params);

    parent::executeCreate($request);
  }
}

【讨论】:

    猜你喜欢
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2011-02-12
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多