1

Тема: Сортировка "своих" полей aka Custom column sort

Введение:
Всё ниже написанное сгенерено через doctrine:generate-admin
В модуле при отображении списка, нужно выводить колонки, которые берутся из другой таблицы (связанная по связи hasMany, hasOne and etc...).
Это можно делать двумя способами (которые я пока понял). Это правка темплэйта, и вместо вывода id выводить данные из объекта к примеру есть у нас сл. связь:

Auto:
  columns:
    mark:
      type: string(255)
      notnull:  true
    model:
      type: string(255)
      notnull:  true 
Part:
  columns:
    Auto_id:
      type: integer
      notnull:  true
    name:
      type: string(255)
      notnull:  true
    others-columns...
  relations:
    Auto:
      onDelete: CASCADE
      local:  Auto_id
      foreign:  id

и нам нужно выводить два поля `auto.mark` и `auto.model`
тогда мы определяем шаблон _list_td_tabular.php (легче всего его скопировать из кэша), так же еще нужно будет предопределять _list_th_tabular. И в столбце где стоит $part->getAutoId();. Заменяем на $part->getAuto()-getAutoMark();. И по аналогии добавляем новый столбец для getAutoModel(). Также необходимо будет править табулар для шапки, иначе таблица разъедиться.
Теперь мне необходимо сделать сортировку по этим колонкам. И тут я уже не знаю что делать... Немного погуглив наткнулся на способ задания этих полей через generator.yml
Способ #2 - table_method: queryList 
Задаем table_method: queryList  в generator.yml для нужного модуля. Потом идем в папку с моделями DOC_ROOT_SF/lib/doctrine/ и открываем {имя_модуля}Table.class.php там создаем метод quertList

    public function queryList($query)
    { 
      $query
        ->select('
          r.name AS name,
          a.mark AS mark,
          a.model_issue AS model,
          (r.price_sale - r.price_provider) AS price_diff,
          r.id
        ')
        ->leftJoin('r.Auto a');
      return $query;
    }

Потом в generator.yml прописываем какие поля нам нужно отображать:

      list:
        table_method: queryList  
        display: [ =name, mark, model, price_sale, is_availability ]

Так мы получили нужные нам поля для списка.
теперь есть такой параметр как sort, я так понял что он определяет по каким полям доступна сортировка. Добавим этот параметр с нужными полями и в итоге часть generator.yml для list будет выглядить сл. образом

      list:
        table_method: queryList  
        display: [ =name, mark, year_issue, price_sale, price_diff, is_availability ]
        sort: [name, mark, year_issue, price_sale, price_diff, is_availability ]

В итоге сортировка добавилась для "родных полей", а поля которые берутся по связи сортировать нельзя...
И дальше я зашел в тупик.
Где можно предопределить сортировку или добавить метод (по аналогии с фильтром) сортировки этих полей

путь осилит идущий...

2

Re: Сортировка "своих" полей aka Custom column sort

Во первых. Прописывать table_method нужно совсем не для этого, и от предложенных вами способов это никак не зависит. Его добавляют, чтобы сделать сразу джойн на нужные таблицы (ну и возможно добавить какую-то другую логику), чтобы список выбирался одним запросом, а не "1 + 1_на_каждую_запись".
Далее. Запись "=поле" в генераторе придумали специально для того, чтобы ваш первый предложенный вариант стал ненужен.
Теперь что касается сортировки. Да, чтобы добавить сортировку для связанных таблиц, придется опять добавлять методы и править шаблоны. Именно поэтому я у себя переписал сортировку полностью, чтобы можно было прямо в генераторе задавать нужные связанные поля. В вашем случае - вы добавляете в шаблон _list_th_tabular.php, по аналогии с имеющимися там блоками для сортировки, аналогичные, но для ваших полей. Затем идете в actions.php и переписываете там метод addSortQuery() так, чтобы он делал сортировку по нужным вам полям приджойненных таблиц. Собственно все.

P.S. Случайно нагуглить способ, который описан в доке по генераторам - это конечно круто default/smile

3

Re: Сортировка "своих" полей aka Custom column sort

P.S. Случайно нагуглить способ, который описан в доке по генераторам - это конечно круто

просто я гуглил именно по кастом сорт. default/smile
а так я знал что можно отключать поля и включать... в генератор.ямл

Затем идете в actions.php и переписываете там метод addSortQuery() так

а покажите пожалуйста запрос который вы делаете? а если быть точнее как вы узнаете какую колонку нужно сортировать, ведь там передается только $query (protected function addSortQuery($query))
А так я делаю почти так же, только изменяю не addSortQuery() а isValidSortColumn($column)
прописываю принудительно true "своим" полям. Это конечно не красиво...
Просто думал, что можно как то красивее без ковыряния шаблона... Уж очень красива идея прописывать это в ямл default/smile

путь осилит идущий...

4

Re: Сортировка "своих" полей aka Custom column sort

Прописывать в ямл - это надо переписывать генераторы.

А так, посмотрите в этот метод, там же четко видно, что, где и как получается.

  protected function addSortQuery($query)
  {
    if (array(null, null) == ($sort = $this->getSort()))
    {
      return;
    }

    $query->addOrderBy($sort[0] . ' ' . $sort[1]);
  }

В $sort вы получаете массив с названием поля и направлением сортировки.
Вот по названию поля и определяйте, какой запрос вам делать. Переопределите этот метод и добавьте логику для своих добавленных полей, меняя в зависимости от названия поля запрос (подставляя нужный алиас).

P.S. Смотрел код я по старому проекту еще на Симфони 1.2, потому что все новые у меня используют свои генераторы, где все по-другому. Но не думаю, что там существенные изменения по сравнению с 1.4.

Отредактировано relo_san (2010-07-21 11:43:13)

5

Re: Сортировка "своих" полей aka Custom column sort

relo_san пишет:

Прописывать в ямл - это надо переписывать генераторы.

А так, посмотрите в этот метод, там же четко видно, что, где и как получается.

  protected function addSortQuery($query)
  {
    if (array(null, null) == ($sort = $this->getSort()))
    {
      return;
    }

    $query->addOrderBy($sort[0] . ' ' . $sort[1]);
  }

В $sort вы получаете массив с названием поля и направлением сортировки.
Вот по названию поля и определяйте, какой запрос вам делать. Переопределите этот метод и добавьте логику для своих добавленных полей, меняя в зависимости от названия поля запрос (подставляя нужный алиас).

P.S. Смотрел код я по старому проекту еще на Симфони 1.2, потому что все новые у меня используют свои генераторы, где все по-другому. Но не думаю, что там существенные изменения по сравнению с 1.4.

                        Отредактировано relo_san (Сегодня 11:43:13)

извините я забыл упомянуть, что в getSort() отсутствую эти поля... так как они не проходят проверку у isValidSortColumn($column)... Поэтому я там и прописываю свои поля:

  protected function isValidSortColumn($column)
  {
    //var_dump($column);
    if ($column=='mark' OR $column=='year_issue' OR $column=='model' OR $column=='price_diff')
    {
      //return Doctrine::getTable('auto')->hasColumn($column);
      return true;
    }
    else
      return Doctrine::getTable('part')->hasColumn($column);
  }

но это до ужаса не красиво... default/sad
А можете рассказать про свой генератор? И если есть возможность покажите?
Спасибо за помощь...

путь осилит идущий...

6

Re: Сортировка "своих" полей aka Custom column sort

А, точно, проверку isValidSortColumn я не заметил default/smile
В вашем случае вместо if ($column=='mark' OR $column=='year_issue' OR $column=='model' OR $column=='price_diff')
гораздо лаконичнее написать if (in_array($column, array('mark','year_issue','model','price_diff'))).
И сразу приятнее взор default/smile

P.S. Что касается моих генераторов - я в принципе опубликовал их на кампе, но сейчас готовлю новую версию, намного лучше предыдущей, а главное - консистентную и расчитанную на самостоятельную работу (ранее у меня фактически три плагина были зависимы друг от друга и изменяли Симфони очень сильно).
http://symfonycamp.org.ua/about/topics/relo_san/ - доклад "Кастомизация генераторов", там есть ссылки на репозитарии этих плагинов. Но это разве что для общего развития - использовать их практически нереально, поскольку к ним на данный момент нет никакой документации. Новая версия выйдет в скорее всего к началу августа, пока много работы и без этого.

7

Re: Сортировка "своих" полей aka Custom column sort

Спасибо Вам за помощь и ответы! Позже посмотрю ваши генераторы, но раз доков нету, то я не смогу их использовать в реальных проектах, так как команда навряд ли захочет ковыряться...

путь осилит идущий...

8

Re: Сортировка "своих" полей aka Custom column sort

И правильно, не надо этого делать default/smile Лучше я сначала все допилю, напишу доки и выложу. После уже и использовать можно будет.