2013-10-22 62 views
0

我正在使用Yii,並且在使用某些下拉菜單時遇到了一些問題。 基本上我使用CForm來顯示一些課程的下拉菜單。學生可以選擇兩門課程,每門課程選擇學生可以選擇第一選擇和第二選擇。這是一個要求,每個課程的選擇分別插入到數據庫中。例如,一個學生想學2個療程,並希望有一個第一和第二優先級當然,他們會選擇這樣的:更改Yii中的CForm下拉列表屬性

  1. 場有1 - 第一優先
  2. 場有1 - 2優先
  3. 兩課 - 第一優先
  4. 兩課 - 第二優先

這將使4個新行到數據庫中。課程的管理員希望將其顯示爲包含課程的4個下拉菜單。

目前,我正在測試的課程只有第一和第二優先級,但問題是課程一 - 優先級總是空的,除非爲優先級二選擇一個值。然後,優先級1獲得與優先級2相同的值,即使選擇了兩個不同的課程。我一直在關注本教程Form Builder,因爲我正在使用使用CForm構建表單的嚮導行爲。

這裏是我的代碼,到目前爲止,也只涉及「當然一」:

這是相關代碼從控制器片段:

// inside controller 
$model = new CourseChoice(); 
$form = new CForm('application.views.wizard.ccForm', $model); 
$form['courseOneP1']->model = new CourseChoice(); 
$form['courseOneP2']->model = new CourseChoice(); 

$c1p1 = $form['courseOneP1']->model; 
$c1p2 = $form['courseOneP2']->model; 

// Here I am just reading the attributes and exiting for testing 
if ($form->submitted()&& $form->validate()) { 
     echo '<pre>'; 
     print_r($c1p1->attributes); 
     print_r($c1p2->attributes); 
     echo '</pre>'; 
     exit; 
     .......... 

這裏是代碼的形式在ccForm

return array(
    'showErrorSummary' => true, 
    'title' => 'Course Choice 1', 
    'elements' => array(
     // Course 1 - 1st Priority 
     'courseOneP1' => array(
      'type' => 'form', 
      'elements' => array(
       'course' => array(
        'label' => '1st Priority', 
        'type' => 'dropdownlist', 
        'id' => 'c1p1', 
        'prompt' => 'Select 1st Priority Course', 
        'items' => CHtml::listData(CoursePeriod::model()->with('course')->findAll("year = 2014"), 'id', 'course.course_name'), 
       ) 
      ), 
     ), 
     // Course 1 - 2nd Priority 
     'courseOneP2' => array(
      'type' => 'form', 
      'elements' => array(
       'course' => array(
        'label' => '2nd Priority', 
        'type' => 'dropdownlist', 
        'id' => 'c1p2', 
        'prompt' => 'Select 2nd Priority Course', 
        'items' => CHtml::listData(CoursePeriod::model()->with('course')->findAll("year = 2014"), 'id', 'course.course_name'), 
       ) 
      ), 
     ), 
    ), 
    'buttons' => array(
     'previous' => array(
      'type' => 'submit', 
      'label' => 'Previous' 
     ), 
     'submit' => array(
      'type' => 'submit', 
      'label' => 'Next' 
     ) 
    ) 
); 

因此,可以說,我選擇2個療程,一個與15的ID和其他與86的ID,我碰到下面的時候我的print_r()兩個下拉菜單:

Array // Dropdown 1 
    (
     [course] => 86 
     .... // other irrelevant attributes 
    ) 
Array // Dropdown 2 
    (
    [course] => 86 
    .... // other irrelevant attributes 
    ) 

更新

我一直在尋找進一步進入這一點,當我在看螢火,我看到兩個下拉菜單具有相同的名稱:

<div class="row field_course"> 
    <label for="c1p1">1st Priority</label> 
    <select id="c1p1" name="CourseChoice[course]"> 
</div> 
<div class="row field_course"> 
    <label for="c1p2">2nd Priority</label> 
    <select id="c1p2" name="CourseChoice[course]"> 
</div> 

所以第二個菜單覆蓋第一個菜單。但是我怎麼能改變這個?如果我改變'course'=> array(....在任何一個子窗體的CForm中,適用的下拉列表不會渲染,我已經嘗試在表單中添加'name'=>'course1',但它沒有區別。

回答

0

不能你剛纔設置的第二優先輸入元素的name?

'course' => array(
    'label' => '2nd Priority', 
    'name' => 'course2', 
    'type' => 'dropdownlist', 
    'id' => 'c1p2', 
    'prompt' => 'Select 2nd Priority Course', 
    'items' => CHtml::listData(CoursePeriod::model()->with('course')->findAll("year = 2014"), 'id', 'course.course_name'), 
) 
+0

你會這樣想結束,但它似乎沒有任何區別。兩個選擇標籤仍然具有相同的名稱(name =「CourseChoice [course])。奇怪! – Metaman

0

只是回答我自己的問題,並關閉它,因爲它現在是很老了的CForm不支持​​表格輸入,並會需要擴展來實現這一目標可能不是一個很大的工作,但最終我確信管理層認爲這四個下拉設計是可怕的:-)我採用了一個更靈活的設計,在彈出窗口中顯示一個網格視圖,以選擇課程取而代之的是運作良好,並且不那麼令人困惑e用戶。

任何有興趣在這個問題上可以看到開放的問題here.書中有一個鏈接可以查看一個可能的實現延長的CForm的,雖然這是張貼在2009年