SlideShare a Scribd company logo
Интеграция Zend Framework c JavaScript-фрэймворками jQuery и Dojo Toolkit Георгий   Туревич , ведущий веб-программист ,   Wizartech 27 марта 2010 г. Санкт-Петербург
Немного о себе Ведущий веб-программист компании Wizartech Более 7-и лет использования PHP и JavaScript Более 2-х лет использования Zend Framework Более 1-го года использования Dojo Toolkit (с момента заключения партнерства с Zend   Framework) и создания индивидуальных компонентов Активный участник  zendframework . ru – Zh0rzh
Возможности   Программная настройка окружения  Автоматизация работы с UI-компонентами Возможности кастомизации форм Работа с автокомплитом
Специфика  Dojo + ZF Генерация данных в стандартизированном формате (dojo.data)  Упрощение создания слоев   и профилей сборки для выпуска в эксплуатацию с помощью  Dojo Shrinksafe
ZF + Dojo Toolkit
Настройка окружения <style type=&quot;text/css&quot;>      @import &quot;/js/dojo-toolkit/dijit/themes/tundra/tundra.css&quot;; </style>  <script type=&quot;text/javascript&quot;>      var djConfig = {&quot;isDebug&quot;:true,&quot;parseOnLoad&quot;:true};  </script>  <script type=&quot;text/javascript&quot;       src=&quot;/js/dojo-toolkit/dojo/dojo.js&quot;></script>  <script type=&quot;text/javascript&quot;>      dojo.require(&quot;dojo.io.script&quot;);      dojo.require(&quot;dojo.fx&quot;);      dojo.require(&quot;dijit.form.Button&quot;);  </script>   Типичный код в  <head>  секции для настройки  Dojo :
Настройка окружения Настройка с помощью  dojo() view- хелпера Во время инициализации: <?=$this -> dojo ()   -> enable ()   -> setDjConfig (array(          'isDebug'  =>  true ,          'parseOnLoad'  =>  true      ))   -> setLocalPath ( '/js/dojo-toolkit/dojo/dojo.js' )   -> addStyleSheetModule ( 'dijit.themes.tundra' )   -> requireModule (array(          'dojo.io.script' ,          'dojo.fx' ,          'dijit.form.Button'      )) ?> Указываем в макете: Zend_Dojo :: enableView ( $view );
Настройка окружения Настройка с помощью плагина инициализации ресурса  Dojo  (  >= 1.10) В макете указываем: <?=$this -> dojo () ?> В  application.ini  указываем: resources.dojo.djConfig.isDebug = 1 resources.dojo.djConfig.parseOnLoad = 1 resources.dojo.localPath = &quot;/js/dojo-toolkit/dojo/dojo.js&quot; resources.dojo.requireModule[] = &quot;dojo.io.script&quot; resources.dojo.requireModule[] = &quot;dojo.fx&quot; resources.dojo.requireModule[] = &quot;dijit.form.Button&quot;
Настройка окружения Доступная функциональность  dojo() view- хелпера - Установка конфигурационных переменных - Установка подключаемых слоев -  Подключение компонентов  Dojo -  Установка связи между модулем и путем к папке - Установка и использование  cdn- версии Установка локальных путей - Добавление  javascript- кода для  onLoad  событий в секции  <head> - Добавление  javascript- кода   в секцию  <head> - Добавление произвольных файлов стилей Добавление файлов стилей согласно стандартам наименования компонентов  Dojo
Настройка окружения Доступные методы  dojo() view- хелпера enable() / disable() requireModule($module) registerModulePath($module, $path) addLayer($path) setCdnBase($url) setCdnVersion($version) setCdnDojoPath($path) useCdn() setLocalPath($path) useLocalPath() setDjConfig(array $config) setDjConfigOption($option, $value) addStylesheetModule($module) addStylesheet($path) addOnLoad($spec, $function = null) prependOnLoad($spec, $function = null) onLoadCaptureStart($obj = null)  /  onLoadCaptureEnd($obj = null) javascriptCaptureStart()  /  javascriptCaptureEnd()
Работа с виджетами View- хелперы В шаблоне: <h1>Форма</h1> <div class=&quot;tundra&quot;>   <form>    <?=$this -> editor ( 'editor' ) ?>    <?=$this -> button (        'send' ,  'Отправить ' ) ?>   </form> </div>
Работа с виджетами Элементы форм В контроллере: $form  = new  Zend_Dojo_Form (); $form -> addElement ( 'editor' ,  'editor' ); $form -> addElement (      'button' ,      'send' ,     array( 'label'  =>  'Отправить' ) ); $this -> view -> form  =  $form ;   В шаблоне: <h1>Форма</h1> <div class=&quot;tundra&quot;> <?=$this -> form?> </div>
Работа с виджетами Элементы форм Состав элементов:  - Button -  CheckBox -  ComboBox  /  FilteringSelect -  CurrencyTextBox -  DateTextBox -  HorizontalSlider  /  VerticalSlider -  MappedTextBox -  NumberSpinner -  NumberTextBox -  RadioButton -  SimpleTextarea -  Slider -  SubmitButton -  TextBox -  Textarea -  TimeTextBox -  ToggleButton -  ValidationTextBox
Работа с виджетами Виджеты компоновки Реализованы  view- хелперы и декораторы для форм, которые упрощают работу с виджетами компоновки: AccordionContainer AccordionPane BorderContainer ContentPane SplitContainer StackContainer TabContainer
Работа с виджетами Виджеты компоновки
Работа с виджетами Виджеты компоновки <div class=&quot;tundra&quot;> <? $this -> tabContainer ()-> captureStart ( 'masterLayout' , array(     'style'  =>  'width: 200px; height: 20em;' ))  ?>      <?=$this -> contentPane ( 'menuPane' ,  'This is first tab' , array(          'title'  =>  'tab 1'      )) ?>      <? $this -> contentPane ()-> captureStart ( 'navPane' , array(          'title'  =>  'tab 2' )     ) ?>         This<br>         is<br>         second<br>         tab      <?=$this -> contentPane ()-> captureEnd ( 'navPane' ); ?> <?=$this -> tabContainer ()-> captureEnd ( 'masterLayout' ) ?> </div>
Работа с виджетами Виджеты компоновки
Работа с виджетами Виджеты компоновки $form  = new  Zend_Dojo_Form (); $subForm1  = new  Zend_Dojo_Form (); $subForm2  = new  Zend_Dojo_Form (); $form -> addSubForm ( $subForm1 ,  'subform1' ); $form -> addSubForm ( $subForm2 ,  'subform2' ); $this -> view -> form  =  $form ; $form -> setDecorators (array(      'FormElements' ,     array( 'TabContainer' , array(          'id'  =>  'myTabs' ,          'style'  =>  'width: 300px; height: 20em'      )),      'Form' , ));   -  Формируем объекты формы и суб-форм -  Устанавливаем форме декоратор  TabContainer
Работа с виджетами Виджеты компоновки $subForm1 -> setDecorators (array(      'FormElements' ,     array( 'HtmlTag' , array( 'tag'  =>  'dl' )),     array( 'ContentPane' , array( 'title'  =>  'Tab 1' )) )); $subForm2 -> setDecorators (array(      'FormElements' ,     array( 'HtmlTag' , array( 'tag'  =>  'dl' )),     array( 'ContentPane' , array( 'title'  =>  'Tab 2' )) ));   -  Устанавливаем суб-формам декоратор  ContentPane
Работа с виджетами Виджеты компоновки $subForm1 -> addElement ( 'Editor' ,  'editor' , array(      ' label '   =>  ' Editor: ' , )); $subForm1 -> addElement ( 'DateTextBox' ,  'date' , array(      ' label '   =>  ' Date: ' ,  'style'  =>  'width: 200px' )); $subForm2 -> addElement ( 'FilteringSelect' ,  'acl' , array(      ' label '   =>  '   City: ' ,  'MultiOptions'  => array(          '1'  =>  'New York' ,  '2'  =>  'Berlin' ,          '3'  =>  'Bern' ,  '4'  =>  'Boston'      ) ));   -  Добавляем элементы в суб-формы
Ajax
Ajax В одном действии генерируем форму: public function  dojoDataExampleAction () {      $form  = new  Zend_Dojo_Form ();      $form -> addElement ( 'FilteringSelect' ,  'city' , array(          'label'  =>  'City' ,          'storeId'  =>  'cityStore' ,          'storeType'  =>  'dojo.data.ItemFileReadStore' ,          'storeParams'  => array(              'url'  =>  '/json/simple-city-store/'          ),          'dijitParams'  => array(              'searchAttr'  =>  'name'          )     ));      $this -> view -> form  =  $form ; }
Ajax Генерируем  JSON  классическим методом: public function  simpleCityStoreAction () {      Zend_Controller_Action_HelperBroker :: getStaticHelper ( 'ViewRenderer' ) -> setNoRender ( 1 );      Zend_Layout :: getMvcInstance ()-> disableLayout ();      $data  = array(         array( 'id'  =>  1 ,  'name'  =>  'Волгоград' ),         array( 'id'  =>  2 ,  'name'  =>  'Москва' ),         array( 'id'  =>  3 ,  'name'  =>  'Минск' ),         array( 'id'  =>  4 ,  'name'  =>  'Мурманск' )     );      $dojoData  = new  Zend_Dojo_Data ( 'id' ,  $data );     echo  $dojoData ; }
Ajax Генерируем  JSON  с применением помощника  AutoComplete : public function  simpleCityStoreAction () {      $data  = array(         array( 'id'  =>  1 ,  'name'  =>  'Волгоград' ),         array( 'id'  =>  2 ,  'name'  =>  'Москва' ),         array( 'id'  =>  3 ,  'name'  =>  'Минск' ),         array( 'id'  =>  4 ,  'name'  =>  'Мурманск' )     );      $this -> _helper -> autoCompleteDojo ( new  Zend_Dojo_Data ( 'id' ,  $data ),  true ); }   Что делает  AutoComplete : - автоматически деактивирует  Layout  и  ViewRender -  при необходимости трансформирует  array -> Zend_Dojo_Data -  записывает данные в  response- объект   и отправляет его пользователю - облегчает жизнь программисту :)
Ajax Отдаем данные в формате  dojo.data : { &quot;identifier&quot;:&quot;id&quot;, &quot;items&quot;:[ {&quot;id&quot;:1,&quot;name&quot;:&quot;Волгоград&quot;}, {&quot;id&quot;:2,&quot;name&quot;:&quot;Москва&quot;}, {&quot;id&quot;:3,&quot;name&quot;:&quot;Минск&quot;}, {&quot;id&quot;:4,&quot;name&quot;:&quot;Мурманск&quot;} ] }
Ajax Получаем результат:
Выпуск в эксплуатацию В пакете  Dojo Toolkit  поставляется утилита  ShrinkSafe   (Java), которая реализует следующие функции: Уменьшение количества HTTP-запросов Объедение файлов с классами, шаблонами, языковыми данными Уменьшение размера JavaScript-файлов Удаление комментариев и пробелов Сокращение наименований переменных CSS-оптимизация Объединение @import-файлов в один Удаление комментариев Опции StripConsole X-Domain-сборки (свой CDN)
Выпуск в эксплуатацию Для утилиты  ShrinkSafe  требуется 2 вида файлов: Слои сборки Определяет состав  js- компонентов, которые подготавливаются к эксплуатации Профили сборки Содержат конфигурацию действия по оптимизации Смотри подробнее:  http://docs.dojocampus.org/build/index
Выпуск в эксплуатацию Zend_Dojo_BuildLayer   автоматически генерирует содержание профиля и содержание слоя на основе данных из  view- хелпера  dojo() . $build  = new  Zend_Dojo_BuildLayer (array(      'view'  =>  $this -> view ,      'layerScriptPath'  =>  'custom.main.js' ,      'layerName'  =>  'custom.main' , )); $profile  =  $build -> generateBuildProfile (); $layerScript  =  $build -> generateLayerScript ();
Выпуск в эксплуатацию Слой сборки: dojo.provide(&quot;custom.main&quot;); (function(){ dojo.require(&quot;dojo.io.script&quot;); dojo.require(&quot;dojo.fx&quot;); dojo.require(&quot;dijit.form.Button&quot;); })();
Выпуск в эксплуатацию Профиль сборки: dependencies = { action:&quot;release&quot;, optimize:&quot;shrinksafe&quot;, layerOptimize:&quot;shrinksafe&quot;, copyTests:false, loader:&quot;default&quot;, cssOptimize:&quot;comments&quot;, releaseName:&quot;custom&quot;, layers:[{ name:&quot;custom.main.js&quot;, layerDependencies:[], dependencies:[&quot;custom.main&quot;] }], prefixes:[ [&quot;custom&quot;,&quot;../custom&quot;], [&quot;dojo&quot;,&quot;../dojo&quot;], [&quot;dijit&quot;,&quot;../dijit&quot;] ] };
Планы на будущее Расширенная поддержка  Dijit- компонентов http://framework.zend.com/wiki/display/ZFPROP/Zend_Dojo+-+Extended+Dijit+Support+-+Matthew+Weier+O%27Phinney dijit.ColorPalette dijit.Dialog dijit.Menu dijit.ProgressBar dijit.TitlePane dijit.Tooltip dijit.TooltipDialog dijit.Tree dijit.form.MultiSelect Поддержка  dojox.grid http://framework.zend.com/wiki/display/ZFPROP/Zend_Dojo+-+dojox.grid.DataGrid+Support+-+Matthew+Weier+O%27Phinney Ваши идеи?
ZF + jQuery
Настройка окружения Типичный код в  <head>  секции для настройки  jQuery : <link href=&quot;/jquery/css/ui-lightness/jquery-ui-1.8.custom.css&quot; type=&quot;text/css&quot; media=&quot;screen&quot; rel=&quot;stylesheet&quot;> <script type=&quot;text/javascript&quot;  src=&quot;/jquery/js/jquery-1.4.2.min.js&quot;></script> <script type=&quot;text/javascript&quot; src=&quot;/jquery/js/jquery-ui-1.8.custom.min.js&quot;></script>
Настройка окружения Настройка с помощью  jQuery() view- хелпера Во время инициализации: Указываем в макете: $view -> addHelperPath ( &quot;ZendX/JQuery/View/Helper&quot; ,  &quot;ZendX_JQuery_View_Helper &quot; );   $view -> jQuery ()      -> enable ()      -> setLocalPath ( '/jquery/js/jquery-1.4.2.min.js' )      -> addStylesheet ( '/jquery/css/ui-lightness/jquery-ui-1.8.custom.css' )      -> setUiLocalPath ( '/jquery/js/jquery-ui-1.8.custom.min.js' );
Настройка окружения Настройка с помощью плагина инициализации ресурса  jQuery В макете указываем: <?=$this -> jQuery () ?> В  application.ini  указываем: pluginPaths.ZendX_Application_Resource_ = &quot;ZendX/Application/Resource&quot; resources.jquery.localpath = &quot;/jquery/js/jquery-1.4.2.min.js&quot; resources.jquery.stylesheet = &quot;/jquery/…/jquery-ui-1.8.custom.css&quot; resources.jquery.uilocalpath = &quot;/jquery/js/jquery-ui-1.8.custom.min.js&quot;
Настройка окружения Доступная функциональность  jQuery() view- хелпера - Установка и использование  cdn- версий  jQuery  и  jQuery UI - Использование  ssl  с  cdn -  Установка локальных путей к  jQuery  и  jQuery UI - Добавление  javascript- кода для  onLoad  событий в секции  <head> - Добавление  javascript- файлов в секци  <head> - Добавление  javascript- кода   в секцию  <head> -  Добавление файлов стилей
Настройка окружения Методы  jQuery() view- хелпера setUiVersion() getUiVersion() useUiCdn() useUiLocal() setUiLocalPath() getUiLocalPath() onLoadCaptureStart() onLoadCaptureEnd() javascriptCaptureStart() javascriptCaptureEnd() addJavascriptFile($path) getJavascriptFiles() clearJavascriptFiles() addJavascript($statement) getJavascript() clearJavascript() addStylesheet($path) getStylesheets() addOnLoad($statement) getOnLoadActions() setRenderMode($mask) getRenderMode() setCdnSsl($bool)
Работа с виджетами View- хелперы
Работа с виджетами View- хелперы
Работа с виджетами Элементы форм $form  = new  ZendX_JQuery_Form ();   $subForm1  = new  ZendX_JQuery_Form ();  $subForm2  = new  ZendX_JQuery_Form ();  $form -> addSubForm ( $subForm1 ,  'subform1' );  $form -> addSubForm ( $subForm2 ,  'subform2' );  $form -> setDecorators (array(       'FormElements' , array( 'TabContainer' , array(           'id'  =>  'tabContainer' ,  'style'  =>  'width: 600px;'       )),       'Form' ,  ));  -  Формируем объекты формы и суб-форм -  Устанавливаем форме декоратор  TabContainer
Работа с виджетами Элементы форм $subForm1 -> setDecorators (array(       'FormElements' , array( 'HtmlTag' , array( 'tag'  =>  'dl' )),      array( 'TabPane' , array( 'jQueryParams'  => array(           'containerId'  =>  'mainForm' ,  'title'  =>  'DatePicker'       )))  ));  $subForm2 -> setDecorators (array(       'FormElements' ,      array( 'HtmlTag' , array( 'tag'  =>  'dl' )),      array( 'TabPane' , array( 'jQueryParams'  => array(           'containerId'  =>  'mainForm' ,           'title'  =>  'AutoComplete and Slider'       )))  ));  -  Устанавливаем суб-формам декоратор  TabPane
Работа с виджетами Элементы форм $subForm1 -> addElement ( 'DatePicker' ,  'datePicker1' , array(       &quot;label&quot;  =>  &quot;Date Picker:&quot; ,       'JQueryParam'  => array( 'dateFormat'  =>  'dd.mm.yy' )  ));  $subForm2 -> addElement ( 'Slider' ,  'slider1' , array(       &quot;label&quot;  =>  &quot;Slider:&quot; ,       'JQueryParams'  => array( 'defaultValue'  =>  '75' )  ));  $subForm2 -> addElement ( 'AutoComplete' ,  'acl' , array(       &quot;label&quot;  =>  &quot;Autocomplete:&quot; ,  'JQueryParams'  => array(           'source'  => array(               'New York' ,  'Berlin' ,  'Bern' ,  'Boston'           )      )  ));   -  Добавляем элементы в суб-формы
Работа с виджетами Элементы форм AutoComplete ( >= 1.8 ) ColorPicker ( 1.6 alpha? ) DatePicker Slider Spinner ( 1.6 alpha? ) Виджеты компоновки AccordionContainer Accordion Pane DialogContainer TabContainer TabPain AjaxLink
Планы на будущее Поддержка компонента  jqGrid  http://framework.zend.com/wiki/display/ZFPROP/ZendX_JQuery_Jqgrid+-+Jason+Lentink Ваши идеи???
Подробнее? Dojo Toolkit   http://dojotoolkit.org http://docs.dojocampus.org/ jQuery  и  jQuery UI http://jquery.com/ http://jqueryui.com/ Zend Framework http://framework.zend.com/manual/en/zend.dojo.html http://framework.zend.com/manual/en/zendx.jquery.html
Мастерклассы по  JavaScript В Питере! – в конце мая Ведущий: Илья Кантор Создатель ресурса:  javascript.ru В прошлом – один из разрабочиков  Dojo Toolkit Темы мастер-классов: Профессиональное программирование  JavaScript Сложный  Ajax  и  Comet Клиентская оптимизация Секреты  jQuery Подробнее:  http://javascript.ru/mk
Вопросы ? [email_address] http://twitter.com/georgyturevich Туревич Георгий, ведущий веб-программист  Wizartech

More Related Content

PPT
Ubercart -nemnogo_primerov_iz_zhizni
PDF
Написание DSL в Perl
PPT
PPTX
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
PPTX
Все дороги ведут в Checkout
ODP
Семинар-практикум по Drupal
PPT
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Ubercart -nemnogo_primerov_iz_zhizni
Написание DSL в Perl
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
Все дороги ведут в Checkout
Семинар-практикум по Drupal
Импорт данных с фреймворком Migrate. Владислав Богатырев.

What's hot (18)

PPTX
Индексирование в Magento
PPTX
Разработка на стероидах или как я перестал бояться и полюбил свою IDE
PDF
PPTX
DevHub 3 - Pricing
PPTX
чернобай т., гайдай ю.
PPT
Введение в Django
PPT
Js Http Request дмитрий котеров
KEY
Оформляем результаты проектирования
PDF
Арсений Форштретер: CSS-селекторы
PDF
Миша Рудрастых: Введение в HTTP API WordPress
PDF
10 - Web-технологии. MVC фреймворки (продолжение)
PPTX
Meet Magento Belarus debug Pavel Novitsky (rus)
PDF
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
PPTX
Render API.
PPTX
Построение индексов Redis
PDF
Rambler.iOS #8: Как не стать жертвой бэкендеров
KEY
Tequila - язык для продвинутой генерации JSON
PPTX
Web осень 2013 лекция 4
Индексирование в Magento
Разработка на стероидах или как я перестал бояться и полюбил свою IDE
DevHub 3 - Pricing
чернобай т., гайдай ю.
Введение в Django
Js Http Request дмитрий котеров
Оформляем результаты проектирования
Арсений Форштретер: CSS-селекторы
Миша Рудрастых: Введение в HTTP API WordPress
10 - Web-технологии. MVC фреймворки (продолжение)
Meet Magento Belarus debug Pavel Novitsky (rus)
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
Render API.
Построение индексов Redis
Rambler.iOS #8: Как не стать жертвой бэкендеров
Tequila - язык для продвинутой генерации JSON
Web осень 2013 лекция 4
Ad

Similar to ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Zend Framework (20)

PPT
Rich UI on Dojo Toolkit and Zend Framework
ODP
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
ODP
ZFConf 2010: Zend Framework and Doctrine
PPT
Yserver
PPT
ZFConf 2010: Zend Framework and Multilingual
PPTX
Реализация шаблонов корпоративных приложений в Magento
PPT
ненавязчивый Java Script алексей сергеев
PDF
Страх и ненависть в исходном коде
PPT
Zen Coding
PDF
Looking into WordPress Core, WordCamp Russia 2015
PPT
Интеграция Яндекс Сервер
PDF
DSLs в Perl
PPT
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
PDF
Почему Mojolicious?
PPT
Alexander manuhin selenium_php_v2.0
PPT
Take more from Jquery
PPT
Perl in practice
PPT
Net 3.0 & Linq
ODP
Saint Perl 2009: CGI::Ajax demo
Rich UI on Dojo Toolkit and Zend Framework
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
ZFConf 2010: Zend Framework and Doctrine
Yserver
ZFConf 2010: Zend Framework and Multilingual
Реализация шаблонов корпоративных приложений в Magento
ненавязчивый Java Script алексей сергеев
Страх и ненависть в исходном коде
Zen Coding
Looking into WordPress Core, WordCamp Russia 2015
Интеграция Яндекс Сервер
DSLs в Perl
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
Почему Mojolicious?
Alexander manuhin selenium_php_v2.0
Take more from Jquery
Perl in practice
Net 3.0 & Linq
Saint Perl 2009: CGI::Ajax demo
Ad

More from ZFConf Conference (20)

PPTX
ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)
PPT
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
PDF
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
PDF
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...
PPTX
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
PDF
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)
PDF
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
ODP
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
PPT
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
PPTX
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
PPTX
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
PPT
ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...
PDF
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
PPT
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
PPT
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
PPT
ZFConf 2010: History of e-Shtab.ru
PPTX
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
PPT
ZFConf 2010: Performance of Zend Framework Applications
PPT
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
PPT
ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)
ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2010: History of e-Shtab.ru
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
ZFConf 2010: Performance of Zend Framework Applications
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)

ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Zend Framework

  • 1. Интеграция Zend Framework c JavaScript-фрэймворками jQuery и Dojo Toolkit Георгий Туревич , ведущий веб-программист , Wizartech 27 марта 2010 г. Санкт-Петербург
  • 2. Немного о себе Ведущий веб-программист компании Wizartech Более 7-и лет использования PHP и JavaScript Более 2-х лет использования Zend Framework Более 1-го года использования Dojo Toolkit (с момента заключения партнерства с Zend Framework) и создания индивидуальных компонентов Активный участник zendframework . ru – Zh0rzh
  • 3. Возможности Программная настройка окружения Автоматизация работы с UI-компонентами Возможности кастомизации форм Работа с автокомплитом
  • 4. Специфика Dojo + ZF Генерация данных в стандартизированном формате (dojo.data) Упрощение создания слоев и профилей сборки для выпуска в эксплуатацию с помощью Dojo Shrinksafe
  • 5. ZF + Dojo Toolkit
  • 6. Настройка окружения <style type=&quot;text/css&quot;>     @import &quot;/js/dojo-toolkit/dijit/themes/tundra/tundra.css&quot;; </style> <script type=&quot;text/javascript&quot;>     var djConfig = {&quot;isDebug&quot;:true,&quot;parseOnLoad&quot;:true}; </script> <script type=&quot;text/javascript&quot;      src=&quot;/js/dojo-toolkit/dojo/dojo.js&quot;></script> <script type=&quot;text/javascript&quot;>     dojo.require(&quot;dojo.io.script&quot;);     dojo.require(&quot;dojo.fx&quot;);     dojo.require(&quot;dijit.form.Button&quot;); </script> Типичный код в <head> секции для настройки Dojo :
  • 7. Настройка окружения Настройка с помощью dojo() view- хелпера Во время инициализации: <?=$this -> dojo ()   -> enable ()   -> setDjConfig (array(          'isDebug'  =>  true ,          'parseOnLoad'  =>  true      ))   -> setLocalPath ( '/js/dojo-toolkit/dojo/dojo.js' )   -> addStyleSheetModule ( 'dijit.themes.tundra' )   -> requireModule (array(          'dojo.io.script' ,          'dojo.fx' ,          'dijit.form.Button'      )) ?> Указываем в макете: Zend_Dojo :: enableView ( $view );
  • 8. Настройка окружения Настройка с помощью плагина инициализации ресурса Dojo ( >= 1.10) В макете указываем: <?=$this -> dojo () ?> В application.ini указываем: resources.dojo.djConfig.isDebug = 1 resources.dojo.djConfig.parseOnLoad = 1 resources.dojo.localPath = &quot;/js/dojo-toolkit/dojo/dojo.js&quot; resources.dojo.requireModule[] = &quot;dojo.io.script&quot; resources.dojo.requireModule[] = &quot;dojo.fx&quot; resources.dojo.requireModule[] = &quot;dijit.form.Button&quot;
  • 9. Настройка окружения Доступная функциональность dojo() view- хелпера - Установка конфигурационных переменных - Установка подключаемых слоев - Подключение компонентов Dojo - Установка связи между модулем и путем к папке - Установка и использование cdn- версии Установка локальных путей - Добавление javascript- кода для onLoad событий в секции <head> - Добавление javascript- кода в секцию <head> - Добавление произвольных файлов стилей Добавление файлов стилей согласно стандартам наименования компонентов Dojo
  • 10. Настройка окружения Доступные методы dojo() view- хелпера enable() / disable() requireModule($module) registerModulePath($module, $path) addLayer($path) setCdnBase($url) setCdnVersion($version) setCdnDojoPath($path) useCdn() setLocalPath($path) useLocalPath() setDjConfig(array $config) setDjConfigOption($option, $value) addStylesheetModule($module) addStylesheet($path) addOnLoad($spec, $function = null) prependOnLoad($spec, $function = null) onLoadCaptureStart($obj = null) / onLoadCaptureEnd($obj = null) javascriptCaptureStart() / javascriptCaptureEnd()
  • 11. Работа с виджетами View- хелперы В шаблоне: <h1>Форма</h1> <div class=&quot;tundra&quot;>   <form>    <?=$this -> editor ( 'editor' ) ?>    <?=$this -> button (        'send' ,  'Отправить ' ) ?>   </form> </div>
  • 12. Работа с виджетами Элементы форм В контроллере: $form  = new  Zend_Dojo_Form (); $form -> addElement ( 'editor' ,  'editor' ); $form -> addElement (      'button' ,      'send' ,     array( 'label'  =>  'Отправить' ) ); $this -> view -> form  =  $form ; В шаблоне: <h1>Форма</h1> <div class=&quot;tundra&quot;> <?=$this -> form?> </div>
  • 13. Работа с виджетами Элементы форм Состав элементов: - Button - CheckBox - ComboBox / FilteringSelect - CurrencyTextBox - DateTextBox - HorizontalSlider / VerticalSlider - MappedTextBox - NumberSpinner - NumberTextBox - RadioButton - SimpleTextarea - Slider - SubmitButton - TextBox - Textarea - TimeTextBox - ToggleButton - ValidationTextBox
  • 14. Работа с виджетами Виджеты компоновки Реализованы view- хелперы и декораторы для форм, которые упрощают работу с виджетами компоновки: AccordionContainer AccordionPane BorderContainer ContentPane SplitContainer StackContainer TabContainer
  • 15. Работа с виджетами Виджеты компоновки
  • 16. Работа с виджетами Виджеты компоновки <div class=&quot;tundra&quot;> <? $this -> tabContainer ()-> captureStart ( 'masterLayout' , array(     'style'  =>  'width: 200px; height: 20em;' ))  ?>      <?=$this -> contentPane ( 'menuPane' ,  'This is first tab' , array(          'title'  =>  'tab 1'      )) ?>      <? $this -> contentPane ()-> captureStart ( 'navPane' , array(          'title'  =>  'tab 2' )     ) ?>         This<br>         is<br>         second<br>         tab      <?=$this -> contentPane ()-> captureEnd ( 'navPane' ); ?> <?=$this -> tabContainer ()-> captureEnd ( 'masterLayout' ) ?> </div>
  • 17. Работа с виджетами Виджеты компоновки
  • 18. Работа с виджетами Виджеты компоновки $form  = new  Zend_Dojo_Form (); $subForm1  = new  Zend_Dojo_Form (); $subForm2  = new  Zend_Dojo_Form (); $form -> addSubForm ( $subForm1 ,  'subform1' ); $form -> addSubForm ( $subForm2 ,  'subform2' ); $this -> view -> form  =  $form ; $form -> setDecorators (array(      'FormElements' ,     array( 'TabContainer' , array(          'id'  =>  'myTabs' ,          'style'  =>  'width: 300px; height: 20em'      )),      'Form' , )); - Формируем объекты формы и суб-форм - Устанавливаем форме декоратор TabContainer
  • 19. Работа с виджетами Виджеты компоновки $subForm1 -> setDecorators (array(      'FormElements' ,     array( 'HtmlTag' , array( 'tag'  =>  'dl' )),     array( 'ContentPane' , array( 'title'  =>  'Tab 1' )) )); $subForm2 -> setDecorators (array(      'FormElements' ,     array( 'HtmlTag' , array( 'tag'  =>  'dl' )),     array( 'ContentPane' , array( 'title'  =>  'Tab 2' )) )); - Устанавливаем суб-формам декоратор ContentPane
  • 20. Работа с виджетами Виджеты компоновки $subForm1 -> addElement ( 'Editor' ,  'editor' , array(      ' label '   =>  ' Editor: ' , )); $subForm1 -> addElement ( 'DateTextBox' ,  'date' , array(      ' label '   =>  ' Date: ' ,  'style'  =>  'width: 200px' )); $subForm2 -> addElement ( 'FilteringSelect' ,  'acl' , array(      ' label '   =>  ' City: ' ,  'MultiOptions'  => array(          '1'  =>  'New York' ,  '2'  =>  'Berlin' ,          '3'  =>  'Bern' ,  '4'  =>  'Boston'      ) )); - Добавляем элементы в суб-формы
  • 21. Ajax
  • 22. Ajax В одном действии генерируем форму: public function  dojoDataExampleAction () {      $form  = new  Zend_Dojo_Form ();      $form -> addElement ( 'FilteringSelect' ,  'city' , array(          'label'  =>  'City' ,          'storeId'  =>  'cityStore' ,          'storeType'  =>  'dojo.data.ItemFileReadStore' ,          'storeParams'  => array(              'url'  =>  '/json/simple-city-store/'          ),          'dijitParams'  => array(              'searchAttr'  =>  'name'          )     ));      $this -> view -> form  =  $form ; }
  • 23. Ajax Генерируем JSON классическим методом: public function  simpleCityStoreAction () {      Zend_Controller_Action_HelperBroker :: getStaticHelper ( 'ViewRenderer' ) -> setNoRender ( 1 );      Zend_Layout :: getMvcInstance ()-> disableLayout ();      $data  = array(         array( 'id'  =>  1 ,  'name'  =>  'Волгоград' ),         array( 'id'  =>  2 ,  'name'  =>  'Москва' ),         array( 'id'  =>  3 ,  'name'  =>  'Минск' ),         array( 'id'  =>  4 ,  'name'  =>  'Мурманск' )     );      $dojoData  = new  Zend_Dojo_Data ( 'id' ,  $data );     echo  $dojoData ; }
  • 24. Ajax Генерируем JSON с применением помощника AutoComplete : public function  simpleCityStoreAction () {      $data  = array(         array( 'id'  =>  1 ,  'name'  =>  'Волгоград' ),         array( 'id'  =>  2 ,  'name'  =>  'Москва' ),         array( 'id'  =>  3 ,  'name'  =>  'Минск' ),         array( 'id'  =>  4 ,  'name'  =>  'Мурманск' )     );      $this -> _helper -> autoCompleteDojo ( new  Zend_Dojo_Data ( 'id' ,  $data ),  true ); } Что делает AutoComplete : - автоматически деактивирует Layout и ViewRender - при необходимости трансформирует array -> Zend_Dojo_Data - записывает данные в response- объект и отправляет его пользователю - облегчает жизнь программисту :)
  • 25. Ajax Отдаем данные в формате dojo.data : { &quot;identifier&quot;:&quot;id&quot;, &quot;items&quot;:[ {&quot;id&quot;:1,&quot;name&quot;:&quot;Волгоград&quot;}, {&quot;id&quot;:2,&quot;name&quot;:&quot;Москва&quot;}, {&quot;id&quot;:3,&quot;name&quot;:&quot;Минск&quot;}, {&quot;id&quot;:4,&quot;name&quot;:&quot;Мурманск&quot;} ] }
  • 27. Выпуск в эксплуатацию В пакете Dojo Toolkit поставляется утилита ShrinkSafe (Java), которая реализует следующие функции: Уменьшение количества HTTP-запросов Объедение файлов с классами, шаблонами, языковыми данными Уменьшение размера JavaScript-файлов Удаление комментариев и пробелов Сокращение наименований переменных CSS-оптимизация Объединение @import-файлов в один Удаление комментариев Опции StripConsole X-Domain-сборки (свой CDN)
  • 28. Выпуск в эксплуатацию Для утилиты ShrinkSafe требуется 2 вида файлов: Слои сборки Определяет состав js- компонентов, которые подготавливаются к эксплуатации Профили сборки Содержат конфигурацию действия по оптимизации Смотри подробнее: http://docs.dojocampus.org/build/index
  • 29. Выпуск в эксплуатацию Zend_Dojo_BuildLayer автоматически генерирует содержание профиля и содержание слоя на основе данных из view- хелпера dojo() . $build  = new  Zend_Dojo_BuildLayer (array(      'view'  =>  $this -> view ,      'layerScriptPath'  =>  'custom.main.js' ,      'layerName'  =>  'custom.main' , )); $profile  =  $build -> generateBuildProfile (); $layerScript  =  $build -> generateLayerScript ();
  • 30. Выпуск в эксплуатацию Слой сборки: dojo.provide(&quot;custom.main&quot;); (function(){ dojo.require(&quot;dojo.io.script&quot;); dojo.require(&quot;dojo.fx&quot;); dojo.require(&quot;dijit.form.Button&quot;); })();
  • 31. Выпуск в эксплуатацию Профиль сборки: dependencies = { action:&quot;release&quot;, optimize:&quot;shrinksafe&quot;, layerOptimize:&quot;shrinksafe&quot;, copyTests:false, loader:&quot;default&quot;, cssOptimize:&quot;comments&quot;, releaseName:&quot;custom&quot;, layers:[{ name:&quot;custom.main.js&quot;, layerDependencies:[], dependencies:[&quot;custom.main&quot;] }], prefixes:[ [&quot;custom&quot;,&quot;../custom&quot;], [&quot;dojo&quot;,&quot;../dojo&quot;], [&quot;dijit&quot;,&quot;../dijit&quot;] ] };
  • 32. Планы на будущее Расширенная поддержка Dijit- компонентов http://framework.zend.com/wiki/display/ZFPROP/Zend_Dojo+-+Extended+Dijit+Support+-+Matthew+Weier+O%27Phinney dijit.ColorPalette dijit.Dialog dijit.Menu dijit.ProgressBar dijit.TitlePane dijit.Tooltip dijit.TooltipDialog dijit.Tree dijit.form.MultiSelect Поддержка dojox.grid http://framework.zend.com/wiki/display/ZFPROP/Zend_Dojo+-+dojox.grid.DataGrid+Support+-+Matthew+Weier+O%27Phinney Ваши идеи?
  • 34. Настройка окружения Типичный код в <head> секции для настройки jQuery : <link href=&quot;/jquery/css/ui-lightness/jquery-ui-1.8.custom.css&quot; type=&quot;text/css&quot; media=&quot;screen&quot; rel=&quot;stylesheet&quot;> <script type=&quot;text/javascript&quot; src=&quot;/jquery/js/jquery-1.4.2.min.js&quot;></script> <script type=&quot;text/javascript&quot; src=&quot;/jquery/js/jquery-ui-1.8.custom.min.js&quot;></script>
  • 35. Настройка окружения Настройка с помощью jQuery() view- хелпера Во время инициализации: Указываем в макете: $view -> addHelperPath ( &quot;ZendX/JQuery/View/Helper&quot; ,  &quot;ZendX_JQuery_View_Helper &quot; ); $view -> jQuery ()     -> enable ()     -> setLocalPath ( '/jquery/js/jquery-1.4.2.min.js' )     -> addStylesheet ( '/jquery/css/ui-lightness/jquery-ui-1.8.custom.css' )     -> setUiLocalPath ( '/jquery/js/jquery-ui-1.8.custom.min.js' );
  • 36. Настройка окружения Настройка с помощью плагина инициализации ресурса jQuery В макете указываем: <?=$this -> jQuery () ?> В application.ini указываем: pluginPaths.ZendX_Application_Resource_ = &quot;ZendX/Application/Resource&quot; resources.jquery.localpath = &quot;/jquery/js/jquery-1.4.2.min.js&quot; resources.jquery.stylesheet = &quot;/jquery/…/jquery-ui-1.8.custom.css&quot; resources.jquery.uilocalpath = &quot;/jquery/js/jquery-ui-1.8.custom.min.js&quot;
  • 37. Настройка окружения Доступная функциональность jQuery() view- хелпера - Установка и использование cdn- версий jQuery и jQuery UI - Использование ssl с cdn - Установка локальных путей к jQuery и jQuery UI - Добавление javascript- кода для onLoad событий в секции <head> - Добавление javascript- файлов в секци <head> - Добавление javascript- кода в секцию <head> - Добавление файлов стилей
  • 38. Настройка окружения Методы jQuery() view- хелпера setUiVersion() getUiVersion() useUiCdn() useUiLocal() setUiLocalPath() getUiLocalPath() onLoadCaptureStart() onLoadCaptureEnd() javascriptCaptureStart() javascriptCaptureEnd() addJavascriptFile($path) getJavascriptFiles() clearJavascriptFiles() addJavascript($statement) getJavascript() clearJavascript() addStylesheet($path) getStylesheets() addOnLoad($statement) getOnLoadActions() setRenderMode($mask) getRenderMode() setCdnSsl($bool)
  • 39. Работа с виджетами View- хелперы
  • 40. Работа с виджетами View- хелперы
  • 41. Работа с виджетами Элементы форм $form  = new  ZendX_JQuery_Form (); $subForm1  = new  ZendX_JQuery_Form (); $subForm2  = new  ZendX_JQuery_Form (); $form -> addSubForm ( $subForm1 ,  'subform1' ); $form -> addSubForm ( $subForm2 ,  'subform2' ); $form -> setDecorators (array(      'FormElements' , array( 'TabContainer' , array(          'id'  =>  'tabContainer' ,  'style'  =>  'width: 600px;'      )),      'Form' , )); - Формируем объекты формы и суб-форм - Устанавливаем форме декоратор TabContainer
  • 42. Работа с виджетами Элементы форм $subForm1 -> setDecorators (array(      'FormElements' , array( 'HtmlTag' , array( 'tag'  =>  'dl' )),     array( 'TabPane' , array( 'jQueryParams'  => array(          'containerId'  =>  'mainForm' ,  'title'  =>  'DatePicker'      ))) )); $subForm2 -> setDecorators (array(      'FormElements' ,     array( 'HtmlTag' , array( 'tag'  =>  'dl' )),     array( 'TabPane' , array( 'jQueryParams'  => array(          'containerId'  =>  'mainForm' ,          'title'  =>  'AutoComplete and Slider'      ))) )); - Устанавливаем суб-формам декоратор TabPane
  • 43. Работа с виджетами Элементы форм $subForm1 -> addElement ( 'DatePicker' ,  'datePicker1' , array(      &quot;label&quot;  =>  &quot;Date Picker:&quot; ,      'JQueryParam'  => array( 'dateFormat'  =>  'dd.mm.yy' ) )); $subForm2 -> addElement ( 'Slider' ,  'slider1' , array(      &quot;label&quot;  =>  &quot;Slider:&quot; ,      'JQueryParams'  => array( 'defaultValue'  =>  '75' ) )); $subForm2 -> addElement ( 'AutoComplete' ,  'acl' , array(      &quot;label&quot;  =>  &quot;Autocomplete:&quot; ,  'JQueryParams'  => array(          'source'  => array(              'New York' ,  'Berlin' ,  'Bern' ,  'Boston'          )     ) )); - Добавляем элементы в суб-формы
  • 44. Работа с виджетами Элементы форм AutoComplete ( >= 1.8 ) ColorPicker ( 1.6 alpha? ) DatePicker Slider Spinner ( 1.6 alpha? ) Виджеты компоновки AccordionContainer Accordion Pane DialogContainer TabContainer TabPain AjaxLink
  • 45. Планы на будущее Поддержка компонента jqGrid http://framework.zend.com/wiki/display/ZFPROP/ZendX_JQuery_Jqgrid+-+Jason+Lentink Ваши идеи???
  • 46. Подробнее? Dojo Toolkit http://dojotoolkit.org http://docs.dojocampus.org/ jQuery и jQuery UI http://jquery.com/ http://jqueryui.com/ Zend Framework http://framework.zend.com/manual/en/zend.dojo.html http://framework.zend.com/manual/en/zendx.jquery.html
  • 47. Мастерклассы по JavaScript В Питере! – в конце мая Ведущий: Илья Кантор Создатель ресурса: javascript.ru В прошлом – один из разрабочиков Dojo Toolkit Темы мастер-классов: Профессиональное программирование JavaScript Сложный Ajax и Comet Клиентская оптимизация Секреты jQuery Подробнее: http://javascript.ru/mk
  • 48. Вопросы ? [email_address] http://twitter.com/georgyturevich Туревич Георгий, ведущий веб-программист Wizartech