Новости Joomla

Рендер пользовательского поля внутри другого пользовательского поля. Joomla 5.3

Писал ранее о том, как внутри одного пользовательского поля рендерить другое пользовательское поле. Применил для этого возможность Joomla обращаться к методам плагинов напрямую. Процитирую строчку кода из предыдущего поста:

<?php
$joomlaFieldContentPlugn->onContentPrepare('com_content.article', $fakeItem, $app->getParams());

Joomla постепенно переходит от простого указания аргументов для триггеров плагинов к собственным классам событий. Это позволяет не запоминать порядок передачи аргументов класса и использовать человекопонятные методы $event->getContext(), $event->getItem() и т.д. А то в одном месте в Joomla было $article, в другом - $item, в третьем ещё как-то... Порядку больше становится.

Сегодня обновил сайт клиентов до Joomla 5.3. В ней обновили контент-плагин fields и мой финт ушами с вызовом метода плагина отвалился потому, что я передавал в нём 3 аргумента, вместо одного. И для события onContentPrepare это должен быть объект класса ContentPrepareEvent. Как меняется фрагмент кода из предыдущего поста:

<?php
// мы находимся в файле макета поля

use Joomla\CMS\Event\Content\ContentPrepareEvent;
use Joomla\CMS\Factory;

$app = Factory::getApplication();
$fakeItem = new \stdClass();
// Получаем id текущего материала из объекта Input
$fakeItem->id = $app->getInput()->getInt('id');
// {field 29} - это шорт код вставки поля с id 29 - "ассортимент проекта"
// к содержимому поля конкатенируем шорт-код для обработки
$fakeItem->text = $field->value . '{field 29}';
// Получаем объект плагина
$joomlaFieldContentPlugn = $app->bootPLugin('fields', 'content');
// вызываем метод обработки напрямую
// вместо 3-х аргументов теперь указываем один
// это объект класса ContentPrepareEvent
$joomlaFieldContentPlugn->onContentPrepare(new ContentPrepareEvent('onContentPrepare', [
            'context' => 'com_content.article',
            'subject' => $fakeItem,
            'params'  => $app->getParams(),
            'page'    => 0,
        ]));
// выводим оба поля
echo $fakeItem->text;

@webtolkru 

Вышел релиз Joomla 5.3.0

Вышел релиз Joomla 5.3.0

Проект Joomla с радостью объявляет о выходе Joomla 5.3 — последней минорной версии в серии Joomla 5.

Этот релиз сосредоточен на продуманных улучшениях, которые совершенствуют работу с CMS. От лучшей организации файлов и журналирования задач до расширенной обработки электронной почты и улучшенной доступности — Joomla 5.3 помогает администраторам и разработчикам работать более эффективно, сохраняя ваш сайт современным, безопасным и готовым к будущему.

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

Davidich

  • Захожу иногда
  • 179
  • 7 / 1
Здравствуйте. Модуль новостей из категории имеет такую структуру, если настроить его по горизонтали:
Код: html4strict
<div class="latest-new">
<ul class="newsflash-horiz">
  <li>
    <h4 class="newsflash-title">  Материал </h4>
     <p>
        <img alt="image005" src="/images/image005.jpg">
    </p>
     <p>Текст материала.</p>
   <a class="readmore" href="/index.php/8-blog/1-material">Подробнее...</a>
 <span class="article-separator"> </span>
 </li>
</ul>
</div>

Вот у меня вопрос: Есть ли возможность переписать его в такой вид?
Код: html4strict
<div class="latest-new">
  <img alt="image005" src="/images/image005.jpg">
   <div class="mystyle">
      <h4 class="newsflash-title">  Материал </h4>
        <p>Текст материала.</p>
       <a class="readmore" href="/index.php/8-blog/1-material">Подробнее...</a>
   </div>
</div>
Если конкретнее сказать, мне нужно вывести  картинку за таблицу.
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
Хмм... а Вы разве его уже не переписали?
Переопределяйте модуль в шаблоне и модифицируйте, как Вам будет угодно.
*

Davidich

  • Захожу иногда
  • 179
  • 7 / 1
Хмм... а Вы разве его уже не переписали?
Переопределяйте модуль в шаблоне и модифицируйте, как Вам будет угодно.
Нет я его не переписывал, я еще вчера переопределил и со вчерашнего дня не могу модифицировать как не старался <img alt="image005" src="/images/image005.jpg"> и вывести его за  <li>. li поменять на div - это без проблем, а вывести никак не могу...
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
Что мешает? опишите подробно.
*

Davidich

  • Захожу иногда
  • 179
  • 7 / 1
Что мешает? опишите подробно.
А выше разве не очень подробно...)
Подробнее: вывожу с бутстрапом 3 изображения по ширине:
Код: php
<div class="row<?php echo $params->get('moduleclass_sfx'); ?>">
<?php for ($i = 0, $n = count($list); $i < $n; $i ++) :
$item = $list[$i]; ?>
<div class="col-md-4">
<?php require JModuleHelper::getLayoutPath('mod_articles_news', '_item');

if ($n > 1 && (($i < $n - 1) || $params->get('showLastSeparator'))) : ?>

<span class="article-separator"> </span>

<?php endif; ?>
</div>
<?php endfor; ?>
</div>
Картинка попадает под col-md-4, а мне не нужно, чтобы она не входила в него. Структуру написал выше.
*

Shustry

  • Гуру
  • 6434
  • 745 / 3
Код: php
<?php require JModuleHelper::getLayoutPath('mod_articles_news', '_item');

У вас тут подшаблон подключается. В нём нужно переопределять.
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
Правильно, картинка принадлежит итему, и выводится вместе с итемом, в отдельном шаблоне для итема _item.php
*

fbr

  • Завсегдатай
  • 1657
  • 201 / 7
В стандартном модуле выводится изображение, содержащееся в тексте вступления, т.е вот здесь:
Код: php
$item->introtext;
и вытащить его достаточно проблематично.
Если вы в переопределенном макете выводите изображение для вступительного текста (вставили самостоятельно) - тогда можно
*

Davidich

  • Захожу иногда
  • 179
  • 7 / 1
Код: php
<?php require JModuleHelper::getLayoutPath('mod_articles_news', '_item');

У вас тут подшаблон подключается. В нём нужно переопределять.
В _item.php. А как? Можете помочь...
В стандартном модуле выводится изображение, содержащееся в тексте вступления, т.е вот здесь:
Код: php
$item->introtext;
и вытащить его достаточно проблематично.
Если вы в переопределенном макете выводите изображение для вступительного текста (вставили самостоятельно) - тогда можно
Вот именно на этом я и остановился, надо как-то отделить картинку от текста...
*

Shustry

  • Гуру
  • 6434
  • 745 / 3
Скорее всего файл называется default_item.php и находится там же, где и default.php. Выложите его листинг.
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
Re: Как переделать структуру mod_articles_news?
« Ответ #10 : 01.05.2014, 10:16:50 »
Вот именно на этом я и остановился, надо как-то отделить картинку от текста...
Получаете в отдельную переменную значение записи (итема) $aitem = $item->introtext; выковыриваете регуляркой из $aitem картинку и уже потом выводите остаток во фронт. Как ковырять - не подскажу, только теоретически представляю ((

Файл называется _item.php, лежит рядом с default.php. оригинальное содержимое:

<?php
/**
 * @package     Joomla.Site
 * @subpackage  mod_articles_news
 *
 * @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;
$item_heading $params->get('item_heading''h4');
?>
<?php 
if ($params->get('item_title')) : ?>

	
<<?php echo $item_heading?> class="newsflash-title<?php echo $params->get('moduleclass_sfx'); ?>">
	
<?php if ($params->get('link_titles') && $item->link != '') : ?>
	
	
<a href="<?php echo $item->link;?>">
	
	
	
<?php echo $item->title;?></a>
	
<?php else : ?>
	
	
<?php echo $item->title?>
	
<?php endif; ?>
	
</<?php echo $item_heading?>>

<?php endif; ?>

<?php if (!$params->get('intro_only')) :
	
echo 
$item->afterDisplayTitle;
endif; 
?>

<?php echo $item->beforeDisplayContent?>

<?php echo $item->introtext?>

<?php if (isset($item->link) && $item->readmore != && $params->get('readmore')) :
	
echo 
'<a class="readmore" href="'.$item->link.'">'.$item->linkText.'</a>';
endif; 
?>
*

fbr

  • Завсегдатай
  • 1657
  • 201 / 7
Re: Как переделать структуру mod_articles_news?
« Ответ #11 : 01.05.2014, 10:17:45 »
посмотрите здесь, может пригодится
http://www.wantweb.ru/mod-articles-news/mod-articles-news-date-image
*

Shustry

  • Гуру
  • 6434
  • 745 / 3
Re: Как переделать структуру mod_articles_news?
« Ответ #12 : 01.05.2014, 10:24:17 »
В стандартном модуле выводится изображение, содержащееся в тексте вступления, т.е вот здесь:
Код: php
$item->introtext;
и вытащить его достаточно проблематично.
Если вы в переопределенном макете выводите изображение для вступительного текста (вставили самостоятельно) - тогда можно

Первый раз только проблемно. Потом привыкаешь. ^-^

Код: php
/*сперва найдём первую картинку, вернее только её адрес:*/
$src_regex = '#src\s*=\s*(["\'])(.*?)\1#'; //регулярка для поиска src картинки
preg_match_all($src_regex, $item->introtext, $matches); //где $item->introtext — переменная, в которой ищем.
$item->imgsrc = $matches[2][0];

/*потом удалим все теги, в том числе картинки из текста. Выборочные, например <p> можно оставить*/
$item->introtext = strip_tags($item->introtext);

/*подчистим:*/
$item->introtext = trim($item->introtext);

/*ещё можно подрезать строку до нужного количества символов без кромсания слов:*/
$txtcut = 600;
$item->introtext = strip_tags($item->introtext);
$item->introtext = substr(
$item->introtext, 0, (
strripos(
substr($item->introtext, 0, $txtcut), ' '
)
)
);

/*Всё, теперь можно выводить:*/

//$item->introtext = чистый, готовый текст для вывода.
//$item->imgsrc = значение src первой картинки
*

Davidich

  • Захожу иногда
  • 179
  • 7 / 1
Re: Как переделать структуру mod_articles_news?
« Ответ #13 : 01.05.2014, 10:35:56 »
посмотрите здесь, может пригодится
http://www.wantweb.ru/mod-articles-news/mod-articles-news-date-image
Интересная статья. но у меня вышло по две картинки. От вставленного кода и от стандартного кода. Автор не объяснил как заменить подробно.
Первый раз только проблемно. Потом привыкаешь. ^-^

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


Как правильно этот код вставить? А то я вставил и у меня картинки пропали  ::)
*

Shustry

  • Гуру
  • 6434
  • 745 / 3
Re: Как переделать структуру mod_articles_news?
« Ответ #14 : 01.05.2014, 10:40:53 »
Картинку вывести так:

Код: php
echo '<img src="'.$item->imgsrc.'" / >';
*

Davidich

  • Захожу иногда
  • 179
  • 7 / 1
Re: Как переделать структуру mod_articles_news?
« Ответ #15 : 01.05.2014, 10:50:34 »
Если я правильно понял, то нужно <?php echo $item->introtext; ?> заменить на :
Код: php
<?php $src_regex = '#src\s*=\s*(["\'])(.*?)\1#'; 
preg_match_all($src_regex, $item->introtext, $matches);
$item->imgsrc = $matches[2][0];
 

$item->introtext = strip_tags($item->introtext);
 
/*подчистим:*/
$item->introtext = trim($item->introtext);
 

$txtcut = 600;
$item->introtext = strip_tags($item->introtext);
$item->introtext = substr(
$item->introtext, 0, (
strripos(
substr($item->introtext, 0, $txtcut), ' '
)
)
);
echo '<img src="'.$item->imgsrc.'" / >' ?>
Если так, то пропал вступительный текст...
*

Shustry

  • Гуру
  • 6434
  • 745 / 3
Re: Как переделать структуру mod_articles_news?
« Ответ #16 : 01.05.2014, 10:54:45 »
Я же файл не вижу.

Код: php
//выводим картинку:
echo '<img src="'.$item->imgsrc.'" / >';

//ниже выводим текст:
echo $item->introtext;
*

Davidich

  • Захожу иногда
  • 179
  • 7 / 1
Re: Как переделать структуру mod_articles_news?
« Ответ #17 : 01.05.2014, 11:12:03 »
Я же файл не вижу.

Код: php
//выводим картинку:
echo '<img src="'.$item->imgsrc.'" / >';

//ниже выводим текст:
echo $item->introtext;
Файл стандартный, я не использую готовые шаблоны ^-^. Спасибо большое! Получилось по вашему коду!
Спойлер
[свернуть]
Не обязательно было из-под col-md-4 выводить картинку, а достаточно было под div засунуть остальное))
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться