Я действительно не думаю, что вы должны использовать фильтры в вашем случае. Фильтры - это временные условия для вашего списка данных.
Вот более элегантное решение. Мы повторно используем функциональность индексного действия sfGuardUser и установим его table_method «на лету» (на основе URL).
//exetent the configuration class to override getTable method
class sfGuardUserGeneratorConfiguration extends BaseSfGuardUserGeneratorConfiguration
{
protected $tableMethod = null;
public function setTableMethod($name)
{
$this->tableMethod = $name;
}
public function getTableMethod()
{
return null !== $this->tableMethod ? $this->tableMethod : parent::getTableMethod();
}
}
//now we need to set the tableMethod based on a route param (list):
class sfGuardUserActions extends autoSfGuardUserActions
{
public function executeIndex(sfWebRequest $request)
{
//create a mapping between an url and table method
$map = array(
'clients' => 'getClientsList',
'suppliers' => 'getSuppliersList',
'manufacturers' => 'getManufacturersList',
);
$list = $request->getParameter('list');
$table_method = isset($map[$list]) ? $map[$list] : null;
$this->configuration->setTableMethod($table_method);
parent::executeIndex($request);
}
}
//create a custom url for your lists:
sf_guard_user_list:
url: /guard/users/:list
param: { module: sfGuardUser, action: index}
requirements:
list: clients|suppliers|manufacturers
//and model methods for each of your lists:
class sfGuardUserTable extends PluginsfGuardUserTable
{
/**
* List of clients query
*
*/
public function getClientsList()
{
$q = $this->createQuery('u')
->leftJoin('u.Groups g')
->where('g.name = ?', 'client');
return $q;
}
//and others
}
Вот и все. Теперь вы можете добавить ссылки на свою панель управления следующим образом:
<?php echo link_to('Clients', 'sf_guard_user_list', array('list'=>'clients')) ?>
P.S. теперь этот подход позволяет вам использовать фильтры (по их истинным причинам) поверх этих списков. Но вам также придется настроить соответствующие ссылки.