0 Пользователей и 1 Гость просматривают эту тему.
  • 28 Ответов
  • 7495 Просмотров

Здраствуйте, появился еще один вопрос. Допустим есть 6 видов состояний авто - отличное, хорошее, плохое, битый, горелый, утопленик, нужно сделать ссылку в главном меню, например - аварийные авто, по нажатию которой будут отображаться все авто только с состоянием битый, горелый, утопленик. Может кто знает как это реализовать.
*

Surik

  • Захожу иногда
  • 63
  • 20 / 0
сделай пункт меню типа Ссылка-URL:
и пропиши туда ссылку примерно такую:
http://www.site.ru/index.php?option=com_autobb&Itemid=1&task=list&s=1

незабудь указать правильно свои параметры:
  &itemid - код твоего айтемИД
  &s - ID в справочнике состояний авто

но при этом будет показан список авто только с одним состоянием!
а чтобы можно было поиску указывать несколько состояний для отображения списка, то необходимо модифицировать код компонента
« Последнее редактирование: 23.10.2007, 03:54:59 от Surik »

Цитировать
но при этом будет показан список авто только с одним состоянием!
а чтобы можно было поиску указывать несколько состояний для отображения списка, то необходимо модифицировать код компонента

Мне как раз нужно 3 состояния указывать, вот в чем и загвоздка. Может подскажеш где примерно, что нужно изменить? Буду очень признателен.
*

Surik

  • Захожу иногда
  • 63
  • 20 / 0
Мне как раз нужно 3 состояния указывать, вот в чем и загвоздка. Может подскажеш где примерно, что нужно изменить? Буду очень признателен.
во-первых в моем ответе была ошибка с названием параметра.
он должен быть "s"  а не "sw" (исправлено выше)

во-вторых как сделать:
  можно например сделать поддержку передачи в этом параметре списка кодов через запятую

в файле autobb.php
находим функцию rebuildExtendedSearchResult
в начале есть case
находим строчку
  if(isset( $s )){ $where[] = "a.state='$s'"; $extlink .= "&s=$s"; } // фильтр по состоянию авто
и меняем ПРИМЕРНО на следующее
  if(isset( $s )) {  // фильтр по состоянию авто
    if (strpos(",",$s) )      $where[] = "a.state in ($s)";
               else       $where[] = "a.state='$s'";
    $extlink .= "&s=$s";
  }

тоже самое надо сделать в функции extendedSearch

только еще в функции extendedSearch есть строчка
   $s = intval( mosGetParam($_REQUEST, 's', 0 ) );
придется ее поменять на
   $s = mosGetParam($_REQUEST, 's', 0 );

скажу сразу две вещи:
1. этот вариант я не тестировал, и писал весь код здесь из головы (придется дебажить)
2. при таком варианте есть опасность взлома через SQL-инъекции, указав SQL запрос в параметре &s
   этого можно избежать если параметр проверить на корректность списка из целочисленных значений

Спасибо большое Surik за советы и Sectus, что помог с кодом. Совместными усилиями реализовали эту возможность таким образом:

Ищем функцию listMessages в ней находим строку:

Цитировать
$s = intval( mosGetParam($_REQUEST, 's', 0 ) );
заменяем на:
Цитировать
$s = mosGetParam($_REQUEST, 's', 0 );

далее в той же функции находим:
Цитировать
if($s){ $where[] = "a.state='$s'"; $extlink .= "&s=$s"; } // фильтр по состоянию авто
заменяем на:
Цитировать
if($s){ $where[] = "a.state in ($s)"; $extlink .= "&s=$s"; } // фильтр по состоянию авто

теперь введя ссылку:
http://your-site.com/index.php?option=com_autobb&Itemid=5&s=x,x,x,x,x

Заместь x - указываем id различных состояний.

P/S/ Теперь попробую это же сделать в расширеном поиске, и в модуле поиска.

P/P/S/
Цитировать
2. при таком варианте есть опасность взлома через SQL-инъекции, указав SQL запрос в параметре &s
   этого можно избежать если параметр проверить на корректность списка из целочисленных значений

А вот тут можно по подробнее? Особенно как этого избежать?
*

Alex Revo

  • Moderator
  • 1995
  • 109 / 0
Я так думаю стоит добавить проверку условия что-то вроде
если $s <0 or $s >n, то перенаправляйте на страницу "все объявления", если порядок - идет дальше.
*

Surik

  • Захожу иногда
  • 63
  • 20 / 0
А вот тут можно по подробнее? Особенно как этого избежать?
ну например некий юзер вводит в браузере такую строчку:
http://your-site.com/index.php?option=com_autobb&Itemid=5&s="(гадкий select-подзапрос)"
в качестве гадкого подзапроса можно например написать select запрос который будет очень сильно нагружать твой сервер базы данных.
Из-за того что в алгоритме не проверяется содержимое параметра &s, и он полностью подставляется в SQL-запрос, то можно внедрить в твой запрос любое содержимое.
И потом в нескольких сессиях броузера вызвать эту строчку с http запросом.
Таким образом можно добиться отказа в работе твоего сайта.

Решение:
Проверять содержимое параметра &s, чтобы в нем были только целочисленные значения через запятую.
Для проверки предлагаю обратить свой взор на функцию ereg()

Так... Вроде бы сделал таким способом:

После строчки
Цитировать
$s = mosGetParam($_REQUEST, 's', 0 );
Добавил:
Цитировать
if (!ereg('[1-9]$', $s))
   {
      echo "Неправельное ID состояния авто";
      return false;
   }

Всё работает нормально.
Если где-то, что то намудрил подправьте пожалуйста.
Еще раз спасибо всем за советы.
« Последнее редактирование: 23.10.2007, 16:08:29 от Screamster »
*

Surik

  • Захожу иногда
  • 63
  • 20 / 0
Если где-то, что то намудрил подправьте пожалуйста.
думаю более корректно будет так:

$s = mosGetParam($_REQUEST, 's', 0 );
if (ereg("\(([[:digit:]]+,)*[[:digit:]]+\)", "(".$s.")" ))
    { $where[] = "a.state in ($s)"; $extlink .= "&s=$s"; }

Surik большое спасибо за подсказку, так я и хотел, но как реализовать не знал.
*

sectus

  • Новичок
  • 8
  • 0 / 0
думаю более корректно будет так:

$s = mosGetParam($_REQUEST, 's', 0 );
if (ereg("\(([[:digit:]]+,)*[[:digit:]]+\)", "(".$s.")" ))
    { $where[] = "a.state in ($s)"; $extlink .= "&s=$s"; }



Не перегибайте палку, МосГетПарам вообще для чего тогда ставить?
*

Surik

  • Захожу иногда
  • 63
  • 20 / 0
Не перегибайте палку, МосГетПарам вообще для чего тогда ставить?

А что по твоему МосГетПарам сам все проверяет на корректность?
В случае строкового параметра, эта функция оставляет переданное значение параметра почти таким, каким оно было передано. Я проверял!
Может быть я не правильно понял насчет перегибания!?

P.S.
кстати функцию более правильно вызывать со строковым значением по умолчанию:
$s = mosGetParam($_REQUEST, 's', '' );
*

sectus

  • Новичок
  • 8
  • 0 / 0
А пробовал SQL инъекции делать?
*

Surik

  • Захожу иногда
  • 63
  • 20 / 0
А пробовал SQL инъекции делать?
пробовал передавать в качестве параметра текст SQL-запроса - ПРОХОДИТ.
и в результате у тебя в переменной $s находится текст запроса
Делал вызов примерно такой:
http://www.SITE.ru/index2.php?option=com_autobb&task=search&s=(select count(*) from jos_autobb_messages where additional like '%bla-bla%')
в результате в переменной $s лежал текст sql-запроса
*

sectus

  • Новичок
  • 8
  • 0 / 0
Эта переменная($s) помещается в запрос... теперь выводим запрос и показываем его нам...
p.s. только копируем не с сгенерированной страницы, а из ее html кода...
p.p.s. желательно сделать скрин, потому как сам форум может что-нить повыкидывать...
« Последнее редактирование: 24.10.2007, 07:17:40 от sectus »
*

Surik

  • Захожу иногда
  • 63
  • 20 / 0
Эта переменная($s) помещается в запрос... теперь выводим запрос и показываем его нам...
p.s. только копируем не с сгенерированной страницы, а из ее html кода...
p.p.s. желательно сделать скрин, потому как сам форум может что-нить повыкидывать...

не понял я тебя sectus. :)
ты предлагаешь мне, чтобы я сделал такой запрос и прислал сюда скрин-доказательства?

Тут короче еще одна проблема назрела, при использовании любого из вариантов и моего и  того, который предложил Surik, перестает работать поиск авто. Есть какие-нибудь варианты как по другому решить трабл?
*

Surik

  • Захожу иногда
  • 63
  • 20 / 0
Тут короче еще одна проблема назрела, при использовании любого из вариантов и моего и  того, который предложил Surik, перестает работать поиск авто. Есть какие-нибудь варианты как по другому решить трабл?
что значит перестает работать поиск?
поясни конкретнее.
ошибка какая-то выдается?

что значит перестает работать поиск?
поясни конкретнее.
ошибка какая-то выдается?

ошибок нет никаких, просто по любому критерию, поиск теперь выводит результатов 0
*

Surik

  • Захожу иногда
  • 63
  • 20 / 0
ошибок нет никаких, просто по любому критерию, поиск теперь выводит результатов 0
надо включать режим отладки на сайте, и смотреть какой SQL-запрос выполняется при поиске
*

sectus

  • Новичок
  • 8
  • 0 / 0
не понял я тебя sectus. :)
ты предлагаешь мне, чтобы я сделал такой запрос и прислал сюда скрин-доказательства?

Хум, хочу попросить прощения у Вас и всех читателей-писателей данного топика за отнятое время за бесполезный флейм, потому как я оказался не прав. Просто немного оказался невнимательным...
« Последнее редактирование: 25.10.2007, 14:15:51 от sectus »
*

ZlyddeN

  • Осваиваюсь на форуме
  • 41
  • 1 / 0
ошибок нет никаких, просто по любому критерию, поиск теперь выводит результатов 0
а не связанно ли это с тем, что функции ExtendedSearch хранят результаты поиска в таблице #__autobb_extsearch и происходит редирект на линк содержащий ID результата поиска, а сама таблица не обновляется :( по крайней мере у меня эта таблица никогда сам не очищалась
*

Surik

  • Захожу иногда
  • 63
  • 20 / 0
а не связанно ли это с тем, что функции ExtendedSearch хранят результаты поиска в таблице #__autobb_extsearch и происходит редирект на линк содержащий ID результата поиска, а сама таблица не обновляется :( по крайней мере у меня эта таблица никогда сам не очищалась
такова задумка Автора! - в этой таблице записи не должны удаляться. они должны обновляться!
вот если не обновляются, то тогда проблема!
*

ZlyddeN

  • Осваиваюсь на форуме
  • 41
  • 1 / 0
такова задумка Автора! - в этой таблице записи не должны удаляться. они должны обновляться!
что-то вроде кэша чтоль?

хм... сделал поиск в *.php файлах компонента фразы autobb_extsearch - везде где найдена фраза только запросы SELECT :-O или плохо сморел?

UPD:
вот в этом месте
Код
	$extSearch->store();
я так понимаю, заносятся данные в таблицу autobb_extsearch....
буду дальше копать...

PS.
попробую в настройках компонента поиграться с параметром "время жизни расширенного поиска". Кто успеет раньше меня - отпишитесь
« Последнее редактирование: 01.11.2007, 05:47:37 от ZlyddeN »
*

algol

  • Захожу иногда
  • 63
  • 0 / 0
Как добавить настройки меню параметр "Состояние авто", чтобы в настройках меню, кроме ID категории можно было и состояние указывать

К примеру: Все грузовые (все состояния), битые грузовые, новые грузовые и т.д. и так же по легковым.

*

Surik

  • Захожу иногда
  • 63
  • 20 / 0
Как добавить настройки меню параметр "Состояние авто", чтобы в настройках меню, кроме ID категории можно было и состояние указывать
К примеру: Все грузовые (все состояния), битые грузовые, новые грузовые и т.д. и так же по легковым.

делаешь пункт меню типа URL
а в качестве URL пишешь что-то типа:
http://www.site.ru/index.php?option=com_autobb&Itemid=XXX&task=list&s=XXX
где параметр s - это код твоего состояния
и параметр Itemid не забудь устанвоить свой
*

algol

  • Захожу иногда
  • 63
  • 0 / 0
делаешь пункт меню типа URL
а в качестве URL пишешь что-то типа:
http://www.site.ru/index.php?option=com_autobb&Itemid=XXX&task=list&s=XXX
где параметр s - это код твоего состояния
и параметр Itemid не забудь устанвоить свой
Это не то. В виде ссылки не канает. Поясню.
Да, на первом шаге это работает, сделано так, только стоит ссылка в меню в виде component/option,com_autobb/Itemid,35/s,1
Выходит список авто по состоянию. (путь при этом: Главная/Грузовые(Itemid,35))/новые(s,1) и заголовок "Грузовые"

Кликаю на авто из этого списка и теряется Itemid,35 :( имею путь:
Главная / КАМАЗ 5320 2008 г/в и название страницы просто КАМАЗ 5320 2008 г/в.

Получается Itemid потерялся + состояние потерялось при просмотре авто.
А должно было бы получится:
Путь: Главная/Грузовые/Новые/Камаз 5320 2008 г/в
Раздел: "Новые" или "Грузовые Новые"
Название материала: "Камаз 5320 2008 г/в"

Вот я про че, сохранить Itemid и s нужно до самого авто.  !!!???!!!
*

Surik

  • Захожу иногда
  • 63
  • 20 / 0
Это не то. В виде ссылки не канает. Поясню.
Да, на первом шаге это работает, сделано так, только стоит ссылка в меню в виде component/option,com_autobb/Itemid,35/s,1
Выходит список авто по состоянию. (путь при этом: Главная/Грузовые(Itemid,35))/новые(s,1) и заголовок "Грузовые"

Кликаю на авто из этого списка и теряется Itemid,35 :( имею путь:
Главная / КАМАЗ 5320 2008 г/в и название страницы просто КАМАЗ 5320 2008 г/в.

Получается Itemid потерялся + состояние потерялось при просмотре авто.
А должно было бы получится:
Путь: Главная/Грузовые/Новые/Камаз 5320 2008 г/в
Раздел: "Новые" или "Грузовые Новые"
Название материала: "Камаз 5320 2008 г/в"

Вот я про че, сохранить Itemid и s нужно до самого авто.  !!!???!!!
Это мне напоминает схему поиска методом погружения (уточнения запроса).
Т.е. когда всегда можно вернуться на предудыщий уровень (предыдущее условие).
Думаю для такой реализации потребуется значительно поменять компонент.
Поменять придется всю идеологию поиска, и его реализацию.
Но такой способ был бы классный!
*

algol

  • Захожу иногда
  • 63
  • 0 / 0
Это мне напоминает схему поиска методом погружения (уточнения запроса).
Думаю для такой реализации потребуется значительно поменять компонент.
Стандартными средствами жумлы разве не решить?
На сколько я понял, нужно чтобы состояние авто (для универсальности и др.ключи, типа руль, тип кузова и т.д.) настраивались в через меню. Тогда не нужно будет создавать меню через ссылку URL. А стандартно через компонент, тогда и ItemID  будет сохранятся на всех этапах уточнения.
Ведь
Код
http://www.site.ru/index.php?option=com_autobb&Itemid=XXX&task=list&s=XXX
Это не поиск ведь, это уточнение
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться