村井(マックスではない)OctoberのModelクラスにはオーバーライドすることができるイベントメソッドが複数あり、バリデーション前後や、レコードの作成前後、レコードの更新前後など、それぞれの処理の前後に開発者が任意の処理を加えることができます。イベントメソッドの一覧はこちら今回は「octoberのバリデーションチェックではできない選択内容の組み合わせエラーをチェックする」という実装をする際に、イベントメソッドのafterValidateを利用したのですが、使い方に苦戦したのでご紹介します。CMS:1.0仕様まずafterValidateを含む登録フローをざっくりですが整理してみました。※今回はレコード作成時を想定しています。6afterCreate()簡単に書くとこんな感じでした。私は3のafterValidateで、組み合わせエラーをチェックしようと考えました。ValidationExceptionというクラスがあったので、これを利用して3でエラーがあればエクセプションを投げ、画面にエラー内容を表示するように実装しました。'ステータスが「公開」の時、公開日は必須です。'ステータスが「公開」の時、公開日は必須です。']);}}}ですが何度やっても2でエラーがあったとしても、3のエクセプションが優先して出てきてしまいました。内部コードを調べてみると、以下のようなフローであることが分かりました。afterValidate()→バリデーションエラーの出力このことから、afterValidate内でエクセプションを投げてしまうと、バリデーションエラーが出力される前にエクセプションが投げられることになってしまうことが分かりました。これを踏まえて実装を行いました。実装まず内部コードを見て、$this->validationErrorsには、october側のバリデーションエラーが入っていることが分かったので、そこにafterValidate内のエラー内容を追加するようにコードを変更してみました。"ステータスが「公開」の時、公開日は必須です。"ステータスが「公開」の時、公開日は必須です。");}}ただこれだけでは、afterValidateの内容が出力されませんでした。原因は、october側のバリデーションチェックでエラーがあったかどうかのフラグを持っているらしく、afterValidateでエラーを追加しても、october側のバリデーションチェックでエラーが無ければ、afterValidateの内容は無かったことになってしまうようでした。これを踏まえて、次のように変更しました。"ステータスが「公開」の時、公開日は必須です。"ステータスが「公開」の時、公開日は必須です。ModelException($this);}}これで、octoberのバリデーションエラーが先、afterValidateのエラーが後に、$this->validationErrorsに格納されるため、表示の優先順位が問題なくなり、「バリデーションチェック後、status=”1′′でpublished_atに値が無かった場合にエラーを投げる」という実装ができました。まとめ私は内部ソースを読んでこの方法を発見したので、正規の方法とは違っている可能性がありますが、私の探し方では公式の使い方が見つからなかったため、独自の方法をご紹介しました。システム開発のご相談はこちらからお気軽にお問合せください。コメントをキャンセルメールアドレスが公開されることはありません。/技術コンサルティング、といった総合的な開発ソリューションを展開しています。