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. Как добавить этот файл после других файлов? Спасибо.

Ответ 1

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

Ответ 2

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

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

Надеюсь, это поможет будущему googler's

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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