Bitrix - Joomla Show - Joomla Show http://joomla-show.ru Thu, 19 Mar 2015 03:52:47 +0300 Joomla! - Open Source Content Management ru-ru Битрикс. Делаем полноценное меню из компонента «Структура разделов» 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/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
Выводим остаток товара на складе. Битрикс. http://joomla-show.ru/item/35-vyivodim-ostatok-tovara-na-sklade-bitriks http://joomla-show.ru/item/35-vyivodim-ostatok-tovara-na-sklade-bitriks

Эта статья поведает вам о том, как легко и быстро вывести информацию о количестве товара на складе (остатках на складе) в интернет-магазине построенном на CMS Bitrix. Выглядеть это будет примерно так:

Первое что нам нужно — это сверстать блоки вывода товара на странице с каталогом и выделить в них место для информации о товарных остатках. Если вы это сделали, вставляете вот такой код (провенено на 1С Битрикс 10-й версии)

{code lang:php lines:true hidden:false}<? $ar_res = CCatalogProduct::GetByID($arElement['ID']);
echo "<br>На складе: ";
print_r($ar_res['QUANTITY']);
echo " шт."; ?>{/code}

После того, как вставили код, заходим в админку Битрикса, открываем товар, в котором надо прописать остатки, спускаемся вниз страницы и дальше — все как на скрине:

Галочку можете не ставить, если не хотите, чтобы количество остатков уменьшалось автоматически при заказах из интернет-магазина. И я крайне не рекомендую ставить эту галочку и вообще лезть в параметры, если ваш Битрикс обменивается данными с 1С!  Потому, что в этом случае количество уменьшится само после проведения накладной и очередного обмена с Битриксом.

На этом все. Если сделали все правильно, у вас должно получиться что-то подобное:

 

Если же вам нужна просто надпись "Есть в наличии" или "Нет в наличии", вам подойдет вот такой код:

{code lang:php lines:true hidden:false}<?
$ar_res = CCatalogProduct::GetByID($arElement['ID']);
if($ar_res['QUANTITY']==0) {
echo"Нет в наличии";
}
else {
echo"Есть в наличии";
}
?>{/code}

]]>
artyom-vikt@yandex.ru (Артем) Bitrix Tue, 24 Jan 2012 00:22:58 +0400