<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>extjs &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://wordpress.com/tag/extjs/</link>
	<description>Feed of posts on WordPress.com tagged "extjs"</description>
	<pubDate>Sat, 11 Oct 2008 04:25:42 +0000</pubDate>

	<generator>http://wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Структура библиотеки ExtJS]]></title>
<link>http://techworkru.wordpress.com/?p=554</link>
<pubDate>Mon, 06 Oct 2008 06:38:35 +0000</pubDate>
<dc:creator>techworkru</dc:creator>
<guid>http://techwork.ru/2008/10/06/extjs-structure/</guid>
<description><![CDATA[Для начала работы над любым проектом нам нужно скачать]]></description>
<content:encoded><![CDATA[<p class="GX">Для начала работы над любым проектом нам нужно скачать код библиотеки ExtJS. В данном примере мы используем полный ExtJS SDK версии 2.2, который доступен для загрузки на официальном сайте (<a href="http://extjs.com/">http://extjs.com/</a>). Там же имеется возможность воспользоваться специальным конструктором “Build-Your-Own”, который соберет кастомизированный вариант с учетом требуемых разработчику компонентов. Мы не будем приводить здесь полный список доступных "кубиков", из которых собирается библиотека, только отметим, что единственным обязательным компонентом является "Ext Core". В результате использования конструктора будет создан один файл, содержащий весь необходимый код.</p>
<p class="GX">Полный комплект среды разработки ExtJS SDK поставляется с документацией, набором рабочих примеров, ресурсами библиотеки (картинки, файлы стилей CSS, темы) и дополнительными адаптерами для работы со сторонними библиотеками, а также полными исходными кодами самого проекта (с комментариями) и несколько вариантов файлов для использования в работе:</p>
<ul type="disc">
<li>
<p class="LIST_BULLET">ext-all.css – сжатая версия всех CSS файлов со стилями</p>
</li>
<li>
<p class="LIST_BULLET">ext-all.js – сжатая версия всех компонентов библиотеки</p>
</li>
<li>
<p class="LIST_BULLET">ext-all-debug.js – все компоненты библиотеки без комментариев (код доступен для просмотра и отладки)</p>
</li>
<li>
<p class="LIST_BULLET">ext-core.js – сжатая версия ядра библиотеки</p>
</li>
<li>
<p class="LIST_BULLET">ext-core-debug.js – основные компоненты без комментариев (код доступен для просмотра и отладки)</p>
</li>
</ul>
<p class="GX">Файлы стилей, используемые в библиотеке ExtJS, расположены в следующих подкаталогах:</p>
<p class="FC"><a href="http://techworkru.files.wordpress.com/2008/10/extjs-folders.jpg"><img class="alignnone size-full wp-image-561" title="Структура каталогов" src="http://techworkru.wordpress.com/files/2008/10/extjs-folders.jpg" alt="" width="105" height="105" /></a></p>
<p class="GX">Каталог <span style="font-family:'Courier New',monospace;">images</span> содержит подкаталоги с элементами тем оформления для визуальных компонентов Ext JS.  Создание новой темы напоминает создание нового файла со стилями CSS (в каталоге <span style="font-family:'Courier New',monospace;">CSS</span>).  Если необходимо, чтобы существующие изображения были перекрыты, создайте новый подкаталог в каталоге <span style="font-family:'Courier New',monospace;">images</span> и поместите в него новые изображения. К сожалению, процесс создания собственных тем оформления выходит за рамки этой книги, однако вы можете воспользоваться темой “gray” из Ext JS SDK в качестве учебного примера.</p>
<p class="GX">В поставку SDK входит файл <span style="font-family:'Courier New',monospace;">INCLUDE_ORDER.txt,</span> описывающий какие из файлов должны быть подключены к вашему проекту, в зависимости от выбранного для работы адаптера. Для примера, если мы будем использовать стандартное ядро библиотеки, то должны подключить три файла:</p>
<p class="CODE_W_SCREEN">&#60;link type="text/css" rel="stylesheet" href="css/ext-all.css" /&#62;</p>
<p class="CODE_W_SCREEN">&#60;script type="text/javascript" src="scripts/ext-base.js"&#62;&#60;/script&#62;</p>
<p class="CODE_W_SCREEN">&#60;script type="text/javascript" src="scripts/ext-all.js"&#62;&#60;/script&#62;</p>
<p class="GX">Эти три строчки достаточно для работы всех компонентов ExtJS, однако в процессе изучения библиотеки мы рассмотрим некоторые дополнительные аспекты ее работы.</p>
<h3>Соглашения об именах</h3>
<p class="GX">При создании библиотеки ExtJS был выработан определенный стиль кодирования и соглашения об именах объектов. Это позволяет разработчику довольно просто начать ее изучение. Давайте рассмотрим основные из них:</p>
<ul type="disc">
<li>
<p class="LIST_BULLET">Имена классов начинаются с заглавных букв (GridPanel, Observable и так далее).</p>
</li>
<li>
<p class="LIST_BULLET">Имена событий состоят из строчных букв (click, dblclick и так далее).</p>
</li>
<li>
<p class="LIST_BULLET">Контанты полностью указаны в верхнем регистре (DAY, HOUR и так далее).</p>
</li>
<li>
<p class="LIST_BULLET">Все прочие идентификаторы имеют смешанный регистр (ext, doSomething, myValue и так далее).</p>
</li>
</ul>
<p class="GX">Если вы взглянете на исходный код ExtJS, то заметите следующие особенности:</p>
<ul type="disc">
<li>
<p class="LIST_BULLET">Открывающие фигурные скобки указываются в конце строки.</p>
</li>
<li>
<p class="LIST_BULLET">Блоки кода указываются явно.</p>
</li>
</ul>
<pre>if (condition) code(); // не приветствуется</pre>
<pre>if (condition) { // предпочтительный вариант
  code();
}</pre>
<p><strong>Продолжение следует...</strong></p>
<p><strong>Перейти к </strong><strong><a title="Библиотека ExtJS для новичков" rel="bookmark" href="http://techwork.ru/extjs-book/">содержанию Учебника по ExtJS</a></strong></p>
<p><strong>Мы помогли Вам? Вы можете <a href="http://techwork.ru/extjs-book/donate/">поддержать дальнейшее создание учебника по ExtJS</a>.</strong></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Расширенная работа с панелями: Библиотека ExtJS для новичков]]></title>
<link>http://techworkru.wordpress.com/?p=536</link>
<pubDate>Fri, 03 Oct 2008 07:58:23 +0000</pubDate>
<dc:creator>techworkru</dc:creator>
<guid>http://techwork.ru/2008/10/03/extjs-advanced-panels/</guid>
<description><![CDATA[Эта статья является продолжением учебника по библиоте]]></description>
<content:encoded><![CDATA[<p>Эта статья является продолжением <a href="http://techwork.ru/extjs-book/">учебника по библиотеке компонентов <strong>ExtJS</strong></a>, используемой для создания web-приложений с функциональным интерфейсом пользователя.</p>
<p>Как ранее упоминалось при рассмотрении компонента панель - это контейнер для других визуальных компонентов. Пробуем продемонстрировать это, создав две простые панели, одна из которых будет привязываться к окну браузера, а другая пока не будет отображаться:</p>
<pre>panel1 = new Ext.Panel({
  title: 'Внешняя панель',
  collapsible: true,
  renderTo: Ext.getBody(),
  html: 'Содержимое внешней панели'
});

panel2 = new Ext.Panel({
  title: 'Внутреняя панель',
  collapsible: true,
  html: 'Содержимое внутренней панели'
});</pre>
<p>По пути мы осваиваем еще одно свойство конфигурации панели - <strong>collapsible</strong>, которое определяет, отрисовывать или нет (true или false) кнопку сворачивания панели в ее заголовке. Для некоторых применений это удобный метод организации информации на экране для сайтов, позволяющих пользователям самим выбирать отображение только актуальных для них данных. Дополнительно с помощью другого свойства <strong>titleCollapse</strong> можно задать сворачиваемость панели по щелку на ее заголовке.</p>
<p>Далее выполним две магические команды:</p>
<pre>panel1.add(panel2)
panel1.doLayout()</pre>
<p>Первая выполняет метод add панели-контейнера, добавляя в нее дочерние компоненты (в данном случае дочернюю панель). Обратите внимание, что если бы мы имели несколько панелей, их можно было подключить к родительской за один раз, передав их в параметрах метода add: <strong>panel1.add(panel2, panel3, panel4...)</strong></p>
<p>Вторая команда сообщает системе отрисовки компонентов выполнить рендер вновь добавленных элементов:</p>
<p><a href="http://techworkru.files.wordpress.com/2008/10/cpanels1.png"><img class="aligncenter size-large wp-image-544" title="Вложенная панель" src="http://techworkru.wordpress.com/files/2008/10/cpanels1.png?w=620" alt="" width="620" height="409" /></a></p>
<p>Существует обратное действие - удаление дочернего компонента из панели:</p>
<p><!--more--></p>
<p>panel1.remove(panel2)</p>
<p>В этом случае после него вызывать doLayout() не требуется, так как основная панель будет перерисована автоматически.</p>
<p>Метод add замечателен тем, что кроме нового дочернего объекта в параметрах может также принимать только саму конфигурацию дочернего объекта и, основываясь на этих данных, динамически создавать новый компонент. Такой подход называется <strong>ленивым определением</strong>.</p>
<p>Для того чтобы точно знать, какой в этом случае тип компонента создается, необходимо передать в его конфигурации дополнительный параметр <strong>xtype</strong>. Считайте его внутренним идентификатором определенного вида компонентов. Для ранее рассмотренных нами Panel и Button значениями xtype соответственно являются 'panel' и 'button'. Список всех доступных значений xtype можно получить в Приложении А.</p>
<p>В следующем примере мы добавим к внешней панели еще одну дочернюю, задав ее с помощью ленивого определения:</p>
<pre>panel1.add({
  xtype: 'panel',
  title: 'Ленивая панель',
  collapsible: true,
  html: 'Содержимое ленивой панели'});
panel1.doLayout()</pre>
<p><a href="http://techworkru.files.wordpress.com/2008/10/cpanels2.png"><img class="aligncenter size-large wp-image-545" title="Ленивая панель" src="http://techworkru.wordpress.com/files/2008/10/cpanels2.png?w=620" alt="" width="620" height="409" /></a></p>
<p>Выше мы рассмотрели динамическое добавление дочерних элементов к панели, но том случае, если на этапе создания базовой панели уже известны ее составляющие, можно все компоненты указать в параметре <strong>items</strong></p>
<p>Обычное определение:</p>
<pre>panel1 = new Ext.Panel({
  title: 'Внешняя панель',
  collapsible: true,
  renderTo: Ext.getBody(),
  html: 'Содержимое внешней панели',
  items: [
   {
      new Ext.Panel({
        title: 'Внутреняя панель',
        collapsible: true,
        html: 'Содержимое внутренней панели'
      })
   }
  ]
});</pre>
<p>Ленивое определение:</p>
<pre>panel1 = new Ext.Panel({
  title: 'Внешняя панель',
  collapsible: true,
  renderTo: Ext.getBody(),
  html: 'Содержимое внешней панели',
  items: [
   {
     xtype: 'panel',
     title: 'Внутреняя панель',
     collapsible: true,
     html: 'Содержимое внутренней панели'
   }
  ]
});</pre>
<p>Обратите внимание, что в свойстве items мы использовали индексный массив, который позволяет задавать сразу несколько дочерних элементов. При определении только одного элемента для удобства квадратные скобки можно опустить.</p>
<p>Использовать ленивое определение компонентов рекомендуется во всех случаях, когда это возможно. Во-первых, уменьшается количество операций по отрисовке компонентов, позволяя провести их за один раз - при создании родительского. Во-вторых, это гарантирует потребление меньших объемов памяти и системных ресурсов из-за сокращения числа используемых объектов. Кроме того, если родительская панель вообще не будет отображена (например, находится на другом табе, который пользователь не нажмет при просмотре страницы), дочерние элементы так и не будут созданы, а следовательно на эти операции не будут потрачены ресурсы.</p>
<p>Продемонстрируем как свойство items может содержать несколько элементов разных типов:</p>
<pre>panel1 = new Ext.Panel({
  title: 'Внешняя панель',
  collapsible: true,
  renderTo: Ext.getBody(),
  html: 'Содержимое внешней панели',
  items: [
   {
     xtype: 'panel',
     title: 'Внутреняя панель',
     collapsible: true,
     html: 'Содержимое внутренней панели'
   }, {
     xtype: 'button',
     text: 'Кнопка 1',
   }, {
     xtype: 'button',
     text: 'Кнопка 2',
   }
  ]
});

<a href="http://techworkru.files.wordpress.com/2008/10/cpanels3.png"><img class="aligncenter size-large wp-image-546" title="Множество дочерних элементов в панели" src="http://techworkru.wordpress.com/files/2008/10/cpanels3.png?w=620" alt="" width="620" height="409" /></a></pre>
<p>Неуказание xtype при ленивом определении компонента не является ошибкой: библиотека воспользуется типом компонента по-умолчанию (в случае панели и большинства других визуальных компонентов их дочерние элементы также будут панелями). Если вы хотите изменить тип дочерних элементов по-умолчанию, воспользуйтесь свойством конфигурации              <strong>defaultType.</strong></p>
<p>Удалять дочерние элементы, указанные в случае ленивого определения, можно через определение их идентификаторов (<strong>id</strong>):</p>
<pre>panel1 = new Ext.Panel({
  title: 'Внешняя панель',
  collapsible: true,
  renderTo: Ext.getBody(),
  html: 'Содержимое внешней панели',
  items: [
   {
     xtype: 'panel',
     id: 'panel2',
     title: 'Внутреняя панель',
     collapsible: true,
     html: 'Содержимое внутренней панели'
   }
  ]
});
panel1.remove(Ext.getCmp('panel2'));</pre>
<p>Если все элементы панели должны иметь ряд свойств с одинаковыми значениями, в конфигурации можно определить свойство              <strong>defaults</strong> и в нем задать требуемые параметры.</p>
<p>Существуют так называемые плавающие панели, которые имеют четко заданные координаты относительно страницы документа. В этом случае необходимо определить размеры компонента (свойства <strong>width</strong> и <strong>height</strong> в конфигурации), признак плавающей панели (свойство <strong>floating</strong> = true), после чего задать ее абсолютные координаты методом <strong>setPosition(X, Y)</strong>:</p>
<pre>panel = new Ext.Panel({
  title: 'Плавающая панель',
  floating: true,
  width: 300,
  height: 150,
  renderTo: Ext.getBody(),
  html: 'Какое-то важное сообщение'
});
panel.setPosition(100, 200);

<a href="http://techworkru.files.wordpress.com/2008/10/cpanels4.png"><img class="aligncenter size-large wp-image-547" title="Плавающая панель" src="http://techworkru.wordpress.com/files/2008/10/cpanels4.png?w=620" alt="" width="620" height="409" /></a></pre>
<p>По умолчанию у плавающей панели отрисовывается тень, которая визуально как бы приподнимает ее над другими элементами документа. Необходимость отрисовки тени и способ определяется свойством конфигурации <strong>shadow</strong>.</p>
<p>Панели могут быть довольно сложными и содержать кроме дочерних элементов верхний и нижний тулбар и нижние внешние кнопки:</p>
<pre>new Ext.Panel({
 title: 'Сложная панель',
 renderTo: Ext.getBody(),
 html: 'HTML-код',
 tbar: [
   { text: 'Верхняя кнопка 1' },
   { text: 'Верхняя кнопка 2' }
  ],
 bbar: [
   { text: 'Нижняя кнопка 1' },
   { text: 'Нижняя кнопка 2' }
  ],
 buttons: [
     { text: 'Кнопка 1' },
     { text: 'Кнопка 2' }
   ],
 items: [
    { title: 'Панель 1', html: 'Панель 1' },
    { title: 'Панель 2', html: 'Панель 2' }
  ]
})

<a href="http://techworkru.files.wordpress.com/2008/10/cpanels5.png"><img class="aligncenter size-large wp-image-548" title="Сложная панель" src="http://techworkru.wordpress.com/files/2008/10/cpanels5.png?w=620" alt="" width="620" height="433" /></a></pre>
<p>Что еще можно делать с панелями?</p>
<ol>
<li>Панель может иметь заголовок (свойство <strong>title</strong> в конфигурации), а может не иметь его. В этом случае компонент становится обычным контейнером других компонентов.</li>
<li>Конечные размеры панели как и многих визуальных компонентов задаются свойствами <strong>height</strong> и <strong>width</strong> в конфигурации (либо <em>auto</em> по-умолчанию, либо числовые значения в пискелах)</li>
<li>С помощью свойства <strong>autoLoad</strong> можно задать URL, с которого будет выполняться загрузка тела панели с помощью внутреннего AJAX запроса. Точно такое же действие можно выполнить в любой момент после создания панели с помощью метода <strong>load</strong>. Существует ограничение, связанное с системой безопасности браузеров, которое не позволяет использовать разные серверы для основной страницы и запроса к подгружаемому содержимому.</li>
<li>Если содержимое тела панели не вмещается в заданную область, можно задать автоматическую активацию полос прокрутки при необходимости (свойство              <strong>autoScroll</strong> в конфигурации компонента).</li>
<li>Можно управлять отображением рамок панели (свойства <strong>bodyBorder</strong>, <strong>border, </strong> <strong>hideBorders</strong><strong> </strong>и<strong> frame</strong> в конфигурации компонента).</li>
<li>Выравнивание кнопок панели может быть правым (по-умолчанию), левым или по центру (свойство              <strong>buttonAlign</strong> в конфигурации компонента).</li>
<li>Панель при начальном отображении на эране может быть в уже свернутом режиме (свойство <strong>collapsed</strong> в конфигурации компонента)</li>
</ol>
<p><strong>Продолжение следует...</strong></p>
<p><strong>Перейти к </strong><strong><a title="Библиотека ExtJS для новичков" rel="bookmark" href="http://techwork.ru/extjs-book/">содержанию Учебника по ExtJS</a></strong></p>
<p><strong>Мы помогли Вам? Вы можете <a href="http://techwork.ru/extjs-book/donate/">поддержать дальнейшее создание учебника по ExtJS</a>.</strong></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Кнопки: Библиотека ExtJS для новичков]]></title>
<link>http://techworkru.wordpress.com/?p=517</link>
<pubDate>Wed, 01 Oct 2008 12:23:21 +0000</pubDate>
<dc:creator>techworkru</dc:creator>
<guid>http://techwork.ru/2008/10/01/extjs-buttons/</guid>
<description><![CDATA[Эта статья является продолжением учебника по библиоте]]></description>
<content:encoded><![CDATA[<p>Эта статья является продолжением <a href="http://techwork.ru/extjs-book/">учебника по библиотеке компонентов <strong>ExtJS</strong></a>, используемой для создания web-приложений с функциональным интерфейсом пользователя.</p>
<p>Один из самых простых компонентов библиотеки - кнопка (<strong>Button</strong>), создается тривиально:</p>
<pre>button = new Ext.Button({
 text: 'Кнопка',
 renderTo: Ext.getBody()
})</pre>
<p><a href="http://techworkru.files.wordpress.com/2008/10/button1.png"><img class="aligncenter size-large wp-image-525" title="Простая кнопка" src="http://techworkru.wordpress.com/files/2008/10/button1.png?w=620" alt="" width="620" height="409" /></a></p>
<p>Что обычно требуется от кнопки? Правильно: реагировать на нажатия. Давайте определим специальную функцию ShowMessage(), которая будет выдавать простое сообщение пользователю о нажатии на кнопку:</p>
<pre>function ShowMessage() {
  Ext.MessageBox.alert("На меня нажали!", "Сообщение");
}</pre>
<p>Присвоим ранее созданной кнопке эту <strong>функцию-обработчик</strong>.</p>
<p><!--more--></p>
<pre>button.setHandler(ShowMessage)</pre>
<p>Обратите внимание, что многие начинающие разработчики в этом месте создают ошибку: указывают имя функции со скобками ShowMessage() вместо ссылки на нее как на объект ShowMessage, что приводит к вызову функции, а потом передаче в качестве параметра возвращенного ей результата, что неверно.</p>
<p>Щелкаем по кнопке - получаем сообщение:</p>
<p><a href="http://techworkru.files.wordpress.com/2008/10/button2.png"><img class="aligncenter size-large wp-image-526" title="Обработчик кнопки" src="http://techworkru.wordpress.com/files/2008/10/button2.png?w=620" alt="" width="620" height="409" /></a></p>
<p>Функцию-обработчик можно задавать напрямую в конфигурации компонента как анонимную функцию:</p>
<pre>button = new Ext.Button({
  text: 'Кнопка',
  renderTo: Ext.getBody(),
  handler: function() { Ext.MessageBox.alert("На меня нажали!", "Сообщение"); }
})</pre>
<p>Для удобства нескольким кнопкам можно присваивать один обработчик. Обратимся к новому примеру:</p>
<pre>function ButtonClick() {
  Ext.MessageBox.alert("На меня нажали!", "Сообщение");
}

for (i=1;i&#60;=10;i++) {
  new Ext.Button({
    text: 'Кнопка номер '+i,
    renderTo: Ext.getBody(),
    handler: ButtonClick,
    id: 'button_'+i
 })
}</pre>
<p>Теперь при нажатии на любую из созданных в цикле десяти кнопок будет запускаться одна и та же функция:</p>
<p><a href="http://techworkru.files.wordpress.com/2008/10/button3.png"><img class="aligncenter size-large wp-image-527" title="Создание кнопок в цикле" src="http://techworkru.wordpress.com/files/2008/10/button3.png?w=620" alt="" width="620" height="409" /></a></p>
<p>Обратите внимание, что на этот раз мы не сохраняем созданный в результате вызова конструктора кнопки объект, а задаем в его конфигурации параметр id вида button_N, где N - порядковый номер кнопки. В дальнейшем зная идентификатор компонента можно получить его объект конструкцией:</p>
<p>Ext.getCmp('button_N')</p>
<p>Следующий цикл выполняет перебор ранее созданных кнопок и их переименование:</p>
<pre>for (i=1;i&#60;=10;i++) {
  Ext.getCmp('button_'+i).setText('Кнопочка '+i)
}</pre>
<p><a href="http://techworkru.files.wordpress.com/2008/10/button4.png"><img class="aligncenter size-large wp-image-528" title="Переименованные кнопки" src="http://techworkru.wordpress.com/files/2008/10/button4.png?w=620" alt="" width="620" height="409" /></a></p>
<p>Интересно, а можно с помощью всего лишь одной функции-обработчика сделать привязку к нажатой кнопке? Переопределим функцию-обработчик, добавив ей два параметра: <strong>button</strong> (объект кнопки, которая была нажата) и <strong>e</strong> (тип полученного обработчиком события):</p>
<pre>function ButtonClick(button, e) {
  Ext.MessageBox.prompt("Изменить?", "Введите новое название кнопки", function(btn, text) {
  if (btn == 'ok') {
   button.setText(text)
  }
 })
}</pre>
<p>К сожалению, простого переопределения функции в Firebug с таким же именем для привязки к ранее созданным кнопкам недостаточно. Снова переберем существующие кнопки и присвоим новый обработчик:</p>
<pre>for (i=1; i&#60;=10; i++) {
 Ext.getCmp('button_'+i).setHandler(ButtonClick)
}</pre>
<p>Проверяем: кнопки переименовываются!</p>
<p>В обычном HTML кнопка задается подобными тегами:</p>
<pre class="source source-javascript">&#60;input type=<span class="st0">"submit"</span> id=<span class="st0">"btnLaunch"</span> value=<span class="st0">"Lancer"</span> <span class="kw3">name</span>=<span class="st0">"btnLaunch"</span>/&#62;</pre>
<p>А что представляет из себя компонент-кнопка из библиотеки ExtJS в DOM-документе? Вы будете смеяться, но это таблица с декоративными элементами и тегом <a href="http://www.htmlbook.ru/html/button.html" target="_blank">&#60;button&#62;</a>:</p>
<pre class="source source-javascript">&#60;table cellspacing=<span class="st0">"0"</span> cellpadding=<span class="st0">"0"</span> border=<span class="st0">"0"</span> <span class="kw2">class</span>=<span class="st0">"x-btn-wrap x-btn x-btn-text-icon"</span>
 id=<span class="st0">"ext-comp-1169"</span> style=<span class="st0">"width: auto;"</span>&#62;
  &#60;tbody&#62;&#60;tr&#62;
   &#60;td <span class="kw2">class</span>=<span class="st0">"x-btn-left"</span>&#62;&#60;i&#62; &#60;<span class="re0">/i&#62;&#60;/</span>td&#62;
   &#60;td <span class="kw2">class</span>=<span class="st0">"x-btn-center"</span>&#62;&#60;em unselectable=<span class="st0">"on"</span>&#62;
   &#60;button type=<span class="st0">"button"</span> <span class="kw2">class</span>=<span class="st0">"x-btn-text"</span> id=<span class="st0">"ext-gen138"</span> style=<span class="st0">"background-image: url(/img/settings.gif);"</span>&#62;
   Profile&#60;<span class="re0">/button&#62;&#60;/em&#62;&#60;/</span>td&#62;&#60;td <span class="kw2">class</span>=<span class="st0">"x-btn-right"</span>&#62;&#60;i&#62; &#60;<span class="re0">/i&#62;
   &#60;/td&#62;&#60;/tr&#62;
  &#60;/tbody&#62;
&#60;/</span>table&#62;</pre>
<p>Внутренняя структура одной из наших кнопок в Firebug:</p>
<p><a href="http://techworkru.files.wordpress.com/2008/10/button5.png"><img class="aligncenter size-large wp-image-529" title="HTML-структура кнопки" src="http://techworkru.wordpress.com/files/2008/10/button5.png?w=620" alt="" width="620" height="409" /></a></p>
<p>Давайте посмотрим, как можно управлять положением кнопок с помощью изменения свойств их DOM-элементов.</p>
<pre>function getBrowserHeight() {
  return document.compatMode=='CSS1Compat' &#38;&#38; !window.opera?
    document.documentElement.clientHeight:document.body.clientHeight;
}

function getBrowserWidth() {
  return document.compatMode=='CSS1Compat' &#38;&#38; !window.opera?
   document.documentElement.clientWidth:document.body.clientWidth;
} 

for (i=1;i&#60;=10;i++) {
  dom = Ext.getCmp('button_'+i).el.dom;
  dom.style.position="absolute";
  dom.style.marginLeft=Math.round(Math.random()*(getBrowserWidth()-dom.clientWidth));
  dom.style.marginTop=Math.round(Math.random()*(getBrowserHeight()-dom.clientHeight));
}</pre>
<p>Выше мы определили две кроссбраузерные функции getBrowserHeight() и getBrowserWidth(), которые будут оценивать доступную область экрана (соответственно высоту и ширину) браузера в пикселах. Далее в процессе цикла перебираем все кнопки и присваиваем им абсолютные координаты, сгенерировав их из случайных значений. Обратите внимание, что мы подсчитываем метрику окна браузера, вычитаем из этого значения метрику кнопки (чтобы не появлялись полосы прокрутки) и на основании полученной величины присваиваем верхней или левой координате DOM-элемента кнопки случайное значение из этого диапазона:</p>
<p><a href="http://techworkru.files.wordpress.com/2008/10/button6.png"><img class="aligncenter size-large wp-image-530" title="Расположение кнопок" src="http://techworkru.wordpress.com/files/2008/10/button6.png?w=620" alt="" width="620" height="409" /></a></p>
<p>Теперь немного позабавимся: сделаем так, что кнопки заживут своей жизнью. Давайте представим, что каждая кнопка будет двигаться в собственном направлении, которое определяется двумя переменными кнопки moveX и moveY, имеющими значения -1 (для сдвига против оси), 0 (без изменения по оси) и 1 (для сдвига по оси). Для удобства зададим функцию-генератор этих значений:</p>
<pre>function getDirection() {
 return Math.round(Math.random()*2)-1;
}</pre>
<p>Задаем первоначальные направления движения кнопкам:</p>
<pre>for (i=1;i&#60;=10;i++) {
  Ext.getCmp('button_'+i).moveX = getDirection();
  Ext.getCmp('button_'+i).moveY = getDirection();
}</pre>
<p>А теперь реализуем функцию crazy(), которая будет осуществлять движение:</p>
<pre>function crazy() {
  for (i=1;i&#60;=10;i++) {
    comp = Ext.getCmp('button_'+i)
    X = parseInt(comp.el.dom.style.marginLeft);
    X += comp.moveX;
    if ((X == 0) &#124;&#124; (X == (getBrowserWidth()-comp.el.dom.clientWidth))) {
      comp.moveX = invertDirection(comp.moveX);
    }
    comp.el.dom.style.marginLeft = X;
    Y = parseInt(comp.el.dom.style.marginTop);
    Y += comp.moveY;
    if ((Y == 0) &#124;&#124; (Y == (getBrowserHeight()-comp.el.dom.clientHeight))) {
      comp.moveY = invertDirection(comp.moveY);
    }
    comp.el.dom.style.marginTop = Y;
  }
}

function invertDirection(dir) {
  if (dir == -1) { return 1; }
  if (dir == 1) { return -1; }
  return 0;
}</pre>
<p>Выше мы определили функцию crazy, которая высчитывает изменения координат кнопок, а при достижении границ экрана меняет направление движения на обратное с помощью вспомогательной функции invertDirection.</p>
<p>Запускаем в работу:</p>
<p>setInterval("crazy()", 100)</p>
<p>Заметьте, что во время отображения всплывающего окна с сообщением при нажатии любой кнопки, их движение продолжается несмотря на то, что выводится модальный диалог.</p>
<p>Что еще можно делать с кнопками?</p>
<ol>
<li>С помощью метода <strong>focus()</strong> определенной кнопке можно передать фокус ввода.</li>
<li>К кнопке можно привязать выпадающее меню (свойство <strong>menu</strong> конфигурации компонента и его методы <strong>showMenu</strong> и <strong>hideMenu</strong>)</li>
<li>Кнопка может работать в режиме переключателя (свойства <strong>enableToggle</strong>, <strong>pressed, toggleHandler </strong>и<strong> toggleGroup</strong> в конфигурации и свойство объекта <strong>toggle</strong>)</li>
<li>Кнопку можно заблокировать (свойство <strong>disabled</strong> в конфигурации)</li>
<li>К кнопке можно добавить изображение-иконку (свойство <strong>icon</strong> в конфигурации и его метод <strong>setIconClass</strong>)</li>
<li>К кнопке можно добавить всплывающую подсказку (свойства <strong>tooltip</strong> и <strong>tooltipType</strong> в конфигурации)</li>
</ol>
<p><strong>Перейти далее к разделу </strong><strong><a title="Библиотека ExtJS для новичков" rel="bookmark" href="http://techwork.ru/2008/10/03/extjs-advanced-panels/">Расширенная работа с панелями…</a></strong></p>
<p><strong>Перейти к </strong><strong><a title="Библиотека ExtJS для новичков" rel="bookmark" href="http://techwork.ru/extjs-book/">содержанию Учебника по ExtJS</a></strong></p>
<p><strong>Мы помогли Вам? Вы можете <a href="http://techwork.ru/extjs-book/donate/">поддержать дальнейшее создание учебника по ExtJS</a>.</strong></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[ExtJs: le basi dell'applicazione]]></title>
<link>http://eineki.wordpress.com/?p=200</link>
<pubDate>Tue, 30 Sep 2008 23:45:54 +0000</pubDate>
<dc:creator>eineki</dc:creator>
<guid>http://eineki.pt-br.wordpress.com/2008/10/01/extjs-le-basi-dellapplicazione/</guid>
<description><![CDATA[Questa è la seconda puntata dell&#8217;esperimento su extjs. Ovviamente già in ritardo, adoro dimo]]></description>
<content:encoded><![CDATA[<p>Questa è la seconda puntata dell'esperimento su extjs. Ovviamente già in ritardo, adoro dimostrarmi coerente anche su internet con la mia controparte reale. Purtroppo scirivere codice è pressochè immediato, lo è meno, per me, commentarne le caratteristiche in chiave didattica senza essere più che prolissi. Accetto quindi consigli ed osservazione che possano aiutarmi a migliorare l'esposizione (in caso contrario dovrete adattarvi ad uno stile molto distante da quello ottimale finché non riuscirò da solo a trovarne uno efficiente :) )</p>
<p>Dobbiamo Assume che abbiate presente cosa sia un pastebin e passo direttamente al sodo.</p>
<p>Extjs ci permette di concentrare su una singola pagina web un'intero applicativo semplificando, per certi versi, lo sviluppo.</p>
<p>Vediamo come è composta la pagina web che ospiterà il nostro codice:</p>
<blockquote><p>&#60;html&#62;<br />
&#60;head&#62;<br />
&#60;title&#62;PastE(xtjs)bin&#60;/title&#62;<br />
<span style="color:#ff0000;">&#60;link rel="stylesheet" type="text/css" href="ext-2.2/resources/css/ext-all.css"&#62;</span><br />
&#60;link rel="stylesheet" type="text/css" href="pastebin.css"&#62;<br />
&#60;/head&#62;<br />
&#60;body&#62;<br />
<span style="color:#ff0000;">&#60;script type="text/javascript" src="ext-2.2/adapter/ext/ext-base.js"&#62;&#60;/script&#62;<br />
&#60;script type="text/javascript" src="ext-2.2/ext-all-debug.js"&#62;&#60;/script&#62;</span><br />
<span style="color:#0000ff;">&#60;script type="text/javascript" src="pastebin.js"&#62;&#60;/script&#62;</span><br />
&#60;/body&#62;<br />
&#60;/html&#62;</p></blockquote>
<p>Se pensate che la pagina sia scarna non avete tutti i torti. Solitamente si usa costruire la pagina in html e poi aggiungere la logica in javascript per poter garantire l'accesso anche a chi non ha javascript abilitato. Noi abbiamo due motivi che ci spingono a massimizzare l'uso di javascript: stiamo sviluppando un'applicativo di prova e vogliamo evitare per quanto possibile l'abuso da parte di spider della possibilità di incollare testi non controllati.<br />
<!--more--><br />
Le righe in rosso servono ad includere tutti i file della libreria. Potremmo scegliere di includere meno codice di quello che abbiamo incluso adesso scegliendo di non fare riferimento a ext-all-debug ma ad un file, magari assemblato ad hoc o compresso.</p>
<p>Il file javascript evidenziato in blu conterrà la logica del nostro programma mentre il file pastebin.css a cui facciamo riferimento nella sezione head del file conterrà la parte personalizzata dello stile dell'applicazione.</p>
<p>Per ora conterrà solamente lo stile del tag body, aggiungeremo eventualmente più avanti altri stili.</p>
<blockquote><p>body {<br />
background-color: #fdfffa;<br />
background-image: url(ext-2.2/resources/images/default/shared/large-loading.gif);<br />
background-repeat:no-repeat;<br />
background-attachment:fixed;<br />
background-position:center;<br />
}</p></blockquote>
<p>In attesa che vengano caricati i file javascript, sono grossi e potrebbe essere necessario diverso tempo per scaricarli, verrà visualizzata un'immagine al centro della pagina che invita gli utenti ad attendere.</p>
<p>Abbiamo descritto sinteticamente la parte html e css, possiamo dedicarci alla parte javascript.</p>
<p>Per ora ci limiteremo a creare una prima separazione della pagina che conterrà l'applicativo utilizzando l'oggetto <a title="viewport" href="http://extjs.com/deploy/dev/docs/?class=Ext.Viewport" target="_blank">viewport</a>.</p>
<p>Questo componente è, riporto dalle specifiche, un contenitore che sostituisce il contenuto del tag body, occupa tutto lo spazio disponibile nella finestra del browser ed ospita diversi pannelli che permetteranno di strutturare lo spazio visibile contenendo, a loro volta, i controlli necessari all'interazione con l'utente.</p>
<p>Se avete superato il paragrafo precedente e siete arrivati fin qui per cercare di capire cosa c'è scritto sappiate che anche a me che l'ho scritto il testo non è chiaro. Un esempio è quello che ci vuole per fugare eventuali dubbi residui. Il codice javascript che animerà la nostra applicazione per ora sarà molto semplice:</p>
<blockquote>
<pre>Ext.onReady(function(){    Ext.namespace("eineki");   
                           new Ext.Viewport({   
                               layout: "border",   
                               items: [  {  region: "west",        
                                            collapsible: true,        
                                            title: "Utente",        
                                            html: "Contenuto del pannello a sinistra",
                                            height: "90%",
                                            margins:"2 2 2 2"},     
                                         {  region: "center",        
                                            html: "Contenuto del pannello al centro",
                                            margins:"2 2 2 2"}   
                               ]  
                             });
  });</pre>
</blockquote>
<p>Per ora ci limitiamo ad dividere la finestra in due parti, riempiremo le due colonne in una prossima puntata. Viewport serve proprio a questo: divide la finestra del browser in cinque zone che secondo uno lo schema che vedrete qui sotto nello screenshot.</p>
<p style="text-align:center;"><a href="http://eineki.wordpress.com/files/2008/09/viewport.png"><img class="size-thumbnail wp-image-217 aligncenter" title="viewport-schema" src="http://eineki.wordpress.com/files/2008/09/viewport.png?w=256" alt="" width="256" height="140" /></a></p>
<p>Potete vedere la <a title="Test della divisione in zone tramite viewport" href="http://liberosoftware.net/viewport-test/" target="_blank">demo (parola grossa) funzionante</a> ed <a title="script js" href="http://liberosoftware.net/viewport-test/main.js" target="_blank">il sorgente</a> per crearla, <a href="http://liberosoftware.net/utils/setnum.php?viewport-test/main.js" target="_blank">magari con i numeri di linea</a>.</p>
<p>Ogni volta che programmeremo usando Extjs raccoglieremo il codice principale all'interno di una funzione, in questo caso anonima anche se non è obbligatorio che lo sia, che dovrà essere eseguita all'interno di una chiamata ad Ext.onReady (riga 4) che accetta come parametro una funzione da lanciare una volta che il browser ha caricato tutto il necessario alla renderizzazione della pagina.</p>
<p>Nello specifico la nosta funzione non fa altro che utilizzare viewport per dividere la pagina in due colonne, una occidentale, o sinistra (west) ed una destra, anche se per viewport sarà la regione centrale (center).</p>
<p>Viewport divide la finestra in cinque regioni: <em>north, west, center, east e south</em> che dovranno essere riempite da opportuni <em>panel</em> (o renderizzate su div già presenti sulla pagina). Solo una delle regioni è obbligatoria: center, le altre, essendo facoltative, possono essere impiegate per costruire un qualunque layout. A dire il vero anche viewport è del tutto facoltativo; è possibile sviluppare applicazioni senza utilizzarlo e gestire la pagina direttamente.</p>
<p>Nel prossimo pezzo cercherò di concentrarmi sui panel popolando, nel contempo la regione di sinistra con una maschera per l'inserimento dei dati di un eventuale utente.</p>
<p>E questo, per ora, è tutto.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[GWT Chat Application - (GWT with xmpp protocol)]]></title>
<link>http://vinaytech.wordpress.com/?p=213</link>
<pubDate>Sat, 27 Sep 2008 11:21:54 +0000</pubDate>
<dc:creator>Vinay J</dc:creator>
<guid>http://vinaytech.pt-br.wordpress.com/2008/09/27/gwt-chat-application-gwt-with-xmpp-protocol/</guid>
<description><![CDATA[emite (xmpp &amp; gwt) - This library implements the xmpp communications protocol using the bosh tec]]></description>
<content:encoded><![CDATA[<p><strong>emite</strong> (xmpp &#38; gwt) - This library implements the xmpp communications protocol using the <a href="http://www.xmpp.org/extensions/xep-0124.html" target="_blank">bosh</a> technique with gwt. It also handles the xmpp Instant Messaging protocol but has a <a href="http://code.google.com/p/emite/wiki/HowToWriteAPlugin" target="_blank">modular</a> architecture to support any other kind of communications.</p>
<ul>
<li>stable, pure java (no js), portable library</li>
<li>ready, full featured and easy to use instant messaging implementation</li>
<li>extensible architecture</li>
<li>Chat rooms support (<a href="http://www.xmpp.org/extensions/xep-0045.html" target="_blank">Multi-User Chat</a>).</li>
<li>Other XEP like: <a href="http://www.xmpp.org/extensions/xep-0085.html" target="_blank">Chat State Notifications</a>.</li>
<li>well tested (junit test, coverage support)</li>
</ul>
<p>Features :</p>
<ul>
<li>Common features support (chat, chat rooms, presence, roster)</li>
<li>Sound and visual advices when new messages arrive</li>
<li>Drag &#38; Drop support to start a conversation and for chat room invitations</li>
<li>i18n support</li>
<li>Focused in be very usable</li>
<li>Based in extjs and gwt-ext</li>
</ul>
<p><strong>Screenshot</strong></p>
<p><a href="http://vinaytech.files.wordpress.com/2008/09/emite-client-snapshot.png"><img class="alignnone size-full wp-image-242" title="emite-client-snapshot" src="http://vinaytech.wordpress.com/files/2008/09/emite-client-snapshot.png" alt="" width="512" height="327" /></a></p>
<p>emite Chat Demo - <a href="http://emite.ourproject.org/" target="_blank">click here</a></p>
<p>emite Chat application <a href="http://code.google.com/p/emite/downloads/list" target="_blank">download</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[HelloWorld: Библиотека ExtJS для новичков]]></title>
<link>http://techworkru.wordpress.com/?p=466</link>
<pubDate>Sat, 27 Sep 2008 11:02:44 +0000</pubDate>
<dc:creator>techworkru</dc:creator>
<guid>http://techwork.ru/2008/09/27/extjs-helloworld/</guid>
<description><![CDATA[Это первая статья из цикла уроков по самой интересной ]]></description>
<content:encoded><![CDATA[<p>Это первая статья из цикла уроков по самой интересной и функциональной на сегодняшний день библиотеки виджетов ExtJS. Публикация материала будет проходить от простого к сложному, поэтому к маститым разработчикам просьба: не критиковать за разъяснения очевидных вещей.</p>
<h3>Необходимые инструменты</h3>
<p>Для запуска примера из этого раздела нам не потребуются специальные навороченные среды разработки (типа Eclipse), а будет достаточно современного браузера <strong><a href="http://ru.wikipedia.org/wiki/Firebug" target="_blank">Firefox</a></strong> с дополнительным пакетом расширения <strong><a href="http://ru.wikipedia.org/wiki/Firebug" target="_blank">Firebug</a></strong>.</p>
<p>Если Firefox еще не установлен на вашем компьютере, то пора <a href="http://www.mozilla-russia.org/products/firefox/">скачать</a> и установить его. После чего запустите Firefox и введите в адресной строке <a href="https://addons.mozilla.org/ru/firefox/search?q=Firebug"> https://addons.mozilla.org/ru/firefox/search?q=Firebug</a>. Откроется окно:</p>
<p><a href="http://techworkru.wordpress.com/files/2008/09/hello2.png"><img class="aligncenter size-large wp-image-467" title="Загрузка Firebug" src="http://techworkru.wordpress.com/files/2008/09/hello2.png?w=620" alt="" width="620" height="408" /></a></p>
<p>Щелкаем по кнопке <strong>Добавить в Firefox</strong>, расположенной справа от описания необходимого нам дополнения Firebug. Появится дополнительное окно, которое сообщит о намерении установки нового расширения:</p>
<p><a href="http://techworkru.wordpress.com/files/2008/09/hello3.png"><img class="aligncenter size-full wp-image-468" title="Подтверждение установки" src="http://techworkru.wordpress.com/files/2008/09/hello3.png" alt="" width="491" height="350" /></a></p>
<p>Нажимаем кнопку <strong>Установить</strong>, после чего произойдет загрузка пакета и его установка в систему.<!--more--> Далее, потребуется выполнить перезапуск браузера для чего нужно щелкнуть по кнопке <strong>Перезапустить Firefox</strong>:</p>
<p><a href="http://techworkru.wordpress.com/files/2008/09/hello4.png"><img class="aligncenter size-large wp-image-469" title="Перезапуск Firefox" src="http://techworkru.wordpress.com/files/2008/09/hello4.png?w=620" alt="" width="620" height="394" /></a></p>
<p>Нажимаем кнопку <strong>F12</strong> и убеждаемся, что Firebug корректно установлен и активен. Если все прошло нормально, внизу окна появится дополнительная область с несколькими вкладками. Пока проверим, что эта панель отобразилась, а ее использование подробнее рассмотрим чуть позже.</p>
<p><a href="http://techworkru.wordpress.com/files/2008/09/hello5.png"><img class="aligncenter size-large wp-image-470" title="После установки Firebug" src="http://techworkru.wordpress.com/files/2008/09/hello5.png?w=620" alt="" width="620" height="408" /></a></p>
<h3>Создание html файла</h3>
<p>Начнем с создания HTML файла - каркаса нашего приложения, который будет загружать и инициализировать библиотеку ExtJS. Откроем любой текстовый редактор и скопируем простой HTML код:</p>
<pre>
<div class="html4strict" style="font-family:monospace;color:#000000;"><span style="color:#009900;"><span style="font-weight:bold;color:#000000;">&#60;html&#62;</span></span>
 <span style="color:#009900;"><span style="font-weight:bold;color:#000000;">&#60;head&#62;</span></span>
  <span style="color:#009900;"><span style="font-weight:bold;color:#000000;">&#60;link</span> <span style="color:#000066;">href</span>=<span style="color:#ff0000;">"http://extjs.com/deploy/dev/resources/css/ext-all.css"</span> <span style="color:#000066;">type</span>=<span style="color:#ff0000;">"text/css"</span> <span style="color:#000066;">rel</span>=<span style="color:#ff0000;">"stylesheet"</span><span style="font-weight:bold;color:#000000;">&#62;</span></span>
  <span style="color:#009900;"><span style="font-weight:bold;color:#000000;">&#60;script</span> <span style="color:#000066;">type</span>=<span style="color:#ff0000;">"text/javascript"</span> <span style="color:#000066;">src</span>=<span style="color:#ff0000;">"http://extjs.com/deploy/dev/adapter/ext/ext-base.js"</span><span style="font-weight:bold;color:#000000;">&#62;</span></span>
  <span style="color:#009900;"><span style="font-weight:bold;color:#000000;">&#60;/script&#62;</span></span>
  <span style="color:#009900;"><span style="font-weight:bold;color:#000000;">&#60;script</span> <span style="color:#000066;">type</span>=<span style="color:#ff0000;">"text/javascript"</span> <span style="color:#000066;">src</span>=<span style="color:#ff0000;">"http://extjs.com/deploy/dev/ext-all.js"</span><span style="font-weight:bold;color:#000000;">&#62;</span></span>
  <span style="color:#009900;"><span style="font-weight:bold;color:#000000;">&#60;/script&#62;</span></span>
 <span style="color:#009900;"><span style="font-weight:bold;color:#000000;">&#60;/head&#62;</span></span>
 <span style="color:#009900;"><span style="font-weight:bold;color:#000000;">&#60;body&#62;</span></span>
 <span style="color:#009900;"><span style="font-weight:bold;color:#000000;">&#60;/body&#62;</span></span>
<span style="color:#009900;"><span style="font-weight:bold;color:#000000;">&#60;/html&#62;</span></span></div>
</pre>
<p>Вот что получилось:</p>
<p><a href="http://techworkru.wordpress.com/files/2008/09/hello1.png"><img class="aligncenter size-large wp-image-471" title="helloworld.html" src="http://techworkru.wordpress.com/files/2008/09/hello1.png?w=620" alt="" width="620" height="437" /></a></p>
<p>Давайте рассмотрим этот файл подробнее. Сначала мы определяем стандартные HTML теги: начало документа <strong>&#60;html&#62;</strong> и начало заголовочной секции документа <strong>&#60;head&#62;</strong>. Далее по тексту расположены соответствующие им закрывающие теги: <strong>&#60;/html&#62;</strong> и <strong>&#60;/head&#62;</strong>. Таким образом основной код нашего документа сейчас сконцентрирован в секции <strong>&#60;head&#62;</strong>, а раздел, отделенный тегами <strong>&#60;body&#62;</strong>, в данный момент пока не имеет содержимого. Обратите внимание на один тег <strong>&#60;link&#62;</strong> и два <strong>&#60;script&#62;</strong>. Первый выполняет подключение внешнего файла по адресу <a href="http://extjs.com/deploy/dev/resources/css/ext-all.css">http://extjs.com/deploy/dev/resources/css/ext-all.css</a>, который содержит таблицы стилей <a href="http://ru.wikipedia.ru/wiki/CSS" target="_blank">CSS</a>. Этот файл является частью библиотеки ExtJS и находится на сервере ее разработчиков. На данном этапе для удобства мы не будем копировать необходимые нам файлы на локальный компьютер, однако в дальнейшем рассмотрим и этот вопрос. Вторые два тега <strong>&#60;script&#62;</strong> выполняют подключение файлов с JavaScript кодом библиотеки (<a href="http://extjs.com/deploy/dev/adapter/ext/ext-base.js">http://extjs.com/deploy/dev/adapter/ext/ext-base.js</a> и <a href="http://extjs.com/deploy/dev/ext-all.js">http://extjs.com/deploy/dev/ext-all.js</a>) и также находятся на сервере ее разработчиков. Первый файл является базовым загрузчиком, а второй содержит необходимые текущему приложению компоненты (в нашем случае all - все). Порядок подключения этих файл критичен: если теги поменять местами - библиотека работать не будет.</p>
<p>В дальнейшем для ускорения загрузки своих приложений, созданных с использованием ExtJS, можно провести кастомизацию компонентов и исключить неиспользуемые.</p>
<h3>Работа с Firebug</h3>
<p>Сохраняем файл где-нибудь на своем локальном компьютере под именем <strong>helloworld.html</strong> и открываем через меню <strong>Файл -&#62; Открыть файл</strong> в Firefoxе:</p>
<p><a href="http://techworkru.wordpress.com/files/2008/09/hello6.png"><img class="aligncenter size-large wp-image-472" title="helloworld в Firefox" src="http://techworkru.wordpress.com/files/2008/09/hello6.png?w=620" alt="" width="620" height="408" /></a></p>
<p>Нажимаем кнопку <strong>F12</strong> для вызова отладчика Firebug. В отобразившейся нижней панели мы увидим набор вкладок <strong>Console, HTML, CSS,  Script, DOM, Net</strong>, часть из которых неактивна (подсвечена серым цветом). По-умолчанию это сделано для того, чтобы процесс отладки  Firebug не замедлял работу браузера при просмотре обычных сайтов, и включался только для тех, где он необходим.</p>
<p>Обратите внимание, что во второй вкладке <strong>HTML</strong>, которая скорее всего будет активна при старте Firebug, отображается древовидная структура нашего HTML файла. Это так называемая DOM-модель HTML документа, каждый из узлов которой представляет собой отдельный элемент.</p>
<p><a href="http://techworkru.wordpress.com/files/2008/09/hello7.png"><img class="aligncenter size-large wp-image-473" title="Запущенный Firebug" src="http://techworkru.wordpress.com/files/2008/09/hello7.png?w=620" alt="" width="620" height="408" /></a></p>
<p>Мы вернемся к ней немного позже, а сейчас перейдем на вкладку <strong>Console</strong>:</p>
<p><a href="http://techworkru.wordpress.com/files/2008/09/hello8.png"><img class="aligncenter size-large wp-image-474" title="Вкладка Console" src="http://techworkru.wordpress.com/files/2008/09/hello8.png?w=620" alt="" width="620" height="408" /></a></p>
<p>Как уже и говорилось ранее, Firebug по-умолчанию не работает со всеми сайтами, поэтому требует для каждого отдельной активации. В нашем случае вместо сайта используется локальный файл, поэтому активировать Firebug будем для всех локальных документов. Первоначально нам потребуется только консоль отладчика, поэтому поставим галочку напротив <strong>Console</strong> и нажмем кнопку <strong>Enable selected panels for Local Files</strong>. В результате получим интерактивную консоль для построчной отладки программ на языке JavaScript:</p>
<p><a href="http://techworkru.wordpress.com/files/2008/09/hello9.png"><img class="aligncenter size-large wp-image-475" title="Консоль в Firebug" src="http://techworkru.wordpress.com/files/2008/09/hello9.png?w=620" alt="" width="620" height="408" /></a></p>
<p>В верхней ее области будет отображаться вывод результатов обработки команд, а в самой нижней (где расположено приветствие <span style="color:blue;">&#62; &#62; &#62;</span>) можно вводить сами команды. Как это принято в учебниках многих языков программирования и сред разработки, напишем код, который будет выводить на экран небольшое приветствие. Введем в нижней строке: <code>Ext.MessageBox.alert("Привет мир!")</code>:</p>
<p><a href="http://techworkru.wordpress.com/files/2008/09/hello10.png"><img class="aligncenter size-large wp-image-476" title="Ввод команды" src="http://techworkru.wordpress.com/files/2008/09/hello10.png?w=620" alt="" width="620" height="408" /></a></p>
<p>После чего нажмем Enter, и на экране отобразится симпатичное окошко:</p>
<p><a href="http://techworkru.wordpress.com/files/2008/09/hello11.png"><img class="aligncenter size-large wp-image-477" title="Привет мир!" src="http://techworkru.wordpress.com/files/2008/09/hello11.png?w=620" alt="" width="620" height="408" /></a></p>
<p>Попробуйте его переместить в другую область окна. Неправда ли, оно ведет себя схожим образом с обычным окном с сообщением операционной системы за исключением того, что его нельзя переместить за пределы окна браузера?</p>
<p>Обратите внимание на консоль Firebug: после исполнения команды в консоли отобразилась как сама команда, так ссылка на новый объект, который вернула функция alert (зеленым цветом). Давайте подробнее посмотрим на только что вызванную функцию:</p>
<ul>
<li><strong>Ext</strong> - класс библиотеки ExtJS, содержащий все функции, свойства, классы и объекты доступные из библиотеки</li>
<li><strong>MessageBox</strong> - класс, содержащий функции и свойства для отображения сообщений подобных всплывающим сообщениям операционной системы</li>
<li><strong>alert</strong> - функция, вызываемая с одним или несколькими параметрами для выполнения вывода окна с сообщением</li>
</ul>
<p>Вся команда звучит следующим образом (читаем справа налево): <em>Вызвать функцию alert с параметром "Привет мир!" из объекта MessageBox, который в свою очередь находится в объекте Ext</em>.</p>
<p>Набирать длинные команды в одной строке Firebug достаточно неудобно, поэтому следующим шагом щелкнем по самой нижней правой красной кнопке со значком <strong>^</strong> и переключимся в режим полноценного редактора:</p>
<p><a href="http://techworkru.wordpress.com/files/2008/09/hello12.png"><img class="aligncenter size-large wp-image-478" title="Расширенный режим редактора" src="http://techworkru.wordpress.com/files/2008/09/hello12.png?w=620" alt="" width="620" height="408" /></a></p>
<p>Теперь мы сможем набирать команды в несколько строк и запускать их на выполнение нажатием комбинации <strong>Ctrl-Enter</strong> (в однострочном режиме просто <strong>Enter</strong>). Попробуем усложнить пример и напишем длинную команду для вывода сообщения с множественным выбором вариантов действий пользователя:</p>
<pre>Ext.MessageBox.show({
 title: "Сохранить?",
 msg: "Имеются изменения",
 buttons: Ext.Msg.YESNOCANCEL,
 icon: Ext.Msg.QUESTION
})</pre>
<p><a href="http://techworkru.wordpress.com/files/2008/09/hello13.png"><img class="aligncenter size-large wp-image-479" title="Сложный MessageBox" src="http://techworkru.wordpress.com/files/2008/09/hello13.png?w=620" alt="" width="620" height="408" /></a></p>
<p>Вот что у нас получилось при выполнении команды:</p>
<p><a href="http://techworkru.wordpress.com/files/2008/09/hello14.png"><img class="aligncenter size-large wp-image-480" title="Окно с сложным MessageBox" src="http://techworkru.wordpress.com/files/2008/09/hello14.png?w=620" alt="" width="620" height="408" /></a></p>
<p>Рассмотрим подробнее: в этом случае вызывается функция <strong>show</strong> класса <strong>MessageBox</strong> с параметром, являющимся составным объектом (содержимое, заключенное в фигурные скобки). У этого объекта имеются четыре свойства: <strong>title, msg, buttons, icon</strong>. Несложно понять, что title и msg задают текстовое содержимое заголовка окна и самого сообщения, а buttons и icon указывают на параметры внешнего оформления. Вы наверное заметили, что здесь мы использовали краткую запись класса <strong>MessageBox</strong> - <strong>Msg</strong>, так как это удобнее для использования. Следующие варианты применения эквиваленты: <em>Ext.MessageBox.alert("Тест")</em> и <em>Ext.Msg.alert("Тест")</em></p>
<p>Где можно взять допустимые значения параметров иконок, кнопок и прочего? Для нашего примера, в котором используется класс MessageBox мы перейдем на <a href="http://extjs.com/deploy/dev/docs/" target="_blank">страницу документации библиотеки ExtJS</a> и в дереве объектов последовательно выберем класс Ext, а затем MessageBox:</p>
<p><a href="http://techworkru.wordpress.com/files/2008/09/hello15.png"><img class="aligncenter size-large wp-image-481" title="Документация по MessageBox" src="http://techworkru.wordpress.com/files/2008/09/hello15.png?w=620" alt="" width="620" height="408" /></a></p>
<p>Мы попали на страницу описания класса MessageBox, где подробно указаны доступные функции, константы и принимаемые значения. Попробуйте поэкспериментировать с ними: например, изменить нашу последнюю команду, задав другой набор кнопок и иконку.</p>
<p><strong>Перейти далее к разделу </strong><strong><a title="Библиотека ExtJS для новичков" rel="bookmark" href="http://techwork.ru/2008/09/30/extjs-panels/">Панели...</a></strong></p>
<p><strong>Перейти к </strong><strong><a title="Библиотека ExtJS для новичков" rel="bookmark" href="http://techwork.ru/extjs-book/">содержанию Учебника по ExtJS</a></strong></p>
<p><strong>Мы помогли Вам? Вы можете <a href="http://techwork.ru/extjs-book/donate/">поддержать дальнейшее создание учебника по ExtJS</a>.</strong></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[ExtJS: Imparare sperimentando ]]></title>
<link>http://eineki.wordpress.com/?p=172</link>
<pubDate>Wed, 17 Sep 2008 01:59:39 +0000</pubDate>
<dc:creator>eineki</dc:creator>
<guid>http://eineki.pt-br.wordpress.com/2008/09/17/extjs-imparare-sperimentando/</guid>
<description><![CDATA[Be, non ce l&#8217;ho fatta ed ho deciso di partire con questo duplice esperimento: da una parte cos]]></description>
<content:encoded><![CDATA[<p>Be, non ce l'ho fatta ed ho deciso di partire con questo duplice esperimento: da una parte costruire una piccola applicazione utilizzando extjs, dall'altra annotare passo passo su questo blog i progressi ed i ripensamenti a cui andrò incontro nel progetto.</p>
<p>Si tratterà di un appuntamento settimanale, almeno nelle mie più rosee previsioni, in controtempo con quello sugli ebook a licenza libera, e quindi pubblicherò un post alla settimana nella notte tra martedì e mercoledì, magari poche righe, quando il programma sarà in stallo, ma spero così di riuscire ad esprimere la difficoltà intrinseca all'uso della libreria.</p>
<p>Ovviamente ogni critica o suggerimento saranno più che accetti, anzi graditi.</p>
<p>Evitiamo di perdere altro tempo, anche se si tratta di un'introduzione bisogna che mantenga un piglio operativo, e cerchiamo di stabilire le specifiche del progetto.<br />
<!--more--><br />
Nulla di nuovo, ne trascendentale, vorrei finire il tutto prima del 2010 ;) , pensavo allo sviluppo di un server pastebin. Per farvi un'idea di cosa sia vi rimando alla <a title="Pastebin" href="http://it.wikipedia.org/wiki/Pastebin" target="_blank">definizione di pastebin su wikipedia</a> e ad un <a title="server pastebin" href="http://pastebin.com/" target="_blank">esempio live</a>.</p>
<p>In pochissime parole un service pastebin non fa altro che fornire una specie di bacheca condivisa su cui inserire, con il minimo indispensabile di formalità, brevi spezzoni di testo, di solito pezzi di codice, che possano essere visualizzati, copiati ed incollati.</p>
<p>In linea di massima un normale visitatore potrà visualizzare una lista di dei pezzi di testo inseriti e copiarne ed incollarne il contenuto. Un utente normale potrà inserire dei testi all'interno della banca dati determinandone, ad esempio, per quanto tempo l'appunto dovrà restare disponibile.</p>
<p>Per ora è tutto, si è fatto tardi e domattina bisogna che sia in grado di intendere e di volere visto che devo (almeno fare finta di) lavorare.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[ExtJS: Estendere Ext.Component]]></title>
<link>http://eineki.wordpress.com/?p=166</link>
<pubDate>Sun, 14 Sep 2008 23:47:47 +0000</pubDate>
<dc:creator>eineki</dc:creator>
<guid>http://eineki.pt-br.wordpress.com/2008/09/15/extjs-estendere-extcomponent/</guid>
<description><![CDATA[Questa domenica ho tradotto un altro tutorial su Extjs, un ulteriore passo verso l&#8217;avvio di un]]></description>
<content:encoded><![CDATA[<p>Questa domenica ho tradotto un altro tutorial su Extjs, un ulteriore passo verso l'avvio di un progetto che consiste nel documentare passo passo la creazione di una piccola applicazione che utilizzi il framework citato nel titolo.</p>
<p>Il <a title="Derivare una classe da Ext.Component" href="http://extjs.com/learn/Manual:Component:Extending_Ext_Components(Italian)" target="_blank">tutorial</a> è focalizzato sulla modalità di estensione dell'oggetto Ext.Component, che sta alla base della gerarchia di classi del framework.</p>
<p>Al solito fatemi sapere come va la traduzione che è stata un po' faticosa, ve ne accorgerete perché alcuni periodi sono al limite tra una traduzione ed una reinterpretazione del testo :) .</p>
<p>Il testo è interessante anche perché punta ad altre risorse che vale la pena di studiare, e che, probabilmente tradurrò più avanti se nessun altro farà prima di me.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Conosco i tuoi contatti]]></title>
<link>http://alessioma.wordpress.com/?p=30</link>
<pubDate>Thu, 11 Sep 2008 12:49:29 +0000</pubDate>
<dc:creator>bayois</dc:creator>
<guid>http://alessioma.pt-br.wordpress.com/2008/09/11/conosco-i-tuoi-contatti/</guid>
<description><![CDATA[Extjs é sempre al passo coi tempi. Un&#8217;altra semplice e pratica applicazione desktop a base di]]></description>
<content:encoded><![CDATA[<p>Extjs é sempre al passo coi tempi. Un'altra semplice e pratica applicazione desktop a base di Javascript e Browser <a href="http://extjs.com/blog/2008/09/09/google-contact-chrome-app/">Contact's Manager</a></p>
<p>Ecco come ricavare tutti i contatti gmail di un account <a href="http://code.google.com/apis/contacts/">API google</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Constraining ExtJs Floating Windows]]></title>
<link>http://undermypalapa.wordpress.com/?p=23</link>
<pubDate>Mon, 08 Sep 2008 21:15:34 +0000</pubDate>
<dc:creator>jaydfwtx</dc:creator>
<guid>http://undermypalapa.pt-br.wordpress.com/2008/09/08/constraining-extjs-floating-windows/</guid>
<description><![CDATA[There are plenty of examples of creating floating windows with ExtJs. However, they all allow the wi]]></description>
<content:encoded><![CDATA[<p>There are plenty of examples of creating floating windows with ExtJs. However, they all allow the window to be dragged wherever the user chooses. ExtJs supports a 'constrain' property on the window. If you just set this to true, then the user cannot drag the window outside of the browser viewport. </p>
<p>However, what if you want to be fancier, and constrain it inside of some other container? It seems obvious, but finding the answer is difficult. People on the ExtJs forums have posted this question, but the responses are generally a step away from being the real answer. </p>
<p>The answer is the renderTo config property, which you should point to the <strong>body</strong> property of the container. The forum responses generally indicate this, but they fail to mention the body property. This is what works for panels, I haven't looked at all the other containers. But I have a feeling the concept would still apply.</p>
<p>[sourcecode language='javascript']<br />
var myPanel = new Ext.Panel({<br />
    ...<br />
});<br />
var testWin = new Ext.Window({<br />
    title: 'Test',<br />
    width: 300,<br />
    height: 300,<br />
    renderTo: myPanel.body,<br />
    constrain: true,<br />
});<br />
testWin.show();<br />
[/sourcecode]</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[ExtJs with JSF]]></title>
<link>http://undermypalapa.wordpress.com/?p=19</link>
<pubDate>Sat, 30 Aug 2008 22:29:05 +0000</pubDate>
<dc:creator>jaydfwtx</dc:creator>
<guid>http://undermypalapa.pt-br.wordpress.com/2008/08/30/extjs-with-jsf/</guid>
<description><![CDATA[I saw some people were finding this blog by doing a search for ExtJs with JSF.
I previously searched]]></description>
<content:encoded><![CDATA[<p>I saw some people were finding this blog by doing a search for ExtJs with JSF.</p>
<p>I previously searched and found that someone had wrapped up ExtJs into a JSF library, however it appeared to be a dead project.</p>
<p>A coworker and I instead decided to use <a href="http://shale.apache.org/">Apache Shale</a> to expose methods in a managed bean, to return the JSON data that ExtJs wanted. At the time, we were only using the ExtJs Tree component. We needed to use the ExtJs Tree instead of the one from RichFaces because of a certain requirement that could not be fulfilled with RichFaces.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Grails + ExtJs]]></title>
<link>http://undermypalapa.wordpress.com/?p=13</link>
<pubDate>Wed, 27 Aug 2008 18:26:34 +0000</pubDate>
<dc:creator>jaydfwtx</dc:creator>
<guid>http://undermypalapa.pt-br.wordpress.com/2008/08/27/grails-extjs/</guid>
<description><![CDATA[Looking at the beginnings of a new webapp. I&#8217;m heavily leaning towards Grails+ExtJs, even thou]]></description>
<content:encoded><![CDATA[<p>Looking at the beginnings of a new webapp. I'm heavily leaning towards Grails+ExtJs, even though the ExtJs plugin has been discontinued because of the license change. Honestly, paying for developer licenses is not a big deal in the grand scheme of things. For widgets, dojo seems to be a runner-up, however it just doesn't feel as polished, and I find the experience somewhat lacking. I wish jquery had a more mature &#38; official widget set, because it would be my first choice.</p>
<p>In my previous project, we used JSF 1.2 + RichFaces. While I feel that combination can produce good results, it didn't feel very agile. On a new JSF project going forward, I would recommend Seam; however it is not worth the effort to retrofit a large project.</p>
<p><a href="http://jlorenzen.blogspot.com/2008/08/getting-started-with-grails-and-extjs.html">James Lorenzen</a> has a post about how to roll your own ExtJs plugin for grails, which I will probably give a shot.</p>
<p>With JSF, we were pushing markup down to the browser using ajax polling &#38; rerendering of components. However, I want to start using RESTful services along with Comet. This should get interesting...</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Javascript: Ancora sugli scope in Extjs]]></title>
<link>http://eineki.wordpress.com/?p=103</link>
<pubDate>Sat, 16 Aug 2008 22:45:41 +0000</pubDate>
<dc:creator>eineki</dc:creator>
<guid>http://eineki.pt-br.wordpress.com/2008/08/16/javascript-ancora-sugli-scope-in-extjs/</guid>
<description><![CDATA[A stretto giro di posta ho finito di tradurre la seconda parte del tutorial sugli scope in Extjs. La]]></description>
<content:encoded><![CDATA[<p>A stretto giro di posta ho finito di tradurre la seconda parte del tutorial sugli scope in Extjs. La curiosità era troppa e non sono riuscito a fermarmi prima di aver finito anche questa revisione. Finalmente comincio a capire cosa sono i delegati ed a cosa servono.</p>
<p>Non vi ruberò molto tempo se non per scrivere che la <a href="http://extjs.com/learn/Tutorial:What_is_that_Scope_all_about2_(Italian)" target="_blank">seconda parte del tutorial</a> o, meglio, questo <a href="http://extjs.com/learn/Tutorial:What_is_that_Scope_all_about2_(Italian)" target="_blank">secondo tutorial</a> si addentra più in profondità in Extjs e spiega come risolvere, o almeno mitigare, il problema nell'assegnazione degli ambiti di risoluzione evidenziato nel <a href="http://extjs.com/learn/Tutorial:What_is_that_Scope_all_about_(Italian)" target="_blank">primo</a>.</p>
<p>Buona lettura.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Javascript: Lo scope in Extjs (e non solo)]]></title>
<link>http://eineki.wordpress.com/?p=101</link>
<pubDate>Fri, 15 Aug 2008 22:45:30 +0000</pubDate>
<dc:creator>eineki</dc:creator>
<guid>http://eineki.pt-br.wordpress.com/2008/08/15/javascript-lo-scope-in-extjs-e-non-solo/</guid>
<description><![CDATA[Altro rapido post per segnalare la traduzione di un altro tutorial tra quelli disponibili in sul sit]]></description>
<content:encoded><![CDATA[<p>Altro rapido post per segnalare la traduzione di un altro tutorial tra quelli disponibili in sul sito della libreria javascript Extjs.</p>
<p>Questa volta ho tradotto, come avevo preannunciato in un post precedente, <a href="http://extjs.com/learn/Tutorial:What_is_that_Scope_all_about_(Italian)" target="_blank">il primo dei due tutorial che approfondiscono il concetto di scope</a>.</p>
<p>Anche se basilare lo segnalo subito, invece di aspettare di finire di revisionare la seconda parte del tutorial, molto più utile per chi volesse utilizzare extjs, perché ha attirato la mia attenzione sul comportamento delle funzioni annidate riguardo gli ambiti di risoluzione dei nomi. Ho sempre creduto che javascript fosse un normalissimo linguaggio con scope statico mentre ho scoperto, seguendo questo tutorial, che sbagliavo e che la gestione delle funzioni annidate è al limite del comportamento errato (e qui chi ne sa di più è caldamente invitato a <span style="text-decoration:line-through;">contraddirmi</span> essere più preciso).</p>
<p>In attesa della fine della traduzione del secondo tutorial, Buona lettura</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Javascript: eventi in ExtJs]]></title>
<link>http://eineki.wordpress.com/?p=83</link>
<pubDate>Fri, 08 Aug 2008 13:09:47 +0000</pubDate>
<dc:creator>eineki</dc:creator>
<guid>http://eineki.pt-br.wordpress.com/2008/08/08/javascript-eventi-in-extjs/</guid>
<description><![CDATA[Ho tradotto un altro tutorial su Extjs. Si tratta del tutorial che spiega cosa sono gli eventi e com]]></description>
<content:encoded><![CDATA[<p>Ho tradotto un altro tutorial su Extjs. Si tratta del tutorial che spiega <a title="Gli Eventi" href="http://extjs.com/learn/Tutorial:Events_Explained_(Italian)" target="_blank">cosa sono gli eventi e come vengono usati in extj</a>s. Non ho molto altro da aggiungere se non che si tratta di un tutorial introduttivo che mi ha chiarito alcune cose sulla gestione degli eventi alla maniera di Extjs.</p>
<p>Per darvi un'idea riporto lo stringatissimo riassunto finale per punti.</p>
<ul>
<li>un evento è un messaggio inviato (fired) da una sorgente per informare eventuali gestori che è accaduto qualcosa.</li>
<li>una sorgente di eventi è un oggetto che può generare eventi</li>
<li>un gestore di eventi è una funzione che viene invocata quando una sorgente genera un evento del tipo gestito dal gestore</li>
<li>ci mettiamo in attesa di un evento con la funzione <code>on</code> che installa un gestore di eventi</li>
<li>per creare una sorgente di eventi estendiamo la classe <strong><code>Observable</code></strong>, <strong><code>addEvents</code></strong> e <strong><code>fireEvent</code></strong></li>
</ul>
<p>Dateci un'occhiata in attesa della prossima traduzione (gli scope, un doppio tutorial che mi pare interessante)</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Spring sends JSON to a guy named Ext...]]></title>
<link>http://wannabecoder.wordpress.com/?p=36</link>
<pubDate>Thu, 07 Aug 2008 07:54:34 +0000</pubDate>
<dc:creator>jollyca</dc:creator>
<guid>http://wannabecoder.pt-br.wordpress.com/2008/08/07/spring-json-ext/</guid>
<description><![CDATA[So as I said in my previous post&#8230; no more *faces. I put on my goggles and dive deeply into the]]></description>
<content:encoded><![CDATA[<p>So as I said in my previous post... no more *faces. I put on my goggles and dive deeply into the depths of Spring and ExtJS.</p>
<p>The first step is... integration (please note my avoidant personality which tend to ignore stuff like "how the f' should I code *anything* in Ext and jumps right into "ok, how should I display a grid ?"). This integration comes in two flavors - XML and JSON. From what I figure, an XML representation is larger (in terms of bytes) than a JSON representation so I tried to go the JSON way. <!--more--></p>
<p>On the Spring side some there is a small lib called <a href="http://spring-json.sourceforge.net/" target="_blank">Spring JSON View</a> which is basically a Spring view implementation. Long story short - it serializes JavaBeans to a JSON representation which is sent to the facade. Yes, of course it has more features, like form validation and stuff, but all in due time...</p>
<p>On the ExtJS side we have a JsonStore which is basically a DataStore encapsulating a proxy and a JsonReader. Here's where my stupidity kicked-in: the JSON generated by Spring looks something like<br />
<code>{"model":<br />
{"products":<br />
[{"productName":"Pretzels","skuNo":"1","productPrice":2.0},<br />
{"productName":"Arrows","skuNo":"3","productPrice":4.0},<br />
{"productName":"Nuclear warheads","skuNo":"2","productPrice":2.3}]<br />
}<br />
}</code><br />
As an absolute n00b I wondered "Ok, which is the root of the store ? Is it "products" ? Is it "model" ? Is it "model.products" ? The latter was my logical choice but it didn't work. I wandered around forums and various blogs, I even wrote an override for the JSON reader, figuring that the problem is the root.</p>
<p>After spending a few hours on this I decided to ask the forums... Turns out that this specific line in the JsonStore was a bit... wrong:<br />
<code>fields:[{name:'productName',type:'string'},{name:'skuNo',type:'string'},name:'productPrice',type:'double'}]</code><br />
Double is not an accepted type. I replaced it with "float" and everything worked like a charm</p>
<p>Never underestimate the power of your own stupidity...</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Problems with XMLReader in EXTJS]]></title>
<link>http://lcdazo.wordpress.com/?p=27</link>
<pubDate>Tue, 05 Aug 2008 02:33:11 +0000</pubDate>
<dc:creator>ldazo</dc:creator>
<guid>http://lcdazo.pt-br.wordpress.com/2008/08/05/problems-with-xmlreader-in-ext-js/</guid>
<description><![CDATA[I am learning the javascript library EXT-JS. Following the examples were easy and straight-forward u]]></description>
<content:encoded><![CDATA[<p>I am learning the javascript library EXT-JS. Following the examples were easy and straight-forward until I reached the grid and XMLReader.</p>
<p>I had no problems regarding the grid with ArrayReader but everything seemed to fall out of place when trying out the xml-grid.html example. The grid was set-up, alright... but the data is not loaded. It seemed that my xml-grid.html is not working.</p>
<p>I felt stuck...</p>
<p>I am using extjs 2.1 and the examples online runs out smoothly but those in my local computer seemed buggy... I searched and read on threads and blogs for online help but none seem to be figuring out exactly what is wrong, either that or I don't seem to get what is wrong in what I am doing, until I read these lines I missed in the <a href="http://extjs.com/learn/Tutorial:Introduction_to_Ext_2.0">Tutorial for Beginners</a> in the Ext JS web site.</p>
<blockquote><p><strong>Note:</strong> This example will only run from a web server.  The URL in your browser should start with <em>http://</em> and not <em>file://</em> or the Ajax transaction will not work!  Localhost will work fine, but it must be via http.</p></blockquote>
<p>This is the note under Using Ajax section. And then it seemed I hit the spot. I was not running my extjs examples inside my localhost server..</p>
<p>So... I guess that's it. One of those stupid things I got stuck on and <em>phew!</em> I managed to get by. One lesson learned: It is always good to start with tutorials than start learning on your own..</p>
<p>:D</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Bem-vindo(a)]]></title>
<link>http://flavioms.wordpress.com/?p=3</link>
<pubDate>Mon, 04 Aug 2008 05:36:11 +0000</pubDate>
<dc:creator>Flavio Medeiros Sales</dc:creator>
<guid>http://flavioms.pt-br.wordpress.com/2008/08/04/conheca-meu-site/</guid>
<description><![CDATA[Visite o site principal em http://flaviomedeiros.com
Você pode assinar meu RSS usando esta URL: htt]]></description>
<content:encoded><![CDATA[<p>Visite o site principal em <a href="http://flaviomedeiros.com" target="_self">http://flaviomedeiros.com</a><br />
Você pode assinar meu RSS usando esta URL: <a href="http://feeds.feedburner.com/flaviomedeiros">http://feeds.feedburner.com/flaviomedeiros</a><br />
E pode me contactar em  <a href="http://flaviomedeiros.com/about" target="_self">http://flaviomedeiros.com/about</a></p>
<p>Na barra lateral deste site estão alguns dos últimos posts do blog. Divirta-se !</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[DOCASU – Trac - EXTJS ?]]></title>
<link>http://elrems.wordpress.com/2008/07/28/docasu-%e2%80%93-trac-extjs/</link>
<pubDate>Mon, 28 Jul 2008 14:57:15 +0000</pubDate>
<dc:creator>Rémi SOUBEYRAND</dc:creator>
<guid>http://elrems.pt-br.wordpress.com/2008/07/28/docasu-%e2%80%93-trac-extjs/</guid>
<description><![CDATA[

Welcome to the DoCASU Project ¶

DoCASU ¶

Overview 
Features 
Screenshots 
Screencasts 
Archite]]></description>
<content:encoded><![CDATA[<blockquote cite="http://code.optaros.com/trac/docasu/wiki"><div id="content" class="wiki">
<div class="wikipage searchable">
<h1>Welcome to the DoCASU Project<a title="Link to this section" href="http://code.optaros.com/trac/docasu/wiki#WelcometotheDoCASUProject" class="anchor"> ¶</a></h1>
<div style="width:auto;" class="taggedItemsTOC">
<h2>DoCASU<a title="Link to this section" href="http://code.optaros.com/trac/docasu/wiki#DoCASU" class="anchor"> ¶</a></h2>
<ul>
<li><a class="wiki" href="http://code.optaros.com/trac/docasu/wiki/WikiStart">Overview</a> </li>
<li><a class="wiki" href="http://code.optaros.com/trac/docasu/wiki/Features">Features</a> </li>
<li><a class="wiki" href="http://code.optaros.com/trac/docasu/wiki/Screenshots">Screenshots</a> </li>
<li><a class="wiki" href="http://code.optaros.com/trac/docasu/wiki/Screencasts">Screencasts</a> </li>
<li><a class="wiki" href="http://code.optaros.com/trac/docasu/wiki/Architecture">Architecture</a> </li>
<li><a class="wiki" href="http://code.optaros.com/trac/docasu/wiki/Downloads">Downloads</a> </li>
<li><a class="wiki" href="http://code.optaros.com/trac/docasu/wiki/Roadmap">Roadmap</a> </li>
</ul>
<h2>Documentation<a title="Link to this section" href="http://code.optaros.com/trac/docasu/wiki#Documentation" class="anchor"> ¶</a></h2>
<ul>
<li><a class="wiki" href="http://code.optaros.com/trac/docasu/wiki/Installation">Installation</a> </li>
<li><a class="wiki" href="http://code.optaros.com/trac/docasu/wiki/Configuration">Configuration</a> </li>
<li><a class="wiki" href="http://code.optaros.com/trac/docasu/wiki/FAQ">FAQ</a> </li>
<li><a class="wiki" href="http://code.optaros.com/trac/docasu/wiki/DeveloperGuide">Developer Guide</a> </li>
</ul>
</div>
<h2>Overview<a title="Link to this section" href="http://code.optaros.com/trac/docasu/wiki#Overview" class="anchor"> ¶</a></h2>
<p> <i>DoCASU</i> is a custom User Interface (UI) for the Open Source Enterprise Content Management system <a class="ext-link" href="http://www.alfresco.com/"><span class="icon">Alfresco</span></a>. </p>
<p> <a href="http://code.optaros.com/trac/docasu/attachment/wiki/Screenshots/docasu_welcome.jpg"><img alt="DOCASU Welcome Screen" style="border:1px solid;" src="http://code.optaros.com/trac/docasu/raw-attachment/wiki/Screenshots/docasu_welcome.gif" width="300" /></a>  </p>
<h3>Motivation<a title="Link to this section" href="http://code.optaros.com/trac/docasu/wiki#Motivation" class="anchor"> ¶</a></h3>
<p> The current <a class="ext-link" href="http://www.alfresco.com/"><span class="icon">Alfresco</span></a> UI has been designed to expose most of the potential of Alfresco. </p>
<p> This approach addresses the needs of nearly all users, including power users, but is not to comfortable for average end users. </p>
<h3>Goal<a title="Link to this section" href="http://code.optaros.com/trac/docasu/wiki#Goal" class="anchor"> ¶</a></h3>
<p> The goal of the <i>DoCASU</i> project is to provide to the <a class="ext-link" href="http://www.alfresco.com/"><span class="icon">Alfresco</span></a> Community a <i>Custom Alfresco UI</i>: </p>
<ul>
<li>with a strong focus on <a class="ext-link" href="http://www.optaros.com/user-experience"><span class="icon">User eXperience</span></a> (e.g. <i>ease of use</i>, <i>responsiveness</i>) </li>
<li>which will be less confusing for average end users (99% vs. the 1% power users), </li>
<li>which will permit a broader acceptance of the solution by a larger group of users </li>
<li>and being a <i>scalable solution</i> based on the <a class="ext-link" href="http://www.optaros.com/assembly-methodology"><span class="icon">assembly</span></a> of standard components. </li>
</ul>
<p> Read on about the <a class="wiki" href="http://code.optaros.com/trac/docasu/wiki/Features">Features</a> of <i>DoCASU</i> to learn more. </p>
<h2>About DoCASU<a title="Link to this section" href="http://code.optaros.com/trac/docasu/wiki#AboutDoCASU" class="anchor"> ¶</a></h2>
<p> <i>DoCASU</i> is sponsored by <a class="ext-link" href="http://www.optaros.com/"><span class="icon">Optaros</span></a> and is the Alfresco UI of choice we're using ourselves. </p>
<p> We have made <i>DoCASU</i> available to the benefit of the <a class="ext-link" href="http://www.alfresco.com/"><span class="icon">Alfresco</span></a> Community as well as to be able to more easily collaborate on its continued development. </p>
<p> We are open for input and comments. Please use the various communications methods offered (e.g. tickets), but don't hesitate to drop us an email, if you don't find an appropriate mechanism otherwise, to <i>docasu at optaros.com</i>.  </p>
</p></div>
</p></div>
</blockquote>
<p><cite><a href="http://code.optaros.com/trac/docasu/wiki">DOCASU – Trac</a></cite></p>
<div class="flockcredit" style="text-align:right;color:#CCC;font-size:x-small;">Blogged with the <a href="http://www.flock.com/blogged-with-flock" target="_new" title="Flock Browser">Flock Browser</a></div>
<p><!-- technorati tags begin -->
<p style="font-size:10px;text-align:right;">Tags: <a href="http://technorati.com/tag/extjs" rel="tag">extjs</a>, <a href="http://technorati.com/tag/alfresco" rel="tag">alfresco</a></p>
<p><!-- technorati tags end --></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[A new hope...]]></title>
<link>http://wannabecoder.wordpress.com/?p=33</link>
<pubDate>Fri, 25 Jul 2008 07:30:06 +0000</pubDate>
<dc:creator>jollyca</dc:creator>
<guid>http://wannabecoder.pt-br.wordpress.com/2008/07/25/a-new-hope/</guid>
<description><![CDATA[After two days of comparing two &#8220;faces&#8221; - Rich and Ice - I decided that none of them sui]]></description>
<content:encoded><![CDATA[<p>After two days of comparing two "faces" - Rich and Ice - I decided that none of them suits my needs. They both have their pros and cons but they both fail in the DataTable usability area. Features are being asked for by users, of course, but until then I really have to get those two projects going.</p>
<p>So I decided to look at it from a totally different angle - what is the first thing you think of when you want "desktop-like" functionality for your application ? Yes, unfortunately you're right - JavaScript. Now, I don't want to hear any of "JS is overhead", "JS slows down your browser"; yes, it does, but all "faces" also generates JS so STFU. Ok, maybe they generate LESS JavaScript but they also have... less features:). That's why I decided that ExtJS would make a good team with Spring. Of course there are many other JS frameworks out there but ExtJS just captured my attention. Yes, I know Dojo integrates better with Spring but i *really* hate Dojo.</p>
<p>All said and done, now I'm really trying to understand Spring. My past experience consists in coding some components for a Spring-based web application, but I didn't get the chance to "see" the whole picture so it's like learning to walk again. ExtJS is next and then some JSON because apparently that's the way you integrate ExtJS with Spring.</p>
<p>Wish me luck...</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Extjs vs Firebug]]></title>
<link>http://eineki.wordpress.com/?p=59</link>
<pubDate>Sun, 20 Jul 2008 18:20:26 +0000</pubDate>
<dc:creator>eineki</dc:creator>
<guid>http://eineki.pt-br.wordpress.com/2008/07/20/extjs-vs-firebug/</guid>
<description><![CDATA[Da bravo sviluppatore web la mia cassetta degli attrezzi contiene, tra le altre cose firebug e la we]]></description>
<content:encoded><![CDATA[<p>Da bravo sviluppatore web la mia cassetta degli attrezzi contiene, tra le altre cose <a title="debugger javascript" href="http://www.getfirebug.com" target="_blank">firebug</a> e la <a title="web developer toolbar" href="http://chrispederick.com/work/web-developer/" target="_blank">web developer bar</a>. Potete immaginare il mio entusiasmo quando appena aperta la <a title="Esempi uso extJs" href="http://www.extjs.com/deploy/dev/examples/samples.html" target="_blank">pagina degli esempi di etxjs</a> mi sono trovato davanti al messaggio: Attenzione, firebug causa problemi di performance ad extJs.</p>
<p>Se poi considerate che la frase - causa problemi di performance - è un eufemismo, vi lascio immaginare la mia strabordante contentezza.</p>
<p>Se le performance possono non essere un problema, potrete facilmente figurarvi il mio sconforto alla scoperta che anche l'esecuzione passo passo è inutilizzabile. Dopo qualche tentativo ed esplorazione tra i forum di supporto, le invettive dei diversi sviluppatori che si trovano davanti al problema (si, non sono solo) capisco, almeno credo di capire, che il problema è dovuto alle dimensioni dello script extJs.</p>
<p>Le 34343 linee di codice per la libreria sono troppe per firebug che, sul mio sistema non riesce a tracciare l'esecuzione quando quest'ultima arriva al file <em>ext-all-debug.js</em>.</p>
<p>Piuttosto che procedere alla cieca sperando di arrivare all'errore senza troppi blocchi, o almeno senza troppe pause troppo lunghe per la mia quasi infinita pazienza, ;) ho pensato di sezionare la libreria in più file.</p>
<p>L'espediente sembra funzionare e quindi non mi resta altro che riportare il piccolo script che seziona la libreria principale e sperare che la cosa possa essere di aiuto a qualcuno.</p>
<blockquote>
<pre>#!/bin/bash
# checksum md5 del file ext-all-debug.js
EXT21_MD5SUM='b854fc982dcec3781f1beb9653f33234'
MD5_PATH=`which md5sum`
INPUT_MD5=`$MD5_PATH $1  &#124; cut -f 1 -d \ `

if [ "$2" = "" ]
then
    DIR='.'
else
    DIR=$2
fi

if [ "$EXT21_MD5SUM" = "$INPUT_MD5" ]
then
    head $1 --lines 2036 &#62; $DIR/ext-all-debug-p01.js
    head $1 --lines 5679 &#124; tail --lines 3643 &#62; $DIR/ext-all-debug-p02.js
    head $1 --lines 8125 &#124; tail --lines 2446 &#62; $DIR/ext-all-debug-p03.js
    head $1 --lines 10897 &#124; tail --lines 2771 &#62; $DIR/ext-all-debug-p04.js
    head $1 --lines 13672 &#124; tail --lines 2775 &#62; $DIR/ext-all-debug-p05.js
    head $1 --lines 16309 &#124; tail --lines 2636 &#62; $DIR/ext-all-debug-p06.js
    head $1 --lines 19076 &#124; tail --lines 2766 &#62; $DIR/ext-all-debug-p07.js
    head $1 --lines 21817 &#124; tail --lines 2741 &#62; $DIR/ext-all-debug-p08.js
    head $1 --lines 24851 &#124; tail --lines 3034 &#62; $DIR/ext-all-debug-p09.js
    head $1 --lines 27420 &#124; tail --lines 2569 &#62; $DIR/ext-all-debug-p10.js
    head $1 --lines 31057 &#124; tail --lines 3637 &#62; $DIR/ext-all-debug-p11.js
    tail $1 --lines 3285 &#62; $DIR/ext-all-debug-p12.js
else
    echo -e ' Questo script funziona solamente con la versione 2.1 di extjs\n' \
         'In particolare seziona il file ext-all-debug.js'
fi</pre>
</blockquote>
<p>Come primo parametro va il path della libreria, ext-all-degub.js, come secondo il path dove andare a salvare i vari spezzoni.</p>
<p>Includere i tag script corrispondenti, salare, mettere in forno e debuggare quanto basta. :)</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Vezető PHP fejlesztő]]></title>
<link>http://spillerlaszlo.wordpress.com/?p=234</link>
<pubDate>Thu, 17 Jul 2008 12:53:28 +0000</pubDate>
<dc:creator>Spiller László</dc:creator>
<guid>http://spillerlaszlo.pt-br.wordpress.com/?p=234</guid>
<description><![CDATA[Média területen piacvezető multinacionális cégcsoporthoz keresünk munkatársakat Web 2.0 és k]]></description>
<content:encoded><![CDATA[<p>Média területen piacvezető multinacionális cégcsoporthoz keresünk munkatársakat Web 2.0 és közösségi portál témájú projektekhez. A cégcsoport több olyan oldalt is üzemeltet, melyek a világ leglátogatottabb 100 weboldala, illetve Magyarország leglátogatottabb 10 weboldala között szerepelnek. Az új fejlesztések mind a tartalom, mind pedig az alkalmazott technológiák alapján szintén a világ élvonalába tartoznak. Komoly, tőkeerős háttér biztosítja a nyugodt munkát, a kiemelt bérezést és a szakmai fejlődést.</p>
<p>A Feladat:</p>
<ul>
<li>PHP alapú nemzetközi portálrendszerek fejlesztése egy professzionális csapatban</li>
<li>Meglévő rendszerek továbbfejlesztése, illetve kreatív új ötletek kidolgozása<br />
 </li>
</ul>
<p>Szakmai elvárások:</p>
<ul>
<li>Min. 3+ év fejlesztési tapasztalat</li>
<li>Magas fokú PHP (5) ismeretek</li>
<li>Erős és alapos SQL ismeretek (MySQL 5.x)</li>
<li>Objektum Orientált programozási háttér (Java vagy C++) vagy OOP teljes körű ismerete</li>
<li>Javascript és Javascript könyvtárakban szerzett tapasztalat (jQuery, prototype, ExtJS)</li>
<li>SVN vagy CVS tapasztalat</li>
<li>Nyílt forráskódú technológiák az alapos ismerete (PHP, MySQL, memcache)</li>
<li>CSS és HTML részletes ismerete</li>
<li>Kiváló csapatjátékos, specifikáció alapján önálló, koncentrált munkavégzés</li>
<li>Junior fejlesztők munkájának koordinálása</li>
<li>Jó szóbeli és írásbeli kommunikációs készség</li>
<li>Megbízható, megfontolt személyiség</li>
<li>Szakmai angol szöveg megértése<br />
 </li>
</ul>
<p>Előnyt jelent:</p>
<ul>
<li>Szakirányú végzettség, szakmai képzések</li>
<li>PHP-s keretrendszer vagy keretrendszerek használatában szerzet tapasztalat</li>
<li>Szoftverfejlesztésben szerzett tapasztalat (UML nem követelmény, de előny)</li>
<li>Szakmai cikkek olvasása, szakmai tudás önállóan történő szinten tartása, fejlesztése<br />
 </li>
</ul>
<p>Amit kínálunk:</p>
<ul>
<li>A legmodernebb technológiák használata</li>
<li>Fiatal, dinamikus csapat</li>
<li>Szakmai támogatás és tudásbázis a munkavégzéshez</li>
<li>Folyamatos fejlődés, kihívások</li>
<li>Nemzetközi karrierlehetőség</li>
<li>Kiemelkedő bérezés: Tapasztalattól és szakmai tudástól függően.</li>
<li>Cafeteria rendszer, céges tréningek, szakmai utak<br />
 </li>
</ul>
<p>Munkaidő, helyszÍn:</p>
<ul>
<li>Modern, jól felszerelt iroda Budapest központjában</li>
<li>Napi fix, nyolc órás munkaidő</li>
</ul>
<p><a href="mailto:laszlo_spiller@kellyservices.hu">laszlo_spiller@kellyservices.hu</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[JUNIOR PHP FEJLESZTŐ]]></title>
<link>http://spillerlaszlo.wordpress.com/?p=218</link>
<pubDate>Thu, 17 Jul 2008 11:56:24 +0000</pubDate>
<dc:creator>Spiller László</dc:creator>
<guid>http://spillerlaszlo.pt-br.wordpress.com/?p=218</guid>
<description><![CDATA[Média területen piacvezető multinacionális cégcsoporthoz keresünk munkatársakat Web 2.0 és k]]></description>
<content:encoded><![CDATA[<p>Média területen piacvezető multinacionális cégcsoporthoz keresünk munkatársakat Web 2.0 és közösségi portál témájú projektekhez. A cégcsoport több olyan oldalt is üzemeltet, melyek a világ leglátogatottabb 100 weboldala, illetve Magyarország leglátogatottabb 10 weboldala között szerepelnek. Az új fejlesztések mind a tartalom, mind pedig az alkalmazott technológiák alapján szintén a világ élvonalába tartoznak. Komoly, tőkeerős háttér biztosítja a nyugodt munkát, a kiemelt bérezést és a szakmai fejlődést.</p>
<p>Feladatok:</p>
<ul>
<li>Nagy látogatottságú, PHP alapú portálrendszerek, illetve közösségi oldalak fejlesztése egy professzionális csapat tagjaként</li>
</ul>
<p>Szakmai elvárások:</p>
<ul>
<li>Szakirányú felsőfokú végzettség</li>
<li>PHP tapasztalat</li>
<li>Objektum-orientált fejlesztésbeli jártasság</li>
<li>SQL ismeretek</li>
<li>Szakmai angol szöveg megértése</li>
<li>A feladattal, illetve a munkával kapcsolatban érzett szenvedély és igényesség</li>
<li>Új technológiák megtanulására való hajlandóság <br />
 </li>
</ul>
<p>Előnyt jelent:</p>
<ul>
<li>MySQL ismerete</li>
<li>CSS és HTML ismerete</li>
<li>JavaScript ismeretek, ezen belül kiemelten JQuery, illetve ExtJS használatában szerzett tapasztalat</li>
<li>Verziókezelő rendszer ismerete (CVS, SVN)<br />
 </li>
</ul>
<p>Amit kínálunk:</p>
<ul>
<li>Kiemelkedő bérezés</li>
<li>Fiatal, dinamikus, ugyanakkor professzionális csapat</li>
<li>Szakmai támogatás és tudásbázis a munkavégzéshez</li>
<li>Folyamatos fejlődés, kihívások</li>
<li>Nemzetközi karrierlehetőség</li>
<li>Cafeteria rendszer<br />
 </li>
</ul>
<p>Munkaidő, helyszín:</p>
<ul>
<li>Modern, jól felszerelt irodánk Budapest központjában található</li>
<li>Napi fix, nyolc órás munkaidő</li>
</ul>
<p><a href="mailto:laszlo_spiller@kellyservices.hu">laszlo_spiller@kellyservices.hu</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[First thought on ExtJS]]></title>
<link>http://sidtalk.wordpress.com/?p=58</link>
<pubDate>Mon, 07 Jul 2008 23:12:46 +0000</pubDate>
<dc:creator>sid</dc:creator>
<guid>http://sidtalk.pt-br.wordpress.com/2008/07/07/first-thought-on-extjs/</guid>
<description><![CDATA[I&#8217;ve worked with ExtJS for a while now and feel happy with it. The main reason is that I found]]></description>
<content:encoded><![CDATA[<p>I've worked with <a href="http://extjs.com/">ExtJS</a> for a while now and feel happy with it. The main reason is that I found some similarities on the API design between ExtJS and Swing. I know this would be weird for some of you. But it does make sense for me because I've worked with Swing before :) But, don't panic, it doesn't mean you need to know about Swing before working with ExtJS. There's nothing related between them. It just that I feel familiar to how it works (reading the <a href="http://extjs.com/deploy/dev/docs/">API</a>, Grid, GridPanel, CellSelectionModel :P) and that is a big advantage for me.</p>
<p>Moreover, the ongoing project that I'm involved seems to have high demands on richness UI (<a href="http://extjs.com/deploy/dev/examples/samples.html">look at their samples</a>). And ExtJS does cover majority of UI controls and has a well designed for extensibility. Besides, the document is good and the community is very active. Another nice thing of ExtJS is it allows you to build the library based on what you need which helps reducing the library size with less effort.</p>
<p>If you're working with Rails, you might want to check an example <a href="http://extjs.com/learn/Tutorial:Using_Ext_Grid_with_Ruby_on_Rails">here</a>. Although Rails seems to get along fine with ExtJS but I think there could be a less effort way to work between them. And there is a <a href="http://agilewebdevelopment.com/plugins/search?search=extjs">couple of plugins</a> that might be useful. I'll report back soon after I really checked them out :)</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Панели: Библиотека ExtJS для новичков]]></title>
<link>http://techworkru.wordpress.com/?p=493</link>
<pubDate>Tue, 30 Sep 2008 07:15:16 +0000</pubDate>
<dc:creator>techworkru</dc:creator>
<guid>http://techwork.ru/2008/09/30/extjs-panels/</guid>
<description><![CDATA[Эта статья является продолжением учебника по библиоте]]></description>
<content:encoded><![CDATA[<p>Эта статья является продолжением <a href="http://techwork.ru/extjs-book/">учебника по библиотеке компонентов <strong>ExtJS</strong></a>, используемой для создания web-приложений с функциональным интерфейсом пользователя.</p>
<p>Теперь мы перейдем к рассмотрению одного из базовых типов визуальных компонентов библиотеки - <strong>панели</strong>. Панель - это контейнер визуальных элементов, который выполняет роль базового блока при построении пользовательских интерфейсов web-приложений. Панель может содержать верхний и нижний тулбар (панель инструментов) и раздельные секции для заголовка, тела и подвала. Этот компонент также поддерживает функции сворачивания содержимого и набор встроенных кнопок, позволяющих выполнять стандартные действия.</p>
<p>Откроем созданный в прошлом разделе файл helloworld.html в Firefox и вызовем по нажатию клавиши <strong>F12</strong> отладчик Firebug. Перейдя на вкладку <strong>Console</strong> и, отобразив полностью редактор кода, введем новую команду:</p>
<pre>test = new Ext.Panel({
title: "Панелька",
html: "список: &#60;li&#62;раз&#60;/li&#62;" +
"&#60;li&#62;два&#60;/li&#62;&#60;li&#62;три&#60;/li&#62;"
})</pre>
<p>Для исполнения команды нажмем комбинацию Ctrl-Enter. В области выполненного кода отобразится зеленая строка, обозначающая объект JavaScript, который был получен в результате запуска команды:</p>
<p><a href="http://techworkru.wordpress.com/files/2008/09/panels1.png"><img class="aligncenter size-large wp-image-497" title="Создание объекта-панели" src="http://techworkru.wordpress.com/files/2008/09/panels1.png?w=620" alt="" width="620" height="408" /></a></p>
<p>Рассмотрим ее подробнее: первым делом мы создаем переменную test, которой присваиваем новый объект, возвращаемый конструктором класса <strong>Ext.Panel</strong> (ключевое слово языка JavaScript - <strong>new</strong> и название класса). В параметрах конструктора нового объекта задается составной объект (фигурные скобки), содержащий текстовые свойства <strong>title</strong> и <strong>html</strong>, соответственно представляющие собой заголовок панели и ее содержимое в формате HTML. В этом примере мы продемонстрируем возможности задания произвольной разметки текста, выведя на экран пример списка.<!--more--></p>
<p>Выполним следующую команду, которая на основе параметров только что созданного объекта добавит в объектную модель документа (DOM) новые элементы, представляющие собой создаваемую панель. Такое действие в терминах библиотеки называется <strong>рендер компонента</strong> (а соответствующий метод также носит название <strong>render</strong>). Вызовем этот метод у созданного объекта <strong>test</strong>, ассоциированного с нашей панелью, и передадим ему в качестве параметра ссылку на DOM элемент body документа, возвращаемый методом <strong>Ext.getBody()</strong>:</p>
<pre>test.render(Ext.getBody())</pre>
<p>В общем случае метод render должен получать в качестве параметра строковый идентификатор или ссылку на объект любого DOM-элемента, к которому будет добавлен HTML-код для его отображения (рендера). В данном случае в качестве такого родительского элемента мы используем все окно браузера (DOM-элемент <strong>body</strong>).</p>
<p>После выполнения последней команды на экране отобразится голубая панелька с заголовком <em>Панелька</em> и ранее заданным списком:</p>
<p><a href="http://techworkru.files.wordpress.com/2008/09/panels2.png"><img class="aligncenter size-large wp-image-498" title="Рендер панели" src="http://techworkru.wordpress.com/files/2008/09/panels2.png?w=620" alt="" width="620" height="408" /></a></p>
<p>Далее попробуем упростить создание панели, заменив две последовательные команды одной и указав DOM-элемент, который будет являться родительским для компонента, напрямую в параметрах его конструктора в свойстве <strong>renderTo</strong>. Для проверки работы этого метода нажмем на клавишу F5 и после сброса документа helloworld.html в первоначальный вид выполним команду:</p>
<pre>test = new Ext.Panel({
 title: "Панелька",
 renderTo: Ext.getBody(),
 html: "список: &#60;li&#62;раз&#60;/li&#62;" +
       "&#60;li&#62;два&#60;/li&#62;&#60;li&#62;три&#60;/li&#62;"
})</pre>
<p><a href="http://techworkru.files.wordpress.com/2008/09/panels3.png"><img class="aligncenter size-large wp-image-499" title="Панель одной командой" src="http://techworkru.wordpress.com/files/2008/09/panels3.png?w=620" alt="" width="620" height="408" /></a></p>
<p>Согласитесь, гораздо удобнее. Задание DOM-элемента в конструкторе компонента рекомендуется всякий раз, когда нет необходимости откладывать его отображение в зависимости от каких-либо условий.</p>
<p>Давайте определимся, что объект, передаваемый конструктору класса каждого создаваемого компонента, будем в дальнейшем называть <strong>конфигурацией компонента</strong>. Свойства, которые допускается указывать в конфигурации описаны в разделе <em>Config Options</em> каждого компонента на <a href="http://extjs.com/deploy/dev/docs/" target="_blank">страницах документации библиотеки ExtJS</a>.</p>
<p>Что представляет из себя только что созданный объект test? Щелкнем по зеленой строке Object initialConifg=<em>Object</em> title=<em>Панелька</em> events=<em>Object</em> и переместимся на вкладку <strong>DOM</strong> этого элемента. Здесь представлены доступные переменные и свойства объекта, а также функции, которые доступны для вызова. Для примера перейдем к свойству <strong>initialConfig</strong> и увидим конфигурацию панели на момент создания. Это очень удобный способ отладки поведения компонентов, которым в дальнейшем мы часто будем пользоваться:</p>
<p><a href="http://techworkru.files.wordpress.com/2008/09/panels4.png"><img class="aligncenter size-large wp-image-514" title="DOM-элемент" src="http://techworkru.wordpress.com/files/2008/09/panels4.png?w=620" alt="" width="620" height="408" /></a></p>
<p>Перейдем на вкладку <strong>HTML </strong>и развернем дерево элементов, являющихся дочерними по отношению к тегу body (к которому мы привязали новый компонент). Это внутреннее представление созданной нами панели в формате HTML. Мы видим, что базовым элементом панели является контейнер div, имеющий автоматически созданный идентификатор <strong>ext-comp-1001</strong> и CSS класс <strong>x-panel</strong>. В свою очередь он содержит два других div-а, представляющих собой соответственно заголовок панели и ее тело (и содержащие заданные при создании компонента параметры <em>Панелька</em> и <em>список...</em>). Таким образом, эти DOM-элементы с накладываемыми на них стилями CSS представляют собой визуальные компоненты библиотеки ExtJS:</p>
<p><a href="http://techworkru.files.wordpress.com/2008/09/panels5.png"><img class="aligncenter size-large wp-image-515" title="HTML-представление панели" src="http://techworkru.wordpress.com/files/2008/09/panels5.png?w=620" alt="" width="620" height="408" /></a></p>
<p>Попробуем далее поэкспериментировать с компонентом и вызовем последовательно методы объекта test:</p>
<pre>test.hide();

test.show();

test.collapse();

test.expand();</pre>
<p>Первые два выполняют скрытие и повторное отображение визуального компонента (любого компонента, а не только типа Panel!), другие наоборот являются методами класса Panel и организуют сворачивание и восстановление тела панели, по возможности используя визуальные эффекты.</p>
<p>Снова не открою большой тайны, если напомню, что все доступные методы и свойства компонента описаны в документации библиотеки ExtJS. Давайте откроем страницу компонента Panel и поиграемся с некоторыми из них.</p>
<pre>test.setWidth(300)</pre>
<p>Устанавливает ширину визуального компонента (в нашем случае 300 пикселей):</p>
<p><a href="http://techworkru.files.wordpress.com/2008/09/panels6.png"><img class="aligncenter size-large wp-image-500" title="Установка ширины компонента" src="http://techworkru.wordpress.com/files/2008/09/panels6.png?w=620" alt="" width="620" height="408" /></a></p>
<p>Имейте ввиду, что по-умолчанию ширина каждого компонента без ее явного указания считается как auto, то есть равной ширине родительского DOM-элемента (в нашем случае панель была равна ширине окна браузера, так как тег body является базовым элементом).</p>
<p>Попробуем изменить содержимое тела панели:</p>
<p>test.body.dom.innerHTML = "Новости нашего сайта!"</p>
<p><a href="http://techworkru.files.wordpress.com/2008/09/panels7.png"><img class="aligncenter size-large wp-image-501" title="Изменение содержимого панели" src="http://techworkru.wordpress.com/files/2008/09/panels7.png?w=620" alt="" width="620" height="408" /></a></p>
<p>Команда обращается к свойству body объекта test, содержащему ссылку на класс <strong>Element, </strong>который в свою очередь через свойство dom ссылается на DOM-элемент тела панели, и через свойство innerHTML которого, мы присваиваем новое содержимое. Для удобства понимания этой взаимосвязи можете перейти на вкладку DOM и проследовав по дереву <strong>body -&#62; dom -&#62; innerHTML</strong> визуально запомнить структуру.</p>
<p>Давайте попробуем выполнить следующее действие - полное удаление компонента из документа:</p>
<p>test.destroy()</p>
<p>Перейдем на вкладку HTML и убедимся, что имевшаяся ранее DOM-структура панели уничтожена, а элемент body больше не содержит дочерних объектов:</p>
<p><a href="http://techworkru.files.wordpress.com/2008/09/panels8.png"><img class="aligncenter size-large wp-image-502" title="Уничтожение компонента" src="http://techworkru.wordpress.com/files/2008/09/panels8.png?w=620" alt="" width="620" height="408" /></a></p>
<p><strong>Перейти далее к разделу </strong><strong><a title="Библиотека ExtJS для новичков" rel="bookmark" href="http://techwork.ru/2008/10/01/extjs-buttons/">Кнопки…</a></strong></p>
<p><strong>Перейти к </strong><strong><a title="Библиотека ExtJS для новичков" rel="bookmark" href="http://techwork.ru/extjs-book/">содержанию Учебника по ExtJS</a></strong></p>
<p><strong>Мы помогли Вам? Вы можете <a href="http://techwork.ru/extjs-book/donate/">поддержать дальнейшее создание учебника по ExtJS</a>.</strong></p>
]]></content:encoded>
</item>

</channel>
</rss>
