Jump to content


Photo
- - - - -

Что делать если SEF компонент "съедает" параметры фильтра?

faq sef ссылки

  • This topic is locked This topic is locked
1 reply to this topic

#1 SmetDenis

SmetDenis
  • Administrators
  • User rate: 139.4
  • posts: 16232
  • topics: 200

Posted 14 September 2013 - 10:57

Как вам уже известно, наш фильтр обладает довольно богатым набором настроек и различными способами выборки из базы данных. Для этих целей форма фильтра генерирует вложенные GET запросы на сервер.
Это жизненная необходимость - проще автоматически разбирать большое кол-во входящие параметров на стороне сервера.
 
Встречаются популярные SEF-расширения, разработчики которых почему то забыли слово рекурсия (и некоторые другие основы программирования). С помощью специальных функций, они сортируют параметры в ссылках. Это нормально, НО проблем в том, что разработчики не додумались сделать это рекурсивно, соответственно не учитывают параметры в ссылках с глубиной более чем 2 (хотя по умолчанию PHP может принимать до 64 вложенностей).
 
Таким образом в ссылках фильтра можно встретить вот такие вот конвертирования массивов в строку
20130914-b46-31kb_200x0.jpg
В итоге фильтр ничего не найдет.
 
Ниже я буду добавлять решения для популярных SEF расширений, которые лечат эту проблему.
К сожалению, в силу особенностей реализации компонентов все они  - это небольшой хак ядра SEF-компонента.
  • 0
JBZoo v4.0 и новый чудный мир Open Source GPL
Отключайте проверку лицензий как можно скорее!



— Есть два типа людей: Кто еще не делает бекапы и кто уже делает бекапы.


#2 SmetDenis

SmetDenis
  • Topic Starter
  • Administrators
  • User rate: 139.4
  • posts: 16232
  • topics: 200

Posted 14 September 2013 - 11:10

Решение для компонента sh404sef (практически любых версий)
 
Откройте файл
\administrator\components\com_sh404sef\sh404sef.class.php
 
И замените функции shSortURL() и shGETGarbageCollect() на соответствующие варианты ниже

 
function shSortURL($string)
{
    // URL must be like : index.php?param2=xxx&option=com_ccccc&param1=zzz
    if ((substr($string, 0, 10) !== 'index.php?')) {
        return $string;
    }
    // URL returned will be ! index.php?option=com_ccccc&param1=zzz&param2=xxx
    $ret = '';
    $st  = str_replace('&', '&', $string);
    $st  = str_replace('index.php', '', $st);
    $st  = str_replace('?', '', $st);
    parse_str($st, $shTmpVars);
    $shVars = shUrlEncodeDeep($shTmpVars);
    if (count($shVars) > 0) {
        ksort($shVars); // sort URL array
        $shNewString = '';
        $ret         = 'index.php?';
        foreach ($shVars as $key => $value) {
            if (strtolower($key) != 'option') {
                // option is always first parameter
                if (is_array($value)) {
                    foreach ($value as $k => $v) {
                        // hack start
                        if (is_array($v)) {
                            foreach ($v as $innerKey => $innerValue) {
                                if (is_array($innerValue)) {
                                    foreach ($innerValue as $innerKey2 => $innerValue2) {
                                        $shNewString .= '&' . $key . '[' . $k . '][' . $innerKey . '][' . $innerKey2 . ']=' . $innerValue2;
                                    }
                                } else {
                                    $shNewString .= '&' . $key . '[' . $k . '][' . $innerKey . ']=' . $innerValue;
                                }
                            }

                        } else {
                            $shNewString .= '&' . $key . '[' . $k . ']=' . $v;
                        }
                        // hack end

                        // original code
                        // $shNewString .= '&' . $key . '[' . $k . ']=' . $v;
                    }
                } else {
                    $shNewString .= '&' . $key . '=' . $value;
                }
            } else {
                $ret .= $key . '=' . $value;
            }
        }
        $ret .= $ret == 'index.php?' ? JString::ltrim($shNewString, '&') : $shNewString;
    }

    return $ret;
}
function shGETGarbageCollect()
{
    // V 1.2.4.m moved to main component from plugins
    // builds up a string using all remaining GET parameters, to be appended to the URL without any sef transformation
    // those variables passed litterally must be removed from $string as well, so that they are not stored in DB
    global $shGETVars;
    $sefConfig = Sh404sefFactory::getConfig();
    if (!$sefConfig->shAppendRemainingGETVars || empty($shGETVars)) return '';
    $ret = '';
    ksort($shGETVars);
    foreach ($shGETVars as $param => $value) {
        if (is_array($value)) {
            foreach ($value as $k => $v) {
                // hack start
                if (is_array($v)) {
                    foreach ($v as $innerKey => $innerValue) {

                        if (is_array($innerValue)) {
                            foreach ($innerValue as $innerKey2 => $innerValue2) {
                                $ret .= '&' . $param . '[' . $k . '][' . $innerKey . '][' . $innerKey2 . ']=' . $innerValue2;
                            }
                        } else {
                            $ret .= '&' . $param . '[' . $k . '][' . $innerKey . ']=' . $innerValue;
                        }

                    }

                } else {
                    $ret .= '&' . $param . '[' . $k . ']=' . $v;
                }
                // hack end

                // original code
                // $ret .= '&' . $param . '[' . $k . ']=' . $v;
            }
        } else {
            $ret .= '&' . $param . '=' . $value;
        }

    }
    return $ret;
}
Если вы используете "функции безопасности" в компоненте
Та же самая проблема, компонент игнорирует вложенные параметры.
В итоге появляются глупые ошибки вида "Notice / Array to string conversion" (камень в огород sh404sef)

Откройте файл \components\com_sh404sef\shSec.php

найди функцию shDoSecurityChecks()

и добавьте код в месте, указанном на скриншоте
20130914-m50-76kb_200x0.jpg


// hack start
if (is_array($value)) {
    continue;
}
// hack end

  • 1
JBZoo v4.0 и новый чудный мир Open Source GPL
Отключайте проверку лицензий как можно скорее!



— Есть два типа людей: Кто еще не делает бекапы и кто уже делает бекапы.






Also tagged with one or more of these keywords: faq, sef, ссылки

Click to return to top of page in style!