У меня есть таблица со всеми записями, включая все переводы на нескольких языках: Как я могу создать ссылки сортировки нумерации страниц в переведенных полях? (Торт 3.1.6)
Резюме: Это не работает, я не могу отсортировать переводы таким образом:
$this->Paginator->sort('_translations.es.title', 'Spanish')
Полная версия:
- Я использую таблицу i18n с перевести поведение.
- Я перечисляю все переводы (на нескольких языках), объединенные в одной таблице.
- И теперь я хочу использовать разбиение на страницы сортировать ссылки на переводы (сортировать по языку).
| Title ENGLISH | Title SPANISH | Title GERMAN | = pagination sort links
| ---------------- | ---------------- | --------------- |
| Christmas | Navidad | Weihnachten |
| Spring | Primavera | Frühling |
| ...
Итак, вот моя упрощенная тестовая установка:
Таблица Статьи имеет только одно поле title
для перевода.
i18n Таблица по умолчанию настроена как описано в книге.
Запеченный Table класс /src/Model/Table/ArticlesTable.php
, добавлен Translate Behavior:
public function initialize(array $config) {
// ... default config (removed in this post to simplify code)
$this->addBehavior('Translate', ['fields' => ['title']]); // added this line
}
Запеченный Entity класс /src/Model/Entity/Article.php
, добавлен TranslateTrait:
namespace App\Model\Entity;
use Cake\ORM\Behavior\Translate\TranslateTrait; // added this line
use Cake\ORM\Entity;
class Article extends Entity {
protected $_accessible = [
'*' => true,
'id' => false,
];
use TranslateTrait; // added this line
}
Запеченный Контроллер /src/Controller/ArticlesController.php
, измененный следующим образом:
namespace App\Controller;
use App\Controller\AppController;
class ArticlesController extends AppController {
public $paginate = [
'sortWhitelist' => [ // Allow pagination sort on this fields:
'title',
'_translations.es.title',
'_translations.de.title'
]
];
public function index() {
$query = $this->Articles->find('translations'); // Retrieve All Translations
$this->set('articles', $this->paginate($query));
}
}
Запеченный Просмотр /src/Template/Articles/index.ctp
, измененный / упрощенный:
<table>
<tr>
<th><?= $this->Paginator->sort('title', 'English') ?></th>
<th><?= $this->Paginator->sort('_translations.es.title', 'Spanish') ?></th>
<th><?= $this->Paginator->sort('_translations.de.title', 'German') ?></th>
</tr>
<?php foreach ($articles as $article): ?>
<tr>
<td><?= h($article->title) ?></td>
<td><?= h($article->_translations['es']->title) ?></td>
<td><?= h($article->_translations['de']->title) ?></td>
</tr>
<?php endforeach; ?>
</table>
Переводы в таблице отображаются правильно, но сортировка по переведенным полям невозможна. Когда я нажимаю на ссылки для перевода переводов на страницы, я получаю следующую ошибку:
SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец '_translations.es' в 'предложении порядка'
SQL Query:
SELECT Articles.id AS `Articles__id`,
Articles.title AS `Articles__title`,
Articles.created AS `Articles__created`,
Articles.modified AS `Articles__modified`
FROM articles Articles
ORDER BY _translations.es asc LIMIT 20 OFFSET 0
В этом аналогичном вопросе используется формат Posts_title_translation.content
- Я понятия не имею, откуда это, но я тоже пробовал это (конечно, я также добавил варианты имен полей в белый список пагинатора):
$this->Paginator->sort('Articles_title_translation', 'Spanish')
$this->Paginator->sort('Articles_title_translation.es', 'Spanish')
$this->Paginator->sort('Articles_title_translation.content', 'Spanish')
$this->Paginator->sort('Articles_title_translation.es.content', 'Spanish')
Ни один из них не работает ... (очевидно)
Как я могу отсортировать элементы таблицы по i18n-переводам поля заголовка?