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

anesb

  • Новичок
  • 4
  • 0 / 0
Добрый день.

В категории "Услуги" (файл /templates/название_темы/html/com_content/category/uslugi.php) выводится листинг услуг через lead_items:
Код
$leadingcount = 0; 

if (!empty($this->lead_items)) : ?>
<div class="items-leading clearfix">
<?

foreach ($this->lead_items as &$item) : ?>
<div class="uslugi-flex leading-<?= $leadingcount ?><?= $item->state == 0 ? ' system-unpublished' : '' ?>"><?
$this->item = &$item;
echo $this->loadTemplate('item'); ?>
</div><?

$leadingcount++;
endforeach; ?>
</div><!-- end items-leading --><?
endif;

Файл uslugi_item.php в той же папке содержит логику вывода одной услуги.

На странице "Цены" (/templates/название_темы/layouts/price.php) потребовалось вывести точно такую же верстку всех услуг списком.
Была идея как-то подменить $this, чтобы подключить вышеуказанный код.

Как это сделать? Возможно, надо делать совсем по-другому. Спасибо.

« Последнее редактирование: 08.01.2020, 15:35:50 от anesb »
*

beliyadm

  • Легенда
  • 9629
  • 1658 / 66
  • Севастополь == Россия
Re: Подмена $this для вывода lead_items
« Ответ #1 : 08.01.2020, 16:43:12 »
Делается проще (в всяком случае я этот подход использую уже много лет).
В индексе шаблона делается файл типа function.php
В нем пишется функция function getProductItem($item) где находится вся наша верстка нужной структуры.
В файлах шаблона html/com_content/category/uslugi.php и любых других подключаем этот файл и вызываем данную функцию, передавая в неё массив $item.
Главное - чтобы названия переменных при этих вызовах совпадали.

В итоге - подключив данную функцию мы получаем одну структуру и внешний вид фронта хоть в режиме блога, из модуля\плагина, да где угодно.

Либо можно чуть усложнить (если сайт небольшой и нагрузка маленькая) - в функцию передать ID материала и запросом внутри нашей функции строить что надо
Все истины, которые я хочу вам изложить, — бесстыдная ложь. Записки нетрезвого кодера
Skype: beliyadm_pb
*

anesb

  • Новичок
  • 4
  • 0 / 0
Re: Подмена $this для вывода lead_items
« Ответ #2 : 08.01.2020, 23:44:25 »
Идея отличная.

Но как получить на странице "Цены" lead_items категории "Услуги"?

Делаю var_dump($this); на категории "Услуги", там:
Код
object(ContentViewCategory)#350 (37) { ["lead_items":protected]=> array(2) { [0]=> object(stdClass)#586 (53) { ["id"]=> string(1) "9" ["title"]=> string(40) "Анализы и диагностика" ["alias"]=> string(21) "analizy-i-diagnostika" ["introtext"]=> string(598) "
и т. д. То есть в $this объект класса ContentViewCategory, у которого есть lead_items.

Пробовал уйти от lead_items в сторону получения всех статей категории. Делал так:

Код
		$articles = JFactory::getDBO()->setQuery("SELECT * FROM #__content WHERE catid = '9'")->loadObjectList();
И вместо
Код
foreach ($this->lead_items as &$item) : ?>
вставил
Код
foreach ($articles as &$item) : ?>

Но тогда перестаёт работать код:
Код
$this->item = &$item;
echo $this->loadTemplate('item');
внутри цикла.
 *ОХ-Х-Х*
*

sivers

  • Завсегдатай
  • 1732
  • 239 / 0
Re: Подмена $this для вывода lead_items
« Ответ #3 : 09.01.2020, 09:39:22 »
В файле price.php получайте материалы вашим запросом:
Код
$articles = JFactory::getDBO()->setQuery("SELECT * FROM #__content WHERE catid = '9'")->loadObjectList();
в файле uslugi.php до цикла вставьте:
Код
if(!empty($articles)) $items = &$articles;
else $items = &$this->lead_items;
и потом в цикле замените:
Код
foreach ($this->lead_items as &$item) : ?>
на
Код
foreach ($items as $item) : ?>
в итоге будет работать и то, и другое
На связи в телеге @sivers
https://sivers.su/
*

anesb

  • Новичок
  • 4
  • 0 / 0
Re: Подмена $this для вывода lead_items
« Ответ #4 : 22.01.2020, 12:22:52 »
Извиняюсь за долгий ответ.

Сделал так.

price.php
Код
	...
    $articles = JFactory::getDBO()->setQuery("SELECT * FROM #__content WHERE catid = '9'")->loadObjectList();

    if (count($articles) > 0) { ?>
        <div class="items-leading clearfix">
            <div class="uslugi-flex uslugi-flex-title">
                <div class="uslugi-intro uslugi-intro-title">дополнительные услуги</div>
                <div class="features-block features-block-title">особенности</div>
            </div><?

            $leadingcount = 0;
            foreach ($articles as $item) : ?>
                <div class="uslugi-flex leading-<?= $leadingcount ?><?= $item->state == 0 ? ' system-unpublished' : '' ?>"><?
                    $this->item = &$item;
                    include_once (JPATH_ROOT . '/templates/' . $app->getTemplate(). '/html/com_content/category/uslugi_item.php'); ?>
                </div><?
               
                $leadingcount++;
            endforeach; ?>
        </div><?
    }

В итоге:
Код
Notice: Undefined property: stdClass::$params in /var/www/********/html/templates/********/html/com_content/category/uslugi_item.php on line 13

Notice: Undefined property: stdClass::$params in /var/www/********/html/templates/********/html/com_content/category/uslugi_item.php on line 15

Fatal error: Call to a member function get() on null in /var/www/********/html/templates/********/html/com_content/category/uslugi_item.php on line 15

То есть объект, полученный в
Код
JFactory::getDBO()->setQuery...->loadObjectList()
не отдаёт те полноценные $this-объекты, которые нужны файлу uslugi_item.php, чтобы отобразить верстку (нужны параметры, доп. поля, как минимум).

Листинг uslugi_item.php.
Код
<?
/**
 * @package     Joomla.Site
 * @subpackage  Layout
 *
 * [member=126442]copyright[/member]   Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Create a shortcut for params.
$params = $this->item->params;
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');
$canEdit = $this->item->params->get('access-edit');

// GET CUSTOM FIELDS
$сustomFields = array();
foreach ($this->item->jcfields as $field) {
    $сustomFields[$field->name] = $field->value;
} ?>

<div class="uslugi-intro"><?
if ($this->item->state == 0) : ?>
<span class="label label-warning"><?= JText::_('JUNPUBLISHED')?></span><?
endif;

echo JLayoutHelper::render('joomla.content.blog_style_default_item_title', $this->item);

if (!$params->get('show_intro')) :
echo $this->item->event->afterDisplayTitle;
endif;

echo $this->item->event->beforeDisplayContent;
echo $this->item->introtext;

if ($useDefList) :
echo JLayoutHelper::render('joomla.content.info_block.block', array('item' => $this->item, 'params' => $params, 'position' => 'below'));
endif;

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

<p class="readmore"><a class="btn" href="<?= $link ?>">Подробнее об услуге</a></p><?
endif; ?>
</div> <?

if (!empty($сustomFields)) { ?>
<div class="features-block">
<div class="features-item features-arr">
<img src="<?= $this->baseurl ?>/templates/*********/images/double-arr.png" alt="">
</div><?

if (!empty($сustomFields['ico-1']) || !empty($сustomFields['podpis-1'])) { ?>
    <div class="features-item"><?= $сustomFields['ico-1'] ?><br><?= $сustomFields['podpis-1'] ?></div><?
    }

    if (!empty($сustomFields['ico-2']) || !empty($сustomFields['podpis-2'])) { ?>
    <div class="features-item"><?= $сustomFields['ico-2'] ?><br><?= $сustomFields['podpis-2'] ?></div><?
    }

    if (!empty($сustomFields['ico-3']) || !empty($сustomFields['podpis-3'])) { ?>
    <div class="features-item"><?= $сustomFields['ico-3'] ?><br><?= $сustomFields['podpis-3'] ?></div><?
    } ?>

<div class="features-item features-arr">
<img src="<?= $this->baseurl ?>/templates/*********/images/double-arr.png" alt="">
</div><?

if (!empty($сustomFields['tsena']) ) { ?>
    <div class="features-item">
    <div class="features-price">от<br><span><?= $сustomFields['tsena'] ?></span><br>рублей</div>
    </div><?
    } ?>
</div><?
}

echo $this->item->event->afterDisplayContent;

uslugi_items.inc.php
Код
<?
$leadingcount = 0;

if (!empty($this->lead_items)) : ?>
<div class="items-leading clearfix">
<div class="uslugi-flex uslugi-flex-title">
<div class="uslugi-intro uslugi-intro-title">дополнительные услуги</div>
<div class="features-block features-block-title">особенности</div>
</div><?

foreach ($this->lead_items as &$item) : ?>
<div class="uslugi-flex leading-<?= $leadingcount ?><?= $item->state == 0 ? ' system-unpublished' : '' ?>"><?
$this->item = &$item;
echo $this->loadTemplate('item'); ?>
</div><?

$leadingcount++;
endforeach; ?>
</div><!-- end items-leading --><?
endif;


У меня всё равно идея в price.php каким-то образом в $this положить рубрику "Услуги" и подключить uslugi_items.inc.php. Чтобы из $this сама Joomla взяла lead_items и выполнила такой же код, как в рубрике "Услуги".

Либо надо как-то получить объект класса ContentViewCategory по id категории, потому что через JFactory::getDBO() получается объект класса Joomla\CMS\Table\Category и у него нет params и get()
*

anesb

  • Новичок
  • 4
  • 0 / 0
Re: Подмена $this для вывода lead_items
« Ответ #5 : 22.01.2020, 13:41:57 »
В итоге сделал так. Перекинул всю логику из uslugi_item.php, удалил весь код, связанный c $this->item->event, так как события решил не обрабатывать.
Получился код в uslugi_items.inc.php:
Код
<?
$catid = 9; // Услуги

$app = JFactory::getApplication();

// Получаем все статьи категории
    $articles = JFactory::getDBO()->setQuery("SELECT * FROM #__content WHERE catid = '" . $catid . "' AND state = 1")->loadObjectList();

    if (count($articles) > 0) { ?>
        <div class="items-leading clearfix">
            <div class="uslugi-flex uslugi-flex-title">
                <div class="uslugi-intro uslugi-intro-title">дополнительные услуги</div>
                <div class="features-block features-block-title">особенности</div>
            </div><?


            // https://forum.joomla.org/viewtopic.php?t=954346
JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php');
JModelLegacy::addIncludePath(JPATH_SITE.'/components/com_content/models', 'ContentModel');
$model = JModelLegacy::getInstance('Article', 'ContentModel', array('ignore_request' => true));
$appParams = JFactory::getApplication()->getParams();
$model->setState('params', $appParams);

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

            $leadingcount = 0;
            foreach ($articles as $article) :
$item = $model->getItem($article->id);

$params = $item->params;
$canEdit = $item->params->get('access-edit');
$jcFields = FieldsHelper::getFields('com_content.article', $item, true);

// GET CUSTOM FIELDS in own array
$сustomFields = array();
foreach ($jcFields as $field) {
    $сustomFields[$field->name] = $field->value;
}

            ?>
                <div class="uslugi-flex leading-<?= $leadingcount ?>">
                <div class="uslugi-intro"><?
                echo JLayoutHelper::render('joomla.content.blog_style_default_item_title', $item);
echo $item->introtext;

$link =  JRoute::_(ContentHelperRoute::getArticleRoute($item->id, $item->catid, $item->language)); ?>

<p class="readmore"><a class="btn" href="<?= $link ?>">Подробнее об услуге</a></p>
                </div><?

                if (!empty($сustomFields)) { ?>
<div class="features-block">
<div class="features-item features-arr">
<img src="/templates/<?= $app->getTemplate()?>/images/double-arr.png" alt="">
</div><?

if (!empty($сustomFields['ico-1']) || !empty($сustomFields['podpis-1'])) { ?>
    <div class="features-item"><?= $сustomFields['ico-1'] ?><br><?= $сustomFields['podpis-1'] ?></div><?
    }

    if (!empty($сustomFields['ico-2']) || !empty($сustomFields['podpis-2'])) { ?>
    <div class="features-item"><?= $сustomFields['ico-2'] ?><br><?= $сustomFields['podpis-2'] ?></div><?
    }

    if (!empty($сustomFields['ico-3']) || !empty($сustomFields['podpis-3'])) { ?>
    <div class="features-item"><?= $сustomFields['ico-3'] ?><br><?= $сustomFields['podpis-3'] ?></div><?
    } ?>

<div class="features-item features-arr">
<img src="/templates/<?= $app->getTemplate()?>/images/double-arr.png" alt="">
</div><?

if (!empty($сustomFields['tsena']) ) { ?>
    <div class="features-item">
    <div class="features-price">от<br><span><?= $сustomFields['tsena'] ?></span><br>рублей</div>
    </div><?
    } ?>
</div><?
} ?>
                </div><?
               
                $leadingcount++;
            endforeach; ?>
        </div><?
    }

Подключаю этот файл в uslugi.php и price.php с помощью:
Код
include_once (JPATH_ROOT . '/templates/' . $app->getTemplate(). '/uslugi_items.inc.php'); ?>
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Свой шаблон макета вывода для первой статьи в модуле новостей

Автор zeus07

Ответов: 2
Просмотров: 133
Последний ответ 22.01.2021, 15:09:42
от zeus07
Пакетное изменение вывода изображений

Автор Missile

Ответов: 7
Просмотров: 231
Последний ответ 03.01.2021, 23:11:55
от draff
Где находится шаблон вывода редактора материалов на фронте?

Автор Dorfman

Ответов: 5
Просмотров: 436
Последний ответ 29.09.2019, 11:02:47
от Dorfman
Изменить шаблон вывода блока в категории

Автор zizi6ka

Ответов: 14
Просмотров: 1713
Последний ответ 12.04.2018, 09:21:12
от zizi6ka
Съезжает div на странице вывода списка всех категорий

Автор 8hellforcer8

Ответов: 10
Просмотров: 585
Последний ответ 09.04.2018, 22:08:49
от 8hellforcer8