【问题标题】:CakePHP 2.4 pagination sort on I18n translated fieldCakePHP 2.4 对 I18n 翻译字段的分页排序
【发布时间】:2013-12-01 21:15:10
【问题描述】:

我正在为 CakePHP 使用 SmoothTranslate Behavior。它使用 Cake 的 TranslateBehavior。

http://bakery.cakephp.org/articles/sky_l3ppard/2010/01/05/smoothtranslate-to-make-smooth-translations

我有一个包含内容(“内容”)的模型。 我有翻译的字段,所以我也有一个 I18n 模型。

当我想按这样的翻译字段排序时:

<?php echo $this->Paginator->sort('I18n__title.content',__('Title')); ?>

分页器组件将其删除,因为 I18n__title 是已翻译字段的自动生成别名,而不是模型(“内容”)的别名。

PaginatorComponent 第 396 行:

$correctAlias = ($object->alias == $alias);

$object->alias 是“Content”,但该列的 $alias 是“I18n__title”。

PaginatorComponent 的完整代码:

foreach ($options['order'] as $key => $value) {
            $field = $key;
            $alias = $object->alias;
            if (strpos($key, '.') !== false) {
                list($alias, $field) = explode('.', $key);
            }
            $correctAlias = ($object->alias == $alias);

            if ($correctAlias && $object->hasField($field)) {   
                $order[$object->alias . '.' . $field] = $value;
            } elseif ($correctAlias && $object->hasField($key, true)) {
                $order[$field] = $value;
            } elseif (isset($object->{$alias}) && $object->{$alias}->hasField($field, true)) {
                $order[$alias . '.' . $field] = $value;
            }
        }

CakePhp 2.x 可以按翻译字段排序吗?

【问题讨论】:

  • 在 CakePhp 的这种状态下,您无法对已翻译的字段进行排序,也许 Cake 3.0 将在新的翻译模型中包含这个未来。

标签: php sorting cakephp pagination cakephp-2.4


【解决方案1】:

是的,可以做到。在控制器方法上,您应该像这样调用分页器组件:

$articles = $this->paginate();

你需要把它改成这样,像这样将 I18n__title.content 添加到白名单参数中:

$articles = $this->paginate(null, array(), array('I18n__title.content', ... other fields you wanna sort must also be added));

这样可以避免在查询中将其作为模型中不可识别的字段删除(检查 PaginatorComponent 上的 validateSort 方法)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 2012-11-11
    • 2013-07-09
    • 2015-10-27
    • 2014-09-07
    • 1970-01-01
    • 2014-03-15
    相关资源
    最近更新 更多