2010-07-20 23 views
10

Tôi có một biểu mẫu mà tôi đang cố gắng đặt hành động. Tôi muốn khai báo hành động bên trong tệp biểu mẫu của tôi (mở rộng Zend_Form) thay vì trong một bộ điều khiển hoặc dạng xem, sử dụng một tuyến đường mà tôi đã tạo trong bootstrap của mình. Thông thường khi tôi muốn sử dụng một tuyến đường tôi làm điều gì đó nhưHành động thiết lập biểu mẫu Zend Sử dụng các tuyến được đặt tên

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

trong giao diện, hoặc

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

trong bộ điều khiển.

Làm cách nào để gọi tuyến đường từ trong Zend_Form?


chỉnh sửa: Tôi đã từ bỏ việc cố gắng tải tuyến đường vào zend_form. Có lẽ trong một phiên bản tương lai có thể có một chức năng để dễ dàng làm điều này?

tôi đã tạo ra một viewScript cho hình thức của tôi và thiết lập các tuyến đường ở chỗ: Trong chức năng hình thức init:

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

và trong file view:

<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> 
+0

Dont bỏ quá nhanh. Chỉ cần cung cấp cho chúng tôi thời gian để trả lời câu hỏi của bạn;) –

Trả lời

18

Phương pháp 1: Nhận bộ định tuyến

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

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

Phương pháp 2: Nhận phiên bản của đối tượng Chế độ xem và gọi điện e url-view-helper trực tiếp

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

Tôi thích Phương thức 1. Tiết kiệm hơn nhưng bạn có ít phụ thuộc hơn trong biểu mẫu của mình.

+0

Vấn đề với phương pháp một là tôi đã có các tuyến đường được thiết lập trong bootstrap. Phương pháp hai là tuyệt vời! –

+0

@Dickie Method 1 không xác định Tuyến đường mới. Nó tập hợp một Url với một lộ trình hiện có. Hãy xem trong Zend_View_Helper_Url. Nó thực hiện chính xác như nhau: Nhận Router và gọi lắp ráp. –

+0

Bạn nói đúng. Tôi đọc sai mã.Tôi nghĩ rằng nó đã tạo ra một tuyến đường mới, không sử dụng một tuyến đường. Đó là chính xác những gì tôi đang sau. Cảm ơn. –

1

nếu trong hành động điều khiển của tôi:

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

tôi sẽ sử dụng url view helper để tạo ra các url hình thức hành động trong kịch bản quan điểm của tôi (xxx.phtml):

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

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

echo $this->form; 
0

Tôi không biết khi nó được thêm vào, nhưng có một giải pháp đơn giản hơn.

Bạn có thể truy xuất đối tượng dạng xem của biểu mẫu bằng getView(), có quyền truy cập vào các tuyến đường đã đăng ký.

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

Ngày nay bạn có thể truy cập vào đối tượng Zend_View qua getView() phương pháp trên Zend_Form lớp:

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

Có thể trợ giúp này trên ZF 1.8+

Các vấn đề liên quan