Как отсортировать собственные столбцы в админ-панели с помощью Symfony? - PullRequest
1 голос
/ 11 августа 2011

M schema.yml:

News:
  columns:
    title:
      type: string(50)
    category_id:
      type: integer(4)
  relations:
    Category:
      local: category_id
      foreign: category_id
      type: one

Category:
  columns:
    category_name:
      type: string(50)

generator:
  class: sfDoctrineGenerator
  param:
    model_class:           News
    theme:                 admin
    non_verbose_templates: true
    with_show:             false
    singular:              ~
    plural:                ~
    route_prefix:          news
    with_doctrine_route:   true
    actions_base_class:    sfActions

    config:
      actions: ~
      fields:  ~
      list:
        display: [news_id, title, category_name]
      filter:
        display: [news_id, title, category_id]
      form:    ~
      edit:    ~
      new:     ~

В news.class:

public function getCategoryName()
{
  return $this->getCategories()->getCategoryName();
}

Это работает, но я не могу отсортировать это поле. Я могу сортировать по id, title, category_id, но не по category_name Как я могу отсортировать по этой пользовательской колонке?

Ответы [ 3 ]

5 голосов
/ 11 августа 2011

Это шаги для достижения требуемого результата.

  1. Определите табличный метод в вашем generator.yml

    config:
      actions: ~
      fields:  ~
      list:
        display: [news_id, title, category_name]
        table_method: doSelectJoinCategory
    
  2. Добавьте doSelectJoinCateory к вашей NewsTable.class.php

    class NewsTable extends Doctrine_Table
    {
      ...  
      public static function doSelectJoinCategory($query)
      {
        return $query->select('r.*, c.cateogry_name')
          ->leftJoin('r.Category c');
      }
    }
    
  3. Вам необходимо переопределить запрос сортировки в ваших actions.class.php

    class newsActions extends autoNewsActions
    {
      ...
      protected function addSortQuery($query)
      {
        if (array(null, null) == ($sort = $this->getSort()))
        {
          return;
        }
    
        if (!in_array(strtolower($sort[1]), array('asc', 'desc')))
        {
          $sort[1] = 'asc';
        }
    
        switch ($sort[0]) {
          case 'category_name':
          $sort[0] = 'c.category_name';
          break;
        }
    
      $query->addOrderBy($sort[0] . ' ' . $sort[1]);
    }
    
  4. Тема генератора по умолчанию потребует переопределения isValidSortColumn в actions.class.php

    protected function isValidSortColumn($column)
    {
      return Doctrine_Core::getTable(‘Payment’)->hasColumn($column) || $column == ‘cateogry_name’;
    }
    
  5. Вам потребуется переопределить тему генератора, чтобы отобразить ссылку сортировки и значки, поскольку для этого требуется, чтобы поле сортировки было реальным отображенным полем базы данных. отредактируйте ваш symfony_dir / lib / plugins / sfDoctrinePlugin / data / generator / sfDoctrineModule / admin / template / templates / _list_th_tabular.php:

Изменить эту строку

<?php if ($field->isReal()): ?>

На это:

<?php if ($field->isReal() || $field->getConfig('sortBy')): ?>

Надеюсь, что вам поможет

1 голос
/ 14 августа 2012

Это потому, что вы пытаетесь просмотреть столбец с именем category_name и у вас нет метода getCategory_Name(), решение очень простое. Отображать столбец categoryname не category_name.

config:
  actions: ~
  fields:  ~
  list:
    display: [news_id, title, categoryname]
    table_method: doSelectJoinCategory
  filter:
    display: [news_id, title, category_id]
  form:    ~
  edit:    ~
  new:     ~
public function getCategoryName()
{
  return $this->getCategories()->getCategoryName();
}
0 голосов
/ 05 мая 2014

интересная статья, объясняющая, как сортировать все виртуальные столбцы (внешние поля).

http://sakrawebstudio.blogspot.com/2011/01/sort-by-foreign-key-or-custom-column-in.html

...