symfony - фильтры модуля администратора, доступные в виде ссылок - PullRequest
1 голос
/ 15 апреля 2011

Я работаю на панели администратора, которая в основном будет основана на текущем пользователе, который вошел в usingsfDoctrineGuardPlugin

Однако я хочу иметь ссылки на панели инструментов, которые в основном являются фильтрами для других модулей.

Проблема в том, что я не уверен, как бы я это сделал.

Например, я хотел бы иметь следующие ссылки:

  • Список новых пользователей - эта ссылка должна перечислять всех пользователей, добавленных за последние 30 дней
  • Список поставщиков - для этого необходимо составить список всех пользователей, которые являются группой с group_id 2
  • Список производителей - это список всех пользователей, которые входят в группу с group_id 3

Как бы я поступил так?

Спасибо

Ответы [ 2 ]

2 голосов
/ 20 апреля 2011

Я действительно не думаю, что вы должны использовать фильтры в вашем случае. Фильтры - это временные условия для вашего списка данных. Вот более элегантное решение. Мы повторно используем функциональность индексного действия 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. теперь этот подход позволяет вам использовать фильтры (по их истинным причинам) поверх этих списков. Но вам также придется настроить соответствующие ссылки.

0 голосов
/ 18 апреля 2011

Вот одна проблема: Администратор администратора запоминает все данные фильтров как атрибут пользователя (читается как «сохраняет эту информацию в сеансе»).

Так что, если вам не нужны все запомненные данные фильтров, вы можете создатьодин модуль, который получает параметры GET, устанавливает эти параметры как пользовательский атрибут (sfUser-> setAttribute (...)), переопределяет, фильтрует данные нужного модуля и перенаправляет в модуль.

или

Выможет использовать параметры GET, добавляя их к URL-адресу модуля (example.com/users?filter[group_id]=123), который переопределяет параметры фильтра.В этом случае вы должны обрабатывать эту информацию в каждом необходимом модуле.

...