如何在ZF2中创建具有备用路径的多个表单提交按钮

时间:2014-05-05 20:23:16

标签: forms zend-framework2 submit-button

在ZF2中,如何创建多个提交按钮,每个按钮都指向不同的路径?在ZF2教程的Forms and actions chaper中,使用单个提交按钮创建表单,其中标签为“Go”,用于处理输入数据并返回索引页面(路径)。如果我们想要四个按钮,我们在哪里放置相关的脚本:

  • Save操作:保存用户输入,路由:返回当前页面
  • Save and Close操作:保存用户输入,路由:返回索引(相册)
  • Clear操作:无操作,路线:返回当前页面
  • Close动作:无动作,路线:返回索引(专辑)

我假设按钮是这样创建的:

namespace Album\Form;

class AlbumForm extends Form
{
    public function __construct($name = null)
    {

        // ... //

        $this->add(array(
            'name' => 'savebutton',
            'attributes' => array(
                'type'  => 'submit',
                'value' => 'Save',
                'id' => 'savebutton',
            ),
        ));
        $this->add(array(
            'name' => 'save_closebutton',
            'attributes' => array(
                'type'  => 'submit',
                'value' => 'Save & Close',
                'id' => 'save_closebutton',
            ),
        ));
        $this->add(array(
            'name' => 'clearbutton',
            'attributes' => array(
                'type'  => 'submit',
                'value' => 'Clear',
                'id' => 'clearbutton',
            ),
        ));
        $this->add(array(
            'name' => 'closebutton',
            'attributes' => array(
                'type'  => 'submit',
                'value' => 'Close',
                'id' => 'closebutton',
            ),
        ));
    }
}

只有一个提交按钮,这就是编辑操作的样子:

// module/Album/src/Album/Controller/AlbumController.php:
//...

    // Add content to this method:
    public function editAction()
    {
        $id = (int) $this->params()->fromRoute('id', 0);
        if (!$id) {
            return $this->redirect()->toRoute('album', array(
                'action' => 'add'
            ));
        }
        $album = $this->getAlbumTable()->getAlbum($id);

        $form  = new AlbumForm();
        $form->bind($album);
        $form->get('submit')->setAttribute('value', 'Edit');

        $request = $this->getRequest();
        if ($request->isPost()) {
            $form->setInputFilter($album->getInputFilter());
            $form->setData($request->getPost());

            if ($form->isValid()) {
                $this->getAlbumTable()->saveAlbum($form->getData());

                // Redirect to list of albums
                return $this->redirect()->toRoute('album');
            }
        }

        return array(
            'id' => $id,
            'form' => $form,
        );
    }
//...

由于成对的按钮具有相同的表单动作,而成对的按钮具有相同的路径,我想在这里添加两个if语句,除非switch语句更好。

1 个答案:

答案 0 :(得分:0)

快速肮脏的方式来做你需要的事情:

public function editAction()
{
    $id = (int) $this->params()->fromRoute('id', 0);
    if (!$id) {
        return $this->redirect()->toRoute('album', array(
            'action' => 'add'
        ));
    }
    $album = $this->getAlbumTable()->getAlbum($id);

    $form  = new AlbumForm();
    $form->bind($album);
    $form->get('submit')->setAttribute('value', 'Edit');

    $request = $this->getRequest();
    if ($request->isPost()) {
        $form->setInputFilter($album->getInputFilter());
        $form->setData($request->getPost());

        if ($form->isValid()) {

                $input = $form->getData();

                if (!empty($input['save_closebutton'])) {

                    return $this->redirect()->toRoute('album', array(
                        'controller' => 'AlbumController',
                        'action' => 'index',
                    ));

                }

        }
    }

    return array(
        'id' => $id,
        'form' => $form,
    );
}