CakePHP のtranslate behaviorを使用して、1 つのフォームに複数の翻訳を含むアイテムを追加しようとしています。
翻訳フィールドを検証するにはどうすればよいですか? たとえば、特定の言語を必須にしますか?
本で説明されているように設定された、別の変換テーブルitems
を持つ単純なテーブルがあると仮定しましょう。簡単な例として、テーブルには翻訳するフィールドが 1 つしかなく、5 つの言語で保存したいとします。だから私はこのようなフォームを作成します(ビューテンプレートで): items_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
機能します (スタックオーバーフローのコードを単純化し、例の一部の名前を変更したため、タイプミスがある可能性がありますが、アイデアを得る必要があります) ...)。
さらに、英語(デフォルト) とスペイン語が必須で、他の言語フィールドはオプションであるとします。どうすればそれを達成できますか?
で、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);
ただし、翻訳が破棄されるため、常に「このフィールドは必須です」という検証エラーが発生します。これは、ワークフローの保存に関する GitHub の未解決の問題でわかっています (ところで、このリクエストには +1 :)。
そのため、現在、CakePHP の翻訳動作を使用するときに翻訳フィールドの検証ルールを定義する方法があるかどうかはわかりません...必要な言語フィールドは単なる例です。最小/最大などを検証する場合、同じ問題が発生します。外国語の入力フィールドの長さ...