Wednesday, March 7, 2007

Creating an AJAX2PHP Environment

"Как да създадем AJAX2PHP работна среда." Голямо заглавие, а? ;) Тия дни се занимавах точно с това на работа. Реших да имплементирам по най-модерния начин алгоритъма за CRUD на едно типично отношение "много към много". Едностраничен панел със селектбоксове и мениджмънт, опростен до стандартните 2 клика за всяка акция. И благодарение на AJAX-а всичко се опреснява на секундата, без да презарежда страницата. Намерих много добро примерно решение на проблема, само трябваше да се добавят няколко скриващи се формуляра за редакция и да се направи всичко с AJAX.
Всичко беше ясно как трябва да се направи. Съвсем стандартен MVC, който трябва да подсигури една среда за Remote Procedure Calls. Планирах да го направя като standalone, затова всичките функции за CRUD-а се написаха в един бащин клас, през цялата логика се викаше Object Factory и от там $$name->method() присъстваше във всяка RPC функция. Просто и лесно, а резултата е прекрасен.
Логиката беше следната:
  1. Базата данни съдържа три таблици - "потребители", "услуги" и "потребители/услуги". Останалото е ясно ;)
  2. Пише се един бащин клас с основните функции за интерфейса (Create, Read, Update, Delete) по универсален начин за първите две таблици;
  3. Синовете на класа съдържат името на таблицата и полетата от тази таблица в един масив, чрез който се генерират MySQL заявките;
  4. Създава се gateway файла за RPC-тата, където се викат класовите функции на съответните обекти;
  5. JavaScript/AJAX имплементацията на съответните заявки, като резултата след това се изобразява в съответния панел, а списъкът се опреснява;
  6. Имплементация на интерфейса за връзките с 2 мултиселектбокса;
  7. Документация :)
На пръв поглед лесна работа, но в нея се съдържат много фундаментални проблеми около MVC, RPC, DHTML (тия табове с ObjectFactory бяха много интересни..) и като цяло стил на писане в OOP.
Само един проблем обаче ми остана нерешен и неясен. В точка 5 през цялото време трябваше да се опреснява една част от страницата, базирана на резултата от друга, заради AJAX заявките. Всичко беше написано модуларно в PHP логиката и трябваше да се предават параметри, които се връщат от другата страница. PHP-то за листинга и за формулярите винаги трябваше да знае дали става въпрос за потребителите или за услугите. Реших проблема с глобални JavaScript променливи, но със сигурност има по-добри решения. Мисля, че JSON би се включил добре в ситуацията, но още не съм работил с него и дори не знам откъде да чета. Някой ако има предложения да пише в коментарите.

1 comment:

Georgi Mateev said...

Sega namerih kak se pravi poslednoto po eleganten nachin. http://www.phppatterns.com/docs/design/observer_pattern