ZF2 - 如何在现有控制器中添加新表单?

时间:2015-06-28 20:45:25

标签: php forms controller zend-framework2

我有一个登录表单LoginForm.php及其过滤器LoginFilter.php,其中有一个视图/login/index.phtml,一个控制器LoginController.php,两个工厂LoginControllerFactory.php& LoginFormFactory.php它在config.module.php中被调用并且完美无缺。表格已正确显示。

我有一个ViewController.php,其方法idAction显示了id的帖子,该帖子来自名为/view/id.phtml的视图中主页的参数传递的id。我想显示我在此视图中创建的此表单,但我不知道如何。首先,我完全按照创建登录表单的方式创建了表单,但是我意识到我已经在view路由中配置了module.config.php子路由,并且idAction中有一个工厂。 / p>

然后,我尝试在indexAction方法中设置表单,就像我在LoginController.php控制器中的An exception was raised while creating "Rxe\Factory\ViewController"; no instance returned中所做的那样,但我收到以下错误:{ {1}}。

我现在将向您展示我尝试显示此新表格的行为。

首先,表格本身:

class CommentForm extends Form
{
    public function buildForm()
    {
        $this->setAttribute('method', 'POST');
        $this->setAttribute('id', 'add-comment-form');
        $this->add(array(
            'name' => 'comment',
            'type' => 'textarea',
            'options' => array(
                'label' => 'Category'
            ),
            'attributes' => array(
                'class' => 'form-control'
            )
        ));

        $this->add(array(
            'name' => 'submit',
            'type' => 'submit',
            'attributes' => array(
                'class' => 'btn btn-success',
                'value' => 'Comment'
            )
        ));
    }
}

表单CommentFormFactory.php调用其过滤器并构建表单:

class CommentFormFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $form = new CommentForm();
        $form->setInputFilter($serviceLocator->get('Rxe\Factory\CommentFilter'));
        $form->buildForm();

        return $form;
    }
}

ViewControllerFactory.php调用CommentFormFactory.php,就像在LoginControllerFactory.php中一样:

class ViewControllerFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $serviceManager = $serviceLocator->getServiceLocator();

        $viewController = new ViewController();
        $viewController->setPostsTable($serviceManager->get('Rxe\Factory\PostsTable'));
        $viewController->setCommentsTable($serviceManager->get('Rxe\Factory\CommentsTable'));
        $viewController->setCommentForm($serviceManager->get('Rxe\Factory\CommentForm'));

        return $viewController;
    }
}

ViewController.php,在idAction ViewModel class ViewController extends AbstractActionController { use PostsTableTrait; use CommentsTableTrait; private $commentForm; function setCommentForm($commentForm) { $this->commentForm = $commentForm; } public function indexAction() { $category = $this->params()->fromRoute('category'); return new ViewModel(array( 'posts' => $this->postsTable->getPostsByCategory($category), 'categories' => $category )); } public function idAction() { $id = $this->params()->fromRoute('id'); $viewModel = new ViewModel(array( 'commentForm' => $this->commentForm, 'commentParams' => $this->params()->fromPost(), 'messages' => $this->flashMessenger()->getMessages(), 'posts' => $this->postsTable->getPostById($id), 'posts' => $this->commentsTable->getNumberOfCommentsByPost($id), 'comments' => $this->commentsTable->getCommentsByPost($id) )); $viewModel->setTemplate('rxe/view/id.phtml'); if ($this->getRequest()->isPost()) { $this->commentForm->setData($this->params()->fromPost()); if ($this->commentForm->isValid()) { $this->flashMessenger()->addMessage('Thank you for your comment. :)'); } else { $this->flashMessenger()->addMessage('Your comment wasn\'t sent.'); } } return $viewModel; } } 内调用表单:

module.config.php

最后我的'controllers' => array( 'invokables' => array( 'Rxe\Controller\Index' => 'Rxe\Controller\IndexController', 'Rxe\Controller\View' => 'Rxe\Controller\ViewController', 'Rxe\Controller\Login' => 'Rxe\Controller\LoginController' ), 'factories' => array( 'Rxe\Factory\LoginController' => 'Rxe\Factory\LoginControllerFactory', 'Rxe\Factory\ViewController' => 'Rxe\Factory\ViewControllerFactory', 'Rxe\Factory\IndexController' => 'Rxe\Factory\IndexControllerFactory' ) ), 'service_manager' => array( 'factories' => array( 'Rxe\Factory\LoginForm' => 'Rxe\Factory\LoginFormFactory', 'Rxe\Factory\LoginFilter' => 'Rxe\Factory\LoginFilterFactory', 'Rxe\Factory\CommentForm' => 'Rxe\Factory\CommentFormFactory', 'Rxe\Factory\CommentFilter' => 'Rxe\Factory\CommentFilterFactory', 'Rxe\Factory\PostsTable' => 'Rxe\Factory\PostsTableFactory', 'Rxe\Factory\CategoriesTable' => 'Rxe\Factory\CategoriesTableFactory', 'Rxe\Factory\CommentsTable' => 'Rxe\Factory\CommentsTableFactory', 'Zend\Db\Adapter\AdapterService' => 'Zend\Db\Adapter\AdapterServiceFactory' ) ),

ViewControllerFactory.php

如果您需要我向您展示更多代码,请告诉我们。提前谢谢。

编辑#1

如果我删除了Fatal error: Call to a member function prepare() on a non-object in /home/vol12_3/byethost4.com/b4_16354889/htdocs/module/Rxe/view/rxe/view/id.phtml on line 31中调用该表单的行,则会收到以下错误:id.phtml

<!-- Comment form --> <div id="comment-form-area" class="col-xs-3"> <?php $this->commentForm->prepare() ?> <?php echo $this->form()->openTag($this->commentForm); ?> <div class="form-group comment-area"> <?php echo $this->formRow($this->commentForm->get('comment_content')); ?> </div> <div class="form-group"> <?php echo $this->formRow($this->commentForm->get('submit')); ?> </div> <?php echo $this->form()->closeTag(); ?> </div> <!-- /Comment form --> 是:

select player_id,full_name,club_name from players

1 个答案:

答案 0 :(得分:0)

尝试删除这些行

'invokables' => array(
    'Rxe\Controller\Index' => 'Rxe\Controller\IndexController',
    'Rxe\Controller\View' => 'Rxe\Controller\ViewController',
    'Rxe\Controller\Login' => 'Rxe\Controller\LoginController'
),

如果它不起作用,请查看本教程如何创建适当的控制器工厂并传递依赖项。 https://samsonasik.wordpress.com/2015/03/31/zend-framework-2-using-__invokepluginmanager-manager-in-services-factory/

我如何构建表单的示例:

namespace Admin\Form;

use Zend\Form\Form;
use Zend\InputFilter\InputFilterProviderInterface;

class ContentForm extends Form implements InputFilterProviderInterface
{
    public function __construct()
    {
        parent::__construct("content");
    }

    public function init()
    {
        $this->setAttribute('method', 'post');

        $this->add([
            'type' => 'Zend\Form\Element\Text',
            'name' => 'title',
            'attributes' => [
                'required'   => true,
                'size'        => 40,
                'id'         => "seo-caption",
                'placeholder' => 'Title',
            ],
            'options' => [
                'label' => 'Title',
            ],
        ]);

        $this->add([
            'type' => 'Zend\Form\Element\Text',
            'name' => 'text',
            'attributes' => [
                'class'   => 'ckeditor',
                'rows'        => 5,
                'cols'      => 80,
            ],
            'options' => [
                'label' => 'Text',
            ],
        ]);

    }

    public function getInputFilterSpecification()
    {
        return [
            [
                "name"=>"title",
                "required" => true,
                'filters' => [
                    ['name' => 'StripTags'],
                    ['name' => 'StringTrim'],
                ],
                'validators' => [
                    ['name' => 'NotEmpty'],
                    [
                        'name'    => 'StringLength',
                        'options' => [
                            'encoding' => 'UTF-8',
                            'min' => 1,
                            'max' => 200,
                        ],
                    ],
                ],
            ],
            [
                "name"=>"text",
                "required" => true,
                'filters' => [
                    ['name' => 'StripTags'],
                    ['name' => 'StringTrim'],
                ],
                'validators' => [
                    ['name' => 'NotEmpty'],
                    [
                        'name'    => 'StringLength',
                        'options' => [
                            'encoding' => 'UTF-8',
                            'min' => 1,
                        ],
                    ],
                ],
            ],
        ];
    }
}

比我创建一个工厂 命名空间Admin \ Factory \ Controller;

use Admin\Controller\ContentController;
use Zend\Mvc\Controller\ControllerManager;

class ContentFormFactory
{
    /**
     * @{inheritDoc}
     */
    public function __invoke(ControllerManager $controllerManager)
    {
        return new ContentController(
            $controllerManager->getServiceLocator()->get('FormElementManager')->get('Admin\Form\ContentForm')
        );
    }
}

在module.config.php里面我有这段代码

'controllers' => [
    'factories' => [
        'Admin\Controller\Content' => "Admin\Factory\Controller\ContentFormFactory",
    ],
    'invokables' => [
        ...
    ],
],

请向我们展示更多代码。