javascript - ZF2 : How to call a view helper in a service?

标签 javascript ajax service zend-framework2 viewhelper

我需要在此服务中使用 View 助手 (myPaginationControl):

/.../
class TotoDisplayService implements ServiceLocatorAwareInterface
{
    public function getReponse ($paginator)
    {
        $tab = '<table>';
        /.../

        $tab .= myPaginationControl($paginator, 'sliding','pagination_control_file',array('route' => 'paginator'));

        /.../
        foreach ($paginator as $t) {
            //something to list : THIS WORKS
        }
        $tab .= '</table>';

        return array(
            'result' => $tab
        );
    }
/.../

该服务由该 Controller 调用:

public function displayAction()
{
    $em = $this->getEntityManager();
        // query to database
    $q1 = $this->serviceLocator->get('toto_list_service');
    $rep1 = $q1->getReponse($em);

    $paginator = new PaginatorZF(new DoctrinePaginator(new PaginatorORM($rep1)));
    $paginator->setCurrentPageNumber ($this->params()->fromRoute('page', 1))->setItemCountPerPage(25);

        // prepares something to display with javascript
    $q2 = $this->serviceLocator->get('toto_display_service');
    $rep2 = $q2->getReponse($paginator);

        // return to javascript 
    return new JsonModel(
        $rep2
    );
}

这是MyPaginationControl(与paginationControl相同,我是为了测试而这样做的)

use Zend\View\Helper\AbstractHelper;

class MyPaginationControl extends AbstractHelper
{
    public function __invoke($a, $b, $c, $d)
    {
        $PaginationControl = $this->getView()->plugin('paginationcontrol');

        return $PaginationControl($a,$b,$c,$d);
    }
}

这是 module.config.php

    'service_manager' => array(
        'invokables' => array (
            'toto_list_service' => 'Com\Service\Invokable\TotoListService',
            'toto_display_service' => 'Com\Service\Invokable\TotoDisplayService'
        )
    ),
    'view_helpers' => array(
        'invokables' => array(
            'myPaginationControl' => 'Com\View\Helper\MyPaginationControl',
            ),
    ),

这是 module.php(没什么特别的)

class Module implements AutoloaderProviderInterface
{
    public function getAutoloaderConfig()
    {
        return array(
            'Zend\Loader\ClassMapAutoloader' => array(
                __DIR__ . '/autoload_classmap.php',
            ),
            'Zend\Loader\StandardAutoloader' => array(
                'namespaces' => array(
                   __NAMESPACE__ => __DIR__ . '/src/' . tr_replace('\\', '/' , __NAMESPACE__),
                ),
            ),
        );
    }

    public function getConfig()
    {
        return include __DIR__ . '/config/module.config.php';
    }

    public function onBootstrap(MvcEvent $e)
    {
        $eventManager        = $e->getApplication()->getEventManager();
        $moduleRouteListener = new ModuleRouteListener();
        $moduleRouteListener->attach($eventManager);
    }
}

错误信息如下: 调用 D:\Zend\Apache2\htdocs\Gestion\module\Com\src\Com\Service\Invokable\TotoDisplayService.php 中未定义的函数 Com\Service\Invokable\MyPaginationControl()

这个 Controller 是由 javascript (AJAX) 调用的。 当我评论该行时,一切正常: $tab .= myPaginationControl(...

我验证了当我在 phtml 文件中使用我的 View 助手 myPaginationControl 时,它可以完美工作。

预先感谢您的帮助。

最佳答案

在你的 Controller 中执行以下操作:

$this->getServiceLocator()->get('ViewHelperManager')->get("toto_display_service")

请注意,这不是最好的解决方案。相反,我建议您通过 __constructor(){}

将 viewhelper 与工厂一起传递
namespace Application\Factory\Controller;

use Application\Controller\MyClassNameController;
use Zend\Mvc\Controller\ControllerManager;

class MyCLassNameFactory
{
    /**
     * @{inheritDoc}
     */
    public function __invoke(ControllerManager $controllerManager)
    {
        $serviceLocator = $controllerManager->getServiceLocator();

        $controller = new MyClassNameController(
            $serviceLocator->get('ViewHelperManager')->get('toto_display_service');
        );

        return $controller;
    }
}

在 MyClassController 中

class MyClassNameController extends ADD_ANOTHER_CONTROLLER
{
   private $todoService = null;

    public function __construct($todoService = null)
    {
       $this->todoService = $todoService
    }
}

之后在Module.php或module.config.php中添加配置。我更喜欢 module.config.php 文件。

'controllers' => [
        'factories' => [
            'Application\Controller\MyClassName'        => 'Application\Factory\Controller\MyClassNameFactory'
    ],
],

不要忘记从可调用对象中删除 Controller ,否则它将无法工作并且会发生碰撞

编辑

$tab .= myPaginationControl 应为 $tab .= new myPaginationControl $tab .= $this->myPaginationControl

如果上述方法不起作用,转储 $this->getServiceLocator()->get('ViewHelperManager') 的内容,找到 myPaginationControl 并像这样调用它 $this->getServiceLocator()->get('ViewHelperManager')->get("myPaginationControl");

关于javascript - ZF2 : How to call a view helper in a service?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32028130/

相关文章:

javascript - 我有一个 php 文件,它提供 JSON 输出,并希望在 D3 中使用该 JSON

javascript - 无法将轨道(批量)记录到 Last.fm API。方法签名无效

jquery - 从 jquery $.ajax 到 angular $http

javascript - 使用javascript拦截静态和动态链接

android - 从服务更新/访问 Progressbar、TextView

java - 检测你是在Application中的主进程还是远程服务进程

javascript - JestJs认为没有调用ajax

javascript - js sequelize 嵌套查询/遍历结果

javascript - 通过ajax和jquery上传文件

c# - Windows 服务 : check if base service is running