0

画像を添付する必要がある他のモデルによってリンクされている一般的な画像モデルがあります。ほとんどの場合、画像は必要ありません。画像がアップロードされていない場合に備えてフォールバックがありますが、いくつかの特定のケースでは、フォームを検証するために画像のアップロードを強制する必要がありますが、検証方法がわかりません。それは別のモデルを介して。たとえば、私のモデルは次のようなものです。

class Person extends AppModel
{
   public $belongsTo = array(
      'Image' => array(
         'className' => 'Image',
         'foreignKey' => 'image_id',
         'type' => 'LEFT',
      )
  );

  public $validate = array(
     ...
  );
}

モデルには、フィールドだけでなく、ユーザーが入力する必要があるいくつかのPersonテキスト フィールドが含まれていredirect_urlます。リダイレクトが設定されている場合、ページ ロジックは読み込みをスキップし、その URL に直接リダイレクトします。ただし、設定されていない場合は、他の多くのフィールドが必要です。Personモデルでカスタム検証メソッドを使用してこれを適切に機能させましたが、フィールドはモデルへの単なるポインターであるため、モデルimage_idによって明示的にチェックされません。PersonImage

Imageこのインスタンスにカスタム/動的検証ルールを追加して、Person.redirect_url設定されているかどうかを確認することはできますか? 私ができる唯一のことは、これを私のものに追加し、beforeSave()基本的に手動でチェックすること$this->dataですが、可能であればこれを「正しい」方法で行い、Validation クラスにフックしたいと思います。

このようなものを使用していくつかのバリエーションを試しましたが、これまでのところ運がありません:

$this->Person->Image->validate['id']=array(...);

編集:

これが私がやろうとしたことです。どのような作品ですか:

public function beforeValidate($options=array()) {
    parent::beforeValidate($options);

    if(empty($this->data['redirect_url'])) {
        if (!isset($this->data['Image']['filepath']) {
            $this->invalidate('Image.filepath', 'Custom error message.');
            return false;
        }
    }
}

これにより、別の場所にコードを追加しなくてもフィールドを無効にできますが、フロント エンドでフォーム フィールドを印刷すると、「カスタム エラー メッセージ」ではなく一般的な「このファイルが必要です」というエラーが表示されます。これは、ファイルのアップロードが、ローカル ファイル システムではなく S3 に転送するプラグインによって処理され、チェーンのどこかで上書きされているためだと思います。

4

0 に答える 0