2017-11-17 5 views
0

CakePHP3のI18Nフィールドの検証にいくつかの困難があります。ここでの宣伝のように CakePHP 3での翻訳されたエンティティの検証

$this->addBehavior('Translate', [ 
    'fields' => ['name', 'body', 'slug'], 
    'validator' => 'default' 
]); 

変換動作は、このような設定であるhttps://book.cakephp.org/3.0/en/orm/behaviors/translate.html#validating-translated-entities

コアの検証が正常に動作しています。私は、名前が空ではないとそれが正常に動作するかどうかをチェックするvalidationDefault関数の検証ルールを持っています。しかし、私はまた、このバリデーションの上にいくつかのアプリケーションルールを追加したいと思います。 「名前」フィールドには一意の値が必要です。私は、同じ翻訳された名前を持つ複数のエンティティを許可したくありません。

このコードは明らかに機能しません。 CakePHPのドキュメントはまた、この問題について非常に静かです。

public function buildRules(RulesChecker $rules) { 
    // prevent duplicate creation 
    $rules->add($rules->isUnique(['name'])); 
    return $rules; 
} 

これは実際に可能ですか? ありがとう

+0

こんにちはあなたは$バリデータのルールでこれを追加しました---> - > [ 'ルール'、 'ユニーク'、 '名前'(追加=> 'validateUnique'、 'provider' => 'table']); after-> notEmpty( 'name') – Gransfall

+0

次の2行を試しました。 1. $ validator-> add( 'name'、 'unique'、['rule' => 'validateUnique'、 'provider' => 'table']); =>不明な列のSQLエラーを返す 2。$ validator-> add($ this-> translationField( 'name')、 'unique'、['rule' => 'validateUnique'、 'provider' => 'table']); =>ちょうどそれが保存されているので妥当性は確認されていません – Laurent

+0

私は新鮮なインストール(3. 5)でユニークなフィールドに問題はなく、唯一の違いはその行になる可能性があるので尋ねます。 :/ – Gransfall

答えて

0

メインモデルのnameフィールドのルールを作成していますが、これは翻訳には影響しません。そのためのビルトイン機能はありません。ビヘイビアは、モデルクラスに存在する場合にvalidationTranslated()メソッドを使用して検証ルールを支援するだけで、アプリケーションルールには役立ちません。あなたがfieldlocalemodelcontentフィールドに対して照合することによって、変換テーブルをチェックするカスタムアプリケーションのルールを作成する必要があると思います

、本の線に沿って何か:

$rules->add(
    function (EntityInterface $entity) { 
     $behavior = $this->behaviors()->get('Translate'); 
     $association = $this->association($behavior->getConfig('translationTable')); 

     $result = true; 
     foreach ($entity->get('_translations') as $locale => $translation) { 
      $conditions = [ 
       $association->aliasField('field') => 'name', 
       $association->aliasField('locale') => $locale, 
       $association->aliasField('content') => $translation->get('name') 
      ]; 

      if ($association->exists($conditions)) { 
       $translation->setErrors([ 
        'name' => [ 
         'uniqueTranslation' => __d('cake', 'This value is already in use') 
        ] 
       ]); 

       $result = false; 
      } 
     } 

     return $result; 
    } 
); 

(注)このことターゲットテーブルではなくアソシエーションオブジェクトを使用すると、モデル名などの追加条件が自動的に適用されます。

また、エンティティのエラーをネストされているため、ルールチェッカーでサポートされていないため、手動で設定する必要があります(現在は、errorFieldオプションを参照)。

変換テーブルの関連付けのルールチェッカーを(Model.buildRulesイベントを介して)変更することは可能ですが、これにより、別のエンティティに配置される新しいエンティティにエラーが設定されることにも注意してくださいフォームヘルパーがエラーを見つけられないメインエンティティ上のプロパティ(デフォルトでは_i18n)を使用するため、手動でエラーを読み取る必要があります。これは少し面倒です。

も参照してください

関連する問題