Symfony1 symfony sfDoctrineGuardPlugin generator.yml按用户id筛选

Symfony1 symfony sfDoctrineGuardPlugin generator.yml按用户id筛选,symfony1,doctrine,Symfony1,Doctrine,我知道在前端使用admin generator.yml可能有点奇怪,但每个页面都是列表或编辑页面,这绝对是最容易做到的 在努力编写登录模块之后,我安装了sfDoctrineGuardPlugin,并使用这些关系将它们链接到我的主用户表。数据库中的所有内容都依赖于这一个表,数据已经在当前的实时站点上积累了8个多月,我需要保存它 我目前的问题是,一旦有人登录并将其ID存储在guard系统中,我就需要所有页面根据它过滤所有结果,包括列表和编辑 有没有一种简单的方法可以做到这一点,或者我需要对每个列表使

我知道在前端使用admin generator.yml可能有点奇怪,但每个页面都是列表或编辑页面,这绝对是最容易做到的

在努力编写登录模块之后,我安装了sfDoctrineGuardPlugin,并使用这些关系将它们链接到我的主用户表。数据库中的所有内容都依赖于这一个表,数据已经在当前的实时站点上积累了8个多月,我需要保存它

我目前的问题是,一旦有人登录并将其ID存储在guard系统中,我就需要所有页面根据它过滤所有结果,包括列表和编辑

有没有一种简单的方法可以做到这一点,或者我需要对每个列表使用table_方法

上面提到的唯一问题是ID出现在地址中,我需要它来确保人们不能查看不应该查看的数据

而且,这很可能很快就会改变,目前表是MyISAM,用于更好的自动增量,可以让它按用户递增,这样每个人从一个开始。然而,它似乎不做外键,所以当我编写代码将其转换为INNOBDB时,地址中的ID对于无法更改的人来说变得更加重要

Owner:
  columns:
    id: { type: integer(4), primary: true, autoincrement: true }
    slname: { type: string(64), notnull: true }
    uuid: { type: string(36), notnull: true }
    e_mail: { type: string(64) }
    user: { type: string(16) }
    pass: { type: string(40), notnull: true }
    subscription: { type: integer(4), default: '0', notnull: true }
    registered: { type: integer(1), default: '0', notnull: true }
  relations:
    Subscription:  { local: subscription, foreign: id }
    User: { class: sfGuardUser, foreign: id, local: id, type: one, onDelete: cascade, foreignType: one, foreignAlias: Owner }
一旦插件正常工作,我计划从上表中删除密码,使用默认密码,并强制每个人进行新的通行证

编辑:

谢谢Ben,我想我已经准备好模板了。它仍将在列中添加到数据库中

 class Doctrine_Template_Owned extends Doctrine_Template
{
    protected $_options = array(
        'name'          =>  'owner_id',
        'type'          =>  'integer',
        'length'        =>  11,
        'options'       =>  array(
            'default' => 0,
            'notnull' => true
        )
    );

    public function setTableDefinition()
    {
        $this->hasColumn($this->_options['name'], $this->_options['type'], $this->_options['length'], $this->_options['options']);
        $this->addListener(new Doctrine_Template_Listener_Owned($this->_options));
    }
}
但是,侦听器不希望被调用

class Doctrine_Template_Listener_Owned extends Doctrine_Record_Listener
    {
        protected $_options = array();

        public function __construct(array $options)
        {
            $this->_options = $options;
        }

        public function preDqlSelect(Doctrine_Event $event)
        {
            $params = $event->getParams();
            $field = $params['alias'] . '.' . $this->_options['name'];
            $query = $event->getQuery();

            if (( ! $query->isSubquery() || ($query->isSubquery() && $query->contains(' ' . $params['alias'] . ' '))) && ! $query->contains($field)) {
                $query->addPendingJoinCondition(
                    $params['alias'], $field . ' = ' . sfContext::getInstance()->getUser()->getGuardUser()->getId()
                    );
            }
        }
    }

侦听器的代码是软删除代码,删除了时间表和布尔检查。但是,该行不会出现在开发栏中。

只需更改actions.class.php文件中的函数即可。
例如,可以更改listSuccess函数以过滤ID=USERID的结果。如果需要在整个应用程序范围内执行此操作,我将使用条令行为,而不是在操作级别执行此操作

看看SoftDelete行为是如何工作的(它的两个文件,一个模板和一个监听器,在lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/Doctrine/template中,以及其中的监听器子文件夹中)——您应该能够使它始终添加一个user_id=x子句,而不是它目前所做的事情,然后将其添加到相关类的schema.yml中

然后,您需要将用户id设置为。您可以向config/ProjectConfiguration.class.php添加一个名为“configureDoctrine”的方法,如果doctrine存在该方法,将调用该方法。不确定在条令中的哪个位置最适合将其传递给,但您应该在此方法中将当前用户的用户id传递给条令-sfContext::getInstance()->getUser()->getGuardUser()->getId()以获取它。然后,行为应该从这里提取值。如果没有其他内容,侦听器或模板类上的静态属性应该可以工作

您可以通过从模板中调用sfContext::getInstance来让行为直接获取用户id,但不建议这样做,因为它在条令/symfony之间创建了额外的链接,这与symfony的整个依赖注入/无全局状态精神背道而驰,而且这些东西迟早会崩溃

如果出于任何原因,这不起作用,那么我将查看生成器模板中的相关文件(位于lib/vendor/symfony/plugins/sfDoctrinePlugin/data/generator/sfDoctrineModule/admin/)。可以通过在“项目顶级数据”文件夹下添加任何文件来完成此操作。或者我认为管理员生成的模块也会抛出事件,您可能会听到这些事件

对于有关它不起作用的评论,如果您没有使用任何其他依赖回调的行为,请确保databases.yml具有use_dql_callbacks:true属性:

all:
  doctrine:
    class: sfDoctrineDatabase
    param:
      dsn:      mysql:host=localhost;dbname=mydb
      username: myuser
      password: mypassword
      attributes:
        use_dql_callbacks: true

这还会考虑默认的过滤器吗?应该。如果没有,请告诉我;)唯一的问题是,目前没有listSuccess,因为它使用的是yaml文件。如何编写一个获取它将要执行的查询以添加addWhere('user_id=?',$userID');这种方法需要大量的工作,除非你想留下它,你可以在url中编辑id,它需要应用于编辑/删除等,以及只是列表。谢谢Ben。我已经在帖子中添加了我写的代码。虽然模板可以正常工作,并且可以正确地将列添加到数据库中,但是侦听器不能。非常感谢Ben。没有你的帮助,我什么都不知道。