如何将 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:
这里涉及到两个模块。 Admin
和 CSAdmin
,Admin
中的控制器扩展了 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"
我正在尝试学习 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:
这里涉及到两个模块。 Admin
和 CSAdmin
,Admin
中的控制器扩展了 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"