symfony - 可作为链接访问的管理模块过滤器

时间:2011-04-15 15:58:29

标签: symfony1 symfony-1.4

我正在开发一个管理仪表板,它主要基于使用thesDDtrtrineGuardPlugin登录的当前用户

我想要做的是,在仪表板中有链接,基本上是过滤到其他模块。

问题是,我不确定我是怎么做的。

例如,我想将以下内容作为链接:

  • 列出新用户 - 此链接需要列出过去30天内添加的所有用户
  • 列出供应商 - 这需要列出group_id为2
  • 的所有用户
  • List Manufactureres - 这需要列出group_id为3
  • 的组中的所有用户

我将如何做到这一点?

由于

2 个答案:

答案 0 :(得分:2)

我真的不认为你应该在你的情况下使用过滤器。过滤器是数据列表的临时条件。 这是一个更优雅的解决方案。我们将重用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。这种方法现在允许您在这些列表之上使用过滤器(出于真正的原因)。但是,您还必须调整适当的链接。

答案 1 :(得分:0)

以下是一个问题:管理员生成器会将所有过滤器数据记录为用户的属性(读作“将此信息存储在会话中”)。

因此,如果您不关心过滤器的所有记忆数据,您可以创建一个接收GET参数的模块,将此参数设置为用户属性(sfUser-&gt; setAttribute(...))覆盖所需模块的过滤器数据,并重定向到模块。

或者

您可以使用GET参数将它们添加到覆盖过滤器参数的模块URL(example.com/users?filter[group_id]=123)。在这种情况下,您应该在每个需要的模块中处理此信息。