Где в друпале файлы
Краткий курс молодого бойца пройден - теперь вы знаете что такое друпал и как с ним работать. Настало время рассказать о том, ради чего был создан этот сайт - о создании шаблонов(тем) для друпала.
Теперь поговорим о том, что в ней должно находиться. Если вы хотите посмотреть как выглядят профессиональные темы - то добро пожаловать сюда. Но там слишком много файлов, будет сложно разобраться что к чему, так что давайте по порядку.
Файл, без которого друпал не поймёт что это шаблон для него - это файл названиеТемы.info, в нашем случае - mytheme.info. Внутри него содержится вся информация о вашей теме. Его можно разбить на 4 подчасти:
Комментарии
и каким образом люди подключают js'ы? Забивают в ? Сам подключаю через инфо файл.
именно! засовывают в и радуются, что всё работает
Всегда подключал js и css файлы в template.php с помощью функции drupal_add_(), в независимости от того, если ли какие-либо условия или нет.
Спасибо!
У меня банальный вопрос.
Подключать можно только style.css, лежащищий в корне темы?
Я экспериментировал с другими именами файлов стилей, почему-то не проходит
Я конечно, на крайняк сделаю внутренний импорт:
но это не ахти-наглядно
Нет, никаких импортов! Вот статья которая рассказывает как надо
Так в том и проблема, что друпал отзывается только на сторку в файле тема.info :
А на сторку типа:
вообще ноль реакции.
А у меня стили разбросаны вразные файлы с разными именами
Все подключились. Тема самопальная. D7.
И вообще корень темы должен содержать info файл только.
Ну у меня пока там валяется еще скриншот и template.php.
в начале статьи.
Бывают случаи, когда подключать требуется скрипт или стиль только для конкретной страницы, или для определённого типа материала. В таком случае файлы надо подключать через php-код:
А это куда в template.php? (если да то куда именно?)
Если подключение в теме - то в template.php. Например, чтобы подключить js только для главной страницы:
Если мы находимся на полном представлении ноды, то у страницы появляется объект ноды в $variables['node']. А дальше я проверил, является ли эта нода типом материала "Новость" с уникальным номером 10 (как пример).
В D7 не все так однозначно. И раз мы говорим о кошерном подключении скриптов, то надо вспомнить про "render arrays" и их свойство "attached". В D7 кошерные блоки и функции "page callback" должны возвращать render array, а не строку готового html-кода, как в D6 (хотя строка тоже работает). Если блок возвращает "render array" и подключает javascript при помощи drupal_add_js(), то после кеширования блока скрипт не будет подключаться, потому что закешированные блоки уже не создаются (контент не строится) и drupal_add_js() не будет вызываться.
Если подключение в теме - то в template.php. Например, чтобы подключить js только для главной страницы:
а если нужно подключить css для определенного типа материала? как тогда будет выглядеть код?
Вот например подключение для типа материала news:
А можете объяснить на примере Google+ как ПРАВИЛЬНО вставить эту кнопку? Я раньше вставлял весь код в page.tpl.php Действительно, не кешируется. Хочется сделать вс1 по уму.
дайте код кнопки, я покажу как подключить.
Код кнопки с асинхронной загрузкой. У меня D6. Подскажите, как сделать все правильно.
интересно, а как кошерно подключить счетчики посещаемости?
В блок засунь и выставь в любой регион =)
Помогите подключить js
В файл темы вставляю
Через page.tpl.php не надо подключать скрипты. Сделайте это так, как описано в статье выше: в info файле через
scripts[] = название скрипта.js Вот прописал я в теме, а куда мне сам скрипт запихнуть? Чтоб работало, как я написал((( Просто не сталкивался с этим, все обходилось модулями ставишь и работает :) Помогите пожалуйста спасибо!
Сам скрипт положите в файл script.js, а файл поместите в корень темы.
В файле info прописал scripts[] = script.js сам файл скрипта положил в корень темы не работает (((
После этого ещё надо кэш сайта сбросить.
Сбрасывал не работает ((( может вы сами данный скрипт проверите.
Давайте скрипт, посмотрю.
а вы скрипт еще не смотрели ?
Посмотрел. Закиньте так:
Если и сейчас не заработает, то два варианта - либо не подключен файл к теме, либо в скрипте выбран неверный селектор. Если не заработает - покажите сайт в паблике, я посмотрю в чём может быть проблема.
По разному пробовал не работает %) Поставьте его у себя, чтоб при наведение на ноду мышкой двигались в блоках последнии комментарии Вопросы пользователей записи в блогах может скрипт не рабочий
Выкладывайте сайт в паблик и покажите его мне, я посмотрю.
Я не вижу на странице класса nudge, на который вешается обработчик. Возможно, в этом причина?
Видимо да, у меня даже в теме нет темплате.php
А как подключить внешний css или js? например css от Google Webfonts. или какую нибудь библиотеку?
через файл info не прокатывает. только модулем или template.php?
Можно двумя вариантами, либо подключать в page.tpl.php всё равно все библиотеки/css размещенные в гугле, яндексе сжаты и распространяются по CDN(Сеть Дистрибуции Контента), то есть загружаются быстрее, либо можешь создать любой файл css без разницы как ты его назовешь, прописать его в info файле, а в файле css использовать import
а вот это классный совет. спасибо :)
что то с модулем Google Webfont Loader не удалось разобраться. добавил код в template.php
только для 7 друпала вместо variables нужно писать vars. правильно?
и еще, если в template.php одну и туже функцию дважды вписать, то все рушиться. обойти это никак нельзя? каждая функция только один раз?
Подскажите плиз. Если я правильно понял, то виджеты соц. сетей лучше тоже убрать из Mynode.tpl.php, поместить в отдельный файл типа виджет.js и грузить через info?
Да. Тогда этот js будет кэшироваться.
1. Попробовал загнал все счетчики в блок footer, главная страница вроде побыстрее стала, но при открытии ноды идет ожидание от всех счетчиков. так и должно быть
2. С виджетами вообще засада, слепил файл виджет.js все их туда прописал, сделал в инфе ссылку. И они вообще перестали показываться (кроме googla) пробовал ( на google & facebook) создать раздельно для каждого виджета свой сккрипт (показывает опять только google). мож че не так делаю. Фейсбук например в скипте картинку like передает.
Вообщем хотел как лучше, а вышло.
SplasH помоги с кодом, нужно подключить jjss.js только на страницах user/uid/text, user/uid/video и user/uid/image/ . Cтраницы формируются модулем views. Заранее спасибо
Огромное Огромное Огромное спасибо. пож-ста ответь еще на один вопрос. С точки зрения производительности есть разница между подключением
drupal_add_js('sites/all/themes/МояТема/jquery.min.js'); или
drupal_add_js(drupal_get_path('theme', 'МояТема') . '/jquery.min.js');
я думаю что первый вариант правильнее ведь второй вариант задействует еще одну функцию drupal_get_path. Если не прав исправь пожалуйста
и еще один вопрос :)
если я хочу подключить не один а несколькко то так должно выглядеть?
По поводу производительности - разницы никакой абсолютно нет, выигрываются возможно тысячные милисекунды (т.е. практически ничего). Зато через drupal_get_path() - правильнее и не будет никогда проблем, если вдруг тема переедет в другую папку например.
По поводу подключения нескольких скриптов - да, правильно.
скрипт должен находиться в папке js или в корне темы или модуля, т.е. ссылка должна быть вида js/скрипт.js, а не абсолютная.
Взял скрипт Jscollpane. В .info прописал css и 2 .js. Очистил кеш. Вставил
в page.tpl. Все равно отображается обычный скролл. Менял overflow на hidden, просто скрывается и все. В чем проблема?
scroll т.е. не видно вообще, что при auto что при hidden.
css не забудьте подключить. Без него скрипт не отображается визуально, хоть и отрабатывает.
Css подключал в .info
Чернокнижники, подскажите пожалуйста, нужно подключить скрипты и стиль для слайд шоу.
Все скопировал в корень темы, сую в acquia_marina.info :
scripts[] = jquery-1.2.6.min.js
scripts[] = jquery.dhonishow.js
stylesheets[all][] = dhonishow.css
в блоке Slide где у меня:
отображается только код. ткните носом. и как можно проверить подключен скрипт аль нет?
* в блоке Slide где у меня:
отображается только код. ткните носом. и как можно проверить подключен скрипт аль нет?
В ПАПКУ SCRIPTS ТЕМЫ БРОСАТЬ ФАЙЛ НУЖНО, А НЕ КОРЕНЬ САЙТА
отличный сайт! Спасибо! У меня свой вопрос по подключению.
У меня есть 2е страницы которые формируются на вьювс, а вьювс фильтруется по значению термина в УРЛ. Первый вьювс имеет адрес /photo/% , второй - /video/%. Для них я создал два файла page--photo.tpl.php и page--video.tpl.php
Необходимо подключить jQuery плагин (scroll.js) только для этих страниц. А так же подключить photo.js только для страниц /photo/% , а video.js только для /video/% т.к. scroll.js это сам плагин, а файлы photo.js и video.js нужны для инициализации с разными селекторами плагина scroll.js на соответствующих страницах.
Как это сделать ? Как вы уже писали:
Или как то по именам файлов шаблона можно? Например скрипт photo.js будет цепляться только к страничкам которые используют шаблон page--photo.tpl.php и т.д.
Создание регионов
Регион - это место для помещения блоков из друпала. Т.е. на сайте можно будет создавать блоки, и помещать их в регионы, описанные в info-файле.
Синтаксис описания блоков следующий:
regions[имя_региона] = имя региона
потом имя_региона будет доступно в шаблоне в качестве пхп-переменной, т.е. $имя_региона
Пример
regions[right] = right sidebar
Нам будет доступна переменная $right, которую мы можем выводить в файле page.tpl.php (о нём мы поговорим чуть пожже) следующим образом:
или же обернув в хтмл-код, чтобы этим регионом можно было управлять:
Объясняю откуда появилось столько кода: часть if ($right) проверяет, есть ли в нашем регионе хотя бы 1 блок. Если нет - то в финальном коде программы никакого текста, в том числе и хтмл-кода нет. Если же в регионе есть 1 или более блоков, то они автоматически окажутся между тэгами и , что в дальнейшем позволит нам управлять стилями этого блока из css-файла.
Файлы шаблонов (.tpl.php)
Эти шаблоны используются для (X)HTML разметки и вывода PHP переменных. В некоторых случаях они могут использоваться для вывода других типов данных, например, XML или RSS. Каждый файл.tpl.php управляет выводом определённой части (темизируемых) данных. В некоторых случаях шаблоны могут перекрывать друг друга при помощи системы возможных вариантов отображения данных (suggestions).
Присутствие каждого файла шаблона в теме необязательно. Отсутствие шаблона приведёт лишь к использованию его стандартного прототипа из ядра Drupal 7. Огромная просьба - никогда не пишите в этих файлах объёмные фрагменты php кода. Для этого есть template.php. Файлы шаблонов должны оставаться лишь файлами шаблонов, а никак не слоем для реализации какой-либо логики.
Для того, чтобы Drupal понял, что необходимо использовать шаблон из темы, а не из ядра, достаточно скопировать его в корень темы и сбросить кэш регистра темы. В этом может помочь Drush либо Admin menu. Если не хотите разбираться с дополнительным функционалом - просто очистите кэш всего сайта.
Вообще, кэш регистра темы необходимо очищать в следующих ситуациях:
- При добавлении новых функций Друпала в template.php
- При изменении файла .info
- При добавлении/удалении шаблонов .tpl.php
Похожие материалы
Описательная часть
Она выглядит следующим образом :
- name = mytheme (имя вашей темы)
- description = my first theme (описание, можно на русском языке)
- screenshot = screenshot.jpg (файл с маленьким скриншотом темы)
- version = 1.0 (версия темы - для разработчиков, можно убрать)
- core = 6.x (Версия друпала, для которой создана тема)
- engine = phptemplate (ядро друпала)
Эту часть можно просто скопировать и вставить в начало файла. Она является обязательной. Без остальных можно жить, а без этой - никак.
Описательная часть
Она выглядит следующим образом :
- name = mytheme (имя вашей темы)
- description = my first theme (описание, можно на русском языке)
- screenshot = screenshot.jpg (файл с маленьким скриншотом темы)
- version = 1.0 (версия темы - для разработчиков, можно убрать)
- core = 6.x (Версия друпала, для которой создана тема)
- engine = phptemplate (ядро друпала)
Эту часть можно просто скопировать и вставить в начало файла. Она является обязательной. Без остальных можно жить, а без этой - никак.
template.php
Данный файл используется как площадка для написания php кода. Здесь необходимо описывать всю логику темы. Файл template.php не является обязательным, однако в большинстве тем он всё же присутствует как минимум для предварительной обработки данных, или создания новых переменных для файлов шаблонов .tpl.php.
Неважно, что именно вы пишете - свои функции, или перекрываете функции темы - всё это должно находиться в template.php. Файл начинается с открывающегося тэга . Однако использовать закрывающий тэг ?> не рекомендуется по причинам возможных ошибок php.
.info файл (обязателен)
Как я уже говорил - всё, что нужно Друпалу, чтобы найти тему - это .info файл. Здесь могут быть описаны файлы стилей (css), javascript, метаданные, блоки. Именно могут быть описаны, но не являются обязательными. О том, что является в .info файле обязательным для заполнения, я расскажу в следующей статье.
Этот файл описывает имя темы, которое будет видно при работе с сайтом, а так же имя файла, которое будет использоваться для вызова функций темы (опять же - об этом чуть позже). Например, если .info файл назвать themename.info, а внутри файл указать name = Theme Name, то на сайте эта тема будет названа именно Theme Name, но в качестве имени темы для функций должно использоваться themename.
Подтемы (саб-темы)
По сути, подтема - эта обычная тема, но она использует файлы какой-либо другой темы. Для того, чтобы созать подтему, необходимо в .info файле указать родительскую тему, файлы которой также будут подключены к сайту. Друпал позволяет создавать подтемы на основе других подтем - т.е. создавать иерархию из тем.
Примеры кода можно посмотреть на github:
Такая мелочь как разделение модулей на папки contrib, custom кажется таким не нужным, но поверьте, когда ваш сайт обрастет 200 контрибными и 30 кастомными модулями вы поймете как сложно найти все кастномные модули и весь кастомный код на сайте. Также если вы изменяете какой-то код в контрибном модулей (что делайте только при крайней необходимости), то его тоже бы неплохо переместить в папку custom, чтобы случайно не затереть изменения при обновление (или другой программист затрет ваши изменения или даже вы затрете, ничего не подозревая, изменения другого программиста.
Итак, давайте создадим наш кастомный модуль. Создадим папку /modules/custom/drupalbook. В этой папке нам нужно будет создать файл drupalbook.info.yml:
*.info.yml файл отвечает за описание модуля. Информация которая в нем указана будет выводиться на странице управления модулями. Само название файла состоит из названия модуля + .info.yml.
YML-файлы в друпале это стандартный формат конфигураций и настроек. Поля и значения в YML-файлах разделяются двоеточием, новая строка идет с отступов в два пробела. Форматирование очень важно для YML-файла, если в формотирование допущена ошибка, лишний пробел или не хватает двоеточия, то друпал может выдать ошибку или не правильно прочитать YML-файл.
Зайдите на страницу Extend (Модули) и включите ваш модуль:
Теперь когда модуль включен мы можем добавлять функционал и он будет работать на нашем сайте. Для начала мы выведем простой текст на странице. Для этого нам потребуется создать еще один YML-файл drupalbook.routing.yml:
Давайте разберем подробно, что находится в этом YML-файле.
drupalbook.first_page: - здесь имя нашего роута, пути, по которому друпал будет собирать список всех роутов, путей. Это имя должно быть уникально, лучше всего использовать имя_модуля.имя_роута, потому что у вас может быть несолько роутов в одном модуле: drupalbook.first_page, drupalbook.second_page и так далее.
path: '/first-page' - путь к вашему роуту. Обратите внимание на отступ в два пробела, он обязателей, поэтому если вы пользуетесь тестовым редактором, который выставляет табаляцию на кнопке табуляции, то лучше изменить эту настройку и сделать выставление двух пробелов вместо табуляции.
defaults: - определяет настройки роута по умолчанию и каким образом нужно создавать route. Дело в том что есть несколько способов создания роута, один из них через класс Контроллер, но можно и через другие классы динамического создания роутов. Возможно позже мы разберем все возможности по работе с роутингом, а пока рассмотрим простой пример через класс Контроллер. Роутинг в Drupal 8 перешел из Symfony и использует библиотеки Symfony. Symfony - это MVC фреймворк, он очень попурялный и используется также в других проектах, например в Laravel, который тоже очень популярный MVC фреймворк. MVC предполагает использование Model, View, Controller (здесь View имеется в виду не модуль Views, а просто шаблон для вывода информации, Model - классы сущностей с помощью которых можно добавлять информацию в базу данных, примерно как в друпале это делает Entity API). Controller из MVC нужен как раз для routing'а, что мы сейчас и делаем в этом уроке.
_controller: '\Drupal\drupalbook\Controller\FirstPageController::content' - В этом параметре мы определяем какой PHP Class будет выводить нашу страницу. После имени класса :: мы указываем какой конкретно метод класса будет выводить страницу. Такое большое количество косых черт, нужно чтобы друпал понял в какой папке лежит ваш PHP class.
_title: 'Hello World!' - Заголовок нашей страницы
_permission: 'access content' - Права на просмотр этой страницы, пользотель должен иметь роль с этими правами, чтобы открыть эту страницу.
После того как мы добавить YML-файл для роутинга, мы должны добавить PHP class для отображения нашей страницы. Для этого нам нужно сначала разобраться в автоподключение файлов классов из наших модулей. Дело в том, что в Drupal очень много классов и не все из них нужны для загрузки определенной страницы, поэтому мы подгружаем только необходимые классы и работаем с ним. Drupal использует автоподключение PHP классов PSR-4:
Давайте посмотрим на строку в роуте, где мы указывали PHP class:
\Drupal - означает что класс подключается с помощью библиотеки Drupal. Drupal теперь тоже отдельная библиотека, правда довольно-таки большая, которую можно подключать через packagist:
Дальше мы указываем какой модуль мы хотим использовать:
После этого мы указываем или сразу имя класса в папке нашего модуля или указываем дальнейшую вложенность. Но дальше все папки уже будут находиться внутри папки src, то есть если мы указали Controller папку, то она будет лежать здесь:
Обратите внимание на регистр, PHP чувствителен к регистру поэтому controller и Controller это разные папки.
И в конце мы указали имя файла, к нему нужно добавить .php:
Давайте создадим этот файл:
Должна получится вот такая структура файлов:
Теперь давайте разберемся с PHP классом, который выводит эту страницу.
Здесь мы указываем путь такой же как в YML-файле роутинга, он показывает откуда Drupal должен подключать этот класс.
namespace указывает путь к вашему файлу с классом. Будьте внимательны при копирование кода с других сайтов, когда вы копируете namespace, имя модуля нужно менять на свое, у меня оно drupalbook, у вас может быть другое.
Код модуля можно посмотреть на github:
На этом все в следующем уроке мы продолжим расширять возможности нашего модуля.
А одним из важных пунктов подключения скриптов и стилей через info файл является то, что в этом случае они будут агрегированы (собраны в один файл) и закешированы. Файлы, подключенные в page.tpl.php кешироваться небудут.
В info-файл скрипты и css подключаются таким образом:
JavaScript
CSS
Бывают случаи, когда подключать требуется скрипт или стиль только для конкретной страницы, или для определённого типа материала. В таком случае файлы надо подключать через php-код:
JavaScript
CSS
Комментарии
Я делаю так: завожу файл preview.css и перекрываю в нем стили модулей. Но оригинальные стили модулей, которые перекрыты, все равно подгружаются браузером? А это лишнее.
у меня перекрыть в файле style.css которые в теме не удалось, то что находится в каталоге модулей. Например тот же forum.css
Может быть потому, что сначала загружается forum.css, потом уже файл, где он перекрывается? Или селекторы не те.
в 6ом Друпале есть такая возможность в admin/settings/performance ну это с точки зрения оптимизации а не удобства редактирования, хотя по мне так лучше они в разных файлах будут - проще ориентироваться
Что-то странно! CSS темы в друпале загружается после css модулей, значит и перекрыть там можно все остальное. сколько не делал всегда без проблем переопределял. Дайте пример посмотреть.
Согласен с gumk - стили модулей всегда перекрываются стилями в теме. Возможно топикстартер неаккуратно написал классы. Вы примерчик бы в студию.
То что в файле forum.css
Это же добавляю в style.css
Такой вопрос, может быть не к месту, а Вы кеш сбрасывали?
Я имел ввиду ссылку на сайт. Посмотреть с файрбагом, почему ваш стиль не работает - пять минут.
Ну сейчас еще попробую!
К сожелению ничего не выходит. Очищал кеш эксплорера.
SQL-запрос: TRUNCATE `cache` ;
Он пока на локалке.
Тогда поставьте себе браузер Firefox, на него установите плагин Firebug. И любые проблемы со стилями будут как на ладони.
Вставляю в таблицу стилей
.imagecache.imagecache-image_preview.imagecache- default .imagecache-image_preview_default <
align: left;
hspace: 10 ;
vspace: 10 ;
>
Хочу чтобы изображался текст на одном уровне с картинкой, но ничего не выходит! В каком направлении копать?
вот как выглядит работа в Firebug e
У вас спина белая стиль неправильно написан. вы отдельные классы напишите через запятую или вообще один используйте: .imagecache-image_preview_default
Я уже давно грозился, и, наконец, решился написать серию статей по темизации для Drupal 7. Итак, для начала я опишу все файлы в Drupal 7, которые необходимы для создания собственной темы.
Тема представляет из себя набор файлов, которые определяют уровень представления (внешнего вида) сайта. К каждой теме вы можете создать одну или несколько подтем (саб-тем). Для того, чтобы Друпал обнаружил вашу тему, достаточно лишь наличия .info файла (файл с описанием темы), однако в таком случае пользы от вашей темы будет немного :)
Ниже приведён рисунок, который отражает "анатомию" темы в Друпале. Обратите внимание на цвет перед именем шаблона и цвет на макете сайта: наглядно показано какой шаблон за какую часть сайта отвечает. Например, html.tpl.php включает в себя разметку полной html страницы (DOCTYPE, , ), а page.tpl.php отвечает за вывод содержимого (внутри тэга ). На рисунке показана тема с названием example.
Часть, в которой описываются "примочки" сайта
Она необязательная. В ней описываются фишки сайта, которые будут доступны.
синтаксис:
features[] = название фичи
Все доступные фичи сайта:
- features[] = logo (разрешает логотип на сайте)
- features[] = name (разрешает отображать имя сайта через переменную $site_name)
- features[] = slogan (разрешает отображать слоган сайта через переменную $site_slogan)
- features[] = mission (разрешает отображать миссию сайта через переменную $mission)
- features[] = node_user_picture (разрешает показывать в статьях аватарку автора)
- features[] = comment_user_picture (разрешает показывать в коментариях аватарку автора)
- features[] = search (разрешает использовать поиск на сайте)
- features[] = favicon (позволяет подключать свою иконку к сайту)
- features[] = primary_links (разрешает использовать первичное меню)
- features[] = secondary_links (разрешает использовать вторичное меню)
Итак, я перечислил всё содержимое info-файла. Теперь я покажу как в целом виде обычно состоит его начинка на примере файла из темы fervens:
"Подключательная" часть
Здесь к теме подключаются дополнительные файлы, будь то css-файлы или javascripts-файлы.
Для css синтаксис следующий:
stylesheets[all][] = файл.css или stylesheets[all][] = путь к файлу/файл.css
Пример
Для JavaScript'ов синтаксис такой:
Пример
Файлы ещё можно подключать в файле page.tpl.php между тэгами , однако этот способ считается некошерным для друпала.
Читайте также: