Я пытаюсь изучить ZF2, и я просто хочу указать файлы Javascript и CSS, которые будут включены в мой макет. В настоящее время я передаю массив путей относительно моего public
каталог, на мой взгляд, а затем перебрать их. Я хотел бы использовать встроенное решение ZF2, используя:
$this->headScript();
$this->headStyle();
Я перепробовал много предложенных методов по схожим вопросам, но я не должен следовать им правильно.
Одно из решений, которое я пробовал, казалось, имело смысл Вот используя любой из них в моем контроллере:
$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
но это тоже не сработало.
Под «не работает» я подразумеваю, что моя страница отображается без 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;
}
Мой AdminController:
<?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 AdminController
, 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();
Вам придется добавить echo
в вывести результат…
echo $this->headScript();
echo $this->headStyle();
echo $this->headLink();
Чтобы получить Zend\View\HelperPluginManager
в вашем контроллере вы можете сделать так:
$viewHelperManager = $this->getServiceLocator()->get('ViewHelperManager');
Тогда вы можете сделать:
$headLinkHelper = $viewHelperManager->get('headLink');
Другое дело, но это немного смешно, неудивительно, что его было трудно найти.
Вы использовали неправильные цитаты:
`ViewHelperManager` //You cannot use these: `
Попробуйте вот так:
'ViewHelperManager'
или вот так:
"ViewHelperManager"
вам нужно добавить файл таким образом
$this->headScript()->appendFile(
'/js/prototype.js',
'text/javascript',
array('conditional' => 'lt IE 7')
);
тогда ты пишешь это
echo $this->headScript();
Примечание: эхоголовый скрипт требуется только один раз. в противном случае вы вставляете JS больше времени
больше информации на
http://framework.zend.com/manual/current/en/modules/zend.view.helpers.head-script.html