Кастомизация формы поиска Drupal 8

Аватар пользователя One_Two One_Two 27 сентября 2017 в 12:09

Добрый день!

Правлю форму с помощью hook_form_alter():

<form action="/search/node" method="get" id="search-block-form" accept-charset="UTF-8" data-drupal-form-fields="edit-keys">

Как поменять в самой форме значения action и method?

0 Thanks

Лучший ответ

Аватар пользователя One_Two One_Two 28 сентября 2017 в 17:16

Я СДЕЛАЛ!)))))

С помощью js. Запутался из-за неопытности да, месяц работаю программистом )
До этого только мечтал о должности прогера и смотрел видеокурсы на сколько позволяло своб. время + немного копался в разных движках.

Моя задача заключалась в том, что на сайте есть поисковая форма, если вбить в неё запрос, то тебя должно перенаправить на другой сайт с этим запросом, где этот запрос в url'e будет значением ключа.
Вроде бы задача легкая, но проблема в том, что к запросу нужно добавить ещё дополнительные key=val перед и после.
Т.е. запрос выглядит так: http://domain.name/some_url.html#{key1:val1,key2:наш_запрос,key3:val3}
В итоге {key1:val1,key2:наш_запрос,key3:val3} в js разбил на 3 части.
1 часть в переменную (var1), 2 часть наш запрос (query), 3 часть тоже в переменную (var2).
И после нажатия на submit, вызываю функцию где всё это дело складывается и уходит windows.location.href="http://domain.name/some_url.html#"+var1+query+var2

Скорее всего это очень плохой пример) Но для меня это прорыв ^^

Комментарии

Аватар пользователя One_Two One_Two 27 сентября 2017 в 15:52
VasyOK wrote:

Я просто html вписал.

http://drupal.ru/node/134608

Спасибо, создал пользовательский блок с новой формой и уже его кастомизирую (а то так получалось, что я ломал встроенный блок поиска :) )

Но возникла ещё проблема , у input'а поискового поля, куда вбивается сам запрос, есть атрибут name. Мне нужно чтобы в него записалось перед запросом строка и после.

Грубо говоря так на php бы выглядело:
<?php echo "<input name = $var1$query$var2>"?>

Как такое сделать в 8 друпале?

Аватар пользователя VasyOK VasyOK 27 сентября 2017 в 20:37

В моем понимании в поиск пользователь вбивает только одну строку.
Строка перед и строка после - это не стандартный вариант поиска. Хотя я слабо представляю как это выглядит и если бы делал поиcк по нескольким строкам воспользовался бы раскрытыми фильтрами views или search api

Аватар пользователя One_Two One_Two 27 сентября 2017 в 17:30

В общем крутил в голове и так и сяк, понял как правильно поставить вопрос!
Как в друпале 8, сохранить и изменить поисковый запрос в переменную, перед отправкой в action тега form?

Т.е. так:
1. Посетитель вбил запрос в форму
2. Запрос сохранился в переменной
3. Переменная проходит через функцию urlencode() + добавляются ещё строки
4. На выходе получается измененная переменная, которая отправляется в action

Аватар пользователя ХулиGUN ХулиGUN 27 сентября 2017 в 18:25
One_Two wrote:

В общем крутил в голове и так и сяк, понял как правильно поставить вопрос!

Как в друпале 8, сохранить и изменить поисковый запрос в переменную, перед отправкой в action тега form?
Т.е. так:

1. Посетитель вбил запрос в форму

2. Запрос сохранился в переменной

3. Переменная проходит через функцию urlencode() + добавляются ещё строки

4. На выходе получается измененная переменная, которая отправляется в action

Зачем всё это? Вам не хватает переменной в теле запроса? При get отправке и так в форма будет сабмититься на /action_url?key=value

Аватар пользователя ХулиGUN ХулиGUN 27 сентября 2017 в 23:32

По сабжу хочется выразится своей любимой цитатой про универсальные интерфейсы, но уверен, решат, что это оскорбление(((

Аватар пользователя One_Two One_Two 28 сентября 2017 в 9:10

Спасибо, буду пробовать создать свой модуль, просто пока до такого уровня ещё друпал не осознал.
Делается это для того, чтобы в url'е передать запрос определенного вида на другой сайт, если запрос будет отличаться, то на той стороне поиск просто не сработает (на сколько мне известно, поиск реализовали на Java, поэтому такие требования).

Аватар пользователя ХулиGUN ХулиGUN 28 сентября 2017 в 13:16
One_Two wrote:

Делается это для того, чтобы в url'е передать запрос определенного вида на другой сайт

Так экшн зачем менять и добавлять в него гет параметры? Отправка формы get запросом на урл domain.name/some_url (экшн формы) и так проставит все поля этой формы в ?key=val&key2=val2
Лично моё мнение, что Вы запутались по незнанию или неопытности. Попробуйте описать конкретно свою задачу без всяких абстракций - велика вероятность того, что вас направят на правильный путь и предложат более изящные решения

Аватар пользователя One_Two One_Two 28 сентября 2017 в 17:16

Я СДЕЛАЛ!)))))

С помощью js. Запутался из-за неопытности да, месяц работаю программистом )
До этого только мечтал о должности прогера и смотрел видеокурсы на сколько позволяло своб. время + немного копался в разных движках.

Моя задача заключалась в том, что на сайте есть поисковая форма, если вбить в неё запрос, то тебя должно перенаправить на другой сайт с этим запросом, где этот запрос в url'e будет значением ключа.
Вроде бы задача легкая, но проблема в том, что к запросу нужно добавить ещё дополнительные key=val перед и после.
Т.е. запрос выглядит так: http://domain.name/some_url.html#{key1:val1,key2:наш_запрос,key3:val3}
В итоге {key1:val1,key2:наш_запрос,key3:val3} в js разбил на 3 части.
1 часть в переменную (var1), 2 часть наш запрос (query), 3 часть тоже в переменную (var2).
И после нажатия на submit, вызываю функцию где всё это дело складывается и уходит windows.location.href="http://domain.name/some_url.html#"+var1+query+var2

Скорее всего это очень плохой пример) Но для меня это прорыв ^^

Аватар пользователя ivnish ivnish 28 сентября 2017 в 17:27

Да. JS - Это должен быть самый крайний метод, когда вообще других способов нет)

Аватар пользователя ХулиGUN ХулиGUN 28 сентября 2017 в 18:08
One_Two wrote:

Моя задача заключалась в том, что на сайте есть поисковая форма, если вбить в неё запрос, то тебя должно перенаправить на другой сайт с этим запросом

Зачем вам тогда друпал форма? Почему не просто в шаблон не вставить html?
<form action=" http://domain.name/some_url.html" method="get"></form>

One_Two wrote:

но проблема в том, что к запросу нужно добавить ещё дополнительные key=val перед и после

При отправке формы по get очерёдность параметров не важна

One_Two wrote:

html#{key1:val1,key2:наш_запрос,key3:val3}

Вы уверены, что это правильно? get параметры передаются в url после "?" и разделяются амперсандом "&", но никак не через хеш "#".
Если действительно формат должен быть через хеш, в таком случае напишите точный пример, в противном случае вы можете для своих перед и после сделать скрытые инпуты и просто сабмитить)))

Аватар пользователя One_Two One_Two 29 сентября 2017 в 10:00
Х..лиGUN wrote:

Зачем вам тогда друпал форма? Почему не просто в шаблон не вставить html?

Он не нужен был, я выше как раз отписался что создал пользовательский блок html :)

One_Two wrote:

Спасибо, создал пользовательский блок с новой формой и уже его кастомизирую (а то так получалось, что я ломал встроенный блок поиска :) )

Х..лиGUN wrote:

Вы уверены, что это правильно? get параметры передаются в url после "?" и разделяются амперсандом "&", но никак не через хеш "#".

Если действительно формат должен быть через хеш, в таком случае напишите точный пример, в противном случае вы можете для своих перед и после сделать скрытые инпуты и просто сабмитить)))

Запрос должен был быть именно с хешем, без знака вопроса, без амперсандов
key=val, здесь между ключом и значением вместо равно обязательно должно было передаваться двоеточие (из-за этого тег form вообще решил не использовать).

Собственно точный пример:
http://domain.name/some_url.html#{"dictionaryName":null,"mode":"SIMPLE","query":"фыва","type":"NEAR","sortOrder":"desc","sortField":"document_date_edition","simpleSearchFieldsBundle":"test2"}

Жирным пометил место, куда подставляется введенный пользователем запрос.
+ на всё что дальше хеша, нужно пропустить через urlencode и в итоге получаем такой запрос:
http://domain.name/some_url.html#%7B%22dictionaryName%22:null,%22mode%22...

P.S. Форум не дает цитировать х..лиGUN'а, пишет:
Не используйте матерные или агрессивные слова
:))