В frontend у меня есть страница со списком и фильтром формы рядом с ним, который показывает всем пользователям социальной сети.
Я хотел бы скрыть пользователя сессии в том списке. Как я могу сделать это?
Моя первая мысль создает функцию, addXXXXColumnQuery()
, для каждого поля формы, и в каждом добавляют строку как это:
->andWhere("u.id <> ?", $id)
Причем $id является идентификатором пользователя текущей сессии. Но таким образом я нахожу, что повторяю меня.
Что мне делать?
Во-первых, вам нужно ввести пользователя в фильтр. У вас есть два варианта:
Передать user_id в качестве опции при создании формы, внутри экшена:
public function executeList(sfWebRequest $request)
{
$user_id = $this->getUser()->getUserId();
$filter = new ModelFormFilter(array(), array('user_id' => $user_id));
...
Получить user_id из контекста внутри формы:
sfContext::getInstance()->getUser()->getUserId();
Я предпочитаю первый метод, потому что он чище и менее WTFy.
Как только вы получили id пользователя, переопределите doBuildQuery
, чтобы исключить текущий id пользователя внутри вашего FormFilter:
protected function doBuildQuery(array $values)
{
$query = parent::doBuildQuery($values);
$user_id = $this->getOption('user_id'); //or off the context here
if ($user_id)
{
$query->addWhere('r.user_id != ?', $user_id);
}
return $query;
}