Новости 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 Гость просматривают эту тему.
  • 16 Ответов
  • 15414 Просмотров
*

49volro

  • Осваиваюсь на форуме
  • 12
  • 0 / 0
Как сделать чтобы кнопка "подробнее" появлялась и в архивных материалах? В обычных статьях всё работает.
« Последнее редактирование: 31.03.2014, 11:50:43 от b2z »
*

adamsage

  • Новичок
  • 3
  • 0 / 0
Re: Архивные материалы без "подробнее"
« Ответ #1 : 06.09.2013, 10:54:17 »
Точно такая же проблема, ещё   и картинки материала у меня не отображаются,  ни кто не ответил я решения не нашел!
*

49volro

  • Осваиваюсь на форуме
  • 12
  • 0 / 0
Re: Архивные материалы без "подробнее"
« Ответ #2 : 29.09.2013, 21:25:41 »
Всё ещё актуально.
*

DimonSX

  • Осваиваюсь на форуме
  • 16
  • 0 / 0
Re: Архивные материалы без "подробнее"
« Ответ #3 : 31.03.2014, 03:32:54 »
Доброго времени...!
- вопрос даже не сдвинулся с точки... (
перерыл много статей, так и не нашел ответа на вопрос...
кто-то смог решить сей вопрос...?!
- вопрос еще актуален...
нам кто-нибудь может помочь с таким вопросом...?!
*

Grigory S.

  • Давно я тут
  • 658
  • 70 / 0
  • (с)
Re: Архивные материалы без "подробнее"
« Ответ #4 : 31.03.2014, 11:12:48 »
1) Копируем файл components/com_content/views/archive/tmpl/default_items.php в Ваш шаблон по пути templates/ВАШ_ШАБЛОН/html/com_content/archive/ (или редактируем если он уже там есть)
2) Открываем default_items.php
3) В нужном месте внутри цикла foreach вставляем код:
Код
<p class="readmore">
        <a class="btn" href="<?php echo JRoute::_(ContentHelperRoute::getArticleRoute($item->slug, $item->catslug)); ?>">
            <?php echo JText::_('COM_CONTENT_READ_MORE'); ?>
            <span class="icon-chevron-right"></span>
        </a>
    </p>
Не задав правильный вопрос, невозможно получить правильный ответ.
Для "спасибок" существует кнопочка "+".
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
Re: Архивные материалы с "подробнее"
« Ответ #5 : 31.03.2014, 11:48:59 »
Почти так. Если брать совсем правильно (с учетом настроек), то код должен быть таким:

Код: php
<?php if ($params->get('show_readmore') && $item->readmore) :
if ($item->params->get('access-view')) :
$link = JRoute::_(ContentHelperRoute::getArticleRoute($item->slug, $item->catslug));
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($item->slug, $item->catslug));
$link = new JUri($link1);
$link->setVar('return', base64_encode($returnURL));
endif; ?>

<p class="readmore"><a class="btn" href="<?php echo $link; ?>"> <span class="icon-chevron-right"></span>

<?php if (!$item->params->get('access-view')) :
echo JText::_('COM_CONTENT_REGISTER_TO_READ_MORE');
elseif ($readmore = $item->alternative_readmore) :
echo $readmore;
if ($params->get('show_readmore_title', 0)!= 0) :
echo JHtml::_('string.truncate', ($item->title), $params->get('readmore_limit'));
endif;
elseif ($params->get('show_readmore_title', 0) == 0) :
echo JText::sprintf('COM_CONTENT_READ_MORE_TITLE');
else :
echo JText::_('COM_CONTENT_READ_MORE');
echo JHtml::_('string.truncate', ($item->title), $params->get('readmore_limit'));
endif; ?>

</a></p>

<?php endif; ?>

По логике вставить его нужно после:
Код: php
<?php if ($params->get('show_intro')) :?>
<div class="intro"> <?php echo JHtml::_('string.truncateComplex', $item->introtext, $params->get('introtext_limit')); ?> </div>
<?php endif; ?>
*

Grigory S.

  • Давно я тут
  • 658
  • 70 / 0
  • (с)
Re: Архивные материалы с "подробнее"
« Ответ #6 : 31.03.2014, 11:57:23 »
Ну я так сказать упростил, не учитывая настроек :)
Не задав правильный вопрос, невозможно получить правильный ответ.
Для "спасибок" существует кнопочка "+".
*

DimonSX

  • Осваиваюсь на форуме
  • 16
  • 0 / 0
Re: Архивные материалы с "подробнее"
« Ответ #7 : 31.03.2014, 17:35:57 »
- так и думал что нужно править...

Огромное Вам - СПАСИБО...!  *DRINK*
*

DimonSX

  • Осваиваюсь на форуме
  • 16
  • 0 / 0
Re: Архивные материалы с "подробнее"
« Ответ #8 : 01.04.2014, 00:40:40 »
ох уж этот код...)))
описываю метод бездействия и не понятия что с ним делать...

1 - вставляю код в components/com_content/views/archive/tmpl/default_items.php - по методу "после кода по логике"
в стандартных шаблонах все хорошо, все замечательно... за что Огромное спасибо, что показали...

2 - но как только вставляю код или оба кода в файл templates/ВАШ_ШАБЛОН/html/com_content/archive/default_items.php
- выдает ошибки, в зависимости от того куда вставить код:
в одном случае: Parse error: syntax error, unexpected '<' in
в другом случае: Fatal error: Call to a member function get() on a non-object in

2.1. файл в шаблоне такой уже имелся - кода "по логике", куда нужно вставить в шаблонном не обнаружено...
      если копировать и заменить файл из первого варианта, то вся графика или стили - все, все становится наперекосяк...

3. Шаблон использовал от Артиста-4, который сам же и слепил...
-----------------------------------------------------------------------

Помогите пожалуйста, что нужно сделать для быстрого решения данной проблемы, что посоветуете...?!
- не совсем понимаю эти ошибки, не силен в языках кода...

*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
Re: Архивные материалы с "подробнее"
« Ответ #9 : 01.04.2014, 10:15:15 »
Ну наш вариант работает только для стандартного макета Joomla. Все эти артистер штучки, это что-то с чем-то...
*

DimonSX

  • Осваиваюсь на форуме
  • 16
  • 0 / 0
Re: Архивные материалы с "подробнее"
« Ответ #10 : 01.04.2014, 21:09:04 »
Да не вызывало как-то проблем, конечно поправка там нужна, но она не вызывала столь чудного напряга... Мне не известны другие программки, а самостоятельно не в силах по знаниям сделать, а в ней разметку+графику как тебе нужно выстроил, помочь и подсказать по CMS тоже некому...

- теперь по теме, сижу вот уже сутки - сравнивая и ковыряя код...

вот то что предлагал kamaz6141, вполне даже работает, но только кнопка снизу или сверху получается,
- никак она не хочет в текст перемещаться... (
 
1) Копируем файл components/com_content/views/archive/tmpl/default_items.php в Ваш шаблон по пути templates/ВАШ_ШАБЛОН/html/com_content/archive/ (или редактируем если он уже там есть)
2) Открываем default_items.php
3) В нужном месте внутри цикла foreach вставляем код:
Код
<p class="readmore">
        <a class="btn" href="<?php echo JRoute::_(ContentHelperRoute::getArticleRoute($item->slug, $item->catslug)); ?>">
            <?php echo JText::_('COM_CONTENT_READ_MORE'); ?>
            <span class="icon-chevron-right"></span>
        </a>
    </p>

- то что для стандартного шаблона код, он выдает ошибку... вынул код похожий из файла шаблона listitem.php
сделал по теме шаблонного кода, получилось вот что:
но - выдает ошибку Parse error: syntax error, unexpected T_STRING in в строке, которую пометил пунктиром...

Спойлер
[свернуть]

- Можно ли из этого как-то изменить ситуацию?!
-Есть ли какие либо другие альтернативы или совет подарите хотя бы...  :(
*

Grigory S.

  • Давно я тут
  • 658
  • 70 / 0
  • (с)
Re: Архивные материалы с "подробнее"
« Ответ #11 : 01.04.2014, 21:17:42 »
Ну прям в текст вряд-ли получится, вставьте сразу после
Код: php
<?php if ($params->get('show_intro')) :?>
<div class="intro"> <?php echo JHtml::_('string.truncateComplex', $item->introtext, $params->get('introtext_limit')); ?> </div>
<?php endif; ?>
« Последнее редактирование: 01.04.2014, 21:23:57 от kamaz6141 »
Не задав правильный вопрос, невозможно получить правильный ответ.
Для "спасибок" существует кнопочка "+".
*

DimonSX

  • Осваиваюсь на форуме
  • 16
  • 0 / 0
Re: Архивные материалы с "подробнее"
« Ответ #12 : 01.04.2014, 21:27:25 »
пробовал, да и у меня как писал уже нет такого кода, а если его прописывать то ошибка...
с этим кодом в идеале со стандартным шаблоном, но увы у меня от артиста...
*

Grigory S.

  • Давно я тут
  • 658
  • 70 / 0
  • (с)
Re: Архивные материалы с "подробнее"
« Ответ #13 : 01.04.2014, 21:32:42 »
А покажите-ка весь код...а хотя почему-бы не оставить кнопку внизу, раз работает? Не думаю что в тексте между предложениями ей место...
Не задав правильный вопрос, невозможно получить правильный ответ.
Для "спасибок" существует кнопочка "+".
*

DimonSX

  • Осваиваюсь на форуме
  • 16
  • 0 / 0
Re: Архивные материалы с "подробнее"
« Ответ #14 : 01.04.2014, 21:39:34 »
внизу оставить я тоже был бы не против но получается будет между блогами...

вот весь код с рабочей кнопкой снизу:

Код: php
<?php
defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers');

require_once dirname(dirname(dirname(dirname(__FILE__)))). DIRECTORY_SEPARATOR . 'functions.php';

Artx::load("Artx_Content");

$component = new ArtxContent($this, $this->params);
?>
<ul id="archive-items">
<?php foreach ($this->items as $i => $item) : ?>
    <li class="row<?php echo $i % 2; ?>">
<?php
$article = $component->article('archive', $item, $this->params);
$params = $article->getArticleViewParameters();
if (strlen($article->title)) {
    $params['header-text'] = $this->escape($article->title);
    if (strlen($article->titleLink))
        $params['header-link'] = $article->titleLink;
}
// Change the order of ""if"" statements to change the order of article metadata header items.
if (strlen($article->created))
    $params['metadata-header-icons'][] = "<span class=\"art-postdateicon\">" . $article->createdDateInfo($article->created). "</span>";
if (strlen($article->modified))
    $params['metadata-header-icons'][] = "<span class=\"art-postdateicon\">" . $article->modifiedDateInfo($article->modified). "</span>";
if (strlen($article->published))
    $params['metadata-header-icons'][] = "<span class=\"art-postdateicon\">" . $article->publishedDateInfo($article->published). "</span>";
if (strlen($article->author))
    $params['metadata-header-icons'][] = "<span class=\"art-postauthoricon\">" . $article->authorInfo($article->author, $article->authorLink). "</span>";
if (strlen($article->hits))
    $params['metadata-header-icons'][] = $article->hitsInfo($article->hits);
// Build article content
$content = '';
if (strlen($article->intro))
    $content .= $article->intro($article->intro);
$params['content'] = $content;
// Change the order of ""if"" statements to change the order of article metadata footer items.
if (strlen($article->category))
    $params['metadata-footer-icons'][] = "<span class=\"art-postcategoryicon\">"
        . $article->categories($article->parentCategory, $article->parentCategoryLink, $article->category, $article->categoryLink)
        . "</span>";

// Render article
echo $article->article($params);
?>
    </li>
<?php endforeach; ?>
</ul>

<p class="readmore">
        <a class="readon art-button" href="<?php echo JRoute::_(ContentHelperRoute::getArticleRoute($item->slug, $item->catslug)); ?>">
            <?php echo JText::_('COM_CONTENT_READ_MORE'); ?>
            <span class="icon-chevron-right"></span>
        </a>
    </p>

<div class="pagination">
    <p class="counter">
        <?php echo $this->pagination->getPagesCounter(); ?>
    </p>
    <?php echo $this->pagination->getPagesLinks(); ?>
</div>
*

Grigory S.

  • Давно я тут
  • 658
  • 70 / 0
  • (с)
Re: Архивные материалы с "подробнее"
« Ответ #15 : 01.04.2014, 21:43:50 »
Так Вы в цикл вставьте, перед
Код: php
<?php endforeach; ?>
Не задав правильный вопрос, невозможно получить правильный ответ.
Для "спасибок" существует кнопочка "+".
*

DimonSX

  • Осваиваюсь на форуме
  • 16
  • 0 / 0
Re: Архивные материалы с "подробнее"
« Ответ #16 : 01.04.2014, 21:50:43 »
</li>
т.е. в этом промежутке...?!
<?php endforeach; ?>

так пробовал без изменений...
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться