Symfony管理生成器:过滤显示列

时间:2010-01-14 14:28:47

标签: symfony1 doctrine

我正在使用Symfony 1.4中的管理生成器,99%正常工作,因为我希望它只使用generator.yml配置文件中的选项。

我遇到的问题是我希望使用过滤器指定在列表视图中显示哪些列(而不是在generator.yml中配置它们)。

我已经成功创建了一个部分以显示其他列过滤器选项,但我看不到使用此过滤器的值来更改列表中显示的列的方法。我可以看到我如何能够使用该值来过滤数据库查询的条件,但我无法弄清楚如何使用此方法来限制某些列的显示。

如果有人有任何想法或者可以指出我正确的方向,我将非常感激,因为我一直在追逐我的尾巴!微笑

非常感谢。

此致

3 个答案:

答案 0 :(得分:1)

我上周做了这个,起初也有些失落。我可以告诉你我做了什么,你适应了你的解决方案。 在我的解决方案中,我有一个名为Notifications的模块,其中包含以下字段:id,content,state,sent_at,instance,created_at。 在我的问题中,通知可以发送到用户列表,因此用户正在预测数据,而不是保存在通知表中(1到n关系)。因此,当您编辑o创建通知时,我只显示通知的几个字段(如内容和实例),其他字段(如日期)不可编辑(我的选择)。 所以在创作中我只展示了该类的6个领域中的2个。而且我还希望看到一个多选用户列表,所以我使用名为“_get_all_users_list.php”的模板文件夹中的一个部分,该文件夹有一个标准并返回一个多选标签。

_get_all_users_list.php文件

<?php

    echo select_tag('users', objects_for_select( UserPeer::doSelect(new        Criteria),"getId","getUsername")
          ,array( "multiple"=>1, "size"=>15)  );
?>

为了能够在generator.yml中显示用户列表,我这样做:

generator:

class:sfPropelAdminGenerator   PARAM:     model_class:通知     主题:默认

list:
  title:          Notificaciones
  max_per_page:   20
  display:        [ id, content, state, sent_at, sknow_instance, created_at]
  object_actions:
    _edit:         ~
    _delete:       ~
  batch_actions:
    _delete:       ~

edit:
  title:          Modificar notificacion:
  display:        [content, sknow_instance, _getAllUsersList ]
  fields:
    content:              { name: Notification content, type: textarea_tag, params: size=80x5 }
    get_all_users_list:   { name: Select one or more users to be notified}

如编辑中generator.yml的“display:”区域所示,您可以在创建时声明要编辑/启用的字段,如果要包含部分,则必须使用a _在开头和camelCase格式中,partial的名称必须以_开头,名称必须用_分隔。

我发现symfony的书Admin Generator

的这一章非常有用

我希望它有所帮助,对不起我的英语。

答案 1 :(得分:0)

我想你应该创建自己的生成器来实现这样的逻辑。

答案 2 :(得分:0)

感谢您的建议。我遇到的问题是访问我的自定义过滤器的值,以便我可以使用它来更改显示的列。最后,这就是我实现它的方式:

在我的FormFilter类中,我配置了自定义窗口小部件并添加了验证器。这迫使我添加一个方法(添加%sColumnQuery)来处理该值,我在其中将值添加到用户对象以便将其存储以便在其他地方进行检索(通常此方法将用于更改查询)。见下文:

class ExpenditureFormFilter extends BaseExpenditureFormFilter
{
  public function configure()
  {
    parent::configure();

    $years = range((int)date("Y", strtotime(sfConfig::get('app_view_min_period'))), (int)date("Y", strtotime(sfConfig::get('app_view_max_period'))));

    $this->widgetSchema['start_period'] = new sfWidgetFormDate(array(
      'format'        => '%month%/%year%',
      'can_be_empty'  => false,
      'months'        => array_combine(range(1, 12), array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')),
      'years'         => array_combine($years, $years)
    ));

    $this->widgetSchema->setLabels(array(
      'start_period'  => 'Start period',
    ));

    $this->validatorSchema['start_period'] = new sfValidatorMonthYear(
      array(
        'min' => strtotime(sfConfig::get('app_view_min_period')),
        'max' => strtotime(sfConfig::get('app_view_main_period'))
      ),
      array(
        'required' => true
      )
    );
  }

  public function getFields()
  {
    $fields = parent::getFields();
    $fields['start_period'] = 'Date';
    return $fields;
  }

  protected function addStartPeriodColumnQuery($query, $field, $value)
  {
    sfContext::getInstance()->getUser()->setAttribute('start_period', $value);
  }
}

然后我覆盖了自动生成的_list_td_tabular.php部分(只需在模块模板目录中创建一个具有相同名称的副本即可轻松完成),在此我能够访问用户对象,因此我的过滤器值像这样:

$start_period = sfContext::getInstance()->getUser()->getAttribute('start_period');

所以现在我可以使用这个值来动态生成要在列表模板中显示的列 - 完成任务:)

我很想知道当然是否有更好的方法,但这对我有用!

此致