多用户设置中的Symfony Admin Generator(限制LIST视图中的记录)

Sti*_*MAN 4 symfony1

我正在使用SF 1.2.9来构建一个网站.我想使用管理生成器为我使用的对象模型(特别是LIST,编辑和删除)提供管理功能.

我已经阅读过Symfony文档(第14章),但除非我非常错误,所有我到目前为止所遇到的例子似乎都是针对单个用户环境编写的.这意味着返回给用户的记录列表基本上是该表中的所有记录.在多用户环境中,这是最不可能的,并且可能是安全威胁.必须要求将返回给用户的记录列表限制为他们拥有(即创建)的记录.

假设我有一个带有(YML)模式的表,如下所示:

foobar_dongle:
    id:          ~
    title:       varchar(255)
    info:        longvarchar
    owner_id:   ~
    created_at:  ~
Run Code Online (Sandbox Code Playgroud)

其中所有者ID是FK到用户表中.

假设我生成一个这样的管理模块:

symfony propel:generate-admin backend FoobarDongle --module=dongle
Run Code Online (Sandbox Code Playgroud)

问题: 如何修改管理生成器生成的代码的LIST部分中返回给用户的记录列表?正如我上面提到的,当前,(即开箱即用),管理生成器向用户(相当天真,我觉得)提供了正在管理的模型的整个记录​​集.我需要能够以某种方式限制该列表,以便我只能返回该用户拥有的记录.

这就是我想要了解的方法.

我非常感谢能够告诉我如何限制使用管理生成器管理对象模型时返回的记录列表的人.理想情况下,我希望能够指定一个具有所有自定义"过滤"逻辑的自定义方法 - 但只要我可以限制用户可以看到(在管理员中)的记录的LIST,只限制他所记录的记录这是我想要做的所有者.

Fel*_*ing 5

如果您只想在一个或两个模块中限制返回的对象,请执行以下操作:

转到actions.class.php模块的文件.默认情况下应该没有方法,类应该继承autoModuleNameActions自己.插入以下方法:

protected function buildQuery()
{
   $query = parent::buildQuery();
   // do what ever you like with the query like
   $query->andWhere('user_id = ?', $this->getUser()->getId());
   return $query;
}
Run Code Online (Sandbox Code Playgroud)

但是如果你为更多的模块做这件事,那就变得不方便了.在这种情况下,我建议创建一个新的管理生成器主题.

如果要根据admin生成器配置文件中的某个自定义参数进行查询,则必须扩展此文件.但不仅仅是添加新参数.您可以阅读本文如何执行此操作.

如果您想了解有关自动生成的类的更多信息,请查看此类:cache/[app]/[env]/modules/auto[ModuleName]/actions/actions.class.php.


评论后编辑:

我觉得你看错了班级.看这里:cache/[app]/[env]/modules/auto[ModuleName]/actions/actions.class.php.

我设置了一个Propel项目来检查它,你感兴趣的方法是:

protected function buildCriteria()
{
  if (is_null($this->filters))
  {
    $this->filters = $this->configuration->getFilterForm($this->getFilters());
  }

  $criteria = $this->filters->buildCriteria($this->getFilters());

  $this->addSortCriteria($criteria);

  $event = $this->dispatcher->filter(new sfEvent($this, 'admin.build_criteria'), $criteria);
  $criteria = $event->getReturnValue();

  return $criteria;
}
Run Code Online (Sandbox Code Playgroud)

我还把这个类的全部内容发布到了pastebin.它很多,函数在245行.即使你没有找到这个类,你应该能够覆盖这个方法,如下所示:

protected function buildCriteria()
{
  $criteria = parent::buildCriteria();
  // do something with it
  return $criteria;
}
Run Code Online (Sandbox Code Playgroud)

我不知道这些标准对象,所以我无法帮助你,但我希望其他的东西可以帮到你.