CakePHP 2.4对I18n翻译字段进行分页排序


CakePHP 2.4 pagination sort on I18n translated field

我正在为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是翻译字段的自动生成别名,而不是模型("Content")的别名。

传呼机部件线路396:

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

$object->别名为"Content",但列的$alias为"I18n_title"。

寻呼组件的完整代码:

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可以通过翻译字段进行排序吗?

是的,可以做到。在控制器方法上,您应该有一个对分页器组件的调用,如下所示:

$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方法)