Zend headScript() и appendFile не работают должным образом
У меня возникла проблема при попытке добавить файл JavaScript с помощью headScript()->appendFile('file name')
с Zend. У меня есть настройки моего макета, как это:
<?= $this->headScript()
->prependScript( 'BASE_URL = "' . $this->baseUrl() . '";' )
->appendFile( $this->baseUrl('js/lib/jquery/jquery-1.4.2.min.js') )
->appendFile( $this->baseUrl('js/admin.js') );
?>
Затем в моем контроллере я пытаюсь добавить дополнительный файл JS только для этой страницы, например:
$this->view->headScript()->appendFile( 'another/js/file.js' );
Этот файл необходимо добавить к тому, что уже настроено в макете. Однако этот файл добавляется до других файлов 'appendFile'. Я также пытался
$this->headScript()->offsetSetFile(999, '/js/myfuncs.js');
Но это все равно добавляет файл перед другими файлами. Это не то, как я ожидал бы, что это будет работать, особенно при использовании метода offsetSetFile. Как я могу добавить этот файл после других файлов? Благодарю.
6 ответов
Ответ заключается в использовании headScript()->prependFile
в layout.phtml и headScript()->appendFile
в представлении.
Я знаю, что это поздний ответ, но!
Если вы делаете appendFile или appendScript, используется следующий доступный индекс. таким образом
$this->headScript()->offsetSetFile(50, 'file');
$this->headScript()->appendFile('file2');
эквивалентно
$this->headScript()->offsetSetFile(50, 'file');
$this->headScript()->offsetSetFile(51, 'file2');
Также важно отметить, что код контроллера выполняется первым перед кодом вида / макета. Таким образом, в вашем случае ваши приложения фактически используют идентификаторы 1000 и 1001. Быстрое решение этой проблемы - просто явно использовать offsetSetFile для всех ваших добавлений. Таким образом, ваш код в вашем макете будет выглядеть так:
<?=
$this->headScript()
->prependScript( 'BASE_URL = "' . $this->baseUrl() . '";' )
->offsetSetFile(500, $this->baseUrl('js/lib/jquery/jquery-1.4.2.min.js') )
->offsetSetFile(501, $this->baseUrl('js/admin.js') );
?>
Я надеюсь, что это поможет будущему гуглеру
Я заметил, что если я "добавлю" все файлы в макете, я смогу использовать appendFile в моем контроллере, и он появится после них. К сожалению, тогда я должен перечислить все мои файлы JS в обратном порядке в макете (так как они добавляются к себе). Мне бы очень хотелось, чтобы все было в порядке и я мог просто добавить свой стек компоновки.
последний комментарий дает отличное решение, сначала включите его в макет сверху, затем напечатайте, когда вам это нужно, таким образом, он будет работать
Если предварительная подготовка в файле макета недостаточно хороша, вы можете включить файлы в загрузочную загрузку при настройке представления или настроить плагин контроллера, если вам необходимо выполнить добавление в зависимости от того, какой модуль загружается.
// in your bootstrap
protected function _initHeadScript()
{
$this->bootstrap('view');
$view = $this->getResource('view');
$view->headScript()->appendFile('another/js/file.js');
}
// as a plugin
class My_Plugin_HeadScriptPlugin extends Zend_Controller_Plugin_Abstract
{
public function routeStartup(Zend_Controller_Request_Abstract $request)
{
$view = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->view;
if($request->getModuleName() == 'foo')
{
$view->headScript()->appendFile('another/js/file.js');
}
}
}
На самом деле вам не нужно получать baseUrl, потому что ZF уже делает это за вас. Вы просто должны обратить внимание на свой путь. Не используйте первую косую черту! в противном случае ZF вернет удаленный адрес.
Просто используйте '$this->_view->headLink()->appendStylesheet('css/main.css');
'