Design Hook Query Filter

Материал из PHPShop

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

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

Содержание

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

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

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/query_filter.hook.php с содержанием
 
<?php
/**
 * Изменение сортировки товаров на артикул
 * @author PHPShop Software
 * @param obj $obj объект класса
 * @return mixed
 */
function query_filter_artsort_hook($obj) {
 
    $sort = null;
    $n = $obj->category;
 
    $v = $_REQUEST['v'];
    $s = PHPShopSecurity::TotalClean($_REQUEST['s'], 1);
    $f = PHPShopSecurity::TotalClean($_REQUEST['f'], 1);
 
    if ($obj->PHPShopNav->isPageAll())
        $p = PHPShopSecurity::TotalClean($p, 1);
 
    if ($obj->PHPShopCategory->getParam('num_row') > 0)
        $num_row = $obj->PHPShopCategory->getParam('num_row');
    else
        $num_row = $obj->PHPShopSystem->getValue('num_row');
 
    // Сортировка по характеристикам
    if (is_array($v)) {
        foreach ($v as $key => $value) {
            if (PHPShopSecurity::true_num($key) and PHPShopSecurity::true_num($value)) {
                $hash = $key . "-" . $value;
                $sort.=" and vendor REGEXP 'i" . $hash . "i' ";
            }
        }
    }
 
    // Сортировки товаров в каталоге по артикулу в убывающем порядке
    if (empty($f)){
        $order_direction = " desc";
        $order = array('order' => 'uid' . $order_direction);
    }
 
    // Сортировка принудительная пользователем
    if ($s or $f) {
        switch ($f) {
            case(1): $order_direction = "";
                break;
            case(2): $order_direction = " desc";
                break;
            default: $order_direction = " desc";
                break;
        }
        switch ($s) {
            case(1): $order = array('order' => 'name' . $order_direction);
                break;
            case(2): $order = array('order' => 'price' . $order_direction);
                break;
            case(3): $order = array('order' => 'num' . $order_direction);
                break;
            default: $order = array('order' => 'uid' . $order_direction);
        }
    }
 
    // Учет добавочных категорий
    $catt = '(category=' . $n . ' OR dop_cat LIKE \'%#' . $n . '#%\')';
 
    // Преобразуем массив условия сортировки в строку
    foreach ($order as $key => $val)
        $string = $key . ' by ' . $val;
 
    // Все страницы
    if ($obj->PHPShopNav->isPageAll()) {
        $sql = " ($catt and enabled='1' and parent_enabled='0') " . $sort . " " . $string . ' limit ' . $obj->max_item;
    }
 
    // Поиск по цене
    elseif (isset($_POST['priceSearch'])) {
 
        $priceOT = TotalClean($_POST['priceOT'], 1);
        $priceDO = TotalClean($_POST['priceDO'], 1);
 
        $percent = $obj->PHPShopSystem->getValue('percent');
 
        // Бесконечность
        if ($priceDO == 0)
            $priceDO = 1000000000;
 
        if (empty($priceOT))
            $priceOT = 0;
 
        // Цена с учетом выбранной валюты
        $priceOT/=$obj->currency('kurs');
        $priceDO/=$obj->currency('kurs');
 
        $sql = "$catt and enabled='1' and parent_enabled='0' and price >= " .
                ($priceOT / (100 + $percent) * 100) . " AND price <= " . ($priceDO / (100 + $percent) * 100) . " " . $sort . $string . ' limit 0,' . $obj->max_item;
    }
    elseif (!empty($sort)) {
        return array('sql' => $catt . " and enabled='1' and parent_enabled='0' " . $sort . $string);
    } else {
        return array('sql' => $catt . " and enabled='1' and parent_enabled='0' " . $sort . $string);
    }
 
 
    // Возвращаем SQL 
    return $sql;
}
 
$addHandler = array
    (
    'query_filter' => 'query_filter_artsort_hook'
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshop="php/hook/query_filter.hook.php";

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

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

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/query_filter.hook.php с содержанием
 
<?php
/**
 * Изменение сортировки товаров на склад
 * @author PHPShop Software
 * @param obj $obj объект класса
 * @return mixed
 */
function query_filter_skladsort_hook($obj) {
 
    $sort = null;
    $n = $obj->category;
 
    $v = $_REQUEST['v'];
    $s = PHPShopSecurity::TotalClean($_REQUEST['s'], 1);
    $f = PHPShopSecurity::TotalClean($_REQUEST['f'], 1);
 
    if ($obj->PHPShopNav->isPageAll())
        $p = PHPShopSecurity::TotalClean($p, 1);
 
    if ($obj->PHPShopCategory->getParam('num_row') > 0)
        $num_row = $obj->PHPShopCategory->getParam('num_row');
    else
        $num_row = $obj->PHPShopSystem->getValue('num_row');
 
    // Сортировка по характеристикам
    if (is_array($v)) {
        foreach ($v as $key => $value) {
            if (PHPShopSecurity::true_num($key) and PHPShopSecurity::true_num($value)) {
                $hash = $key . "-" . $value;
                $sort.=" and vendor REGEXP 'i" . $hash . "i' ";
            }
        }
    }
 
    // Сортировки товаров в каталоге по складу в убывающем порядке
    if (empty($f)){
        $order_direction = " desc";
        $order = array('order' => 'items' . $order_direction);
    }
 
 
    // Сортировка принудительная пользователем
    if ($s or $f) {
        switch ($f) {
            case(1): $order_direction = "";
                break;
            case(2): $order_direction = " desc";
                break;
            default: $order_direction = " desc";
                break;
        }
        switch ($s) {
            case(1): $order = array('order' => 'name' . $order_direction);
                break;
            case(2): $order = array('order' => 'price' . $order_direction);
                break;
            case(3): $order = array('order' => 'num' . $order_direction);
                break;
            default: $order = array('order' => 'uid' . $order_direction);
        }
    }
 
    // Учет добавочных категорий
    $catt = '(category=' . $n . ' OR dop_cat LIKE \'%#' . $n . '#%\')';
 
    // Преобзазуем массив уловия сортировки в строку
    foreach ($order as $key => $val)
        $string = $key . ' by ' . $val;
 
    // Все страницы
    if ($obj->PHPShopNav->isPageAll()) {
        $sql = " ($catt and enabled='1' and parent_enabled='0') " . $sort . " " . $string . ' limit ' . $obj->max_item;
    }
 
    // Поиск по цене
    elseif (isset($_POST['priceSearch'])) {
 
        $priceOT = TotalClean($_POST['priceOT'], 1);
        $priceDO = TotalClean($_POST['priceDO'], 1);
 
        $percent = $obj->PHPShopSystem->getValue('percent');
 
        // Бесконечность
        if ($priceDO == 0)
            $priceDO = 1000000000;
 
        if (empty($priceOT))
            $priceOT = 0;
 
        // Цена с учетом выбранной валюты
        $priceOT/=$obj->currency('kurs');
        $priceDO/=$obj->currency('kurs');
 
        $sql = "$catt and enabled='1' and parent_enabled='0' and price >= " .
                ($priceOT / (100 + $percent) * 100) . " AND price <= " . ($priceDO / (100 + $percent) * 100) . " " . $sort . $string . ' limit 0,' . $obj->max_item;
    }
    elseif (!empty($sort)) {
        return array('sql' => $catt . " and enabled='1' and parent_enabled='0' " . $sort . $string);
    } else {
        return array('sql' => $catt . " and enabled='1' and parent_enabled='0' " . $sort . $string);
    }
 
 
    // Возвращаем SQL 
    return $sql;
}
 
$addHandler = array
    (
    'query_filter' => 'query_filter_skladsort_hook'
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshop="php/hook/query_filter.hook.php";

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

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

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/query_filter.hook.php с содержанием
 
<?php
/**
 * Изменение сортировки товаров на склад
 * @author PHPShop Software
 * @param obj $obj объект класса
 * @return mixed
 */
function query_filter_skladsort_hook($obj) {
 
    $sort = null;
    $n = $obj->category;
 
    $v = $_REQUEST['v'];
    $s = PHPShopSecurity::TotalClean($_REQUEST['s'], 1);
    $f = PHPShopSecurity::TotalClean($_REQUEST['f'], 1);
 
    if ($obj->PHPShopNav->isPageAll())
        $p = PHPShopSecurity::TotalClean($p, 1);
 
    if ($obj->PHPShopCategory->getParam('num_row') > 0)
        $num_row = $obj->PHPShopCategory->getParam('num_row');
    else
        $num_row = $obj->PHPShopSystem->getValue('num_row');
 
    // Сортировка по характеристикам
    if (is_array($v)) {
        foreach ($v as $key => $value) {
            if (PHPShopSecurity::true_num($key) and PHPShopSecurity::true_num($value)) {
                $hash = $key . "-" . $value;
                $sort.=" and vendor REGEXP 'i" . $hash . "i' ";
            }
        }
    }
 
    // Сортировки товаров в каталоге по статусу наличия
    if (empty($f)){
        $order_direction = " desc";
        $order = array('order' => 'skald' . $order_direction);
    }
 
 
    // Сортировка принудительная пользователем
    if ($s or $f) {
        switch ($f) {
            case(1): $order_direction = "";
                break;
            case(2): $order_direction = " desc";
                break;
            default: $order_direction = " desc";
                break;
        }
        switch ($s) {
            case(1): $order = array('order' => 'name' . $order_direction);
                break;
            case(2): $order = array('order' => 'price' . $order_direction);
                break;
            case(3): $order = array('order' => 'num' . $order_direction);
                break;
            default: $order = array('order' => 'uid' . $order_direction);
        }
    }
 
    // Учет добавочных категорий
    $catt = '(category=' . $n . ' OR dop_cat LIKE \'%#' . $n . '#%\')';
 
    // Преобзазуем массив уловия сортировки в строку
    foreach ($order as $key => $val)
        $string = $key . ' by ' . $val;
 
    // Все страницы
    if ($obj->PHPShopNav->isPageAll()) {
        $sql = " ($catt and enabled='1' and parent_enabled='0') " . $sort . " " . $string . ' limit ' . $obj->max_item;
    }
 
    // Поиск по цене
    elseif (isset($_POST['priceSearch'])) {
 
        $priceOT = TotalClean($_POST['priceOT'], 1);
        $priceDO = TotalClean($_POST['priceDO'], 1);
 
        $percent = $obj->PHPShopSystem->getValue('percent');
 
        // Бесконечность
        if ($priceDO == 0)
            $priceDO = 1000000000;
 
        if (empty($priceOT))
            $priceOT = 0;
 
        // Цена с учетом выбранной валюты
        $priceOT/=$obj->currency('kurs');
        $priceDO/=$obj->currency('kurs');
 
        $sql = "$catt and enabled='1' and parent_enabled='0' and price >= " .
                ($priceOT / (100 + $percent) * 100) . " AND price <= " . ($priceDO / (100 + $percent) * 100) . " " . $sort . $string . ' limit 0,' . $obj->max_item;
    }
    elseif (!empty($sort)) {
        return array('sql' => $catt . " and enabled='1' and parent_enabled='0' " . $sort . $string);
    } else {
        return array('sql' => $catt . " and enabled='1' and parent_enabled='0' " . $sort . $string);
    }
 
 
    // Возвращаем SQL 
    return $sql;
}
 
$addHandler = array
    (
    'query_filter' => 'query_filter_skladsort_hook'
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopshop="php/hook/query_filter.hook.php";

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

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

Инструкция:

  • Создать файл phpshop/templates/имя шаблона/php/hook/spec.hook.php с содержанием
 
<?php
/**
 * Изменение сортировки товара в спецпредложениях
 * @return bool
 */
function query_filter_speccore_hook() {
    if (empty($_GET['f']) and empty($_GET['f']) and empty($_GET['s']))
        return array('order' => 'datas desc');
}
 
$addHandler = array
    (
    'query_filter' => 'query_filter_speccore_hook'
);
?>
  • Создать файл phpshop/templates/имя шаблона/php/inc/config.ini с содержанием
 
[hook]
phpshopspec="php/hook/spec.hook.php";