【问题标题】:What is the best way to add a form from within a Zend controller?从 Zend 控制器中添加表单的最佳方法是什么?
【发布时间】:2019-02-14 21:49:28
【问题描述】:

我想添加我在控制器中创建的表单。但是页面没有显示任何东西。

这是表单代码:

class Advancedsms_Form_ChangePassword extends  Engine_Form {
    //put your code here
    public function init() {
        parent::init();

        $this->setTitle(Zend_Registry::get('Zend_Translate')->_('Change Password'))
                ->setDescription(Zend_Registry::get('Zend_Translate')->_('Enter your new password'))
                -> setAttrib('id', 'change_password')
                -> setAttrib('enctype', 'multipart/form-data')
                ->setAction(Zend_Controller_Front::getInstance()->getRouter()->assemble([]));

        $this->addElement('Password', 'password', [
            'label'=> Zend_Registry::get('Zend_Translate')->_('New Password'),
            'description' => Zend_Registry::get('Zend_Translate')->_('Enter your new password'),
            'required' => true,            
        ]);

        $this->addElement('Password', 'password_confirm', [
            'label' => Zend_Registry::get('Zend_Translate')->_('Confirm your new password'),
            'description' => Zend_Registry::get('Zend_Translate')->_('Confirm your new password'),
            'required' => true,
        ]);

        $this->addElement('submit', 'submit', [
                'label'=> Zend_Registry::get('Zend_Translate')->_('Submit'),
            'required' => true,
                ]
                );

        $this->setAction(Zend_Controller_Front::getInstance()->getRouter()->assemble(array('controller' => 'api', 'action' => 'changepassword'), 'change_password'));
    }
}

我使用的路由是http://example.com/advancedsms/api/changepassword,定义如下:

'change_password' => [
    'route' => 'advancedsms/:controller/:action/*',
    'defaults' => [
        'module' => 'advancedsms',
        'controller' => 'api',
        'action' => 'changepassword',
    ],
    'reqs' => [
        'controller' => '\D+',
        'action' => '\D+',
    ]
], 

我在控制器类中的操作代码:

class Advancedsms_ApiController extends Core_Controller_Action_Standard {
    /**
     * This handles password change
     */
    public function changepasswordAction() {
    }

}

如何从控制器中插入表单?

【问题讨论】:

    标签: php zend-framework socialengine


    【解决方案1】:

    将表单对象传递给视图,并在那里渲染。

    [控制器:内部动作]

    $this->view->form = $form = new Advancedsms_Form_ChangePassword();
    
    if(!$this->getRequest()->isPost()) { //ends action() flow, and renders view.
      return;
    }
    
    if($form->isValid($this->getRequest()->getPost())) { // rules added in form definition gets validated here.
      // process the post data here.
    
    }
    

    [查看]

    echo $this->form->render();
    

    【讨论】:

    • 我怎样才能使这个有条件的,这样如果用户通过身份验证或提供了某些参数,那么他们可以看到表单?目前,表单总是被渲染,如果我想隐藏它,我不能在控制器中将它设置为 null(引发异常)。
    • 我不认为这是正确的,因为如果表单没有发布它会立即返回并且不会显示任何内容。
    • Engine_Api::_()->user()->getViewer() 这将返回您当前登录的用户,用于身份验证。如果您想要不同的解决方案,也许可以编辑问题,那么我可以相应地更新我的答案。
    • 好的,谢谢。你能看看我的另一个问题:stackoverflow.com/questions/52053191/… 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 2011-12-17
    • 2010-11-19
    相关资源
    最近更新 更多