Новости Joomla

Вышел WT Quick links v.2.4.0 - релиз модуля для Joomla

Вышел WT Quick links v.2.4.0 - релиз модуля для Joomla.Это модуль-конструктор для быстрого создания набора элементов. Это могут быть ссылки на компоненты Joomla, пункт меню или пользовательская ссылка. Есть условия для исключений показа элементов списка. Вы можете создавать собственные макеты вывода модуля, создавая таким образом почти всё, что угодно: от простого списка ссылок до стены фотографий на главную страницу или ссылки-теги для перелинковки категорий интернет-магазина, список FAQ, табы или аккордеоны. Модуль позволяет выводить изображения, адаптивные изображения, видео, адаптивные видео.v.2.4.0. Что нового?Добавлена поддержка новых компонентов. Добавлены новые типы ссылок и исключений для них: - Phoca Download, - Phoca Gallery, - RadicalMart (@radicalmart).Joomla 6. Успешно протестирована работа модуля на Joomla 6-alpha2.РазработчикамПроведён большой рефакторинг кода. Для типов ссылок созданы классы-драйверы. Теперь для того, чтобы добавить новый тип ссылки в модуль достаточно скопировать класс-образец из
modules/mod_wt_quick_links/src/Driver/Collection и наполнить его данными по образцу, а так же добавить необходимые языковые константы в панели администратора Joomla.Модуль бесплатный. Страница расширенияGitHub расширенияJoomla Extensions Directory👩‍💻 Подпишись на @joomlafeed.#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

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

CityCat

  • Осваиваюсь на форуме
  • 40
  • 0 / 0
  • Алексей Voronov
Здравствуйте!

Помогите, пожалуйста.

Перешел на Joomla 3.9.3 c версии 2.5.28
Два модуля отдают ошибки и не отдают контент.

Warning: Invalid argument supplied for foreach() in C:\Os\OSPanel\domains\land\components\com_content\models\articles.php on line 587

Warning: Invalid argument supplied for foreach() in C:\Os\OSPanel\domains\land\modules\mod_pj_quickportfolio\helper.php on line 66
Warning: Invalid argument supplied for foreach() in C:\Os\OSPanel\domains\land\modules\mod_pj_quickportfolio\tmpl\default.php on line 206

Первый файл articles.php он вообще из дистрибутива один в один. Тут я вообще не понял прикол.

А вот во вторых двух такая конструкция:

helper.php

Код

// Retrieve Content
$items = $model->getItems();

foreach ($items as &$item) {
$item->readmore = (trim($item->fulltext)!= '');
$item->slug = $item->id.':'.$item->alias;
$item->catslug = $item->catid.':'.$item->category_alias;

if ($access || in_array($item->access, $authorised))
{
// We know that user has the privilege to view the article
$item->link = JRoute::_(ContentHelperRoute::getArticleRoute($item->slug, $item->catid));
$item->linkText = JText::_('MOD_ARTICLES_NEWS_READMORE');
}
else {
$item->link = JRoute::_('index.php?option=com_user&view=login');
$item->linkText = JText::_('MOD_ARTICLES_NEWS_READMORE_REGISTER');
}

$item->introtext = JHtml::_('content.prepare', $item->introtext);

//new
/*if (!$params->get('image')) {
$item->introtext = preg_replace('/<img[^>]*>/', '', $item->introtext);
}*/

$results = $app->triggerEvent('onContentAfterDisplay', array('com_content.article', &$item, &$params, 1));
$item->afterDisplayTitle = trim(implode("\n", $results));

$results = $app->triggerEvent('onContentBeforeDisplay', array('com_content.article', &$item, &$params, 1));
$item->beforeDisplayContent = trim(implode("\n", $results));
}

return $items;

и default.php

Код

<ul id="stage<?php echo $specialinstance; ?>">
<?php foreach ($list as $item) :?>
<li class="pjqs_item" data-tags="<?php $filtering_link$item->metakey; ?><?php echo $filtering_link;?>">


<?php  // let's deal with the intro length and image paths here
$maxintro = trim( $params->get('maxintro'),'' );
$ini=strpos(strtolower($item->introtext),'<img');  // handle the images
if ($ini === false) $img = '';
else {
$ini = strpos($item->introtext,'src="',$ini)+5;
$fin = strpos($item->introtext,'"',$ini);
$img = substr($item->introtext,$ini,$fin-$ini);
$fin = strpos($item->introtext,'>',$fin);
}
$intro=strip_tags($item->introtext);
if (!empty($maxintro)) $intro = trim(substr($intro,0,$maxintro)).'...';
if($pic_pathtype =="1")
{
$image_path=JURI::base( true )."/".$img;
} else {
$image_path="/".$site_subfolder."/".$img;
}
?>

<?php if ($params->get('pic_link')) {?><a href="<?php echo $item->link;?>" class="title"><?php }?>

<?php if ($pjqp_show_details == '1'){?>
<div class="captioner">
<div class="captioner-inner">
<?php if ($pj_show_title == '1'){?><h1><span class="title stack" style="color: <?php echo $params->get('pj_title_color', '');?>;<?php echo $params->get('pj_title_css', '');?>"><?php if ($pj_link_title == '1'){?><a href="<?php echo $item->link;?>" title="<?php echo $item->title;?>" style="color: <?php echo $params->get('pj_title_color', '');?>;<?php echo $params->get('pj_title_css', '');?>"><?php };?><?php echo $item->title;?><?php if ($pj_link_title == '1'){?></a><?php };?></span></h1><?php };?>
<?php if ($pj_show_date == '1'){?><span class="_created_date" style="color: <?php echo $params->get('pj_date_color');?>;<?php echo $params->get('pj_date_color', '');?>;<?php echo $params->get('pj_date_css', '');?>"><?php echo JText::sprintf('COM_CONTENT_CREATED_DATE_ON', JHtml::_('date',$item->created, JText::_($pj_date_format))); ?></span><?php };?>
<?php if ($pj_show_author == '1'){?>
<?php $author =  $item->author; ?>
<?php $author = ($item->created_by_alias ? $item->created_by : $author);?>
<span class="_created_by" style="color:<?php echo $params->get('pj_author_color');?>;<?php echo $params->get('pj_author_css', '');?>"><?php echo 'by '; echo $author; ?></span>
<?php };?>
<?php if ($pj_show_intro == '1'){?><span class="introtext stack" style="color: <?php echo $params->get('pj_intro_color');?>;<?php echo $params->get('pj_introtext_css', '');?>"><?php echo $intro;?></span><?php };?>
<?php if ($pj_show_readmore == '1'){?><a class="readon" style="color:<?php echo $params->get('pj_readmore_color');?>;<?php echo $params->get('readmore_css', '');?>" href="<?php echo $item->link;?>" title="<?php echo $item->title;?>"><?php echo $params->get('pj_readmoretext', 'Read More...');?></a><?php }?>

</div>
</div>
<?php };?>

<?php if ($params->get('pic_link')) {?>
<a href="<?php echo $item->link;?>"><?php }?>
<img class="nolazy <?php echo $params->get('pj_img_classes');?>" style="<?php echo $params->get('pic_css'); ?>" alt="<?php echo $item->title;?>"
<?php if ($params->get('resize_image')){?>
<?php if ($pj_use_mod_rewrite == '1'){?>
src="<?php echo $module_base;?>scripts/slir/w<?php echo $params->get('pic_width'); ?>-h<?php echo $params->get('pic_height'); ?>-c<?php echo $params->get('pic_ratio'); ?><?php echo $image_path;?>"
<?php } else { ?>
src="<?php echo $module_base;?>scripts/slir/w=<?php echo $params->get('pic_width'); ?>&amp;h=<?php echo $params->get('pic_height'); ?>&amp;c=<?php echo $params->get('pic_ratio'); ?>&amp;i=<?php echo $image_path;?>"<?php }?> />
<?php } else { ?>
src="<?php echo $image_path;?>"
<?php };?>
<?php if ($params->get('pic_link')) {?></a>
<?php }?>

</li>
<?php endforeach; ?>
</ul>
*

sivers

  • Живу я здесь
  • 2578
  • 357 / 0
Попробуйте добавить в код проверку, чтоб получилось так:
Код
if(is_array($items)) foreach ($items as &$item) {
(для первого файла)
и
Код
<?php if(is_array($list)) foreach ($list as $item) :?>
(для второго)
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

CityCat

  • Осваиваюсь на форуме
  • 40
  • 0 / 0
  • Алексей Voronov
Две ошибки пропали, но ни чего не выводит из контента, просто пусто.

На \components\com_content\models\articles.php on line 587 все равно ругается.
*

sivers

  • Живу я здесь
  • 2578
  • 357 / 0
а что в 587 строке? раз убрались ошибки, значит $list и $items там - не массивы. надо смотреть почему не выбрались объекты.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

CityCat

  • Осваиваюсь на форуме
  • 40
  • 0 / 0
  • Алексей Voronov
Там стандартный articles.php из дистрибутива

Код

// Convert the parameter fields into objects.
foreach ($items as &$item)
{
$articleParams = new Registry($item->attribs);

// Unpack readmore and layout params
$item->alternative_readmore = $articleParams->get('alternative_readmore');
$item->layout               = $articleParams->get('layout');

$item->params = clone $this->getState('params');

/**
* For blogs, article params override menu item params only if menu param = 'use_article'
* Otherwise, menu item params control the layout
* If menu item is 'use_article' and there is no article param, use global
*/
if (($input->getString('layout') === 'blog') || ($input->getString('view') === 'featured')
|| ($this->getState('params')->get('layout_type') === 'blog'))
{
// Create an array of just the params set to 'use_article'
$menuParamsArray = $this->getState('params')->toArray();
$articleArray    = array();

foreach ($menuParamsArray as $key => $value)
{
if ($value === 'use_article')
*

Support

  • Захожу иногда
  • 114
  • 1 / 2
-
« Ответ #5 : 21.02.2019, 21:22:00 »
-
« Последнее редактирование: 17.07.2019, 12:56:47 от Support »
*

CityCat

  • Осваиваюсь на форуме
  • 40
  • 0 / 0
  • Алексей Voronov
это модуль квик портфолио надо переделывать под Joomla 3

Без обид, это ответ типа "Поставь другую CMS".

Разбирался бы в PHP, там ведь где-то всего одну строку подправить надо, чую  ^-^
*

CityCat

  • Осваиваюсь на форуме
  • 40
  • 0 / 0
  • Алексей Voronov
Те ошибки ушли. Контент не появился пока (с надеждой =).
Что-то колдовал и вот что получил теперь:

Notice: Undefined variable: items in \modules\mod_pj_quickportfolio\helper.php on line 63

Notice: Undefined variable: items in \modules\mod_pj_quickportfolio\helper.php on line 92

Код
<?php
/**
 * @version $Id: helper.php 20196 2011-01-09 02:40:25Z ian $
 * @package Joomla.Site
 * @subpackage mod_articles_latest
 * [member=126442]copyright[/member] Copyright (C) 2005 - 2011 Open Source Matters, Inc. All rights reserved.
 * @license GNU General Public License version 2 or later; see LICENSE.txt
 */

// no direct access
defined('_JEXEC') or die;

require_once JPATH_SITE.'/components/com_content/helpers/route.php';

jimport('joomla.application.component.model');

JModelLegacy::addIncludePath(JPATH_SITE.'/components/com_content/models');

abstract class modpjQuickPortfolioHelper
{
public static function getList(&$params)
{
$app = JFactory::getApplication();
$db = JFactory::getDbo();

// Get an instance of the generic articles model
$model = JModelLegacy::getInstance('Articles', 'ContentModel', array('ignore_request' => true));

// Set application parameters in model
$model->setState("params", JFactory::getApplication()->getParams());

// Set the filters based on the module params
$model->setState('list.start', 0);
$model->setState('list.limit', (int) $params->get('count', 5));

$model->setState('filter.published', 1);

$model->setState('list.select', 'a.fulltext, a.id, a.title, a.alias, a.title_alias, a.introtext, a.state, a.catid, a.created, a.created_by, a.created_by_alias,' .
' a.modified, a.modified_by,a.publish_up, a.publish_down, a.attribs, a.metadata, a.metakey, a.metadesc, a.access,' .
' a.hits, a.featured,' .
' LENGTH(a.fulltext) AS readmore');
// Access filter
$access = !JComponentHelper::getParams('com_content')->get('show_noauth');
$authorised = JAccess::getAuthorisedViewLevels(JFactory::getUser()->get('id'));
$model->setState('filter.access', $access);

// Category filter
$model->setState('filter.category_id', $params->get('catid', array()));

// Filter by language
$model->setState('filter.language',$app->getLanguageFilter());

// Set ordering
$ordering = $params->get('ordering', 'a.publish_up');
$model->setState('list.ordering', $ordering);
if (trim($ordering) == 'rand()') {
$model->setState('list.direction', '');
} else {
$model->setState('list.direction', 'DESC');
}

// Retrieve Content
if(is_array($items)) foreach ($items->getItems() as $item) {
$item->readmore = (trim($item->fulltext)!= '');
$item->slug = $item->id.':'.$item->alias;
$item->catslug = $item->catid.':'.$item->category_alias;

if ($access || in_array($item->access, $authorised))
{
// We know that user has the privilege to view the article
$item->link = JRoute::_(ContentHelperRoute::getArticleRoute($item->slug, $item->catid));
$item->linkText = JText::_('MOD_ARTICLES_NEWS_READMORE');
}
else {
$item->link = JRoute::_('index.php?option=com_user&view=login');
$item->linkText = JText::_('MOD_ARTICLES_NEWS_READMORE_REGISTER');
}

$item->introtext = JHtml::_('content.prepare', $item->introtext);

//new
/*if (!$params->get('image')) {
$item->introtext = preg_replace('/<img[^>]*>/', '', $item->introtext);
}*/

$results = $app->triggerEvent('onContentAfterDisplay', array('com_content.article', &$item, &$params, 1));
$item->afterDisplayTitle = trim(implode("\n", $results));

$results = $app->triggerEvent('onContentBeforeDisplay', array('com_content.article', &$item, &$params, 1));
$item->beforeDisplayContent = trim(implode("\n", $results));
}
return $items;
}
}
*

sivers

  • Живу я здесь
  • 2578
  • 357 / 0
Тут уже надо поэтапно смотреть что где формируется. Можете скинуть доступ - посмотрю (если не страдаете параноей - я б не скинул).
Либо самостоятельно. Откройте для начала модель articles.php, найдите там function getListQuery(), пролистайте в конец функции и перед строчкой return $query; сделайте вывод запроса в файл или на экран (если сайт запущен в тестовом режиме).
В файл можно так:
Код
file_get_contents(__FILE__.'.query.log', print_r($query,1));
return $query;
Затем обновите страницу сайта (проблемную) и посмотрите на файлы - рядом с articles.php должен появиться articles.php.query.log, а внутри - скль-запрос, которым вытягиваются данные. В нем надо поменять префиксы #_ на ваши и через phpMyAdmin (например) или adminer попробовать его выполнить и посмотреть вернет ли данные. Потом идти дальше исходя из результата.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

Support

  • Захожу иногда
  • 114
  • 1 / 2
-
« Ответ #9 : 22.02.2019, 14:28:17 »
-
« Последнее редактирование: 17.07.2019, 12:56:32 от Support »
*

Support

  • Захожу иногда
  • 114
  • 1 / 2
-
« Ответ #10 : 22.02.2019, 14:47:29 »
-
« Последнее редактирование: 17.07.2019, 12:56:18 от Support »
*

CityCat

  • Осваиваюсь на форуме
  • 40
  • 0 / 0
  • Алексей Voronov
Re: Ошибки Warning: Invalid argument supplied for foreach() in
« Ответ #11 : 22.02.2019, 14:51:06 »
Попробую поставить аналог.

Согласен с Support - лучше оригинал пользовать.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Как решить такую ошибку Warning: Invalid argument supplied for foreach()

Автор uniqcle

Ответов: 112
Просмотров: 120171
Последний ответ 21.08.2024, 14:04:08
от sivers
После установки CjBlog появляются ошибки

Автор Se

Ответов: 1
Просмотров: 1219
Последний ответ 25.06.2017, 13:42:35
от Se
b2jcontact - warning

Автор Acme

Ответов: 0
Просмотров: 1810
Последний ответ 16.03.2017, 11:28:40
от Acme
Widgetkit 2 ошибки при установке

Автор h.vitaly

Ответов: 3
Просмотров: 1985
Последний ответ 27.06.2015, 13:26:41
от h.vitaly
Как решить проблему с ошибкой Warning: Invalid argument supplied for foreach() in M:\home\ofsayt\www?

Автор dr_aybolit

Ответов: 2
Просмотров: 1355
Последний ответ 18.05.2015, 22:00:04
от passer