さてと、どこから手をつけましょう。

    public function action_index()
    {
        //$data[“subnav”] = array(‘index’=> ‘active’ );
        $data[“month”] = date(“F”);
        $data[“today”] = date(“Y/m/d”);
        $data[“year”] = date(“Y”);
        $this->template->title = ‘祝!フロイデさん31期!’;
        $this->template->content = View::forge(‘calendar/index’, $data);
        $this->template->content->set_safe(‘cal_head’,$this->cal_header());
        $this->template->content->set_safe(‘cal_body’,$this->cal_body(date(“Y”),date(“n”)));
        $this->template->content->set_safe(‘options’,$this->makeOptions(date(“n”)));
    }
    
    public function action_putbutton(){
        
         $val = Validation::forge();
        $val->add(“year”,”年”)->add_rule(“required”)->add_rule(“match_pattern”,”/^[1-9][0-9][0-9][0-9]$/”,”西暦”);
        $val->set_message(“required”,”:labelは必須項目です。”);
        $val->set_message(“match_pattern”,”:labelは数字4桁で入力してください。”);
        $this->template->title = ‘祝!フロイデさん31期!’;
        if($val->run()){
            $data[“month”] = date(“F”,mktime(0,0,0,$val->input(“month”),1,$val->input(“year”)));
            $data[“today”] = date(“Y/m/d”);
            $data[“year”] = $val->input(“year”);
            
            $this->template->content = View::forge(‘calendar/index’,$data);
            $this->template->content->set_safe(‘cal_head’,$this->cal_header());
            $this->template->content->set_safe(‘cal_body’,$this->cal_body($val->input(‘year’), $val->input(‘month’)));
            $this->template->content->set_safe(‘options’,$this->makeOptions($val->input(‘month’)));
            
        } else {
            
        }
    }

action_indexとaction_putbutton、同じことしてますよね。それぞれの引数が違うだけです。

これをひとつのfunctionにまとめましょう。

private function disp_calendar($data){
    $this->template->title = “祝!フロイデさん31周期!!”;
    $this->template->content = View::forge(‘calendar/indes’,$data);
    $this->template->content->set_safe(‘cal_head’,$this->cal_header());
    $this->template->content->set_safe(‘cal_body’,$this->cal_body($data[‘year’], $data[‘month_num’]));
    $this->template->content->set_safe(‘options’,$this->makeOptions($data[‘month_num’]));
}

こんなfunctionを作成しました。これを利用して、まずはaction_indexを書き換えます。

public function action_index()
{
    //$data[“subnav”] = array(‘index’=> ‘active’ );
    $data[“month”] = date(“F”);
    $data[“today”] = date(“Y/m/d”);
    $data[“year”] = date(“Y”);
    $data[“month_num”] = date(“n”);
        
    $this->disp_calendar($data);
}

これで初期表示ができるか試しましょう。

ふむ、大丈夫そうです。ではaction_putbuttonのほうも修正しましょう。

public function action_putbutton(){
        
    $val = Validation::forge();
    $val->add(“year”,”年”)->add_rule(“required”)->add_rule(“match_pattern”,”/^[1-9][0-9][0-9][0-9]$/”,”西暦”);
    $val->set_message(“required”,”:labelは必須項目です。”);
    $val->set_message(“match_pattern”,”:labelは数字4桁で入力してください。”);
    if($val->run()){
        $data[“month”] = date(“F”,mktime(0,0,0,$val->input(“month”),1,$val->input(“year”)));
        $data[“today”] = date(“Y/m/d”);
        $data[“year”] = $val->input(“year”);
        $data[“month_num”] = $val->input(“month”);
            
        $this->disp_calendar($data);
            
    } else {
            
    }
}

Validationの部分は変わりませんが、Viewを表示する部分はaction_indexと同じく$dataという配列に必要なデータを詰め込んで、disp_calendarに渡す、という動きにしています。

動作確認。

大丈夫そうですね。6月を表示してみました。

しか~し!!

ここでハタと難問にぶつかりました。これからValidationのチェックに引っかかってしまったときの処理を作っていくわけですが、年が入力されていない、あるいは西暦の形をしていないということは、カレンダーが作れないわけです。

$this->template->content->set_safe(‘cal_body’,$this->cal_body($data[‘year’], $data[‘month_num’]));

現状では、カレンダーを作ることを前提として作られているこの部分、$data[‘year’]にまともな値が入っていないわけですから、エラーしてしまいそうです。

そこで、このfunctionに「Validadationチェックの結果がどうだったのか?」という値を渡し、それによって、カレンダーを表示するかしないかの分岐をさせようと思います。

私はこのカレンダー作りにおいて、最初から綿密に設計していない、ということはお読みになっていただけている方にはモロ分かりだと思います。その場の思い付きで作成し始め、問題にぶち当たるたびにコードを変更して作成していく、というのが、ソフトウェアの製造で許される特徴なんですね。

受け売りですが、どこかで、何かで読みました。

ものづくり大国と言われる日本、何故かソフトウェアの世界では後塵を拝しています。amazon,google,facebook,twitter,oracle,microsoft挙げればきりがありませんね。

日本をものづくり大国たらしめているのはトヨタ、ソニー、日立、パナソニック、その他、世界屈指の技術を持った大中小の製造会社の働きです。

つまり、ハードウェアです。リアルなモノを作らせたら凄い!

では先にあげたソフトウェア界の重鎮たる会社は何故アメリカに多いのでしょう。私が読んだ文章には「国民性」という切り口で解説が書かれておりました。

日本人は「綿密な計算、設計」で完全無欠な設計書を起こし、その設計書を元に寸分違わぬ高品質なものを作ることが上手な国民なのだそうです。

ソフトウェアの世界で言うところのウォーターフォールと言われる製造手法です。

これをやらせたら敵う民族はいない、というくらいに凄みを見せます。

逆にアメリカ人というのは、思いついたらすぐに作り始めちゃう、という行動力にあふれた国民性なのだそうです。そして、作っているうちに間尺に合わなくなったところはフレキシブルにその場で変更していってしまう、という作り方は、ソフトウェア製造にとても向いているのだそうです。

新幹線を思い付きで作り始め、途中で間尺に合わない部分が出たから手戻りして部品作り直し、とかやってたらとんでもないことになることは確かにわかりますよね。

その点、たしかにソフトウェアはどうにでもなる、というところはあります。少なくともハード作りよりは融通が利くでしょう。私もそのようにいったん作ったものをどんどんと作り直している姿をお見せしています。

しかし、アメリカだってすごいハードウェア作ってますよね。ロケットだって飛ばしてるし。一概に言えたものではないですが、この説、どこか府におちる部分もありますよね。

プリウスを作る日本の国民性と、バカでっかいエンジンで大量のガソリン爆発させて突っ走るアメ車を作るアメリカ人、みたいな一面もありますし(笑)

脱線してしまった。。なかなか完成しませんね。次回はカレンダーを表示できないときの処理を作りましょう。おやすみなさい。