Кастомизация шаблона компонента

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

Внешний вид можно поменять, изменив шаблон. Для этого его нужно вначале скопировать, дабы последующие обновления не затерли наши потуги. Скопировать шаблон проще всего прямо из общественной части, предварительно включив режим правки (ползунок в правом верхнем углу административной панели).Навести мышь на нужный компонент, нажать на стрелочку вниз в появившемся окошке. В выпавшем списке выбрать «копировать шаблон компонента» (иногда этот пункт находится в подменю с названием компонента). Далее, указываем, куда копируем, например, в шаблон сайта, и тогда, шаблон будет доступен для редактирования по адресу: вашсайт/bitrix/templates/вашшаблон/components/bitrix/вашкомпонент.

Для изменения внешнего вида, правим в файле template.php, а для добавления дополнительных данных используем result_modifier.php. Живые примеры я буду выкладывать по мере создания.

Битрикс. Создаем разноцветное меню.

Сегодня несложная задача — разукрасить пункты меню в разные цвета. Вот результат наших трудов. Наш способ решения поставленной задачи заключается в следующем: нужно просто-напросто присвоить каждому пунктику уникальный id. Так как меню создается динамически в цикле обхода массива элементов, то мы по законам жанра создаем счетчик и после каждой итерации будем путем конкатенации статической части имени и значения счетчика генерировать новый id.  По заведенной привычке перед внесением изменений копируем шаблон и открываем файл template.php для правки. В принципе, все оставляем, как было:

<?if (!defined(«B_PROLOG_INCLUDED») || B_PROLOG_INCLUDED!==true)die();?>

<?if (!empty($arResult)):?>
<ul id=»horizontal-multilevel-menu»>

<?
$previousLevel = 0;

$iter = 0; //добавляем счетчик

foreach($arResult as $arItem):?>

<?if ($previousLevel && $arItem[«DEPTH_LEVEL»] < $previousLevel):?>
<?=str_repeat(«</ul></li>», ($previousLevel — $arItem[«DEPTH_LEVEL»]));?>
<?endif?>

<?if ($arItem[«IS_PARENT»]):?>

<?if ($arItem[«DEPTH_LEVEL»] == 1):?>

//генерируем id и увеличиваем итератор
<li id=»<?echo «menu_».$iter;$iter++;?>»><a href=»<?=$arItem[«LINK»]?>» class=»<?if ($arItem[«SELECTED»]):?>root-item-selected<?else:?>root-item<?endif?>»><?=$arItem[«TEXT»]?></a>
<ul>
<?else:?>
<li<?if ($arItem[«SELECTED»]):?> class=»item-selected»<?endif?>><a href=»<?=$arItem[«LINK»]?>» class=»parent»><?=$arItem[«TEXT»]?></a>
<ul>
<?endif?>

<?else:?>

<?if ($arItem[«PERMISSION»] > «D»):?>

<?if ($arItem[«DEPTH_LEVEL»] == 1):?>
//генерируем id и увеличиваем итератор

<li id=»<?echo «menu_».$iter;$iter++;?>»><a href=»<?=$arItem[«LINK»]?>» class=»<?if ($arItem[«SELECTED»]):?>root-item-selected<?else:?>root-item<?endif?>»><?=$arItem[«TEXT»]?></a></li>
<?else:?>
<li<?if ($arItem[«SELECTED»]):?> class=»item-selected»<?endif?>><a href=»<?=$arItem[«LINK»]?>»><?=$arItem[«TEXT»]?></a></li>
<?endif?>

<?else:?>

<?if ($arItem[«DEPTH_LEVEL»] == 1):?>
<li><a href=»» class=»<?if ($arItem[«SELECTED»]):?>root-item-selected<?else:?>root-item<?endif?>» title=»<?=GetMessage(«MENU_ITEM_ACCESS_DENIED»)?>»><?=$arItem[«TEXT»]?></a></li>
<?else:?>
<li><a href=»» class=»denied» title=»<?=GetMessage(«MENU_ITEM_ACCESS_DENIED»)?>»><?=$arItem[«TEXT»]?></a></li>
<?endif?>

<?endif?>

<?endif?>

<?$previousLevel = $arItem[«DEPTH_LEVEL»];?>

<?endforeach?>

<?if ($previousLevel > 1)://close last item tags?>
<?=str_repeat(«</ul></li>», ($previousLevel-1) );?>
<?endif?>

</ul>
<div class=»menu-clear-left»></div>
<?endif?>

 

Вот, вобщем-то и всё. Теперь id каждого пунктика уникальный, и в нашем случае имеет вид id = «menu_1» , id = «menu_2»  и т.д.

Sale.basket.basket.line- добавление общего количества и стоимости.

Сегодня поговорим о кастомизации компонента Битрикса «ссылка на корзину» sale.basket.basket.line. В техзадании Клиента поставлено условие, чтобы в строке выводилось общее количество товара и общая сумма.

К сожалению, штатный функционал данное пожелание выполнить не позволяет, поэтому придётся править шаблон. Для этого, как обычно, нужно его скопировать. В скопированном шаблоне, в файле result_modifier.php, получаем количество и цену товара:

<?if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>
<?if (IntVal($arResult["NUM_PRODUCTS"])>0){
    if (CModule::IncludeModule("sale")){
        $arBasketItems = array();
        $dbBasketItems = CSaleBasket::GetList(
                array
                (
                    "NAME" => "ASC",
                    "ID" => "ASC"
                ),
                array
                (
                    "FUSER_ID" => CSaleBasket::GetBasketUserID(),
                    "LID" => SITE_ID,
                    "ORDER_ID" => "NULL"
                ),
                false,
                false,
                array("ID", "QUANTITY", "PRICE")
                );

        while ($arItems = $dbBasketItems->Fetch()){
            if (strlen($arItems["CALLBACK_FUNC"]) > 0){
                CSaleBasket::UpdatePrice($arItems["ID"],
                    $arItems["QUANTITY"]);
                    $arItems = CSaleBasket::GetByID($arItems["ID"]);
            }
                $arBasketItems[] = $arItems;
        } ?>

Затем перебираем в цикле массив товаров в корзине и подсчитываем общие количество и стоимость.

<?
            $summ = 0;
            $quantity = 0;
        
            for ($i=0;$i<=$arResult["NUM_PRODUCTS"];$i++){     
                $summ = $summ + $arBasketItems[$i]["PRICE"]*$arBasketItems[$i]["QUANTITY"];
                $quantity = $quantity + $arBasketItems[$i]["QUANTITY"];
            }
     }
?>

Далее, реализуем автоподстановку окончания слова «товар» в зависимости от количества товара. Например: 1 товар, 14 товаров и т.п. Это делать необязательно и зависит от пожеланий заказчика. В данном случае требовалось на выхлопе получить нечто подобное:»В корзине 23 товара на сумму 450 руб.».

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

<?    if ($quantity>0){   
            $arrayA = array(2,3,4);
            $arrayOv = array(5,6,7,8,9,0);

если количество равно 1, или оканчивается на единицу, но не равно 11, тогда оставляем «товар» без окончания:

            if($quantity==1 || (($quantity%10)==1 && $quantity<>11))
                        $endQuantity="";

если количество- число из массива $arrayA, или оканчивается на число из массива $arrayA и при этом не равно 14 или 12, тогда окончание = «а». И так далее:

 

            elseif((in_array($quantity,$arrayA) || in_array(($quantity%10),$arrayA)) && $quantity<>14 && $quantity<>12)

                $endQuantity="а";
            elseif(in_array($quantity,$arrayOv) || in_array(($quantity%10),$arrayOv) || $quantity ==11 || $quantity ==14 || $quantity ==12)

                $endQuantity="ов";
            else

            $endQuantity="";
    }

?>

 

Формируем требуемую строку:

<?$arResult["FIN_TEXT"] = $finText;?>

А если товаров нет, то строка вывода будет содержать сообщение о том, что корзина пуста.(Я перенес условие проверки количества из template.php, чтобы передать туда уже готовую строку либо с количеством и ценой, либо с сообщением об отсутствии)

<?
}
else
{
    $finText = $arResult["ERROR_MESSAGE"];
}
?>

И наконец, добавляем полученную строку в массив $arResult

<?$arResult["FIN_TEXT"] = $finText;?>

А в файле template.php уже добываем из $arResult нашу строку и выводим там, где нам необходимо.

Например:

<?$arResult["FIN_TEXT"] = $finText;?>

И не забываем применить новый шаблон к компоненту.

Ubercart. Не показываются иконки товара в корзине.

На днях в Друпал столкнулся с небольшой проблемой в модуле Ubercart- у некоторых товаров не показывались иконки товара в корзине, хотя таковые были назначены.
Оказалось, что в модуле Уберкарта, в файле uc_product.module обнаружена проблема с именем переменной, которая выводит картинки, отличных от установленного по умолчанию типа ноды product. Картинки не выводятся, так как идет идет поиск по переменной ‘uc_image_’. $product->type и ничего не находит. Нужно заменить эту переменную на uc_image_product.
Для замены, отправляемся по пути \sites\all\modules\ubercart\uc_product\uc_product.module , в этом файлике находим функцию uc_product_get_picture и заменяем 'uc_image_'. $product->type на uc_image_product.
В итоге, должна получиться такая строка:
$field_name = variable_get('uc_image_product', 'uc_product_image');
Вместо:
$field_name = variable_get('uc_image_' . $product->type, 'uc_product_image');
Вот и все. Естественно, при обновлениях обращаем внимание, что модуль изменен и принимаем необходимые меры.

Drupal. Colorbox не работает в IE8

При разработке проекта INT-EDU cтолкнулся с проблемой, — не работает colorbox в IE8, а debug упорно утверждал, что ошибка в библиотеке JQUERY.

JQUERY Update не помог и так как это был не первый проект, где я использовал Colorbox и особенных проблем с ним (в т.ч. и в IE8) не наблюдалось, предположил, — возможно присутствует некий «конфликт» с работой других модулей.

Методом включения\выключения удалось выяснить, что виноват модуль «Syntax Highlighter». После его выключения проблем с IE8 не наблюдалось.