Может ли разумный человек,
учитывая опыт прошедших веков,
питать хоть малейшую надежду на светлое будущее человечества? Может, если свяжется с мной!

207
2009 08 мая

Цитата из журнала "Наука и Техника", апрель 2009

Цитата из колонки главного редактора к апрельскому номеру (канун дня космонавтики), думаю что комментировать с моей стороны не нужно. "Посетивший недавно ХАИ летчик-космонавт Олег Коноваленко – выпускник моего 4-го «космического факультета» был поражен обилием грамматических ошибок, которые допускали студенты 3-го курса в своих записках к нему. Даже ректор украдкой исправлял особо одиозные «ляпы», прежде чем отдать записку с вопросом космонавту… Что сказать? Убили Школу, убили Высшую Школу, убили Научную Школу.. Убили Праздник.. "
347
2009 28 апреля

IT образование

bobbi
Дамы и господа! Сейчас вы услышите трагическую и поучительную историю о мальчике Бобби, который любил хахахаха

239
2009 26 апреля

Error.log краткое описание и примеры

errorl log apache По мотивам постоянных вопросов: "У меня снова белое окно при входе на сайт\админку" и прочее набросан краткий текст по основам error.log - что такое, где найти, типы ошибок. Текст будет пополняться по мере накопления информации. Ссылка на joomlaforum.ru
334
2009 22 апреля

Мелкие фишки в шаблонах Joomla 1.5

logo Для упрощения жизни себе любимого использую мелкие фишки в index.php шаблона, для памяти и зафиксируем. В дальнейшем список будет пополняться, по мере накопления\вспоминания подобных мелких приятностей
1
23
45
67
89
10
$Itemid         = JRequest::getInt( 'Itemid', 1, 'get' );
$document       = & JFactory::getDocument();$config         = & JFactory::getConfig();
//set correct page title: PAGE TITLE - SITE NAMEif ($Itemid != '1') {
$curtitle = $document->title.' - '.$config->getValue('sitename');$document->setTitle( $curtitle );
} else {}//set var to template files
$tplurl = $config->getValue('live_site').'/templates/'.$document->template;

Все это добро находится сразу после открытия HEAD, по порядку что делаем:
  • получили значение Itemid текущей страницы для формирования заголовка и прочих условий в шаблоне
  • получили массивы $document (текущая страница) и $config (файл конфига), посмотреть содержимое можно распечатав их через print_r
  • сформировали корректный (на мой взгляд для СЕО) заголовок страницы: Заголовок материала - Название сайта (из конфига). Зачем - Joomla 1.5.10 почему то подставляет в титл только заголовок текущей страницы, без названия сайта, что не есть хорошо
  • сформировали переменную с полным путем до файлов шаблона $tplurl, в дальнейшем я очень удобно использую ее, к примеру, для подключения файлов стилей, картинок и прочего
1
<link rel="stylesheet" href="<?php echo $tplurl ?>/css/template.css" type="text/css" />
803
2009 08 апреля

Системные сообщения frontend !J 1.5

logoПри создании собственного шаблона частенько можно забыть такую вещь, как системные сообщения движка (к примеру после отправки сообщения стандартным компонентом контактов).
Чтобы включить в шаблон их отображение, достаточно в нужном месте index.php шаблона добавить строку
1
<jdoc:include type="message" />
Формированием данных сообщений занимается файл libraries\joomla\document\html\renderer\message.php. К примеру, мне очень не нравилось, что над собственно текстом есть надпись "Сообщение", чтобы ликвидировать требуется закомментировать строку 64 (для версии 1.5.10)
1
$contents .= "\n<dt class=\"".strtolower($type)."\">".JText::_( $type )."</dt>";
Стили CSS (совершенно не понимаю, зачем разработчики здесь используют столь редко встречаемые списки определений DL DD): #system-message - весь блок сообщения #system-message dd.message ul - список, формирующий сообщения #system-message dd.error ul - список, формирующий сообщения об ошибках Данный функционал можно использовать и в своих расширениях, к примеру (взял из контактов для образца) в контроллере редирект на страницу после какого-либо действия (при условии нахождения в языковом файле соответствующей строки, можно просто текст)
1
2
$msg = JText::_( 'Thank you for your e-mail');
$this->setRedirect($link, $msg);
При желании можно заменить эти подсказки на обычные JS алерты, для этого в том же файле libraries\joomla\document\html\renderer\message.php находим кусок
1
23
45
67
89
1011
1213
1415
1617
1819
2021
22
// If messages exist render them
                if (is_array($lists))                {
                        // Build the return string                        $contents .= "\n<dl id=\"system-message\">";
                        foreach ($lists as $type => $msgs)                        {
                                if (count($msgs)) {                                        $contents .= "\n<dt class=\"".strtolower($type)."\">".JText::_( $type )."</dt>";
                                        $contents .= "\n<dd class=\"".strtolower($type)." message fade\">";                                        $contents .= "\n\t<ul>";
                                        foreach ($msgs as $msg)                                        {
                                                $contents .="\n\t\t<li>".$msg."</li>";                                        }
                                        $contents .= "\n\t</ul>";                                        $contents .= "\n</dd>";
                                }                        }
                        $contents .= "\n</dl>";                }
                return $contents;
и заменяем на
1
23
45
67
89
1011
1213
14
if (is_array($lists))
                {                        // Build the return string
                        foreach ($lists as $type => $msgs)                        {
                                if (count($msgs)) {                                        foreach ($msgs as $msg)
                                        {                                                $contents .= '<script language="javascript" type="text/javascript">alert("'.$msg.'")</script>';
                                        }                                }
                        }                }
                return $contents;
Для всех случаев не проверял данный хак, но при регистрации работает
766
2009 27 марта

Плагин-кнопка для редактора Joomla 1.5

plg_demobutton - простейшая демонстрация реализации плагина, что добавляет кнопку в визуальный редактор для вставки собственных конструкций. Демка добавляет в материал строку < div class="demo-text" / > Обновленная версия плагина 1.1

Описание:

  1. создает в визуальном редакторе пользовательскую кнопку
  2. теги, вставляемые кнопкой настраиваются в админке плагина, просто вписать в поле Button name, по умолчанию вставляет {cbutton}text{/cbutton}
  3. название кнопки также изменяется в настройках, поле Button name
  4. клонировать в админке плагин нельзя, ибо требуется совпадение названия классов с названием плагина
  5. если все таки требуется клонировать, то придется создавать несколько версий плагина, при этом изменять имена (к примеру новая кнопка называется new_button):
  6. class plgButtondemobutton на class plgButtonnew_button function plgButtondemobutton на function plgButtonnew_button function insertDemo на function insertDemoNew
    1
    
    $button->set('onclick', 'insertDemo(\''.$name.'\');return false;');
    на
    1
    
    $button->set('onclick', 'insertDemoNew(\''.$name.'\');return false;');

Надеюсь, что этого функционала для быстрой вставки любого текста в редактор, будет достаточно. У себя тестировал вставкой целой HTML таблицы заданной конфигурации - работает без вопросов, как в режиме визуального редактора, так и обычного текста В качестве быстрого разворачивания каких-либо функций вполне подойдет.

Скачать на Joomlafoum.ru либо зеркало
572
2009 15 марта

Плагин Hide Guest Content - скрытие контента от гостей - !Joomla 1.5

Обновление - версия для Joomla 1.6 и 1.7 Аналог мамбота mosif версии 1.0.х Что делает - позволяет в материале скрыть часть текста от незарегистрированного пользователя (гостя) - будет выведена предупредительная заглушка. Текст заглушки редактируется в админке плагина. Использование: 1 - установить и опубликовать плагин 2 - в материале нужный блок текста обрамить тегами: {gcontent}скрытый материал для пользователей гостям не виден{/gcontent} 3 - заглушка для гостей заключена в DIV с классом guest_only, возможно настроить оформление предупредительного блока по собственному желанию Текущая версия - 1.0, тестировалось на 1.5.9 в native режиме Скачать на joomlaforum либо зеркало Обновленная версия для 2.5 с разграничением прав доступа по группам пользователей находится здесь
779
2009 09 марта

Стандартный поиск по отдельным категориям, !Joomla 1.0.xx

logoС подачи пользователя DK-Scorp набросан данный хак. Что делает - добавляет в стандартный компонент поиска движка возможность выбора категории, в которой производить поиск. По умолчанию данный пример работает на выбор всех категорий всех разделов, нужно ограничить - смотрим первый запрос. Топорно но работает (осторожно много хаков :))
Файл search.php компонента, функция viewSearch После строки
1
$ordering = strtolower( strval( mosGetParam( $_REQUEST, 'ordering', 'newest') ) );
добавляем
1
$category = strtolower( strval( mosGetParam( $_REQUEST, 'category', '') ) );
после
1
$lists['searchphrase']= mosHTML::radioList( $searchphrases, 'searchphrase', '', $searchphrase );
добавляем (запрос для образца, прочие проверки публикации, просроченности etc добавляем самостоятельно)
1
23
45
67
89
1011
1213
//category select
    $query = "SELECT id, title "                . "\n FROM #__categories  "
                . "\n WHERE section in (SELECT id FROM #__sections)   "                . "\n AND published = 1 "
                ;        $database->setQuery( $query );
        $catlist = $database->loadObjectList();        $orders = array();
        foreach ($catlist as $catrow) {                $catlists[] = mosHTML::makeOption( $catrow->id, $catrow->title );
        }        $lists['category'] = mosHTML::selectList( $catlists, 'category', ' class="inputbox"', 'value', 'text', $category  );
Ниже находим строку
1
$results = $_MAMBOTS->trigger( 'onSearch', array( $database->getEscaped( $searchword ), $phrase, $ordering) );
и заменяем на
1
$results = $_MAMBOTS->trigger( 'onSearch', array( $database->getEscaped( $searchword ), $phrase, $ordering, $category ) );
Файл search.html.php в функции searchbox добавляем новую строку
1
23
45
67
8
<tr>
        <td colspan="3">                <label for="search_ordering">
                        SELECT CATEGORY:                </label>
                <?php echo $lists['category']?>        </td>
</tr>
В функцию display добавляем строку
1
$category = strtolower( strval( mosGetParam( $_REQUEST, 'category', '' ) ) );
Ну и наконец файл бота content.searchbot.php Дополнительный параметр в функцию
1
function botSearchContent( $text, $phrase='', $ordering='', $category='' )
и в запрос который отмечен комментом "search content items" добавить условие
1
. "\n AND a.catid = ".$category.""
Ну и соответственно если список категорий нужно будет ограничить одним либо несколькими разделами, то смотрим наш первый добавленный запрос, что формирует собственно список Скриншот: Стандартный поиск по отдельным категориям Joomla 1.0.xx
428
2009 04 марта

Пустой компонент для !Joomla 1.5

Набросал на коленке простейший компонент для 1.5 (MVC и не пахнет) com_demo 1.0 1 - установить компонент 2 - в меню создать ссылку на Demo Component 3 - зайти фронтендом на страницу компонента, выбрать дату и посмотреть на результат 4 - посмотреть на файл components\com_demo\demo.php и переделать под себя Качать здесь либо mirror
197
2009 03 марта

Подключаем стандартный календарик в Joomla 1.5

без комментариев ))
1
2
JHTML::_('behavior.calendar'); 
echo JHTML::_('calendar', $cal_var, 'cal_var', 'cal_var', '%Y-%m-%d %H:%M:%S', array('class'=>'inputbox', 'size'=>'25',  'maxlength'=>'19'));
294
2009 28 февраля

Модифицируем mod_latestnews в !Joomla 1.5

К примеру, хотим добавить в модуль дату создания материала, для этого в файле modules\mod_latestnews\helper.php добавляем строку в цикле foreach ( $rows as $row ) {}
1
$lists[$i]->created = htmlspecialchars( $row->created );
И в файле modules\mod_latestnews\tmpl\default.php в нужном месте оформляем вывод:
1
echo $item->created;
551
2009 27 февраля

Постраничная навигация в компоненте !Joomla 1.5

Всем известно, как добавлять постраничную навигацию в своем компоненте на базе Joomla 1.0.хх Теперь аналогично, но для версии 1.5, вместе с запросом из базы
1
23
45
67
89
1011
$db =& JFactory::getDBO();
$limit   = $mainframe->getUserStateFromRequest("$option.limit", 'limit', 14, 'int'); \\ количество на страницу$limistart  = JRequest::getVar('limitstart', 0, '', 'int'); \\откуда начинаем отсчет
jimport('joomla.html.pagination'); \\подключаем класс$db->setQuery(‘SELECT * FROM jos_content WHERE catid = '1' LIMIT limistart limit  );
$allcount = 'хх'; \\ общее количество записей из запроса$pageNav = new JPagination( $allcount, $limistart, $limit );
foreach($rL as $r) {//результат запроса
}echo $pageNav->getListFooter(  ); //постраничная навигация
Оригинал статьи и расширенные комментарии здесь $pageNav->getListFooter(); - все параметры постраничной навигации $pageNav->getPagesLinks(); - только ссылки туда\обратно и номера страниц echo $pageNav->getPagesCounter(); - страниц 1 из 4 echo $pageNav->getLimitBox(); - выпадающий список сортировки
350
2009 23 февраля

Боян о программистах

bugsЛюбой русский программист, после пары минут чтения кода, обязательно вскочит и произнесет, обращаясь к себе: переписать это все нафиг.

Потом в нем шевельнется сомнение в том, сколько времени это займет, и остаток дня русский программист потратит на то, что будет доказывать самому себе, что это только кажется, что переписать это много работы. А если взяться и посидеть немного, то все получится. Зато код будет красивый и правильный.

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

338
2009 21 февраля

Joomla 1.5.9 и global переменные

Имеем на входе Joomla 1.5.9, php 5.2.4 и функцию
1
23
45
6
$mytest = 'test';
function pb_test() {  global $mytest;
  echo $mytest;}
pb_test ();
В таком виде ничего не работает, но стоит объявить переменную глобально заранее - как все встает на свои места
1
23
45
6
global $mytest; $mytest = 'test';
function pb_test() {  global $mytest;
  echo $mytest;}
pb_test ();
Причину такого поведения не нашел, зафиксирована только на ветке 1.5, на 1.0 либо за пределами движка все работает как и надо. Если кто пояснит идиоту - почему так - буду очень признателен ))
346
2009 18 февраля

Plugin "Content Design Div" - !J1.5

Написан простейший плагин, позволяющий в материале оформлять блоки текста произвольным образом. Достаточно установить плагин и опубликовать, после чего в материале обрамить тегами нужный текст:

1
{cdesign}Ваше содержимое здесь{/cdesign}

Внимание - html форматирование в данном блоке работать не будет. Стили оформления по умолчанию заложены в файле plugins\content\pb_content_design.php. При желании можно усложнить форматирование редактированием функции pb_content_design_replacer все в том же файле

Обновления версии 1.1:

  • версия 1.1 позволяет создавать до 9 стилизованных блоков, для этого необходимо указать параметр style1-style9: {cdesign style1}{/cdesign}, общий вид стилей СSS в таком случае становится .pb_content_design_style1 -> .pb_content_design_style9 (в плагине описаны только первые три)
  • добавлен плагин pb_content_design_btn кнопки в редактор, по умолчанию вставляет теги с параметром style1

Скриншот работы:

Plugin Content Design Div - !Joomla 1.5 Скачать Content Design Div 1.1
Скачать Content Design Div Button (кнопка для редактора)
347
2009 17 февраля

Windows XP SP2 && denver: SSL conflict

Windows XP SP2 && denver: SSL conflict Проблема: Windows XP SP2 + Denver + отсутствие подключения к сети (сетевая карта как бы есть, но реально интернет не подключен), после запуска денвера в логах apache ошибки типа:
1
[warn] Init: SSL server IP/port conflict: localsite.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:452) vs. localsite.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:475)
Соответственно localhost работает, прочие пользовательские узлы не пингуются и не отзываются в браузере (при этом в файлике hosts все записи прописываются относительно 127.0.0.1 Решение: в службах системы включаем DNS-клиент (как вариант еще может понадобится дать сетевой карте произвольный IP), никакие другие манипуляции мне не помогли (рекомендовали еще поставить виртуальную сетевую от microsoft, но это уж как то слишком через одно место)
431
2009 04 февраля

Модальные всплывающие окна в админке !J1.5

Запись скорее для себя, дабы не забыть. Подключаем в админке !Joomla 1.5 (да можно и на фронтенде) всплывающие окна с эффектом (работает на mootools и адаптированном скрипте SqueezeBox)
1
23
45
67
89
1011
1213
14
$header .= "
<script type=\"text/javascript\">window.addEvent('domready', function() {
SqueezeBox.initialize({});        $$('a.modal').each(function(el) {
                el.addEvent('click', function(e) {                new Event(e).stop();
                SqueezeBox.fromElement(el);                });
        });});
</script>";$header .= '<link rel="stylesheet" href="/media/system/css/modal.css" type="text/css" />';
$mainframe->addCustomHeadTag($header);
И оформляем ссылку
1
<a class="modal" rel="{handler: 'iframe', size: {x: 650, y: 375}}" href="MyLink" title="Link">Link</a>
4561
2009 27 января

Вложения в форме обратной связи стандартного com_contact (!J1.0.хх !J1.5)

Тривиальная задача - в стандартной форме обратной связи сделать возможность прикрепления файлов к письму. Для этого будем использовать стандартную функцию mosMail, у которой, среди прочих, есть параметр $attachment, поскольку вся функция mosmail завязана на phpmailer. Итак по порядку.
Добавляем в components\com_contact\contact.html.php в форму обратной связи кнопку выбора файла
1
<input name="file" type="file" id="file">
Файл components\com_contact\contact.php в функции function sendmail() делаем что-то вроде
1
23
45
67
89
10
//USE STANDART ATTACHMENT FUNCTION
$tempdir = $mosConfig_absolute_path."/images/";$namefile = $_FILES['file']['name'];
$filetemp = $tempdir.$namefile;move_uploaded_file($_FILES['file']['tmp_name'], $tempdir.$namefile);
$attachment = $tempdir.$namefile;$success = mosMail( $email, $name, $contact[0]->email_to, $mosConfig_fromname .': '. $subject, $text, $mode=0, $cc=NULL, $bcc=NULL, $attachment);
if (!$success) { mosErrorAlert( _CONTACT_FORM_NC );
}
Аспекты с загрузкой файла на сервер, проверки типа и формата и прочее - не затрагиваю, ибо пишем по необходимости в каждом конкретном случае. То есть что самое главное - задать значением переменной $attachment как путь к файлу на сервере. В приведенном примере - это файл, загруженный из формы обратной связи. Для Joomla 1.5 класса JMail все в принципе аналогично, почитать можно здесь E-Mail Class. Provides a common interface to send e-mail from the Joomla! Framework Чуть более подробно по 1.5: 1 - В саму форму не забываем добавить enctype="multipart/form-data" 2 - не забываем про абсолютные пути к папке для временного файла
1
$tempdir = JPATH_ROOT."/images/";
3 - собственно функция вложения теперь упрощена, после того как мы получили файл в переменную
1
2
$attachment достаточно написать 
$mail->addAttachment( $attachment );
перед
1
$sent = $mail->Send();
и все, получили почтовое письмо с вложением
406
2009 19 января

Show\hide в формах (checkbox && Jquery)

Show hide в формах checkbox  JqueryБанальнейшая вещь в своей приятности - по клику на элемент показать\скрыть содержимое определенного блока. Понадобилось мне сделать такую полезность для большой формы - при отмеченном checkbox дать пользователю возможность выбора определенных параметров. Собственно решение ниже. Понадобится дополнительное включение jquery, весь же остальной код приведен ниже.
1
23
45
67
89
1011
1213
1415
16
$(document).ready(function(){
        //по умолчанию скрываем DIV        $("#tblview").css("display","none");
        // добавляем onclick на checkbox w/id param        $("#param").click(function(){
                // If checked                if ($("#param").is(":checked"))
                {                        //показываем скрытый слой
                        $("#tblview").show("fast");                } else {
                        //скрываем его                        $("#tblview").hide("fast");
                }        });
});
1
23
4
<form>
<input id="param" type="checkbox" /><label for="param">показать скрытый элемент:</label></form>
<div id="tblview">Скрытое содержимое блока</div>
Пример работы
266
2008 20 декабря

Мамбот внутренней навигации (Content Item Navigation)

Мамбот внутренней навигации pb_nearest_article

Представляю вашему вниманию маленький, но полезный мамбот pb_nearest_article, заменяющий кнопки "назад - вперед" на сочетание "название предыдущей статьи - название следующей статьи". Мамбот полезен в сфере SEO так и для удобства ориентации посетителей сайта.

Последовательность действий:

- установить и опубликовать мамбот
- в глобальной конфигурации в вкладке CONTENT установить опцию "Content Item Navigation:" в NO