2009 16 августа

Модифицируем стандартный mod_latestnews

Зачастую нам требуется вывод простейший новостей, но стандартный модуль mod_latestnews версии движка 1.5 умеет показывать лишь заголовок. Начинаются поиски мега модулей для решения элементарной задачи. В этом примере расскажу как с помощью легкой модификации стандартного модуля вывести следующие данные: заголовок материала, дата создания, вступительный текст, ссылку "читать далее"
Итак мы будем работать с двумя файлами modules\mod_latestnews\helper.php - подготовка данных (дальше хелпер) modules\mod_latestnews\tmpl\default.php (дальше шаблон) Открываем хелпер, находим строку
1
$lists[$i]->text = htmlspecialchars ( $row->title );
под ней сразу добавляем
1
2
$lists[$i]->created = JHTML::_('date', $row->created, JText::_('DATE_FORMAT_LC2'));
$lists[$i]->introtext = strip_tags ( $row->introtext );

Комментарии:

1 - конструкция DATE_FORMAT_LC2 используется чтобы привести выводимую дату к приличному виду, смотрим файл language\ru-RU\ru-RU.ini самое начало (можем изменить формат) и читаем справку по функции date 2 - функция strip_tags используется, чтобы избавить вступительный текст от всего HTML мусора, что хорош в режиме блога, но очень мешает в обычном модуле Дальше переходим к шаблону, сразу приведу общий текст, сравнивайте с оригинальным и делайте выводы
1
23
45
67
89
1011
12
<ul class="latestnews<?php echo $params->get ('moduleclass_sfx'); ?>">
<?php foreach ($list as $item) :  ?>        <li class="latestnews<?php echo $params->get ('moduleclass_sfx'); ?>">
                <span class="date"><?php echo $item->created; ?></span>                <a href="<?php echo $item->link; ?>" class="latestnews<?php echo $params->get ('moduleclass_sfx'); ?>">
                <?php echo $item->text; ?></a>                <br />
                <?php echo $item->introtext; ?>                <a href="<?php echo $item->link; ?>" title="read more">read more</a>
        </li><?php endforeach; ?>
</ul>

Комментарии:

1 - если мы не используем на сайте многоязычность, то фразу "read more" можно написать по русски но не забыть сохранить файл в кодироке UTF-8 2 - справка по используемым элементам массива
1
23
45
echo $params->get ('moduleclass_sfx'); // CSS суффикс, заданный в настройках модуля
echo $item->text;  // заголовок материалаecho $item->introtext; // текст вступительный материала
echo $item->created;  // дата создания материалаecho $item->link; // ссылка на полный текст материала

Пара примеров модификаций

Интро текст у нас в 500 слов а мы хотим выводить первые 200 символов, но аккуратно обрезать последнее слово а не посередине, потому функция примитивная, первый параметр - вхождение собственно текста ($row->introtext в цикле нашего хелпера), второй - количество символов, по которому будем обрезать)
1
23
4
function NewsCrop ($text, $str_len ) {
        $textCrop = strip_tags (mb_substr ($text, '0', $str_len) );        return $textCrop;
}
Пример применения примерно такой
1
2
$str_len = '200';
$lists[$i]->introtext = NewsCrop ($row->introtext , $str_len);
Дальнейшие возможные модификации безграничны (элементарные знания php + sql необходимы), но для большинства хотелок этого должно быть достаточно, временные затраты 5 минут и все готово. На пиво принимаю в профиле :) Кросспост на joomlaforum

Комментарии

0 voland пишет нам 02.09.2009 16:12
Это хорошо, но блин решение с хаком :-(
Цитировать Сообщить модератору
0 Beliyadm отвечает 02.09.2009 17:21
Что нам мешает поменять название модуля, функции и оформить его как отдельный модуль? Правильно, ничего не мешает :)
Цитировать Сообщить модератору
0 voland отвечает 02.09.2009 17:29
уже это сделал :-)
Цитировать Сообщить модератору
0 voland пишет нам 02.09.2009 17:28
Собственно воодушевившись статье написал свой модуль - http://joomla15.ru/программирование/модули/61-mod-latestnews-date.html
Цитировать Сообщить модератору
0 Пётр пишет нам 20.02.2010 15:31
Ай-я-яй! Зачем ошибку сделали? <a href="link; ?"> Не ?"> , а "?> =)))))))
Цитировать Сообщить модератору
0 Beliyadm отвечает 20.02.2010 15:37
Прошу прощения, очепятка, поправил кавычки
Цитировать Сообщить модератору
0 Пашка пишет нам 21.02.2010 10:56
Цитирую: \"modules\\mod_latestnews\\tmpl\\default.php (дальше шаблон)\" Модуль можно править из шаблона, для этого в папке шаблона создаём папку с именем mod_latestnews а в неё копируем default.php из modules\\mod_latestnews\\tmpl\\ И меняем.
Цитировать Сообщить модератору
0 Edan отвечает 10.04.2010 18:36
Добрый день а скажите пожалуйста а куда нужно вставить строки function NewsCrop ($text, $str_len ) { $textCrop = strip_tags (mb_substr ($text, '0', $str_len) ); return $textCrop; } $str_len = '200'; $lists[$i]->introtext = NewsCrop ($row->introtext , $str_len); Чтоб ограничить вывод количества букв
Цитировать Сообщить модератору
0 Beliyadm отвечает 10.04.2010 19:05
В хелпер модуля и внутри цикла при формировании массива обращаться уже к этой функции
Цитировать Сообщить модератору
0 nastya пишет нам 07.05.2010 13:54
все. справилась. нельзя было копипэйстить, надо было ручками все набрать..
Цитировать Сообщить модератору
0 Павел пишет нам 10.05.2010 03:20
А можно ли сделать так, чтобы выводилось название категории? Пробовал делать, но не получилось, не смог понять как взять заголовок категории из таблицы БД.
Цитировать Сообщить модератору
0 Beliyadm отвечает 10.05.2010 14:24
Можно конечно, смотрите какой алиас задается для таблицы категорий и как называется в ней поле с названием, в селекте указываете это поле и задаете для него алиас AS catname чтобы не запутаться, далее в цикле просто работе с row->catname вот и будет название категории
Цитировать Сообщить модератору
0 Michael пишет нам 26.10.2010 19:54
А можно каким-то образом выводить еще и имя автора? Или, кроме text, introtext, created и link, другие элементы не могут быть использованы в этом модуле?
Цитировать Сообщить модератору
0 Beliyadm отвечает 26.10.2010 20:09
Выводить можно любые поля, содержащиеся в таблице _content, если через JOIN в SQL запрос добавлять прочие связанные таблицы по каким-либо полям - то и любые данные из них.
Цитировать Сообщить модератору
0 Michael пишет нам 27.10.2010 03:33
Спасибо за ответ! Я боюсь, моих знаний в этой области недостаточно. Я провел несколько часов, пытаясь изменять стандартные файлы модуля, но безрезультатно. Если вас не затруднит, могли бы вы, пожалуйста, объяснить на примере, как добавить новое поле (больше всего меня интересует поле с именем автора)?
Цитировать Сообщить модератору
0 Beliyadm отвечает 27.10.2010 12:45
Так я и писал статью, как добавить вывод поля из таблицы контента. Замените в примере (или добавьте по аналогии) created на нужное поле таблицы #__content, посмотреть название поля можно с помощью phpmyadmin. Для добавления именно имени автора нужно подключить дополнительную таблицу users и связывать через created_by (если не ошибаюсь) таблицы контент, в этом поле хранится идентификатор пользователя
Цитировать Сообщить модератору
0 Ned пишет нам 20.11.2010 15:22
А мне очень хочеться сделать чтобы этот модуль выводил новости в 2 колонки.. КАК? там идет разбор массива функцией foreach(){ как бы в теле организовать так чтобы сперва одна новость слева, а потом вторая справа } endforeach;
Цитировать Сообщить модератору
0 Beliyadm отвечает 20.11.2010 16:24
Достаточно средствами CSS задать класс диву одной новости и в стилях прописать что-то вроде float: left; width: 50%, я обычно так делаю чтобы вывести две новости в две колонки рядом друг с другом Хотя можно заморочится и в итерациях цикла добавлять идентификатор, отслеживая четность и размещать что где нужно
Цитировать Сообщить модератору
0 SaniokUA пишет нам 23.04.2011 17:37
Как добавить картинку новости к етому фаршу? в уменешеном режиме...??
Цитировать Сообщить модератору
0 Beliyadm отвечает 23.04.2011 17:39
Добавить легко, но смотря где она изначально находится
Цитировать Сообщить модератору
0 Mayler пишет нам 24.11.2011 04:17
У меня почему-то текст обрезается на середине слова, а на конце никак не хочет! Подскажите по подробней что за это отвечает.
Цитировать Сообщить модератору
0 Юрий пишет нам 30.11.2011 14:12
Подскажите пожалуйста, у меня работало все нормально, а теперь проблема: Есть новости разделенные на две категории(или подраздела) "Нормативные документы" и "Все документы", так вот "Все документы" перестала быть активной (перестала быть ссылкой), а ведь все работало.. Подскажите где исправить, или что настроить, ума не приложу. (вроде мелочь но не могу справиться). посмотреть можно на сайте http://informstroi.ru С уважением, Юрий
Цитировать Сообщить модератору
0 Beliyadm отвечает 23.12.2011 16:27
Хм, а причем здесь модуль материалов и мой пример модификации?
Цитировать Сообщить модератору
0 Дмитрий пишет нам 13.01.2012 01:39
А как вывести картинку которая идет у меня в материале перед текстом?
Цитировать Сообщить модератору
0 Beliyadm отвечает 13.01.2012 01:41
$test = 'text22alttext

text222

'; preg_match_all('/<\s*img\s+src\s*="\s*("[^"]*"|\'[^\']*\'|[^"\s]+)(.*?)>/i', $test, $result); echo JURI::base().$result[1][0];
Цитировать Сообщить модератору
0 Beliyadm отвечает 13.01.2012 01:45
Прошу прощения, парсер лох, обновите комментарии. Да и на форуме уже ответил аналогичным образом
Цитировать Сообщить модератору
0 Дмитрий отвечает 13.01.2012 01:48
Серавно не понял :) Там де переменная $test заменить на $item->introtext?? preg_match_all('//i', $item->introtext, $result); echo JURI::base().$result[1][0];
Цитировать Сообщить модератору
0 Beliyadm отвечает 13.01.2012 01:49
Дал $test как пример строки, точно также работать с элементом массива, полученным из запроса, $item->introtext
Цитировать Сообщить модератору
0 Дмитрий отвечает 13.01.2012 01:56
объясните пожалуйста подробней, а то я не селен в пхп, как мне в $item->introtext засунуть картинку которая идет в матереали перед текстом?
Цитировать Сообщить модератору
0 Beliyadm отвечает 13.01.2012 02:06
Вам не надо ничего засовывать, из запроса получили introtext, в массиве foreach он у нас оказывается как элемент, внутри этого элемента и текст и картинка. То есть в итоге у нас должно получится что-то вроде следующего
foreach ( $rows as $row ) {
preg_match_all('/<\s*img\s+src\s*="\s*("[^"]*"|\'[^\']*\'|[^"\s]+)(.*?)>/i', $row->introtext, $result);
$lists[$i]->introIMG = JURI::base().$result[1][0];
После этого в шаблоне модуля мы можем оперировать
 
introIMG ; ?> 
и подставлять это значение в SRC для изображения

Цитировать Сообщить модератору
0 Beliyadm отвечает 13.01.2012 02:08
Дико извиняюсь, конечно же правильный первый кусок будет выглядеть так
foreach ( $rows as $row ) {
preg_match_all('/<\s*img\s+src\s*="\s*("[^"]*"|\'[^\']*\'|[^"\s]+)(.*?)>/i', $row->introtext, $result);
$lists[$i]->introIMG = JURI::base().$result[1][0];
Цитировать Сообщить модератору
0 Дмитрий отвечает 13.01.2012 02:13
Спасибо большое! Но есть момент урл выходит такого вида http://адрес сайта/http://адрес сайта/images/stories/news1.jpg то есть $item->introIMG=http://адрес сайта/http://адрес сайта/images/stories/news1.jpg Как убрать дублирование вначале?
Цитировать Сообщить модератору
0 Дмитрий пишет нам 13.01.2012 02:20
Спасибо большое еще раз! $lists[$i]->introIMG = $result[1][0];
Цитировать Сообщить модератору
0 Beliyadm отвечает 13.01.2012 02:22
Не за что, просто не всегда в материалах картинки идут с полным адресом, потому для уверенности добавляю JURI::base(), но это зависит от сайта, можно и без.
Цитировать Сообщить модератору
0 Дмитрий отвечает 13.01.2012 02:24
Я просто в редакторе поставил в настройках ссылки - абсолютный путь..
Цитировать Сообщить модератору
0 Алексей пишет нам 23.11.2012 20:12
не работает, ошибка $textCrop = strip_tags (mb_substr ($text, ’0′, $str_len) );. И ручками вводил и так.
Цитировать Сообщить модератору
0 Beliyadm отвечает 23.11.2012 20:16
Какая именно ошибка?
Цитировать Сообщить модератору
0 Алексей пишет нам 27.11.2012 01:16
Fatal error: Call to undefined function mb_substr() in S:\home\joomla.loc\www\modules\mod_latestnews\help er.php on line 21 j 1.5 vm 1.1.9
Цитировать Сообщить модератору
0 Beliyadm отвечает 27.11.2012 01:23
Значит на хостинге отсутствует поддержка функций работы с многобайтовыми строками (mb_substr и другие). Смотреть в настройках хостинга, возможно там есть опция подключения, либо обращаться в техподдержку
Цитировать Сообщить модератору
0 Алексей отвечает 27.11.2012 01:28
К сожалению у меня сайт пока на локалке, в таких случаях есть какие нибудь варианты? Неужели только у меня такая проблема!? Спасибо за быстрый ответ.
Цитировать Сообщить модератору
0 Beliyadm отвечает 27.11.2012 01:47
Видимо да, даже у денвера в коробке есть эта библиотека. Проверьте, на всякий случай, в phpinfo есть ли поддержка. Если нет - читать ниже. Находите библиотеку php_mbstring.dll (можно взять из папки ext этого архива http://windows.php.net/downloads/releases/php-5.3.19-Win32-VC9-x86.zip) Стопорите сервер, кладете в каталог расширений php (смотря как сконфигурирован сервер, в денвере это \usr\local\php5\ext), в файле php.ini раскомментируете строку extension=php_mbstring.dll, запускаете сервер. Вообще странно, как у вас без поддержки mbstring вообще движок ошибок не выдал раньше
Цитировать Сообщить модератору
0 Алексей отвечает 27.11.2012 02:39
в phpinfo в Registered Stream Filters , если тут то поддержка есть. Т.к. я не знаком с phpmyadmin. После раскоментирования при запуске денвера выдал ошибку: "Точка входа в процедуру zend_ini_string_ex не найдена в библиотеке DLL php5ts.dll."
Цитировать Сообщить модератору
0 Beliyadm отвечает 27.11.2012 02:44
php5ts.dll - вообще другая библиотека, я про нее ни слова не говорил PHPAdmin здесь вообще ни при чем В phpinfo надо смотреть информацию для mbstring, Multibyte Support должно быть enabled
Цитировать Сообщить модератору

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

Защитный код
Обновить