symfony sfDoctrineGuardPlugin generator.yml фильтрация по user_id - PullRequest
0 голосов
/ 10 сентября 2010

Я знаю, что это может показаться немного странным для пользователя admin generator.yml во внешнем интерфейсе, но каждая страница - это либо список, либо страница редактирования, и это определенно самые простые вещи.

После борьбы с написанием модуля входа в систему я установил sfDoctrineGuardPlugin и использовал отношения, чтобы связать их с моей основной таблицей пользователей. Все в базе данных опирается на эту таблицу, и данные на текущем живом сайте накапливаются немногим более 8 месяцев, и мне нужно их сохранить.

Моя текущая проблема заключается в том, что, как только кто-то входит в систему и сохраняет свой идентификатор в системе защиты, мне нужны все страницы для фильтрации всех результатов по нему, включая списки и изменения.

Есть ли простой способ сделать это или мне нужно использовать table_method для каждого списка?

Единственная проблема с вышеперечисленным состоит в том, что идентификатор появляется в адресе, и мне нужно, чтобы люди не могли просматривать данные, которые не должны.

Кроме того, и это, вероятно, скоро изменится, в тот момент, когда таблицы являются MyISAM для использования лучшего автоматического приращения, может иметь приращение для пользователя, поэтому каждый человек начинает с одного. Однако кажется, что он не использует внешние ключи, поэтому, когда я пишу код для преобразования его в INNOBDB, идентификатор в адресе становится более важным для людей, которые не могут измениться.

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 }

Как только плагин заработает, я планирую удалить пароль из таблицы выше, использовать пароль по умолчанию и заставить всех делать новые проходы.

EDIT:

Спасибо, Бен, у меня работает шаблон, я думаю. В любом случае он добавляется в столбец к базе данных.

 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()
                    );
            }
        }
    }

Код для слушателя - это код мягкого удаления с удалением расписания и логической проверки. Хотя строка не появляется, чтобы появиться в панели разработчиков.

Ответы [ 2 ]

0 голосов
/ 11 сентября 2010

Если вам нужно сделать это приложение в целом, я бы использовал поведение доктрины, а не на уровне действий.

Посмотрите, как работает поведение SoftDelete (его два файла, шаблон и слушатель, в lib / vendor / symfony / lib / plugins / sfDoctrinePlugin / lib / vendor / Doctrine / Template и подпапке Listener в этом ) - вы должны иметь возможность адаптировать его, чтобы всегда добавлять предложение user_id = x вместо того, что оно делает в настоящее время, а затем добавить его в свой schema.yml для соответствующих классов.

Тогда вам нужно получить user_id для доктрины. Вы можете добавить метод с именем «configureDoctrine» в config / ProjectConfiguration.class.php, который будет вызываться, если он существует по доктрине. Не уверен, куда лучше в доктрине передать его, но вы должны передать идентификатор пользователя для текущего пользователя доктрине в этом методе - sfContext :: getInstance () -> getUser () -> getGuardUser () -> getId () чтобы получить это. Затем поведение должно получить значение отсюда. Если ничего другого, статическое свойство на классах слушателя или шаблона должно работать.

Вы могли бы заставить поведение выбрать идентификатор пользователя напрямую, вызвав sfContext :: getInstance из шаблона, но это не рекомендуется, поскольку это создает дополнительные связи между doctrine / symfony, что противоречит целой инъекции зависимостей / нет глобального этоса состояния Symfony, и все рано или поздно сломается.

Если это не сработает по какой-либо причине, я бы вместо этого посмотрел на переопределение соответствующих файлов из шаблона генератора (в lib / vendor / symfony / plugins / sfDoctrinePlugin / data / generator / sfDoctrineModule / admin /) , Вы можете сделать это, добавив любой из файлов в папку данных верхнего уровня проекта. Или я думаю, что сгенерированные администратором модули также генерируют события, которые вы могли бы слушать ...

В ответ на комментарий о том, что он не работает, если вы не использовали другие поведения, основанные на обратных вызовах, убедитесь, что ваш файл database.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
0 голосов
/ 10 сентября 2010

Просто измените функции в файле actions.class.php. Например, функция listSuccess может быть изменена для фильтрации результатов, где ID = USERID

...