Модуль для Joomla - вывод материала в позицию модуля - Часть 2

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

Для начала необходимо поработать над структурой и отображением элементов модуля, все должно быть как на рисунке:

Что? Слишком сложно? А я думаю в самый раз, тем более что половину работы мы уже проделали. Первым делом займемся файлом mod_fastjob_articleinmodule.php. Как вы помните в этом файле модуля происходит подключение к базе данных и вывод результата, пока что одной строкой: 

 <div><?php echo $article_data['introtext']; ?></div>

Давайте напишем новую структуру для нашего модуля:

 <div>
    <div>
        <!-- Здесь будет материал и дополнительная информация -->
        <div>
            <!-- Заголовок, текст материала, подробнее -->
            <div>
                <!-- Заголовок -->
            </div>
            <div>
                <!-- Текст материала -->
                <?php echo $article_data['introtext']; ?>
                <span><!-- Подробнее --></span>
            </div>
        </div>
        <div>
            <!-- Информация об авторе, категория, описание, просмотры -->
            <div><!-- Дата --></div>
            <div>
                <img src="/" />
                <span><!-- Имя --></span>
                <span><!-- Категория --></span>
                <span><!-- Название категории --></span>
                <span><!-- Описание --></span>
                <span><!-- Описание категории --></span>
                <span><!-- Просмотров --></span>
                <span><!-- Количество просмотров --></span>
            </div>
        </div>
    </div>
    <div>
        <!-- Здесь будут метки -->
        <span><!-- Метка: --></span><span>..</span><span>..</span><span>..</span>
    </div>
</div>

 Теперь добавим css-классы, предлагаю делать это через админку, т.е. в настройках модуля, это позволит из админки назначить для элемента новый или уже существующий css-класс. Для этого изменим файл mod_fastjob_articleinmodule.xml, добавим в него для начала класс для самого первого элемента div. Внутри контейнера fieldset name="advanced", где у нас уже есть один параметр - id материала, добавим еще одну строку:

 <field name="fj_artcontainer_class" type="text" label="MOD_FASTJOB_ARTICLEINMODULE_ARTCONTAINER_LABEL" description="MOD_FASTJOB_ARTICLEINMODULE_ARTCONTAINER_DESC" />

 Кроме того, попутно добавьте описания для значений label и description в файл ru-RU.mod_fastjob_articleinmodule.ini, у меня получилось следующее:

MOD_FASTJOB_ARTICLEINMODULE_ARTCONTAINER_LABEL="Контейнер: "
MOD_FASTJOB_ARTICLEINMODULE_ARTCONTAINER_DESC="CSS-класс для контейнера модуля"

 Теперь напишем код для добавления класса в mod_fastjob_articleinmodule.php:

 $artcontainer = $params->get('fj_artcontainer_class'); //получаем значение поля fj_artcontainer_class из настроек

 И далее первый <div> меняем на <div class="<?php echo $artcontainer; ?>">

Как вы понимаете, переменная $artcontainer может содержать столько классов, сколько мы указали в настройках модуля что очень удобно. Аналогично добавлю поля для ввода классов вложенных элементов: заголовка,  даты, текста материала и меток. Думаю, этого будет достаточно для того, чтобы наш материал приобрел вид как на рисунке выше.

Следующий этап - вывод из базы данных нужной информации в соответствующие блоки.
Напомню запрос к базе данных из предыдущей статьи:

SELECT `introtext` FROM `'.$pref.'content` WHERE `id`="'.$article_id.'"

Для того, чтобы выбирать из БД другие поля, укажем их названия в запросе:

SELECT `title`,`alias`,`introtext`,`catid`,`created`,`created_by`,`metakey`,`metadesc`,`metadata` FROM `'.$pref.'content` WHERE `id`="'.$article_id.'"

Информация почти во всех полях, указаных в запросе вполне читаема, но с некоторыми записями нужно будет поработать. Организуем вывод из массива metadata информации об авторе статьи:

Преобразуем дату из формата mysql в привычное нам представление:

 list($year, $month, $day) = preg_split('/[-. ]+/', $article_data['created']); //получаем год, месяц, день

// преобразуем числовое значение месяца в текст
$month = (int)$month;
switch ($month) {
    case 1:
        $month = "января";
        break;
    case 2:
        $month = "февраля";
        break;
    case 3:
        $month = "марта";
        break;
    case 4:
        $month = "апреля";
        break;
    case 5:
        $month = "мая";
        break;
    case 6:
        $month = "июня";
        break;
    case 7:
        $month = "июля";
        break;
    case 8:
        $month = "августа";
        break;
    case 9:
        echo "сентября";
        break;
    case 10:
        $month = "октября";
        break;
    case 11:
        $month = "ноября";
        break;
    case 12:
        $month = "декабря";
        break;
}

 Ну и выводим дату в соответствующем блоке <?php echo (int)$day.' '.$month.' '.$year.' г.'; ?>

С выводом заголовка все гораздо проще. Добавим в блок заголовка строчку <?php echo $article_data['title']; ?>.

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

 $author_sql = 'SELECT `name`,`image` FROM `'.$pref.'contact_details` WHERE `user_id`='.$article_data['created_by'];
$db->setQuery($author_sql);
$author_data = $db->loadAssoc();

 Теперь выведем фото и имя автора в один из блоков под фото: <?php echo $author_data['username']; ?>. Вообще из таблицы можно вывести и другие данные автора статьи, например e-mail, но я ограничусь именем.

Слово "категория" будем выводить из ini файла вот так:

<?php echo JText::_('MOD_FASTJOB_ARTICLEINMODULE_ARTCAT_LABEL'); ?>

и добавим строку MOD_FASTJOB_ARTICLEINMODULE_ARTCAT_LABEL="Категория: " в файл ru-RU.mod_fastjob_articleinmodule.ini.

Для вывода названия категории проделаем действия, аналогичные выводу имени пользователя. ID категории хранится в переменной $article_data['catid'] и зная его мы можем получить название из таблицы categories:

 $cat_sql = 'SELECT `title` FROM `'.$pref.'categories` WHERE `id`='.$article_data['catid'];
$db->setQuery($cat_sql);
$cat_data = $db->loadAssoc();

 И вывод названия: <?php echo $cat_data['title']; ?>. Подзаголовок "описание" создается аналогично подзаголовку "категория", только название параметра будет MOD_FASTJOB_ARTICLEINMODULE_ARTDESC_LABEL.

 Теперь выведем краткое описание того, что написано в статье: <?php echo $article_data['metadesc']; ?>. Кстати описание мы берем из meta тега Description.

 Думаю, внимательные уже поняли, как можно используя переменную $article_data['hits'] организовать вывод количества просмотров материала, так что данную подробность я пропущу и приступлю к выводу меток. Метками будут ключевые слова Keywords, введенные автором при создании статьи. Их нужно вывести в виде ссылок с возможностью поиска похожих материалов на сайте по клику на такой метке. Первым делом подготовим массив всех ключевых слов для дальнейшей с ними работы. Я, чтобы не использовать разбиение по нескольким параметрам делаю так:

 $marks = explode(', ',$article_data['metakey']);

 Создадим параметр MOD_FASTJOB_ARTICLEINMODULE_ARTMARKS_LABEL="Метки: " в ini файле и организуем вывод заголовка <?php echo JText::_('MOD_FASTJOB_ARTICLEINMODULE_ARTMARKS_LABEL'); ?>

 Теперь нам только нужно организовать цикл вывода всех меток в соответствующий блок.

 <?php for ($i = 0; $i < count($marks); $i++)
        {
            echo '<span><a href="/component/search/?searchword='.$marks[$i].'">'.$marks[$i].'</a></span>';
        }
?>

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

Работа по написанию кода почти завершена. Нам осталось только организовать вывод рисунка и ссылки Подробнее в блоке вывода материала.

Давайте начнем с рисунка. Информацию о рисунках в материале и в частности об изображении для вступительного текста материала можно получить разными способами, но у нас уже есть строка $article_data['images'], с которой можно тоже неплохо поработать.

 $img_data = preg_split("/(:|,)/s",$article_data['images']);
if (substr($img_data[1],1,-1))
{
    $img_intro = explode('\\',substr($img_data[1],1,-1));
}

 Немного поясню что я сделал. Так как изображение вступительного текста идет всегда первым по списку, то разбив строку на элементы по двум параметрам, получим, что второй по счету элемент - это путь, который нам и нужен. Во второй строке мы просто избавляемся от кавычек и разбиваем $img_data[1] на элементы пригодные для составления ссылки. Теперь все что нам осталось - сформировать ссылку.

 <?php if ($img_intro) { echo '<img src="/'; for ($i = 0; $i < count($img_intro); $i++) { echo $img_intro[$i]; }; echo '" />'; } ?>

 Ну и последний штрих, вывод ссылки на полный текст материала. Пожалуй опишу один из вариантов сформировать ссылку на статью, для этого нам понадобится ID материала, алиас и ID родительской категории.

 <?php
    echo '<a href="/?option=com_content&view=article&id='.$article_id.':'.$article_data['alias'].'&catid='.$article_data['catid'].'">'.JText::_('MOD_FASTJOB_ARTICLEINMODULE_MORE_LABEL').'</a>';
?>

 Это самый простой вариант вывода ссылки на материал, но конечно у него есть ряд недостатков, самый главный из которых - ссылка на материал будет совсем не ЧПУ. Но думаю, что приложив небольшие усилия читатель данной статьи сможет и самостоятельно изменить данный кусочек кода и получить в результате ссылку нужного вида.

Ну вот собственно и все, осталось только прописать css-стили для нашего молуля.

Пример работы модуля:



Модуль для Joomla - вывод материала в позицию модуля - Часть 2

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

Для начала необходимо поработать над структурой и отображением элементов модуля, все должно быть как на рисунке:

Подробнее
20 января 2014 г.
Зольников Сергей Владимирович Категория: Мой блог Описание: Модуль для Joomla - вывод материала в позицию модуля - Часть 2 Просмотров 3982

Скачать модуль можно отсюда или отсюда.

Также можно почитать:



Оставить комментарий: