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 в обратном порядке в макете (так как они добавляются к себе). Мне бы очень хотелось, чтобы все было в порядке и я мог просто добавить свой стек компоновки.

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

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

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

// 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');'

Другие вопросы по тегам