Таким образом, использование функции включения drupal для раскрывающегося списка работает, но на некоторых страницах сценарии не включены, и нигде не выдается никакой ошибки. Это происходит внутри hook_block_view. На реальной странице Drupal.behaviors.CToolsDropdown отсутствует на страницах, на которых он не работает. Но нет указаний на то, почему.
ctools_include('dropdown.theme');
...
$block['content'] = array(
'#markup' => theme_ctools_dropdown($vars),
);
ctools_include()
загрузил dropdown.theme.inc
файл, и мы знаем, что в противном случае, вызывая theme_ctools_dropdown()
приведет к фатальной ошибке из-за вызова неопределенной функции.
theme_ctools_dropdown()
само по себе безоговорочно добавляет необходимое dropdown.js
а также dropdown.css
файлы.
Поэтому я считаю, что ваш код никогда не будет вызываться на этих страницах (то есть блок не будет отображаться). Чтобы доказать это, сожмите в drupal_set_message('Hello world');
где-то в вашем hook_block_view()
и посмотрим что будет.
Если вы видите сообщение, ищите hook_js_alter()
в вашем коде, может быть, есть где-то логика, которая удаляет dropdown.js
на этих страницах.
Обновить: drupal_add_js()
вызов в пределах блока не будет включен после очистки кэшей. Поэтому вам нужно включить файлы JS и CSS, используя свойство #attached:
ctools_include('dropdown.theme');
// ...
$block['content'] = array(
'#markup' => theme_ctools_dropdown($vars),
'#attached' => array(
'css' => array(
drupal_get_path('module', 'ctools') . '/css/dropdown.css',
),
'js' => array(
drupal_get_path('module', 'ctools') . '/js/dropdown.js',
),
),
);
Других решений пока нет …