2012-04-22 70 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