Автоподбор поля

модификация автозаполнения поля город

#1 16 января 2013 в 16:23
Доброго времени! Тут: ПРИМЕР реализовано автозаполнение поля город. Нужно сделать тоже самое для поля профессия. т.е на странице регистрации будут несколько полей, из них поля город и профессия должны обладать автозаполнением по примеру выше. Как это сделать?
#2 16 января 2013 в 16:34

Как это сделать?

troi

очевидно же что

по примеру выше

troi

city на proff не поменять?
#3 16 января 2013 в 21:43
Пробовал, не работает! Я так понимаю, нужно править обработчик PHP, который делает выборку по базе и возвращает ответ в javascript. Как правильно его составить?
#4 16 января 2013 в 22:23
ну так внутри файла city.php тоже поменяли? а запрос в базу не заменяли а добавили в него поле?
#5 17 января 2013 в 09:47
Изменил запрос на этот:
  1. <?php
  2.  
  3. define('PATH', dirname(__FILE__));
  4. define("VALID_CMS", 1);
  5.  
  6. include(PATH.'/core/cms.php');
  7.  
  8. $inCore = cmsCore::getInstance();
  9. $inDB = cmsDatabase::getInstance();
  10.  
  11. $professia = $inCore->request('query', 'str');
  12. if(!$professia)exit;
  13.  
  14. //Идентификатор главной страны
  15. $id_main_country = 1;
  16.  
  17. $sql = "SELECT id, professia, COUNT( id ) AS popule
  18. FROM cms_user_professions
  19. WHERE professia LIKE '{$professia}%'
  20. GROUP BY professia
  21. ORDER BY popule DESC , professia ASC";
  22. $res = $inDB->query($sql);
  23. if ($inDB->num_rows($res)) {
  24. while($ress = $inDB->fetch_assoc($res)){
  25. $suggestions[] = ($ress['popule'] > 10 ? '<b>' : '').$ress['professia'];
  26. $data[] = array('professia' => $ress['professia']);
  27. }
  28. }
  29. cmsCore::jsonOutput(array('query' => $professia, 'suggestions' => $suggestions, 'data' => $data));
  30.  
и в файле autocomplete.js добавил такие строки:
  1. select: function (i) {
  2. var selectedValue, f;
  3. var selectedValue1, f;
  4.  
  5. selectedValue = this.data[i].city;
  6. selectedValue1 = this.data[i].professia;
  7.  
  8. if (selectedValue) {
  9. this.el.val(selectedValue);
  10. if (this.options.autoSubmit) {
  11. f = this.el.parents('form');
  12. if (f.length > 0) {
  13. f.get(0).submit();
  14. }
  15. }
  16. this.ignoreValueChange = true;
  17. this.hide();
  18. this.onSelect(i);
  19. }
и вот тут:

  1. adjustScroll: function (i) {
  2. var activeItem, offsetTop, upperBound, lowerBound;
  3.  
  4. activeItem = this.activate(i);
  5. offsetTop = activeItem.offsetTop;
  6. upperBound = this.container.scrollTop();
  7. lowerBound = upperBound + this.options.maxHeight - 25;
  8.  
  9. if (offsetTop < upperBound) {
  10. this.container.scrollTop(offsetTop);
  11. } else if (offsetTop > lowerBound) {
  12. this.container.scrollTop(offsetTop - this.options.maxHeight + 25);
  13. }
  14.  
  15. this.el.val(this.getValue(this.data[i].city));
  16. this.el.val(this.getValue(this.data[i].professia));
  17. },
работает все отлично! Но возникли проблемы с добавлением автозаполнения поля в профиле. В файле /components/users/frontend.php вставляю
  1. $city_int = cmsCore::request('city_int', 'int', 0);
  2. if(!$city_int){cmsCore::addSessionMessage('Город необходимо выбрать из вариантов!', 'error');$errors = true;}
  3. else{
  4. $sql = "SELECT s.id_city, s.id_region, s.id_country, s.city_name_ru, r.region_name_ru, c.country_name_ru
  5. FROM cms_geo_cities s
  6. LEFT JOIN cms_geo_countries c ON s.id_country = c.id_country
  7. LEFT JOIN cms_geo_regions r ON s.id_region = r.id_region
  8. WHERE s.id_city={$city_int}";
  9. $geo = $inDB->query($sql);
  10. if($inDB->num_rows($geo)){
  11. $geo = $inDB->fetch_assoc($geo);
  12. $city= $geo['city_name_ru'];
  13. $geo = cmsCore::arrayToYaml($geo);
  14. }else{cmsCore::addSessionMessage('Город необходимо выбрать из вариантов!', 'error');$errors = true;}
  15. }
не сохраняются изменения и выпадает ошибка: Выберите профессию из списка.
#6 17 января 2013 в 10:58
Ошибся выше. Вставляю вот это:
  1. //Автозаполнение поля профессия
  2. $item['professia_int'] = cmsCore::request('professia_int', 'int', 0);
  3. $item['professia'] = cmsCore::request('professia', 'str', '');
  4. if(!$item['city_int']){cmsCore::addSessionMessage('Профессию необходимо выбрать из вариантов!', 'error');$errors = true;}
  5. else{
  6. $sql = "SELECT id, professia
  7. FROM cms_user_profession
  8. WHERE id={$item['professia_int']}";
  9. $professia = $inDB->query($sql);
  10. if($inDB->num_rows($professia)){
  11. $professia = $inDB->fetch_assoc($professia);
  12. $item['professia'] = $professia['professia'];
  13. $item['geo'] = cmsCore::arrayToYaml($city);
  14. }else{cmsCore::addSessionMessage('Профессию необходимо выбрать из вариантов!', 'error');$errors = true;}
  15. }
не сохраняются изменения и выпадает ошибка: Профессию необходимо выбрать из вариантов!
#7 17 января 2013 в 16:26
4 строка if(!$item['city_int'])
#8 17 января 2013 в 16:42
Тоже не работает
#9 17 января 2013 в 16:59
потому что тут бред написан :)

$professia = $inDB->fetch_assoc($professia);
$item['professia'] = $professia['professia'];
$item['geo'] = cmsCore::arrayToYaml($city);

вы отправляете массив в переменную сити
и причем тут гео?
#10 17 января 2013 в 18:41
picaboo, Ну подскажи, как правильно все это организовать! Я готов заплатить за потраченное время!
#11 17 января 2013 в 18:43
Сделал вот так:
  1. $item['professia_int'] = cmsCore::request('professia_int', 'int', 0);
  2. $item['professia'] = cmsCore::request('professia', 'str', '');
  3. if(!$item['professia_int']){cmsCore::addSessionMessage('Профессию необходимо выбрать из вариантов!', 'error');$errors = true;}
  4. else{
  5. $sql = "SELECT id, professia
  6. FROM cms_user_profession
  7. WHERE id={$item['professia_int']}";
  8. $professia = $inDB->query($sql);
  9. if($inDB->num_rows($professia)){
  10. $professia = $inDB->fetch_assoc($professia);
  11. $item['professia'] = $professia['professia'];
  12. $item['professia'] = cmsCore::arrayToYaml($professia);
  13. }else{cmsCore::addSessionMessage('Профессию необходимо выбрать из вариантов!', 'error');$errors = true;}
  14. }
результат тот же
#12 17 января 2013 в 19:23
весь код заново исправляйте. у вас почти в каждом примере js сити есть.
#13 17 января 2013 в 20:25
Все исправил. На странице регистрации все работает. Как все это засунуть в профиль? Например, что изменить тут:
  1. $city_int = cmsCore::request('city_int', 'int', 0);
  2. if(!$city_int){cmsCore::addSessionMessage('Город необходимо выбрать из вариантов!', 'error');$errors = true;}
  3. else{
  4. $sql = "SELECT s.id_city, s.id_region, s.id_country, s.city_name_ru, r.region_name_ru, c.country_name_ru
  5. FROM cms_geo_cities s
  6. LEFT JOIN cms_geo_countries c ON s.id_country = c.id_country
  7. LEFT JOIN cms_geo_regions r ON s.id_region = r.id_region
  8. WHERE s.id_city={$city_int}";
  9. $geo = $inDB->query($sql);
  10. if($inDB->num_rows($geo)){
  11. $geo = $inDB->fetch_assoc($geo);
  12. $city= $geo['city_name_ru'];
  13. $geo = cmsCore::arrayToYaml($geo);
  14. }else{cmsCore::addSessionMessage('Город необходимо выбрать из вариантов!', 'error');$errors = true;}
  15. }
#14 18 января 2013 в 12:53
Я заменил все city, но что делать с
  1. $geo = cmsCore::arrayToYaml($geo);
#15 18 января 2013 в 16:58

$geo = cmsCore::arrayToYaml($geo);

troi

а зачем вам arrayToYaml? у вас же профессия = одно слово в поле. или можно выбирать несколько профессий?


посмотрите лучше в сторону штатного jquery.autocomplete.min.js в инстанте.
Как работает можно увидеть в USERS, поиск по полю Город.

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