Zend: добавление нескольких js-файлов в макет
Я пытаюсь добавить несколько файлов JS в макет. Я хочу сделать это в помощнике.
Вот код моего помощника:
// class Zend_View_Helper_LoadJs extends Zend_View_Helper_Abstract
public function loadJs()
{
$dir = '../public/js';
$dir = scandir($dir);
$jsFiles = array();
foreach($dir as $key => $value)
{
if($value != '.' && $value != '..')
$jsFiles[] = $value;
}
if(is_array($jsFiles)){
foreach($jsFiles as $key => $val)
{
$this->view->headScript()->appendFile($this->view->baseUrl('js/'.$val));
}
}
}
И в моем макете у меня есть:
<?php $this->loadJs(); ?>
Проблема в том, что он не добавляет JS-файл.
если я поставлю эхо раньше:
echo $this->view->headScript()->appendFile($this->view->baseUrl('js/'.$val));
или же
<?php echo $this->loadJs(); ?>
Затем скрипт добавляет несколько раз один и тот же файл.
Кто-то может сказать мне, что я делаю не так?
1 ответ
Попробуйте это (комментарии показывают изменения):
[РЕДАКТИРОВАТЬ]
хорошо, я думаю, что понял. Для того, чтобы использовать этот помощник для заполнения headscript()
Стек мы должны зарегистрировать результаты с помощью средства визуализации.
public function loadJs() {
$dir = '../public/js';
$dir = scandir($dir);
//get bootstrap
$bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap');
//get current view renderer
$view = $bootstrap->getResource('view');
$jsFiles = array();
foreach ($dir as $key => $value) {
if (!is_dir($value))
$jsFiles[] = $value;
}
if (is_array($jsFiles)) {
foreach ($jsFiles as $key => $val) {
if (strpos($val, '.js') != FALSE) {
//assign file to headscript stack in the cuurent view renderer
$view->headScript()->appendFile($this->view->baseUrl('js/' . $val)). "\n";
}
}
}
}
теперь, когда мы повторяем headscript()
в макете эти файлы будут отображаться один раз.
Просто для информации я делаю init()
мой взгляд в начальной загрузке:
//truncated because it's too long...
protected function _initView()
{
//Initialize view
$view = new Zend_View();
//set doctype for default layout
$view->doctype(Zend_Registry::get('config')->resources->view->doctype);
//set css includes
$view->headLink()->setStylesheet('/css/normalize.css');
//add javascript files
$view->headScript()->setFile('/javascript/modernizr.js');
//add it to the view renderer
$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
'ViewRenderer');
$viewRenderer->setView($view);
//Return it, so that it can be stored by the bootstrap
return $view;
}
Затем я использовал помощника в макете, как:
<?php echo $this->doctype() . "\n" ?>
<?php $this->LoadJs() ?>
<html>
<head>
<?php echo $this->headTitle() . "\n"; ?>
<?php echo $this->headMeta() . "\n"; ?>
<?php echo $this->headLink() . "\n" ?>
<?php echo $this->headscript() . "\n" ?>
<!--[if IE]><script type="text/javascript" src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
</head>
делать это так, LoadJs()
ничего не рендерится напрямую, вместо этого метод просто сбрасывает файлы на headscript()
заполнитель.
Мои результаты:
<script type="text/javascript" src="/javascript/modernizr.js"></script> <!--added by bootstrap -->
<script type="text/javascript" src="/javascript/mediaelement/build/jquery.js"></script> <!-- added by bootstrap -->
<script type="text/javascript" src="http://schoenwolf.local/javascript/modernizr.js"> </script><!-- added by LoadJs -->
Я надеюсь, что это работает и для вас.