2012-04-22 56 views
1

我有3個數據庫表,如roomsroom_typeroom_status。這裏是tables`結構Zend表格創建

rooms

room_id, room_number, room_type_id, room_status_id

room_type

room_type_id, room_type_name, room_type_desc

room_status

room_status_id, room_status_name, room_status_desc

所以,實際上基於這個表格需要創建表單來添加新房間。我已經創建了房間控制器和模型。

我的想法是根據房間表創建窗體,併爲room_type和房間狀態創建另外兩個控制器。之後,從room_type和room_status獲取數據,並將其傳遞到可以使用此數據創建選擇元素的空間表單。

您能否建議我如何才能實現更好的解決方案?我不確定這是不錯的解決方案。

[編輯]

`$狀態= $這 - >的createElement( '選擇', '狀態');

$status->setLabel("Select a status:"); 

    $status->addMultiOption('Active', 'active'); 

    $status->addMultiOption('Suspended', 'suspended'); 

    $this->addElement($status);` 

正如你可以在這裏看到addMultiOptionis靜態的,如何讓它從數據庫中動態?我希望我能向你解釋我的想法?

回答

0

如果我明白你想要做什麼,而且我不確定我做了什麼。在某些情況下,通過表單設置類型和狀態將起作用。
您可能想要做的第一件事是將room_status_id添加到您的room表中,以便您可以跟蹤當前狀態。

我在想象你的上下文是酒店或會議中心的類型設置。在這種情況下,房間類型可能不會頻繁變化,但狀態可能會每天改變幾次。
因此,像在管理控制檯中設置表單來設置房間並進行初始類型和狀態指定以及偶爾的更改將是適當的。對於日常操作,您可能希望在各種控制器操作中包含自動狀態更改。

例如一些僞代碼:

initiate room (admin): set room_type, set room_status; 

reserve room: set room_status: reserved; 
room in use: set room_status: in use; 
room vacant: if (room != clean) { 
    set room_status: not clean 
} else { 
    set room_status: clean 
} 

room being remodeled(admin) 
if (room_type === change) { 
    set type: new room_type; 
} else { 
    don't change room_type; 
} 
if (inRemodel === true) { 
    set room_status: unavailable; 
} 

你可能因爲這個信息是不可能也不需要room_type和room_status控制器改變或操縱了很多。
room_type和room_status看起來像是最初設置的數據類型,然後很少更改值。如果是這種情況,模型將成爲訪問這些值的地方,然後在需要的地方傳遞它們。

我希望我完全沒有錯過這一點。

[編輯] 您問過如何在評論中顯示room_type和room_status的名稱。你會使用連接:

//make a dbTable model for each table 
//in your Application_Model_DbTable_Room, built a method similar to this to join the tables 
public function fetchRoomData() { 
     //setIntegrityCheck to false to allow joins 
     $select = $this->select(Zend_Db_Table::SELECT_WITH_FROM_PART) 
       ->setIntegrityCheck(FALSE); 
     //performs join aliasing table room_type to t 
     $select->join(array('t' => 'room_type'), 't.room_type_id = room.room_type_id'); 
     ////performs join aliasing table room_status to s 
     $select->join(array('s' => 'room_status'), 's.room_status_id = room.room_status_id'); 

     $result = $this->fetchAll($select); 

     return $result; 
    } 

[編輯] 顯示基於一個數據庫表中選擇表單元素:

$bidlocation = new Zend_Form_Element_Select('room_type'); 
     $bidlocation->setLabel('Room Type: '); 

     $b = new Application_Model_DbTable_RoomType(); 
     $a = $b->fetchAll(); 

     foreach ($a as $c) { 
      //applies caps to first letter of each word 
      $d = ucwords($c['room_type_name']); 
      $bidlocation->addMultiOption($c['room_type_id'], $d); 
     } 
+0

謝謝你的評論。其實,我已經爲房間狀態和房間類型創建了兩個新的控制器。正如你所提到的,我將room_type_id和room_status_id附加到房間表中。我的問題是如何在房間表格中使用狀態名稱和類型名稱,而不是使用room_status_id和room_type_id? – Akrambek 2012-04-22 11:21:12

+0

例如,如果管理員想要添加新房間。我必須創建一個表單,在這裏應該是選擇類型和狀態列表。該ID不給任何東西給用戶 – Akrambek 2012-04-22 11:23:43

+0

是的,這實際上是我在找什麼,但我需要一個更重要的東西 – Akrambek 2012-04-22 11:33:14