【问题标题】:Symfony admin generator: Filtering the display columnsSymfony 管理生成器:过滤显示列
【发布时间】:2010-01-14 14:28:47
【问题描述】:

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

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

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

如果有人有任何想法或可以指出我正确的方向,那将不胜感激,因为我整天都在追逐我的尾巴!微笑

非常感谢。

问候,

马特。

【问题讨论】:

    标签: symfony1 doctrine


    【解决方案1】:

    我上周做了这个,一开始也有点迷茫。我可以告诉你我做了什么,你会适应你的解决方案。 在我的解决方案中,我有一个名为 Notifications 的模块,其中包含以下字段:id、content、state、sent_at、instance、created_at。 在我的问题中,通知可以发送到用户列表,因此用户是外部数据,而不是保存在通知表中(1 到 n 关系)。因此,当您编辑或创建通知时,我只显示通知的几个字段(如内容和实例),其他字段(如日期)不可编辑(我的选择)。 所以在创作中,我只展示了类的 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:
    

    类:sfPropelAdminGenerator 参数: 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 的“显示:”区域中看到的那样,您可以声明您希望在创建时可编辑/启用的字段,如果您想包含一个部分,您必须声明它_ 开头,camelCase 格式,partial 名称必须以 _ 开头,名称必须用 _ 分隔。

    我发现symfony的书Admin Generator的这一章非常有用

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        类 ExpenditureFormFilter 扩展 BaseExpenditureFormFilter { 公共功能配置() { 父::配置(); $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( '格式' => '%month%/%year%', 'can_be_empty' => 假, 'months' => array_combine(range(1, 12), array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep' ', '十月', '十一月', '十二月')), 'years' => array_combine($years, $years) )); $this->widgetSchema->setLabels(数组( 'start_period' => '开始周期', )); $this->validatorSchema['start_period'] = new sfValidatorMonthYear( 大批( 'min' => strtotime(sfConfig::get('app_view_min_period')), 'max' => strtotime(sfConfig::get('app_view_main_period')) ), 大批( '必需' => 真 ) ); } 公共函数 getFields() { $fields = 父级::getFields(); $fields['start_period'] = '日期'; 返回$字段; } 受保护的函数 addStartPeriodColumnQuery($query, $field, $value) { sfContext::getInstance()->getUser()->setAttribute('start_period', $value); } }

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

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

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

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

        问候,

        马特。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-05
          • 2011-06-21
          • 2010-11-21
          • 1970-01-01
          • 1970-01-01
          • 2011-09-01
          • 1970-01-01
          相关资源
          最近更新 更多