abushyk

[Песочница] Пользовательские сущности и Связанные элементы

Recommended Posts

1. Предистория

 

Допустим мы имеем базовый сайт на сайтбилле. У нас есть стандартная модель квартиры-недвижимости со всякими Цена, Площадь и прочими свойствами по вкусу. И вот, в один прекрасный момент, мы решили заняться торговлей квартирами в новостройках. А новостройки эти у нас зачастую представлены не отдельными зданиями, а целыми комплексами зданий, которые в свою очередь разбиты на секции.

 

2. Анализ.

 

Сначала разберемся со структурой. Самый простой вариант - мы решили еализовывать каждую квартиру в виде отдельного объекта. Например, если в ЖК "Элитный" у нас есть корпус А, а в нем секция I и в этой секции, грубо говоря, 15 квартир одной планировки, но некоторые на разных этажах, мы будем считать, что каждая квартира, даже одинаковой планировки - является одним объектом. Иными словами, мы не делаем группировок по типам, а ведем каждую квартиру отдельно. Это дает нам некоторую гибкость, так как квартиры на крайних этажах могут иметь меньшую цену в отличии от одноплановых с ними, на остальных этажах. Так же, из плюсов то, что мы можем задать какие-то особенности поквартирно, даже не смотря на то, что они одноплановые. Особенно это касается, когда квартиры продаются не в сыром виде, а меблированные или с финишной отделкой. Либо учесть иные особенности каждой квартиры.

 

Из минусов такого подхода то, что если секция у нас 9-ти этажная с 4 квартирами на этаж, то на секцию получается 36 объектов. И дальше в геометрической прогрессии в зависимости от количества секций в корпусе и корпусов в ЖК.

 

Соответственно, логично предположить, что кроме обычных для недвижимости параметров (цена, площадь, этаж,и т.д.) нам придется снабдить модель недвижимости дополнительными параметрами, устанавливающими ее привязку к конкретному положению в разрезе ЖК - конкретный ЖК, корпус ЖК, секция корпуса ЖК. И так же очевидно, что при заполнении формы эти параметры должны бы быть связаны цепочкой, как то при выборе отдельного ЖК, мы должны получить под выбор список корпусов только этого ЖК, что бы не рыскать в длиннющем списке всех корпусов. Аналогино и с секциями.

 

3. Инструментарий.

 

Для реализации нам понадобятся свежие приложения system, admin, table, customentity. Привлекать готовые приложения типа "Жилые комплексы" мы не будем.

 

Из настроек нам будет необходимо включить параметр Настройки - Дополнительно - Off system Ajax. Данная опция выключает автоматические связки между зависимыми элементами и предоставляет нам полный контроль над определением своих зависимостей.

 

Из почитать - http://wiki.sitebill.ru/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B

 

4. Подготовка дополнительных сущностей.

 

Если мы должны иметь возможность выбрать корпус, ЖК и секцию, значит у нас где-то должны быть списки этих значений. В Сайтбилле, для организации списков значений существует два типа полей - select_box и selectbox_by_query.

 

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

 

Второй, поскольку хранится в БД в виде отдельной таблицы, вполне на это способен. Но для его использования необходима соответствующая таблица в БД. В нашем случае таблиц будет три - таблица ЖК, таблица корпусов и секций корпусов. Что бы избавить себя от рутинной работы по наполнению этих данных через phpMyAdmin создадим соответствующие таблицы в Редакторе форм.

 

4.1. Жилые комплексы.

 

Для ЖК - это таблица czhilkom с полями czhilcom_id (primary_key) и name (safe_string).

zhilcom_table.png

Создав таблицу и наполнив ее элементами, нажимаем кнопку Создать таблицу.

zhilcom_table_create.png

Теперь таблица ЖК существует физически в БД.

Надо наполнить ее какими-то жилыми комплексами.

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

/admin/index.php?action=customentity&do=install

 

При переходе по нему, в случае отсутствия необходимых таблиц для работы приложения, они будут созданы.

После этого возвращаемся в Редактор форм и в заголовке таблицы czhilkom ищем кнопку со завездочкой

zhilcom_table_create_entity_button.png

Эта кнопка отвечает за создание мини-обработчика для сущности, у которой нет штатного обработчика (в виде встроенного модуля или стандартного\стороннего приложения). NB. Попытка создать этой кнопкой обработчик для встроенных сущностей, как Город, Район или для тех у которых есть приложения - Баннеры, Новости - ни к чему не приведет.

 

После нажатия кнопки Создания обработчика мы увидим следующее окно

zhilcom_table_create_controller.png

где в поле Название вам нужно ввести вменяемое название для вашего обработчика, что бы вы знали к чему он относится. Введем например Жилой комплекс и нажмем Создать.

После перезагрузки страницы в верху, возле кнопки раскрытия списка приложений мы получим дополнительную кнопку Пользовательские, а под ней и наше квази приложение Жилой комплекс

zhilcom_userapp.png

Если перейти по предложенной ссылке, вы получите минималистический инструмент для управления вашими ЖК где вы можете добавить ЖК в список, изменить существующий или удалить ненужный. Приложение не следит за целостностью, т.е. если вы удаляете ЖК, то об удалении соответствующих зависимых корпусов и секций вам так же придется позаботиться самому.

 

Не надейтесь на возможность реализации таким способом каких-то "творческих вывихов" - это исключительно инструмент для обеспечения удобства. Для полноценной работы с такими сущностями, как разделение их по пользователям с возможностью редактирования последними, организация страницы, например конкретного ЖК, шаблонизация необходимо создавать полноценное приложение.

 

Для наших целей добавим два ЖК - Элитный и Морской с помощью кнопки Добавить запись

zhilcom_list.pngПроцесс, как вы можете заметить, вполне привычный и не должен вызвать трудностей

 

4.1. Корпуса.

 

Создание таблицы корпусов абсолютно ничем не отличается от создания таблицы ЖК кроме того, что у корпусов есть зависимость от ЖК. Например ЖК Элитный имеет два корпуса - Корпус А и Корпус Б. Тогда модель корпуса (ckorps) будет состоять из полей

korps_table.png

Поле czhilcom_id является обычным полем селектбокса подбирающим данныеиз внешней таблицы, в данном случае из таблицы czhilcom

Простыня под спойлером

korps_table_select.png

 

Дальше все по алгоритму - создали таблицу в Редакторе форм, наполнили полями, создали физическую таблицу, зарегистрировали обработчик. Из Пользовательских переходим в Корпуса  добавляем

korps_table_add.png

Названия сущностей рекомендую давать расширенные - с включением родительского описания. Так как обработчик весьма прост, то особых способов отличить Корпус А от ЖК Элитный и Корпус А от ЖК Морской у вас не будет.

 

В результате мы получаем нечто похожее на 

korps_table_list.png

Share this post


Link to post
Share on other sites

Продолжаю отдельными постами, так как исчерпал лимит на картинки в одном сообщении ))

 

4.1. Секции.

 

Не буду давать расширенного описания, скажу только, что все идентично как для корпусов.

Таблица csection и поля csection_id, name, ckorps_id (по таблице ckorps)

csection_fields.pngВ принципе для секций можно было бы установить двойную зависимость - указывать принадлежность секции к корпусу и к ЖК. Для некоторых случаев это оправдано (особенено если делается полноценное приложение), но в нашем случае, когда необходимо лишь поразграничивать принадлежности и сам корпус и ЖК будет указан в свойствах недвижимости, такая связка будет избыточной.

 

В итоге

csection_list.png
 
5. Внедрение в недвижимость
 
Сущности у нас готовы, можно приступать к привязке их на объявление.
 
Нам необходимо добавить три свойства в нашу таблицу data - ЖК, Корпус и Секция. Все они будут добавляться полями типа select_by_query, что бы мы могли сформировать их списки в элементах выбора из соответствующих таблиц. Носить имена будут эти элементы czhilcom_id, ckorps_id и csection_id
data_fields.png
 
Если теперь мы перейдем в форму добавления объявления мы увидим, что наши новые три поля уютно прописались в форме в виде привычных списков выбора.
 
data_form.png
Но если их поразворачивать, то вы увидите, что они вмещают все варианты из своих таблиц и не реагируют на состояние "родительского" элемента. Например выбор ЖК никак не отражается на содержимом списка корпусов.
 
Приступаем к наладке связей.
 
6. Связывание
 
Основой для связывания служит принцип связанных элементов формы - http://wiki.sitebill.ru/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B
 
Нам необходимо в рамках одной формы указать элементам на какие другие элементы они влияют в форме и от каких зависят.
 
Например - ЖК. От состояния этого элемента зависит возможный список выбора в элементе Корпуса. Эта зависимость описывается как
czhilcom_para.png
Это значит, что элемент, в котором мы выбираем название ЖК связан с элементом с системным именем ckorps_id (элемент выбора Корпуса ЖК), а ключем, который внутри Корпуса соответствует жилому корпусу является значение из поля czhilcom_id модели Корпуса. Если взлянете выше, то это значение в модели Корпуса у нас является идентификатором ЖК,  к которому привязан Корпус.
Больше ЖК у нас ни на что не влияет, потому и других параметров нет.
 
Далее Корпус. Корпус, аналогично ЖК влияет на "следующий" элемент - Секцию. Но, кроме этого, он еще должен знать от какого элемента зависит сам - это необходимо для формирования адекватного списка значений элемента Корпус, но не тогда, когда сделан выбор конкретного ЖК, а при загрузке формы. Например, если вы открыли на редактирование объявление в котором ЖК был указан как Элитный, тогда в списке Корпусов вполне ожидаемо окажется уже готовый список корпусо ЖК Элитный.
 
ckorps_para.png
linked - описывает зависмость когда элемент влияет на что-то.
depended - когда что-то влияет на элемент
 
И, наконец, Секция. Самый простой элемент. Он ни на что не влияет, но на него влияет Корпус. Что и видно из параметров.
csection_para.png
 
Нет ничего страшного, если вы ничего не поняли про связи с первого раза. Это нормально, Я гарантирую это.
 
Если теперь вы попробуете загрузить форму добавления объявления, вы видите, что у вас доступен на выбор только элемент ЖК, а остальные будут подгружены только после выбора соответствующего родительского.
 
Для того, что бы увидеть этот эффект в Настройках необходимо включить параметр Настройки - Дополнительно - Off system Ajax
 
7. Эпилог
 
Ай, у меня не работают элементы выбора географии. Что делать?...
 
Тут все ожидаемо. Изначально принцип связанных элементов предназначался как-раз для географических элементов, что бы вывести из кода движка жесткие зависимости Страна-Регион-Город-Район\Улица и иметь более широкую возможность настройки своих связей. А так же, иметь возможность введения промежуточных элементов (Страна-Регион-Субрегион-Город), которые разрывали бы существующие связи, заложенные в код Сайтбилля. Именно поэтому опция Off system Ajax отрубает всю систему заложенных связей.
 
Возможно это слишком кардинально и стоило бы предусмотреть ступенчатую систему, когда подключение пользовательских связанных элементов регулировалось бы одной настройкой, а отключение привычной связки от Страны к Улице другой. На данный момент четкого мнения у меня пока нет.
 
Для себя я решил эту проблему навеской связей на географические элементы в виде, аналогичном системным правилам.
 
Т.е.
country_id
linked    region_id,country_id
 
region_id
linked    city_id,region_id
depended    country_id
 
city_id
linked    street_id,city_id;district_id,city_id
depended    region_id
 
district_id
linked    mkrn_id,district_id
depended    city_id
 
street_id
depended    city_id
 
mkrn_id
depended    district_id
 
8. Offtop
 
С другой стороны, даже этот способ немного избыточен. Если Город является дочерним к Региону, а Регион к Стране, то хранение всех трех значений для объявления - это "лишние" данные, хотя при организации поиска они весьма кстати.
 
Суть в том, что географические данные вполне возможно хранить в виде, схожем со структурой

dest1.png

 
и получать к ним доступ более "человечным" путем
dest2.png
Но в этом случае остается так же много вопросов связанных с совместимостью с многими приложениями, принципом организации смой геоструктуры (ведь если заструктурить географию от страны до улиц - это может стать неподъемным грузом, а если закончить городом, то не совсем понятно, как вести связь дальше к улицам, которые должны таки быть привязаны к городам или чему-то наследному от них).
 
В общем идея у нас полно, была бы возможность все реализовать)

Share this post


Link to post
Share on other sites

Отлично, спасибо.

 

будем считать, что каждая квартира, даже одинаковой планировки - является одним объектом.

и это правильно. По большому счёту причиндалы к квартире - это её свойства.

 

там бы орфографию и пунктуацию поправить.

Share this post


Link to post
Share on other sites

и это правильно. По большому счёту причиндалы к квартире - это её свойства.

 

Тут разные продавцы поступают по разному. Некоторые просто группируют типаж квартиры. например в корпусе1-секции2 доступны однокомнатные, двухкомнатные и трехкомнатные. И они не оперируют отдельно квартирой, а сразу типом. Т.е. "однокомнатная квартира доступная на 2-25 этажах". При чем, в разрезе этажа, далеко не всегда есть возможность определить, есть ли нужная квартира без звонка продавцу.

Share this post


Link to post
Share on other sites

я исхожу из ооп

 есть ли нужная квартира без звонка продавцу.

во-во, что логически равняется любая квартира в доме - всё равно звонить. :)

Share this post


Link to post
Share on other sites

У меня после связывания ошибка:

 

 

Unhandled Error: Undefined variable: refresher_linked_global_callback

 

строка с ошибкой  -  refresher_linked_global_callback(connected_element);

Share this post


Link to post
Share on other sites

как бы все правильно и верно. Но как уединоличить или конкретно присвоить, привязать в выборке?

Например : к 1 району принадлежат 1й-2й-3й-4й-5й микрорайон

а ко 2му району принадлежат 2й-4й-6й-7й микрорайон?

Share this post


Link to post
Share on other sites

Все ваши сущности образуют цепочку родитель - наследник. Так вот у детей всегда должно быть поле ссылающееся на родителя - как в Район - есть поле Город по таблице городов, которое и выступает этой связью. Добавляя микрорайон вам нужно указывать в поле Район тот район в подчинении которого они находятся.

Share this post


Link to post
Share on other sites

Я имел ввиду, если включить параметр :

Off system Ajax (apps.realty.off_system_ajax)  = "1"
то , в выборке появится интелектуальный отбор. При выборе определенного РАЙОНА должны подгружаться только относящиеся к данному району МИКРОРАЙОНЫ...
а пока высыпается каша, все подряд. Как исправить?

Share this post


Link to post
Share on other sites

Я имел ввиду, если включить параметр :

Off system Ajax (apps.realty.off_system_ajax)  = "1"

то , в выборке появится интелектуальный отбор. При выборе определенного РАЙОНА должны подгружаться только относящиеся к данному району МИКРОРАЙОНЫ...

а пока высыпается каша, все подряд. Как исправить?

пропиши связи в настройках обоих полей (linked и depended), например:

 

raion_id
linked    mkrn_id,raion_id;street_id,raion_id
 
mkrn_id
depended    raion_id
 
-с вязь вниз (к подчиненному справочнику) может быть множественной, я специально указал 2 связи, но это не обязательно.
- связь вверх (к родителю) - одна.

Share this post


Link to post
Share on other sites

Понятно со связками, правда если они подчинены строго одно к другому. Т.е. если в справочнике заданы родители и дети.
Вопрос.
Каким образом вывести такую связку:  Регион - Район (минуя город) ?
Очень часто попадаются на периферии, например Рязанская область - Михайловский р-н  ...
Справочники переделывать?

Share this post


Link to post
Share on other sites

Что бы что-то с чем-то связать, нужно что бы хоть у кого-то из этой пары был признак ссылающийся на второго. Это единственный вариант, кроме случаев наличия третьего элемента-связиста, который представляет собой не объект в привычном смысле, а именно связь между двумя другими.

Цитата

Каким образом вывести такую связку:  Регион - Район (минуя город) ?

Указать linked у Региона на Район, а у Района depended на Регион и последнему добавить признак принадлежности к региону. Ниспадающая связь не обязана быть единичной. Регион запросто может быть родителем как Города, так и Региона одновременно. Но нельзя иметь двух родителей.

Share this post


Link to post
Share on other sites
В 03.03.2016 в 07:46, rumantic сказал:

Видео по связанным элементам

 

 

Настроил связи. Всё работает отлично!

Есть один вопрос

Всё работает отлично если не использовать

autocomplete=1

и

autocomplete_notappend=1

Если их дописать в data то связи пропадают

Так и должно быть?

Share this post


Link to post
Share on other sites
2 часа назад, 72realty сказал:

 

Настроил связи. Всё работает отлично!

Есть один вопрос

Всё работает отлично если не использовать

autocomplete=1

и

autocomplete_notappend=1

Если их дописать в data то связи пропадают

Так и должно быть?

Связанные элементы имеют свой механизм, схожий с автокомплитом. По этому автокомплит надо отключить и больше его не упоминать.

Share this post


Link to post
Share on other sites
7 часов назад, Chernetskiy сказал:

Связанные элементы имеют свой механизм, схожий с автокомплитом. По этому автокомплит надо отключить и больше его не упоминать.

Спасибо. Тогда откажусь ро связных элементов))

А то слишком огромный список выпадает и не удобно. Удобнее написать

Share this post


Link to post
Share on other sites
3 часа назад, 72realty сказал:

Спасибо. Тогда откажусь ро связных элементов))

А то слишком огромный список выпадает и не удобно. Удобнее написать

У связанных элементов больше преимуществ, лучше использовать их. Относительно огромного списка, я-бы не сказал, может это особенности отображения в вашем шаблоне? Список не обязательно прокручивать до нужной позиции, по ходу набора текста в строке выборки список сокращается до нужных вариантов. Посмотри у меня в поиске, там всё на связанных элементах. Так-же в ЛК и в админке работает.

Share this post


Link to post
Share on other sites
7 часов назад, Chernetskiy сказал:

У связанных элементов больше преимуществ, лучше использовать их. Относительно огромного списка, я-бы не сказал, может это особенности отображения в вашем шаблоне? Список не обязательно прокручивать до нужной позиции, по ходу набора текста в строке выборки список сокращается до нужных вариантов. Посмотри у меня в поиске, там всё на связанных элементах. Так-же в ЛК и в админке работает.

Ну да. Видимо это особенности шаблона. Если бы в real-spces было дополнительное поле для набора то было бы отлично!) Но к сожалению в нашем шаблоне тупо прокрутка и прокрутить большое количество очень не удобно

 

Вопрос к администраторам

С этим, что то можно сделать или только смириться?

Share this post


Link to post
Share on other sites
1 час назад, 72realty сказал:

Ну да. Видимо это особенности шаблона. Если бы в real-spces было дополнительное поле для набора то было бы отлично!) Но к сожалению в нашем шаблоне тупо прокрутка и прокрутить большое количество очень не удобно

 

Вопрос к администраторам

С этим, что то можно сделать или только смириться?

По началу в Realia была такая-же фигня, Константин покопался и доработал. На тот момент был автокомплит, но многим понадобились дополнительные справочники, которые надо было как-то увязать в зависимость к имеющимся. Следующей разработкой стал функционал связанных элементов и его обкатывали на Реалии - наиболее ходовом шаблоне на тот момент.

Share this post


Link to post
Share on other sites
53 минуты назад, Chernetskiy сказал:

По началу в Realia была такая-же фигня, Константин покопался и доработал. На тот момент был автокомплит, но многим понадобились дополнительные справочники, которые надо было как-то увязать в зависимость к имеющимся. Следующей разработкой стал функционал связанных элементов и его обкатывали на Реалии - наиболее ходовом шаблоне на тот момент.

Ну вот я поэтому просто загрузил справочник и поставил автокомплит. Посмотрел на вашем сайте. Но так то в Реалии удобно, что помимо списка есть дополнительное поле для ввода

Share this post


Link to post
Share on other sites
В 21.06.2014 в 18:23, abushyk сказал:

Продолжаю отдельными постами, так как исчерпал лимит на картинки в одном сообщении ))

 

4.1. Секции.

 

Не буду давать расширенного описания, скажу только, что все идентично как для корпусов.

Таблица csection и поля csection_id, name, ckorps_id (по таблице ckorps)

csection_fields.pngВ принципе для секций можно было бы установить двойную зависимость - указывать принадлежность секции к корпусу и к ЖК. Для некоторых случаев это оправдано (особенено если делается полноценное приложение), но в нашем случае, когда необходимо лишь поразграничивать принадлежности и сам корпус и ЖК будет указан в свойствах недвижимости, такая связка будет избыточной.

 

В итоге

csection_list.png
 
5. Внедрение в недвижимость
 
Сущности у нас готовы, можно приступать к привязке их на объявление.
 
Нам необходимо добавить три свойства в нашу таблицу data - ЖК, Корпус и Секция. Все они будут добавляться полями типа select_by_query, что бы мы могли сформировать их списки в элементах выбора из соответствующих таблиц. Носить имена будут эти элементы czhilcom_id, ckorps_id и csection_id
data_fields.png
 
Если теперь мы перейдем в форму добавления объявления мы увидим, что наши новые три поля уютно прописались в форме в виде привычных списков выбора.
 
data_form.png
Но если их поразворачивать, то вы увидите, что они вмещают все варианты из своих таблиц и не реагируют на состояние "родительского" элемента. Например выбор ЖК никак не отражается на содержимом списка корпусов.
 
Приступаем к наладке связей.
 
6. Связывание
 
Основой для связывания служит принцип связанных элементов формы - http://wiki.sitebill.ru/index.php?title=%D0%A1%D0%B2%D1%8F%D0%B7%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B
 
Нам необходимо в рамках одной формы указать элементам на какие другие элементы они влияют в форме и от каких зависят.
 
Например - ЖК. От состояния этого элемента зависит возможный список выбора в элементе Корпуса. Эта зависимость описывается как
czhilcom_para.png
Это значит, что элемент, в котором мы выбираем название ЖК связан с элементом с системным именем ckorps_id (элемент выбора Корпуса ЖК), а ключем, который внутри Корпуса соответствует жилому корпусу является значение из поля czhilcom_id модели Корпуса. Если взлянете выше, то это значение в модели Корпуса у нас является идентификатором ЖК,  к которому привязан Корпус.
Больше ЖК у нас ни на что не влияет, потому и других параметров нет.
 
Далее Корпус. Корпус, аналогично ЖК влияет на "следующий" элемент - Секцию. Но, кроме этого, он еще должен знать от какого элемента зависит сам - это необходимо для формирования адекватного списка значений элемента Корпус, но не тогда, когда сделан выбор конкретного ЖК, а при загрузке формы. Например, если вы открыли на редактирование объявление в котором ЖК был указан как Элитный, тогда в списке Корпусов вполне ожидаемо окажется уже готовый список корпусо ЖК Элитный.
 
ckorps_para.png
linked - описывает зависмость когда элемент влияет на что-то.
depended - когда что-то влияет на элемент
 
И, наконец, Секция. Самый простой элемент. Он ни на что не влияет, но на него влияет Корпус. Что и видно из параметров.
csection_para.png
 
Нет ничего страшного, если вы ничего не поняли про связи с первого раза. Это нормально, Я гарантирую это.
 
Если теперь вы попробуете загрузить форму добавления объявления, вы видите, что у вас доступен на выбор только элемент ЖК, а остальные будут подгружены только после выбора соответствующего родительского.
 
Для того, что бы увидеть этот эффект в Настройках необходимо включить параметр Настройки - Дополнительно - Off system Ajax
 
7. Эпилог
 
Ай, у меня не работают элементы выбора географии. Что делать?...
 
Тут все ожидаемо. Изначально принцип связанных элементов предназначался как-раз для географических элементов, что бы вывести из кода движка жесткие зависимости Страна-Регион-Город-Район\Улица и иметь более широкую возможность настройки своих связей. А так же, иметь возможность введения промежуточных элементов (Страна-Регион-Субрегион-Город), которые разрывали бы существующие связи, заложенные в код Сайтбилля. Именно поэтому опция Off system Ajax отрубает всю систему заложенных связей.
 
Возможно это слишком кардинально и стоило бы предусмотреть ступенчатую систему, когда подключение пользовательских связанных элементов регулировалось бы одной настройкой, а отключение привычной связки от Страны к Улице другой. На данный момент четкого мнения у меня пока нет.
 
Для себя я решил эту проблему навеской связей на географические элементы в виде, аналогичном системным правилам.
 
Т.е.
country_id
linked    region_id,country_id
 
region_id
linked    city_id,region_id
depended    country_id
 
city_id
linked    street_id,city_id;district_id,city_id
depended    region_id
 
district_id
linked    mkrn_id,district_id
depended    city_id
 
street_id
depended    city_id
 
mkrn_id
depended    district_id
 
8. Offtop
 
С другой стороны, даже этот способ немного избыточен. Если Город является дочерним к Региону, а Регион к Стране, то хранение всех трех значений для объявления - это "лишние" данные, хотя при организации поиска они весьма кстати.
 
Суть в том, что географические данные вполне возможно хранить в виде, схожем со структурой

Скрытое содержимое

dest1.png
 

 

 
и получать к ним доступ более "человечным" путем
dest2.png
Но в этом случае остается так же много вопросов связанных с совместимостью с многими приложениями, принципом организации смой геоструктуры (ведь если заструктурить географию от страны до улиц - это может стать неподъемным грузом, а если закончить городом, то не совсем понятно, как вести связь дальше к улицам, которые должны таки быть привязаны к городам или чему-то наследному от них).
 
В общем идея у нас полно, была бы возможность все реализовать)

Скажите пожалуйста, в шаблоне real-spaces возможно сделать как в Реалии, что бы помимо прокрутки ещё было поле для ввода текста. А то при использовании связных элементов слишком много крутить приходиться

5a91a50125745_.jpg.281a0c8fc53f33ae3b75f6d3e6e01470.jpg

А если при использовании автокомплита пропадает связь элементов :(

Поэтому пока пришлось убрать связные элементы и и просто использовать автокомплит (((

160 на 60.png

Share this post


Link to post
Share on other sites

Это возможно реализовать путем дополнения формирования selecta, добавлением параметра data-live-search="true"

Share this post


Link to post
Share on other sites
3 часа назад, TopRaN сказал:

Это возможно реализовать путем дополнения формирования selecta, добавлением параметра data-live-search="true"

Добавлением в таблицу data например в city_id в "Набор параметров точной настройки элементов"? (там где прописываем связи элементов, вместо автокомплита)?

Попробовал сделать так и не помогло а "true" вообще после сохранения пропадает//

А... понял не туда вставлял. Подскажите пожалуйста куда надо?

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

Напишите пожалуйста хоть немного подробнее.

Спасибо

Share this post


Link to post
Share on other sites
5 часов назад, 72realty сказал:

Пожалуйста

Пожалуйста

Пожалуйста

:)

Алексей, вот код от моего standard_search_form.tpl, похоже, что в начале файла то, что тебе нужно (кусок кода до var max_price...):

<script>
  {literal}
  function refresher_linked_global_callback(connected_element){
    //console.log(1);
    connected_element.trigger("liszt:updated");
    /*connected_element.chosen({
    disable_search_threshold: 10
    });*/
	//connected_element.trigger('change');
  }
  $(document).ready(function(){
    $('.property-filter select').chosen({
      disable_search_threshold: 10
    });
  });
  var max_price={/literal}{if $max_price ne ''}{$max_price}{else}0{/if}{literal};
  var price_from=Number({/literal}{if isset($price_min)}{$price_min}{else}0{/if}{literal});
  var price_for=Number({/literal}{if (isset($price)) && ($price ne '')}{$price}{else}{$max_price}{/if}{literal});
  {/literal}
</script>
{$ajax_functions}
{foreach from=$scripts item=script}
{*$script*}
{/foreach}
<div class="property-filter pull-right">
  <div class="content">
	{if $mysearch_on==1}
    {if $mysearch_save_form_file ne ''}
    {include file=$mysearch_save_form_file}
    {/if}
    {/if}
    <form method="get" action="{$estate_folder}/">
      <div class="type control-group">
        <label class="control-label" for="inputType">{$L_TYPE}</label>
        <div class="controls">{$structure_box}</div>
      </div>
      
      {if $country_list != ''}
      <div class="type control-group">
        <label class="control-label" for="inputType">{$L_COUNTRY}</label>
        <div class="controls">{$country_list}</div>
      </div>
      {/if}
      
      {if $region_list != ''}
      <div class="type control-group">
        <label class="control-label" for="inputType">{$L_REGION}</label>
        <div class="controls">{$region_list}</div>
      </div>
      {/if}
      
      {if $raion_list != ''}
      <div class="type control-group">
        <label class="control-label" for="inputType">{$L_RAION}</label>
        <div class="controls">{$raion_list}</div>
      </div>
      {/if}
      
      {if $city_list != ''}
      <div class="type control-group">
        <label class="control-label" for="inputType">{$L_CITY}</label>
        <div class="controls">{$city_list}</div>
      </div>
      {/if}
      
      {if $district_list != ''}
      <div class="type control-group">
        <label class="control-label" for="inputType">{$L_DISTRICT}</label>
        <div class="controls">{$district_list}</div>
      </div>
      {/if}
      
      {if $street_list != ''}
      <div class="type control-group">
        <label class="control-label" for="inputType">{$L_STREET}</label>
        <div class="controls">{$street_list}</div>
      </div>
      {/if}
      
      {if $metro_list != ''}
      <div class="type control-group">
        <label class="control-label" for="inputType">{$L_METRO}</label>
        <div class="controls">{$metro_list}</div>
      </div>
      {/if}
      
      <label class="control-label" for="inputType">{$L_PRICE}</label>
      <div class="beds control-group">
        <div class="controls">
          <input type="text" class="price_from price_field" name="price_min" value="{if isset($price_min)}{$price_min|number_format:0:'':' '}{else}0{/if}"/>
        </div>
      </div>
      
      <div class="baths control-group">
        <div class="controls">
          <input type="text" class="price_for price_field" name="price" value="{if isset($price) && $price!=0}{$price|number_format:0:'':' '}{else}{$max_price|number_format:0:'':' '}{/if}"/>
        </div>
      </div>

      <div class="price-value control-group">
        <div class="controls">
          <div class="slider"></div>
        </div>
      </div>
      
      <div class="type control-group">
        <label class="control-label" for="inputType">{$L_ROOMS1}</label>
        <div class="controls">
          {if isset($smarty.request.room_count) && is_array($smarty.request.room_count)}
          <div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="1"{if in_array(1,$smarty.request.room_count)} checked="checked"{/if} /> <label class="ch">1</label></div>
          <div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="2"{if in_array(2,$smarty.request.room_count)} checked="checked"{/if} /> <label class="ch">2</label></div> 
          <div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="3"{if in_array(3,$smarty.request.room_count)} checked="checked"{/if} /> <label class="ch">3</label></div> 
          <div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="4"{if in_array(4,$smarty.request.room_count)} checked="checked"{/if} /> <label class="ch">4+</label> </div> 
          {else if isset($smarty.request.room_count)}
          <div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="1"{if $smarty.request.room_count==1} checked="checked"{/if} /> <label class="ch">1</label></div> 
          <div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="2"{if $smarty.request.room_count==2} checked="checked"{/if} /> <label class="ch">2</label></div> 
          <div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="3"{if $smarty.request.room_count==3} checked="checked"{/if} /> <label class="ch">3</label></div> 
          <div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="4"{if $smarty.request.room_count>=4} checked="checked"{/if} /> <label class="ch">4+</label></div> 
          {else}
          <div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="1" /> <label class="ch">1</label></div>  
          <div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="2" /> <label class="ch">2</label></div> 
          <div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="3" /> <label class="ch">3</label></div> 
          <div class="ch_small"><input class="checkbox" type="checkbox" name="room_count[]" value="4" /> <label class="ch">4+</label></div>
          {/if}
        </div>
      </div>

      <div class="form-actions">
        <input type="submit" value="{$L_GOSEARCH}" class="btn btn-info btn-large">
      </div>
    </form>
  </div>
</div>

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.