Макети в Joomla! 3, створення власних макетів

  1. Що роблять макети, навіщо вони потрібні?
  2. Створення власного макета компонента
  3. Використання додаткових макетів всередині основного
  4. Створення власного макета модуля
  5. Як Joomla визначає обраний макет

Макети в CMS Joomla! - це звичайні php файли, які виконують завдання формування результуючого html коду сторінки. Зберігаються вони завжди в директорії tmpl. Для компонентів цей шлях виглядає наступним чином:

components / імя_компонента / views / імя_представленія / tmpl / імя_макета.php

У модулях шлях значно простіше:

modules / імя_модуля / tmpl / імя_макета.php Як правильно користуватися макетами і як створювати власні макети для уявлень компонентів і модулів розглянемо нижче.

Що роблять макети, навіщо вони потрібні?

У файлах макетів не проводиться жодних важливих обчислень, що стосуються бізнес логіки додатка. Більшість алгоритмів відповідає за виведення інформації на сторінці. Найчастіше макети підключаються в поданні і з нього отримують дані для відображення. Крім цього в макеті доступний ряд налаштувань, для можливості зміни виведення окремих його елементів.

За отриманими даними і налаштуванням макет формує html вміст сторінки з усіма елементами її оформлення, додатковими графічними ефектами, формами, інтерактивним вмістом і т.д. Наприклад, макет

components / com_content / views / article / tmpl / default.php

відповідає за відображення сторінки статті.

У загальному випадку шлях до файлу макета компонента можна описати так:

components / com_компонент / views / імя_представленія / tmpl / імямакета.php

Для макетів в модулях шлях значно коротше:

modules / mod_модуль / tmpl / імямакета.php

Створення власного макета компонента

З необхідністю створення власного маці найчастіше можна зіткнутися, коли вам необхідно кілька варіантів відображення одного і того ж вмісту. Припустимо, що нам знадобилося виводити другий варіант матеріалу Joomla !, а стандартні засоби настройки макета не можуть надати відповідного варіанту відображення. Нехай це будуть матеріали, що містять новини.

Ми вже писали про перекритті макетів в шаблоні . Далі в прикладах будемо використовувати стандартний шаблон Joomla! - protostar. Щоб створити новий макет відразу в шаблоні, скопіюємо стандартний макет статті

components / com_content / views / article / tmpl / default.php

і розмістимо його по шляху

templates / protostar / html / com_content / article / news.php

Ми плануємо використовувати цей макет в адміністративній частині сайту, значить його назва не повинна містити символу нижнього підкреслення.

Тепер можна внести зміни в новий макет. Припустимо, що ми б хотіли виводити e-mail автора статті в цьому макеті, але в коді стандартного макета нам доступно тільки ім'я автора. Вставимо в макет наступний код в блоці, який відображає ім'я автора:

<? Php $ authorUser = JUser :: getInstance ($ this-> item-> created_by); ?&gt; <? Php if (! Empty ($ authorUser-> email)):?&gt; <a href="mailto:<?php echo $authorUser-> email;?&gt; "Title =" <? Php echo $ authorUser- > email;?> "&gt; <? php echo $ authorUser-> email; ?> </a&gt; <? Php endif; ?>

Для того, щоб побачити результат, необхідно вибрати новий макет для відображення статей. Спробуємо встановити його, як макет за замовчуванням для всіх статей на сайті. Для цього в адмін частини заходимо в менеджер матеріалів і переходимо в його налаштування.

Першим пунктом тут бачимо Вибір макета.

Для того, щоб в цьому списку новий макет мав більш зрозумілу назву, ніж news, необхідно визначити мовну константу за шаблоном: TPL_ШАБЛОН_COM_КОМПОНЕНТ_ПРЕДСТАВЛЕНІЕ_LAYOUT_МАКЕТ. У нашому прикладі ця константа буде мати вигляд: TPL_PROTOSTAR_COM_CONTENT_ARTICLE_LAYOUT_NEWS = "Макет новин". По префіксу константи можна здогадатися, що її розміщення мається на увазі в мовному файлі шаблону. Але оскільки використовувати ми її будемо не в шаблоні, а в налаштуваннях матеріалів, то потрібно використовувати файл з суфіксом sys. Для російського я зика це буде файл:

language / ru-RU / ru-RU.tpl_protostar.sys.ini

Для інших мов потрібно використовувати інший шлях і назву мовного файлу, де ru-RU замінено на відповідне значення коду мови. Крім цього, якщо ви створюєте макет в іншому шаблоні, то і назва файлу з мовними константами буде містити його назву.

Якщо ж з якихось причин ви не можете додати константу в мовної файл шаблону, можна скористатися вбудованим в CMS Joomla! механізмом перевизначення мовних констант. Для цього потрібно створити два файли для російської мови.

language / overrides / ru-RU.override.ini
administrator / language / overrides / ru-RU.override.ini

У першому будуть зберігатися перевизначені мовні константи для користувача частини сайту, а в другому - для адміністративної відповідно. Нову мовну константу потрібно додати в файл для адміністративної частини, оскільки ми хочемо, щоб вона виводилася саме там. Для нас другий спосіб з додаванням мовної константи в файл ru-RU.override.ini більш кращий, ніж додавання її в файл з константами шаблону.

Тепер в нашому списку макетів в адміністративній частині сайту виводиться вказане нами назва нового макета. Вибираємо його і зберігаємо налаштування менеджера матеріалів.

Зараз наш новий макет обраний, як стандартний для всіх матеріалів на сайті. Спробуйте створити тестовий матеріал і вивести його на одній зі сторінок. Для нашого прикладу сторінка має наступний вигляд:

Для того, щоб перевизначити макет одного конкретного матеріалу в Joomla !, необхідно зайти в Менеджер матеріалів, знайти в списку потрібний матеріал і натиснути на його назву.

Після цього перейти на вкладку Відображення в нижню її частину.

Там є поле Альтернативний макет, в якому ми аналогічно вибираємо свій власний макет відображення статті. Після цього зберігаємо зміни.

При перегляді цієї статті повинен використовуватися обраний нами макет. Для інших матеріалів макет повинен залишитися стандартний.

Використання додаткових макетів всередині основного

Іноді виникає необхідність винести частину оформлення з макета в окремий файл макета, щоб в подальшому повторно використовувати його або просто розділити сторінку на складові блоки. Наприклад, при циклічному виведення елементів масиву або для виділення відокремленого блоку.

Для того, щоб в рамках існуючого макета виділити частину коду в окремий файл потрібно створити файл, ім'я якого складається з імені основного макета і назви додаткового макета, розділених нижнім підкреслення. Наприклад, якщо ми ходимо створити додатковий макет для news.php, то його ім'я може бути news_author.php. Як вже багато хто здогадався, саме з цим було пов'язано обмеження на використання нижнього підкреслення в назвах файлів основного макета. Якщо в назві файлу макета буде присутній нижнє підкреслення, то він не буде виводитися в Адим частини сайту, як варіант альтернативного макета.

Тепер розглянемо як використовувати додатковий макет в файлі основного на прикладі. За основу візьмемо приклад, описаний вище, де ми переопределили макет матеріалу. Спробуємо винести доданий нами блок з e-mail адресою автора в окремий макет. Створимо новий файл

templates / protostar / html / com_content / article / news_author.php

з наступним кодом

<? Php defined ( '_ JEXEC') or die; ?&gt; <? Php $ authorUser = JUser :: getInstance ($ this-> item-> created_by); ?&gt; <? Php if (! Empty ($ authorUser-> email)):?&gt; <a href="mailto:<?php echo $authorUser-> email;?&gt; "Title =" <? Php echo $ authorUser- > email;?> "&gt; <? php echo $ authorUser-> email; ?> </a&gt; <? Php endif;

Замість доданого в макеті news.php аналогічного блоку запишемо рядок підключення додаткового макета.

<? Php echo $ this-> loadTemplate ( 'author'); ?>

Як бачите, в якості параметра для функції loadTemplate () використовується тільки частина імені файлу після нижнього підкреслення. Механізм підключення тут аналогічний використанню include або require, при цьому в файлі news_author.php нам є все оточення головного макета і ми можемо використовувати в ньому змінні і функції, наявні в основному макеті.

Хоча зовні на сторінці матеріалу нічого і не змінилося, ми виконали виділення частини макета в окремі додатковий макет. Аналогічно можна виділити й інший код або додати новий, кількість використовуваних додаткових макетів не обмежена.

Створення власного макета модуля

Тут все дуже схоже на створення альтернативного макета для компонента, описаного вище. Розглянемо приклад на базі стандартного модуля для авторизації користувачів - mod_login. Для початку скопіюємо базовий файл макета

modules / mod_login / tmpl / default.php

по дорозі

templates / protostar / html / mod_login / overlogin.php

Як і в прикладі з компонентом, назва макета не містить символу нижнього підкреслення. Тепер ми можемо внести всі необхідні зміни в наш новий макет. Наприклад, додамо простий блок з текстом у верхній його частині.

... JHtml :: _ ( 'bootstrap.tooltip'); ?> <! - Новий текстовий блок -> <div class = "mod_login_top"> Введіть свої дані для авторизації на сайті </ div> <! - Кінець нового текстового блоку -> <form action = "<? Php echo JRoute :: _ ( 'index.php', true, $ params-> get ( 'usesecure'));?> "method =" post "id =" login-form "class =" form-inline ">. ..

Для відображення макета нам потрібно в будь-якій частині сайту вивести сам модуль, а в його настройках на вкладці Розширені можливості пошуку вибрати відповідний Альтернативний макет.

Аналогічно прикладу з компонентом, додамо мовну константу для нового макета модуля за шаблоном: TPL_ШАБЛОН_MOD_МОДУЛЬ_LAYOUT_МАКЕТ. У нашому прикладі потрібно додати наступний код TPL_PROTOSTAR_MOD_LOGIN_LAYOUT_OVERLOGIN = "Новий макет" в файл

administrator / language / overrides / ru-RU.override.ini

Переконаємося що модуль виводиться правильно.

З використанням додаткових макетів в модулях ситуація трохи відрізняється від їх використання в компонентах. Створення файлу додаткового макета відбувається аналогічно, він поміщається в ту ж папку, що і основний макет, а його назва складається з назви основного макета, нижнього підкреслення і додаткового назви. Відрізняється код підключення цього файлу в основному макеті. Якщо розглядати ситуацію з прикладом модуля авторизації і виділити новий текстовий блок в макет overlogin_text.php, то для його підключення в файлі overlogin.php на місці цього блоку потрібно помістити рядок

<? Php require JModuleHelper :: getLayoutPath ( 'mod_login', 'overlogin_text'); ?>

Як бачите, ми самостійно підключаємо файл, використовуючи оператор require. Першим параметром в статичний метод JModuleHelper :: getLayoutPath () передається назва модуля, а другим - повне ім'я макета overlogin_text.

Як Joomla визначає обраний макет

Для отримання імені макета, яка була обрана в адміністративній частині сайту, Joomla! використовує стандартний механізм налаштувань для компонентів і модулів. Якщо спиратися на наведені вище приклади, то можемо розглянути файл

administrator / components / com_content / config.xml

У ньому є поле, яке відповідає за вибір макета для матеріалів сайту.

<Field name = "article_layout" type = "componentlayout" label = "JGLOBAL_FIELD_LAYOUT_LABEL" description = "JGLOBAL_FIELD_LAYOUT_DESC" menuitems = "true" extension = "com_content" view = "article" />

Отримання даного параметра у файлі уявлення

components / com_content / views / article / view.html.php

відбувається за рахунок коду

$ Item-> params-> get ( 'article_layout');

Якщо розглядати приклад з модулем mod_login, то нас цікавить параметр описується в файлі

modules / mod_login / mod_login.xml

і має вигляд

<Field name = "layout" type = "modulelayout" label = "JFIELD_ALT_LAYOUT_LABEL" description = "JFIELD_ALT_MODULE_LAYOUT_DESC" />

Отримання самого параметра відбувається в файлі

modules / mod_login / mod_login.php

в рядку

$ Params-> get ( 'layout', 'default');

Тут другим параметром в функцію get передається назва макета за замовчуванням.

Як бачите, у Joomla! є окремі типи полів для вибору макета в компонентах і модулях. У випадку з компонентами це поле типу componentlayout, а для модулів використовується modulelayout. Це варто враховувати при створенні власних компонентів або модулів, які підтримують функціонал вибору макета в адміністративній частині сайту.

Що роблять макети, навіщо вони потрібні?
Що роблять макети, навіщо вони потрібні?
Php $ authorUser = JUser :: getInstance ($ this-> item-> created_by); ?
Gt; <?
Php if (! Empty ($ authorUser-> email)):?
Gt; <a href="mailto:<?
Php echo $authorUser-> email;?
Gt; "Title =" <?
Php echo $ authorUser- > email;?
Php echo $ authorUser-> email; ?