« Поставить закладку » « Сделать стартовой »

« Форумы » « Блоги » « Статьи » « Новости » « Файлы » « Realcoding IRC » « Site map » « Поиск »


Главная Главная
Анонсы Анонсы
Форумы Форумы
Каталог Каталог
Поиск Поиск
Опросы Опросы
Книжный магазин Книжный магазин
Реклама на сайте
Публикации Публикации
Партнеры Партнеры
Карта Карта сайта
Рассылки Рассылки
RSS экспорт
Настройки Настройки
О нас пишут О нас пишут
Контакты Контакты
Гостевая книга Гостевая книга

Тестирование 64-битных приложений

ПнВтСрЧтПтСбВс
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          
    Популярное
Сортировка данных

Макросы

Не самые известные сведения о внешних ключах

Проводник Visual Studio.NET по серверу: Server Explorer

Этикет общения с работодателем. Как произвести благоприятное впечатление и стать желанным кандидатом.

Пишем программу для пересылки файлов через сокеты

Делаем плагины на Python

Как взломать парольную защиту Oracle или как ее обойти

Сообщения Windows

Глава 1. Открытие и просмотр таблицы.




    Архив файлов



    Сообщества



    Документация

Статьи:: Интернет технологии :: Java Script :: ExtJS: компонент выбора местонахождения


отправить ссылку другу версия для печати  Обсудить на форуме

ExtJS: компонент выбора местонахождения



Автор: http://web-dev.info/

Многие проекты на данный момент используют информацию о местонахождении своих клиентов. К таким относятся интернет-магазины, сайты знакомств, банковские операционные ресурсы и прочее. Именно об элементе указания такого рода информации и будет данная статья: Ext.ux.locationSelect реализованный в поле фреймворка ExtJS 2.



Маленькая демка поможет ответить на вопрос о необходимости вчитываться в дальнейшее.

Synopsis

Так сложилось исторически, что управляющим элементом по выбору локации (будем пользоваться этим словом для определения месторасположения, местонахождения и иного) является некоторое количество взаимосвязанных списков <select>, позволяющих последовательно уточнять локацию часть за частью. Выглядеть это может примерно следующим образом. Контрол в сумме удобен, малопротиворечив, но несколько устарел. Вот первые, бросающиеся в глаза, минусы решения:

  • popup окно для донесения до посетителя всего контрола;
  • отсутствие кеширования данных селектов;
  • слабая расширяемость и гибкость — любой функционал необходимо реализовывать самостоятельно.

Что необходимо получить

В одном из проектов мне понадобилось обойти всё вышеперечисленное и ко всему прочему соблюсти следующее:

  • window based дизайн — ресурс интенсивно редактируется и back end было решено выполнять в виде оконного интерфейса;
  • т. к. страница могла не перезагружаться при работе на ней часами, то вопрос кеширования данных стоит очень остро;
  • необходимо не только позволять выбирать локации, но и верно отображать их, в такой, например, ситуации как редактирование, когда все селекты уже означены, а соответствующие списки в них уже загружены.

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

Нам потребуется:

Использование ExtJS обусловлено требованием №1 — интерфейс window based. Только этот фреймворк способен был справиться со всеми требованиями, которые были предъявлены к процессу работы с данными.

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

кстати:

данные ZF-элементы дизайна контрола можно исключить и заменить на что-либо более привычное буквально в течении получаса.

Контрол в действии

Использование, благодаря мастерству и прозорливости разработчиков ExtJS, практически ничем не отличается от использования стандартных компонент этого пакета — создать и применить Ext.ux.locationSelect также легко как и создать обычную панель.

Подключение

Подключение реализуется в обычном порядке. Если ExtJS уже используется, то необходимо подключить только само расширение:

  1. <head>  
  2.     <script type="text/javascript" src="/lib/ext/adapter/ext/ext-base.js"></script>  
  3.     <script type="text/javascript" src="/lib/ext/ext-all.js"></script>  
  4.     <script type="text/javascript" src="/lib/ext/ux/locationSelect.js"></script>  
  5.     <link href="/lib/ext/resources/css/ext-all.css" rel="stylesheet" type="text/css" />  
  6. </head>  
для галочки:

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

Конфигурирование и создание

Ввиду того, что контрол расширяет Ext.form.FieldSet, то видеть себя он предполагает в поле Ext.FormPanel, однако это необязательное требование.

важно:

подробнейшее описание API, конфигураций и немного примеров по каждому из контролов можно обнаружить в ExtJS API Documentation в соответствующей части дерева компонент, пакетов и классов.

Таким образом включить контрол в форму можно простым добавлением его конфигурационного объекта в items формы:

  1. var myForm = new Ext.form.FormPanel({  
  2.     items: [{  
  3.         xtype: 'locationselect',  
  4.         url: '/someURL',  
  5.         prefix: 'some_location_',  
  6.         title: 'someFieldSetTitle',  
  7.         valueNotFoundText: 'Не важно',  
  8.         validator: function(){/*some js-code*/}  
  9.         autoHeight: true  
  10.     }]  
  11. });  

Нестандартными конфигурационными полями являются:

  • url — адрес куда хранилища контрола будут обращаться за списками частей локаций (страны, регионы и города), по этому же адресу будет отправляться запрос на полную единовременную загрузку локации целиком. Например, Россия | Рязанская обл. | Рязань;
  • prefix — префикс имен переменных в которых будут сохранены ID частей локации. Для случая выше при сабмите контрол «сгенерирует» и отправит на сервер переменные _some_location_country, _some_location_region, _some_location_city;
  • valueNotFoundText — значение этого поля будет присвоено одноименному конфигурационному полю всех Ext.form.ComboBox контрола;
  • validator — функция будет вызываться при событии выбора любой части локации и позволит обязать, например, к указанию локации полностью.
о незаметном:

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

Все остальные поля — наследие конфигурации суперкласса.

Загрузка локации целиком

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

Для этой цели контрол имеет метод loadLocation(), который принимает конфигурационный объект формата {country: integer, region: integer, city: integer}. При его вызове будет произведено обращение по url, указанном при создании, с передачей параметров локации. Если вернувшиеся данные соответствуют допустимому формату, то в соответствующие комбобоксы будут загружены списки с данными, а те части локации, которые были заданы в конфигурационном объекте будут выбраны.

Серверная часть

Так как контрол подкачивает данные с помощью AJAX, необходимо «договориться» о протоколе общения его с сервером. Здесь имеется развилка:

  1. При выборе какой-либо одной части локации посредством комбобокса контрол «расчитывает» на один массив со значениями для следующего комбобокса в json-формате {rows: [{id: numeric, name: string}, …]};
  2. При полной загрузке локации контролу необходимы массивы для двух последних комбобоксов единовременно в json-формате {rows: {region: [{id: numeric, name: string}, …], city: [{id: numeric, name: string}, …]}}.

Мне было удобнее реализовать обе подгрузки в одном действии locationSelectGetSublocations() контроллера AjaxController.

  1. public function locationSelectGetSublocationsAction() {  
  2.         $this->_helper->viewRenderer->setNoRender();  
  3.         $filter = new Zend_Filter_Digits();  
  4.         $location = new Location();  
  5.         if ($this->getRequest()->getParam('country', 0) && $this->getRequest()->getParam('region', 0)){  
  6.             $countryId = $filter->filter($this->getRequest()->getParam('country', 0));  
  7.             $regionId = $filter->filter($this->getRequest()->getParam('region', 0));  
  8.             $result = array(  
  9.                 'region' => $location->getSublocations($countryId),  
  10.                 'city' => $location->getSublocations($regionId)  
  11.             );  
  12.             //добавляем опции по умолчанию  
  13.             array_unshift($result['region'], array('id' => 0, 'name' => 'Не имеет значения'));  
  14.             array_unshift($result['city'], array('id' => 0, 'name' => 'Не имеет значения'));  
  15.             echo json_encode(array('rows' => $result));  
  16.         } else {  
  17.             $id = $filter->filter($this->getRequest()->getParam('parentId', 1));  
  18.             $result = $location->getSublocations($id);  
  19.             //добавляем опцию по умолчанию  
  20.             array_unshift($resultarray('id' => 0, 'name' => 'Не имеет значения'));  
  21.             echo json_encode(array('rows' => $result));  
  22.         }  
  23.     }  
на заметку:

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

Белым пятном действия является класс Location — модель таблицы location. Это ничто иное как наследник класса Application_Db_Table_Nestedset о котором велась речь в предыдущей статье. Код модели имеет вид:

  1. class Location extends Application_Db_Table_Nestedset{  
  2.   
  3.     protected $_name = 'location';  
  4.     protected $_primary = 'id';  
  5.   
  6.     /** 
  7.      *  Return child locations of location 
  8.      * 
  9.      * @param integer parent location id 
  10.      * @return array location items 
  11.      */  
  12.     public function getSublocations($id){  
  13.         $result = array();  
  14.         foreach ($this->getChildren($idas $row)  
  15.             $result[] = array('id' => $row['id'], 'name' => $row['name']);  
  16.         return $result;  
  17.     }  
  18. }  

Таблица данных локаций

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

Локации упорядочены и собраны в одной таблице по схеме Вложенных Множеств. Лично мне кажется, что эта схема является очень удачной для такого рода задач:

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

Ресурсы




Рубрика: Java Script




Google Developer Day 2008 в Москве.

Мероприятия

Дата проведения: 28 октября 2008 г.; Место проведения: Амбер Плаза, Москва, Россия. Конференция для веб-разработчиков и разработчиков мобильных приложений в Москве. Узнайте, как наилучшим образом использовать инструменты разработки и API от Google, чтобы создавать социальные, мобильные и картографические приложения, как использовать AJAX/JavaScript инструменты и библиотеки от Google и многое другое из первых уст.


Подробнее... | Рубрика: Мероприятия | Добавлено: 05.09.2008

ТОП 10 самых раздражающих факторов для программиста.

Разное

Совсем недавно наткнулся в интернете на забавный "хит-парад" наиболее раздражающих вещей для программиста. Поскольку он был на английском — решил перевести текст и несколько адаптировать к нашим реалиям…


Подробнее... | Рубрика: Разное | Добавлено: 03.09.2008

Windows Server 7, 8 и 9.

Windows Server 2003

К написанию этой статьи меня побудили недавние изыскания Мэри Джо Фоли (Mary Jo Foley) по поводу Windows 7 Server и Windows Server 2008 R2. Если бы не она, я, наверное, и не вспомнил бы о массе информации, имеющейся по этому поводу у меня. Если вы не слышали, Microsoft удалось смутить львиную долю пользователей своим заявлением о том, что Windows Server 2008 R2, чей релиз должен состояться в 2010 году, есть ничто иное, как Windows 7 Server.


Подробнее... | Рубрика: Windows Server 2003 | Добавлено: 03.09.2008

Остальные статьи:

jQuery для JavaScript-программистов
Инновационный веб-броузер Google Chrome стартует уже сегодня
Windows 7: подход к производительности системы
Trac + Subversion @ Ubuntu: Revisited
[g]Vim в режиме Python: Рекомпиляция в Windows
Java + JSON. Пути к дружбе
Драйвер SQL Server 2005 для PHP
Типы данных в MySQL (сжатый справочник для PHP программиста)
PHP класс для работы с Яндекс.XML
Ошибки начинающих PHP разработчиков
Наследование шаблонов в Smarty
Особенности хранения сессий PHP в memcached
Internet Explorer 8 beta 2
9 правил для начинающего Ajax-разработчика
ExtJS 2.2 - полная поддержка Firefox 3, новые виджеты и другие нововведения
Windows 7: под покровом тайны


Цитата дня (все,добавить):



    Рубрикатор

Программирование

C/С++
Обучение
Windows API
XAML
Моделирование
Паттерны
Visual Basic 7 .NET
WxWidgets
Функции WinApi
Функции С++
Разработка под Mac OS
Eiffel
Visual Studio 2008
UI дизайн
Алгоритмы
Конкурсные статьи
Turbo Pascal
Visual Studio
CASE-средства
Visual Studio 2005
Без VCL
Delphi
Тех. документация
Тестирование
Software Testing
ООП
TCP/IP
Google Android
Windows Installer
.NET Framework
Драйвера
C# C Sharp
Справка
Проектирование
Информ. системы
Visual Basic
Assembler
Оптимизация кода
Gtk+
Компоненты
Реинжиниринг
Управление проектами
Extreeme programming
Lotus Notes
Алгебраическое проектирование

Интернет технологии

PHP
Perl
ASP
WAP
Cookies
SSI
CGI
Web Servers
VB Script
DNS
CSS
XML
Html
Java Script
Java2ME
Firewall
Flash
.htaccess
Apache
VRML
Протоколы
Поисковые системы
Технология JAVA
Учебник по PHP
Учебник по JavaScript
Учебник по XML
Java Q&A
AJAX
DHTML
XHTML
Dreamweaver
Web 2.0
Python
Вебмастеру
Cisco
Ruby on Rails
Silverlight

Базы данных

Access
InterBase
MySQL
Oracle
ADO .NET
Основы SQL
Учебник по Access 2002
MS
Microsoft FoxPro
Доступ к данным
XML в MS SQL Server 2000
ODBC и MyODBC
Обучение
Caché
DB2
PostgresSQL
Sybase
Теория
Хранилища данных
Безопасность
Реляционные данные
MySQL и mSQL

Остальное:

Разное
Обзоры книг
Безопасность
Графика и дизайн
Юмор
Linux
Фракталы
Microsoft Axapta
Многоядерность
Сети
Microsoft Office
Работа
MS-DOS
Криптография
Графика и игроделание
Новости SDK
Системы защиты
Учебник по AutoCad
CVS
Windows XP
Windows Server 2003
Windows Vista
Windows 7
Мероприятия

    Кто на сайте
Вы не зарегистрированы.
Имя:

Пароль:

Запомнить

Регистрация позволит Вам пользоваться дополнительными сервисами.
Сейчас на сайте:
Гостей: 141
Пользователей: 0