Pomoc - Szukaj - U¿ytkownicy - Kalendarz
Pe³na wersja: Zend Framework i XAJAX
Forum PHP.pl > Forum > XML, AJAX
1maciek
Czy kto¶ ju¿ ³±czy³ Zend Framework i bibliotekê XAJAX?
Albo mo¿e Zend Framework i inn± bibliotekê dla AJAXa?
werek
ja mialem juz do czynienia z xajax i mam gotowe biblioteki na integracje z zend framework

ponizej kod podstawowych:

główna biblioteka:

wrx_Ajax
  1. <?php
  2. require_once('xajax/xajax.inc.php');
  3. class wrx_Ajax {
  4. /**
  5.  * tablica przechowujaca ustawienia
  6.  *
  7.  * @var array
  8.  */
  9. private static $_config=array(
  10. 'requestURI'=>'',
  11. 'prefix'=>'wrxajax_',
  12. 'encoding'=>'utf-8',
  13. 'debug'=>false,
  14. 'xajaxDir'=>'/libs/xajax'
  15. );
  16. /**
  17.  * zmienna przechowujaca instancje xajax
  18.  *
  19.  * @var xajax
  20.  */
  21. private static $_ajax=null;
  22. /**
  23.  * zmienna przechowujaca instancje xajaxResponse
  24.  *
  25.  * @var xajaxResponse
  26.  */
  27. private static $_ajaxResponse=null;
  28. /**
  29.  * ustawia adres do ktorego ma sie odwolac ajax
  30.  *
  31.  * @param string $uri
  32.  */
  33. public static function setRequestURI($uri){
  34. self::$_config['requestURI']=wrx::config()->dir->base.$uri;
  35. }
  36. /**
  37.  * zwraca xajax
  38.  *
  39.  * @return xajax
  40.  */
  41. public static function get(){
  42. if (is_null(self::$_ajax)) {
  43. self::$_config['xajaxDir']=wrx::config()->dir->base.self::$_config['xajaxDir'];
  44. self::$_ajax=new xajax(
  45. self::$_config['requestURI'],
  46. self::$_config['prefix'],
  47. self::$_config['encoding'],
  48. wrx::debug()
  49. );
  50. }
  51. return self::$_ajax;
  52. }
  53. /**
  54.  * zwraca xajaxResponse
  55.  *
  56.  * @return xajaxResponse
  57.  */
  58. public static function getResp(){
  59. if (is_null(self::$_ajaxResponse)) {
  60. self::$_config['xajaxDir']=WRX_BASEURL.self::$_config['xajaxDir'];
  61. self::$_ajaxResponse=new xajaxResponse(
  62. self::$_config['encoding'],
  63. false
  64. );
  65. }
  66. return self::$_ajaxResponse;
  67. }
  68. /**
  69.  * wiaze javascript wygenerowany przez xajax z szablonem na stronie
  70.  *
  71.  */
  72. public static function postSetup(){
  73. wrx_Template::instance()->assign('wrx_Ajax',self::$_ajax->getJavascript(self::$_config['xajaxDir']));
  74. }
  75. /**
  76.  * resetuje instancje xajax i xajaxResponse
  77.  *
  78.  */
  79. public static function reset(){
  80. self::$_ajax=null;
  81. self::$_ajaxResponse=null;
  82. self::setRequestURI('/libs/xajax');
  83. }
  84. /**
  85.  * ustawia grupy funkcji uformowanych w klasy jednoczesnie inicjalizujac
  86.  * klase systemowa wrx_Ajax_Default, grupy funkcji to klasy dziedziczace 
  87.  * po wrx_Ajax_Library ktore leza w przestrzeni nazw aplikacji. 
  88.  * opcjonalnie mozna zarejestrowac grupe ktora nie nalezy do przestrzeni nazw ap
    likacji
  89.  *
  90.  * @param string $groupName
  91.  * @param bool $useNamespace
  92.  */
  93. public static function setupGroup($groupName,$useNamespace=true){
  94. self::setRequestURI('/wrxajax/'.$groupName);
  95. if ($useNamespace) {
  96. $groupName=wrx::config()->appnamespace.'_Ajax_'.$groupName;
  97. }
  98. $obj=new $groupName;
  99. $objWrx=new wrx_Ajax_Default();
  100. self::postSetup();
  101. }
  102. }
  103. ?>


biblioteka po ktorej maja dziedziczyc klasy z konkretnymi funkcjonalnosciami:

wrx_Ajax_Library
  1. <?php
  2. class wrx_Ajax_Library {
  3. /**
  4.  * A prefix for all ajax functions to aid automatic xajax registration
  5.  */
  6. protected $_ajaxFuncPrefix = 'wrxajax';
  7. /**
  8.  * Do things
  9.  */
  10. public function __construct () {
  11. $this->registerFunctions();
  12. }
  13. /**
  14.  * Register all needed functions with xajax.
  15.  * 
  16.  * All ajax function names must begin with self::$ajaxFuncPrefix, followed by
  17.  * an uppercase letter. They will be exported with that name, minus the prefix,
  18.  * and with the first letter in lowercase. So axFoo() would end up as the
  19.  * Javascript function xajax_foo()
  20.  */
  21. protected function registerFunctions() {
  22. $methods = get_class_methods($this);
  23. foreach ($methods as $m) {
  24. $p = $this->_ajaxFuncPrefix;
  25. if (preg_match("/^{$p}[A-Z]/", $m)) {
  26. $m2 = preg_replace("/^{$p}([A-Z])/e", "strtolower('$1')", $m);
  27. wrx_Ajax::get()->registerFunction(array($m2, &$this, $m));
  28. }
  29. }
  30. }
  31. }
  32. ?>


i kontroler do zilustrowania obslugi

  1. <?php
  2. class Ajax_ProcessController extends Zend_Controller_Action {
  3. public function preDispatch(){
  4. //code executed before action
  5. }
  6. public function indexAction(){
  7.  
  8. }
  9. public function runAction(){
  10. $obj=$this->_getParam('ajax_action');
  11. if (!is_null($obj)) {
  12. wrx_Ajax::setupGroup($obj);
  13. wrx_Ajax::get()->processRequests();
  14. }
  15. }
  16. public function __call($func,$args){
  17. $this->_redirect('/');
  18. }
  19. public function postDispatch(){
  20. //code executed after action
  21. }
  22. }
  23. ?>


ogolnie zasada dzialania jest prosta. po wywolaniu jakiejs akcji na samym poczatku wywolujemy wrx_Ajax::setupGroup('grupa') gdzie grupa w domysle to suffix nazwy klasy(w tym wypadku dla namespace wrx bedzie: wrx_Ajax_Group) z metodami do obsluzenia ajax (wedlug standardowego dzialania xajax) zarejestrowane zostana tylko metody z poczatkiem nazwy 'wrxajax' (moje rozszerzenie frameworku zend'a) mozna jako drugi parametr podac "false" i wtedy bedzie brana pod uwage klasa nazywajaca sie "Group" (w tym przykladzie). kazda taka grupa musi dziedziczyc po wrx_Ajax_Library (zawiera metody rejestrujace metody w xajax) jednoczesnie musi istniec jeden adres do ktorego ma sie odwolac ajax.

jezeli potrzebowalbys dokladniejszego opisu dzialania to daj znac na werexx [ at} gmail\.com
XvZOK
a czy widzia³ kto¶ rozwi±zanie w postaci abstrakcyjnej
klasy kontrolera dziedzicz±cego po standardowym kontrolerze ?

Chodzi o to aby to kontroler zajmowa³ siê obs³ug± akcji pochodz±cych zarówno
od standardowych zapytañ jak i AJAXa.

A mo¿e osobny front kontroler czy router ?
NoiseMc
Ja mam zwykle kontrolery ... jedyna roznica polega na tym ze jezeli dostawiony jest /output/json/ lub /output/xml/ do query stringa to wybierany jest inny typ widoku implementujacy Zend_View_Interface aby serwowal innaczej sformatowane dane. ZF rowniez ma metode w kontrolerze akcji isXmlHttpRequest() i moze sprawdzac sam czy request pochodzi bezposrednio z przegladarki czy z XmlHttpRequest. Akcje wykonuja sie tak samo dla html, xml, json, przypisuja do obiektu widoku zmienne, a potem w zaleznosci od parametru sa po prostu inaczej wysylane do uzytkownika. Jak chcesz to dawaj na privv i wysle Ci kawalek kodu.
To jest wersja lo-fi g³ównej zawarto¶ci. Aby zobaczyæ pe³n± wersjê z wiêksz± zawarto¶ci±, obrazkami i formatowaniem proszê kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.