timpson78

Поле "улица" autocomplete - проблема ....Считаю без ее решения бессмысленно запускать проект...

Recommended Posts

Друзья, данная проблема не дает мне жить... Считаю без ее решения бессмылсленно запускать проект... Кто поможет с решением готов отблагодарить финансово...

 

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

 

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

1.Поиск  - имеем бред - вбиваем улицу - в ответ неверный поиск и добавление улицы в БД… При добавлении в объявление тоже самое... А если пользователь ввел неправильную улицу или ввел  улицу повторно или допустил ошибку?

2. Проблемы с безопасностью - начиная от того что любой школьник может засрать БД и сделать отказ в обслуживании ... А про серьезных ребят я вообще молчу... Если бы была система зашиты от флуда я бы еще понял....

 

Так вот какой выход?

 

Почему нельзя сделать привязку улиц как при autocomplete, но при этом запретить добавлять улицу в БД? 

 

Или тогда другой вариант:

Нужно убрать поиск по улице вместо него - поиск по содержимому. По улицам - autocomplete - остается только при добавлении объявлении обявления и при этом включить проверку:
A. Исключить все служебные символы - оставить только буквы и цифры (желательно только русские). Можно поставить маску на ввод, ну и делать проверку на системном уровне. При ниличии символов не добавлять в базу. 
B. Введенные данные форматировать следующим образом: a. «Название улицы ул», «ул» - стоит в конце (если пользователь ввел впереди убрать и поставить в конец) Название улицы с заглавной буквы b. «Название переулка пер» c. «Название проспекта проспект» d. «Название проезда проезд»
C. Проверять если такая улица уже есть, то не добавлять в базу, а брать занчение существующей записи.

  

Реализовать защиту от сканирования по типу http://habrahabr.ru/post/234729/

 

 

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если так сильно опасаться ввода неверных данных, то тут без вариантов select_box надо простой использовать.

И загрузить полностью все справочники улиц и районов нужных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1. И опять встает вопрос логичности поиска по улице. Если это не небольшая деревенька, а город, где средняя улица охватывает более пяти кварталов, кто будет искать по улице, а не предпочел бы поиск по неофициальным районам, которые описывают как раз некую площадь, а не абстрактное направление (которое зачастую, далеко даже не прямолинейное)?

 

2. Улицы, сквозные через несколько городов - по сути даже не требую селектбокса. В таком случае, с равным успехом, их можно уложить в обычное текстовое поле и вести как справочное данное. Тогда и поиск по ним будет, возможно, вызывать меньше лишней нагрузки на сервер. Особенно если учесть, что поиск по улице не очень удобен, как следует из пункта 1.

 

3. С остальным согласен. Автокомплит, напрямую потянутый из формы добавления объявления, обладает побочными явлениями.

 

 

 

ни в одной базе нет новых улиц с привязкой к районам

 

И никогда не будет. Улица не может быть привязана к району в отличии от дома. Если брать по иерархии, то улица и районы находятся в ее разных ветвях относительно города.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если так сильно опасаться ввода неверных данных, то тут без вариантов select_box надо простой использовать.

И загрузить полностью все справочники улиц и районов нужных.

 

 Как создать select_box и подгрузить значения из таблицы re_street? В каком виде будут храниться значения в базе ? Правильно ли я понимаю значения select_box будут все подгружаться в страницу в виде <option>.... ? Тогда при наличии > 5000 улиц мы имеем увеличение размера страницы не менне чем на 200 кбайт.... Кроме этого увеличивем нагрузку на сервер время отклика...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1. И опять встает вопрос логичности поиска по улице. Если это не небольшая деревенька, а город, где средняя улица охватывает более пяти кварталов, кто будет искать по улице, а не предпочел бы поиск по неофициальным районам, которые описывают как раз некую площадь, а не абстрактное направление (которое зачастую, далеко даже не прямолинейное)?

 

2. Улицы, сквозные через несколько городов - по сути даже не требую селектбокса. В таком случае, с равным успехом, их можно уложить в обычное текстовое поле и вести как справочное данное. Тогда и поиск по ним будет, возможно, вызывать меньше лишней нагрузки на сервер. Особенно если учесть, что поиск по улице не очень удобен, как следует из пункта 1.

 

3. С остальным согласен. Автокомплит, напрямую потянутый из формы добавления объявления, обладает побочными явлениями.

 

 

И никогда не будет. Улица не может быть привязана к району в отличии от дома. Если брать по иерархии, то улица и районы находятся в ее разных ветвях относительно города.

 

Согласен, можно исключить улицы из поиска.. Но меня больше волнует добавление в базу объявления...  Почему нельзя оставить все как есть, но только не добавлять в базу ?  К примеру так же с помощью  ajax   вытягивать с re_street данные, но давать выбирать только то что в базе... Если пользователь написал улицу  и  нет совпадения, выводить, к примеру, сбоку сообщение красным и сообщать, что выбрать из списка  а при добавлении объвления проводить проверку на уровне сервера....

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Согласен, можно исключить улицы из поиска.. Но меня больше волнует добавление в базу объявления...  Почему нельзя оставить все как есть, но только не добавлять в базу ?  К примеру так же с помощью  ajax   вытягивать с re_street данные, но давать выбирать только то что в базе... Если пользователь написал улицу  и  нет совпадения, выводить, к примеру, сбоку сообщение красным и сообщать, что выбрать из списка  а при добавлении объвления проводить проверку на уровне сервера....

Может такое будет интересно

http://wiki.sitebill.ru/index.php?title=Tlocation

http://www.etown.ru/s/topic/327-tlocation-%D0%B2-%D0%BA%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BA%D0%B0%D1%85/?hl=tlocation

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 Почему нельзя оставить все как есть, но только не добавлять в базу ?

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

 

Если выбирать из двух зол меньшее, то наверно Tlocation как временное решение пойдет... Выпадающий список из 5000 улиц это круто))) Но Конечно надо доработать аутокомплит.... Я настроил   Tlocation для data street_id -  в итоге имеем:   ПОИСК - При выборе города или района пропадает  select_box улицы  ?????  При Добавлении объявления - не пишет "выбор улицы", нет информационного квадратика подсказки????

post-2091-0-39685000-1417501323_thumb.pn

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Я настроил   Tlocation для data street_id

 

 

Тлокейшн не используется для одного поля. Это комплексный элемент заменяющий собой все от country_id до street_id. Используя его вам нужно выключить все географические поля.

 

Кто нибудь ответит это баги или я что то не так сделал?

 

Нет подсказок. Все правильно. Элемент комплексный и не вбирает в себя подсказки всключенных в него элементов.

 

При Добавлении объявления - не пишет "выбор улицы"

 

 

 

Тоже все правильно. Там заменены текстовые переменные типа "выбрать..." абстрактным "--" что бы не обязывать.

 

 

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

Т.е. мы избавляемся от постоянной загрузки 5к улиц в поле выбора улицы при загрузке формы и откладываем этот процесс до момента выбоар "родителя" улиц, выбор которого определить диапазон загружаемых улиц.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Тлокейшн не используется для одного поля. Это комплексный элемент заменяющий собой все от country_id до street_id. Используя его вам нужно выключить все географические поля.

 

 

Нет подсказок. Все правильно. Элемент комплексный и не вбирает в себя подсказки всключенных в него элементов.

 

 

Тоже все правильно. Там заменены текстовые переменные типа "выбрать..." абстрактным "--" что бы не обязывать.

 

 

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

Т.е. мы избавляемся от постоянной загрузки 5к улиц в поле выбора улицы при загрузке формы и откладываем этот процесс до момента выбоар "родителя" улиц, выбор которого определить диапазон загружаемых улиц.

 

 

Тогда меня не утраивает этот элемент!!!!! Напишите мне где я могу добавить код, что бы допилить autcomplete, что бы не было добавления в базу, желательно что бы при обновлении ничего не пропало....

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Лечим автокомплит

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

 

Нужно: свежий system

 

1. /apps/system/lib/model/model.php

2. находим место разбора полей типа автокомплит

строка 84

if ( isset($model_array[$key]['type']) && $model_array[$key]['type'] == 'select_by_query' ) {

и чуть ниже его конкретно вариант автокомплита

if(isset($parameters['autocomplete']) && $parameters['autocomplete']==1){

С этого места начинаем кодить

 

3. Добавляем перехват параметра запрещающего вставлять пользовательские названия

if(isset($parameters['autocomplete_notappend']) && 0!=(int)$parameters['autocomplete_notappend']){    $no_insert=true;}

вставляем сразу после 

if(isset($parameters['autocomplete']) && $parameters['autocomplete']==1){

4. Сохраняем.

5. Открываем Админка - Редактор форм и берем на редактирование искомое поле (street_id например)

6. Находим раздел Параметры и дополняем его параметром autocomplete_notappend со значением 1

post-58-0-91910100-1417524845_thumb.png

7. Жмем сохранить.

8. Проводим попытку добавить объявление по автокомплит-полю с неуставной улицей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо!! Сейчас поковыряюсь.... Только вот обновился до свежего   система и  появилась ошибка ... Что  я сделал не так?

post-2091-0-78534800-1417590497_thumb.pn

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо помогло! Только странно должна ли вылазить такая ошибка или должна быть защита от дурака? И вот что странно такая ошибка вылезла только на локальной копии  а на хостинге при наличии обновления и  поля tlocation   такой ошибки нет...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо помогло! Только странно должна ли вылазить такая ошибка или должна быть защита от дурака? И вот что странно такая ошибка вылезла только на локальной копии  а на хостинге при наличии обновления и  поля tlocation   такой ошибки нет...

 

На хостингах владельцы обычно включают режим логгирования некритических ошибок в файл, а в экран выводят только фатальные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Отлчино! В базу теперь не добавляет!!!!! Теперь мне нужно построить диалог с пользователем при добавлении объявления - сообщить ему что нужно обязательно выбрать из списка иначе запись не добавиться в базу.... 1. С помощью jquery  поработать с диалогом  2.  При добавлении объявления сделать проверку: если  улица из справочника тогда добавлять объявление в базу иначе попросить ввести  ... Подскажите где это лучше сделать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

2.  При добавлении объявления сделать проверку: если  улица из справочника тогда добавлять объявление в базу иначе попросить ввести  ... Подскажите где это лучше сделать?

 

Поставить на поле улица метку Обязательно к заполнению.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Хорошо, тогда скажите где код поймает улицу... Я хочу в интерактиве помочь пользователю ввести улицу  из базы... Я так полагаю это связка jquery-ajax.... А то  получается ситуация: пользователь ввел улицу не из базы, заполнил дальше поля и нажал добавить - а в ответ вы не заполнили поле улица... И возникает непонятная ситуация для пользователя ... Пользователь продолжает вводить улицу не из базы а ему опять вы не заполнили улицу... И тогда пользователь думает и не пошли бы вы со своим сайтом....)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вы когда вводите автокомплит, разворачивается список совпадений, который как бы намекает, что улицу надобно бы выбрать из него. Если бы этого не нужно было бы, то он бы не разворачивался, а просто съедал все, что введет пользователь. Или я мыслю не как обычный человек?

 

Не совсем понял механизм "помощи пользователю по введению улицы из БД". Список совпадений по названию улицы в автокомплите - куда уже больше помощи? Или вы хотите сообщение перед отправкой формы - мол, "уважаемый, улица-то не указана!" ?

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

Механизм такой: пользователь набирает улицу не из списка к примеру справа появляется сообщение красным: "Такой улицы нет, выберите из списка", начинает стирать и выплывает список - сообщение уходит

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Механизм от дурака должен быть, но даже его должно быть в меру. Для таких критических, как вы описали, лучше обычного селектбокса не придумали. Он максимально недвусмысленен.)))

 

Про всплывающее сообщение, в принципе может быть, но варианта, как подружить этот аддон и встроенный скрипт с лету не предложу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Немного допилил функцию /apps/system/js/refreshers.functions.js

 

$('.geoautocomplete').each(function(){
var parent=$(this).parents('.geoautocomplete_block').eq(0);
var _hidden=parent.find('input[type=hidden]');
var _pk=$(this).attr('pk');
var _table=$(this).attr('from');
var _this=$(this);


$(this).autocomplete({


open: function() {
$('.ui-menu')
.width(_this.width());
} ,
source: function( request, response ) {
var answer=[];
$.ajax({
url: estate_folder+'/apps/tlocation/js/ajax.php',
type: 'GET',
dataType: 'json',
data: 'action=get_geolist&from='+_table+'&term='+encodeURIComponent(request.term),
success: function(json) {

$.map(json,function(n,i){

var o={};
o.id=n[_pk];
o.value=n.name;
o.label=n.name;
answer.push(o);
});

if ($("#mymes")) {$("#mymes").remove();}
if (answer.length == 0 && request.term != '' ){

$(parent).append('<p id="mymes" class="text-error"> Такой улицы нет. Выберите улицу из списка! </p>');
yes=1;
}
response(answer);
}
});
},
minLength: 1,
select: function( event, ui ) {
_hidden.val(ui.item.id);
}

});



$(this).keyup(function(){
_hidden.val('');
});
});
});

 

Конечно не совсем то что хотел но на первое время пойдет...

 

post-2091-0-53895200-1417774548_thumb.pn

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Эта функций обслуживает все автокомплиты. Может сделать сообщение более нейтральным? Иначе если завтра включите автокомплит на городе, то получите такое же сообщение о несуществующей улице.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас