Откомменченное

1377
2011 16 ноября

Использование SQL запросов для формирования выпадающих списков в XML

Использование SQL запросов для формирования выпадающих списков в XML

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

Данная статья актуальна для версий движка 1.61.7
Для !J1.5 стоит ознакомиться с статьями http://docs.joomla.org/Sql_parameter_type и http://docs.joomla.org/Parameter (в этой версии движка использовались параметры и немного другой синтаксис)
Общий список типов полей для форм можно найти здесь http://docs.joomla.org/Standard_form_field_types (англ)


Перечень параметров формирования выпадающего списка в XML

  • type (обязательно) обязательно должно быть sql.
  • name (обязательно) уникальное имя поля. Должно совпадать с именем столбца из результатов выборки в запросе, либо же возможно использование другого имени, указанного в value_field.
  • label (обязательно) (возможно использование значений из языкового файла) описание данного поля.
  • query (обязательно) SQL запрос, который формирует данные для выпадающего списка. Запрос должен обязательно возвращать два значения. Первое, value (можно переопределить в key_field) содержит значения для поля value элемента формы. Второе может быть названо как угодно (название можно переопределить атрибутом value_field) содержит отображаемый текст элементов списка.
  • default (опционально) значение по умолчанию. Соответствует полю 'value', либо переопределенному атрибуту key_field.
  • description (опционально) (возможно использование значений из языкового файла) текст отображаемый в всплывающей подсказке при наведении на выпадающий список.
  • key_field (опционально) если не задан – используется имя столбца из запроса, определенное как value. Либо же можно определить свой алиас столбца запроса для value и назначить его этому атрибуту.
  • value_field (опционально) имя столбца, которое формирует отображаемые значения выпадающего списка. Если не задан – будет использоваться столбец с тем же именем, что и name

Несколько примеров использования в XML:

1
<field name="title" type="sql" default="10" label="Select an article" query="SELECT id AS value, title FROM #__content" />

Обратите внимание, что в данном примере нам необходимо использовать конструкцию AS, чтобы определить значение поля value, поскольку таблица jos_content в качестве первичного ключа содержит столбец ID, но не VALUE. Большинство же таблиц, испольлзуемых Joomla имеют столбец первичного ключа с названием VALUE. Кроме того всегда можно использовать атрибут key_field для определения столбца

1
<field name="title" type="sql" default="10" label="Select an article" query="SELECT id, title FROM #__content" key_field="id" />

Данный пример вернет идентичный, по сравнению с предыдущим, результат.

Далее мы хотим дать нашему полю имя не title, а MyField. Для этого нам нужно использовать алиас AS в SQL запросе

1
<field name="myfield" type="sql" default="10" label="Select an article" query="SELECT id AS value, title AS myfield FROM #__content" />

Либо альтернативный вариант с переопределением атрибута value_field.

1
<field name="myfield" type="sql" default="10" label="Select an article" query="SELECT id, title FROM #__content" key_field="id" value_field="title" />

Также можно использовать стандартные конструкции t-sql. К примеру мы хотим в выпадающем списке видеть дату создания рядом с названием статьи

1
<field name="title" type="sql" default="10" label="Select an article" query="SELECT id, ( title, ' - ', created) AS title FROM #__content" />

Примечание: все выражения SQL будут работать только на той базе данных, что использует данная инсталляция движка (обычно это MySQL). Нет никакой возможности писать запросы к другим базам (пусть и в пределах одного сервера)

Примечание: Префикс таблиц в данных конструкциях указывается в виде #_, при выполнении он будет автоматически заменен на префикс таблиц базы данных, используемых движком

1519
2011 16 ноября

Создаем RSS ленту для всех материалов контента в Joomla 1.7

Создаем RSS ленту для всех материалов контента в Joomla 1.7

Все мы прекрасно знаем (я надеюсь на это), что в движка Joomla с версии 1.5 и выше нельзя сделать блог материалов из нескольких категорий. В 1.0.х можно было через ctrl выделить категории и счастье в блоге.
Почему это может огорчать в 1.7 (при грамотном подходе к структуре сайта, естественно)? Потому что штатными средствами у нас не получается сделать RSS ленту всех материалов сайта.
Штатный модуль "Syndication Feeds" формирует ленту только на основе отображаемых на странице материалов, а значит только по отдельным категориями. Нам это не подходит.
И выход есть.


Наши действия для достижения дзен

  • Создать корневую категорию "TopLevel", к примеру, её указать родителем для всех других категорий контента
  • В неопубликованном на сайте меню создать ссылку типа "Блог категории" на наш корневой уровень, при использовании штатного SEF можно дать алиас, вроде "rssarticles"
  • В настройках этого меню выставить параметр "Включать подкатегории" == "да" на вкладке "Параметры макета Блога" (см. скрин ниже)
  • На время опубликовать модуль меню с этой ссылкой и штатный модуль "Syndication Feeds", перейти по его ссылке и запомнить выдаваемый URL, к примеру он может выглядеть так http://site.ru/index.php/rssarticles?format=feed&type=rss. Снять с публикации модуль RSS и переместить модуль меню на неопубликованную позицию
  • В любом месте сайта создать иконку-ссылку на ленту RSS, указав в качестве источника полученный URL
Создаем RSS ленту для всех материалов контента в Joomla 1.7
1034
2011 30 октября

Произвольный HTML в стандартных контактах Joomla 1.7

Очередной раз очередные грабли. Итак банальщина - нужно добавить в контакты движка версии Joomla 1.7.xx штатными средствами, к примеру, фрагмент карты с google maps (или откуда еще). Требуемый код выглядит так:
1
<iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.ru/maps?hl=ru&q=cathbxtcrbq+rjym&lr=&ie=UTF8&t=h&vpsrc=6&source=embed&ll=55.354135,40.297852&spn=0.149233,0.334396&z=12&output=embed"></iframe><br /><small><a href="http://maps.google.ru/maps?hl=ru&q=cathbxtcrbq+rjym&lr=&ie=UTF8&t=h&vpsrc=6&source=embed&ll=55.354135,40.297852&spn=0.149233,0.334396&z=12" style="color:#0000FF;text-align:left">Просмотреть увеличенную карту</a></small>
Даже при отключенном визуальном редакторе этот код режется до стандартного html при вставке в поле "дополнительная информация" (misc info). Решение - открыть файл administrator\components\com_contact\models\forms\contact.xml, найти блок для
1
<field name="misc" ... >
и заменить фильтр safehtml на raw. В итоге выглядит так
1
23
45
67
8
<field name="misc" type="editor"
                        label="COM_CONTACT_FIELD_INFORMATION_MISC_LABEL"                        description="COM_CONTACT_FIELD_INFORMATION_MISC_DESC"
                        class="inputbox"                        filter="raw"
                        buttons="true"                        hide="readmore,pagebreak"
                         />
Все, код сохранился, карта видна.
936
2011 06 октября

Обновляем Joomla 1.6.5 до Joomla 1.7

Обновиться до версии Joomla 1.7 теперь можно в одно действие, если ваш текущий сайт работает под управлением версий 1.6.5 либо 1.6.6 Если ваш сайт работает на базе движка более ранней версии или же вы предпочитаете другие пути обновление, ознакомьтесь с следующими вариантами:
  • Традиционное обновление при помощи Менеджера расширений
  • Обновление сайтов под управлением версий младше 1.6.5 (линейка 1.6)
  • Ручное обновление для 1.6.5/1.6.6 до 1.7
  • Переход с Joomla 1.5 до Joomla_1.6 +
Полный текст статьи можно прочитать по ссылке
825
2011 05 октября

Склонения в датах (joomla 1.7)

По аналогии с статьей для 1.0, но еще проще можно сделать склонения дат для Joomla 1.7. Открываем файл language\ru-RU\ru-RU.ini и находим строки примерно с 222 - идут предустановленные форматы дат. Если при выводе информации использовать уже существующий формат DATE_FORMAT_LC3 то на выходе получается "10 Июль 2010". Не очень красиво, согласен, в таком случае в том же файле чуть ниже находим определение строк с наименованиями месяцев, среди них редактируем все, которые без "_SHORT", превращая
1
JANUARY="Январь"
в
1
JANUARY="Января"
и так далее. На этом все, везде, где дата выводится через LC3
1
JHtml::_('date',$this->item->publish_up, JText::_('DATE_FORMAT_LC3'))
будет корректно написано: "10 Июля 2010" Либо вы можете создать свой собственный формат вывода даты, к примеру:
1
DATE_FORMAT_LC5="d F Y H:i"
что будет создавать строку "10 Июля 2010 23:50"
3288
2011 28 сентября

Модуль последних сообщений с SMF 2.0 stable and Joomla 1.7 версия 1.3.0

Версия модуля mod_latestsmf 1.3.0 для Joomla 1.7 и SMF 2.0 stable Обязательные требования: 1 – после установки модуля указать в настройках абсолютный путь к файлам форума DOCUMENT_ROOT/smf_path/ (слеш на конце обязателен) 2 – наличие на сервере библиотеки mb_substr 3 – форум должен быть установлен с указанием кодировки UTF-8 (на 1251 не тестировал, ничего не могу сказать) Возможности модуля: - выборка либо последних сообщений либо последних тем форума - указание количества объектов - количество выводимых символов (если работать в режиме последних тем, то больше 240 символов в теле сообщения выводить нельзя) - 6 предустановленных форматов даты Обсуждение модуля на JoomlaForum Скачать: mod_lastsfm_1.3.0
4456
2011 14 апреля

Всплывающее окно авторизации (jquery)

Не знаю, почему вспомнил про такую банальщину, но в блоге снова недавно спросили "а как сделать по клику на сайте всплывающий блок с формой авторизации". Потому, как это ни пошло выглядит, опишу пару элементарных действий. Код на основе Jquery, на mootools переписать желающим проблем нет.
Итак по порядку 1 - создаем новую позицию вывода модуля, к примеру, "login", на ней публикуем модуль авторизации, задаем суффикс класса модуля "-login" 2 - в шаблоне index.php сразу после открытия прописываем вывод
1
<jdoc:include type="modules" name="login" style="xhtml" />
3 - в хедере индекса шаблона пишем (код для примера)
1
23
45
67
89
1011
12
<script type="text/javascript">
                $(document).ready(function(){                        $("#modloginajax").click(function () {
                                $(".moduletable-login").slideToggle("slow");                        });
                });                $(document).ready(function(){
                        $("#login_closs_ico").click(function () {                                $(".moduletable-login").slideToggle("slow");
                        });                });
</script>
Первый блок отвечает за поведение какой-либо ссылки в теле страницы, у которой задан id="modloginajax", располагать эту ссылку можно где угодно, в моем случае она зашита в модуль поиска и выглядит так (return false зачем прописан объяснять не буду, чтобы при поддержке JS не было перехода на ссылку, а если поддержки нет - чтобы переход работал)
1
23
45
67
8
<?php
$user =& JFactory::getUser(); if (!$user->id) {
?><a href="<?php echo JURI::base(); ?>/login.html" title="Авторизация" id="modloginajax" onclick="return false;">Вход</a>
<?php } else  { ?><a href="<?php echo JURI::base(); ?>/login.html" title="Выход <?php echo $user->username; ?>" id="modloginajax" onclick="return false;">Выход</a>
<?php } ?>
Второй блок кода отвечает за поведение кнопки "закрыть окно", у меня это картинка с id="login_closs_ico", зашитая в шаблон модуля авторизации до начала всех условий
1
<img src="close.png" alt="Закрыть" title="Закрыть" id="login_closs_ico" />
Ну и немного CSS кода (оформляем как угодно)
1
23
45
67
8
.moduletable-login {
        display: none; right: 30px; top: 80px; width: 300px;        z-index:1000;
        position: absolute;        background-color: #fff; border: 1px solid #8CC2DB;
        padding: 5px 10px 5px 10px;}
#login_closs_ico {position: absolute; right: 15px; top: 10px; cursor: pointer;}
Банальщина полная, конечно же, но мало ли кому пригодится, а то ставят мега модули с кучей кода, когда все решается элементарно. Как выглядит в работе можно посмотреть на http://rcoi.net/ справа вверху под поиском ссылка "вход"

Другой способ реализации от Fedor

Вместо
1
2
<img src="close.png" alt="Закрыть" title="Закрыть" id="login_closs_ico" />
<div id="login_closs_ico"></div>
Стиль
1
23
45
67
89
#login_closs_ico {
position: relative;right: 15px;
top: 10px;width: 15px;
height: 16px;cursor: pointer;
background-image: url(data:;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAQCAYAAADJViUEAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGmSURBVHjafJO9isJAEMcnMSIqh/HQRkEUe5/A9xAEe9/CRhALa7ETEXwEBW0srazlChFFTbEx5Pw6gs7NLpfgetE/DNmd2d/sZHZXud/vXwCgk4GiKOBqvV5DOByGRCIh5ogoxUkWEGyjj0zTxEajgcfjUcxpnRfjY86plMEBH8XjcTAMA5rNJryQw3dm+EKdTgd1XUfGfJcwFd7Itm2wLAvm87lv/C08HA7Fd7vdSn7ePAE/dtB1co3HY5hOp2IcDAYl2GW0Z+dut4NutwvtdhtutxuoqgrpdNq/tMeG9Xo9zGazfHvPYrEYbjYb34bxUgVcr9clyDXaWSR9CQ8GA7GwUChgtVrFWq2G5XLZS0Bl42Kx+A/TGbJisYj0j3i5XKRoq9XCaDQqEuRyOaQmyvBkMmGj0UiCHq/ibDbDSqWCyWRSXJhSqYT9fh/3+z1TVqsVy2Qyn8+NfH4I/BSWyyXQXYdUKgX5fN5UTqcTfxgfVJ4vfL1e4XA4wPl8Fn7+0vhasm8tFAoZFPjhZxoIBDyIm+M4AtY0DahkiEQiAv5Lbv0KMABkx7NcfuTtxgAAAABJRU5ErkJggg==);}
Здесь кодируем к примеру наше изображение http://www.askapache.com/online-tools/base64-image-converter/ Результат на 1 один запрос меньше, css кешируется Кнопка закрытия в данном случае с вашего примера
1325
2010 14 декабря

Download DatsoGallery free all version

Оригинальная тема на форуме Note: DatsoGallery based on component Akogallery 2.1 by Arthur Konze. This component (Akogallery) released under the GNU/GPL License. In terms of the GNU/GPL turns out that DatsoGallery is GNU/GPL licensed and distributed free of charge. Версия 1.8.8 Скачать архив 4.66 Mb (Спасибо Aquarius за организацию доставки). Подробности содержимого архива в продолжении материала
3920
2010 07 марта

Создание новых стилей вывода модуля в файле modules.php

В шаблонах для движка 1.5 вставка позиции модуля происходит следующим образом
1
<jdoc:include type="modules" name="left" style="xhtml" />
Если с полем name все понятно (имя позиции из списка созданных в XML файле шаблона), то вот с полем style частенько возникают вопросы - что это, зачем и что можно с ним делать. Разберем сначала вывод хтмл по умолчанию при стиле XHTML - в исходном коде получается следующее
1
23
4
<div class="moduletable">
<h3>заголовок модуля</h3>тело модуля
</div>
А что же нам делать, если хотим чуть усложнить структуру, дабы вписаться в разработанный дизайн либо иное? Все очень просто.
Мы идем в папку шаблона, в ней видим (и если не видим то создаем папку [b]html[/b]), в ней находим (а если не находим то создаем файл [b]modules.php[/b]). В нем к примеру пишем такую функцию
1
23
45
67
89
1011
12
function modChrome_mycustomdiv($module, &$params, &$attribs)
{        $headerLevel = isset($attribs['headerLevel'])? (int) $attribs['headerLevel'] : 3;
        if (!empty ($module->content)) : ?>                <div class="mycustomdiv<?php echo $params->get('moduleclass_sfx'); ?>">
                        <?php if ($module->showtitle) : ?>                                <div class="mycustomdivtitle"><h3><?php echo $module->title; ?></h3></div>
                        <?php endif; ?>                        <?php echo $module->content; ?>
                </div>        <?php endif;
}
И в шаблоне index.php для style теперь указываем значение mycustomdiv. То есть имя функции обязательно должно начинаться с modChrome_ а то что после подчеркивания нужно использовать в качестве значения style при выводе в шаблоне
1
<jdoc:include type="modules" name="left" style="mycustomdiv" />
В итоге у нас хтмл вывод будет таким
1
23
4
<div class="mycustomdiv">
<h3>заголовок модуля</h3>тело модуля
</div>
По порядку, что мы здесь видим: $params->get('moduleclass_sfx') - суффикс модуля, заданный в его настройках $module->showtitle - заголовок модуля и соответственно проверку условия, если в настройках отмечен к показу - то выводим в тегах h3 $module->content - тело модуля, зависит от хелпера модуля либо других вариаций вывода
1046
2010 15 февраля

Убираем ошибку с дублированием id=current в стандартном mod_mainmenu

Убираем ошибку с дублированием id=current в стандартном mod_mainmenu Если на сайте используется несколько модулей меню на основе стандартного mod_mainmenu - мы получаем досадную ошибку валидации - для каждого активного пункта меню UL LI создается id="current" (в случае создания связанных меню, многоуровневых либо просто дублирование модуля) Лечится просто - в файле templates/шаблон/html/mod_mainmenu/default.php (что это такое и что делать если такого файла нет - объяснять не буду, читаем документацию по шаблонизации движка) находим строку примерно 71
1
$node->addAttribute('id', 'current');
и заменяем на
1
$node->addAttribute('id', 'current'.$id);
Теперь у нас к каждому current добавляется идентификатор itemid и достигаем дзена в плане валидации страницы
1504
2009 09 ноября

Стандартный SEF в Joomla 1.5 и с чем его едят (miniFAQ)

logo В линейке 1.5 появилась замечательная вещь – создание SEF ссылок стандартным образом, без использования сторонних компонентов. В компонентах за поддержку данной возможности отвечает специальной файл router.php, в стандартных он существует, но не все разработчики сторонних компонентов включают эту возможность в свои расширения. Для активации этой прекрасной опции необходимо включить три переключателя (скрин и примеры ниже) и переименовать файл htaccess.txt в .htaccess (да да, именно так - с точкой вначале. Стандартный файловый менеджер windows "explorer" может не позволить этого сделать, тогда следует использовать сторонние менеджеры - TotalComm-r, Far, DOpus и подобные). При этом если мы используем все три опции – необходимо чтобы на сервере была поддержка mod_rewrite (убедиться можно посмотрев страницу «админка – помощь – информация о системе - информация PHP» либо обратиться в службу поддержки хостинга)

1120
2009 25 октября

Модуль AJAX поиска по сайту (Joomla 1.5, Jquery, com_content only)

jquery1 По мотивам инструкции сообразил на быструю руку бета версию реализации поиска на сайте без ручного ковыряния файлов - ajaxSearchJquery_beta 1.0 Рабочая версия в демонстрации (верхний правый угол сайта)
Установка: 1 - качаем архив с расширениями тут http://www.pbelkov.net/ajaxsearch.zip 2 - распаковываем на локальном диске 3 - устанавливаем компонент com_ajaxsearch 4 - устанавливаем и публикуем на нужной позиции модуль mod_ajaxsearch Внимательно: 0 - поиск только по стандартным материалам (заголовок, вступительный текст) 1 - это пока бета рабочей версии, потому на свой страх и риск 2 - функционал основан на Jquery (под мутулз пусть энтузиасты переписывают), если библиотека ранее подключается на сайте - можно выключить в настройках модуля 3 - результат поиска выводится в диве id="suggestions" (сейчас заложен в шаблоне модуля), можно переместить в любое другое место сайта и поправить CSS (files\ajaxsearch.css в модуле). P.S. на вопросы " как перенести див и\или настроить позиционирование" стараюсь не отвечать 4 - если результатов несколько - строкам присваиваются классы odd\even, оформление базово заложено в CSS модуля 5 - поиск производится по заголовку и вступительному тексту материала, кому надо - ковыряем файл components\com_ajaxsearch\ajaxsearch.php 6 - подсветка с классом highlight для искомого запроса работает только если найдено соответствие в заголовке, по умолчанию модуль выводит только его 7 - поиск стартует с вводом первого символа P.S. фишка для энтузиастов, кому было нужно разобрались бы и по инструкции, потому на вопросы 1-го класса по возможности не отвечаю Тема на joomlaforum
1632
2009 23 октября

Структура шаблона com_content

Структура шаблона com_content Рассмотрим по очереди все заложенные возможности шаблона стандартных материалов компонента com_content. Для затравки можно взять содержимое папки \templates\beez\html\com_content\ и положить в свой шаблон. Там конечно не все идеально, но данный стандартный шаблон построен на div и имеет все вьюшки контента. Кому есть чем дополнить (либо поправить если где ошибаюсь) - милости просим
Содержимое данного каталога представлено в виде 4-х папок с соответствующими шаблонами представлений
  • article
    • default.php - - собственно оконечная страница материала (view=article), отрабатывает плагины на событие afterDisplayContent
    • form.php - стандартная форма добавления материала с фронтенда
  • category
    • blog.php - материалы категории в формате блога как бы общий каркас (view=category&layout=blog): описание категории, разбиение на колонки, ссылки типа "еще", постраничная навигация
    • blog_item.php - связан напрямую с blog.php - показывает непосредственно элемент статьи формата блог: заголовок, даты, автор, вступительный текст, подробнее, отрабатывает плагины на событие afterDisplayContent
    • blog_links.php - связан напрямую с blog.php, показывает ссылки типа "еще", по умолчанию в формате UL LI
    • default.php - список материалов категории (view=category): заголовок категории, описание, вывод материалов категории в виде таблицы
    • default_items.php - связан напрямую с default.php - формирует таблицу материалов (номер, заголовок, дата, хиты), фильтры над таблицей, постраничную навигацию
  • frontpage - шаблон только главной страницы, что работает по умолчанию
    • default.php - аналог category\blog.php
    • default_item.php - аналог category\blog_item.php
    • default_links.php - аналог category\blog_links.php
  • section
    • blog.php - материалы раздела в формате блога (view=section&layout=blog), аналогичен category\blog.php
    • blog_item.php - аналогичен category\blog_item.php, отображает каждый элемент блога раздела
    • blog_links.php - аналогичен category\blog_links.php, показывает ссылки типа "еще" в блоге раздела
    • default.php - стандартный шаблон раздела (view=section), показывает заголовок категории, описание, кол-во элементов. По нажатию на заголовок категории дальнейшая страница обрабатывается шаблоном category\default.php
Если каталог \templates\ВашШаблон\html\com_content\ отсутствует в шаблоне, значит отрабатывают оригинальные темплейты компонента, находится в components\com_content\views\НужноеПредставление\tmpl (там есть еще и archive, используется редко такой вывод, потому не рассматривал, разобраться по аналогии несложно) И последний на этот раз аспект (вопрос уж очень часто поднимается на форуме). Как нам добавить дополнительные данные к стандартному контенту (к примеру количество хитов в формат блога категории либо любое другое)? Для этого нам необходимо работать с моделью, каталог com_content\models\, в нем 4 нужных нам файла (архив не рассматриваю) - article.php - category.php - frontpage.php - section.php Посмотрев на названия и прочитав пару абзацев выше понятно кто за что отвечает. Потому в данном примере мы заходим в category.php и находим там глобальный SQL запрос (в каждой моделе он находится в функции function _buildQuery) и добавляем в выборку нужный элемент.
1
SELECT ......, a.hits AS articlehits, .....
Все, после этого отправляемся в шаблон category\blog_item.php и в нужном месте дописываем
1
<?php echo $this->item->articlehits; ?>
P.S. прошу прощения, но на вопросы 1-го класса как работать с sql запросами, показать элемент языкового файла, расстановка кавычек и подобные не отвечаю Тема на joomlaforum
1710
2009 19 октября

Создаем AJAX поиск по сайту (jquery)

Итак, общие аспекты создания поиска по сайту с применением AJAX. В чем суть - при вводе\удалении каждого символа в поле поиска обращаемся к БД и показываем совпадения Рабочий пример http://www.rcoi.net/beta/ (справа вверху поле поиска) Автор идеи Marco Kuiper На деталях останавливаться не буду, кому интересно без проблем разберутся
1 - подключаем Jquery (я беру с гугля версию 1.3.2)
1
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
2 - в HEAD шаблона подключаем следующий JS
1
23
45
67
89
1011
1213
14
function lookup(inputString) {
        if(inputString.length == 0) {                $('#suggestions').fadeOut(); 
        } else {                        $.post("index.php?option=com_pbajax&task=ajaxsearch&no_html=1", {queryString: ""+inputString+""}, function(data) { 
                        $('#suggestions').fadeIn();                        $('#suggestions').html(data); 
                });        }
         $("input").blur(function(){
                $('#suggestions').fadeOut();         });
}
В моем случае я использую собственный компонент com_pbajax с набором определенных тасков, один из которых ajaxsearch и обрабатывает результаты поиска его код ниже 3 - модифицируем шаблон модуля поиска, в моем случае он выглядит так (готовый хтмл на выходе)
1
23
45
<form action="index.php"  method="post" class="search" name="zform">
        <input name="searchword" id="inputString" onkeyup="lookup(this.value);" maxlength="20" class="inputbox" type="text" size="20" value="поиск по сайту"  onblur="if(this.value=='') this.value='поиск по сайту';" onfocus="if(this.value=='поиск по сайту') this.value='';" />        <input type="hidden" name="option" value="com_search" />
        <input type="hidden" name="task"   value="search" /></form>
То есть по событию onkeyup вызываем нашу функцию lookup и отдаем ей на обработку введенное значение 4 - и собственно код обработчика (в моем случае это компонент com_pbajax и в нем кейс ajaxsearch
1
23
45
67
89
1011
1213
1415
1617
1819
2021
2223
2425
2627
2829
3031
3233
3435
3637
3839
4041
4243
4445
4647
4849
5051
5253
5455
5657
5859
6061
6263
6465
6667
case 'ajaxsearch';
                $queryString    = JRequest::getVar( 'queryString', 1, 'post' ); 
                $db     = JFactory::getDBO();                $user   =& JFactory::getUser();
                 require_once(JPATH_SITE.DS.'components'.DS.'com_content'.DS.'helpers'.DS.'route.php');
                require_once(JPATH_SITE.DS.'libraries/phputf8/utf8.php'); 
                $nullDate       = $db->getNullDate();                $date           =& JFactory::getDate();
                $now            = $date->toMySQL(); 
                $query = 'SELECT a.*, '                . ' CASE WHEN CHAR_LENGTH(a.alias) THEN CONCAT_WS(":", a.id, a.alias) ELSE a.id END as slug,'
                . ' CASE WHEN CHAR_LENGTH(cc.alias) THEN CONCAT_WS(":", cc.id, cc.alias) ELSE cc.id END as catslug'                . ' FROM #__content AS a'
                . ' INNER JOIN #__categories AS cc ON cc.id = a.catid'                . ' INNER JOIN #__sections AS s ON s.id = a.sectionid'
                . ' WHERE a.title LIKE "%'.$queryString.'%" OR a.introtext LIKE "%'.$queryString.'%" '                . ' AND a.state = 1'
                . ' AND cc.published = 1'                . ' AND s.published = 1'
                . ' AND a.access <= '.(int) $user->get( 'aid' )                . ' AND cc.access <= '.(int) $user->get( 'aid' )
                . ' AND s.access <= '.(int) $user->get( 'aid' )                . ' AND ( a.publish_up = '.$db->Quote($nullDate).' OR a.publish_up <= '.$db->Quote($now).' )'
                . ' AND ( a.publish_down = '.$db->Quote($nullDate).' OR a.publish_down >= '.$db->Quote($now).' )'                . ' ORDER BY title  LIMIT 10'
                ; 
                if ($queryString != '') {                        $db->setQuery($query);
                        $rows = $db->loadObjectList();                        $html = '<div id="searchresults">';
                $n = count($rows);                $i = '1';
                        if ($n) {                                $html .= '<ul class="searchresultsli">';
                                foreach ( $rows as $row )                                        {
                                                $link = ContentHelperRoute::getArticleRoute($row->slug, $row->catslug, $row->sectionid); 
                                                $class = '';                                                if ($i%'2'=='0') {
                                                        $class = 'odd';                                                } else {
                                                    $class = 'even';                                                }
                                                 $html .= '<li class="'.$class.'">';
                                                $html .= $i.' - ';                                                $title = str_replace($queryString, '<span class="highlight">'.$queryString.'</span>', utf8_strtolower($row->title));
                                                $html .= '<a href="'.$link.'">'.$title.'</a>';                                                $html .= '</li>';
                                                $i++;                                        }
                                $html .= '</ul>';                        } else {
                        $html .= 'По Вашему запросу ничего не найдено';                        }
                        $html .= '</div>';                } else {}
                 echo $html;
         break;
Чуть пошагово: 1 - подключили роутер контента и utf8.php для отработки utf8_strtolower (можете этого и не делать) 2 - запрос вытягивает заголовок материала и вступительный текст на предмет поиска совпадений с ключевым запросом $queryString 3 - регуляркой обрабатываем заголовок и подсвечиваем искомое слово в выдаче (в моем случае результат выдается только заголовком, потому если совпадение с $queryString найдено в introtext то в заголовке выдачи подсвечивать нечего) 4 - добавляем классы odd\even для чередования строк (можно и на квери делать, но почему то стало лень) 5 - в нужное место вешаем див для показа результатов поиска, у меня он висит в индексе шаблона
1
<div id="suggestions"></div>
И оформляем CSS стили положение блока и собственно результатов поиска
1
23
45
67
89
/* AJAX search */
#suggestions { position: absolute; width:350px; display:none; z-index: 100; right: 20px; top: 75px;}#suggestions {border: 1px solid #ABD2DE; background-color: #DEEFF4; padding: 10px;text-align: left; color: #1F579A; font-size: 12px;}
#suggestions a, #suggestions li {color: #1F579A; font-size: 12px; text-decoration: none;}#suggestions a:hover {text-decoration: underline;}
ul.searchresultsli, ul.searchresultsli li {margin: 0px; padding: 0px; background-image: none; list-style: none;}ul.searchresultsli li {padding: 7px 5px 7px 3px;}
ul.searchresultsli li.odd {background-color: #F4F1E1;}a.highlight {color: #FE9500 !important; font-weight: bold;}
После этого получаем красивый поиск и пищу для дальнейших модификаций Мопед не мой, автор идеи Marco Kuiper, за что ему отдельное спасибо Готового модуля делать не буду, разобраться думаю не составляем проблем Тема на Joomlaforum P.S. обращаю внимание, что парсер моего блога перевирает одинарные кавычки, потому просто копи\паст работать не будет
640
2009 20 сентября

Постраничная навигация для Datso 1.8.1 (page navigation)

По просьбе пользователя ce300man набросал добавление постраничной навигации в страницы галереи ( Популярные | Лучшие | Новые | Комментарии) Немного теории. Статья официальной вики Using JPagination in your component Работать будем с файлом components\com_datsogallery\sub_viewspecial.php

1503
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
1473
2009 27 июля

Модуль обратный отсчет для Joomla 1.5

mod_countdown Версия модуля 2.1.0 для Joomla 1.5 Список изменений: * Полностью переписан код * Создан простенький шаблонизатор * Стили модуля вынесены в отдельный CSS * P.S. модуль не умеет работать с високосными годами Проверял с различными вариациями даты, локально все показывал корректно (кол-во дней, часов, минут до события как в статике, так и в посекундном JS скрипте). Тестировал в мозилла, опера, ИЕ 6-7 Скачать здесь или на joomlaforum Версия модуля 2.5.1 для Joomla 2.5
920
2009 24 июля

Плагин ArtFormsplugin для компонента ArtForms

Тестируйте первую версию плагина ArtFormsplugin для Joomla 1.5 Пробовал у себя пошагово:
  1. создал формочку из пары полей
  2. уставил плагин
  3. в материал вписал {ArtForms formid=1}

В тексте появилась форма и кнопка "send", по нажатию ничего не происходит (точнее перебрасывает меня на страницу index.php?option=com_ArtForms&formid=1&Itemid=1 пустую, видимо потому что не создал обработчик формы - лень разбираться в самом компоненте было)

Все опции работы плагина также не проверял (бо их там много а рабочей формы для тестирования под рукой нет).

Скачать плагин
Обсуждение на Joomlaforum
2344
2009 24 июля

Модуль последних сообщений с SMF 2.0

Забираем, версия модуля mod_latestsmf 1.2.0 для Joomla 1.5 и SMF 2.0 RC1.2

Обязательные требования:

1 - после установки модуля указать в настройках абсолютный путь к файлам форума DOCUMENT_ROOT/smf_path/ (слеш на конце обязателен) 2 - наличие на сервере библиотеки mb_substr 3 - форум должен быть установлен с указанием кодировки UTF-8 (на 1251 не тестировал, ничего не могу сказать)

6280
2009 13 июля

Модуль вывода товаров для VirtueMart

vm_logo2 Представляю Вашему внимания достаточно универсальный модуль для VirtueMart, версия mod_VirtueMart_universal 1.2.1 (beta version) для Joomla 1.5. Почему этот модуль, а не родной от разработчика VirtueMart Soeren - родной модуль на 6 товаров генерит от 40 запросов в БД, мой же только один SQL запрос

Откомменченное