Здравствуйте.
Возникла такая идея — сделать с помощью Ditto -> request фильтрацию по каталогу (
со стороны пользователя), используя html-форму(checkbox или multiple select) где использовать тэги, как параметры для фильтрации.
Напомню, что расширение Request позволяет ditto принимать и обрабатывать параметры, пришедшие методом GET.
Таким образом в ditto-параметр &tags можно поместить значения какого-либо TV и сделать фильтр соответствующих документов, отправляя данные с html-формы методом get.
Проблема в том, что html форма, которую придётся использовать для формирования GET запроса, передаёт параметры поочереди, так, что ditto обрабатывает только самую поледнюю переменную.
index.php?id=1&ditto_tags=param1&ditto_tags=param2&ditto_tags=param3
А request понимает, только когда тэги разделены запятой
index.php?id=1&ditto_tags=param1,param2,param3
Какие могут быть способы решения проблемы?
(Может с помощью javascript «научить» html-форму передавать параметры через запятую, или изменить сам request, чтобы понимал поочерёдные параметры?)
Может быть, подобный фильтр реализуем как-то подругому?
Спасибо большое за внимание к проблеме!
РЕШЕНИЕ:
Создан сниппет [[GetStringMod]], который преобразует полученный методом GET значения параметров, в вид, приемлемый для ditto, т.е. поочередно, через запятые;
В моем примере три параметра формы priority, place, style (принимают значения из input selelct'а).
$Priority = isset($_GET["priority"]) ? $_GET["priority"] : false;
$Place = isset($_GET["place"]) ? $_GET["place"] : false;
$Style = isset($_GET["style"]) ? $_GET["style"] : false;
if ($Priority=="priority") $Priority="";
if ($Place=="place") $Place="";
else $Place=','.$Place;
if ($Style=="style")$Style="";
else $Style=','.$Style;
echo $Priority.$Place.$Style;
Таким образом GET запрос например
index.php?tags=priority1&tags=style1&tags=place1
преобразуется в priority1,style1,place1
Далее он(сниппет) помещен в вызов ditto
[!Ditto? &startID=`id` &tpl=`list-output` &display=`all` &tagDelimiter=`,` &tags=`[!GetStringMod!]` &tagData=`priority,style,place` &tagMode=`onlyTags` &sortBy=`createdon` &sortDir=`ASC` &extenders=`request`!]
И дитто выбирает значения подкаталога только по пришедшим, с помощью расширения request, тэгам (параметр &tags)
Всё, надеюсь это кому-нибудь пригодится :)
Комментарии (21)
RSS свернуть / развернутьили так:
*Кажется так модикс отработает вложенный вызов.
pitbull
Хотя, если честно, то я немного не понял, Вашего решения.
JustViktor
можно просто разобрать запрос и присвоить переменной c именем параметра Ditto нужное значение, например
И Дитто ее с удовольствием подхватит. Ну если не заменить ее значение в самом вызове дитто в виде:
Ну а пример с вложенным вызовом, он более наглядный что ли.
pitbull
Просмотрел дополнение tvexplorer, он вроде очень гибкий, но пока находится в бета версии.
Ктстати, в передаче &ditto_filter=pole,criteria,match (если пользоваться встроеным фильтром ditto) такая же проблема. Автоматически запрос через html-форму не сгенирировать.
JustViktor
pitbull
На строке 56 начинается преобразование, сейчас думаю, как лучше всего заместить.
Но появилась другая проблема. $_REQUEST приходит в виде
Здесь только одна переменная ([ditto_tags] => param3 ), что означает, что это не дитто не принимает разделённые параметры, а это GET передаёт только последний из одинаковых. Верно?
JustViktor
Честно говоря с GET вообще мало разбирался на предмет всяких ухищрений, но возможно он как и POST умеет делать массив, если использовать квадратные скобки?
А на массив уже применить implode соответственно.
Carw
Но я пробывал и с POST и вот что вышло.
В переменную $_REQUEST (файл request.extender.inc.php ) приходит массив в нормальном виде но далее обработка запроса уже не подходит для такого массива. Это как раз строка 56 (request.extender.inc.php) и ditto возвращает «No documents found».
JustViktor
Carw
1. Переделать request.extender.inc.php так, чтоб он смог нормально обработать POST массив из html формы (как?).
2. С помощью способа, предложенного Temus (jquery.form.js) преобразовывать параметры перед отправкой html формы.
(я остановился на втором варианте, т.к. по задаче можно использовать javascript, но если по уму, то лучше (а главное универсальнее) конечно проработать первый.)
Кстати, подобной «многопараметровой» формой можно было бы сделать афтоконфигуратор сниппетов для MODX.
Например была бы колонка параметров (допустим для того же ditto), а по нажатию одного из них, раскрывается форма ввода возможные значений (checkbox, multiple select, select, input). И опубликовать бы такой конфигуратор на modx-cms.ru :-)
В revolution, вроде уже организована подобная штука.
JustViktor
В очередной раз убеждаюсь, что одни и те же мысли приходят в разные головы. Я давно думаю над этой штукой, но пока не придумал как лучше всего ее организовать (чтобы и удобно и безопасно и просто для создания к разным сниппетам). Если есть на эту тему хорошие мысли, то буду рад узнать :-)
Carw
Можно кстати и аяксом отправлять. jquery.form.js — это jQuery Form Plugin
Temus
Все-таки некоторые люди используют noscript к примеру.
Да и по логике разбирать значения и следить за их валидностью должна серверная часть.
pitbull
JustViktor
В примере отправлять можно так:
Вместо txtSelectedValuesObj.value = selectedArray; поставить
location.href=document.myform.action+'?ditto_tags='+selectedArray;
и name='myform' у формы
Temus
Но тем не менее в своё время мне очень понравились два материала… они как раз по вашей теме:
Use AJAX with modxAPI
Tagged blogging with Ditto
Думаю можно оформить эти статьи в виде топиков на более близком нам языке… если смогу завтра постараюсь перевести…
bullder
Carw
Создан сниппет [[GetStringMod]], который преобразует полученный методом GET значения параметров, в вид, приемлемый для ditto, т.е. поочередно, через запятые;
В моем примере три параметра формы priority, place, style (принимают значения из input selelct'а).
Таким образом запрос например
index.php?tags=priority1&tags=style1&tags=place1
преобразуется в priority1,style1,place1
Далее он(сниппет) помещен в вызов ditto
И дитто выбирает значения подкаталога только пришедшим, с помощью расширения request, тэгам (параметр &tags)
Всё, надеюсь это кому-нибудь пригодится :)
JustViktor
А вот подскажите, как сделать пагинацию в выведенных результатах — чего-то у меня не идет… каменный цветок.
tmih
w3d
&tags=`[!GetStringMod!]` — у меня работает только кэшируемый &tags=`[[GetStringMod]]`, если ставлю
На &paginate=`1` &summarize=`2` — вообще не реагирует — вернее обрезает и выдает как указано 2 новости, а вместо пагинации ничего не пишет — отображается надпись СТРАНИЦЫ — и все — совсем плохо. Вызод ДИТТО делаю некэшируемый на некэшиируемой странице — тогла фильтраци работает на УРА, вызод
[!Ditto? &tagDelimiter=`,` &tags=`[[GetStringMod]]… !]
Спасибо за ответ!
tmih
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.