CakePHP, как добавить скрипт () изнутри элемента? - PullRequest
3 голосов
/ 17 января 2011

У меня есть меню навигации внутри файла CakePHP element (views / elements / nav_default.ctp).

Файл включен в другой элемент - заголовок (views / elements / header_default.ctp), который затем включается в файл макета (views / layouts / default.ctp).

Я пытаюсь сказать Cake загрузить файл js (webroot / js / mega_drop.js) из элемента nav следующим образом:

<?php
$this->addScript('mega_drop');
?>

Не входит. Я посмотрел документацию для addScript , в которой просто сказано:

Добавляет контент во внутренние скрипты буфер. Этот буфер сделан доступным в макете как $ scripts_for_layout. Этот метод полезен при создании помощники, которые должны добавить JavaScript или CSS прямо на макет. Держать в имейте в виду, что сценарии добавлены из макет, или элементы в макете будут не будет добавлено в $ scripts_for_layout. Этот метод чаще всего используется из внутри помощников, таких как Javascript и HTML-помощники.

Ключевая часть:

Помните, что сценарии, добавленные из макета, или элементы макета не будут добавлены в $ scripts_for_layout.

Так как мне тогда это сделать?

Полагаю, я мог бы добавить <script src="/js/mega_drop.js"></script> к макету default.ctp. Это не кажется правильным, так как это будет тесно связывать компоновку и элемент вместе.

Каков наилучший практический способ CakePHP для этого?

Ответы [ 3 ]

4 голосов
/ 17 января 2011

addScript() не загружает файл;он добавляет фактический код в переменную $scripts_for_layout.Идея заключается в том, что макет является хорошим распространенным местом для загрузки ваших файлов JavaScript и кода.Таким образом, вы можете вывести весь код в одном месте - в головном блоке или в конце - так или иначе, вместе.Поэтому, если вы находитесь в ситуации, когда у вас есть код JavaScript в представлении, а не выводите его встроенным образом, вы можете передать его в макет.

Лучший способ загрузить файл сценария - использоватьHTML Helper- echo $this->Html->script("script or array('of', 'scripts')"); Имея это в виду, вы можете $this->set('scripts', 'mega_drop'); в элементе и затем вызвать Html Helper с этой переменной $ scripts из макета.

Проблема с этим: он выигралне работает, если ваш nav_default.ctp вызывается из макета. $ this-> set () работает внутри представления (или элемента, вызываемого из представления), потому что представление визуализируется до макета.Если вы вызываете свой элемент из макета, тогда уже слишком поздно устанавливать viewVars для использования в макете. Лучше всего установить set () переменную scripts из контроллера и использовать if(isset($scripts)) { echo $this->Html->script($scripts); } в макете.

3 голосов
/ 24 июня 2011

Корректный и действительный 1.3.x CakePHP 2.0 Dev из example.ctp файла:

$this->addScript($this->Javascript->link('tab_enabler')); 
$this->addScript($this->Html->css('jquery.tabs'));

Это пример того, как правильно включить файлы CSS и JS из представления и добавить в переменную $scripts_for_layout, чтобы не генерировать ошибку проверки с W3C, так как некорректно добавлять ссылку на файл CSS в <BODY></BODY>

1 голос
/ 18 января 2011

1001 * попробовать *

$this->Html->script('mega_drop', $inline=false);

в вашем элементе без эха.

Второй параметр говорит добавить его в переменную $ scripts_for_layout.

Вы должны быть в состоянии сделать это в своем элементе, чтобы JavaScript был включен только тогда, когда элемент есть.

...