views:

48

answers:

1

In the frontend I have a page with a list and a form filter next to it that shows all the users of a social network.

I would like to hide the user of the session in that list. How can I do it?

My first thought is creating a function, addXXXXColumnQuery(), for each field of the form, and in each one add a line like this:

->andWhere("u.id <> ?", $id)

$id being the ID of the user of the current session. But in that way I find I'm repeating myself.

What should I do?

A: 

First, you need to get the user into the filter. You have two options:

Pass the user_id in as an option when you instantiate the form, inside the action:

public function executeList(sfWebRequest $request)
{
  $user_id = $this->getUser()->getUserId();
  $filter = new ModelFormFilter(array(), array('user_id' => $user_id));
  ...

Get the user id from the context inside of the form:

sfContext::getInstance()->getUser()->getUserId();

I prefer the former method because it's cleaner and less WTFy.

Once you have the user id, override doBuildQuery to exclude the current user id inside of your 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;
}
jeremy