Выводим список материалов в списке категорий Joomla 2.5

Собственно, лучше покажу, как это выглядит, чем объяснять.

  • 2013 г.
    • 01.01.2013 Новость 1
  • 2012 г.
    • 01.07.2012 Новость 3
    • 23.02.2012 Новость 2
    • 07.04.2012 Новость 1
  • 2011 г.
    • Новость 2
    • Новость 1
  • 2010 г.
  • 2009 г.

Вот как-то так… То есть, выводим название категории, а в ней ссылки на материалы. Раскрашивать и украшать не стал — и так видно, что за затея.

Сздаем пункт меню «Материалы » Список всех категорий» и указываем корневую категорию, которая содержит нужные подкатегории с материалами. Получим пока просто список категорий.

Открываем /templates/ШАБЛОН/html/com_content/categories/default_items.php

или /components/com_content/views/categories/tmpl/default_items.php

в зависимости от того, что присутствует (я уже писал о разных путях). Вообще, это и есть шаблон вывода категории, который мы сейчас будем нещадно править.

Самая суть вот в этом куске:

                <?php
                    $db =& JFactory::getDBO();
                    $query = $db->getQuery(true);
                    //echo $item->id;
                    $query = 'SELECT * FROM `#__content` WHERE `catid`='.$item->id.' AND `state`>0';
                    $db->setQuery($query);
                    $res= $db->loadObjectList();
                    foreach ($res as $concert) {
                        echo '<li>';
                        //print_r ($concert);
                        echo $concert->title;
                        echo '</li>';
                    }
                ?>

Номер строки проставлять не стал, это можно вставить почти куда угодно — тут хватит даже начальнах знаний PHP. Собственно, тут мы подключаемся к базе, выполняем запрос, в котором нам нужны все поля (мне нужны все поля, кому надо определенные — курим SELECT), но только принадлежащие id категории ($item->id), опубликованные и не в корзине (`state`>0).

Дальше полученный результат ($res= $db->loadObjectList();) перебираем и вставляем заголовок новости (echo $concert->title;).

Чтобы все это выглядело красиво — я затолкал вывод заголовков новостей в список (потом в CSS уже как захочется можно его украсить).

Я неспроста оставил //print_r ($concert); заремареным. Если его раскомментировать — увидим (да и так это видно), что $concert — это объект, в котором находятся все наши поля. доступ к ним осуществляется аналогично. Есть маленькая тонкость. В базе нигде не прописана ссылка. Заметили? Ссылку делаем так:

echo 'index.php?option=com_content&view=article&id='.$concert->id;

Если совсем разжевать и в рот положить — получится так:

<a href="index.php?option=com_content&view=article&id=<?php echo $concert->id; ?>"><?php echo $concert->title; ?></a>

Есть вариант вогнать туда роутер (что предпочтительнее):

echo '<a href="'.JRoute::_(ContentHelperRoute::getArticleRoute($concert->id)).'">'.$concert->title.'</a>';

Это, конечно, костылик, но большего обычно требуется редко, тем более, если мы сделаем это в файле /templates/ШАБЛОН/html/com_content/categories/default_items.php — не такой это и костыль получится.

Для тех, кто вообще далек — вот код (если что-то попрет не туда — не ругаться, а начинать думать!)

<?php

/**
 * @package		Joomla.Site
 * @subpackage	com_content
 * @copyright	Copyright (C) 2005 - 2012 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;
$class = ' class="first"';
if (count($this->items[$this->parent->id]) > 0 && $this->maxLevelcat != 0) :
?>
<ul>
<?php foreach($this->items[$this->parent->id] as $id => $item) : ?>

	<?php
	if ($this->params->get('show_empty_categories_cat') || $item->numitems || count($item->getChildren())) :
	if (!isset($this->items[$this->parent->id][$id + 1]))
	{
		$class = ' class="last"';
	}
	?>
	<li<?php echo $class; ?>>

	<?php $class = ''; ?>
		<span class="item-title"><a href="<?php echo JRoute::_(ContentHelperRoute::getCategoryRoute($item->id));?>">
			<?php echo $this->escape($item->title); ?></a>
		</span>
		<?php if ($this->params->get('show_subcat_desc_cat') == 1) :?>
		<?php if ($item->description) : ?>
			<div class="category-desc">
				<?php echo JHtml::_('content.prepare', $item->description, '', 'com_content.categories'); ?>
			</div>
		<?php endif; ?>
        <?php endif; ?>
		<?php if ($this->params->get('show_cat_num_articles_cat') == 1) :?>
			<dl><dt>
				<?php echo JText::_('COM_CONTENT_NUM_ITEMS'); ?></dt>
				<dd><?php echo $item->numitems; ?></dd>
			</dl>
		<?php endif; ?>

		<?php if (count($item->getChildren()) > 0) :
			$this->items[$item->id] = $item->getChildren();
			$this->parent = $item;
			$this->maxLevelcat--;
			echo $this->loadTemplate('items');
			$this->parent = $item->getParent();
			$this->maxLevelcat++;
		endif; ?>
            <ul>
                <?php
                /* MerinovKV
                 * Добавляем список материалов к текущей категории
                 * в списке категорий
                 */
                    $db =& JFactory::getDBO();
                    $query = $db->getQuery(true);
                    //echo $item->id;
                    $query = 'SELECT * FROM `#__content` WHERE `catid`='.$item->id.' AND `state`>0';
                    $db->setQuery($query);
                    $res= $db->loadObjectList();
                    foreach ($res as $concert) {
                        echo '<li>';
                        //print_r ($concert);
                        //echo $concert->title;
                        echo '<a href="'.JRoute::_(ContentHelperRoute::getArticleRoute($concert->id)).'">'.$concert->title.'</a>';
                        echo '</li>';
                    }
                ?>
            </ul>
	</li>
	<?php endif; ?>
    
<?php endforeach; ?>
</ul>
<?php endif; ?>

 

 

0

Выводим список материалов в списке категорий Joomla 2.5: 17 комментариев

  1. Irina

    Материалы выходят списком, только у меня в joomla 2.5.6 неправильно формировались ссылки на сам материал, выходила ошибка. Проблема решилась заменой 69-й строчки в вашем коде на
    echo ''.$concert->title.'';

  2. Olga

    Спасибо вам огромное!!!! Я так долго мучилась. Вот что значит не знать php. Мне как раз нужен был именно такой список с годами и заголовками. И отдельное большое спасибо Ирине(Irinа), у меня та же проблема была, не додумалась сразу в комментарии посмотреть.

    1. merinovkv

      Заур, зачем оставлять голословные комментарии? Те, у кого работает — пробовали, у них и заработало. А те, у кого в голове свой интерпретатор PHP — с ними ничго не поделаешь, всегда найдется тот, у кого «не работает» по разным причинам.
      Покажите ошибки. Может быть, вы для другой версии Joomla это все пробуете.

  3. Андрей

    Хочу немного переделать модуль mod_breadcrumbs для Joomla 2.5

    Хочу что бы у меня выводилось на текущий материал, а следующий. Помогите сформировать ссылку для php файла

    1. merinovkv Автор записи

      ну если следующий, то это будет +1 🙂
      вы про эту ссылку? 'index.php?option=com_content&view=article&id='.$concert->id
      $concert->id — это число, значит к нему можно прибавить единичку.
      ++$concert->id
      получится 'index.php?option=com_content&view=article&id='.++$concert->id

  4. Elena

    Подскажите, можно ли со списком материалов в списке категорий выводить превью самого материала, например изображение или описание?

  5. Назар

    А кто-то пробовал такой вывод категории с Joomfish 2.5 — у меня не выводит список категорий и материалов при переключении на другой язык почему-то.

    Может кто-то подскажет в чем дело ?

    1. merinovkv Автор записи

      Я выбирал свои подкатегории, которые назывались, например, «2001», «2002» и пр. Чтобы автоматически сортировать по алфавиту, надо будет переписать функцию

  6. Никита

    Спасибо! Очень помогли. Правда ссылки отображаются криво, по крайней мере у меня) Вот 100% рабочий вариант

    <a href="id, $concert->catid)); ?>»>title; ?>

    То есть получается что то типа блога категории. Просто у меня задача такая была:)

  7. Руслан

    Спасибо автору все хорошо работает. Единственное что еще хочется в этом, так это постраничную. навигацию.Как это можно реализовать?

Добавить комментарий