Новости Joomla

Свои типы полей в 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 для атрибута addfieldprefixnamespace 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 #разработка

Обновлена информация в Плане развития Joomla

👩‍💻 Обновлена информация в Плане развития Joomla.Здесь собрана информация о датах релизов, описаны принципы версионирования, указаны ответственные за релизы, а так же даты окончания поддержки релизов. Опираясь на эту информацию вы можете планировать развитие ваших интернет-проектов.👩‍💻 Что нового?⛔️ Joomla 4.Дата окончания исправления ошибок безопасности в версии 4.x - 14 октября 2025г. ⚠️ После этой даты Joomla 4 прекратит получать какие-либо обновления, в том числе безопасности - вообще. Рекомендуем обновить ваши сайты до актуальной Joomla 5.✅ Joomla 5.- Дата окончания исправления ошибок в версии 5.x - 13 октября 2026г.- Дата окончания исправления ошибок безопасности в версии 5.x - 12 октября 2027 года.- Текущая актуальная (на момент написания заметки) версия - 5.3.1.- Опубликовано расписание выхода релизов Joomla 5.4. Стабильный релиз ожидается 14 октября 2025 года.✅ Joomla 6.- Дата окончания исправления ошибок в версии 6.x - 17 октября 2028г.- Дата окончания исправления ошибок безопасности в версии 6.x - 16 октября 2029г.- Опубликовано расписание выхода релизов Joomla 6.0. Стабильный релиз ожидается 14 октября 2025 года.- Для разработчиков уже доступна Joomla 6.0.0-alpha1.✅ Joomla! Framework.Обновлена информация о Joomla! Framework - полноценном PHP-фреймворке для разработки. Он в версиях 1.х и 2.х был самостоятельным параллельным проектом, однако начиная с версии Joomla 4.0 стал её основой. Добавлена информация о Joomla! Framework 3.x, который вышел 6 октября 2023 года. Его можно использовать в тех случаях, когда вам в проекте не нужна CMS Joomla целиком.Подробнее на сайте Joomla-сообщества Joomlaportal.ru#joomla #community

Компания JetBrains рассказала о своей поддержке Joomla

Компания JetBrains рассказала о своей поддержке Joomla

JetBrains - один из мировых лидеров в разработке программного обеспечения для разработчиков. Её программные продукты - это IDE - профессиональные среды разработки, которые отличаются от простого блокнота/редактора с плагинами набором всевозможных инструментов для разработчиков, глубоким анализом кодовой базы, подсказками по ней и по языку программирования, отладкой ошибок и многим-многим другим. Одним из самых известных продуктов компании является IDE PHP Storm, который можно назвать отраслевым стандартом PHP-разработчика.

В статье How PhpStorm Helps Maintain PHP Open-Source Projects: Interviews and Real-World Examples в блоге компании описываются Open Source проекты, которым JetBrains оказывает поддержку (это могут быть бесплатные лицензии для разработчиков для некоммерческих проектов).

В список попали:

  • PHPUnit - фреймворк для unit-тестирования в PHP
  • Doctrine DBAL - библиотека для PHP, которая предоставляет лёгкий и гибкий слой для коммуникации с базой данных. Она поддерживает различные базы данных через единый и согласованный API.
  • CodeIgniter — популярный MVC-фреймворк для разработки на PHP
  • Joomla! - наша любимая CMS.

Эти названия (кроме "Joomla") чаще всего не слышат вебмастера и разработчики обычных сайтов и интернет-магазинов. Но эти названия хорошо знакомы PHP-разработчикам, которые создают сложные и высоконагруженные проекты и микросервисы. То, что Joomla оказалась в одном ряду с такими программными инструментами - делает ей честь.

🙏 За ссылку спасибо участнику нашего сообщества Ринату Кажетову (@rkazhet).

Подпишитесь на @joomlafeed

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

Damarkuzz

  • Захожу иногда
  • 116
  • 1 / 0
Здравствуйте!
Есть модуль https://www.sakic.net/products/ajax-search/, который представлен формой ajax-поиска, основанного на структуре com_search. Подскажите, как изменить файлы модуля (прикрепляю в спойлеры), чтобы поиск вёлся через com_finder (Умный поиск).

mod_ajaxsearch.php
Код
<?php

defined('_JEXEC') or die;

require_once __DIR__ . '/helper.php';

$lang = JFactory::getLanguage();
$app = JFactory::getApplication();
$config = JFactory::getConfig();
$doc = JFactory::getDocument();

if ($params->get('opensearch', 1))
{
$ostitle = $params->get('opensearch_title', JText::_('MOD_AJAXSEARCH_SEARCHBUTTON_TEXT'). ' ' . $app->getCfg('sitename'));
$doc->addHeadLink(
JUri::getInstance()->toString(array('scheme', 'host', 'port'))
. JRoute::_('&option=com_search&format=opensearch'), 'search', 'rel',
array(
'title' => htmlspecialchars($ostitle),
'type' => 'application/opensearchdescription+xml'
)
);
}

$upper_limit = $lang->getUpperLimitSearchWord();
$lower_limit = $lang->getLowerLimitSearchWord();
$button = $params->get('button', 0);
$button_text = htmlspecialchars($params->get('button_text', JText::_('MOD_AJAXSEARCH_SEARCHBUTTON_TEXT')));
$width = (int) $params->get('width');
$maxlength = $upper_limit;
$text = htmlspecialchars($params->get('text', JText::_('MOD_AJAXSEARCH_SEARCHBOX_TEXT')));
$label = htmlspecialchars($params->get('label', JText::_('MOD_AJAXSEARCH_LABEL_TEXT')));
$max_results = (int) $params->get('max_results', 5);
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx'));
$pagination_limit = $config->get('list_limit');
$mitemid = 0;
if ($params->get('find_itemid')) {
$mitemid = ModAjaxSearchHelper::getItemid();
}
$include_css = (int) $params->get('include_css', 1);

require JModuleHelper::getLayoutPath('mod_ajaxsearch', $params->get('layout', 'default'));


helper.php
Код
<?php

defined('_JEXEC') or die;

/**
 * Helper for mod_ajaxsearch
 */
class ModAjaxSearchHelper
{
/**
* Find Itemid considering language priority
*/
public static function getItemid()
{
$lang = JFactory::getLanguage();
$lang_tag = $lang->getTag();

$db = JFactory::getDbo();
$query = $db->getQuery(true);

$query->select('id')->from('#__menu')->where('link LIKE '.$db->q('index.php?option=com_search&view=search%').' AND (language='.$db->q($lang_tag).' OR language='.$db->q('*').') AND published=1 ORDER BY language DESC');
$db->setQuery($query);
//die($query);
$Itemid = $db->loadResult();

return $Itemid;
}
}

tmpl/default.php
Код
<?php

defined('_JEXEC') or die;


// Include module's assets
if ($include_css) {
JHtml::_('stylesheet', 'modules/mod_ajaxsearch/assets/css/style.css');
}
JHtml::_('script', 'modules/mod_ajaxsearch/assets/js/script.js');

if ($width)
{
$moduleclass_sfx .= ' ' . 'mod_ajaxsearch' . $module->id;
$css = 'div.mod_ajaxsearch' . $module->id . ' input[type="search"]{ width:auto; }';
$doc->addStyleDeclaration($css);
$width = ' size="' . $width . '"';
} else {
$width = '';
}

$input = $app->input;
if ($input->get('searchword', '', 'string')!='') {
$text = $input->get('searchword', '', 'string');
$text = htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
}

// js settings
$js = '
var asoptions = {
lower_limit: '.$lower_limit.',
max_results: '.$max_results.'
};
var asstrings = {
show_all: "'.JText::_('MOD_AJAXSEARCH_SHOW_ALL').'"
};
';
$doc->addScriptDeclaration($js);

$action_url = 'index.php?option=com_search&view=search';
if ($mitemid) {
$action_url .= '&Itemid='.$mitemid;
}

?>
<div class="ajax-search<?php echo $moduleclass_sfx ?>">
<form id="mod-ajaxsearch-form" action="<?php echo JRoute::_($action_url);?>" method="post" class="form-inline">
<div class="btn-toolbar">
<div class="btn-group pull-left">
<input type="search" name="searchword" id="mod-ajaxsearch-searchword" placeholder="<?php echo $label; ?>"<?php echo $width; ?> maxlength="<?php echo $maxlength; ?>" class="inputbox" value="<?php echo $text; ?>" autocomplete="off" onblur="if (this.value=='') this.value='<?php echo $text; ?>';" onfocus="if (this.value=='<?php echo $text; ?>') this.value='';" />
</div>
<?php if ($button) : ?>
<div class="btn-group pull-left hidden-phone">
<button name="Search" onclick="this.form.submit()" class="btn hasTooltip" title="<?php echo JHtml::tooltipText($button_text);?>"><span class="icon-search"></span></button>
</div>
<?php endif; ?>
<div class="clearfix"></div>
</div>
<div id="mod-ajaxsearch-results-box" class="results-box"></div>
<input type="hidden" name="task" value="search" />
<input type="hidden" name="limit" value="<?php echo $pagination_limit; ?>" />
</form>
</div>

assets/js/script.js
Код
jQuery(document).ready(function($) {
    $('#mod-ajaxsearch-form').on('submit', function(e) {
        e.preventDefault()
    });
    var asxhr;
    $('#mod-ajaxsearch-searchword').on('keyup', function(e) {
        var el = $(this);
        var search_string = el.val();
        if (search_string !== '' && search_string.length >= asoptions.lower_limit) {
            if (asxhr && asxhr.readyState != 4) {
                asxhr.abort()
            }
            asxhr = $.ajax({
                beforeSend: function() {
                    el.addClass('loading')
                },
                url: $('#mod-ajaxsearch-form').attr('action'),
                data: {
                    type: 'raw',
                    option: 'com_search',
                    searchword: search_string,
                    limit: asoptions.max_results,
                    tmpl: 'component'
                },
                cache: false,
                complete: function() {
                    el.removeClass('loading')
                },
                success: function(response) {
                    var container = $('#mod-ajaxsearch-results-box');
                    if ($(response).find('.search-results').html()) {
                        container.html($(response).find('.search-results'));
                        container.append('<div class="mod-ajaxsearch-results-footer"><a href="javascript: void(0);" onclick="document.getElementById(\'mod-ajaxsearch-form\').submit();">' + asstrings.show_all + '</a></div>')
                    } else {
                        container.html('')
                    }
                },
                dataType: 'html'
            })
        } else {
            $('#mod-ajaxsearch-results-box').html('')
        }
        return false
    });
    $(document).on('click', function(e) {
        var container = $('#mod-ajaxsearch-results-box');
        if (!container.is(e.target) && container.has(e.target).length === 0) {
            container.html('')
        }
    })
});
*

draff

  • Гуру
  • 5801
  • 434 / 7
  • ищу работу
assets/js/script.js
Код
option: 'com_search',
на
Код
option: 'com_finder',
Пробовали ?
*

Damarkuzz

  • Захожу иногда
  • 116
  • 1 / 0
assets/js/script.js
Код
option: 'com_search',
на
Код
option: 'com_finder',
Пробовали ?

Здравствуйте, спасибо за ответ. Да, пробовал, при замене на упомянутое поиск ломается.
Ещё в /tmpl/default.php менял:
Код
$action_url = 'index.php?option=com_search&view=search';
на
Код
$action_url = 'index.php?option=com_finder&view=search';


И в  mod_ajaxsearch.php менял
Код
. JRoute::_('&option=com_search&format=opensearch'), 'search', 'rel',
на
Код
. JRoute::_('&option=com_finder&format=opensearch'), 'search', 'rel',

С учетом данных манипуляций ajax-поиск не работает, но если в файлах модуля поменять name и id у ajax-формы на name="q" и id="q" и заменить везде id="mod-ajaxsearch-searchword" на id="q" - то при нажатии на кнопку Enter в форме ajax-поиска, то выполняется поиск через умный поиск после перехода на страницу результатов Умного поиска (с подставкой искомого на предыдущей странице ключа поиска)
« Последнее редактирование: 17.06.2021, 14:07:13 от Damarkuzz »
*

Damarkuzz

  • Захожу иногда
  • 116
  • 1 / 0
В последнем ответе немного ошибся, отредактировал
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Вывести модуль в модуле

Автор jimka

Ответов: 2
Просмотров: 619
Последний ответ 18.04.2025, 15:39:36
от fbr
Дублируются дивы у модуля mod_custom

Автор timofe

Ответов: 0
Просмотров: 644
Последний ответ 07.09.2024, 13:19:48
от timofe
Вывод содержимого модуля mod_custom без html разметки

Автор goga_pgasovav

Ответов: 3
Просмотров: 988
Последний ответ 07.06.2024, 11:15:50
от goga_pgasovav
Как сделать картинку ссылкой на материал без Вводного изображения?

Автор OZlaim

Ответов: 0
Просмотров: 782
Последний ответ 30.05.2024, 01:28:37
от OZlaim
Как вставить модуль в код нужной страницы php?

Автор zvi

Ответов: 9
Просмотров: 4664
Последний ответ 21.02.2024, 11:03:08
от saynez