Генератор администратора Symfony: фильтрация отображаемых столбцов - PullRequest
1 голос
/ 14 января 2010

Я использую генератор admin в Symfony 1.4, который на 99% работает, как я хочу, просто используя параметры в файле конфигурации generator.yml.

Проблема, с которой я столкнулся, заключается в том, что я хочу указать, какие столбцы отображаются в виде списка, с помощью фильтра (в отличие от их настройки в generator.yml).

Я успешно создал партиал для отображения дополнительных параметров фильтра столбцов, но я не вижу способа использования значения этого фильтра для изменения столбцов, отображаемых в списке. Я вижу, как можно использовать это значение для фильтрации критериев запроса к базе данных, но я не могу понять, как использовать этот метод для ограничения отображения определенных столбцов.

Если у кого-то есть какие-либо идеи или они могут указать мне правильное направление, это было бы очень ценно, так как я весь день гонялся за своим хвостом! Улыбка

Большое спасибо.

С уважением,

Мт.

Ответы [ 3 ]

1 голос
/ 15 января 2010

Я делал это на прошлой неделе, и поначалу тоже немного растерялся. Я могу рассказать вам, что я сделал, и вы адаптируетесь к своему решению. В моем решении у меня был модуль под названием «Уведомления» со следующими полями: id, content, state, sent_at, instance, creation_at. В моей проблеме уведомления могут быть отправлены списку пользователей, поэтому пользователи получают внешние данные, а не сохраняются в таблице уведомлений (отношение 1 к n). Поэтому, когда вы редактируете или создаете уведомление, я показываю только несколько полей уведомления (например, его содержимое и экземпляр), а другие поля, такие как дата, недоступны для редактирования (мой выбор). Таким образом, при создании я показываю только 2 из 6 полей класса. А также я хочу увидеть список пользователей для множественного выбора, поэтому я использую частичку, расположенную в папке шаблонов с именем "_get_all_users_list.php", которая имеет критерии и возвращает тег множественного выбора.

_get_all_users_list.php file

<?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}

как вы видите в области «display:» файла generator.yml при редактировании, вы можете объявить поля, которые вы хотите редактировать / включить при создании, и если вы хотите включить частичное, вы должны объявить его с помощью _ в начале и в формате camelCase, а имя части должно начинаться с _, а имя должно быть отделено _.

Я нашел очень полезной эту главу книги Symfony Admin Generator

Надеюсь, это поможет, и извините за мой английский.

0 голосов
/ 16 января 2010

Спасибо за ваши предложения. У меня возникла проблема с доступом к значению моего пользовательского фильтра, чтобы я мог использовать его для изменения отображаемых столбцов. В конце концов, вот как я этого добился:

В своем классе FormFilter я настроил свой пользовательский виджет и добавил валидатор. Это заставило меня добавить метод (add% 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');

Так что теперь я могу использовать это значение для динамического создания столбцов для отображения в шаблоне списка - миссия выполнена:)

Я бы хотел знать, если есть лучший способ, но это работает для меня!

С уважением,

Мт.

0 голосов
/ 15 января 2010

Полагаю, вам следует создать собственный генератор для реализации такой логики.

...