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

pharaoh

  • Захожу иногда
  • 426
  • 53 / 0
vasya63, конкретнее - только готовый код.
К сожалению, у меня готового кода нет.
Вообще достаточно легкая задача для начинающего в php ;)
*

vasya63

  • Новичок
  • 5
  • 0 / 0
Помогите если е сложно, никак не получается
Вот код файла плагина разрыва страниц

Код
/**
 * @package     Joomla.Plugin
 * @subpackage  Content.pagebreak
 *
 * @copyright   Copyright (C) 2005 - 2014 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

jimport('joomla.utilities.utility');

/**
 * Page break plugin
 *
 * <b>Usage:</b>
 * <code><hr class="system-pagebreak" /></code>
 * <code><hr class="system-pagebreak" title="The page title" /></code>
 * or
 * <code><hr class="system-pagebreak" alt="The first page" /></code>
 * or
 * <code><hr class="system-pagebreak" title="The page title" alt="The first page" /></code>
 * or
 * <code><hr class="system-pagebreak" alt="The first page" title="The page title" /></code>
 *
 * @package     Joomla.Plugin
 * @subpackage  Content.pagebreak
 * @since       1.6
 */
class PlgContentPagebreak extends JPlugin
{
/**
* Load the language file on instantiation.
*
* @var    boolean
* @since  3.1
*/
protected $autoloadLanguage = true;

/**
* Plugin that adds a pagebreak into the text and truncates text at that point
*
* @param   string   $context  The context of the content being passed to the plugin.
* @param   object   &$row     The article object.  Note $article->text is also available
* @param   mixed    &$params  The article params
* @param   integer  $page     The 'page' number
*
* @return  mixed  Always returns void or true
*
* @since   1.6
*/
public function onContentPrepare($context, &$row, &$params, $page = 0)
{
$canProceed = $context == 'com_content.article';

if (!$canProceed)
{
return;
}

$style = $this->params->get('style', 'pages');

// Expression to search for.
$regex = '#<hr(.*)class="system-pagebreak"(.*)\/>#iU';

$input = JFactory::getApplication()->input;

$print = $input->getBool('print');
$showall = $input->getBool('showall');

if (!$this->params->get('enabled', 1))
{
$print = true;
}

if ($print)
{
$row->text = preg_replace($regex, '<br />', $row->text);

return true;
}

// Simple performance check to determine whether bot should process further.
if (JString::strpos($row->text, 'class="system-pagebreak') === false)
{
return true;
}

$view = $input->getString('view');
$full = $input->getBool('fullview');

if (!$page)
{
$page = 0;
}

if ($params->get('intro_only') || $params->get('popup') || $full || $view != 'article')
{
$row->text = preg_replace($regex, '', $row->text);

return;
}

// Find all instances of plugin and put in $matches.
$matches = array();
preg_match_all($regex, $row->text, $matches, PREG_SET_ORDER);

if (($showall && $this->params->get('showall', 1)))
{
$hasToc = $this->params->get('multipage_toc', 1);

if ($hasToc)
{
// Display TOC.
$page = 1;
$this->_createToc($row, $matches, $page);
}
else
{
$row->toc = '';
}

$row->text = preg_replace($regex, '<br />', $row->text);

return true;
}

// Split the text around the plugin.
$text = preg_split($regex, $row->text);

// Count the number of pages.
$n = count($text);

// We have found at least one plugin, therefore at least 2 pages.
if ($n > 1)
{
$title = $this->params->get('title', 1);
$hasToc = $this->params->get('multipage_toc', 1);

// Adds heading or title to <site> Title.
if ($title)
{
if ($page)
{
if ($page && @$matches[$page - 1][2])
{
$attrs = JUtility::parseAttributes($matches[$page - 1][1]);

if (@$attrs['title'])
{
$row->page_title = $attrs['title'];
}
}
}
}

// Reset the text, we already hold it in the $text array.
$row->text = '';

if ($style == 'pages')
{
// Display TOC.
if ($hasToc)
{
$this->_createToc($row, $matches, $page);
}
else
{
$row->toc = '';
}

// Traditional mos page navigation
$pageNav = new JPagination($n, $page, 1);

// Page counter.
$row->text .= '<div class="pagenavcounter">';
$row->text .= $pageNav->getPagesCounter();
$row->text .= '</div>';

// Page text.
$text[$page] = str_replace('<hr id="system-readmore" />', '', $text[$page]);
$row->text .= $text[$page];

// $row->text .= '<br />';
$row->text .= '<div class="pager">';

// Adds navigation between pages to bottom of text.
if ($hasToc)
{
$this->_createNavigation($row, $page, $n);
}

// Page links shown at bottom of page if TOC disabled.
if (!$hasToc)
{
$row->text .= $pageNav->getPagesLinks();
}

$row->text .= '</div>';
}
else
{
$t[] = $text[0];

$t[] = (string) JHtml::_($style . '.start', 'article' . $row->id . '-' . $style);

foreach ($text as $key => $subtext)
{
if ($key >= 1)
{
$match = $matches[$key - 1];
$match = (array) JUtility::parseAttributes($match[0]);

if (isset($match['alt']))
{
$title = stripslashes($match['alt']);
}
elseif (isset($match['title']))
{
$title = stripslashes($match['title']);
}
else
{
$title = JText::sprintf('PLG_CONTENT_PAGEBREAK_PAGE_NUM', $key + 1);
}

$t[] = (string) JHtml::_($style . '.panel', $title, 'article' . $row->id . '-' . $style . $key);
}

$t[] = (string) $subtext;
}

$t[] = (string) JHtml::_($style . '.end');

$row->text = implode(' ', $t);
}
}

return true;
}

/**
* Creates a Table of Contents for the pagebreak
*
* @param   object   &$row      The article object.  Note $article->text is also available
* @param   array    &$matches  Array of matches of a regex in onContentPrepare
* @param   integer  &$page     The 'page' number
*
* @return  void
*
* @since  1.6
*/
protected function _createTOC(&$row, &$matches, &$page)
{
$heading = isset($row->title)? $row->title : JText::_('PLG_CONTENT_PAGEBREAK_NO_TITLE');
$input = JFactory::getApplication()->input;
$limitstart = $input->getUInt('limitstart', 0);
$showall = $input->getInt('showall', 0);

// TOC header.
$row->toc = '<div class="pull-right article-index">';

if ($this->params->get('article_index') == 1)
{
$headingtext = JText::_('PLG_CONTENT_PAGEBREAK_ARTICLE_INDEX');

if ($this->params->get('article_index_text'))
{
htmlspecialchars($headingtext = $this->params->get('article_index_text'));
}

$row->toc .= '<h3>' . $headingtext . '</h3>';
}

// TOC first Page link.
$class = ($limitstart === 0 && $showall === 0)? 'toclink active' : 'toclink';
$row->toc .= '<ul class="nav nav-tabs nav-stacked">
<li class="' . $class . '">

<a href="' . JRoute::_(ContentHelperRoute::getArticleRoute($row->slug, $row->catid). '&showall=&limitstart='). '" class="' . $class . '">'
. $heading .
'</a>

</li>
';

$i = 2;

foreach ($matches as $bot)
{
$link = JRoute::_(ContentHelperRoute::getArticleRoute($row->slug, $row->catid). '&showall=&limitstart=' . ($i - 1));

if (@$bot[0])
{
$attrs2 = JUtility::parseAttributes($bot[0]);

if (@$attrs2['alt'])
{
$title = stripslashes($attrs2['alt']);
}
elseif (@$attrs2['title'])
{
$title = stripslashes($attrs2['title']);
}
else
{
$title = JText::sprintf('PLG_CONTENT_PAGEBREAK_PAGE_NUM', $i);
}
}
else
{
$title = JText::sprintf('PLG_CONTENT_PAGEBREAK_PAGE_NUM', $i);
}

$class = ($limitstart == $i - 1)? 'toclink active' : 'toclink';
$row->toc .= '
<li>

<a href="' . $link . '" class="' . $class . '">'
. $title .
'</a>

</li>
';
$i++;
}

if ($this->params->get('showall'))
{
$link = JRoute::_(ContentHelperRoute::getArticleRoute($row->slug, $row->catid). '&showall=1&limitstart=');
$class = ($showall == 1)? 'toclink active' : 'toclink';
$row->toc .= '
<li>

<a href="' . $link . '" class="' . $class . '">'
. JText::_('PLG_CONTENT_PAGEBREAK_ALL_PAGES').
'</a>

</li>
';
}

$row->toc .= '</ul></div>';
}

/**
* Creates the navigation for the item
*
* @param   object  &$row  The article object.  Note $article->text is also available
* @param   int     $page  The total number of pages
* @param   int     $n     The page number
*
* @return  void
*
* @since   1.6
*/
protected function _createNavigation(&$row, $page, $n)
{
$pnSpace = '';

if (JText::_('JGLOBAL_LT') || JText::_('JGLOBAL_LT'))
{
$pnSpace = ' ';
}

if ($page < $n - 1)
{
$page_next = $page + 1;

$link_next = JRoute::_(ContentHelperRoute::getArticleRoute($row->slug, $row->catid). '&showall=&limitstart=' . ($page_next));

// Next >>
$next = '<a href="' . $link_next . '">' . JText::_('JNEXT'). $pnSpace . JText::_('JGLOBAL_GT'). JText::_('JGLOBAL_GT'). '</a>';
}
else
{
$next = JText::_('JNEXT');
}

if ($page > 0)
{
$page_prev = $page - 1 == 0 ? '' : $page - 1;

$link_prev = JRoute::_(ContentHelperRoute::getArticleRoute($row->slug, $row->catid). '&showall=&limitstart=' . ($page_prev));

// << Prev
$prev = '<a href="' . $link_prev . '">' . JText::_('JGLOBAL_LT'). JText::_('JGLOBAL_LT'). $pnSpace . JText::_('JPREV'). '</a>';
}
else
{
$prev = JText::_('JPREV');
}

$row->text .= '<ul><li>' . $prev . ' </li><li>' . $next . '</li></ul>';
}
}

*

pharaoh

  • Захожу иногда
  • 426
  • 53 / 0
vasya63, вы не сильны в php или не собираетесь изучать его в принципе?
Просто либо вы напишите нужный код с нашими подсказками, либо ищите исполнителя за рубли :)

Подсказка №1: за номер страницы отвечает GET параметр в url, который можно прочитать функцией JRequest::getVar('var',0)
*

vasya63

  • Новичок
  • 5
  • 0 / 0
Мда, мне сразу стало всё ясно как белый день ^-^
Я же сразу написал, что в php не шарю, поэтому и помощи попросил, а вы мне второй раз отвечаете в стиле "учи php".
Если можете помогите, вознаграждение за это хотите, я не против, готов оплатить.
*

pharaoh

  • Захожу иногда
  • 426
  • 53 / 0
Мда, мне сразу стало всё ясно как белый день ^-^
Я же сразу написал, что в php не шарю, поэтому и помощи попросил, а вы мне второй раз отвечаете в стиле "учи php".
Если можете помогите, вознаграждение за это хотите, я не против, готов оплатить.
Если вы пришли сюда не для того, чтобы учиться самому, то предлагаю вам продолжить поиски халявную рабочую силу.
А если вы готовы оплатить, тогда вообще проблем не вижу. Задача настолько примитивная, что любой Joomlaвод с ней справится.
*

voland

  • Легенда
  • 11028
  • 588 / 112
  • Эта строка съедает место на вашем мониторе
последние постов 8 какое отношение к теме имеют?!
*

Russya

  • Новичок
  • 5
  • 0 / 0
Здравствуйте. очень полезный плагин.
На главной странице стоят избранные материалы. Не подскажите, как поменять титл для главной страницы?
*

pharaoh

  • Захожу иногда
  • 426
  • 53 / 0
Для главной старницы title меняется через пункт меню.
*

olezhek

  • Осваиваюсь на форуме
  • 19
  • 0 / 0
Здравствуйте! Плагин замечательный по сути, но никак у меня не ставится на Joomla 3.3.6 Ставлю плагин, модуль, включаю, модуль публикую, заголовок модуля скрываю. И ничего не появляется в админке. Как быть? Где у меня может быть ошибка?
*

pharaoh

  • Захожу иногда
  • 426
  • 53 / 0
*

PAd1A

  • Новичок
  • 1
  • 0 / 0
Привет
После установки модуля пишет в нем "XML-данные модуля недоступны"
и папка на сервере mod_myextpagetitle называется а не mod_myextPagetitle
"p"маленькая, в старой версии большая была. переименование папки не спасает, права на фалы правильные.
В чем проблема может быть?
*

Benefactor

  • Захожу иногда
  • 154
  • 2 / 2
ТС, низкий Вам поклон! Бесценный плагин!
Немного не понял, зачем модуль?
p.s. Почему просто не добавить по умолчанию эту возможность в J2.5/3.x, ведь такая полезная штука!?
*

Miheich

  • Новичок
  • 3
  • 0 / 0
Спасибо за плагин! Но есть одна проблема, пожалуйста помогите ее решить: использую компонент mosets tree, так в нем на категориях работает все нормально а вот в материале этого компонента не отображается даже поле ввода title.  Как можно с этим разобраться?
*

Benefactor

  • Захожу иногда
  • 154
  • 2 / 2
Miheich, допиливать нужно, там по сути ничего сложного. ДУмаю, ТС за символическую плату без проблем сделает или кто-то другой. Правда ТС на связь не выходит и благодарности не принимает :)
*

Miheich

  • Новичок
  • 3
  • 0 / 0
Цитировать
Miheich, допиливать нужно, там по сути ничего сложного. ДУмаю, ТС за символическую плату без проблем сделает или кто-то другой. Правда ТС на связь не выходит и благодарности не принимает Azn
Я согласен с этим что допилить не проблема да и по деньгам разобрались бы. Весь вопрос в том кто же это сделает?!
*

Benefactor

  • Захожу иногда
  • 154
  • 2 / 2
Miheich, есть раздел платных услуг на этом форуме. Обратитесь туда.
*

pharaoh

  • Захожу иногда
  • 426
  • 53 / 0
Правда ТС на связь не выходит и благодарности не принимает :)
Почему-то не приходили уведомления о новых ответах.
С mostree вроде как разобрались, что наш плагин к нему совсем никакого отношения не имеет.
*

parmon

  • Новичок
  • 1
  • 0 / 0
Автору огромное спасибо!
*

rj45

  • Захожу иногда
  • 88
  • 1 / 0
Автору спасибо за решение!
Ставил на Joomla 2.5 все работает. Только не забываем отключать управление мета данными в sh404SEF. Также спасибо за наводку автору этого блога: http://master-site-promotion.ru/seo-and-joomla-2.5/решаем-проблему-одинаковых-title-и-h1-в-joomla-2-5.html
*

alexfairtex

  • Захожу иногда
  • 54
  • 0 / 0
Скажите, в архиве и модуль и плагин.
Плагин установил - работает - супер, огромное спасибо виликим умам!! :)
Скажите, а зачем модуль то?
« Последнее редактирование: 04.08.2015, 17:51:56 от alexfairtex »
*

pharaoh

  • Захожу иногда
  • 426
  • 53 / 0
alexfairtex,
На сайте в инструкции по установке указано "Если включено кеширование, то опубликовать модуль на любой видимой позиции".
Т.е. при включенном кешировании плагин сам по себе работать не будет, т.к. события плагинов, которые бы могли подменять тайтл, при кешировании не обрабатываются.
*

alexfairtex

  • Захожу иногда
  • 54
  • 0 / 0
все работает, разобраться очень легко даже начинающему - огрномное спасибо! :D
*

eDOS

  • Новичок
  • 1
  • 0 / 0
Доброго дня всем.
Проблема с модулем, прошу помощи.
Модуль«mod_myextpagetitle» установлен, плагин тоже, версия Joomla 3.4.3, при заходе в модуль в Менеджер модулей пишет: XML-данные модуля недоступны
При установке из общего архива модуль и плагин распаковывались и устанавливались поодиночке.
Что делать, как заставить модуль работать?
*

admirus

  • Захожу иногда
  • 88
  • 0 / 0
версия Joomla 3.4.3, при заходе в модуль в Менеджер модулей пишет: XML-данные модуля недоступны
У меня та же проблема
*

pharaoh

  • Захожу иногда
  • 426
  • 53 / 0
Попробуйте скачать с сайта обновленную версию и переустановить поверх.
Но никаких опций там и нет
« Последнее редактирование: 16.10.2015, 08:12:24 от pharaoh »
*

W-Man

  • Новичок
  • 2
  • 0 / 0
Добрый. У меня Joomla 2.5.14.
Месяц назад нашел эту ветку - обрадовался, скачал плагин, установил, включил - появилось поле для ввода Page title.
Но изменения тайтла так и не происходит ни в старых, ни в новых статьях, он берется по-прежнему из заголовка.
Установка модуля на видимых полях (headerbar, innertop, logo и др.), включение/отключение кэша ничего не меняет.
Сегодня увидел, что появилась обновленная версия, скачал, установил - все та же картина маслом - тайтл не меняется...
В чем может быть проблема?
« Последнее редактирование: 30.10.2015, 16:28:20 от W-Man »
*

pharaoh

  • Захожу иногда
  • 426
  • 53 / 0
W-Man,
1. Тайтл сохраняется?
2. проверьте, что модуль действительно отрабатывает, например включите вывод заголовка
3. возможно у вас стоит еще какой-нибудь компонент для обработки тайтлов
*

W-Man

  • Новичок
  • 2
  • 0 / 0
1. Тайтл не сохраняется - поле пустое.
2. модуль не знаю отрабатывает ли, но заголовок его вижу.
3. "возможно стоит еще какой-нибудь компонент для обработки тайтлов" - где его искать в компонентах,  плагинах? Как он может обзываться?
*

pharaoh

  • Захожу иногда
  • 426
  • 53 / 0
W-Man,
Если тайтл не сохраняется, то и выводить ему нечего. Проблема на уровне сохранения. С Joomla 2.5 плагин успешно работает уже более 3 лет. Вероятно что-то у вас из внешних установок создает конфликт.
Мы можем посмотреть, если вы на почту поддержки пришлете бекап сайта (akeeba backup в формате zip)
*

globus812

  • Осваиваюсь на форуме
  • 24
  • 0 / 0
Плагин выдает ошибку при обновлении, т.к. в модуле указан неверный путь файла для обновлений

1. mod_myextPagetitle - сервер обновлений в Joomla! 3.4.5
http://myext.ru/updates/mod_myextPagetitle.xml

- по этому адресу выдает ошибку:
Not Found
The requested URL /updates/mod_myextPagetitle.xml was not found on this server.
Apache/2.4.10-1-beget-reuseport (Unix) Server at myext.eu Port 80

mod_myextpagetitle.xmll - имя файла в скачанном 9.11.2015 архиве mod_myextpagetitle.zip

2. myextPagetitleContent - сервер обновлений в Joomla! 3.4.5   
http://myext.eu/updates/plg_content_myextPagetitleContent.xml

myextPagetitleContent.xml - имя файла в скачанном 9.11.2015 архиве plg_content_myextPagetitleContent.zip

Попробуйте скачать с сайта обновленную версию и переустановить поверх.
Но никаких опций там и нет
« Последнее редактирование: 10.11.2015, 03:05:48 от globus812 »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Вывести поле изображение материала в модуле "Список материалов категории"

Автор aleksandrozz

Ответов: 12
Просмотров: 13072
Последний ответ 14.10.2022, 05:12:04
от denxio
Как добавить описание к пункту меню в Joomla 2.5? (Как у материалов)?

Автор nia

Ответов: 7
Просмотров: 5937
Последний ответ 29.03.2021, 12:10:26
от sivers
В моб версии не откриваються норм меню

Автор umsbeauty

Ответов: 0
Просмотров: 1476
Последний ответ 11.01.2021, 17:55:15
от umsbeauty
Убрать название пункта меню из URL материала

Автор fortuner

Ответов: 15
Просмотров: 8745
Последний ответ 31.10.2020, 00:46:04
от spas
Проблемка с правым меню

Автор V_V

Ответов: 3
Просмотров: 1708
Последний ответ 03.12.2019, 06:24:56
от Vovolsort