Помощник HeadScript Helper
HTML-элемент <script> используется для добавления
скриптового кода, исполняемого на клиентской стороне, как
непосредственно в документ, так и через ссылки на удаленные ресурсы,
содержащие этот код. Помощник HeadScript позволяет
использовать оба способа включения.
Помощник HeadScript поддерживает следующие методы для
установки и добавления скриптов:
appendFile($src, $type = 'text/javascript',
$attrs = array())offsetSetFile($index, $src, $type = 'text/javascript',
$attrs = array())prependFile($src, $type = 'text/javascript',
$attrs = array())setFile($src, $type = 'text/javascript',
$attrs = array())appendScript($script, $type = 'text/javascript',
$attrs = array())offsetSetScript($index, $script, $type = 'text/javascript',
$attrs = array())prependScript($script, $type = 'text/javascript',
$attrs = array())setScript($script, $type = 'text/javascript',
$attrs = array())
В методах *File() через параметр $src
указывается местоположение скрипта, который требуется загрузить; обычно
оно указывется в виде URL или пути к нему.
В методах *Script() через параметр $script
передается скриптовый код, который требуется включить в
элемент <script>.
Установка условных комментариевHeadScript поддерживает включение тега в условные
комментарии с тем, чтобы скрыть его от определенных
браузеров. Для того, чтобы добавить условные теги,
передавайте условие через параметр
$attrs в вызове метода, как показано в примере:
Скрипты с условными комментариямиheadScript()->appendFile(
'/js/prototype.js',
'text/javascript',
array('conditional' => 'lt IE 7')
);
]]>HeadScript также позволяет "захватывать" вывод скриптов;
это может быть полезным при создании скриптов
программным способом. Пример использования этой возможности будут
показан ниже.
Для быстрого добавления скриптовых элементов Вы можете использовать
метод headScript(), сигнатура этого метода -
headScript($mode = 'FILE', $spec, $placement = 'APPEND').
Параметр $mode может иметь значение 'FILE' или 'SCRIPT',
в зависимости от того, ссылаетесь ли вы на уже существующий скрипт или
передаете код для влючения в элемент
<script>. $spec содержит либо путь к
файлу, к которому нужно добавить ссылку, либо сам скриптовый код.
$placement должен иметь одно из следующих значений:
'APPEND', 'PREPEND' или 'SET'.
HeadScript перегружает методы append(),
offsetSet(), prepend() и set()
с целью принудительного использования специальных методов, перечисленных
выше. Внутри себя помощник сохраняет каждый элемент в виде маркера
stdClass, который затем преобразовывается в строку через
метод itemToString(). Это позволяет производить проверку
элементов в стеке и при необходимости модифицировать их, просто
извлекая объект и изменяя его.
Помощник HeadScript является частной реализацией
помощника
Placeholder.
Используйте InlineScript для скриптов в теле документа
Для добавления скриптов внутри HTML-элемента body
должен использоваться
родственный помощник InlineScript.
Помещение скриптов в конец документа является хорошей практикой
для повышения скорости отдачи страницы, особенно если используются
сторонние скрипты-аналитики.
Установка произвольных атрибутов по умолчанию отключена
По умолчанию HeadScript будет генерировать только
атрибуты, соответствующие спецификации W3C.
В список этих атрибутов входят 'type', 'charset', 'defer',
'language' и 'src'. Однако некоторые JavaScript фреймворки,
а в особенности Dojo,
используют специальные атрибуты в целях изменения поведения. Вы
можете разрешить использование таких атрибутов, воспользовавшись
методом setAllowArbitraryAttributes():
headScript()->setAllowArbitraryAttributes(true);
]]>Использование помощника HeadScript
Вы можете указывать скрипты для добавления в документ в любой момент
времени. Как было указано ранее, это могут быть как ссылки на
файлы со скриптами, так и сами скрипты.
headScript()->appendFile('/js/prototype.js')
->appendScript($onloadScript);
]]>
Порядок следования часто важен в скриптах, интерпретируемых на
стороне клиента - например, нужно быть уверенным в том, что
библиотеки загружаются в порядке, обусловленном
зависимостями между ними. В этом случае используйте специальные
методы методы для добавления в начало, конец, и по определенному
смещению:
headScript()->offsetSetFile(100, '/js/myfuncs.js');
// Используем эффекты из библиотеки script.aculo.us
// (будет добавлена с использованием следующего смещения, 101)
$this->headScript()->appendFile('/js/scriptaculous.js');
// Но скрипт prototype всегда должен загружаться первым:
$this->headScript()->prependFile('/js/prototype.js');
]]>
Когда все будет готово для размещения скриптов в макете, просто
"выводите" помощника:
headScript() ?>
]]>Составление скриптов с использованием помощника HeadScript
Иногда нужно генерировать скрипты программым способом.
Хотя вы можете использовать конкатенацию строк, синтаксис heredoc
и т.п., часто бывает легче создать скрипт с включением PHP-тегов.
HeadScript позволяет делать это, захватывая
вывод в стек:
headScript()->captureStart() ?>
var action = 'baseUrl ?>';
$('foo_form').action = action;
headScript()->captureEnd() ?>
]]>
Используются следующие допущения:
Скрипт будет добавлен в конец стека. Если требуется
переопределить содержимое стека или добавить скрипт в
конец стека, то передавайте соответственно
'SET' или 'PREPEND' в качестве первого аргумента
captureStart().
По умолчанию предполагается, что MIME-тип скрипта -
'text/javascript'. Если требуется указать другой тип
скрипта, то передавайте его в качестве второго аргумента
captureStart().
Если вы хотите указать какие-либо дополнительные аргументы
для тега <script>, то передавайте их
в массиве в качестве третьего аргумента
captureStart().