【问题标题】:Zend Form SetAction Using Named RoutesZend Form SetAction 使用命名路由
【发布时间】:2011-03-18 08:43:23
【问题描述】:

我有一个表单,我正在尝试为其设置操作。我想在我的表单文件(扩展 Zend_Form)中而不是在控制器或视图中声明操作,使用我在引导程序中创建的路由。 通常当我想使用路线时,我会做类似的事情

$this->url(array(), 'route-name');

在视图中,或

$this->_helper->url(array(), 'route-name');

在控制器中。

如何从 Zend_Form 中调用路由?


编辑: 我已经放弃尝试将路由加载到 zend_form 中。也许在未来的版本中可能有一个功能可以轻松做到这一点?

我为我的表单创建了一个 viewScript 并在其中设置了路由: 在表单初始化函数中:

$this->setDecorators(array(
    'PrepareElements',
        array(
            'ViewScript', array(
                    'viewScript' => 'forms/formView.phtml'
            ))));

在视图文件中:

<form method="post" action="<?php echo $this->url(array(), 'route-name'); ?>" enctype="application/x-www-form-urlencoded">
    <?php
        foreach ($this->element->getElements() as $element)
        {
            echo $element;
        }
    ?>
</form>

【问题讨论】:

  • 别这么快放弃。请给我们时间来回答您的问题;)

标签: zend-framework zend-form zend-route


【解决方案1】:

方法一:获取路由器

// in your form
public function init()
{
    $router = Zend_Controller_Front::getInstance()->getRouter();
    $url = $router->assemble(
        array(
            'paramterName0' => 'parameterValue0',
            'paramterName1' => 'parameterValue1',
        ),
        'routeName'
    );

    $this->setAction($url);
    ...
}

方法二:获取View对象的实例,直接调用url-view-helper

// in your form    
public function init()
{
    $url = Zend_Layout::getMvcInstance()->getView()->url(array(), 'routeName';
    $this->setAction($url);
    ...
}

我更喜欢方法 1。它更冗长,但你的表单中少了一个依赖项。

【讨论】:

  • 方法一的问题是我已经在引导程序中设置了路由。方法二太棒了!
  • @Dickie 方法 1 未定义新路由。它将 URL 与现有路由组合在一起。查看 Zend_View_Helper_Url。它的作用完全相同:获取路由器并调用 assemble。
  • 你是对的。我误读了代码。我认为它是在创建一条新路线,而不是使用路线。这正是我所追求的。谢谢。
  • 我不知道为什么,但直到现在我才想到这样做。 Ben,感谢您提供了一个简单而简单的解决方案。现在我的表单可以与我的路由表保持同步。
【解决方案2】:

如果在我的控制器操作中:

$this->view->form = $form;

我将使用视图助手 url 在我的视图脚本 (xxx.phtml) 中生成表单操作 url:

$url = $this->url(array('controller'=>'my-controller-name', 
                    'action'=>'my-action-name'), 
              'my-route-name'
             );

$this->form->setAction($url);

echo $this->form;

【讨论】:

    【解决方案3】:

    不知道是什么时候添加的,但是有一个更简单的解决方案。

    您可以使用 getView() 检索表单的视图对象,它可以访问已注册的路由。

    //In the form
    $this->setAction($this->getView()->url(array('param1' => 'value1'), 'routeName'));
    

    【讨论】:

      【解决方案4】:

      现在您可以通过Zend_Form 类上的getView() 方法访问Zend_View 对象:

      // init your form    
      public function init()
      {
          $view = $this->getView();
          $url = $view->url(array('module'=>'login','action'=>'login'));
          $this->setAction($url);
          ...
      }
      

      这可能对 ZF 1.8+ 有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-03
        • 2017-08-22
        • 1970-01-01
        • 1970-01-01
        • 2020-09-24
        相关资源
        最近更新 更多