Design Hook Sort Table

Материал из PHPShop

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

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

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

Решение:

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


Метод sort_table() из-за своего размера вынесен в отдельный файл phpshop/core/shop.core/sort_table.php, копируем всю функцию в файл phpshop/templates/имя шаблона/php/hook/sorttable.hook.php

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/sorttable.hook.php с содержанием
 
<?php
/**
* Редактирование таблицы характеристики
*/
function sort_table_hook($obj,$row) {
    global $SysValue;
 
    // Артикул товара
    $uid=$row['uid'];
 
    $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);
 
 
        // Добавляем артикул в начале таблицы
        $dis.=PHPShopText::tr(PHPShopText::b('Артикул:').': ',$uid);
 
        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'];
            }
 
 
            // Создаем таблицу характеристик с учетом сортировки
            foreach($arrayVendor as $idCategory=>$value)
                if(!empty($arrayVendorValue[$idCategory]['name'])) {
                    if(!empty($value['page'])){
                        // Оборачиваем в тег tr с ссылкой на описание характеристики
                        $dis.=PHPShopText::tr(PHPShopText::b($value['name']).': ',PHPShopText::a('../page/'.$value['page'].'.html',substr($arrayVendorValue[$idCategory]['name'],2)));
                        // Если требуется добавить персональных стилей
                        // $dis.='<tr class="tr1"><td class="td1"><b>'.$value['name'].'</b>'</td><td class="td2"><a href="'.$value['page'].'.html">'.substr($arrayVendorValue[$idCategory]['name'],2).'</a></td></tr>
                    }else{
                        // Оборачиваем в тег tr
                        $dis.=PHPShopText::tr(PHPShopText::b($value['name']).': ',substr($arrayVendorValue[$idCategory]['name'],2));
 
                        // Если требуется добавить персональных стилей
                        // $dis.='<tr class="tr1"><td class="td1"><b>'.$value['name'].'</b>'</td><td class="td2">'.substr($arrayVendorValue[$idCategory]['name'],2).'</td></tr>
                        }
                }
 
            // Оборачиваем в тег таблицы table
            $disp = PHPShopText::table($dis);
            // Если требуется добавить персональных стилей
            // $disp='<table class="table1">'.$dis.'</table>';
 
            $obj->set('vendorDisp',$disp);
 
            // Обязательно возвращаем true для прерывания дальнейшего выполнения функции
            return true;
        }
    }
}
 
 
$addHandler=array
        (
        'sort_table'=>'sort_table_hook',
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshop="php/hook/sorttable.hook.php";