1

我有 3 个数据库表rooms,例如room_typeroom_status。这是表的结构

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 获取数据并将其传递给房间表单,我可以使用这些数据创建选择元素。

你能建议我如何获得更好的解决方案。我不确定这是不是一个好的解决方案。

[编辑]

`$status = $this->createElement('select', 'status');

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

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

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

    $this->addElement($status);`

正如您在此处看到的addMultiOptionis静态的,如何使其从数据库中动态化?我希望我能解释一下我的想法?

4

1 回答 1

0

如果我了解您要做什么,但我不确定我是否这样做。通过表单设置类型和状态在某些情况下会起作用。
您可能想要做的第一件事是将 a 添加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;
    }

[编辑] 要显示基于 db 表的选择表单元素:

$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);  
        }
于 2012-04-22T10:55:45.047 回答