Вопрос

У меня возникла проблема при попытке добавить файл JavaScript с помощью headScript()->appendFile('file name') с Зендом.У меня есть такая настройка макета:

    <?= $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.Как мне добавить этот файл после остальные файлы?Спасибо.

Это было полезно?

Решение

Ответ заключается в использовании headScript()->prependFile в макете.phtml и headScript()->appendFile в представлении.

Другие советы

Я знаю, что это поздний ответ, но!

Если вы используете addFile или 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') );
?>

Надеюсь, это поможет будущим гуглерам

Я заметил, что если я «добавлю» все файлы в макет, я смогу использовать addFile в своем контроллере, и он появится после них.К сожалению, тогда мне придется перечислить все мои 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');'

http://zendframework.com/issues/browse/ZF-3282?focusedCommentId=23552&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-23552

последний комментарий дает отличное решение, сначала включите макет вверху, затем распечатайте, когда вам это нужно, так все будет работать

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top