Design Hook Parent

Материал из PHPShop

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

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

Решение:

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

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/parent.hook.php с содержанием
 
<?php
 
/**
* Изменение вида подчиненных товаров
*/
function parent_hook($obj,$row,$rout) {
 
    if($rout == 'START') {
 
        if(!empty($row['parent'])) {
            $parent=explode(",",$row['parent']);
 
            // Убираем добавление в корзину главного товара
            $obj->set('ComStartCart','<!--');
            $obj->set('ComEndCart','-->');
 
            // Собираем массив товаров
            if(is_array($parent))
                foreach($parent as $value) {
                    if(PHPShopProductFunction::true_parent($value)) $Product[$value] = $obj->ReturnProductData(array('*'), array('id'=>'='.$value,'enabled'=>"='1'",'sklad'=>"!='1'"));
                    else $Product[$value] = $obj->select(array('*'), array('id'=>'='.$value,'enabled'=>"='1'"),false,false,__FUNCTION__);
                }
 
            // Цена главного товара
            if(!empty($row['price'])) {
                $select_value[]=array($row['name']." -  (".$obj->price($row)."
                    ".$obj->get('productValutaName').')',$row['id'],false);
            }
 
 
            // Убираем основной товар из списка подтипов
            unset($select_value[0]);
 
            // Выпадающий список товаров
            if(is_array($Product))
                foreach($Product as $p) {
                    if(!empty($p)) {
 
                        // Если товар на складе
                        if(empty($p['priceSklad'])) {
                            $price=$obj->price($p);
 
                            // Убираем название основного товара из подчиненного
                            //$select_value[]=array(str_replace($row['name'],'', $p['name']).' -  ('.$price.' '.$obj->get('productValutaName').')',$p['id'],false);
 
                            $select_value[]=array($p['name'].' -  ('.$price.' '.$obj->get('productValutaName').')',$p['id'],false);
                        }
                    }
                }
 
            $obj->set('parentList',PHPShopText::select('parentId',$select_value,false));
            $obj->set('productParentList',ParseTemplateReturn("product/product_odnotip_product_parent.tpl"));
            $obj->set('productPrice','');
            $obj->set('productPriceRub','');
            $obj->set('productValutaName','');
 
            return true;
        }
    }
}
 
$addHandler=array
        (
        'parent'=>'parent_hook'
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshop="php/hook/parent.hook.php";

В хуке так же закомментирована возможность изменения имени подчиненного товара путем вырезания из его имени название главного товара:

// Убираем название основного товара из подчиненного
$select_value[]=array(str_replace($row['name'],'', $p['name']).' -  ('.$price.' '.$obj->get('productValutaName').')',$p['id'],false);

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

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/parent.hook.php с содержанием
 
<?php
 
/**
 * Изменение вида подчиненных товаров
 */
function parent_table_hook($obj, $row, $rout) {
 
    if ($rout == 'START') {
        $dis = null;
 
        if (!empty($row['parent'])) {
            $parent = explode(",", $row['parent']);
 
            // Убираем добавление в корзину главного товара
            $obj->set('ComStartCart', '<!--');
            $obj->set('ComEndCart', '-->');
 
            // Собираем массив товаров
            if (is_array($parent))
                foreach ($parent as $value) {
                    if (PHPShopProductFunction::true_parent($value))
                        $Product[$value] = $obj->ReturnProductData(array('*'), array('id' => '=' . $value, 'enabled' => "='1'", 'sklad' => "!='1'"));
                    else
                        $Product[$value] = $obj->select(array('*'), array('id' => '=' . $value, 'enabled' => "='1'"), false, false, __FUNCTION__);
                }
 
            // Возможность добавить в корзину главный товар
            //$dis.=PHPShopText::tr($row['name'], $obj->price($row) . ' ' . $obj->get('productValutaName'), PHPShopText::a('javascript:AddToCart(' . $row['id'] . ');', $obj->lang('product_sale')));
 
            // Выпадающий список товаров
            if (is_array($Product))
                foreach ($Product as $p) {
                    if (!empty($p)) {
 
                        // Если товар на складе
                        if (empty($p['priceSklad'])) {
                            $price = $obj->price($p);
                            $dis.=PHPShopText::tr($p['name'], $price . ' ' . $obj->get('productValutaName'), PHPShopText::a('javascript:AddToCartParentHook(' . $p['id'] . ',' . $row['id'] . ');', $obj->lang('product_sale')));
                        }
                    }
                }
 
            $js_function = '
<script> 
 // Добавление подчиненного товара в корзину N шт.
function AddToCartParentHook(xid,xxid) {
    var num=1;
    if(confirm("Добавить выбранный товар ("+num+" шт.) в корзину?")){
        ToCart(xid,num,xxid);
        initialize();
        setTimeout("initialize_off()",3000);
        if(document.getElementById("order")) document.getElementById("order").style.display="block";
    }
}
</script>
';
 
            $obj->set('productParentList', $js_function . PHPShopText::table($dis));
            $obj->set('productPrice', '');
            $obj->set('productPriceRub', '');
            $obj->set('productValutaName', '');
 
            return true;
        }
    }
}
 
$addHandler = array
    (
    'parent' => 'parent_table_hook'
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshop="php/hook/parent.hook.php";