Design Hook Base

Материал из PHPShop

Перейти к: навигация, поиск

В базе хуков собраны наиболее полезные для интернет-магазина наборы дизайн-хуков, позволяющие реализовывать любые персонализации дизайна и логики ПО.

Lifebelt.png Для добавления нового хука для своего проекта необходимо сделать заявку в техническую поддержку и описать свою задачу с просьбой добавить реализацию в виде дизайн-хука в базу на Wiki. Специалисты поддержки по возможности создадут новую инструкцию в базе хуков.

Содержание

Активация дизайн-хука

Если в инструкции указана необходимость создания файла, а в вашем шаблоне уже присутствует такой файл, то файл дополняется по правилам составления дизайн-хуков. Для быстрого включения/выключения дизайн-хука нужно поставить знак решетки # перед его определением в config.ini, пример

  • #phpshopprice="php/hook/price.hook.php"; - выключен
  • phpshopprice="php/hook/price.hook.php"; - включен

или поставить знак решетки # в массиве перехвата $addHandler в файле хука, пример

  • $addHandler=array('#product'=>'product_pricecore_hook'); - выключен
  • $addHandler=array('product'=>'product_pricecore_hook'); - включен

Ключ секции [hook] должен быть уникален, если требуется создать новый хук на тот же класс(ключ), то требуется объединить хуки по правилам составления дизайн-хуков.


Корзина

Персонализирование корзины товаров в заказе

За шаблон вывода корзины в заказе отвечает функция product(). По-умолчанию за шаблон вывода таблицы отвечает файл phpshop/lib/templates/order/cart.tpl. Требуется переместить шаблон таблицы товаров в заказе в папку с шаблоном/order/cart.tpl

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/order.hook.php с содержанием
<?php
function productcartforma_hook($obj,$var,$rout) {
    global $PHPShopOrder;
    if($rout == 'START') {
 
        $obj->set('currency',$PHPShopOrder->default_valuta_code);
        $cart=$obj->PHPShopCart->display('ordercartforma');
        $obj->set('display_cart',$cart);
        $obj->set('cart_num',$obj->PHPShopCart->getNum());
        $obj->set('cart_sum',$obj->PHPShopCart->getSum(false));
        $obj->set('discount',$PHPShopOrder->ChekDiscount($obj->PHPShopCart->getSum()));
        $obj->set('cart_weight',$obj->PHPShopCart->getWeight());
 
        // Стоимость доставки
        PHPShopObj::loadClass('delivery');
        $obj->set('delivery_price',PHPShopDelivery::getPriceDefault());
 
        // Итоговая стоимость
        $obj->set('total',$PHPShopOrder->returnSumma($obj->get('cart_sum')+$obj->get('delivery_price'),$obj->get('discount')) );
 
        return ParseTemplateReturn('./phpshop/templates/'.$_SESSION['skin'].'/order/cart.tpl',true);
    }
}
 
$addHandler=array
        (
 
    'product'=>'productcartforma_hook'
 
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshoporder="php/hook/order.hook.php";
  • Скопировать файл шаблона phpshop/lib/templates/order/cart.tpl в phpshop/templates/имя шаблона/order/cart.tpl


Добавление иконки товара в корзину заказа

За шаблон вывода корзины в заказе отвечает функция ordercartforma().

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/order.hook.php с содержанием
<?php
function ordercartforma_hook($val,$option,$rout) {
    if($rout == 'START') {
 
        // Настройка для роутера START, если END, то комментировать строку ниже
        $val=$val[0];
 
        $PHPShopProduct = new PHPShopProduct($val['id']);
        PHPShopParser::set('cart_image',$PHPShopProduct->getParam('pic_small')); // Иконка
        PHPShopParser::set('cart_id',$val['id']);
        PHPShopParser::set('cart_art',$val['uid']); // Артикул
        PHPShopParser::set('cart_xid',$option['xid']);
        PHPShopParser::set('cart_name',$val['name']);
        PHPShopParser::set('cart_num',$val['num']);
        PHPShopParser::set('cart_price',$val['price']);
 
        return ParseTemplateReturn('./phpshop/templates/'.$_SESSION['skin'].'/order/product.tpl',true);
    }
}
 
$addHandler=array
        (
        'ordercartforma'=>'ordercartforma_hook'
 
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
ordercartforma="php/hook/order.hook.php";
  • Скопировать файл шаблона phpshop/lib/templates/order/product.tpl в phpshop/templates/имя шаблона/order/product.tpl
  • Добавить переменную @cart_image@ в шаблон phpshop/templates/имя шаблона/order/product.tpl

Изменение данных в мини-корзине

Требуется изменить переменную @num@ в мини-корзине с вывода общего количества товара на вывод количества элементов в корзине.

Решение: Учитывая, что за вывод элемента мини-корзины отвечает класс PHPShopCartElement, можно внедрить хук в метод miniCart(). Проанализировав информацию по возможным инъекциям хука в данном методе, можно составить хук. Данные по корзине хранятся в сессии $_SESSION['cart'], подсчитав количество элементов в этой переменной, мы получил требуемую величину.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/cart.hook.php с содержанием
<?php
/**
* Изменение количества товара в мини-корзине
*/
function miniCart_hook($obj) {
    $obj->set('num',count($_SESSION['cart']));
}
 
$addHandler=array
        (
        'miniCart'=>'miniCart_hook'
);
 
 
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopcartelement="php/hook/cart.hook.php";

Элементы

Настройка облака тегов

Требуется изменить цвет ссылок flash-облака.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/cloud.hook.php с содержанием
 
/**
 * Изменение цвета текста в облаке тегов
 * @param array $obj объект
 * @param array $row массив данных
 * @param string $rout роутер места вызовы модуля [START|MIDDLE|END]
 */
function index_hook($obj,$row,$rout) {
    if($rout == 'START')
    $obj->color='0x0089c0'; // Цвет
}
 
 
 
$addHandler=array
        (
        'index'=>'index_hook',
);
 
?>
  • * Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopcloudelement="php/hook/cloud.hook.php";


Изменение формата решетки между товарами на главной странице (спецпредложений и новинок)

Требуется сменить вывод сетки товаров с табличной(table/tr/td) на блочную(div/div/div).

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/setindexcelltodiv.hook.php с содержанием
 
<?php
/*
* Изменение сетки между товарами
*/
function setcell_div_hook($obj,$arg) {
 
    $div=null;
    $panel=array('panel_l','panel_r','panel_l','panel_r','panel_l');
 
    foreach($arg as $key=>$val) {
        if(!empty($val)) {
            $div.='<div class="'.$panel[$key].'">'.$val.'</div>';
        }
    }
 
    return $div;
}
 
$addHandler=array
        (
        'setCell'=>'setcell_div_hook'
 
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopproductindexelements="php/hook/setindexcelltodiv.hook.php";


Уменьшение количества знаков в описании элемента спецпредложений

Для корректировки описания товара в спецпредложениях на главной странице следуйте инструкции.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/specindex.hook.php с содержанием
 
<?php
/**
 * Уменьшение описания
 */
function product_grid_hook($obj,$row){
    $obj->set('productDes',substr($row['description'],0,22).'...');
}
 
$addHandler=array
        (
        'product_grid'=>'product_grid_hook'
);
 
?>

Функция урежет краткое описание до 22 символов. Вместо 22 можно указать требуемое количество знаков.

  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopproductelements="php/hook/specindex.hook.php";

Добавление пятого товара в элементе спецпредложений

В элементе спецпредложений на главной странице можно выставит параметр вывода товара от 1 до 3 (Настройка "Товаров в длину для витрины главной страницы"). Для добавления 4-го товара следуйте инструкции.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/specindex.hook.php с содержанием
 
<?php
/**
 * Добавление 4-го товара
 */
function specMain_hook($obj) {
    $obj->cell=4;
}
 
$addHandler=array
        (
        'specMain'=>'specMain_hook'
);
 
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopproductindexelements="php/hook/specindex.hook.php";

Изменение сетки и количества товара в элементе новинки

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

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/mainnew.hook.php с содержанием
 
<?php
/**
 * Изменение сетки товаров в "Новинках"
 * @param array $obj объект
 */
function specMainIcon_hook($obj) {
 
    $obj->cell=2; // Размер сетки, вывод в 2 товара длиной
    $obj->limitspec=4; // Количество выводимых товаров
 
}
 
$addHandler = array
    (
    'specMainIcon' => 'specMainIcon_hook'
);
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopproducticonelements="php/hook/mainnew.hook.php";

Изменение количества товара в элементе сейчас покупают

Требуется изменить количество товаров для выборки и количество последних анализируемых заказов. Показывать только 5 последних заказанных товаров из 5 последних заказов.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/nowbuy.hook.php с содержанием
 
<?php
/**
 * Изменение сетки товаров в "Сейчас покупают"
 * @param array $obj объект
 */
function nowBuy_hook($obj) {
   $obj->limitpos = 5; // Количество выводимых позиций
   $obj->limitorders = 5; // Количество запрашиваемых заказов
   $obj->cell=3; // Кол-во товара в длину
}
 
$addHandler=array
        (
        'nowBuy'=>'nowBuy_hook'
         );
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopproductindexelements="php/hook/nowbuy.hook.php";

Изменение сетки и количества товаров в элементе вывода новинок/спецпредложений на всех страницах

Требуется изменить количество товаров в длину в элементе новинки, выводимой через переменную @specMainIcon@. Элемент вывода товаров сбоку в виде иконок по умолчанию выводит товары в одну ячейку, нужно изменить ячейку на два.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/specicon.hook.php с содержанием
<?php
 
/**
 * Изменение сетки товаров в спецпредложениях
 * @param array $obj объект
 */
function specMainIcon_hook($obj) {
 
    // Увеличиваем сетку на 2
    $obj->cell=2;
 
    // Корректируем кол-во товаров для вывода
    $obj->limitspec=2;
}
 
 
 
$addHandler=array
        (
        'specMainIcon'=>'specMainIcon_hook',
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopproducticonelements="php/hook/specicon.hook.php";


Изменение количества мини-новостей

Требуется изменить кол-во мини-новостей с 5 (по умолчанию) на 4 из-за особенностей дизайна. Сделать возможным вывод мини-новостей с помощью @miniNews@ на всех страницах.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/news.hook.php с содержанием
<?php
/**
 * Изменение кол-ва новостей на главной странице
 * @param array $obj объект
 * @param array $row массив данных
 * @param string $rout роутер места вызовы модуля [START|MIDDLE|END]
 */
function news_index_hook($obj,$row,$rout) {
 
    if($rout == 'START'){
 
    // Кол-во
    $obj->limit=4;
 
    // Ограничение вывода только на главной
    $obj->disp_only_index=false;
    }
}
 
$addHandler=array
        (
        'index'=>'news_index_hook',
);
 
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopnewselement="php/hook/news.hook.php";

Изменение вида ссылок на подкаталоги в элементе таблица категорий

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

Решение: Учитывая, что за вывод элемента таблица категорий отвечает класс PHPShopShopCatalogElement, можно внедрить хук в метод template_cat_table(), отвечающий за шаблон вывода ссылок в элементе. Проанализировав информацию по возможным инъекциям хука в данном методе, можно составить хук.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/catalogelement.hook.php с содержанием
<?php
/**
 * Изменение шаблона ссылок таблицы категорий со строки на столбик
 * @param array $obj объект
 * @param array $val массив данных
 */
function template_cat_table_hook($obj,$val) {
    return PHPShopText::a('/shop/CID_'.$val['id'].'.html',$val['name'],$val['name']).PHPShopText::br();
}
 
$addHandler=array
        (
        'template_cat_table'=>'template_cat_table_hook'
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshopcatalogelement="php/hook/catalogelement.hook.php";

Шаблон блока каталога в таблице находится в phpshop/templates/имя шаблона/catalog/catalog_table_forma.tpl

Изменение сетки и ячеек в элементе новинок

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

Решение: Учитывая, что за вывод элемента новинок отвечает класс PHPShopProductIconElements, можно внедрить хук в метод setCell(), compile(). Проанализировав информацию по возможным инъекциям хука в данном методе, можно составить хук.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/iconelements.hook.php с содержанием
<?php
/**
 * Изменение формата решетки между товарами c <td> на <li>
 * @param array $obj объект
 * @param array $arg массив данных
 * @return string
 */
function setcell_hook($obj,$arg) {
    $li=null;
    $panel=array('panel_l','panel_r','panel_l','panel_r');
 
    foreach($arg as $key=>$val) {
        if(!empty($val)) {
            $li.='<li class="'.$panel[$key].'">'.$val.'</li>';
        }
    }
 
    return $li;
}
 
/**
 * Изменение формата решетки между товарами c <td> на <li>, компиляция списка в <ul>
 * @return string
 */
function compile_hook($obj) {
    $ul='<ul>'.$obj->product_grid.'</ul>';
    $obj->product_grid=null;
    return $ul;
}
 
$addHandler=array
        (
        'setCell'=>'setcell_hook',
        'compile'=>'compile_hook'
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopproducticonelements="php/hook/iconelements.hook.php";

В элементе PHPShopProductIconElements используется память событий PHPShop Memory, если активация хука не происходит, то следует отключить память через $memory.

Хук изменения логики генерации сетки товара может быть использован в любом элементе PHPShopShopCore и PHPShopProductElements

Вывод блока краткого описания товара из спец предложений на главной странице

Решение: Создадим новый элемент оформления через дизйн-хук. Для размещения персональных элементов зарезервирована папка php/element/ в шаблоне.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/element/index.hook.php с содержанием

Вариант А - вывод одного товара

 
<?php
/**
 * Элемент вывода случайного товаров переменную @showcase@
 */
class AddToTemplate extends PHPShopProductElements {
    var $debug=false;
 
    function AddToTemplate() {
        $this->objBase=$GLOBALS['SysValue']['base']['products'];
        parent::PHPShopProductElements();
    }
 
    function showcase() {
 
        // Проверка на индекс
        if($this->PHPShopNav->index()) {
 
            // Шаблон ячейки
            $template='product_showcase';
            $this->SysValue['templates']['product_showcase']='element/'.$template.'.tpl';
 
            // Количество ячеек для вывода товара
            $cell=1;
 
            // Кол-во товаров на странице
            $limit=1;
 
            // Случайные товары
            $where['id']=$this->setramdom($limit);
            $where['spec']="='1'";
            $where['enabled']="='1'";
 
            $this->dataArray[]=$this->select(array('*'),$where,array('order'=>'RAND()'),array('limit'=>$limit));
 
            // Если нет спецпредложений вывод случайного товара
            if(empty($this->dataArray[1]['id'])){
                    $where=null;
                    $this->dataArray=null;
                    $where['enabled']="='1'";
                    $this->dataArray[]=$this->select(array('*'),$where,array('order'=>'RAND()'),array('limit'=>$limit));
            }
 
            // Добавляем в дизайн ячейки с товарами
            $this->product_grid($this->dataArray,$cell,$template,$line=false);
 
            // Собираем и возвращаем таблицу с товарами
            $this->set('showcase',$this->compile());
        }
    }
}
 
 
// Добавляем в шаблон элемент вывода случайного товара в индекс
$AddToTemplate = new AddToTemplate();
$AddToTemplate->showcase();
?>

Вариант B - вывод более одного товара

 
<?php
/**
 * Элемент вывода случайного товаров переменную @showcase@
 */
class AddToTemplate extends PHPShopProductElements {
    var $debug=false;
 
    function AddToTemplate() {
        $this->objBase=$GLOBALS['SysValue']['base']['products'];
        parent::PHPShopProductElements();
    }
 
    function showcase() {
 
        // Проверка на индекс
        if($this->PHPShopNav->index()) {
 
            // Шаблон ячейки
            $template='product_showcase';
            $this->SysValue['templates']['product_showcase']='element/'.$template.'.tpl';
 
            // Количество ячеек для вывода товара
            $cell=1;
 
            // Кол-во товаров на странице
            $limit=3;
 
            // Случайные товары
            $where['id']=$this->setramdom($limit);
            $where['spec']="='1'";
            $where['enabled']="='1'";
 
            $this->dataArray=$this->select(array('*'),$where,array('order'=>'RAND()'),array('limit'=>$limit));
 
            // Если нет спецпредложений вывод случайного товара
            if(empty($this->dataArray[1]['id'])){
                    $where=null;
                    $this->dataArray=null;
                    $where['enabled']="='1'";
                    $this->dataArray[]=$this->select(array('*'),$where,array('order'=>'RAND()'),array('limit'=>$limit));
            }
 
            // Добавляем в дизайн ячейки с товарами
            $this->product_grid($this->dataArray,$cell,$template,$line=false);
 
            // Собираем и возвращаем таблицу с товарами
            $this->set('showcase',$this->compile());
        }
    }
}
 
// Добавляем в шаблон элемент вывода случайного товара в индекс
$AddToTemplate = new AddToTemplate();
$AddToTemplate->showcase();
?>

Вариант C - вывод более одного товара и изменение сетки ячеек

 
<?php
/**
 * Элемент вывода случайного товаров переменную @showcase@
 */
class AddToTemplate extends PHPShopProductElements {
    var $debug=false;
 
    function AddToTemplate() {
        $this->objBase=$GLOBALS['SysValue']['base']['products'];
        parent::PHPShopProductElements();
    }
 
    function showcase() {
 
        // Проверка на индекс
        if($this->PHPShopNav->index()) {
 
            // Шаблон ячейки
            $template='product_showcase';
            $this->SysValue['templates']['product_showcase']='element/'.$template.'.tpl';
 
            // Количество ячеек для вывода товара
            $cell=1;
 
            // Кол-во товаров на странице
            $limit=3;
 
            // Случайные товары
            $where['id']=$this->setramdom($limit);
            $where['spec']="='1'";
            $where['enabled']="='1'";
 
            $this->dataArray=$this->select(array('*'),$where,array('order'=>'RAND()'),array('limit'=>$limit));
 
            // Если нет спецпредложений вывод случайного товара
            if(empty($this->dataArray[1]['id'])){
                    $where=null;
                    $this->dataArray=null;
                    $where['enabled']="='1'";
                    $this->dataArray[]=$this->select(array('*'),$where,array('order'=>'RAND()'),array('limit'=>$limit));
            }
 
            // Добавляем в дизайн ячейки с товарами
            $this->product_grid($this->dataArray,$cell,$template,$line=false);
 
            // Собираем и возвращаем таблицу с товарами
            $this->set('showcase',$this->compile());
        }
    }
 
    /**
     * Изменение формата решетки между товарами c <td> на <li>
     * @return string
     */
    function setCell($d1,$d2=null,$d3=null,$d4=null,$d5=null) {
        $li=null;
        $panel=array('panel_l','panel_r','panel_l','panel_r');
        $arg=func_get_args();
 
        foreach($arg as $key=>$val) {
            if(!empty($val)) {
                $li.='<li class="'.$panel[$key].'">'.$val.'</li>';
            }
        }
 
        return $li;
    }
    /**
     * Изменение формата решетки между товарами c <td> на <li>, компиляция списка в <ul>
     * @return string
     */
    function compile() {
        $ul='<ul>'.$this->product_grid.'</ul>';
        $this->product_grid=null;
        return $ul;
    }
 
}
 
 
// Добавляем в шаблон элемент вывода случайного товара в индекс
$AddToTemplate = new AddToTemplate();
$AddToTemplate->showcase();
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[autoload]
addtoindextemplate="php/element/index.hook.php";
  • Создать файл phpshop/templates/имя шаблона/element/product_showcase.tpl с содержанием
 
<table>
    <tr>
        <td>
            <div id="banner1"><h2>@productName@</h2>
                <div>@productDes@</div>
                <div>
                    <a href="/shop/UID_@productUid@.html" title="@productName@"><img src="images/more.gif" alt="" width="93" height="26" border="0" ></a>
                </div>
            </div></td>
        <td>
            <div>
                <a href="/shop/UID_@productUid@.html" title="@productName@">
                    <img src="@productImgBigFoto@"  alt="@productName@"  title="@productName@" border="0">
                </a>
            </div>
        </td>
    </tr>
</table>


Блок будет доступен по переменной @showcase@ в шаблоне phpshop/templates/имя шаблона/main/index.tpl

Настройка

  • Если требуется выводить элемент на всех страницах, то следует убрать условие
 
        // Проверка на индекс
        if($this->PHPShopNav->index()) {
        ...
        }
  • Количество ячеек для вывода товара задается в переменной $cell
  • Количество товаров для вывода $limit
  • Логика выборки товаров задается условием
 
            // Случайные товары
            $where['id']=$this->setramdom($limit);
            $where['spec']="='1'";
            $where['enabled']="='1'";

, где:

  1. $where['id']=$this->setramdom($limit) - оптимизационный случайный вывод товаров. Можно удалить при малом кол-ве товаров в спецпредложении.
  2. $where['spec']="='1'" - учет только товаров из спецпредложения. Можно удалить или заменить на $where['newtip']="='1'" для вывода новинок.
  3. $where['enabled']="='1'" - только товары в наличии

Изменение места вывода сопутствующих товаров

В дизайне изменен сопутствующих товаров с боковой панели на центральный блок под фотогалерею товара. Необходимо переопределить переменную вывода однотипных товаров с product_page_full.tpl на mail_product_forma_full.tpl

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/odnotip.hook.php с содержанием
 
<?php
 
/**
 * Изменение места вывода сопутствующих товаров
 */
function UID_odnotip_hook($obj,$row,$rout){
    if($rout == 'MIDDLE'){
        $obj->odnotip($row);
 
        // Обновляем информацию по главному товару
        $obj->set('productName', $row['name']);
        $obj->set('productArt', $row['uid']);
        $obj->set('productDes', $row['content']);
        $obj->set('productUid', $row['id']);
        $obj->set('productId', $row['id']);
        $obj->checkStore($row);
    }
}
 
$addHandler=array
        (
         'UID'=>'UID_odnotip_hook'
);
?>


  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshop="php/hook/odnotip.hook.php";

Изменение сетки сопутствующих товаров

В дизайне изменен вывод сопутствующих товаров с боковой панели на центральный блок под подробное описание товара. Необходимо изменить сетку сопутствующих товаров с 1 на 3 в длину.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/odnotip.hook.php с содержанием
 
<?php
 
/**
 * Изменение сетки сопутствующих товаров, сетка товаров = 3
 */
function odnotip_hook($obj,$row,$rout) {
    if($rout=='START') {
        $obj->odnotip_setka_num=3;
        $obj->template_odnotip='main_product_forma_3';
        $obj->line=true;
    }
}
 
$addHandler=array
        (
         'odnotip'=>'odnotip_hook',
);
?>


  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshop="php/hook/odnotip.hook.php";

Поиск

Изменение сетки вывода товара

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

Решение:

Учитывая, что за вывод товаров в результате поиска (shop/search/) отвечает класс PHPShopSearch, можно внедрить хук в метод words() и изменить свойство $cell. Проанализировав информацию по возможным инъекциям хука в данном методе, можно составить хук в начале функции по роутеру START.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/search.hook.php с содержанием
 
<?php
/**
 * Изменение сетки товаров в поиске
 */
function words_searchcore_hook($obj,$row,$rout) {
 
    if($rout == 'START'){
 
    // Задаем новую сетку
    $obj->cell=2;
 
    // Добавляем для красоты разделите между сеткой
    $obj->line=true;
    $obj->grid=true;
 
    // Корректировка количества товара на странице поиска
    $obj->num_row=50;
    }
}
 
 
 
$addHandler=array
        (
        'words'=>'words_searchcore_hook',
);
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopsearch="php/hook/search.hook.php";

Изменение логики поиска и/или

В форме вывода результат поиска используется по умолчанию логика поиска "и", нужно поменять на "или" и поиск по всем полям сразу.

Решение: Учитывая, что за вывод товаров в результате поиска (shop/search/) отвечает класс PHPShopSearch, можно внедрить хук в метод words(). Проанализировав информацию по возможным инъекциям хука в данном методе, можно составить хук в начале функции по роутеру START.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/search.hook.php с содержанием
 
<?php
/**
 * Изменение логики поиска
 */
function words_searchcore_hook($obj,$row,$rout) {
 
    if($rout == 'START'){
 
    // Длина пагинации
    $obj->nav_len = 7;
 
 
    // Задаем новые параметры логики поиска
    if(empty($_REQUEST['pole'])) $_REQUEST['pole']=2;
    if(empty($_REQUEST['set'])) $_REQUEST['set']=2;
    }
}
 
 
 
$addHandler=array
        (
        'words'=>'words_searchcore_hook',
);
 
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopsearch="php/hook/search.hook.php";

Товары

Вывод хлебных крошек в подробном описании товара под ценой

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/uid.hook.php с содержанием
<?php
 
/**
 * Хук хлебных крошек 
 */
function uid_bread_crumbs_hook($obj, $row, $rout) {
 
     if($rout == 'MIDDLE'){
 
     // Навигация хлебных крошек с сылками
     $obj->navigation($obj->category, $row['name']);
 
     // Имя каталога
     $obj->set('catalogCategory', $obj->category_name);
 
     // ID категории
     $obj->set('pcatalogId', $obj->category);
     }   
}
 
$addHandler = array
    (
    'UID' => 'uid_bread_crumbs_hook'
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshop="php/hook/uid.hook.php";
  • Добавить @breadCrumbs@,@catalogCategory@ и @pcatalogId@ в шаблон product/main_product_forma_full.tpl

Добавление в Title подробного описания артикул товара

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/title.hook.php с содержанием
<?php
 
/**
 * Хук замены title
 */
function set_meta_hook($obj, $row) {
 
     $obj->doLoadFunction('PHPShopShop', 'set_meta', $row);
     $obj->title=str_replace($row['name'],$row['name'].' '.$row['uid'],$obj->title);
     return true;
 
}
 
$addHandler = array
    (
    'set_meta' => 'set_meta_hook'
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshopcore="php/hook/title.hook.php";

Изменение нумерации страниц в навигации по товарам

Требуется изменить вид станиц в навигации с 1-3 | 3-6 на 1 | 2


Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/paginator.hook.php с содержанием
<?php
 
/**
 * Хук замены обозначения страниц в пагинаторе
 * @param Obj $obj объект
 * @param string $old_paginator содержание пагинатора начального
 * @param string $rout 
 */
function setPaginator_hook($obj, $old_paginator, $rout) {
    if ($rout == 'END') {
 
      // Какие фразы менять
      $old=array('1-3','3-6');
 
      // На что менять
      $new=array('1','2');
 
      $obj->set('productPageNav', str_replace($old, $new, $old_paginator));
    }
}
 
$addHandler = array
    (
    'setPaginator' => 'setPaginator_hook'
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshopcore="php/hook/paginator.hook.php";

Изменение количества товаров на странице спецпредложений

Требуется изменить количество товаров на странице спецпредложений /spec/.


Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/spec.hook.php с содержанием
<?php
/**
 * Изменение сетки товаров в спецпредложениях
 * @param array $obj объект
 * @param array $row массив данных
 * @param string $rout роутер места вызовы модуля [START|MIDDLE|END]
 */
function index_speccore_hook($obj,$row,$rout) {
 
    if($rout == 'START')
    $obj->cell=4;
}
 
 
 
$addHandler=array
        (
        'index'=>'index_speccore_hook',
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopspec="php/hook/spec.hook.php";


Форматирование цены

Требуется отформатировать цену у товара для разделение тысяч (10 200 руб.)

Инструкция форматирования цены

Вывод заданной характеристики в закладке

Требуется в подробном описании товара создать дополнительную закладку "Тип загрузки" и вывести в нее значение характеристики "Тип загрузки". Инструкция вывода характеристики в закладке

Изменение сортировки товара по артикулу или складу

Требуется изменить сортировку по умолчанию в каталоге товаров на вывод товаров в убывающем порядке на основе склада. Второй вариант сделать сортировку на основе артикула. Инструкция изменение сортировки товара

Добавление для товаров прозрачного стиля блока описания

Требуется для товаров под заказ изменить форму краткого описания на прозрачную для наглядного предупреждения пользователя об отсутствующем товаре на складе. Инструкция изменение прозрачности товара

Изменение формата решетки между товарами

Требуется сменить вывод сетки товаров с табличной(table/tr/td) на блочную(div/div/div).

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/setcelltodiv.hook.php с содержанием
 
<?php
/*
* Изменение сетки между товарами
*/
function setcell_div_hook($obj,$arg) {
 
    $div=null;
    $panel=array('panel_l','panel_r','panel_l','panel_r','panel_l');
 
    foreach($arg as $key=>$val) {
        if(!empty($val)) {
            $div.='<div class="'.$panel[$key].'">'.$val.'</div>';
        }
    }
 
    return $div;
}
 
$addHandler=array
        (
        'setCell'=>'setcell_div_hook'
 
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshop="php/hook/setcelltodiv.hook.php";

Редактирование списка подчиненных товаров

Список подчиненных товаров в подробном описании товара может быть изменен.
Инструкция изменения списка подчиненных товаров

Дописывание в имя товара данных из значений характеристик

Требуется дописать в имя товара значение характеристики Бренд. Имеем имя товара "Машинка для стрижки 5070", требуется выводить "Машинка для стрижки 5070 PHILIPS".

Решение:

Зная, что за генерацию переменной имени товара отвечает класс PHPShopShopCore, можно внедрить хук в метод product_grid() и дописать в переменную @productName@ значение характеристики имени бренда. Этим хуком мы сможем изменить имя товара в списке товаров (shop/CID_XXX.html), для внесения изменения в списки товаров в блоках (спецпредложения, новинки) нужно создать такой же хук для PHPShopProductElements. Для подробного описания товара нужно внедрить хук в класс PHPShopShop в метод UID().

Для дописывания данных в существующую переменную шаблонизатора используется метод set() с аргументом true.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/name.hook.php с содержанием
 
<?php
 
 
// Глобальный массив данных по требуемой характеристики. Указываем имя Бренд, по которому будет производиться поиск.
PHPShopObj::loadClass('sort');
if(empty($GLOBALS['PHPShopSortSearch']))
$GLOBALS['PHPShopSortSearch'] = new PHPShopSortSearch('Бренд');
 
/**
* Добавление имени характеристики к товару
*/
function product_grid_hook($obj,$row) {
    global $PHPShopSortSearch;
 
    // Ищем значение характеристики
    $sort=$PHPShopSortSearch->search(unserialize($row['vendor_array']));
 
    // Дописываем бренд в конец имени товара
    $obj->set('productName',' ('.$sort.')',true);
 
    // Дописываем бренд в конец описания
    $obj->set('productDes',' Бренд: '.$sort,true);
}
 
$addHandler=array
        (
        'product_grid'=>'product_grid_hook',
        'UID'=>'product_grid_hook'
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshopcore="php/hook/name.hook.php";
phpshopproductelements="php/hook/name.hook.php";
phpshopshop="php/hook/name.hook.php";

Для вывода значения Мощность вместо Бренд нужно указать требуемое имя в вызове класса $GLOBALS['PHPShopSortSearch'] = new PHPShopSortSearch('Мощность'); Имя характеристики должно совпадать по базе в точности до буквы.

Добавление пятого товара в ячейке каталога

В карточке каталога можно выставит параметр вывода товара от 1 до 4. Для добавления 5-го товара следуйте инструкции.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/shopcore.hook.php с содержанием
 
<?php
/**
 * Добавление пятого товара
 */
function CID_Product_hook($obj,$row,$rout) {
 
    if($rout == 'START'){
    $obj->SysValue['templates']['main_product_forma_5']="product/main_product_forma_4.tpl";
    $obj->PHPShopCategory->setParam('num_row', 5);
    } 
 
}
 
$addHandler=array
        (
        'CID_Product'=>'CID_Product_hook'
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshop="php/hook/shopcore.hook.php";

Режим сортировки мультивалютных товаров по цене

В версию Enterprise 4.1 добавлена возможность учета мультивалютных товаров при подборе и сортировке по цене.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/shopcore.hook.php с содержанием
 
<?php
/**
 * Изменение лимита вывода товаров до 500
 */
function CID_Product_hook($obj,$row,$rout) {
 
    if($rout == 'START'){
 
         // Сортировка мультивалютных товаров по цене
        $obj->multi_currency_search = true;
    } 
 
}
 
$addHandler=array
        (
        'CID_Product'=>'CID_Product_hook'
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshop="php/hook/shopcore.hook.php";


Для шаблонов bootstrap достаточно вписать в файл phpshop/templates/имя шаблона/php/hook/shopcore.hook.php в функцию template_CID_Product() активацию режима:

 
<?php
function template_CID_Product($obj, $data, $rout) {
    if ($rout == 'START') {
 
        // Сортировка мультивалютных товаров по цене
        $obj->multi_currency_search = true;
 
    ......
?>

Снятие лимита на вывод всех товаров

Ссылка "Показать все" по умолчанию выводит не более 100 товаров из-за возможности наложения лимитов у хостингов. При наличии мощного хостинга и нужды вывода всех товаров, можно изменить этот лимит.

Решение: Зная, что за вывод списка товаров в категориях (shop/CID_XXX.html) отвечает класс PHPShopShop, можно внедрить хук в метод CID_Product() и изменить свойство $max_item. Проанализировав информацию по возможным инъекциям хука в данном методе, можно составить хук в начале функции по роутеру START.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/shopcore.hook.php с содержанием
 
<?php
/**
 * Изменение лимита вывода товаров до 500
 */
function CID_Product_hook($obj,$row,$rout) {
 
    if($rout == 'START'){
    $obj->max_item=500;
    } 
 
}
 
$addHandler=array
        (
        'CID_Product'=>'CID_Product_hook'
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshop="php/hook/shopcore.hook.php";

Добавление автоматического переноса строк в карточку подробного описания товара

Необходимо заменять переводы строк \n на тег
на странице подробного описания.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/description.hook.php с содержанием
 
<?php
/**
 * Добавление краткого описания
 */
function UID_description_hook($obj,$row,$rout) {
 
    if($rout == "MIDDLE")
      $obj->set('productDes',nl2br($row['content']));
}
 
$addHandler=array
        (
        'UID'=>'UID_description_hook'
);
?>


  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshop="php/hook/description.hook.php";
  • В зависимости от задачи, добавить соответствующую новую переменную @productSmallDescription@ в шаблон вывода товара Main_product_forma_full.tpl.

Добавление краткого описания в карточку подробного описания товара

Необходимо на страницу подробного описания вывести дополнительно блок с кратким описанием товара.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/description.hook.php с содержанием
 
<?php
/**
 * Добавление краткого описания
 */
function UID_description_hook($obj,$row,$rout) {
 
    // Назначаем переменную @productSmallDescription@
    if($rout == "MIDDLE")
      $obj->set('productSmallDescription',$row['description']);
}
 
$addHandler=array
        (
        'UID'=>'UID_description_hook'
);
?>


  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshop="php/hook/description.hook.php";
  • В зависимости от задачи, добавить соответствующую новую переменную @productSmallDescription@ в шаблон вывода товара Main_product_forma_full.tpl.

Замена информации о наличии товара на складе

Необходимо заменить надпись при выводе товара "В наличие: кол-во шт." на картинку. Если товар есть в наличии, выводится одна картинка, если товара в наличии нету - выводится другая картинка.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/items.hook.php с содержанием
 
<?php
/**
 * Изменение вида информации о складе
 */
function checkStore_hook($obj,$row) {
 
    // Изображение наличие на складе
    if(empty($row['items']))
        $obj->set('productSklad',PHPShopText::img('images/shop/items_on.gif'));
    else $obj->set('productSklad',PHPShopText::img('images/shop/items_off.gif'));
 
    // Изображение товар под заказ
    if(empty($row['sklad'])) 
       $obj->set('enabledIco',PHPShopText::img('images/shop/sklad_onn.gif'));
 
    // Изображение наличие иконки к товару
    if(!empty($row['pic_small'])) 
       $obj->set('picOn',PHPShopText::img('images/shop/pic_on.gif'));
 
    // Изображение статуса новинки
    if(!empty($row['newtip'])) 
       $obj->set('newtipIco',PHPShopText::img('images/shop/newtip_ok.gif'));
 
    // Изображение статуса спецпредложения
    if(!empty($row['spec'])) 
       $obj->set('newtipIco',PHPShopText::img('images/shop/spec_ok.gif'));
 
    // Прячем вывод цена и корзины при нулевой цене
    if(!empty($row['price'])) {
        $obj->set('ComStartCart', PHPShopText::comment('<'));
        $obj->set('ComEndCart', PHPShopText::comment('>'));
        $obj->set('productPrice', null);
        $obj->set('productValutaName', null);
    }
 
    return true;
}
 
$addHandler=array
        (
        'checkStore'=>'checkStore_hook'
);
?>

где images/shop/items_on.gif - путь картинки положительного склада, images/shop/items_off.gif - отрицательного склада и т.д. Картинки должны лежать в папке phpshop/templates/имя шаблона/

  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshopcore="php/hook/items.hook.php";

Замена изображений

Требуется заменить вывод маленького изображение на большое в списке товаров для переменной @productImg@

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/image.hook.php с содержанием:
 
<?php
 
function checkStore_hook($obj,$row) {
 
    // Большое изображение товара вместо маленького
    $obj->set('productImg',$obj->checkMultibase($row['pic_big']));
    return true;
}
 
$addHandler=array
        (
        'checkStore'=>'checkStore_hook'
);
?>


  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshopcore="php/hook/image.hook.php";

Добавление второй цены

Требуется вывести вторую цену товара.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/items.hook.php с содержанием
 
<?php
 
function checkStore_hook($obj,$row) {
 
    // Вторая цена
    $obj->set('productPrice2',PHPShopProductFunction::GetPriceValuta($row['id'],$row['price2'],$row['baseinputvaluta']));
 
    // Если нужны остальные цены
    $obj->set('productPrice3',PHPShopProductFunction::GetPriceValuta($row['id'],$row['price3'],$row['baseinputvaluta']));
    $obj->set('productPrice4',PHPShopProductFunction::GetPriceValuta($row['id'],$row['price4'],$row['baseinputvaluta']));
    $obj->set('productPrice5',PHPShopProductFunction::GetPriceValuta($row['id'],$row['price5'],$row['baseinputvaluta']));
    return true;
}
 
$addHandler=array
        (
        'checkStore'=>'checkStore_hook'
);
?>


  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshopcore="php/hook/items.hook.php";
  • Добавить переменную @productPrice2@ во все требуемые шаблоны вывода товара из папки phpshop/templates/имя шаблона/product/

Добавление второй цены в другой валюте

Требуется вывести вторую цену товара в другой валюте рядом с первой.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/items.hook.php с содержанием
<?php
function checkStore_hook($obj,$row) {
    global $PHPShopValutaArray;
 
    // ИД второй валюты
    $duo_currency=5;
 
    $Valuta=$PHPShopValutaArray->getArray();
    $format = $obj->PHPShopSystem->getSerilizeParam("admoption.price_znak");
 
    // Если валюта совпадает
    if($_SESSION['valuta'] == $duo_currency) {
        $currency=$obj->PHPShopSystem->getValue('dengi');
    }
    else
        $currency=$duo_currency;
 
    $price=PHPShopProductFunction::GetPriceValuta($row['id'],$row['price'],$row['baseinputvaluta']);
    $code=$Valuta[$currency]['code'];
 
    // Если валюта совпадает
    if($_SESSION['valuta'] == $duo_currency) {
        echo 1;
        $price=$price/$Valuta[$duo_currency]['kurs'];
    }
    else {
        $price=$price*$Valuta[$currency]['kurs'];
 
    }
 
    // Наценка
    $price=($price+(($price*$obj->PHPShopSystem->getValue('percent'))/100));
 
    $obj->set('productPrice2',number_format($price,$format,'.','').' '.$code);
    return true;
}
 
$addHandler=array
        (
        'checkStore'=>'checkStore_hook'
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshopcore="php/hook/items.hook.php";
  • Добавить переменную @productPrice2@ во все требуемые шаблоны вывода товара из папки phpshop/templates/имя шаблона/product/
  • Указать ИД требуемой валюты для второй цены в переменной $duo_currency.

Для добавления второй цены в другой валюте в остальные элементы следуйте расширенной инструкции.

Каталоги товаров

Добавление иконки в блок главных каталогов

Требуется добавить поле вывода изображения каталога icon в форму вывода таблицы каталогов на главной странице.

Инструкция:'

  • Создать файл phpshop/templates/имя шаблона/php/hook/catalogelement.hook.php с содержанием
<?php
/**
 * изменение сортировки корневых каталогов
 */
function leftCatalTable_hook($obj,$data,$rout) {
     if ($rout == 'END') {
 
        if (is_array($data)){
                $obj->set('catalogIcon', $data['icon']);
        }
    }
}
 
$addHandler=array
        (
        'leftCatalTable'=>'leftCatalTable_hook'
);
?>
  • Добавить переменную в файл phpshop/templates/имя шаблона/catalog/catalog_table_forma.tpl тег изображения
 
<img src="@catalogIcon@">
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshopcatalogelement="php/hook/catalogelement.hook.php";

Изменение сортировки главных каталогов

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

Инструкция:'

  • Создать файл phpshop/templates/имя шаблона/php/hook/catalogelement.hook.php с содержанием
<?php
/**
 * изменение сортировки корневых каталогов
 */
function leftCatal_hook($obj,$row,$rout) {
        if($rout == 'START')
          $obj->root_order = 'name';
}
 
$addHandler=array
        (
        'leftCatal'=>'leftCatal_hook'
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshopcatalogelement="php/hook/catalogelement.hook.php";

Вывод второго каталога товаров

Требуется вывести элемент каталога товаров @leftCatal@ в виде его зеркала под именем переменной @leftCatal2@ с измененным стилем вывода.

Инструкция вывода второго каталога


Добавление в список каталогов блока товаров из спецпредложений

Требуется в список каталогов (shop/CID_XXX.html) добавить ниже несколько товаров из спецпредложений.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/cell.hook.php с содержанием
<?php
/**
 * Добавление в список каталогов спецпредложения товаров в 3 ячейки, лимит 3
 */
function cid_category_add_spec_hook($obj,$row) {
    global $PHPShopProductIconElements;
 
    // Случайный выбор каталога
    if(is_array($row))
        foreach($row as $val)
            $cat[]=$val['id'];
    $rand=rand(0,count($cat)-1);
 
    // Используем элемент вывода спецпредложений
    $PHPShopProductIconElements->template='main_product_forma_3';
    $spec=$PHPShopProductIconElements->specMainIcon(false,$cat[$rand],3,3,true);
    $spec=PHPShopText::div(PHPShopText::p($spec),$align="left",$style='float:none;padding:10px');
 
    // Добавляем в переменную списка категорий вывод спецпредложений
    $obj->set('catalogList',$spec,true);
}
 
$addHandler=array
        (
        'CID_Category'=>'cid_category_add_spec_hook'
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshop="php/hook/cell.hook.php";

Изменения вида списка подкаталогов

Требуется изменить вид списка подкаталогов (shop/CID_XXX.html). По-умолчанию выводится списком li, нужно изменить форму вывода.

Решение: Учитывая, что за вывод элемента таблица категорий отвечает класс PHPShopShop, можно внедрить хук в метод CID_Category(), отвечающий за вывод списка категорий. Проанализировав информацию по возможным инъекциям хука в данном методе, можно составить хук.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/cataloglist.hook.php с содержанием
<?php
/**
 * Изменение списка подкаталогов в каталоге с <li> на <div> + описание
 */
function cid_category_hook($obj,$dataArray,$rout) {
 
    $dis=null;
    if($rout=='END') {
        if(is_array($dataArray))
            foreach($dataArray as $row) {
                $content=PHPShopText::a($obj->path.'/CID_'.$row['id'].'.html',$row['name']);
 
                // Если требуется выводить описание каталога
                $content.=PHPShopText::p($row['content']);
 
                $dis.=PHPShopText::div($content,$align="left",$style='float:left;padding:10px');
            }
 
        // Переназначаем переменную списка категорий
        $obj->set('catalogList',$dis);
    }
}
 
$addHandler=array
        (
        'CID_Category'=>'cid_category_hook'
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshop="php/hook/cataloglist.hook.php";

Прайс-лист

Добавление поля количества товара в корзине

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

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/price.hook.php с содержанием
 
<?php
 
/**
 * Добавление поля кол-во товара в корзине для прайс-листа
 */
function product_pricecore_hook($obj,$data,$rout) {
    if($rout == 'END') {
        $dis=null;
        // Добавляем в дизайн ячейки с товарами
        if(is_array($data))
            foreach($data as $row) {
                $name=PHPShopText::a($obj->seourl($row),$row['name']);
                $idn='n'.$row['id'];
                $cart=PHPShopText::a('javascript:AddToCartNum('.$row['id'].',\''.$idn.'\')',PHPShopText::img('images/shop/basket_put.gif',false,'absMiddle'),$obj->lang('product_sale'));
 
                $num=PHPShopText::setInputText(null,"$idn",1,30);
                $dis.=$obj->tr('#ffffff',$name,$obj->price($row).' '.$obj->currency(),$num,$cart);
            }
    return $dis;
    }
}
 
$addHandler=array
        (
        'product'=>'product_pricecore_hook',
);
?>


  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopprice="php/hook/price.hook.php";

Добавление второй цены

Требуется вывести вторую цену товара в раздел прайс-листа.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/price.hook.php с содержанием
 
<?php
 
/**
 * Добавление поля кол-во товара в корзине для прайс-листа
 */
function product_price2core_hook($obj,$data,$rout) {
    if($rout == 'END') {
        $dis=null;
        // Добавляем в дизайн ячейки с товарами
        if(is_array($data))
            foreach($data as $row) {
                $name=PHPShopText::a($obj->seourl($row),$row['name']);
                if(empty($row['sklad']))
                $cart=PHPShopText::a('javascript:AddToCart('.$row['id'].')',PHPShopText::img('images/shop/basket_put.gif',false,'absMiddle'),$obj->lang('product_sale'));
                else $cart=PHPShopText::a('../users/notice.html?productId='.$row['id'],PHPShopText::img('images/shop/date.gif',false,'absMiddle'),$obj->lang('product_notice'));
 
                // Цена 2 с учетом валюты
                $price_dop=PHPShopProductFunction::GetPriceValuta($row['id'],$row['price2'],$row['baseinputvaluta']);
 
                // Если нужны остальные цены
                $price_dop.=' / '.PHPShopProductFunction::GetPriceValuta($row['id'],$row['price3'],$row['baseinputvaluta']);
                $price_dop.=' / '.PHPShopProductFunction::GetPriceValuta($row['id'],$row['price4'],$row['baseinputvaluta']);
                $price_dop.=' / '.PHPShopProductFunction::GetPriceValuta($row['id'],$row['price5'],$row['baseinputvaluta']);
 
                $dis.=$obj->tr('#ffffff',$name,$obj->price($row).' / '.$price_dop.' '.$obj->currency(),$cart);
            }
    return $dis;
    }
}
 
$addHandler=array
        (
        'product'=>'product_price2core_hook',
);
?>


  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopprice="php/hook/price.hook.php";

Характеристики

Добавление в таблицу характеристик артикула

Требуется в подробное описание товара в таблицу характеристик добавить артикул товара.

Решение:

Зная, что за генерацию подробного описания товаров отвечает класс PHPShopShop, можно внедрить хук в метод sort_table() и изменить вид списка таблицы характеристик. Проанализировав информацию по возможным инъекциям хука в данном методе, можно составить хук в начале функции и полностью перевести дальнейшее выполнение функции на хук для предотвращения зеркального обращения к БД.

Инструкция добавление в таблицу характеристик артикула

Группировка таблицы характеристик по наборам

Требуется в подробном описании товара изменить вывод таблицы характеристики товар, объединив их согласно наборам характеристик.

Инструкция объединения характеристик в наборы

Вывод таблицы характеристик в кратком описании товара

Требуется добавить вывод таблицы с характеристиками в кратком описании товара в каталогах.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/sort.hook.php с содержанием
 
<?php
 
/**
 * Вывод характеристик в кратком описании  товара
 */
function checkStore_add_sorttable_hook($obj, $row) {
    if (empty($obj->category)) {
        $obj->PHPShopCategory = new PHPShopCategory($row['category']);
    }
    $obj->doLoadFunction('PHPShopShop', 'sort_table', $row, 'shop');
    return true;
}
 
 
 
$addHandler=array
        (
        'checkStore'=>'checkStore_add_sorttable_hook'
);
 
?>


  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshopcore="php/hook/sort.hook.php";

Изменение шаблона вывода фильтров товара

Требуется изменить форму вывода фильтров товара в ссылках вида (/shop/CID_XX.html) с выпадающего списка на ссылки.

Решение: Учитывая, что за имя функции-шаблона вывода фильтров отвечает свойство $sort_template, можно внедрить хук в метод CID_Product() с роутером START для переназначения имени функции шаблонизатора.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/cell.hook.php с содержанием
 
<?php
 
function cid_product_sorttemplate_hook($obj,$row,$rout){
    if($rout == 'START'){
        $obj->sort_template = 'sorttemplatehook';
    }
}
 
/**
 * Шаблон вывода характеристик
 * @param array $value массив значений $value[]=array('моя цифра 1',123,'selected');
 * @param int $n integer
 * @param string $title название характеристики
 * @param array $vendor массив значений характеристик товара
 * @return string 
 */
function sorttemplatehook($value, $n, $title, $vendor) {
    $disp = null;
 
    if (is_array($value)) {
        foreach ($value as $p) {
            if (is_array($vendor[$n])) {
                foreach ($vendor[$n] as $value) {
 
                    if ($value == $p[1])
                        $text = PHPShopText::b($p[0]);
                    else
                        $text = $p[0];
 
                    $disp.=PHPShopText::br() . PHPShopText::a('?v[' . $n . ']=' . $p[1], $text, $p[0], $color = false, $size = false, $target = false, $class = false);
                }
            }else {
                if ($vendor[$n] == $p[1])
                    $text = PHPShopText::b($p[0]);
                else
                    $text = $p[0];
 
                $disp.=PHPShopText::br() . PHPShopText::a('?v[' . $n . ']=' . $p[1], $text, $p[0], $color = false, $size = false, $target = false, $class = false);
            }
        }
    }
    return $disp;
}
 
$addHandler=array
        (
            'CID_Product'=>'cid_product_sorttemplate_hook'
 
);
?>


  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshop="php/hook/cell.hook.php";

Шаблон вывода фильтров находится в функции sorttemplatehook(), описанная на шаг выше.

Личный кабинет пользователя

Изменение доступных файлов отчетных документов

В лично кабинете пользователя при активном режиме синхронизации с 1С доступна загрузка документов (счетов и счет-фактур) в трех разных форматах HTML, XLS и DOC. Требуется оставить лишь расширение XLS.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/userorderdoclink.hook.php с содержанием
 
<?php
 
function userorderdoclink_mod_supplierdate_hook($obj, $value) {
 
    if (is_array($value['row'])) {
 
        // Описание столбцов
        $dis = $obj->caption(__('Документооборот'), __('Дата'), __('Загрузка'));
        $n = $value['val']['id'];
        foreach ($value['row'] as $row) {
 
            // Счета
            if ($obj->PHPShopSystem->ifValue('1c_load_accounts')) {
                $link_xls = '../files/docsSave.php?orderId=' . $n . '&list=accounts&tip=xls&datas=' . $row['datas'];
                if (file_get_contents($link_xls)){
                $dis.=$obj->tr(PHPShopText::a($link_xls, __('Счет на оплату'), false, false, false, '_blank', 'b'), PHPShopDate::dataV($row['datas']), PHPShopText::a($link_xls, __('XLS'), __('ФорматExcel'), false, false, '_blank', 'b') 
                );
                }
            }
 
            // Счета-фактуры
            if (!empty($row['datas_f']) and $obj->PHPShopSystem->ifValue('1c_load_invoice')) {
                $link_xls = '../files/docsSave.php?orderId=' . $n . '&list=invoice&tip=xls&datas=' . $row['datas'];
                if (file_get_contents($link_xls)){
                $dis.=$obj->tr(PHPShopText::a($link_xls, __('Счет-фактура'), false, false, false, '_blank', 'b'), PHPShopDate::dataV($row['datas_f']), PHPShopText::a($link_xls, __('XLS'), __('Формат Excel'), false, false, '_blank', 'b') );
                }
            }
        }
 
        return $dis;
 
    }
 
}
 
$addHandler = array
    (
    'userorderdoclink' => 'userorderdoclink_mod_supplierdate_hook'
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
userorderdoclink="php/hook/userorderdoclink.hook.php";

Заказ

Изменение вывода доставок

Магазин имеет всего 3 доставки. Нужно сделать выбор доставок через радио-переключатели для облегчения выбора покупателям.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/order.hook.php с содержанием
 
<?php
 
 
/**
 * Вывод доставок через переключатели
 * @return boolean
 */
function delivery_hook($obj){
    $PHPShopDeliveryArray = new PHPShopDeliveryArray();
    $DeliveryArray = $PHPShopDeliveryArray->getArray();
 
    $disp=null;
    if(is_array($DeliveryArray))
        foreach($DeliveryArray as $key=>$row)
            $disp.=PHPShopText::setInput('radio', 'dostavka_metod', $row['id'],false,false,'document.getElementById(\'d\').value='.$key.';document.getElementById(\'makeyourchoise\').value=\'DONE\'',false,false,$row['city']);
 
    $disp.=PHPShopText::setInput('hidden', 'makeyourchoise', '');
    $obj->set('orderDelivery',$disp);        
    return true;
}
 
$addHandler=array
        (
             'delivery'=>'delivery_hook'
 
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshoporder="php/hook/order.hook.php";;

Списывание товара со склада

Требуется автоматические списывать товар со склада сразу после создания нового заказа пользователем

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/done.hook.php с содержанием
 
<?php
 
 
/**
 * Списываем количество со склада
 * @param array $obj объект
 * @param array $data массив данных
 * @param string $rout роутер места вызовы модуля [START|MIDDLE|END]
 */
function cancellation_from_warehouse($obj, $data, $rout) {
 
    if ($rout == 'START') {
        $carts = $obj->PHPShopCart->getArray();
        foreach ($carts as $cart) {
            $PHPShopOrm = new PHPShopOrm($GLOBALS['SysValue']['base']['products']);
            $row = $PHPShopOrm->select(array('items'), array('id' => '=' . intval($cart['id'])));
            if (is_array($row)) {
                $PHPShopOrm->clean();
                $items = $row['items'] - $cart['num'];
                $PHPShopOrm->update(array('items_new' => $items), array('id' => '=' . $cart['id']));
            }
        }
    }
 
 
}
 
$addHandler=array
        (
            'write' => 'cancellation_from_warehouse'
 
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopdone="php/hook/done.hook.php";;

Автозагрузка

Любой PHP код и условие можно писать сразу в шаблон (index.tpl,shop.tpl и т.д.), но если условие требуется вынести из кода шаблона, то можно воспользоваться автозагрузкой дизайн-хука и вынести всю PHP логику в отдельный php файл.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/autoload.hook.php с содержанием
 
<?php
 
// Пример вывода дополнительного HTML кода для авторизованных пользователей
if (!empty($_SESSION['UsersId'])){
$disp='<p><h1>Добро пожаловать, '.$_SESSION['UserLogin'].'!<h1></p>';
PHPShopParser::set('welcome',$disp);
}
 
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[autoload]
welcome="php/element/autoload.hook.php";
  • Вставить переменную @welcome@ в нужное место шаблона

Новости

Изменение количества новостей на странице

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

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/news.hook.php с содержанием
 
<?php
 
 
/**
 * Изменение количества новостей на странице
 */
function news_page_hook($obj, $data, $rout) {
 
         if($rout == 'START'){
            $obj->num_row=100; 
         }    
}
 
$addHandler=array
        (
            'index' => 'news_page_hook'
 
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopnews="php/hook/news.hook.php";;


Вывод мини-новостей на всех страницах

По умолчанию мини-новости выводятся только на главной странице. Требуется убрать это ограничение.

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/newselement.hook.php с содержанием
 
<?php
 
 
/**
 * Изменение количества новостей на странице
 */
function news_element_hook($obj, $data, $rout) {
 
         if($rout == 'START'){
            $obj->disp_only_index=false; 
         }    
}
 
$addHandler=array
        (
            'index' => 'news_element_hook'
 
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopnewselement="php/hook/newselement.hook.php";;

Разработка

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

  • Создать файл phpshop/templates/имя шаблона/php/element/lock.inc.php с содержанием
 
<?php
 
// Заглушка на время заполнения сайта
if(empty($_SESSION['logPHPSHOP']))
    exit('<h1>Сайт заполняется...<h1>');
 
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[autoload]
lock="php/element/lock.inc.php";

1С-Синхронизация

В базе 1С-хуков собраны наиболее полезные для синхронизации с 1С интернет-магазина наборы 1C-хуков, позволяющие реализовывать любые персонализации логики ПО.