Как в собственном компоненте, реализовать структуру регион-район-населённый пункт?

Тема в разделе "Создание расширений для Joomla", создана пользователем g3., 31.03.2011.

  1. g3.
    Offline

    g3. Недавно здесь

    Регистрация:
    23.03.2011
    Сообщения:
    2
    Симпатии:
    0
    Пол:
    Женский
    Доброе время суток, народ!

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

    не подскажете, как реализовать?

    данные по регионам, районам и населённым пунктам храню в бд

    как выводить селекты - знаю, а с ajax-ом совсем плохо=(

    помогите, кто может, хотя бы советом натолкните на мысль
     
  2.  
  3. g3.
    Offline

    g3. Недавно здесь

    Регистрация:
    23.03.2011
    Сообщения:
    2
    Симпатии:
    0
    Пол:
    Женский
    проблема решилась

    ниже привожу способ реализации:

    структура бд:

    Таблица с регионами:
    Код (CODE):
    1. CREATE TABLE IF NOT EXISTS `jos_ai_regions` (
    2.   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    3.   `name` varchar(255) NOT NULL,
    4.   PRIMARY KEY (`id`)
    5. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=17 ;


    Таблица с районами:

    Код (CODE):
    1. CREATE TABLE IF NOT EXISTS `jos_ai_districs` (
    2.   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    3.   `name` varchar(255) NOT NULL,
    4.   `id_of_region` int(11) NOT NULL,
    5.   PRIMARY KEY (`id`)
    6. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=272 ;


    Таблица с городами:

    Код (CODE):
    1. CREATE TABLE IF NOT EXISTS `jos_ai_cities` (
    2.   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    3.   `name` varchar(255) NOT NULL,
    4.   `id_of_district` int(11) NOT NULL,
    5.   PRIMARY KEY (`id`)
    6. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=24 ;



    Код task-а в конструкторе (для выборки и вывода регионов):

    Код (PHP):
    1. function getDistrics()
    2.     {
    3.        
    4.         $id = JRequest::getVar('rid');
    5.             $model = $this->getModel('local');
    6.             $district = $model->getDistrics($id);
    7.  
    8.         if ($district)
    9.                    {
    10.                 $html = JText::_('Выберите район').':</td><td>'
    11.                    .JHTML::_('select.genericlist', $district, 'district', 'class="inputbox"', 'value', 'text', $row->district).'</td><td><a href="#" onclick="ajaxGetDistrics()">ОК</a></td>
    12.                     </td></tr>';   
    13.    
    14.             }
    15.                  else
    16.                    {
    17.                     $html = 'Нет районов для этого региона';
    18.             }
    19.  
    20.              echo $html;
    21.     }

    Код функции в модели:

    Код (PHP):
    1. function getDistrics($id)
    2.   {
    3.                 $db = &$this->getDBO();
    4.                 $query = 'SELECT id AS value, name AS text '
    5.                 . ' FROM #__ai_districs'
    6.                 . ' WHERE id_of_region ='.$id;
    7.                $db->setQuery($query);
    8.                $district = $db->loadAssocList();
    9.                return $district;
    10.   }


    Собственно сам код скрипта:

    Код (CODE):
    1. function getXmlHttp()
    2.   {
    3.       var xmlhttp;
    4.       try
    5.        {
    6.             xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    7.         }  
    8.        catch (e)
    9.         {
    10.           try  
    11.             {
    12.                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    13.              }
    14.         catch (E)
    15.          {
    16.           xmlhttp = false;
    17.           }
    18.         }
    19.  
    20.   if (!xmlhttp && typeof XMLHttpRequest!='undefined')
    21.         {
    22.             xmlhttp = new XMLHttpRequest();
    23.         }
    24.   return xmlhttp;
    25.    }
    26.  
    27.  
    28. function ajaxGetDistrics()
    29.   {
    30.     var req = getXmlHttp()  
    31.     var statusElem = document.getElementById('districs');
    32.     var id = document.getElementById('region').value;
    33.  
    34.     req.onreadystatechange = function()
    35.        {  
    36.          if (req.readyState == 4)
    37.             {
    38.                 statusElem.innerHTML = req.statusText
    39.                 if(req.status == 200)
    40.                     {
    41.             var newElement = document.createElement('td')
    42.             newElement.innerHTML = req.responseText
    43.             statusElem.appendChild(newElement)
    44.                      }
    45.               }
    46.           }
    47.      req.open('GET', 'index.php?option=com_airus&task=getDistrics&format=row&rid='+id, true);  
    48.     req.send(null);
    49.     statusElem.innerHTML = 'Ожидаю ответа сервера...'
    50.   }


    Возможно всё это криво и неправильно, но работает
    Была бы рада, если бы кто-то поправил или просто выразил своё мнение
     
    Последнее редактирование: 31.03.2011
  4. lottis
    Offline

    lottis Недавно здесь

    Регистрация:
    02.07.2010
    Сообщения:
    11
    Симпатии:
    0
    Пол:
    Мужской
    Да вроде нормально, кроме полной уязвимости для sql-атак. Вы ведь id нигде не проверяете от пользователя? Я ведь могу написать вместо id ( 23; DROP TABLE users;) и это прокатит, удалиться вся ваша таблица с пользователями.
     
  5. progmist
    Offline

    progmist Недавно здесь

    Регистрация:
    18.05.2009
    Сообщения:
    155
    Симпатии:
    10
    Пол:
    Мужской
    По поводу sql-баги полностью согласен. Если это запустить на реальном сайте, то потом не стоит удивляться если на нем появится что-нибудь левое (левые ссылки, iframe-ы и т.п.).
    Поэтому надо использовать
    JRequest::getInt('var_name') - если получаете из $_REQUEST число
    также рекомендую всегда в запросах вставлять определение типа(на всякий случай), например:
    $db->setQuery("select * from #__content where id=".(int)$id);
    $db->quote($str) - квотируйте все строки. которые вставляете в запрос, например:
    $db->setQuery("select * from #__content where title=".$db->quote($title_need));

    Еще автору советую для реализации поставленной цели, да и для многих других целей связанных с javascript-ом. использовать мощный фреймворк jQuery (http://jquery.com).
    на jQuery данная задача с ajax-ом решается намного проще.

    Смею заметить что mysql_query не выполнит два запроса. select и drop
    так что DROP Table не прокатит.
     

Поделиться этой страницей

Загрузка...