Zend表单创建

时间:2012-04-22 04:33:12

标签: php zend-framework

我有3个数据库表,如roomsroom_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状态创建另外两个控制器。之后从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静态,如何从数据库中使其动态化?我希望我可以向你解释我的想法吗?

1 个答案:

答案 0 :(得分: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;
    }

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

$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);  
        }