2013年9月7日 星期六

用 Eclipse 開發 Yii Web Application (九)

在網頁程式設計中, 除了Radio Button(選項按鈕)及 Dropdown List(下拉式選單) 可以幫助使用者輸入規範的格式外, 還有一個常用的就是 Check Box(選取方塊), 這裡我們就要跟大家介紹
 Yii  裡面如何使用 CheckBoxList。
基本上 Check Box 與 Radio Button 十分相似, 都是用點選方式輸入資料, 但兩者最大差別是
Radio Button 是單選, 而 Check Box 是允許複選的。

因此如果在後續處理上, 沒有做特別的處理(通常就是用迴圈讀取) 往往只有Check Box 最後點選的那筆資料會被記錄下來。
我們就用 Classes 的 create 來示範。
原本課程名稱的部分是用下拉式選單, 一次只能選一門課。
我們想要改用選取方塊, 一次可以選多門課, 如下面:
要改幾個地方, 首先在 _form.php(因為 create.php 將新增資料的格式定義在 _form.php) 將
顯示課程名稱的下拉選單改成以下程式碼:
 <?php echo $form->checkBoxList($model, 'course_no', CHTml::listdata(
            Courses::model()->findAll(array('order' => 'course_no')),'course_no','course_name')
,
             array('template'=>'<tr><td width=1>{input}</td><td>{label}</td></tr>', 'separator'=>''));?>
checkBoxList 用法與 dropDownList 相似, 同樣的 checkBoxList  所需的資料可以用 listdata 來
提供使用 Courses::model()->findAll(array('order' => 'teacher_no')) 將 courses 內的課程取出,
並做成 checkbox 的項目。
View 的部分修改好了, 因為改用check box 後可以一次新增多筆資料, 所以還有 Controller 的
部分要修改。
在 ClassesController.php 裡處理新增資料的是 public function actionCreate() 而資料輸入後
存入資料庫的原本程式碼是
        if(isset($_POST['Classes']))
        {
            $model->attributes=$_POST['Classes'];
            if($model->save())
                $this->redirect(array('view','id'=>array('course_no'=>$model->course_no,
                 'student_no'=>$model->student_no, 'semester'=>$model->semester)));
        }

if($model->save()) 那行的功用是如果資料儲存成功就將網頁導至 view.php 以顯示剛剛
新增資料的內容。
由於勾選選取方塊會以 array 的方式儲存在 $model->course 所以我們改成:
        if(isset($_POST['Classes']))
        {
            $model->attributes=$_POST['Classes'];
            foreach ($model->course_no as $course_no){
                $temp[] = $course_no;
            }   
            foreach ($temp as $course_no){
                $model->course_no = $course_no;
                $model->setIsNewRecord(true);
                $model->save();
            }
        $this->redirect(array('index'));
        }

其中第一個 foreach 是要把每一個點選的課程代碼取出, 並暫存在一個 $temp array 裡。
第二個 foreach 把剛暫存的課程代碼回寫入 $model->course_no, 然後再用 $model->save()
寫入資料庫中。為什麼要這麼麻煩, 原因是如果直接用 $model->save()只會存入一筆資料,
不會是多筆。
另外重要的一點是, 在第二個 foreach 裡 $model->save() 前要先用 $model->setIsNewRecord(true)
以避免寫了第一筆資料後, 就寫不進去後面的其他筆資料了。
當然我們還是需要將它導到另一頁, 因為多筆資料所以就改導到 index.php。
我們來看看結果:

果然三筆資料都寫入了。
參考資料: checkBoxList      setIsNewRecord

沒有留言:

張貼留言