Спешу поделиться и вынести на ваш суд свой компонент "Страны и города".
Цели которые преследую создавая этот пост:
- поделится разработкой
- услышать критику и рекомендации от гуру относительно написания компонента (ну это конечно при наличии у них свободного времени для просмотра моей "мазни" )
- привнести новый функционал в компонент если понадобится и довести до ума существующий
Для чего собственно компонент: Компонент позволяет разработчику манипулировать состоянием списка городов, регионов, стран. Компонент дает возможность разработчику использовать каскадный список стран в любой (наверное) форме на сайте, будь то форма обратной связи, адрес доставки товара и пр. где пользователю необходимо выбрать Страну и город.
Возможности: В админ панели компонента:На главной странице компонента отображаются страны, регионы, города добавленные пользователями. Стандартные манипуляции над данными (публикация, редактирование). Два способа просмотра данных один можно сказать "линейный" просмотр всех стран или регионов или городов - отображаются по id (пагинация присутствует), второй каскадный - при выборе страны,"Показать регионы" просматриваем все регионы этой страны, ну и при выборе региона - просмотр городов "Показать города". Можно пакетно "Опубликовать", "Скрыть" страну или регион - если выбрать страну и нажать кнопку "Пакетно Показать" то будут опубликованы все регионы этой страны и все города этой страны - данный способ публикации как наверное догадываетесь может быть очень долгим и превысить timeout выполнения скрипта, так что не рекомендую отмечать по несколько стран, лучше по одной.
На сайте:Пользователь не только выбирает из списка страну, регионы и город, но может добавить свой если такого в списке нет. Если пользователь добавил свой город и нажал кнопку "Add city" или "Add all field" - то в админ части у вас будет отображен список тех стран и пр. что добавляет пользователь.
Как использовать:1. Установить компонент и опубликовать те страны, регионы, города которые планируется использовать в форме. (Админ панель)
2. В Компоненте где планируете использовать этот компонент следует подключить библиотеку jQuery, она находится в папке "js" в папке компонента, к моему сожалению я не смог правильно подключить локальную библиотеку потому использовал подключение библиотеки с сайта Google. Я подключаю так
$document = &JFactory::getDocument();
$document->addScript('http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js');
это до объявления класса в файле представления.
3. Дальше необходимо создать объект модели компонента и вызвать метод getCountryList()
$path = JPATH_ADMINISTRATOR.DS.'components'.DS.'com_country';
require_once ($path.DS.'models'.DS.'frontend.php');
$modelCountry = new CountryModelFrontend();
$list = $modelCountry->getCountryList();
$this->assignRef('listCountries',$list);
.
теперь в форме нужно вывести этот список
<div class="place">
<span class="status" style="color:blue;font-weight:bold"></span><br/>
<?php echo $this->listCountries; ?>
<div class="countries"></div>
<div class="regions"></div>
<div class="cities"></div>
</div>
status и div можете изменить согласно вашему дизайна, главное чтобы контейнеры имели классы как указано выше.
Ну вот и все, теперь при загрузке страницы с вашей формой у вас отобразится список стран. Изначально на сайт в указанное вами место в форме подгружается статический список стран опубликованных и системных, когда пользователь выбирает одну из стран динамически подгружается список регионов этой страны, ну и с городами тоже самое. Если пользователь выбирает в списке "Другая страна" то ему подгружаются поля для ввода названия страны, региона и города, после того как пользователь нажмет кнопку "Add all fields" или город. в форму будут добавлены id добавленных в базу полей input type=hidden.
Так как пользователь может добавить свой город. регион или страну (или все сразу) то и при обработке следует выполнить проверку - что же нам прислал пользователь. я делаю это следующим способом
//в представлении
$dataForm = JRequest::get('post');
$this->assignRef('dataForm',$dataForm);
// в шаблоне (tmpl/default.php)
if($this->dataForm['countries']<1){
// Пользователь должен был указать все поля
$countryId = $this->dataForm['idCountry'];
$regionId = $this->dataForm['idRegion'];
$cityId = $this->dataForm['idCity'];
}else{
$countryId = $this->dataForm['countries'];
if($this->dataForm['regions']<1){
$regionId = $this->dataForm['idRegion'];
$cityId = $this->dataForm['idCity'];
}else{
$regionId = $this->dataForm['regions'];
if($this->dataForm['cities']<1){
$cityId = $this->dataForm['idCity'];
}else{
$cityId = $this->dataForm['cities'];
}
}
}?>
при установке компонента в БД создается 3 таблицы и заполняются данными (порядка 17 000 городов 218 стран и несколько тысяч регионов)
во вложении кроме компонента com_country есть com_hello в нем можно посмотреть работу компонента com_country для этого необходимо в адресной строке ввести адрес index.php?option=com_hello&task=showForm&view=sending - заполнить поля формы (
фактически там одно поле) и нажать кнопку "Send"
[вложение удалено Администратором]