Я пытаюсь добавить элемент, включая несколько переводов в одной форме с CakePHP translate behaviour.CakePHP 3.1: Validation for translate fields (i18n)
Как я могу проверить поля перевода?. указать конкретные языки?
Предположим, у вас есть простой стол items
с separate translations tableitems_i18n
, настроенный, как описано в книге. В качестве простого примера таблица items
имеет только одно поле title
для перевода, и я хочу сохранить title
на пяти языках. Таким образом, я делаю вид, как это (в add
шаблоне вида):
echo $this->Form->create($item, ['controller' => 'Items', 'action' => 'add']);
echo $this->Form->input('title', ['label' => __('English')]);
echo $this->Form->input('_translations.es.title', ['label' => __('Spanish')]);
echo $this->Form->input('_translations.fr.title', ['label' => __('French')]);
echo $this->Form->input('_translations.de.title', ['label' => __('German')]);
echo $this->Form->input('_translations.it.title', ['label' => __('Italian')]);
echo $this->Form->button(__('Save'), ['type' => 'submit']);
echo $this->Form->end();
И экономия в контроллере (add
действие/функция), как это:
$item = $this->Items->newEntity();
if ($this->request->is('post')) {
$translations = [
'es' => ['title' => $this->request->data['_translations']['es']['title']],
'fr' => ['title' => $this->request->data['_translations']['fr']['title']],
'de' => ['title' => $this->request->data['_translations']['de']['title']],
'it' => ['title' => $this->request->data['_translations']['it']['title']],
];
foreach ($translations as $lang => $data) {
$item->translation($lang)->set($data, ['guard' => false]);
}
$item = $this->Items->patchEntity($item, $this->request->data, ['validate' => 'default']);
if ($this->Items->save($item)) { $this->Flash->success(__('Saved.')); }
else { $this->Flash->error(__('Not saved.')); }
}
$this->set('item', $item);
Это работает без проверки или если у меня есть только правила валидации для «родного» поля title
(ну, должно быть, я упростил код для stackoverflow и переименовал некоторые части для примера, так что, возможно, есть некоторые опечатки, но вы должны получить идею ...).
Теперь давайте предположим далее языки английский (по умолчанию) и испанский являются необходимые, другие поля языка не являются обязательными. Как я могу это достичь?
В ItemsTable
я пытался что-то подобное для проверки:
class ItemsTable extends Table {
public function validationDefault(Validator $validator) {
$validator
// Title English (default field)
->requirePresence('title')
->notEmpty('title', __('Required field'))
// Title Spanish (translate behaviour field)
->requirePresence('_translations.es.title')
->notEmpty('_translations.es.title', __('Required field'))
;
return $validator;
}
}
Но это приносит ВСЕГДА ошибка проверки «Это поле требуется», потому что patchEntity($item, $this->request->data);
результаты в переводах выбрасываются. Я знаю это открытым issue on GitHub о сберегающем рабочем потоке (битва +1 для этого запроса :).
В настоящее время я не уверен, есть ли способ определить правила валидации для полей перевода при использовании поведения перевода CakePHP ... Обязательный Языковые поля являются лишь примером, та же проблема возникает, если вы хотите утвердить, например минимальная/максимальная длина поля ввода для иностранного языка ...
Мой подход к subjetcs здесь, если он может вам помочь: http://stackoverflow.com/questions/33426427/cakephp-3-1-my-validation-for-translate-behaviour-fields-need-some- помощь-в-ре – Angyo