source code

De volledige flash source code van de drupal tutorials uit wdm 34 en wdm 36 zijn hier te downloaden.

Voor meer informatie over de dpdk actionscript library en drupal kun je terecht op www.dpdk.nl/opensource.

een eerdere presentatie van dpdk over drupal en flash op het adobe user group xl event is te vinden op augxl.dpdk.nl

Drupal en Flash Advanced Demo

You are missing some Flash content that should appear here! Perhaps your browser cannot display it, or maybe it did not initialize correctly.

  1. package nl.webdesignermagazine {
  2. 	import flash.events.MouseEvent;
  3.  
  4. 	import fl.controls.TextInput;
  5. 	import fl.controls.Button;
  6. 	import fl.controls.DataGrid;
  7.  
  8. 	import nl.dpdk.utils.ColorCalculations;
  9. 	import nl.dpdk.utils.URLUtils;
  10.  
  11. 	import fl.controls.TextArea;
  12. 	import fl.events.ListEvent;
  13.  
  14. 	import nl.dpdk.services.gephyr.DrupalData;
  15. 	import nl.dpdk.services.gephyr.DrupalProxy;
  16. 	import nl.dpdk.services.gephyr.DrupalUtils;
  17.  
  18. 	import flash.display.MovieClip;
  19.  
  20. 	/**
  21. 	 * authenticatie, custom modules, cck, views
  22. 	 * login, node.save, extra parameters voor nodes ophalen met minder data
  23. 	 *
  24. 	 */
  25. 	public class DrupalAdvancedDemo extends MovieClip {
  26. 		private var proxy : DrupalProxy;
  27. 		// alle assets die op de flash stage staan / de main timeline
  28. 		public var output_txt : TextArea;
  29. 		public var data_grid : DataGrid;
  30. 		public var save_btn : Button;
  31. 		public var title_txt : TextInput;
  32. 		public var body_txt : TextInput;
  33. 		public var url_txt : TextInput;
  34.  
  35. 		public function DrupalAdvancedDemo() {
  36. 			trace("DrupalAdvancedDemo.DrupalAdvancedDemo()");
  37. 			// maak een instantie aan van de DrupalProxy en configureer deze met de url naar de drupal services voor amfphp
  38. 			proxy = new DrupalProxy("http://webdesignermagazine.dpdk.nl/services/amfphp", DrupalProxy.VERSION_6);
  39. 			// we hebben de sessies en authenticatie niet aangezet, dit kun je zelf uitproberen op je eigen site.
  40. 			// proxy = new DrupalProxy("http://webdesignermagazine.dpdk.nl/services/amfphp", DrupalProxy.VERSION_6 true, "67021648cdcc96b7a40557381b927ef2", "webdesignermagazine.dpdk.nl");
  41.  
  42. 			// zet de globale error handler. De functie onDrupalError wordt aangeroepen als er errors op treden die niet op remote functie aanroep niveau plaatsvinden.
  43. 			proxy.setErrorHandler(onDrupalError);
  44.  
  45. 			/*
  46. 			 * maak voor iedere methode die we op de drupal installatie aanroepen een functie die het resultaat afhandelt en een functie die een fout afhandelt
  47. 			 * omdat we met sessies werken moeten we eerst een anonieme sessie Id krijgen en moeten we system.connect als eerste aanroepen.
  48. 			 * 
  49. 			 */
  50. 			proxy.setHandler("node", "get", onNodeGetResult, onNodeGetStatus);
  51. 			proxy.setHandler("node", "save", onNodeSaveResult, onNodeSaveStatus);
  52. 			proxy.setHandler("views", "get", onViewsGetResult, onViewsGetStatus);
  53. 			proxy.setHandler("system", "connect", onSystemConnectResult, onSystemConnectStatus);
  54. 			proxy.setHandler("wdm", "test", onWdmTestResult, onWdmTestStatus);
  55.  
  56. 			/*
  57. 			 * we configureren de dataGrid flash component hieronder. Dit is een van de standaard flash as3 componenten, meer info kun je vinden in de flash help
  58. 			 * We detecteren de klik op een rij uit de lijst van de datagrid
  59. 			 * We detecteren de rollover op een rij uit de lijst van de datagrid
  60. 			 * We definieren ook de kolomnamen, deze namen gebruiken we ook om data op de juiste plek te krijgen
  61. 			 */
  62. 			data_grid.addEventListener(ListEvent.ITEM_CLICK, onDataGridItemClicked);
  63. 			data_grid.addEventListener(ListEvent.ITEM_ROLL_OVER, onDataGridItemOver);
  64. 			data_grid.columns = ["nid", "title", "url"];
  65. 			data_grid.getColumnAt(0).width = 30;
  66. 			data_grid.getColumnAt(1).width = 200;
  67.  
  68. 			save_btn.addEventListener(MouseEvent.CLICK, onSave);
  69.  
  70. 			// roep system.connect aan om een sessie Id te krijgen en laat het de gebruiker weten dat we data ophalen
  71. 			proxy.invoke("system", "connect");
  72. 			output("system.connect, ophalen session ID...");
  73. 		}
  74.  
  75. 		/**
  76. 		 * de functie die uitgevoerd wordt als we succesvol 'system.connect' hebben aangeroepen.
  77. 		 * Vanuit hier gaat ook de sequentie van het ophalen van data door, aangezien dit de eerste "verplichte" call is. 
  78. 		 */
  79. 		private function onSystemConnectResult(data : DrupalData) : void {
  80. 			// we hebben nu een geldig sessie ID, deze is bij een gelukte call naar system.connect automatisch opgeslagen op de proxy.
  81. 			// en zal automatisch gebruikt worden bij de verdere communicatie met drupal.
  82. 			output("onSystemConnectResult() session ID: " + proxy.getSessionId());
  83.  
  84. 			// we gaan door met het ophalen van data van een view. De view heet 'downloads' en we roepen 'views.get' aan.
  85. 			proxy.invoke("views", "get", "downloads");
  86. 			// we roepen ook meteen de wdm.test methode aan, die uit onze custom module komt
  87. 			proxy.invoke("wdm", "test", "dit is de tekst uit flash om de wdm service te testen");
  88. 			// geef wat informatie aan de eindgebruiker over wat hem te wachten staat.
  89. 			output("ga over de rijen in het grid om meer informatie te verkrijgen over het item. Alle informatie komt uit de view 'downloads' vanuit drupal.");
  90. 		}
  91.  
  92. 		/**
  93. 		 * de functie die uitgevoerd wordt als we niet succesvol 'system.connect' hebben aangeroepen 
  94. 		 */
  95. 		private function onSystemConnectStatus(data : DrupalData) : void {
  96. 			// er is iets mis, laat het de gebruiker weten. Tevens zal er hierna dan niets meer gebeuren aangezien we geen verdere calls naar drupal doen
  97. 			output("onSystemConnectStatus(): " + data.getMessage(), "#ff0000");
  98. 		}
  99.  
  100. 		/**
  101. 		 * de functie die uitgevoerd wordt als we succesvol 'wdm.test' hebben aangeroepen.
  102. 		 */
  103. 		private function onWdmTestResult(data : DrupalData) : void {
  104. 			output("onWdmTestResult(): " + data.getData(), "#0000ff");
  105. 		}
  106.  
  107. 		/**
  108. 		 * de functie die uitgevoerd wordt als we niet succesvol 'wdm.test' hebben aangeroepen 
  109. 		 */
  110. 		private function onWdmTestStatus(data : DrupalData) : void {
  111. 			output("onWdmTestStatus(): " + data.getMessage(), "#ff0000");
  112. 		}
  113.  
  114. 		/**
  115. 		 * de functie die uitgevoerd wordt als we  succesvol 'views.get' hebben aangeroepen 
  116. 		 */
  117. 		private function onViewsGetResult(data : DrupalData) : void {
  118. 			output("onViewsGetResult()");
  119. 			// het resultaat van de call gaan we manipuleren om in de datagrid te zetten
  120. 			// haal de specifieke data op uit het drupaldata object
  121. 			var result : * = data.getData();
  122. 			//de variabele die we alvast declareren voor het gebruik in de loop zometeen om de data van een rij uit het resultaat op te slaan.
  123. 			var row : Object;
  124. 			// als er al data in het grid stond, haal het dan weg
  125. 			data_grid.removeAll();
  126. 			// loop over alle rijen van het resultaat heen, de view geeft een array van data terug met node data (in een ander formaat dan wanneer je een enkele node ophaalt)
  127. 			for (var i : int = 0;i < result.length;++i) {
  128. 				row = result[i];
  129. 				// voeg aan het datagrid nu een object toe met data.
  130. 				// alle object properties die dezelfde naam hebben als de kolomnamen die we eerder hebben gemaakt, kunnen we zien in de desbetreffende kolommen.
  131. 				// alle object props die niet dezelfde naam hebben, zien we niet. Deze kunnen we straks wel gebruiken als we de data weer ophalen/nodig hebben
  132. 				//let vooral even op de benaming die de view heeft gegeven aan de url. deze geeft de oorsprong aan van het veld via een naamgevingsconventie
  133. 				var item : Object = {nid:row.nid, title:row.node_title, url:row.node_data_field_url_field_url_value, body:row.node_revisions_body};
  134. 				data_grid.addItem(item);
  135. 			}
  136. 		}
  137.  
  138. 		/**
  139. 		 * de functie die uitgevoerd wordt als we niet succesvol 'views.get' hebben aangeroepen 
  140. 		 */
  141. 		private function onViewsGetStatus(data : DrupalData) : void {
  142. 			output("onViewsGetStatus(): " + data.getMessage(), "#ff0000");
  143. 		}
  144.  
  145. 		/**
  146. 		 * de event listener voor het drukken op de 'save' knop.
  147. 		 * We gaan hier proberen een node van het type 'download' op te slaan
  148. 		 */
  149. 		private function onSave(event : MouseEvent) : void {
  150. 			// eerst kijken we of alle data min of meer goed ingevuld is...
  151. 			if (title_txt.text == "" || body_txt.text == "" || url_txt.text == "" || title_txt.text == "title" || body_txt.text == "body" || url_txt.text == "url") {
  152. 				output("Een van de velden is niet goed ingevuld", "#ff0000");
  153. 				return;
  154. 			}
  155.  
  156. 			// ja, goed ingevuld, maak een nieuwe node aan
  157. 			// een nieuwe node is een standaard object, met minimaal de properties 'type', 'title', 'body', 'created' en 'nid'.
  158. 			// we gebruiken hiervoor een makkelijke functie uit de DrupalUtils class. nid 0 betekent dat we een nieuwe node aanmaken
  159. 			var node : * = DrupalUtils.createNode("download", title_txt.text, body_txt.text, 0);
  160. 			// omdat we met de content construction kit (cck) een nieuwe type node hebben gemaakt ('download'),
  161. 			// heeft de cck voor ons een nieuwe property aangemaakt, namelijk een array met de naam field_url (cck property naam).
  162. 			// cck maakt hier altijd arrays van, en we zullen ons voor het opslaan van de node hieraan moeten conformeren.
  163. 			// hoe de datastructuur van de node met type download eruit ziet kun je zien bij de services tester van drupal door enkel de node op te halen (views geeft namelijk een andere 'kijk' op de data)
  164. 			node.field_url = new Array();
  165. 			node.field_url[0] = new Array();
  166. 			node.field_url[0].value = url_txt.text;
  167. 			// roep de service method aan, met als argument het node object dat we zojuist hebben gemaakt.
  168. 			// als nid 0 is dan sla je een nieuwe node op en anders overschrijf je een bestaande node (als je de permissies daarvoor hebt)
  169. 			proxy.invoke("node", "save", node);
  170. 		}
  171.  
  172. 		/**
  173. 		 * de functie die uitgevoerd wordt als we succesvol 'node.save' hebben aangeroepen 
  174. 		 */
  175. 		private function onNodeSaveResult(data : DrupalData) : void {
  176. 			// succes, de node van type 'download' is opgeslagen
  177. 			// haal dan nu de view data opnieuw op zodat we de grid kunnen vullen met de nieuwe node erbij.
  178. 			proxy.invoke("views", "get", "downloads");
  179. 			// de velden maken we weer even leeg.
  180. 			title_txt.text = body_txt.text = url_txt.text = "";
  181. 		}
  182.  
  183. 		/**
  184. 		 * de functie die uitgevoerd wordt als we een fout bij 'node.save' hebben aangeroepen 
  185. 		 */
  186. 		private function onNodeSaveStatus(data : DrupalData) : void {
  187. 			output("onNodeSaveStatus(): " + data.getMessage(), "#ff0000");
  188. 		}
  189.  
  190. 		/**
  191. 		 * event handler voor als we over een kolom uit het datagrid gaan
  192. 		 */
  193. 		private function onDataGridItemOver(event : ListEvent) : void {
  194. 			// dit is het data item dat hoort bij de specifieke rij waar we overheen gaan met onze muis
  195. 			var item : * = event.item;
  196. 			// maak een random kleur aan voor de display
  197. 			var textColor : String = "#" + ColorCalculations.getHexValue(Math.random() * 0xffffff);
  198. 			// geef de tekst weer die behoort bij de beschrijving van de rij waar we overheen rollen
  199. 			// dit is de body tekst van de Drupal Node met type "Download"
  200. 			// 'body' is de naam die we zelf gegeven hebben aan de body data toen het binnenkwam bij views.get
  201. 			output(item.body, textColor);
  202. 		}
  203.  
  204. 		/**
  205. 		 * event handler voor als we op een kolom uit het datagrid klikken
  206. 		 */
  207. 		private function onDataGridItemClicked(event : ListEvent) : void {
  208. 			// dit is het data item dat hoort bij de specifieke rij waar we op klikken gaan met onze muis
  209. 			var item : * = event.item;
  210. 			// alle properties die wij in het datagrid hebben gezet kunnen we weer uitlezen
  211. 			trace(item.nid);
  212. 			trace(item.title);
  213. 			trace(item.url);
  214. 			trace(item.body);
  215. 			// we gaan naar de url (download url)
  216. 			URLUtils.getURL(item.url);
  217. 		}
  218.  
  219. 		/**
  220. 		 * Methode die het resultaat afhandelt van succesvolle calls naar "node.get"
  221. 		 * @param data DrupalData een DrupalData object dat automatisch wordt meegegeven door de DrupalProxy
  222. 		 */
  223. 		private function onNodeGetResult(data : DrupalData) : void {
  224. 			// het DrupalData object heeft een methode die de resultaat data ophaalt uit het object.
  225. 			var result : * = data.getData();
  226.  
  227. 			// output de volledige node, geformatteerd met print_r
  228. 			output(DrupalUtils.print_r(result, "nodeGetResult"), "#ff9900");
  229.  
  230. 			/*
  231. 			 * het interessante aan node data is dat we ieder veld van het node object apart kunnen benaderen (ook van nodes gemaakt met de cck, content construction kit)
  232. 			 * Deze data kunnen we op allerlei manieren gebruiken in onze flash file
  233. 			 * afhankelijk van het type van de node en de opbouw hiervan kunnen nodes andere velden hebben.
  234. 			 */
  235.  
  236. 			output("body: " + result.body, "#027acc");
  237. 			output("node id: " + result.nid, "#000000");
  238. 			output("type: " + result.type, "#027acc");
  239. 			output("title: " + result.title, "#000000");
  240.  
  241. 			if (result.type == "download") {
  242. 				output("download: " + result.field_url[0].value, "#027acc");
  243. 			}
  244. 		}
  245.  
  246. 		/**
  247. 		 * Methode die de status/error afvangt in het geval deze optreedt bij het aanroepen van "node.get"
  248. 		 * @param data DrupalData een DrupalData object dat automatisch wordt meegegeven door de DrupalProxy
  249. 		 * @param data DrupalData een DrupalData object dat automatisch wordt meegegeven door de DrupalProxy
  250. 		 */
  251. 		private function onNodeGetStatus(data : DrupalData) : void {
  252. 			// het DrupalData object heeft een methode die in geval van een error de boodschap van deze error teruggeeft
  253. 			output(data.getMessage(), "ff9900");
  254. 		}
  255.  
  256. 		/**
  257. 		 * de methode die generieke errors afvangt
  258. 		 * @param data DrupalData een DrupalData object dat automatisch wordt meegegeven door de DrupalProxy
  259. 		 */
  260. 		private function onDrupalError(data : DrupalData) : void {
  261. 			output(data.getMessage(), "#ff0000");
  262. 		}
  263.  
  264. 		/**
  265. 		 * een helper methode die een boodschap aan de gebruiker toont
  266. 		 * @param message de boodschap die we willen tonen aan de gebruiker
  267. 		 * @param color de html kleur (formaat #rrggbb) die we aan de boodschap willen geven
  268. 		 */
  269. 		private function output(message : String, color : String = "#11111") : void {
  270. 			// strip de \r uit de boodschap, zodat we geen dubbele line breaks (\r\n) krijgen
  271. 			message = message.replace(/\r/g, "");
  272. 			// vervang html karakters, zodat deze niet geinterpreteerd worden door het html tekst veld in flash
  273. 			message = message.replace(/\</g, "&lt;");
  274. 			message = message.replace(/\>/g, "&gt;");
  275. 			output_txt.htmlText = '<font color="' + color + '">' + message + '</font><br />' + output_txt.htmlText;
  276. 		}
  277. 	}
  278. }
  279.  
  280. </actionscript>

Drupal en Flash Basic Demo

You are missing some Flash content that should appear here! Perhaps your browser cannot display it, or maybe it did not initialize correctly.


De actionscript code behorend bij de demo van de basic tutorial uit webdesignermagazine 34
  1. package nl.webdesignermagazine {
  2. 	import nl.dpdk.services.gephyr.DrupalData;
  3. 	import nl.dpdk.services.gephyr.DrupalProxy;
  4. 	import nl.dpdk.services.gephyr.DrupalUtils;
  5.  
  6. 	import flash.display.MovieClip;
  7.  
  8. 	/**
  9. 	 * Deze "document class", gekoppeld aan de flash movie, bevat de code voor de basic drupal demo voor webdesignermagazine.nl
  10. 	 * zie de .fla file drupal_basic_demo.fla
  11. 	 * Ten tijde van schrijven (februari 2011) is er nog geen goed werkende module voor Drupal 7 en services/amf integratie.
  12. 	 * Deze demo is dan ook enkel geschikt voor Drupal 6.
  13. 	 * 
  14. 	 * 
  15. 	 * 
  16. 	 * @author Rolf Vreijdenberger <rolf@dpdk.nl>
  17. 	 */
  18. 	public class DrupalBasicDemo extends MovieClip {
  19. 		// een referentie naar de DrupalProxy
  20. 		private var proxy : DrupalProxy;
  21. 		// we declareren deze variabele  hier om het mogelijk te maken om het tekstveld van de fl package toegangkelijk te maken door eclipse/fdt (flash programmeer tool/IDE)
  22. 		public var output_txt : *;
  23.  
  24. 		public function DrupalBasicDemo() {
  25. 			trace("DrupalBasicDemo.DrupalBasicDemo()");
  26. 			// maak een instantie aan van de DrupalProxy en configureer deze met de url naar de drupal services voor amfphp
  27. 			proxy = new DrupalProxy("http://webdesignermagazine.dpdk.nl/services/amfphp");
  28.  
  29. 			// zet de globale error handler. De functie onDrupalError wordt aangeroepen als er errors op treden die niet op remote functie aanroep niveau plaatsvinden.
  30. 			proxy.setErrorHandler(onDrupalError);
  31.  
  32. 			/*
  33. 			 * maak voor iedere methode die we op de drupal installatie aanroepen een functie die het resultaat afhandelt en een functie die een fout afhandelt
  34. 			 * In dit geval doen we dit om de data van een drupal node op te halen via "node.get"
  35. 			 * 
  36. 			 */
  37. 			proxy.setHandler("node", "get", onNodeGetResult, onNodeGetStatus);
  38.  
  39. 			// roep via de DrupalProxy een methode aan op het drupal cms. de "node.get" aanroep krijgt een extra argument mee met het id van de node die we willen hebben.
  40. 			proxy.invoke("node", "get", 1);
  41.  
  42. 			// de node met id 2 is de node waarin deze flash file staat.
  43. 			//proxy.invoke("node", "get", 2);
  44.  
  45. 			output("data wordt opgehaald...");
  46. 		}
  47.  
  48. 		/**
  49. 		 * Methode die het resultaat afhandelt van succesvolle calls naar "node.get"
  50. 		 * @param data DrupalData een DrupalData object dat automatisch wordt meegegeven door de DrupalProxy
  51. 		 */
  52. 		private function onNodeGetResult(data : DrupalData) : void {
  53. 			// het DrupalData object heeft een methode die de resultaat data ophaalt uit het object.
  54. 			var result : * = data.getData();
  55.  
  56. 			// output de volledige node, geformatteerd met print_r
  57. 			output(DrupalUtils.print_r(result, "nodeGetResult"), "#ff9900");
  58.  
  59. 			/*
  60. 			 * het interessante aan node data is dat we ieder veld van het node object apart kunnen benaderen (ook van nodes gemaakt met de cck, content construction kit)
  61. 			 * Deze data kunnen we op allerlei manieren gebruiken in onze flash file
  62. 			 * afhankelijk van het type van de node en de opbouw hiervan kunnen nodes andere velden hebben.
  63. 			 */
  64.  
  65. 			output("body: " + result.body, "#027acc");
  66. 			output("node id: " + result.nid, "#000000");
  67. 			output("type: " + result.type, "#027acc");
  68. 			output("title: " + result.title, "#000000");
  69. 		}
  70.  
  71. 		/**
  72. 		 * Methode die de status/error afvangt in het geval deze optreedt bij het aanroepen van "node.get"
  73. 		 * @param data DrupalData een DrupalData object dat automatisch wordt meegegeven door de DrupalProxy
  74. 		 * @param data DrupalData een DrupalData object dat automatisch wordt meegegeven door de DrupalProxy
  75. 		 */
  76. 		private function onNodeGetStatus(data : DrupalData) : void {
  77. 			// het DrupalData object heeft een methode die in geval van een error de boodschap van deze error teruggeeft
  78. 			output(data.getMessage(), "ff9900");
  79. 		}
  80.  
  81. 		/**
  82. 		 * de methode die generieke errors afvangt
  83. 		 * @param data DrupalData een DrupalData object dat automatisch wordt meegegeven door de DrupalProxy
  84. 		 */
  85. 		private function onDrupalError(data : DrupalData) : void {
  86. 			output(data.getMessage(), "#ff0000");
  87. 		}
  88.  
  89. 		/**
  90. 		 * een helper methode die een boodschap aan de gebruiker toont
  91. 		 * @param message de boodschap die we willen tonen aan de gebruiker
  92. 		 * @param color de html kleur (formaat #rrggbb) die we aan de boodschap willen geven
  93. 		 */
  94. 		private function output(message : String, color : String = "#11111") : void {
  95. 			// strip de \r uit de boodschap, zodat we geen dubbele line breaks (\r\n) krijgen
  96. 			message = message.replace(/\r/g, "");
  97. 			// vervang html karakters, zodat deze niet geinterpreteerd worden door het html tekst veld in flash
  98. 			message = message.replace(/\</g, "&lt;");
  99. 			message = message.replace(/\>/g, "&gt;");
  100. 			output_txt.htmlText = '<font color="' + color + '">' + message + '</font><br />' + output_txt.htmlText;
  101. 		}
  102. 	}
  103. }

Syndicate content