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

Chigolberi

  • Захожу иногда
  • 461
  • 12 / 0
Всем привет!

Подскажите как получить ссылку на материал ?

Материалы выводятся как "Блог категории", переопределил макет категории (category), получил копию и использую её (\templates\protostar\html\com_content\category\blog_item.php):
Код
<?php
/**
 * @package     Joomla.Site
 * @subpackage  com_content
 *
 * [member=126442]copyright[/member]   Copyright (C) 2005 - 2020 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');
$info    = $params->get('info_block_position', 0);

// Check if associations are implemented. If they are, define the parameter.
$assocParam = (JLanguageAssociations::isEnabled() && $params->get('show_associations'));

?>
<?php if ($this->item->state == 0 || strtotime($this->item->publish_up) > strtotime(JFactory::getDate())
|| ((strtotime($this->item->publish_down) < strtotime(JFactory::getDate())) && $this->item->publish_down != JFactory::getDbo()->getNullDate())) : ?>
<div class="system-unpublished">
<?php endif; ?>

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

<?php if ($canEdit || $params->get('show_print_icon') || $params->get('show_email_icon')) : ?>
<?php echo JLayoutHelper::render('joomla.content.icons', array('params' => $params, 'item' => $this->item, 'print' => false)); ?>
<?php endif; ?>

<?php // Todo Not that elegant would be nice to group the params ?>
<?php $useDefList = ($params->get('show_modify_date') || $params->get('show_publish_date') || $params->get('show_create_date')
|| $params->get('show_hits') || $params->get('show_category') || $params->get('show_parent_category') || $params->get('show_author') || $assocParam); ?>

<?php if ($useDefList && ($info == 0 || $info == 2)) : ?>
<?php // Todo: for Joomla4 Joomla.content.info_block.block can be changed to Joomla.content.info_block ?>
<?php echo JLayoutHelper::render('joomla.content.info_block.block', array('item' => $this->item, 'params' => $params, 'position' => 'above')); ?>
<?php endif; ?>
<?php if ($info == 0 && $params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?>
<?php echo JLayoutHelper::render('joomla.content.tags', $this->item->tags->itemTags); ?>
<?php endif; ?>

<?php echo JLayoutHelper::render('joomla.content.intro_image', $this->item); ?>

<?php if (!$params->get('show_intro')) : ?>
<?php // Content is generated by content plugin event "onContentAfterTitle" ?>
<?php echo $this->item->event->afterDisplayTitle; ?>
<?php endif; ?>

<?php // Content is generated by content plugin event "onContentBeforeDisplay" ?>
<?php echo $this->item->event->beforeDisplayContent; ?>

<table>
<tbody>
<tr>
<td class="table-content">
<!-- custom -->
    <?php foreach($this->item->jcfields as $jcfield)
     {
          $this->item->jcFields[$jcfield->name] = $jcfield;
     }
     ?>
<!-- Add fancybox files -->
    <link rel="stylesheet" href="fancybox/jquery.fancybox.min.css" />
    <script src="fancybox/jquery.fancybox.min.js"></script>
<?php
     if ($this->item->jcFields['logotip']->value)
     echo "<a data-fancybox href='/{$this->item->jcFields['logotip']->rawvalue}'><img class='{$this->item->jcFields['logotip']->fieldparams['image_class']}' src='/{$this->item->jcFields['logotip']->rawvalue}'></a>";
?>
<!-- end custom -->
<?php echo $this->item->introtext; ?>
</td>
</tr>
</tbody>
</table>

<?php if ($info == 1 || $info == 2) : ?>
<?php if ($useDefList) : ?>
<?php // Todo: for Joomla4 Joomla.content.info_block.block can be changed to Joomla.content.info_block ?>
<?php echo JLayoutHelper::render('joomla.content.info_block.block', array('item' => $this->item, 'params' => $params, 'position' => 'below')); ?>
<?php endif; ?>
<?php if ($params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?>
<?php echo JLayoutHelper::render('joomla.content.tags', $this->item->tags->itemTags); ?>
<?php endif; ?>
<?php endif; ?>

<?php if ($params->get('show_readmore') && $this->item->readmore) :
if ($params->get('access-view')) :
$link = JRoute::_(ContentHelperRoute::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language));
else :
$menu = JFactory::getApplication()->getMenu();
$active = $menu->getActive();
$itemId = $active->id;
$link = new JUri(JRoute::_('index.php?option=com_users&view=login&Itemid=' . $itemId, false));
$link->setVar('return', base64_encode(ContentHelperRoute::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language)));
endif; ?>

<?php echo JLayoutHelper::render('joomla.content.readmore', array('item' => $this->item, 'params' => $params, 'link' => $link)); ?>

<?php endif; ?>

<?php if ($this->item->state == 0 || strtotime($this->item->publish_up) > strtotime(JFactory::getDate())
|| ((strtotime($this->item->publish_down) < strtotime(JFactory::getDate())) && $this->item->publish_down != JFactory::getDbo()->getNullDate())) : ?>
</div>
<?php endif; ?>

<?php // Content is generated by content plugin event "onContentAfterDisplay" ?>
<?php echo $this->item->event->afterDisplayContent; ?>
Заголовок выводиться так (blog_item.php):
Код
<?php echo JLayoutHelper::render('joomla.content.blog_style_default_item_title', $this->item); ?>
Подскажите как мне получить ссылку на материал, чтобы использовать её в своём макете?
*

Chigolberi

  • Захожу иногда
  • 461
  • 12 / 0
Посмотрел что есть и с чем можно работать, в файле blog_item.php добавил код
Код
<pre><?php print_r($this->item); ?></pre>
Из полученных данных, собрал вот такую конструкцию:
Код
<?php echo "<a href='/{$this->item->category_alias}/{$this->item->alias}'>Текст ссылки, в моём случае картинка</a>"; ?>
Работает, но я почти уверен что это корректно и есть более правильный способ.
По сути я взял алиас категории + алиас материала = относительная ссылка на материал.

Подскажите как сделать более правильно ?
« Последнее редактирование: 04.06.2020, 11:18:31 от Chigolberi »
*

sivers

  • Завсегдатай
  • 1357
  • 179 / 0
Можно отключить сеф/чпу в общих настройках Joomla и посмотреть как будут выглядеть ссылки. Вот такими их и надо делать. Потом снова включите SEF.
На связи в телеге @sivers
*

Chigolberi

  • Захожу иногда
  • 461
  • 12 / 0
Можно отключить сеф/чпу в общих настройках Joomla и посмотреть как будут выглядеть ссылки. Вот такими их и надо делать. Потом снова включите SEF.
А можно пример кода?
Вот ссылка на материал в "Блоге категорий" без ЧПУ:
Код
index.php?option=com_content&view=article&id=2:jingsha-x99-d8&catid=8&Itemid=102
*

sivers

  • Завсегдатай
  • 1357
  • 179 / 0
А можно пример кода?
Так а что там кодить еще? Делаете вот такие ссылки:
index.php?option=com_content&view=article&id=2:jingsha-x99-d8&catid=8&Itemid=102
и они будут конвертироваться в чпу-шные
Itemid здесь - это ИД пункта меню вашего блога. С остальными параметрами вроде понятно и так должно быть. Если хочется сформировать сразу отсефенную ссылку, то можно сделать так:
Код
JRoute::_('index.php?option=com_content&view=article&id=2:jingsha-x99-d8&catid=8&Itemid=102');
На связи в телеге @sivers
*

Chigolberi

  • Захожу иногда
  • 461
  • 12 / 0
Так а что там кодить еще? Делаете вот такие ссылки:
А как получить универсальную ссылку, ведь у каждого материала свои id, например как получить Itemid=102, какой код должен быть? Мне его нужно вставить сюда:
Код
<?php echo "<a href='код ссылки'>Текст ссылки, в моём случае картинка</a>"; ?>
« Последнее редактирование: 04.06.2020, 12:35:56 от Chigolberi »
*

Chigolberi

  • Захожу иногда
  • 461
  • 12 / 0
Itemid здесь - это ИД пункта меню вашего блога.
Вывел в переменную, но не как не пойму как получить Itemid=102
Код
$urlblog = JRoute::_('index.php?option=com_content&view=article&id=' . $this->item->slug . '&catid=' . $this->item->catid . '&Itemid=102');
*

sivers

  • Завсегдатай
  • 1357
  • 179 / 0
Код
$Itemid = 102;
$urlblog = JRoute::_('index.php?option=com_content&view=article&id=' . $this->item->id . ':' . $this->item->alias . '&catid=' . $this->item->catid . '&Itemid='.$Itemid);
Можно сделать то же самое без Itemid. Joomla сама найдет его и подставит. Но лучше так не делать - если у вас несколько пунктов меню (на разные категории к примеру), то хз какой она выберет - могут дубли пойти. Лучше уж явно везде указывать один и тот же. На своих сайтах задаю их (ИДы пунктов меню) константой и потом подставляю везде константу.
На связи в телеге @sivers
*

Chigolberi

  • Захожу иногда
  • 461
  • 12 / 0
Можно сделать то же самое без Itemid. Joomla сама найдет его и подставит. Но лучше так не делать - если у вас несколько пунктов меню (на разные категории к примеру), то хз какой она выберет - могут дубли пойти.
С  . '&Itemid='.$Itemid получаю ссылку с пустотой на конце
Код
$urlblog = JRoute::_('index.php?option=com_content&view=article&id=' . $this->item->id . ':' . $this->item->alias . '&catid=' . $this->item->catid . '&Itemid='.$Itemid);
Код
/index.php?option=com_content&view=article&id=2:jingsha-x99-d8&catid=8&Itemid=

Без . '&Itemid='.$Itemid получаю нужную ссылку
Код
$urlblog = JRoute::_('index.php?option=com_content&view=article&id=' . $this->item->id . ':' . $this->item->alias . '&catid=' . $this->item->catid);
Код
/index.php?option=com_content&view=article&id=2:jingsha-x99-d8&catid=8&Itemid=102
*

draff

  • Живу я здесь
  • 4851
  • 336 / 7
  • Ищу работу
*

sivers

  • Завсегдатай
  • 1357
  • 179 / 0
Код
$app = JFactory::getApplication();
$Itemid = $app->input->getInt("Itemid", 102 );
А если ТС попытается сформировать ссылку на материал, находясь на странице другого компонента/блога/пункта меню? Ему ж по идее не текущий ИД пункта меню нужен, а волне конкретный.
На связи в телеге @sivers
*

Chigolberi

  • Захожу иногда
  • 461
  • 12 / 0
sivers, спасибо!  *DRINK*

Вроде всё работает корректно без указания Itemid, само генерируется.

PS. Ни когда бы не догадался, что Itemid сам генерируется.
*

sivers

  • Завсегдатай
  • 1357
  • 179 / 0
PS. Ни когда бы не догадался, что Itemid сам генерируется.
Повторюсь - лучше так не делать. Оставляете себе подводный камень. К тому же движок выполняет лишний запрос для определения пункта меню для этой ссылки. Задайте ИД явно - так оно надежней будет.
На связи в телеге @sivers
*

Chigolberi

  • Захожу иногда
  • 461
  • 12 / 0
Повторюсь - лучше так не делать. Оставляете себе подводный камень. К тому же движок выполняет лишний запрос для определения пункта меню для этой ссылки. Задайте ИД явно - так оно надежней будет.
Да, но как его получить?

Если посмотреть так:
Код
<pre><?php print_r($this); ?></pre>
То там есть [Itemid] => 102, но какое из них нужное и как до него добраться...
« Последнее редактирование: 04.06.2020, 15:20:17 от Chigolberi »
*

sivers

  • Завсегдатай
  • 1357
  • 179 / 0
Да, но как его получить?
Находясь на странице этого же блога или материала получить не сложно - выше draff написал как именно. Если есть в $this, то можете брать оттуда. Или оставить пустым, как сейчас.
Но вот если вам понадобится сформировать ссылки на материалы на другой странице (например, для карты сайта или в боковом модуле на странице каталога/магазина/галереи и т.п.), то там уже не получится сделать как здесь.
На связи в телеге @sivers
*

Chigolberi

  • Захожу иногда
  • 461
  • 12 / 0
Находясь на странице этого же блога или материала получить не сложно - выше draff написал как именно.
Но там конкретно указанно 102, а макет будет использован не только в Itemid 102
Если есть в $this, то можете брать оттуда.
Только как до него добраться\вывести, там очень много (<pre><?php print_r($this); ?></pre>):
Код
[data:protected] => Array
                                                (
                                                    [Itemid] => 102
                                                    [option] => com_content
                                                    [view] => category
                                                    [layout] => blog
                                                    [id] => 8
                                                )
« Последнее редактирование: 04.06.2020, 15:50:04 от Chigolberi »
*

draff

  • Живу я здесь
  • 4851
  • 336 / 7
  • Ищу работу
А если ТС попытается сформировать ссылку на материал, находясь на странице другого компонента/блога/пункта меню? Ему ж по идее не текущий ИД пункта меню нужен, а волне конкретный.
Тогда дополнить условие проверки на ИД категории .
ТС А создан пункт меню на эту категорию ? Тогда и используйте Itemid пункта меню на этот блог категории.
Но там конкретно указанно 102
102 по умолчанию, если не будет в ссылке значения Itemid
*

Chigolberi

  • Захожу иногда
  • 461
  • 12 / 0
102 по умолчанию, если не будет в ссылке значения Itemid
Работает!  *DRINK*
Просто ещё не особо разбираюсь.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться