Zend表单元素来自数据库

时间:2012-05-09 15:22:48

标签: zend-framework zend-form

目前我很难使用zend framework

为订单页面编写编辑功能

情况如下:

一个订单包含多个商品

Eg Order Number 1

Consists of Items

OrderListId   OrderId    title      Sent    dateSent     trackingNumber 
     1           1        Book A     0       12/12/12         44444
     2           1        Book B     1       10/01/12         51223
     3           1        Book C     0       01/02/12         33353
     and so on...

请注意:该表存储在数据库中

我需要一个页面,用户可以在其中编辑标题,已发送,dateSent和trackingNumber字段。

如何使用zend表单填充这些字段进行编辑。由于我想要一个页面,他们可以编辑所有这些订单列表项目。而不是用户必须单击后退和前进来单独编辑每个订单列表项。

解决这种情况的最佳方法是什么?

提前非常感谢!

2 个答案:

答案 0 :(得分:1)

我建议使用ZF Data Grid

答案 1 :(得分:1)

我遇到了类似于此问题的问题,我想出了一个解决方案,我只是将更新链接附加到表格行的末尾,并填充表格进行更新,同时仍然显示当前信息。
< / p>

在我知道自己使用ZF做什么之前,我已经构建了以下代码示例,因此它们可能有点混乱。我最终得到的是处理我所有CRUD操作的单一视图。

**为清晰起见,删除了所有css选择器 显示视图:

<?php if (isset($this->leadtracks)): ?>
    <form method="post" action="/admin/track/deletetrack">
        <table>
            <tr>
                <th colspan="5"><?php $this->tableHeader() ?></th>
            </tr>
            <tr>
                <th>Select</th>
                <th>Shift</th>
                <th>Days Off</th>
                <th>Slots</th>
                <th>&nbsp;&nbsp;</th>
            </tr>
            <tr>
                <?php
                //begin foreach loop using alternate syntax
                foreach ($this->leadtracks as $lt):
                    ?>
                    <td><input type="checkbox" name="trackid[]"
                               value="<?php
            //trackid as value for checkbox
            echo $lt->trackid
                    ?>" style="width: 2px" /></td>
                    <td><?php
                       //find and display shift name
                       $lt->getShift();
                    ?></td>
                    <td><?php $lt->getDays(); ?></td>
                    <td><?php echo $this->escape($lt['qty'])?></td>
                    <td><a href="<?php
                //link to update action passing trackid and bidlocationid values
                echo $this->url(array('module' => 'admin',
                                      'controller' => 'track',
                                      'action' => 'updatetrack',
                                      'trackid' => $lt['trackid'],
                                      'bidlocationid' => $lt['bidlocationid']))
                    ?>">Update</a></td>

                </tr>
            <?php endforeach ?>
            <tr>
                <th colspan="5">
                    <input type="submit" name="submit" value="Delete Selected" />
                </th>
            </tr>
        </table>
    <?php endif; ?>
    <!-- further code removed for brevity -->
</form>

updateAction(),只有一个演示动作:

public function updatetrackAction() {

        //get form set new label and assign to view
        $form = new Admin_Form_Track();
        $form->submit->setLabel('Update Track');
        $form->addTrack->setLegend('Update A Track');
        $this->view->form = $form;

        try {
            //check is post and is valid and get values from form
            if ($this->getRequest()->isPost()) {
                if ($form->isValid($this->getRequest()->getPost())) {

                    $data = $form->getValues();
                    $trackId = $data['trackid'];

                    //save update data to database
                    $update = new Model();
                    $update->update($trackId, $data);
                    //generate meesage
                    $this->_helper->flashMessenger->addMessage(Zend_Registry::get('config')
                                                  ->messages->trackupdate->successful);
                    $this->getHelper('Redirector')->gotoSimple('addtrack');
                } else {
                    //if form is not vaild populate form for resubmission
                    $form->populate($this->getRequest()->getPost());
                }
            } else {
                //if form is not posted populate form with data from database
                $trackId = $this->_getParam('trackid', 0);
                if ($trackId > 0) {
                    $z = new Model();
                    $y = $z->getTrack($trackId)->toArray();
                    $form->populate($y);
                }
            }
        } catch (Zend_Exception $e) {
            $this->_helper->flashMessenger->addMessage($e->getMessage()->getTrace());
            $this->_redirect($this->getRequest()->getRequestUri());
        }
    }

addAction()和deleteAction()非常相似,并使用通过action()帮助程序调用的相同视图脚本。
结果是一个页面,其中执行添加,更新和删除操作用户感知为一个页面(多个删除的复选框和更新的链接,每次刷新显示当前数据)。虽然我确实将表单从一边移到另一边作为一种视觉线索,尽管它确实没有无所谓,因为每页都有可用的所有操作。

更新视图:

<div>
    <h3><?php echo ucwords($this->escape(strtoupper($this->station) . ' - ' . $this->bidloc)); //page header ?></h3>
    <?php echo $this->form //edit/add form ?>
</div>
<div>
    <?php echo $this->action('displaytrack', 'track', 'admin') //display view ?>
</div>

我确信这可以使用partial()视图助手完成,而不使用action()助手,我确信它可以内联完成,我只是没有花时间弄清楚如何做到这一点。

祝你好运。