肉とビールとパンケーキ by @sotarok

少し大人になった「肉とご飯と甘いもの」

エラーで戻ったときにDBから取得した情報を表示したい

  • 【前提条件】
    • 入力画面で DB の情報を表示している
    • 入力値のバリデーションが次のアクションで行われる
    • 入力エラーが在った場合は入力画面に戻す
  • 【問題点】
    • Ethna のアクション遷移の仕様上、Ethna_ActionClass::prepare() で、string を return すると、次に呼ばれるのは Ethna_ViewClass::preforward() となる
    • そのため、入力エラーの際に、入力画面のアクション名を return しても DB から情報を取得する処理は走らない
    • 結果として、(テンプレートを適切に書いていれば) 入力エラーは表示されるが、情報が表示されない状態になる
2008-01-25 - public class Monry extends Dairy implements Hatena


むむ.
これはなにをしたいのかな?と,一瞬よくわからなかったのだけど,【前提条件】を見る限り,いつもやってることだなぁと感じたので,そんなに難しいことをする必要があるのかな?と思った.

見た感じで考えられるのは,2つの場合があると思うんだけど,


1.DBからとってきた内容をデフォルト値として与え,ポストさせる.入力エラーで戻ってきたときにフォームの内容をDBの内容に戻して表示させたい


または,


2.入力エラーで元の画面に戻ったときに,DBからとってきた情報を表示させたい.(フォーム以外)

  • 例えば,掲示板の返信とかがわかりやすいかな.「返信」をクリックすると,親記事(From DB)とフォームが現れる→POST→エラーで入力画面に戻ったときに親記事表示されないじゃん!みたいな.

まぁ,仮に,以下のとおりとしておきます.

  • POST画面
    • action : sample_post
    • view : sample_post
  • POST後画面
    • action : sample_post_do
    • view : ナシ(リダイレクト)

1.prepareでDBから取得

とりあえず,上から.

sample_post_doの

<?php // 着色料

...

class Sample_Action_SamplePostDo extends Sample_ActionClass
{
    function prepare()
    {

        if ($this->af->validate() > 0) {
            /** 
             * ここでDBから情報を取得して取得して(コードは略)
             **/
            $this->af->set('hoge', $hoge); // としてフォームの値を上書き.
        }
        return null;
    }
...
}

こうすれば,テンプレートがちゃんと記述されていれば,値は戻ります.
ちょっとこのテンプレートがちゃんと記述されていれば,が気になったんですけど...要するに,以下のとおり.

フォームヘルパを使ってない(非推奨 ((なぜならdefaultとか使えないから)))

<input type="text" name="hoge" value="{$form.hoge}" />

フォームヘルパを使っている

{form_input name="hoge"}

2.周りの内容が取得できない

sample_postのView(preforward)にDBから取得する内容を記述して万事解決.
(というか,表示用の内容ならそうするべきだと思うし)

はて

なにかご質問があればなんなりと...w