在前端,我有一个页面,旁边有一个列表和一个表单过滤器 它显示了社交网络的所有用户。
我想在该列表中隐藏会话的用户。我怎么能够 做到了吗?
我的第一个想法是为每个人创建一个函数addXXXXColumnQuery()
表单的字段,并在每一个中添加如下行:
->andWhere("u.id <> ?", $id)
$ id是当前会话的用户的ID。但就这样我 发现我在重复自己。
我该怎么办?
答案 0 :(得分:2)
首先,您需要让用户进入过滤器。您有两种选择:
在操作中实例化表单时,将user_id作为选项传递:
public function executeList(sfWebRequest $request)
{
$user_id = $this->getUser()->getUserId();
$filter = new ModelFormFilter(array(), array('user_id' => $user_id));
...
从表单内的上下文中获取用户ID:
sfContext::getInstance()->getUser()->getUserId();
我更喜欢前一种方法,因为它更清洁,更少WTFy。
获得用户ID后,覆盖doBuildQuery
以排除FormFilter中的当前用户ID:
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;
}