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排序。如何按此自定义列排序?
答案 0 :(得分:5)
这些是达到所需结果的步骤。
在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')): ?>
希望能帮到你
答案 1 :(得分:1)
这是因为您正在尝试查看名为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();
}
答案 2 :(得分:0)
一篇感兴趣的文章,解释了如何对所有虚拟列(外部字段)进行排序。
http://sakrawebstudio.blogspot.com/2011/01/sort-by-foreign-key-or-custom-column-in.html