Jump to main content Jump to doc navigation

Примеры связки combo box и автодополнения

Лучший пример возможностей: быстро собрать combo box, фильтруемый другим combo box, или автодополнение, зависящее от другого поля. В примере ниже combo box стран фильтрует combo box штатов. При выборе штата автодополнение города дополнительно фильтруется по значению поля штата.

<label for="ftcountry">Country</label>
[[!input.combobox? &input_id=`ftcountry` &value=`United States`
    &object=`{"name": "sekftCountries", "sortby": "country_name", "value": "country_name", "label": "country_name"}`
]]

<label for="ftstate">State</label>
[[!input.combobox? &input_id=`ftstate`
    &object=`{"name": "sekftStates", "sortby": "state_name", "value": "state_name", "label": "state_name"}`
    &filter=`{"input_id": "ftcountry", "name": "sekftCountries", "field": "country_name", "value": "United States"}`
]]

<label for="ftcity">City</label>
[[!input.autocomplete? &input_id=`ftcity`
    &object=`{"name": "sekftUSCities", "sortby": "city_name", "value": "city_name", "label": "city_name"}`
    &filter=`{"input_id": "ftstate", "name": "sekftStates", "field": "state_name"}`
]]

Первый шаг

Не обязательно, но лучше задать input_id для всех полей. Здесь input_id равен «ftcountry». Это понадобится дальше. Главное поле. «object» как JSON-строка с данными таблицы. Здесь value и label совпадают с country_name, поэтому &value равен «United States». Если object->value был бы «id», &value был бы «244».

<label for="ftcountry">Country</label>
[[!input.combobox? &input_id=`ftcountry` &value=`United States`
    &object=`{"name": "sekftCountries", "sortby": "country_name", "value": "country_name", "label": "country_name"}`
]]

Второй шаг

Снова задайте input_id, для штата это «ftstate». Свойство object задаётся так же. Отличие от страны. свойство filter. Filter выполняет две роли и сейчас работает только между двумя combo box или отдельно. В дочернем поле filter задают в JSON.

<label for="ftstate">State</label>
[[!input.combobox? &input_id=`ftstate`
    &object=`{"name": "sekftStates", "sortby": "state_name", "value": "state_name", "label": "state_name"}`
    &filter=`{"input_id": "ftcountry", "name": "sekftCountries", "field": "country_name", "value": "United States"}`
]]

Здесь фильтрация идёт от другого combo box («ftcountry»). Для фильтра только при загрузке страницы не задавайте filter->input_id. sekFormTools использует связи xPDO, поэтому фильтрация одной таблицы через другую проста. filter->name указывает объект «sekftCountries». filter->field задаёт поле фильтра. Так как у «ftcountry» значение по умолчанию «United States», в filter->value передаётся «United States».

При смене страны на «Canada» значение «Canada» уходит в helper resource вместе с object и filter. Helper берёт объект «sekftCountries», находит связь с «sekftStates» и возвращает отфильтрованный список. Это удобно, если вместо полного имени нужен формат «isoa_two»:

<label for="ftcountry">Country</label>
[[!input.combobox? &input_id=`ftcountry` &value=`US`
    &object=`{"name": "sekftCountries", "sortby": "country_name", "value": "isoa_two", "label": "country_name"}`
]]

<label for="ftstate">State</label>
[[!input.combobox? &input_id=`ftstate`
    &object=`{"name": "sekftStates", "sortby": "state_name", "value": "state_name", "label": "state_name"}`
    &filter=`{"input_id": "ftcountry", "name": "sekftCountries", "field": "isoa_two", "value": "US"}`
]]

Так value можно использовать как угодно.

Третий шаг

У автодополнения многие свойства совпадают с combo box и работают похоже. Object обязателен. Здесь автодополнение дополнительно фильтруется по выбору в combo box «ftstate». Снова используются связи xPDO для сужения таблицы при поиске по city_name:

<label for="ftcity">City</label>
[[!input.autocomplete? &input_id=`ftcity`
    &object=`{"name": "sekftUSCities", "sortby": "city_name", "value": "city_name", "label": "city_name"}`
    &filter=`{"input_id": "ftstate", "name": "sekftStates", "field": "state_name"}`
]]

Support the team building MODX with a monthly donation.

The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.

Backers

  • modmore
  • STERC
  • Digital Penguin
  • Jens Wittmann – Gestaltung & Entwicklung
  • CrewMark
  • Fabian Christen
  • Sepia River Studios
  • Dannevang Digital
  • Alex
  • A. Moreno
  • Chris Fickling
  • Stéphane Jäggi
  • Murray Wood
  • Anton Tarasov
  • deJaya
  • JT Skaggs
  • Lefthandmedia
  • eydolan
  • Following Sea
  • Guido Gallenkamp
  • YJ
  • Raffy
  • Snow Creative
  • Nick Clark
  • Guest
  • Helen
  • krisznet
  • Yanni
  • Richard

Budget

$204 per month—let's make that $500!

Learn more