Новости Joomla

Свои типы полей в Joomla.

Свои типы полей в Joomla.Это большая тема, о которой можно говорить очень много

Это большая тема, о которой можно говорить очень много. Самое главное, что возможности применения ограничиваются только вашей больной фантазией. Вы строите интерфейс своего модуля или плагина и вам нужно подтянуть данные из сторонней системы (список чего-нибудь по какому-нибудь API), чтобы сохранить выбранный id в Joomla. Или сделать какую-то проверку и в зависимости от неё показать то или иное сообщение пользователю. Для этого подойдут свои пользовательские типы полей. Интерфейс Joomla по большей части описан в XML-файлах. У каждого из них свои параметры. Некоторые не описаны в документации (manual.joomla.org), поэтому самым любопытным будет полезно заглянуть в собственно файлы фреймворка по пути

libraries/src/Form/FormField.php, а так же в
libraries/src/Form/Fields. У каждого класса поля перечислены его специфические свойства, которые можно описывать в XML. А в своём типе поля вы можете устанавливать эти значения программно. В моём модуле WT Quick links под капотом происходят изменения. Теперь для работы (в админке) ему нужен вспомогательный плагин. А в самом модуле нам бы проверить, а не выключен ли он? В Joomla есть тип поля Note - заметка. Его можно использовать для вывода примечаний.

<field type="note" name="your_note_for_user" label="Заголовок примечания" title="Альтернативный способ для заголовка" description="Текст примечания" class="col-12 alert alert-info" heading="h1" close="true" />

heading - указывать уровень заголовка.
close - позволяет закрыть это примечание. В классе поля
libraries/src/Form/Field/NoteField.php описана логика вывода. И в принципе оно нам подходит для нашей задачи. Но оно будет выводить сообщение всегда, а нам нужно только тогда, когда плагин отключён. Поэтому берём и создаём свой класс поля, который мы унаследуем от
NoteField. Это значит, что у нас в руках будет весь инструментарий стандартного поля
Note + то, что мы сами добавим. В XML-манифест добавляем наше поле

<field type="systempluginstatus" name="systempluginstatus" addfieldprefix="Joomla\Module\Wtquicklinks\Site\Fields"/>

-

type - имя файла и класса,-
addfieldprefix - указываем namespace к нашему классу, может быть любой нам нужный-
name - нельзя полю без имени...Это означает, что Joomla будет использовать класс поля из файла
modules/mod_wt_quick_links/src/Fields/SystempluginstatusField.php.А в классе поля будет написано следующее:

<?php // namespace для атрибута addfieldprefix namespace Joomla\Module\Wtquicklinks\Site\Fields; // нельзя напрямую обращаться к этому файлу defined('_JEXEC') or die; // подключаем родительский класс для переопределения use Joomla\CMS\Form\Field\NoteField; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\PluginHelper; // имя класса и имя файла точь-в-точь class SystempluginstatusField extends NoteField { protected $type = 'Systempluginstatus'; protected function getLabel() { // если плагин не включён if(PluginHelper::isEnabled('system','wtquicklinks')) { // меняем свойства родительского класса $this->class = 'alert alert-danger w-100'; $this->element['label'] = '⚠️ А-а-а-а!'; $this->element['description'] = 'Плагин не включён!!'; // и просто рендерим его с нашими свойствами return parent::getLabel(); } // А иначе всё хорошо, скрываем поле из виду. $this->parentclass = 'd-none'; return ''; } }

Просто и удобно. И людям приятно, что о них позаботились и рассказали почему что-то не работает. @webtolkru#joomla #php #webdev #разработка

0 Пользователей и 1 Гость просматривают эту тему.
  • 33 Ответов
  • 11595 Просмотров
*

Dgikar

  • Захожу иногда
  • 192
  • 3 / 0
  • Я только учусь
introtext
« : 20.01.2012, 19:47:31 »
Люди, за вывод статьи, отвечает это:
<?php echo $this->item->introtext; ?> в файлах мой шаблон/html/article, /category, /featured/ default.php, blog_item.php и т. д.

А как добраться к introtext, чтобы поковыряться с CSS? :) Вариант: "При создании (написании) статьи" не подходит. Какие-то же файлы отвечают за вывод той же картинки со статьи, текста... Какие? Где?

Заранее благодарю за ответы
*

Efanych

  • Глобальный модератор
  • 4683
  • 644 / 0
  • Меняю свою жизнь на 360°!
Re: introtext
« Ответ #1 : 20.01.2012, 19:57:00 »
Цитировать
А как добраться к introtext, чтобы поковыряться с CSS?
Непонятный вопрос. Вы FireBug пользоваться умеете?
Создание сайтов, шаблонов, помощь в решении проблем.
*

Dgikar

  • Захожу иногда
  • 192
  • 3 / 0
  • Я только учусь
Re: introtext
« Ответ #2 : 20.01.2012, 20:02:37 »
Непонятный вопрос. Вы FireBug пользоваться умеете?
:) умею в той части, чтобы понять, в каком файле, и на какой строке, находится тот или иной class и/или id. Но, этого не достаточно, т. к., в самом introtext из <?php echo $this->item->introtext; ?>, мне нужно (как пример) поменять местами картинку с текстом, добавить разделительную линию <hr /> между ними и т. д. Т. ч., FireBug тут не помощник...
*

Efanych

  • Глобальный модератор
  • 4683
  • 644 / 0
  • Меняю свою жизнь на 360°!
Re: introtext
« Ответ #3 : 20.01.2012, 20:24:00 »
А в чём проблема? Через редактор. Никакие файлы за вывод интро не отвечают. Это Одна таблица в базе. Может вы ищите шаблон вывода блога категории? Это в шаблоне html/com_content/category/blog_item.php
Создание сайтов, шаблонов, помощь в решении проблем.
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Re: introtext
« Ответ #4 : 20.01.2012, 20:40:41 »
Попользовать разные элементы внутри поля introtext средствами шаблонизации нельзя ^-^. Для этого пишутся контент-плагины.
*

Dgikar

  • Захожу иногда
  • 192
  • 3 / 0
  • Я только учусь
Re: introtext
« Ответ #5 : 20.01.2012, 20:42:42 »
А в чём проблема? Через редактор. Никакие файлы за вывод интро не отвечают. Это Одна таблица в базе. Может вы ищите шаблон вывода блога категории? Это в шаблоне html/com_content/category/blog_item.php
Тогда не понятно, как же тогда те же Ja или GK изменяют именно introtext? Понятно, что можно через редактор, но, это действует, когда один человек (знающий о том, как нужно оформить статью) занимается вводом статей, а если несколько, а если из разных стран...

Идея в том, что чтобы не ввел создающий человек в редакторе, статья, выглядела одинаково, т. е., я, где-то, в каких-то файлах, создам шаблон для вывода introtext, и он будет выводится на фронт...

А что касается шаблона html/com_content/category/blog_item.php, то, именно в этом файле и есть конструкция <?php echo $this->item->introtext; ?>...

Мне кажется, что все же, есть какие-то файлы, отвечающие за формирование <?php echo $this->item->introtext; ?>. Ведь, если я правильно понимаю, то в конструкции <?php echo $this->item->introtext; ?> слово introtext - это ничто иное, как переменная?! а раз так, то, в нее откуда-то идет запись, где-то же эта запись формируется?

Или я чего-то не допонимаю?
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Re: introtext
« Ответ #6 : 20.01.2012, 20:45:11 »
Ваше стремление к унификации конечно похвально. Но, повторюсь, introtext средствами вёрстки никак нельзя контролировать! Как верно подметил ещё Ефаныч, это единое поле таблицы content. Уточните задачу, приведите примеры того, что хотите получить. Есть несколько мыслей, как помочь.
*

Dgikar

  • Захожу иногда
  • 192
  • 3 / 0
  • Я только учусь
Re: introtext
« Ответ #7 : 21.01.2012, 02:09:15 »
... приведите примеры того, что хотите получить. Есть несколько мыслей, как помочь.
Ну как пример (правда, это К2, но, хотелось бы сделать такое для материала Joomla): http://demo.gavick.com/joomla15/jul2011/index.php?option=com_k2&view=itemlist&layout=category&task=category&id=7&Itemid=187 - название статьи, вставлено между картинкой и вводным текстом.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: introtext
« Ответ #8 : 21.01.2012, 02:17:01 »
Ну как пример (правда, это К2, но, хотелось бы сделать такое для материала Joomla): http://demo.gavick.com/joomla15/jul2011/index.php?option=com_k2&view=itemlist&layout=category&task=category&id=7&Itemid=187 - название статьи, вставлено между картинкой и вводным текстом.
В вашем случае переопределен шаблоном категории вывод материала К2. В К2 категории можно задать(сделать, написать) свой шаблон.
*

Dgikar

  • Захожу иногда
  • 192
  • 3 / 0
  • Я только учусь
Re: introtext
« Ответ #9 : 21.01.2012, 02:49:04 »
В вашем случае переопределен шаблоном категории вывод материала К2. В К2 категории можно задать(сделать, написать) свой шаблон.
Это я понимаю, но, учитывая то, что К2 я не использую, то вопрос переопределения шаблона отпадает.

В общем, я понял... Проще не парится а маємо те, що маємо (имеем то, что имеем)...

Подскажите тогда плз, что и где (в каком class) прописать, чтобы картинки в колонках, стали 150px на 99px, а картинка в первой статье (на голубом фоне), осталась такой как есть: http://www.b2all.biz/ru/world-today/word-news/europe/east-europe/ukraine.

P. S.
    Первая статья (на голубом фоне) - имеет тот вид, который я хотел от нее, а вот со статьями - картинками (чтобы текст обрамлял картинку с правой стороны пример:
http://www.joomlart.com/demo/#templates.joomlart.com/ja_teline_iv/) в колонках - не могу справиться...

Где-то потерял "ниточку", и куда бы не тыкался - все коту под хвост.

В идеале, хочу сделать такую же страницу, как на JA примере, только, чтобы первая статья, выглядела так. как сейчас на http://www.b2all.biz/ru/world-today/word-news/europe/east-europe/ukraine.
[/list]

Спасибо
« Последнее редактирование: 21.01.2012, 03:19:10 от Dgikar »
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Re: introtext
« Ответ #10 : 21.01.2012, 03:20:16 »
В общем сделал.
1. копируете из components\com_content\views\article\tmpl\ в templates\шаблон\html\com_content\article\ файл default.php
2. Заменяете всё на...
Код: php
<?php defined('_JEXEC') or die;
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers');
/*выносим первый пикчер в отдельный класс объекта*/
preg_match_all('#<img[^<]+?>#', $this->item->text, $matches);
$this->item->img = $matches[0][0];
$this->item->text = str_replace($this->item->img, "", $this->item->text);
/*кончили выносить*/
?>
<div class="item-page<?php echo $this->pageclass_sfx?>">
<!--вставляем картинку до заголовка-->
<div class="article_img">
<?php echo $this->item->img; ?>
</div>
<!--кончили вставлять-->
<h1>
<?php echo $this->escape($this->item->title); ?>
</h1>
<?php echo $this->item->text; ?>
</div>
Это упрощённый вариант. Остальное выводите по желанию. См. components\com_content\views\article\tmpl\default.php
*

Dgikar

  • Захожу иногда
  • 192
  • 3 / 0
  • Я только учусь
Re: introtext
« Ответ #11 : 21.01.2012, 11:47:38 »
В общем сделал ... Это упрощённый вариант ...
Спасибо огромное. Для отображения одной статьи - сработало отлично, но, для отображения блога статей - не сработало - выводить картинку и краткое описание - отказывается напрочь... не пойму в чем дело...

И, сорри за наглость, а как еще выделить Caption картинки?
*

Efanych

  • Глобальный модератор
  • 4683
  • 644 / 0
  • Меняю свою жизнь на 360°!
Re: introtext
« Ответ #12 : 21.01.2012, 12:01:07 »
Цитировать
Для отображения одной статьи - сработало отлично, но, для отображения блога статей - не сработало
Там другой файл.
html/com_content/category/blog_item.php
Только код Шустрого не полностью вставляйте, а по аналогии
Создание сайтов, шаблонов, помощь в решении проблем.
*

Dgikar

  • Захожу иногда
  • 192
  • 3 / 0
  • Я только учусь
Re: introtext
« Ответ #13 : 21.01.2012, 12:34:26 »
... html/com_content/category/blog_item.php ...
Да, именно с ним и пробовал работать

... Только код Шустрого не полностью вставляйте, а по аналогии
... :( эээээххххх... Знал бы я PHP... :(
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Re: introtext
« Ответ #14 : 21.01.2012, 14:53:27 »
templates\шаблон\html\com_content\article\default.php:
Код: php
<?php defined('_JEXEC') or die;
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers');
//Shustry
preg_match_all('#<img[^<]+?>#', $this->item->text, $matches); //ищем картинки
$this->item->img = $matches[0][0]; //выбираем только первую
preg_match_all('#alt\s*=\s*(["\'])(.*?)\1#', $this->item->img, $matches); //ищем в ней alt
$this->item->imgalt = ($matches[2][0]); //выбираем значение alt
$this->item->text = str_replace($this->item->img, "", $this->item->text); //удаляем первую картинку из текста
preg_match_all('#style\s*=\s*(["\'])(.*?)\1#', $this->item->img, $matches); //ищем атрибут style в нашей картинке. Эту и следущую строку можете не добавлять.
$this->item->img = str_replace($matches[0][0], "", $this->item->img); //удаляем его, чтобы кривые менеджеры не ломали разметку.
?>
<div class="item-page<?php echo $this->pageclass_sfx?>">
<!--вставляем картинку до заголовка-->
<?php if ($this->item->img) {; ?> <!--проверяем, есть ли вообще картинка? Если есть то выводим блок ниже -->
<div class="article_img">
<?php echo $this->item->img; ?> <!-- проверяем наличие alt. Если есть, то выводим... -->
<?php if ($this->item->imgalt) {; ?>
<span class="caption"><?php echo $this->item->imgalt; ?></span>
<?php }; ?>
</div>
<?php }; ?>
<!--кончили вставлять-->
<h1>
<?php echo $this->escape($this->item->title); ?>
</h1>
<?php echo $this->item->text; ?>
</div>

templates\шаблон\html\com_content\category\blog_item.php:
Код: php
<?php defined('_JEXEC') or die;
$params = &$this->item->params;
$canEdit = $this->item->params->get('access-edit');
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');
//JHtml::_('behavior.tooltip'); - комментим, если не используем в проекте Mootools
//JHtml::core(); - комментим, если не используем в проекте Mootools

//Начало
preg_match_all('#<img[^<]+?>#', $this->item->introtext, $matches);
$this->item->img = $matches[0][0];
preg_match_all('#alt\s*=\s*(["\'])(.*?)\1#', $this->item->img, $matches);
$this->item->imgalt = ($matches[2][0]);
$this->item->introtext = str_replace($this->item->img, "", $this->item->introtext);
preg_match_all('#style\s*=\s*(["\'])(.*?)\1#', $this->item->img, $matches);
$this->item->img = str_replace($matches[0][0], "", $this->item->img);

if ($this->item->img) {; ?>
<div class="article_img">
<?php echo $this->item->img; ?>
<?php if ($this->item->imgalt) {; ?>
<span class="caption"><?php echo $this->item->imgalt; ?></span>
<?php }; ?>
</div>
<?php }; ?>
<h2><a href="<?php echo JRoute::_(ContentHelperRoute::getArticleRoute($this->item->slug, $this->item->catid)); ?>"><?php echo $this->escape($this->item->title); ?></a></h2>
<?php
//Конец
echo $this->item->introtext;
if ($params->get('access-view')) :
$link = JRoute::_(ContentHelperRoute::getArticleRoute($this->item->slug, $this->item->catid));
else :
$menu = JFactory::getApplication()->getMenu();
$active = $menu->getActive();
$itemId = $active->id;
$link1 = JRoute::_('index.php?option=com_users&view=login&Itemid=' . $itemId);
$returnURL = JRoute::_(ContentHelperRoute::getArticleRoute($this->item->slug, $this->item->catid));
$link = new JURI($link1);
$link->setVar('return', base64_encode($returnURL));
endif;
?>
<p class="readmore"><a href="<?php echo $link; ?>">Читать полностью</a></p>
*

Dgikar

  • Захожу иногда
  • 192
  • 3 / 0
  • Я только учусь
Re: introtext
« Ответ #15 : 21.01.2012, 15:17:03 »
Shustry, ОГРОМНОЕ, ЧЕЛОВЕЧЕСКОЕ СПАСИБО!

По Вашему последнему коду, в категории, вот что получилось: http://www.b2all.biz/ru/world-today/word-news/europe/east-europe/ukraine
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Re: introtext
« Ответ #16 : 21.01.2012, 15:21:30 »
Dgikar, пожалуйста. У Вас ошибка где-то. Сейчас разметка выглядит так:
Код
<div class="img_caption none" style="float: none; width: 500px;">
<img class="caption" border="0" title="Турция и Украина собираются отменить визы" src="/images/stories/tur-ua.jpg">
<p class="img_caption">Турция и Украина собираются отменить визы</p>
</div>
<span class="caption">Турция и Украина собираются отменить визы</span>
Два раза выводится $this->item->imgalt
<p class="img_caption"> - вот это наверное лишнее.
*

Dgikar

  • Захожу иногда
  • 192
  • 3 / 0
  • Я только учусь
Re: introtext
« Ответ #17 : 21.01.2012, 15:27:44 »
... вот это наверное лишнее.

Да, вот это нужно убрать:
Код: php
<?php if ($this->item->imgalt) {; ?>
<span class="caption"><?php echo $this->item->imgalt; ?></span>
<?php }; ?>

Получаем:
Код: php
if ($this->item->img) {; ?>
<div class="article_img">
<?php echo $this->item->img; ?>
</div>
<?php }; ?>

Еще раз СПАСИБО ЗА ПОМОЩЬ!
*

mrsatanclaus

  • Осваиваюсь на форуме
  • 25
  • 0 / 0
Re: introtext
« Ответ #18 : 20.05.2012, 13:26:06 »
Здраствуйте, подскажите, пожалуйста, как можна изменить вид блога материалов com_content подобно вот такому примеру http://football.ua/news/archive/? заранее спасибо...
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Re: introtext
« Ответ #19 : 22.05.2012, 10:16:59 »
mrsatanclaus, а в чём там сложность? Вроде всё элементарно делается. Ставите какой-нить тумбочкёр вроде SmartResizer-а, прописываете явно размеры, сносите влево и делаете отрицательный margin равный ширине картинки. Остальные элементы тоже сносите влево и делаете левый padding равный этому же размеру.
*

mrsatanclaus

  • Осваиваюсь на форуме
  • 25
  • 0 / 0
Re: introtext
« Ответ #20 : 22.05.2012, 13:18:22 »
можно поподробнее? какие файлы править, какие классы?
*

mrsatanclaus

  • Осваиваюсь на форуме
  • 25
  • 0 / 0
Re: introtext
« Ответ #21 : 22.05.2012, 13:34:12 »
по порядку можете пояснить?
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Re: introtext
« Ответ #22 : 22.05.2012, 13:39:54 »
1. Ставите СмартРесайзер: http://joomlaforum.ru/index.php/topic,77958.0.html Включаете в плагинах, настраиваете на глобальное использование.
2. Копируете из components/com_content/views/featured/tmpl/ в templates/шаблон/html/com_content/featured/ файлы default.php и default_item.php, где первый - шаблон блога главной страницы, второй - шаблон элемента блога. Всё, теперь можете над главной издеваться. ^-^
*

mrsatanclaus

  • Осваиваюсь на форуме
  • 25
  • 0 / 0
Re: introtext
« Ответ #23 : 22.05.2012, 13:43:38 »
мне нужно изменить шаблон блога категории, тогда какой файл брать blog_item.php?
поставил смарт ресайзер - он уменьшает изображение, но оно остаеться на своем месте, выравнивание где прописывать, при создании статьи или в файле каком-нибудь?
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Re: introtext
« Ответ #24 : 22.05.2012, 13:47:17 »
мне нужно изменить шаблон блога категории, тогда какой файл брать blog_item.php?
templates/шаблон/html/com_content/category/blog_item.php
поставил смарт ресайзер - он уменьшает изображение, но оно остаеться на своем месте, выравнивание где прописывать, при создании статьи или в файле каком-нибудь?
templates/шаблон/css/template.css
Как менять, написал в самом начале. Сносите картинку влево, даёте отрицательный отступ. Сносите всё остальное влево, теперь оно поверх картинки. Ставите внутренний отступ равный ширине картинки, всё, профит. Задача решена.
*

mrsatanclaus

  • Осваиваюсь на форуме
  • 25
  • 0 / 0
Re: introtext
« Ответ #25 : 22.05.2012, 14:05:04 »
http://s14.directupload.net/file/d/2898/ghaxjq9y_jpg.htm вот что получилось, но нужно чтоб весь текст бил справа от изображения, как?
*

mrsatanclaus

  • Осваиваюсь на форуме
  • 25
  • 0 / 0
Re: introtext
« Ответ #26 : 22.05.2012, 14:06:26 »
если можно то пример CSS, или чего там нужно, а то не совсем понятно
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Re: introtext
« Ответ #27 : 22.05.2012, 14:09:31 »
Цитировать
Сносите картинку влево, даёте отрицательный отступ. Сносите всё остальное влево, теперь оно поверх картинки. Ставите внутренний отступ равный ширине картинки, всё, профит. Задача решена.
Код: css
/*картинки*/
.huyegoznaetkakoy-toklass {float:left; width:200px; margin-right:-200px;}
/*все остальные элементы*/
.kakoy-todrugoyklass {float:left; padding-left:200px;}
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Re: introtext
« Ответ #28 : 22.05.2012, 14:16:13 »
Так, ща ещё более подробно попробую объяснить...
Допустим мы уже добились вот такой разметки:
Код: html4strict
<div class="blog-item">
<a class="blog_img" href="img.jpg">
<img src ="img_thumb.jpg" />
</a>
<div class="blog_right">
<div class="blog_text">
тут все наши элементы, типа даты, заголовка, текста...
</div>
</div>
</div>
тогда стили будут:
Код: css
.blog-item {float:left; width:100%;}
.blog_img,
.blog_img img {float:left; width:200px; display:block;}
.blog_img {margin-right:-200px;}
.blog_right {float:left; width:100%;}
.blog_text {padding-left:200px;}
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Re: introtext
« Ответ #29 : 22.05.2012, 14:16:56 »
Фактически не объяснил, а написал за вас. Пользуйтесь. ^-^
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться