Я навряд чи помилюся, якщо припущу, що мова РНР досить популярна, якщо не найпопулярніша у веб-розробці. Ми не будемо аналізувати причини цього (а тим більше, слідства), а сконцентруємося на одному невеликому аспекті, а саме - як на РНР розробляти складні AJAX веб-додатки. І не просто так розробляти, а використовувати у своїй роботі бібліотеку ExtJS, яка дозволяє створювати інтерфейси для цих веб-програм. Звичайно, все це можна рознести і серверна сторона, на РНР або будь-якою іншою мовою, абсолютно нічого не буде знати про клієнтську частину і AJAX-бібліотеку, просто оперуючи JSON даними і звичайним HTML. Але можна зробити і по-іншому - цей підхід, аналогічний популярній сьогодні технології Google Web Toolkit. Ми нічого не поділяємо, а просто пишемо додаток, використовуючи одне середовище, одну мову і всі можливості (і мови і середовища), а вже сервер самостійно генерує код для клієнта, повністю автоматично. Таким чином можна зовсім (ну або майже) не знати і не розбиратися у верстці, JavaScript і ExtJS, але писати програми, які будуть використовувати цей фреймворк.
Для мови Java подібні рішення існують, а нещодавно такий проект, EXT GWT, навіть перейшов під крило самої компанії-розробника ExtJS, перетворившись на цілком серйозне професійне рішення. Ну а як в інших мовах? Java, звичайно, добре і навіть відмінно, але душа і тіло хочуть різноманітності, або просто не хочуть перевчатися. Для таких випадків є свої рішення. І одне з них, для РНР, так і називається - PHP-Ext.
Ця бібліотека представляє собою набір класів, частково повторює класи з ExtJS, які переписані на PHP, при цьому додано механізм генерації вихідного JS-коду, які, власне і відсилається браузеру для виконання. Розробник оперує тільки РНР - підключаємо бібліотеку, ініціалізуємо її, а потім створюємо потрібні нам об'єкти у вигляді РНР-класів, задаємо їм необхідні властивості, а в кінці коду просто викликаємо генерацію JavaScript і відсилаємо її браузеру.
Звичайно ж, такий підхід дозволяє використовувати всі можливості ваших улюблених середовищ розробки - автодополнення синтаксису, підсвічування коду, вбудовані зневадники, інші засоби перевірки коду. - не секрет, що для РНР таких засобів набагато більше, ніж для JavaScript.
Код самої бібліотеки досить великий, але поточна версія повністю сумісна з РНР 5, зокрема, використовує всі доступні можливості ООП. Сам код досить добре документований (хоч і не ідеально), а його структура відповідає стандарту Zend Framework PHP Coding Standard, що саме по собі вже не так часто зустрінеш в аматорських проектах, що розвиваються, тут це показник серйозності розробки і, напевно, надій на її розвиток (а раптом і компанія-розробник ExtJS візьме участь у проекті, так само, як це зроблено з ExtGWT, в такому випадку можна реально говорити про проект-стартап, причому, вельми успішний). Для розробників є кілька прикладів роботи з типовими об'єктами, наприклад, формами - не придумуючи власні приклади, автори бібліотеки просто переробили ті, що йдуть у стандартному постачанні ExtJS, переписавши їх з використанням своєї бібліотеки. Це чудовий спосіб подивитися на її реальні можливості і навіть порівняти генерований код. Ну а для поглибленого вивчення є довідка по API, що генерується за коментарями в коді за допомогою phpDocumentator.
Поки, правда, не всі ще можливості реалізовані, хоча тих, що є, цілком вистачить для побудови відносно складних додатків. У деякі недоліки, з застереженням на новизну проекту, я б записав і використання попередньої версії ExtJS - 2.0.2 (хоча і з 2.0.1 працює), тоді як зараз варто вже орієнтуватися на 2.1. Але це буде поправлено, адже зараз тільки другий реліз під номером 0.8.2, тому поки вважаємо, що просто вдосконалюємо технологію.
Потенціал розвитку бібліотеки дуже великий, зокрема, як шляхом більш повного перенесення всього ExtJS API на бік РНР, так і в бік вдосконалення самої платформи. Наприклад, логічно було б мати у складі генератора коду засоби для стиснення коду, видалення невикористовуваних модулів (виходячи з використовуваних класів та їх залежностей, сервер може на льоту будувати набір необхідних класів і генерувати збірку ExtJS під ваш додаток, поки ж це можна зробити вручну за допомогою он-лайнового конструктора). Поки проект молодий, але розвивається досить швидко і, якщо за його розробкою будуть стояти професіонали і серйозна архітектура, він зможе стати відмінним інструментом для розробки сучасних AJAX-додатків.
На мій же погляд, варіант все ж дещо складний, вірніше, занадто багато коду і роботи з ним для генерації інтерфейсу, при цьому всебічно необхідно чітко собі уявляти, як сторінка генерується і як буде працювати цей JavaScript код, необхідно, мені здається, навіть краще знати ExtJS і його можливості, чим при звичайному варіанті розробки, коли серверна сторона абсолютно не знає про клієнта. А ось якийсь проект, що поєднує шаблонний движок, наприклад, Smarty або Template Lite (мій улюблений) був би просто фантастикою, якщо спростити створення і наповнення складних шаблонів. Водночас, оскільки всі останні версії ExtJS вміють генерувати візуальну частину за JSON-розміткою, наприклад, форми або вікна, то я бачу дуже багато шляхів спрощення серверної частини, яка б генерувала тільки необхідний мінімум JS коду, а основну частину розмітки сторінки - у вигляді JSON-даних. Але це вже зовсім інша архітектура і підхід.
А на останок наведемо один приклад, для того, щоб наочно зрозуміти механізм роботи PHP-Ext. Наступний приклад показує звичайну панель, яка може згортатися і розгортатися, один з найбільш застосовуваних і універсальних віджетів бібліотеки.
1. Так панель виглядає в браузері
2. Так виглядає код на РНР для генерації цієї панелі і завдання її параметрів.
setTitle(""My Panel"")
->setCollapsible(true)
->setRenderTo(PhpExt_Javascript::variable(""Ext.get('centercolumn')""))
->setWidth(400)
->setHtml(PhpExt_Javascript::variable(""Ext.example.bogusMarkup""));
echo PhpExt_Ext::OnReady(
$p->getJavascript(false, ""p"")
);
?>
3. Це код, який РНР-Ext згенерував для відображення цієї форми (без коду самої сторінки і підключення біблітек).
Ext.onReady(function(){
var p = new Ext.Panel({title: 'My Panel',collapsible: true,
renderTo: Ext.get('centercolumn'),width: 400,html:
Ext.example.bogusMarkup});
});
4. А це оригінальний код з прикладів ExtJS
Ext.onReady(function(){
var p = new Ext.Panel({
title: 'My Panel',
collapsible:true,
renderTo: 'container',
width:400,
html: Ext.example.bogusMarkup
});
});
P.S. Крос-пост з мого блогу.