如何将 Javascript 和 CSS 文件添加到 ZF2 中的布局

How to add Javascript and CSS files to layout in ZF2

我正在尝试学习 ZF2,我只想指定要包含在我的布局中的 Javascript 和 CSS 文件。我目前将相对于我的 public 目录的路径数组传递到我的视图,然后循环遍历它们。我想使用内置的 ZF2 解决方案:

$this->headScript();
$this->headStyle();

我在类似的问题上尝试了很多建议的方法,但我一定没有正确地遵循它们。

我尝试过的一个似乎有意义的解决方案是 here 通过在我的控制器中使用其中一个:

$this->getServiceLocator()->get('Zend\View\HelperPluginManager')->get('headLink')->appendStylesheet('/css/style.css');
$this->getServiceLocator()->get('viewhelpermanager')->get('headLink')->appendStylesheet('/css/style.css');

我不太清楚viewhelpermanager发帖者用的好像是占位符,但是我在不止一个问题中看到过。我继续寻找 Zend\View\HelperPluginManager 的位置,但这也不起作用。

"not working" 我的意思是我的页面显示时没有 CSS 并且这些输出为零:

$this->headScript();
$this->headStyle();

看似简单的任务,我不知道为什么我有这么大的困难。

编辑#1:

这是我的控制器:

<?php
namespace CSAdmin\Controller;

use Zend\View\Model\ViewModel;
use Zend\View\HelperPluginManager;

class LoginController extends AdminController
{
    public function __construct() {
        parent::__construct();
    }

    public function indexAction()
    {
        //Set Action specific Styles and Scripts
        $viewHelperManager = $this->getServiceLocator()->get(`ViewHelperManager`);
        $headLinkHelper = $viewHelperManager->get('HeadLink');
        $headLinkHelper->appendStylesheet('/css/admin/form.css','text/css',array());
        $headLinkHelper->appendStylesheet('/css/admin/styles.css','text/css',array());

        //Override view to use predefined Admin Views
        $view = new ViewModel(array('data'=>$this->data));
        $view->setTemplate('CSAdmin/login/login.phtml'); // path to phtml file under view folder

        //Set the Admin Layout
        $layout = $this->layout();
        $layout->setVariable('layout', $this->layoutVars);
        $layout->setTemplate('layout/CSAdmin/login.phtml');

        //Render Page
        return $view;
    }

我的管理控制器:

<?php
namespace CSAdmin\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class AdminController extends AbstractActionController
{
    protected $data = array();
    protected $layoutVars = array();
    protected $viewHelper;

    public function __construct() {
        $this->layoutVars['customStyles'] = array();
        $this->layoutVars['customScripts'] = array();
        $this->layoutVars['miscCode'] = array();
        //$this->viewHelper = $viewHelper;
    }
}

编辑#2:

@Wilt 上述控制器的错误消息:

第 19 行是

$viewHelperManager = $this->getServiceLocator()->get("ViewHelperManager");

编辑#3:

这里涉及到两个模块。 AdminCSAdminAdmin 中的控制器扩展了 CSAdmin 中的控制器,CSAdmin 中的所有控制器扩展了 CSAdmin [=34= 中的基本控制器]. AdminController 扩展 AbstractActionController.

我的控制器和 service_manager 两个模块的每个 module.config.php 数组如下:

管理员:

'service_manager' => array(
    'invokables' => array(
        'CSAdmin\Form\LoginForm' => 'CSAdmin\Form\LoginForm'
    ),
    'factories' => array(
    )
),
'controllers' => array(
    'invokables' => array(
    ),
    'factories' => array(
        'Admin\Controller\Login' => 'Admin\Factory\LoginControllerFactory',
    )
),
// This lines opens the configuration for the RouteManager
'router' => array(
    // Open configuration for all possible routes
    'routes' => array(
        'admin' => array(
            'type' => 'literal',
            'options' => array(
                'route'    => '/admin',
                'defaults' => array(
                    'controller' => 'Admin\Controller\Login',
                    'action'     => 'index',
                ),
            ),
            'may_terminate' => true,
            'child_routes'  => array(
                'home' => array(
                    'type' => 'literal',
                    'options' => array(
                        'route'    => '/home',
                        'defaults' => array(
                            'controller' => 'Admin\Controller\Login',
                            'action' => 'home'
                        )
                    )
                ),
            )
        )
    )
)

CSAdmin:

'service_manager' => array(
    'invokables' => array(
    ),
    'factories' => array(
        'CSAdmin\Mapper\LoginMapperInterface'   => 'CSAdmin\Factory\LoginMapperFactory',
        'CSAdmin\Service\LoginServiceInterface' => 'CSAdmin\Factory\LoginServiceFactory'
    )
),
'controllers' => array(
    'invokables' => array(
    ),
    'factories' => array(
        'CSAdmin\Controller\Admin' => 'CSAdmin\Factory\AdminControllerFactory',
        'CSAdmin\Controller\Login' => 'CSAdmin\Factory\LoginControllerFactory',
    )
 )

编辑#4:

/module/Admin/src/Admin/Factory/LoginControllerFactory.php:

namespace Admin\Factory;

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Admin\Controller\LoginController;
use CSAdmin\Service\LoginServiceInterface;

class LoginControllerFactory implements FactoryInterface
{
    /**
    * Create service
    *
    * @param ServiceLocatorInterface $serviceLocator
    * @return mixed
    */
    public function createService(ServiceLocatorInterface $serviceLocator)
    {

        $realServiceLocator = $serviceLocator->getServiceLocator();
        $loginService        = $realServiceLocator->get('CSAdmin\Service\LoginServiceInterface');
        $loginForm     = $realServiceLocator->get('FormElementManager')->get('CSAdmin\Form\LoginForm');

        return new LoginController(
            $loginService,
            $loginForm
        );
    }
}

/module/CSAdmin/src/CSAdmin/Factory/AdminControllerFactory.php:

namespace CSAdmin\Factory;

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use CSAdmin\Controller\AdminController;
use Zend\View\Helper\BasePath;

class AdminControllerFactory implements FactoryInterface
{
    /**
    * Create service
    *
    * @param ServiceLocatorInterface $serviceLocator
    * @return mixed
    */
    public function createService(ServiceLocatorInterface $serviceLocator)
    {

        $realServiceLocator = $serviceLocator->getServiceLocator();
        //$viewHelper        = $realServiceLocator->get('Zend\View\Helper\BasePath');
        //return new AdminController($viewHelper);
        return new AdminController();
    }
}

/module/CSAdmin/src/CSAdmin/Factory/LoginControllerFactory.php:

namespace CSAdmin\Factory;

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use CSAdmin\Controller\LoginController;

class LoginControllerFactory implements FactoryInterface
{
    /**
    * Create service
    *
    * @param ServiceLocatorInterface $serviceLocator
    * @return mixed
    */
    public function createService(ServiceLocatorInterface $serviceLocator)
    {

        $realServiceLocator = $serviceLocator->getServiceLocator();
        $loginService        = $realServiceLocator->get('CSAdmin\Service\LoginServiceInterface');
        $loginForm     = $realServiceLocator->get('FormElementManager')->get('CSAdmin\Form\LoginForm');

        return new LoginController(
            $loginService,
            $loginForm
        );
    }
}

编辑#5:

更正所用引号的类型后,我的布局中仍然没有样式表。作为测试,我将 ->appendStylesheet() 更改为 ->someMethod(),它正确地报告该方法不存在。所以它肯定有一个 HeadLink 对象的实例。作为下一步,我决定尝试在布局文件中定义所有内容,但它仍然不使用样式表。请参阅下面我的布局文件的 <head> 标记中使用的确切代码。

<?php echo $this->doctype(); ?>
<html lang="en">
<head>      
    <meta charset="utf-8">
    <title><?php echo $this->layout['title']; ?></title> //Intend to change eventually.
<?php 
$this->headLink()->appendStylesheet('/css/admin/form.css');
$this->headLink()->appendStylesheet('/css/admin/styles.css');
echo $this->headScript();
echo $this->headStyle(); //This outputs nothing when viewing with the chrome debugger.
</head>

编辑#6: 为了让它工作,而不是使用:

echo $this->headScript();
echo $this->headStyle();

我只需要做:

echo $this->headLink();

您需要以这种方式追加文件

$this->headScript()->appendFile(
     '/js/prototype.js',
     'text/javascript',
        array('conditional' => 'lt IE 7')
    );

那你写吧

        echo $this->headScript();

注意 echo head 脚本只需要一次。否则你插入js更多时间

更多信息请访问

http://framework.zend.com/manual/current/en/modules/zend.view.helpers.head-script.html

您必须将 echo 添加到 output the result...

echo $this->headScript();
echo $this->headStyle();
echo $this->headLink();

更新

要在控制器中获取 Zend\View\HelperPluginManager,您可以这样做:

$viewHelperManager = $this->getServiceLocator()->get('ViewHelperManager');

那么你可以这样做:

$headLinkHelper = $viewHelperManager->get('headLink');

更新 2

另当别论,不过有点可笑,怪不得一时难求。 您使用了错误的引号:

`ViewHelperManager` //You cannot use these: `

这样试试:

'ViewHelperManager'

或者像这样:

"ViewHelperManager"