Design Hook Sort Table Add CategoryName

Материал из PHPShop

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

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

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

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/sorttable.hook.php с содержанием
<?php
 
/**
 * Вывод имени набора характеристики
 */
function sort_table_get_category_name($category) {
    $PHPShopOrm = new PHPShopOrm($GLOBALS['SysValue']['base']['sort_categories']);
    $data=$PHPShopOrm->select(array('name'),array('id'=>'='.intval($category)),false,array('limit'=>1));
    return $data['name'];
}
 
/**
 * Вывод сортировок для товаров таблицей
 */
function sort_table_hook($obj, $row) {
    global $SysValue;
 
    $sort = $obj->PHPShopCategory->unserializeParam('sort');
    $vendor_array = unserialize($row['vendor_array']);
    $dis = null;
 
    if (is_array($sort))
        foreach ($sort as $v) {
            $sortCat.=' id=' . $v . ' OR';
        }
    $sortCat = substr($sortCat, 0, strlen($sortCat) - 2);
 
    if (!empty($sortCat)) {
 
        // Массив имен характеристик
        $PHPShopOrm = new PHPShopOrm();
        $PHPShopOrm->debug = $obj->debug;
        $result = $PHPShopOrm->query("select * from " . $SysValue['base']['table_name20'] . " where ($sortCat and goodoption!='1') order by num");
        while (@$row = mysql_fetch_assoc($result)) {
            $arrayVendor[$row['id']] = $row;
        }
 
 
        if (is_array($vendor_array))
            foreach ($vendor_array as $v) {
                foreach ($v as $value)
                    if (is_numeric($value))
                        $sortValue.=' id=' . $value . ' OR';
            }
        $sortValue = substr($sortValue, 0, strlen($sortValue) - 2);
 
        if (!empty($sortValue)) {
 
            // Массив значений характеристик
            $PHPShopOrm = new PHPShopOrm();
            $PHPShopOrm->debug = $obj->debug;
            $result = $PHPShopOrm->query("select * from " . $SysValue['base']['table_name21'] . " where $sortValue order by num");
            while (@$row = mysql_fetch_array($result)) {
                $arrayVendorValue[$row['category']]['name'] .= ", " . $row['name'];
            }
 
 
            // Создаем таблицу характеристик с учетом сортировки
            if (is_array($arrayVendor))
                foreach ($arrayVendor as $idCategory => $value)
                    if (!empty($arrayVendorValue[$idCategory]['name'])) {
                        if (!empty($value['name'])) {
 
                            if(empty($SortNameCatHook[$value['category']])){
                            $dis.= PHPShopText::tr(PHPShopText::b(sort_table_get_category_name($value['category'])),'');
                            $SortNameCatHook[$value['category']]=1;
                            }
 
                            if (!empty($value['page']))
                                $dis.=PHPShopText::tr(PHPShopText::b($value['name']) . ': ', PHPShopText::a('../page/' . $value['page'] . '.html', substr($arrayVendorValue[$idCategory]['name'], 2)));
                            else
                                $dis.=PHPShopText::tr(PHPShopText::b($value['name']) . ': ', substr($arrayVendorValue[$idCategory]['name'], 2));
                        }
                    }
 
            $disp = PHPShopText::table($dis);
            $obj->set('vendorDisp', $disp);
        }
    }
 
    return true;
}
 
$addHandler = array
    (
    'sort_table' => 'sort_table_hook',
);
 
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshop="php/hook/sorttable.hook.php";