Перейти к содержимому


Фотография
- - - - -

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

faq sef ссылки

  • Закрытая тема Тема закрыта
В теме одно сообщение

#1 SmetDenis

SmetDenis

Отправлено 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

Отправлено 14 September 2013 - 11:10

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

 
  1. function shSortURL($string)
  2. {
  3. // URL must be like : index.php?param2=xxx&option=com_ccccc&param1=zzz
  4. if ((substr($string, 0, 10) !== 'index.php?')) {
  5. return $string;
  6. }
  7. // URL returned will be ! index.php?option=com_ccccc&param1=zzz&param2=xxx
  8. $ret = '';
  9. $st = str_replace('&', '&', $string);
  10. $st = str_replace('index.php', '', $st);
  11. $st = str_replace('?', '', $st);
  12. parse_str($st, $shTmpVars);
  13. $shVars = shUrlEncodeDeep($shTmpVars);
  14. if (count($shVars) > 0) {
  15. ksort($shVars); // sort URL array
  16. $shNewString = '';
  17. $ret = 'index.php?';
  18. foreach ($shVars as $key => $value) {
  19. if (strtolower($key) != 'option') {
  20. // option is always first parameter
  21. if (is_array($value)) {
  22. foreach ($value as $k => $v) {
  23. // hack start
  24. if (is_array($v)) {
  25. foreach ($v as $innerKey => $innerValue) {
  26. if (is_array($innerValue)) {
  27. foreach ($innerValue as $innerKey2 => $innerValue2) {
  28. $shNewString .= '&' . $key . '[' . $k . '][' . $innerKey . '][' . $innerKey2 . ']=' . $innerValue2;
  29. }
  30. } else {
  31. $shNewString .= '&' . $key . '[' . $k . '][' . $innerKey . ']=' . $innerValue;
  32. }
  33. }
  34.  
  35. } else {
  36. $shNewString .= '&' . $key . '[' . $k . ']=' . $v;
  37. }
  38. // hack end
  39.  
  40. // original code
  41. // $shNewString .= '&' . $key . '[' . $k . ']=' . $v;
  42. }
  43. } else {
  44. $shNewString .= '&' . $key . '=' . $value;
  45. }
  46. } else {
  47. $ret .= $key . '=' . $value;
  48. }
  49. }
  50. $ret .= $ret == 'index.php?' ? JString::ltrim($shNewString, '&') : $shNewString;
  51. }
  52.  
  53. return $ret;
  54. }
  1. function shGETGarbageCollect()
  2. {
  3. // V 1.2.4.m moved to main component from plugins
  4. // builds up a string using all remaining GET parameters, to be appended to the URL without any sef transformation
  5. // those variables passed litterally must be removed from $string as well, so that they are not stored in DB
  6. global $shGETVars;
  7. $sefConfig = Sh404sefFactory::getConfig();
  8. if (!$sefConfig->shAppendRemainingGETVars || empty($shGETVars)) return '';
  9. $ret = '';
  10. ksort($shGETVars);
  11. foreach ($shGETVars as $param => $value) {
  12. if (is_array($value)) {
  13. foreach ($value as $k => $v) {
  14. // hack start
  15. if (is_array($v)) {
  16. foreach ($v as $innerKey => $innerValue) {
  17.  
  18. if (is_array($innerValue)) {
  19. foreach ($innerValue as $innerKey2 => $innerValue2) {
  20. $ret .= '&' . $param . '[' . $k . '][' . $innerKey . '][' . $innerKey2 . ']=' . $innerValue2;
  21. }
  22. } else {
  23. $ret .= '&' . $param . '[' . $k . '][' . $innerKey . ']=' . $innerValue;
  24. }
  25.  
  26. }
  27.  
  28. } else {
  29. $ret .= '&' . $param . '[' . $k . ']=' . $v;
  30. }
  31. // hack end
  32.  
  33. // original code
  34. // $ret .= '&' . $param . '[' . $k . ']=' . $v;
  35. }
  36. } else {
  37. $ret .= '&' . $param . '=' . $value;
  38. }
  39.  
  40. }
  41. return $ret;
  42. }
Если вы используете "функции безопасности" в компоненте
Та же самая проблема, компонент игнорирует вложенные параметры.
В итоге появляются глупые ошибки вида "Notice / Array to string conversion" (камень в огород sh404sef)

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

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

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


  1. // hack start
  2. if (is_array($value)) {
  3. continue;
  4. }
  5. // hack end

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



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






Темы с аналогичным тегами faq, sef, ссылки

Click to return to top of page in style!