Zend headScript () и appendFile не работают должным образом - PullRequest
12 голосов
/ 12 марта 2010

У меня возникла проблема при попытке добавить файл 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 ]

22 голосов
/ 07 декабря 2010

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

2 голосов
/ 13 июня 2012

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

Если вы делаете 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') );
?>

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

1 голос
/ 12 марта 2010

Я заметил, что если я «добавлю» все файлы в макете, я смогу использовать appendFile в моем контроллере, и он появится после них. К сожалению, тогда я должен перечислить все мои файлы JS в обратном порядке в макете (так как они добавляются к себе). Мне бы очень хотелось, чтобы все было в порядке и я мог просто добавить свой стек компоновки.

0 голосов
/ 04 мая 2011

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

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

0 голосов
/ 14 мая 2010

На самом деле вам не нужно получать baseUrl, потому что ZF уже делает это за вас. Вы просто должны обратить внимание на свой путь. Не используйте первую косую черту! в противном случае ZF вернет удаленный адрес.

Просто используйте '$this->_view->headLink()->appendStylesheet('css/main.css'); '

0 голосов
/ 12 марта 2010

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

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