其他分享
首页 > 其他分享> > 如何在管理面板中用symfony对自己的列进行排序?

如何在管理面板中用symfony对自己的列进行排序?

作者:互联网

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,标题,category_id进行排序,但不能按category_name进行排序.如何按此自定义列排序?

解决方法:

这些是达到所需结果的步骤.

>在generator.yml中定义表格方法

config:
  actions: ~
  fields:  ~
  list:
    display: [news_id, title, category_name]
    table_method: doSelectJoinCategory

>将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');
  }
}

>您需要在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]);
}

>默认生成器主题将要求您覆盖actions.class.php中的isValidSortColumn

protected function isValidSortColumn($column)
{
  return Doctrine_Core::getTable(‘Payment’)->hasColumn($column) || $column == ‘cateogry_name’;
}

>您将需要覆盖生成器主题以显示排序链接和图标,因为它要求排序字段是真实的数据库映射字段.编辑您的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')): ?>

希望对您有帮助

标签:symfony-1-4,php,doctrine,symfony1
来源: https://codeday.me/bug/20191013/1908987.html