<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
		<id>http://wikiserver.infomerce.es/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Asalinas</id>
		<title>wikiserver - Contribucions de l’usuari [ca]</title>
		<link rel="self" type="application/atom+xml" href="http://wikiserver.infomerce.es/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Asalinas"/>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php/Especial:Contribucions/Asalinas"/>
		<updated>2026-05-09T14:26:22Z</updated>
		<subtitle>Contribucions de l’usuari</subtitle>
		<generator>MediaWiki 1.28.0</generator>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M7_-_Desenvolupament_web_en_entorn_servidor&amp;diff=9962</id>
		<title>M7 - Desenvolupament web en entorn servidor</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M7_-_Desenvolupament_web_en_entorn_servidor&amp;diff=9962"/>
				<updated>2018-03-14T10:28:43Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* UF3:  Tècniques d’accés a dades (20h) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== UF1 : Desenvolupament web en entorn servidor (20h) ==&lt;br /&gt;
=== [[NF1 - Llenguatge PHP (35h)]] ===&lt;br /&gt;
&amp;lt;!--=== [[NF2 - Llenguatge JSP (15h)]] ===--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UF2:  Generació dinàmica de pagines web (30h) ==&lt;br /&gt;
=== [[NF1 - Model Vista Controlador (10h)]] ===&lt;br /&gt;
=== [[NF2 - Framework PHP (15h)]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[NF2 - Framework PHP Symfony 3 (20h)]] ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== [[NF3 - Framework JSP (15h)]] ===--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UF3:  Tècniques d’accés a dades (20h) ==&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;NF1 -Tècniques d’accés a dades (30h)&amp;lt;/span&amp;gt; ===&lt;br /&gt;
[[A1- Accés a BD amb PHP (10h)]]&lt;br /&gt;
&lt;br /&gt;
[[A2- Framework de capes per a DDBB (20h)]]&lt;br /&gt;
&lt;br /&gt;
== UF4: Serveis web. Pàgines dinàmiques interactives. Webs Híbrids (20h) ==&lt;br /&gt;
&amp;lt;!--=== [[Serveis Web i Mashups a PHP]] ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[NF1 - Web Services (30h)]] ===&lt;br /&gt;
!--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Instal%C2%B7laci%C3%B3_de_la_versi%C3%B3_LTS_2.8_de_symfony&amp;diff=8130</id>
		<title>Instal·lació de la versió LTS 2.8 de symfony</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Instal%C2%B7laci%C3%B3_de_la_versi%C3%B3_LTS_2.8_de_symfony&amp;diff=8130"/>
				<updated>2017-03-29T15:49:57Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* Instal·lació Composer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Instal·lació Symfony 2.8 =&lt;br /&gt;
Primer de tot heu de tenir instal·lat apache2 i php5&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install apache2 php  libapache2-mod-php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Instal·lar el programa per baixar-se els paquets anomenat symfony:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo curl -LsS https://symfony.com/installer -o /usr/local/bin/symfony&lt;br /&gt;
&lt;br /&gt;
$ sudo chmod a+x /usr/local/bin/symfony&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anar al directori '''/var/www/html''' i instal·lar els paquets de symfony amb aquesta comanda:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
symfony new nomProjecteSymfony 2.8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Canviar els permisos de la carpeta '''app/cache i app/logs''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod 777 app/cache&lt;br /&gt;
chmod 777 app/logs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Corregir els error d'instal·lació. Normalment son aquests tres:&lt;br /&gt;
* Set the &amp;quot;date.timezone&amp;quot; setting in php.ini* (like Europe/Paris).  &lt;br /&gt;
Per corregir aquest error cal anar al fitxer /etc/php5/apache2/php.ini i al fitxer /etc/php5/cli/php.ini i buscar la configuració de la variable '''date.timezone''' i posar el valor: '''Europe/Madrid'''&lt;br /&gt;
&lt;br /&gt;
* Set &amp;quot;xdebug.max_nesting_level&amp;quot; to e.g. &amp;quot;250&amp;quot; &lt;br /&gt;
Per corregir aquest error modifiqueu el fitxer/etc/php5/mods-available/xdebug.ini i afegiu la línia: '''xdebug.max_nesting_level = 250 '''&lt;br /&gt;
&lt;br /&gt;
* Install and enable the intl extension&lt;br /&gt;
Instal·la la extensió intl:&lt;br /&gt;
&amp;lt;pre&amp;gt; sudo apt-get install php5-intl &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Install PDO drivers (mandatory for Doctrine).&lt;br /&gt;
Intal·lació de la BD que s'utilitzarà amb symfony:&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
sudo apt-get install mysql-server&lt;br /&gt;
sudo apt-get install phpmyadmin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalment, comprovar amb aquestes dues comandes que tot funciona correctament:&lt;br /&gt;
* des de terminal: '''sudo php nomProjecteSymfony/app/check.php'''&lt;br /&gt;
* des de navegador: '''http://localhost/nomProjecteSymfony/web/config.php'''&lt;br /&gt;
&lt;br /&gt;
Les dues opcions ha de dir alguna cosa semblant a:&lt;br /&gt;
&amp;lt;pre&amp;gt;                                            &lt;br /&gt;
 [OK]                                          &lt;br /&gt;
 Your system is ready to run Symfony2 projects &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
= Instal·lació Composer =&lt;br /&gt;
1. Baixar-se fitxer composer.phar seguint les instruccions de la web https://getcomposer.org/download/ o bé: &lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
php -r &amp;quot;copy('https://getcomposer.org/installer', 'composer-setup.php');&amp;quot;&lt;br /&gt;
php -r &amp;quot;if (hash_file('SHA384', 'composer-setup.php') === '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;&amp;quot;&lt;br /&gt;
php composer-setup.php&lt;br /&gt;
php -r &amp;quot;unlink('composer-setup.php');&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Moure el fitxer a la carpeta /usr/local/bin amb el nom composer.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
mv composer.phar /usr/local/bin/composer&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Instal%C2%B7laci%C3%B3_de_la_versi%C3%B3_LTS_2.8_de_symfony&amp;diff=8129</id>
		<title>Instal·lació de la versió LTS 2.8 de symfony</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Instal%C2%B7laci%C3%B3_de_la_versi%C3%B3_LTS_2.8_de_symfony&amp;diff=8129"/>
				<updated>2017-03-29T15:49:21Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* Instal·lació Composer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Instal·lació Symfony 2.8 =&lt;br /&gt;
Primer de tot heu de tenir instal·lat apache2 i php5&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install apache2 php  libapache2-mod-php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Instal·lar el programa per baixar-se els paquets anomenat symfony:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo curl -LsS https://symfony.com/installer -o /usr/local/bin/symfony&lt;br /&gt;
&lt;br /&gt;
$ sudo chmod a+x /usr/local/bin/symfony&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anar al directori '''/var/www/html''' i instal·lar els paquets de symfony amb aquesta comanda:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
symfony new nomProjecteSymfony 2.8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Canviar els permisos de la carpeta '''app/cache i app/logs''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod 777 app/cache&lt;br /&gt;
chmod 777 app/logs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Corregir els error d'instal·lació. Normalment son aquests tres:&lt;br /&gt;
* Set the &amp;quot;date.timezone&amp;quot; setting in php.ini* (like Europe/Paris).  &lt;br /&gt;
Per corregir aquest error cal anar al fitxer /etc/php5/apache2/php.ini i al fitxer /etc/php5/cli/php.ini i buscar la configuració de la variable '''date.timezone''' i posar el valor: '''Europe/Madrid'''&lt;br /&gt;
&lt;br /&gt;
* Set &amp;quot;xdebug.max_nesting_level&amp;quot; to e.g. &amp;quot;250&amp;quot; &lt;br /&gt;
Per corregir aquest error modifiqueu el fitxer/etc/php5/mods-available/xdebug.ini i afegiu la línia: '''xdebug.max_nesting_level = 250 '''&lt;br /&gt;
&lt;br /&gt;
* Install and enable the intl extension&lt;br /&gt;
Instal·la la extensió intl:&lt;br /&gt;
&amp;lt;pre&amp;gt; sudo apt-get install php5-intl &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Install PDO drivers (mandatory for Doctrine).&lt;br /&gt;
Intal·lació de la BD que s'utilitzarà amb symfony:&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
sudo apt-get install mysql-server&lt;br /&gt;
sudo apt-get install phpmyadmin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalment, comprovar amb aquestes dues comandes que tot funciona correctament:&lt;br /&gt;
* des de terminal: '''sudo php nomProjecteSymfony/app/check.php'''&lt;br /&gt;
* des de navegador: '''http://localhost/nomProjecteSymfony/web/config.php'''&lt;br /&gt;
&lt;br /&gt;
Les dues opcions ha de dir alguna cosa semblant a:&lt;br /&gt;
&amp;lt;pre&amp;gt;                                            &lt;br /&gt;
 [OK]                                          &lt;br /&gt;
 Your system is ready to run Symfony2 projects &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
= Instal·lació Composer =&lt;br /&gt;
1. Baixar-se fitxer composer.phar seguint les instruccions de la web: https://getcomposer.org/download/ o bé: &lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
php -r &amp;quot;copy('https://getcomposer.org/installer', 'composer-setup.php');&amp;quot;&lt;br /&gt;
php -r &amp;quot;if (hash_file('SHA384', 'composer-setup.php') === '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;&amp;quot;&lt;br /&gt;
php composer-setup.php&lt;br /&gt;
php -r &amp;quot;unlink('composer-setup.php');&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Moure el fitxer a la carpeta /usr/local/bin amb el nom composer:&lt;br /&gt;
exemple:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
mv composer.phar /usr/local/bin/composer&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Instal%C2%B7laci%C3%B3_de_la_versi%C3%B3_LTS_2.8_de_symfony&amp;diff=8128</id>
		<title>Instal·lació de la versió LTS 2.8 de symfony</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Instal%C2%B7laci%C3%B3_de_la_versi%C3%B3_LTS_2.8_de_symfony&amp;diff=8128"/>
				<updated>2017-03-29T15:48:14Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* Instal·lació Composer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Instal·lació Symfony 2.8 =&lt;br /&gt;
Primer de tot heu de tenir instal·lat apache2 i php5&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install apache2 php  libapache2-mod-php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Instal·lar el programa per baixar-se els paquets anomenat symfony:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo curl -LsS https://symfony.com/installer -o /usr/local/bin/symfony&lt;br /&gt;
&lt;br /&gt;
$ sudo chmod a+x /usr/local/bin/symfony&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anar al directori '''/var/www/html''' i instal·lar els paquets de symfony amb aquesta comanda:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
symfony new nomProjecteSymfony 2.8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Canviar els permisos de la carpeta '''app/cache i app/logs''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod 777 app/cache&lt;br /&gt;
chmod 777 app/logs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Corregir els error d'instal·lació. Normalment son aquests tres:&lt;br /&gt;
* Set the &amp;quot;date.timezone&amp;quot; setting in php.ini* (like Europe/Paris).  &lt;br /&gt;
Per corregir aquest error cal anar al fitxer /etc/php5/apache2/php.ini i al fitxer /etc/php5/cli/php.ini i buscar la configuració de la variable '''date.timezone''' i posar el valor: '''Europe/Madrid'''&lt;br /&gt;
&lt;br /&gt;
* Set &amp;quot;xdebug.max_nesting_level&amp;quot; to e.g. &amp;quot;250&amp;quot; &lt;br /&gt;
Per corregir aquest error modifiqueu el fitxer/etc/php5/mods-available/xdebug.ini i afegiu la línia: '''xdebug.max_nesting_level = 250 '''&lt;br /&gt;
&lt;br /&gt;
* Install and enable the intl extension&lt;br /&gt;
Instal·la la extensió intl:&lt;br /&gt;
&amp;lt;pre&amp;gt; sudo apt-get install php5-intl &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Install PDO drivers (mandatory for Doctrine).&lt;br /&gt;
Intal·lació de la BD que s'utilitzarà amb symfony:&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
sudo apt-get install mysql-server&lt;br /&gt;
sudo apt-get install phpmyadmin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalment, comprovar amb aquestes dues comandes que tot funciona correctament:&lt;br /&gt;
* des de terminal: '''sudo php nomProjecteSymfony/app/check.php'''&lt;br /&gt;
* des de navegador: '''http://localhost/nomProjecteSymfony/web/config.php'''&lt;br /&gt;
&lt;br /&gt;
Les dues opcions ha de dir alguna cosa semblant a:&lt;br /&gt;
&amp;lt;pre&amp;gt;                                            &lt;br /&gt;
 [OK]                                          &lt;br /&gt;
 Your system is ready to run Symfony2 projects &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
= Instal·lació Composer =&lt;br /&gt;
1. Baixar-se fitxer composer.phar seguint les [instruccions | https://getcomposer.org/download/]: &lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
php -r &amp;quot;copy('https://getcomposer.org/installer', 'composer-setup.php');&amp;quot;&lt;br /&gt;
php -r &amp;quot;if (hash_file('SHA384', 'composer-setup.php') === '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;&amp;quot;&lt;br /&gt;
php composer-setup.php&lt;br /&gt;
php -r &amp;quot;unlink('composer-setup.php');&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Moure el fitxer a la carpeta /usr/local/bin amb el nom composer:&lt;br /&gt;
exemple:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
mv composer.phar /usr/local/bin/composer&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Instal%C2%B7laci%C3%B3_de_la_versi%C3%B3_LTS_2.8_de_symfony&amp;diff=8127</id>
		<title>Instal·lació de la versió LTS 2.8 de symfony</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Instal%C2%B7laci%C3%B3_de_la_versi%C3%B3_LTS_2.8_de_symfony&amp;diff=8127"/>
				<updated>2017-03-29T15:47:34Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* Instal·lació Symfony 2.8 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Instal·lació Symfony 2.8 =&lt;br /&gt;
Primer de tot heu de tenir instal·lat apache2 i php5&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install apache2 php  libapache2-mod-php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Instal·lar el programa per baixar-se els paquets anomenat symfony:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo curl -LsS https://symfony.com/installer -o /usr/local/bin/symfony&lt;br /&gt;
&lt;br /&gt;
$ sudo chmod a+x /usr/local/bin/symfony&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anar al directori '''/var/www/html''' i instal·lar els paquets de symfony amb aquesta comanda:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
symfony new nomProjecteSymfony 2.8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Canviar els permisos de la carpeta '''app/cache i app/logs''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod 777 app/cache&lt;br /&gt;
chmod 777 app/logs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Corregir els error d'instal·lació. Normalment son aquests tres:&lt;br /&gt;
* Set the &amp;quot;date.timezone&amp;quot; setting in php.ini* (like Europe/Paris).  &lt;br /&gt;
Per corregir aquest error cal anar al fitxer /etc/php5/apache2/php.ini i al fitxer /etc/php5/cli/php.ini i buscar la configuració de la variable '''date.timezone''' i posar el valor: '''Europe/Madrid'''&lt;br /&gt;
&lt;br /&gt;
* Set &amp;quot;xdebug.max_nesting_level&amp;quot; to e.g. &amp;quot;250&amp;quot; &lt;br /&gt;
Per corregir aquest error modifiqueu el fitxer/etc/php5/mods-available/xdebug.ini i afegiu la línia: '''xdebug.max_nesting_level = 250 '''&lt;br /&gt;
&lt;br /&gt;
* Install and enable the intl extension&lt;br /&gt;
Instal·la la extensió intl:&lt;br /&gt;
&amp;lt;pre&amp;gt; sudo apt-get install php5-intl &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Install PDO drivers (mandatory for Doctrine).&lt;br /&gt;
Intal·lació de la BD que s'utilitzarà amb symfony:&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
sudo apt-get install mysql-server&lt;br /&gt;
sudo apt-get install phpmyadmin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalment, comprovar amb aquestes dues comandes que tot funciona correctament:&lt;br /&gt;
* des de terminal: '''sudo php nomProjecteSymfony/app/check.php'''&lt;br /&gt;
* des de navegador: '''http://localhost/nomProjecteSymfony/web/config.php'''&lt;br /&gt;
&lt;br /&gt;
Les dues opcions ha de dir alguna cosa semblant a:&lt;br /&gt;
&amp;lt;pre&amp;gt;                                            &lt;br /&gt;
 [OK]                                          &lt;br /&gt;
 Your system is ready to run Symfony2 projects &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
= Instal·lació Composer =&lt;br /&gt;
1. Baixar-se fitxer composer.phar seguint les instruccions: &lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
php -r &amp;quot;copy('https://getcomposer.org/installer', 'composer-setup.php');&amp;quot;&lt;br /&gt;
php -r &amp;quot;if (hash_file('SHA384', 'composer-setup.php') === '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;&amp;quot;&lt;br /&gt;
php composer-setup.php&lt;br /&gt;
php -r &amp;quot;unlink('composer-setup.php');&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Moure el fitxer a la carpeta /usr/local/bin amb el nom composer:&lt;br /&gt;
exemple:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
mv composer.phar /usr/local/bin/composer&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Instal%C2%B7laci%C3%B3_de_la_versi%C3%B3_LTS_2.8_de_symfony&amp;diff=8126</id>
		<title>Instal·lació de la versió LTS 2.8 de symfony</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Instal%C2%B7laci%C3%B3_de_la_versi%C3%B3_LTS_2.8_de_symfony&amp;diff=8126"/>
				<updated>2017-03-29T14:49:30Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* Instal·lació Symfony 2.8 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Instal·lació Symfony 2.8 =&lt;br /&gt;
Primer de tot heu de tenir instal·lat apache2 i php5&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install apache2 php  libapache2-mod-php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Instal·lar el programa per baixar-se els paquets anomenat symfony:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo curl -LsS https://symfony.com/installer -o /usr/local/bin/symfony&lt;br /&gt;
&lt;br /&gt;
$ sudo chmod a+x /usr/local/bin/symfony&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anar al directori '''/var/www/html''' i instal·lar els paquets de symfony amb aquesta comanda:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
symfony new nomProjecteSymfony 2.8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Canviar els permisos de la carpeta '''app/cache i app/logs''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod 777 app/cache&lt;br /&gt;
chmod 777 app/logs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Corregir els error d'instal·lació. Normalment son aquests tres:&lt;br /&gt;
* Set the &amp;quot;date.timezone&amp;quot; setting in php.ini* (like Europe/Paris).  &lt;br /&gt;
Per corregir aquest error cal anar al fitxer /etc/php5/apache2/php.ini i al fitxer /etc/php5/cli/php.ini i buscar la configuració de la variable '''date.timezone''' i posar el valor: '''Europe/Madrid'''&lt;br /&gt;
&lt;br /&gt;
* Set &amp;quot;xdebug.max_nesting_level&amp;quot; to e.g. &amp;quot;250&amp;quot; &lt;br /&gt;
Per corregir aquest error modifiqueu el fitxer/etc/php5/mods-available/xdebug.ini i afegiu la línia: '''xdebug.max_nesting_level = 250 '''&lt;br /&gt;
&lt;br /&gt;
* Install and enable the intl extension&lt;br /&gt;
Instal·la la extensió intl:&lt;br /&gt;
&amp;lt;pre&amp;gt; sudo apt-get install php5-intl &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Install PDO drivers (mandatory for Doctrine).&lt;br /&gt;
Intal·lació de la BD que s'utilitzarà amb symfony:&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
sudo apt-get install mysql-server&lt;br /&gt;
sudo apt-get install phpmyadmin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalment, comprovar amb aquestes dues comandes que tot funciona correctament:&lt;br /&gt;
* des de terminal: '''sudo php nomProjecteSymfony/app/check.php'''&lt;br /&gt;
* des de navegador: '''http://localhost/nomProjecteSymfony/web/config.php'''&lt;br /&gt;
&lt;br /&gt;
Les dues opcions ha de dir alguna cosa semblant a:&lt;br /&gt;
&amp;lt;pre&amp;gt;                                            &lt;br /&gt;
 [OK]                                          &lt;br /&gt;
 Your system is ready to run Symfony2 projects &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Instal%C2%B7laci%C3%B3_de_la_versi%C3%B3_LTS_2.8_de_symfony&amp;diff=8125</id>
		<title>Instal·lació de la versió LTS 2.8 de symfony</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Instal%C2%B7laci%C3%B3_de_la_versi%C3%B3_LTS_2.8_de_symfony&amp;diff=8125"/>
				<updated>2017-03-29T14:49:06Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* Instal·lació Symfony 2.8 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Instal·lació Symfony 2.8 =&lt;br /&gt;
Primer de tot heu de tenir instal·lat apache2 i php5&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install apache2 php7  libapache2-mod-php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Instal·lar el programa per baixar-se els paquets anomenat symfony:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo curl -LsS https://symfony.com/installer -o /usr/local/bin/symfony&lt;br /&gt;
&lt;br /&gt;
$ sudo chmod a+x /usr/local/bin/symfony&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anar al directori '''/var/www/html''' i instal·lar els paquets de symfony amb aquesta comanda:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
symfony new nomProjecteSymfony 2.8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Canviar els permisos de la carpeta '''app/cache i app/logs''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod 777 app/cache&lt;br /&gt;
chmod 777 app/logs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Corregir els error d'instal·lació. Normalment son aquests tres:&lt;br /&gt;
* Set the &amp;quot;date.timezone&amp;quot; setting in php.ini* (like Europe/Paris).  &lt;br /&gt;
Per corregir aquest error cal anar al fitxer /etc/php5/apache2/php.ini i al fitxer /etc/php5/cli/php.ini i buscar la configuració de la variable '''date.timezone''' i posar el valor: '''Europe/Madrid'''&lt;br /&gt;
&lt;br /&gt;
* Set &amp;quot;xdebug.max_nesting_level&amp;quot; to e.g. &amp;quot;250&amp;quot; &lt;br /&gt;
Per corregir aquest error modifiqueu el fitxer/etc/php5/mods-available/xdebug.ini i afegiu la línia: '''xdebug.max_nesting_level = 250 '''&lt;br /&gt;
&lt;br /&gt;
* Install and enable the intl extension&lt;br /&gt;
Instal·la la extensió intl:&lt;br /&gt;
&amp;lt;pre&amp;gt; sudo apt-get install php5-intl &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Install PDO drivers (mandatory for Doctrine).&lt;br /&gt;
Intal·lació de la BD que s'utilitzarà amb symfony:&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
sudo apt-get install mysql-server&lt;br /&gt;
sudo apt-get install phpmyadmin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalment, comprovar amb aquestes dues comandes que tot funciona correctament:&lt;br /&gt;
* des de terminal: '''sudo php nomProjecteSymfony/app/check.php'''&lt;br /&gt;
* des de navegador: '''http://localhost/nomProjecteSymfony/web/config.php'''&lt;br /&gt;
&lt;br /&gt;
Les dues opcions ha de dir alguna cosa semblant a:&lt;br /&gt;
&amp;lt;pre&amp;gt;                                            &lt;br /&gt;
 [OK]                                          &lt;br /&gt;
 Your system is ready to run Symfony2 projects &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_Estructures_definides_pel_Programador_-_Objectes&amp;diff=7543</id>
		<title>NF1 - Estructures definides pel Programador - Objectes</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_Estructures_definides_pel_Programador_-_Objectes&amp;diff=7543"/>
				<updated>2016-10-11T20:22:33Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* Exercici clase TEXT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectes =&lt;br /&gt;
== Instanciació d'objectes==&lt;br /&gt;
&lt;br /&gt;
La forma més sencilla de crear un nou objecte és amb una intrucció com aquesta :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var obj1 = new Object();&lt;br /&gt;
var obj2 = {};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Això crea un objecte nou, buit i que més tard podem ampliar amb propietats:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var o = {};&lt;br /&gt;
o.name = &amp;quot;Marta&amp;quot;;&lt;br /&gt;
o.feina = &amp;quot;contable&amp;quot;;&lt;br /&gt;
o.antiguitat = 11;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per eliminar una propietat podem utilitzar l'operador ''delete'':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var obj1 = new Object()&lt;br /&gt;
alert(obj1.nombre)   // undefined&lt;br /&gt;
&lt;br /&gt;
obj1.nombre = &amp;quot;mundo&amp;quot;&lt;br /&gt;
alert(obj1.nombre)   // &amp;quot;mundo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
delete obj1.nombre&lt;br /&gt;
&lt;br /&gt;
alert(obj1.nombre)   // undefined otra vez&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per afegir un mètode podem fer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var obj1 = new Object();&lt;br /&gt;
obj1.nombre = &amp;quot;mundo&amp;quot;;&lt;br /&gt;
obj1.saluda = function() { alert(&amp;quot;hola &amp;quot;+this.nombre) };&lt;br /&gt;
obj1.saluda();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
També podem construir objectes de manera literal:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var obj1 = {nombre:&amp;quot;mundo&amp;quot;,&lt;br /&gt;
            saluda: function() { alert(&amp;quot;hola &amp;quot;+this.nombre) }&lt;br /&gt;
};&lt;br /&gt;
obj1.saluda();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I podem accedir als mètodes i a les propietats de diferents maneres:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var obj1 = new Object();&lt;br /&gt;
obj1.nombre = &amp;quot;mundo&amp;quot;;&lt;br /&gt;
obj1.saluda = function() { alert(&amp;quot;hola &amp;quot;+this.nombre) };&lt;br /&gt;
&lt;br /&gt;
alert(&amp;quot;hola &amp;quot; + obj1.nombre);       // Acceso normal&lt;br /&gt;
alert(&amp;quot;hola &amp;quot; + obj1[ &amp;quot;nombre&amp;quot; ]);  // Acceso indexado con un literal&lt;br /&gt;
var prop = &amp;quot;nombre&amp;quot;;&lt;br /&gt;
alert(&amp;quot;hola &amp;quot; + obj1[ prop ]);      // Acceso indexado con una variable&lt;br /&gt;
&lt;br /&gt;
obj1.saluda();         // Invocación normal&lt;br /&gt;
obj1[ &amp;quot;saluda&amp;quot; ]();    // Acceso indexado con un literal&lt;br /&gt;
var func = &amp;quot;saluda&amp;quot;;&lt;br /&gt;
obj1[ func ]();        // Acceso indexado con una variable&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Mètodes privats'''&lt;br /&gt;
Aquesta part ja s'ha vist en el capitol de les funcions, però no està de més tornar a fer una ullada:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var Saludator = function(nom) {&lt;br /&gt;
	this.nombre = nom&lt;br /&gt;
	this.saluda = function() {&lt;br /&gt;
		alert(&amp;quot;hola &amp;quot;+plural(this.nombre))&lt;br /&gt;
	}&lt;br /&gt;
	function plural(n) {&lt;br /&gt;
		return n + &amp;quot;s&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
var obj1 = new Saludator(&amp;quot;mundo&amp;quot;)&lt;br /&gt;
obj1.saluda()&lt;br /&gt;
// obj1.plural()  // fallaría porque plural() es privado&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Els que venim d'un entorn orientat a objectes clàssic trobaran a faltar la encapsulació i la estructuració que implica el concepte de constructor de classe.&lt;br /&gt;
Javascript proporciona aquest mecanisme però d'una manera molt diferent. En Javascript totes les funcions i els objectes tenen una propietat anomenada ''prototype'' que fa referència a un objecte buit de forma inicial. Aquest objecte buit es crea utilitzant la paraula ''new''.&lt;br /&gt;
&lt;br /&gt;
== Prototips i Herència  ==&lt;br /&gt;
&lt;br /&gt;
Analitzarem l'us de la paraula ''new'' a una funció i veurem com la propietat ''prototype'' proporciona propietats per a la nova instància.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function Persona(){}&lt;br /&gt;
&lt;br /&gt;
Persona.prototype.caminar = function(){return true;};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var pere = Persona();&lt;br /&gt;
assert(pere === undefined, &amp;quot;No s'ha creat cap instancia de Persona&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
var jaume = new Persona();&lt;br /&gt;
&lt;br /&gt;
assert(jaume &amp;amp;&amp;amp; jaume.caminar &amp;amp;&amp;amp; jaume.caminar(), &amp;quot;La instancia existeix i el mètode es pot cridar&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podem veure en l'exemple anterior que pere te el valor ''undefined''. Aixó és així per que la funció Persona, si no es crida amb el constructor ''new'' no retorna cap valor.&lt;br /&gt;
Veiem que és veritat, ja que quan el cridem amb el constructor ''new'' Jaume existeix i a més a més té un mètode anomenat ''caminar''.&lt;br /&gt;
&lt;br /&gt;
=== Llavors, què és un prototip?? ===&lt;br /&gt;
&lt;br /&gt;
Un prototype és un objecte del que altres objectes hereten propietats.Aquest objecte pot ser qualsevol objecte.&lt;br /&gt;
L'herència basada en classes no existeix en Javascript, sinó que és herència basada en prototips. Això significa que no hi ha una jerarquia de classes real (amb la seva extends, accés super, etc.), sinó que cada ''classe'' té un objecte de referència (com si fos la seva classe pare) on consultar atributs i mètodes en cas que la nostra classe no els trobi. Podem intentar simular una jerarquia (ull, simular) usant aquests objectes de referència, anomenats prototips, amb una propietat especial que tenen totes les “classes” anomenada prototype. Aquesta propietat és asignable i la seva labor consisteix a guardar un objecte. Vegem-ho amb un exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var Saludator = function(nom) {&lt;br /&gt;
	this.nombre = nom&lt;br /&gt;
	this.saluda = function() {&lt;br /&gt;
		alert(&amp;quot;hola &amp;quot;+this.nombre)&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
// Añade un objeto al prototipo&lt;br /&gt;
Saludator.prototype = {&lt;br /&gt;
	apellido: &amp;quot;cruel&amp;quot;,&lt;br /&gt;
	despide: function() {&lt;br /&gt;
		alert(&amp;quot;adios &amp;quot;+this.nombre+&amp;quot; &amp;quot;+this.apellido)&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
var obj1 = new Saludator(&amp;quot;mundo&amp;quot;)&lt;br /&gt;
obj1.despide() // &amp;quot;adios mundo cruel&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Quins objectes tenen prototip? ====&lt;br /&gt;
&lt;br /&gt;
Tot objecte té un prototip per defecte. Com els prototips són objectes, tots ells tenen un prototip també. Solament hi ha una excepció: el prototip de l'objecte per defecte, al final de la cadena de prototips (Object).&lt;br /&gt;
&lt;br /&gt;
Totes les classes tenen per defecte un objecte prototype buit, com si en crear-les es fes prototype = {}. Per aquesta raó, podem accedir a aquesta variable i assignar-li els atributs d'un en un. El següent exemple és completament equivalent a l'anterior:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var Saludator = function(nom) {&lt;br /&gt;
	this.nombre = nom&lt;br /&gt;
}&lt;br /&gt;
// Añade nuevas propiedades al prototipo&lt;br /&gt;
Saludator.prototype.apellido = &amp;quot;cruel&amp;quot;&lt;br /&gt;
Saludator.prototype.despide = function() {&lt;br /&gt;
	alert(&amp;quot;adios &amp;quot;+this.nombre+&amp;quot; &amp;quot;+this.apellido)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var obj1 = new Saludator(&amp;quot;mundo&amp;quot;)&lt;br /&gt;
obj1.despide() // &amp;quot;adios mundo cruel&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, recapitulem… què deies que era un objecte?&lt;br /&gt;
&lt;br /&gt;
Un objecte en Javascript és una col·lecció qualsevol de parells clau-valor. Si no és un valor primitiu (undefined, null, boolean, number o string) és un objecte.&lt;br /&gt;
&lt;br /&gt;
=== Utilitzant Prototips ===&lt;br /&gt;
&lt;br /&gt;
Estudia aquest codi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function Persona(){&lt;br /&gt;
	this.parat = false;&lt;br /&gt;
	this.caminar = function(){return !this.parat;};&lt;br /&gt;
}&lt;br /&gt;
Persona.prototype.caminar = function(){return this.parat;};&lt;br /&gt;
&lt;br /&gt;
var joan = new Persona();&lt;br /&gt;
&lt;br /&gt;
console.log(joan.caminar()); //La crida a caminar és la crida definida dintre de Persona i no al mètode del prototip&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Això demostra que el membres de la instància creats dintre del constructor bloquejaran les propietats i els mètodes definits amb el mateix nom en el prototip.&lt;br /&gt;
&lt;br /&gt;
=== Com abordar les referències als mètodes i propietats dels prototips ===&lt;br /&gt;
&lt;br /&gt;
Amb els exemples vistos anteriorment, pots arribar a pensar que quan es crea un nou objecte es copien els valors i els mètodes del seu prototip, i si hi ha algún mètode o propietat que s'anomena igual, es sobreescriu el seu valor amb el valor que hi ha en el constructor de l'objecte.&lt;br /&gt;
Si fos així, en el següent codi, el mètode caminar no es podria utilitzar :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function Persona(){&lt;br /&gt;
	this.parat = true;&lt;br /&gt;
}&lt;br /&gt;
var joan = new Persona();&lt;br /&gt;
Persona.prototype.caminar = function(){return this.parat;};&lt;br /&gt;
&lt;br /&gt;
assert(joan.caminar(), &amp;quot;El mètode existeix, fins i tot quan la persona s'ha creat abans.&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Llavors, aixó demostra que no hi ha una copia de propietats si no molt més.&lt;br /&gt;
El que succeeix es que les funcions i mètodes del prototip  s'adjunten a l'objecte construït i es consulta durant la conciliació de les referències de la propietat que es duen a terme en l'objecte. És a dir:&lt;br /&gt;
&lt;br /&gt;
* 1. Quan es fa una referència de propietat a un objecte, es comprova a veure si existeix en el propi objecte, si existeix s'agafa el valor, si no...&lt;br /&gt;
* 2. Es localitza el prototip associat al objecte i es comprova si existeix la propietat, Si existeix es retorna el valor, si no...&lt;br /&gt;
* 3. El valor es ''undefined''&lt;br /&gt;
&lt;br /&gt;
Llavors podem dir que els mètodes i les propietats NO ES COPIEN,  S'ADJUNTEN de forma activa al objecte.&lt;br /&gt;
&lt;br /&gt;
=== Funció constructor d'un objecte ===&lt;br /&gt;
Tots els objectes tenen una referència a la funció que s'ha utilitzat per construir l'objecte. Aquesta propietat s'anomena ''constructor''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function Persona(){&lt;br /&gt;
	this.parat = true;&lt;br /&gt;
}&lt;br /&gt;
var joan = new Persona();&lt;br /&gt;
Persona.prototype.caminar = function(){return this.parat;};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En aquest cas ''joan.constructor'' fa referència a la funció ''Persona()''. Sabem que les funcion son objectes, per tant, aquesta funció té propietats. Una de elles és la propietat ''prototype''.&lt;br /&gt;
Per tant, podem accedir a les propietats i mètodes del prototype des del mateix objecte: ''joan.constructor.prototype.caminar''.&lt;br /&gt;
&lt;br /&gt;
=== Herència amb Prototips ===&lt;br /&gt;
&lt;br /&gt;
Volem crear hereència entre diferents objectes. Analitza el següent codi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function Persona(){}&lt;br /&gt;
Persona.prototype.ballar = function(){alert(&amp;quot;eeeeo&amp;quot;);};&lt;br /&gt;
&lt;br /&gt;
function Alumne(){}&lt;br /&gt;
Alumne.prototype = { ballar : Persona.prototype.ballar};    //fa refència a ballar del mètode de Persona&lt;br /&gt;
&lt;br /&gt;
var joan = new Alumne();&lt;br /&gt;
joan.ballar();&lt;br /&gt;
console.log(joan instanceof Alumne);     //true&lt;br /&gt;
console.log(joan instanceof Persona);    //false&lt;br /&gt;
console.log(joan instanceof Object);     //true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creus que està ben aconseguida la herència? Prova-ho.&lt;br /&gt;
D'aquesta manera estem copiant la funció ''ballar'' definida en Persona en Alumne. ''Però no estem creant herència, estem copiant funcions.''&lt;br /&gt;
Llavors quina tècnica s'utilitza??&lt;br /&gt;
&lt;br /&gt;
El que volem crear és una cadena de prototips per tal que ''Alumne'' pugui ser una ''Persona'' i aquesta a la seva vegada un ''Mamífer'' i aquesta una ''Animal'' i així fins arribar a ''Object''.&lt;br /&gt;
La millor manera de fer-ho és '''utilitzant una instància d'objecte com a prototip'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Subclass.prototype = new SuperClass();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Alumne.prototype = new Persona();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L'exemple anterior quedaria de la següent manera:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function Persona(){}&lt;br /&gt;
Persona.prototype.ballar = function(){alert(&amp;quot;eeeeo&amp;quot;);};&lt;br /&gt;
&lt;br /&gt;
function Alumne(){}&lt;br /&gt;
Alumne.prototype = new Persona();&lt;br /&gt;
&lt;br /&gt;
var joan = new Alumne();&lt;br /&gt;
joan.ballar();          //joan apuntaria a Persona i executaria el mètode de ballar de Persona&lt;br /&gt;
&lt;br /&gt;
console.log(joan instanceof Alumne);      //true    &amp;quot;joan és un alumne&amp;quot;&lt;br /&gt;
console.log(joan instanceof Persona);     //true    &amp;quot;joan és una Persona&amp;quot; &lt;br /&gt;
console.log(joan instanceof Object);      //true    &amp;quot;joan és una Objecte&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Casi casi ho hem aconseguit. L'unic problema es que hem perdut la referència al nostre propi constructor. ''joan.constructor'' apunta a ''Persona'' en compte d'apuntar a ''Alumne''. Com ho solucionem?? fàcil:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function Persona(){}&lt;br /&gt;
Persona.prototype.ballar = function(){alert(&amp;quot;eeeeo&amp;quot;);};&lt;br /&gt;
&lt;br /&gt;
function Alumne(){}&lt;br /&gt;
Alumne.prototype = new Persona();&lt;br /&gt;
Alumne.prototype.constructor = Alumne;&lt;br /&gt;
&lt;br /&gt;
var joan = new Alumne();&lt;br /&gt;
joan.ballar();&lt;br /&gt;
&lt;br /&gt;
console.log(joan instanceof Alumne);      //true&lt;br /&gt;
console.log(joan instanceof Persona);     //true&lt;br /&gt;
console.log(joan instanceof Object);      //true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dibuix amb la cadena de prototips:&lt;br /&gt;
[[Fitxer:cadena_de_prototips.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
=== Exemple d'herència amb prototips ===&lt;br /&gt;
&lt;br /&gt;
Exemple de herència :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// define la clase Person&lt;br /&gt;
function Person() {}&lt;br /&gt;
&lt;br /&gt;
Person.prototype.walk = function(){};&lt;br /&gt;
Person.prototype.sayHello = function(){  alert ('hola');&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// define la clase Student&lt;br /&gt;
function Student() {&lt;br /&gt;
  // Llama al constructor primario&lt;br /&gt;
  Person.call(this);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// hereda Person&lt;br /&gt;
Student.prototype = new Person();&lt;br /&gt;
&lt;br /&gt;
// corrige el puntero del constructor porque apunta a Person&lt;br /&gt;
Student.prototype.constructor = Student;&lt;br /&gt;
 &lt;br /&gt;
// reemplaza el método sayHello&lt;br /&gt;
Student.prototype.sayHello = function(){&lt;br /&gt;
  alert ('hola, soy estudiante');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// agrega el método sayGoodBye&lt;br /&gt;
Student.prototype.sayGoodBye = function(){&lt;br /&gt;
  alert ('adiós');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var student1 = new Student();&lt;br /&gt;
student1.sayHello();&lt;br /&gt;
student1.sayGoodBye();&lt;br /&gt;
&lt;br /&gt;
// comprueba la herencia&lt;br /&gt;
alert(student1 instanceof Person); // true  &lt;br /&gt;
alert(student1 instanceof Student); // true&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Altre Exemple:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function Padre(attPadre) {&lt;br /&gt;
   this.atributoPadre=attPadre;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function Hijo(attHijo, attPadre) {&lt;br /&gt;
   Padre.call(this,attPadre);&lt;br /&gt;
   this.atributoHijo=attHijo;&lt;br /&gt;
}&lt;br /&gt;
Hijo.prototype = new Padre();&lt;br /&gt;
 &lt;br /&gt;
a = new Hijo(2,3);&lt;br /&gt;
alert (a.atributoPadre);&lt;br /&gt;
alert (a.atributoHijo);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercici clase TEXT ==&lt;br /&gt;
Crea una classe TEXT que permeti :&lt;br /&gt;
* Definir una cadena de caràcters d'una mida que es definirà en el constructor&lt;br /&gt;
* Afegir caràcters&lt;br /&gt;
* Saber quantes vocals hi ha en el text&lt;br /&gt;
* Mostrar el text&lt;br /&gt;
&lt;br /&gt;
== Joc de Rol ==&lt;br /&gt;
&lt;br /&gt;
Es vol programar un joc de rol, del que ens han encarregat programar en JavaScript l'esquema dels personatges. Així que ens han donat les següents directrius:&lt;br /&gt;
* S'ha de programar 2 tipus de personantges: Els mags i els monjos.&lt;br /&gt;
* Tots els personatges tenen les següents dades:&lt;br /&gt;
** Nom : una cadena&lt;br /&gt;
** Raça : Pot pendre els següents valors: Humà, Elf, Nan, Orco&lt;br /&gt;
** Força : entre 0 i 20&lt;br /&gt;
** Inteligència : entre 0 i 20&lt;br /&gt;
** Punts de vida màxims : entre 0 i 100&lt;br /&gt;
** Punts de vida actuals : entre 0 i punts de vida màxims&lt;br /&gt;
* Cada personatge té atributs i restriccions específics que es detallen en els següents apartats:&lt;br /&gt;
&lt;br /&gt;
'''Apartat a : Personatge''' &lt;br /&gt;
Escriu la classe Personatge que reuneixi tots els atributs mencionats a l'enunciat. Pe fer-ho implementa:&lt;br /&gt;
* Un constructor que inicialitzi els atributs.&lt;br /&gt;
* Mètodes afegir i aconseguir per a tots els atributs de la classe&lt;br /&gt;
* Mètode imprimeix que mostri per pantalla les dades del personatge.&lt;br /&gt;
&lt;br /&gt;
'''Apartat b : Mag'''&lt;br /&gt;
Escriu la classe mag tenint en compte :&lt;br /&gt;
* Quan es crei un mag no pot tenir una inteligència menor que 17 ni una força mayor que 15.&lt;br /&gt;
* Un mag emmagatzema els noms del encanteris que ha memoritzat. Un mag normal només pot memoritzar 4 encanteris.&lt;br /&gt;
* Crea un mètode anomenat aprenEncanteri que reb un String i memoritza l'encanteri&lt;br /&gt;
* Crea un mètode anomenat llençaEncanteri que reb un parametre que serà un Objecte Personatge que és a qui recau l'encanteri. S'ha de restar 10 punts de vida d'aquest personatge i després s'ha d'esborrar l'encanteri.&lt;br /&gt;
* Escriu el constructor de la classe &lt;br /&gt;
* Escriu el mètode imprimeix per tal que es mostrin les noves dades del personatge&lt;br /&gt;
&lt;br /&gt;
'''Apartat c : Monjo'''&lt;br /&gt;
Escriu la classe Monjo tenint en compte :&lt;br /&gt;
* Quan es crei un monjo no pot tenir una inteligència menor que 12 ni mayor que 16 ni una força menor que 18.&lt;br /&gt;
* Un monjo reça a un Déu. Per tant, s'ha de modificar el constructor per tal que accepti el nom del Déu del que és devot.&lt;br /&gt;
* Un monjo pot curar, per tant, crea un mètode anomentat sanar que reb un personatge i aquest personatge reb 10 punts de vida.&lt;br /&gt;
* Escriu el mètode imprimeix per tal que es mostrin les noves dades del personatge&lt;br /&gt;
&lt;br /&gt;
'''Apartat d : Programa Principal''' &lt;br /&gt;
Crea el programa principal on es crein 2 mags (A,B) i un monjo (C) i realitza les següents accions:&lt;br /&gt;
* Imprimeix les dades dels tres personatges.&lt;br /&gt;
* El mag A aprén 2 encanteris.&lt;br /&gt;
* El mag B aprén 1 encanteri.&lt;br /&gt;
* Imprimeix les dades dels mags.&lt;br /&gt;
* El mag A llença un encanteri sobre el mag B&lt;br /&gt;
* El mag B llença un encanteri sobre el mag A&lt;br /&gt;
* El monjo cura al mag B.&lt;br /&gt;
* El mag A llença un encanteri sobre el mag B.&lt;br /&gt;
* Imprimeix les dades dels tres personatges.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PROFESSORS===&lt;br /&gt;
Crea una classe Persona, que contingui les dades nom, cognoms i edat, es podrà obtenir i modificicar els valors.&lt;br /&gt;
Es haurà de crear una altra classe Professor que baixarà de la classe Persona.&lt;br /&gt;
&lt;br /&gt;
També hi ha una classe ProfessorFixe que heretarà les dades de Professor, a més rebrà com a paràmetre un identificador.&lt;br /&gt;
&lt;br /&gt;
També hi ha una classe ProfessorInteri que heretarà les dades de Professor, a més rebrà com a paràmetre la data que demana l'interinatge.&lt;br /&gt;
&lt;br /&gt;
S'haurà de crear un mètode que mostre les dades de tots els objectes creats. (Nom, cognoms, id, data ...)&lt;br /&gt;
&lt;br /&gt;
S'haurà de crear una classe ListaProfe que contindrà un array on s'aniran emmagatzemant els objectes de ProfeFixe, ProfeInteri i Profes per això hi ha d'haver un mètode insertarProfe i un altre obtenerProfe i per últim mostrarProfes&lt;br /&gt;
&lt;br /&gt;
Insertar 3 profesInteri, 3 profesFixe i 3 Professors.&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&lt;br /&gt;
John Resig, Bear Bibeault, &amp;quot;Secrets of the Javascript Ninja&amp;quot;, Manning Publications, 2012. ISBN 193398869X&lt;br /&gt;
&lt;br /&gt;
[http://albertovilches.com/profundizando-en-javascript-parte-2-objetos-prototipos-herencia-y-namespaces  albertovilches]&lt;br /&gt;
&lt;br /&gt;
[https://developer.mozilla.org/es/docs/Web msdn-firefox]&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_Estructures_definides_pel_Programador_-_Objectes&amp;diff=7542</id>
		<title>NF1 - Estructures definides pel Programador - Objectes</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_Estructures_definides_pel_Programador_-_Objectes&amp;diff=7542"/>
				<updated>2016-10-11T20:21:53Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectes =&lt;br /&gt;
== Instanciació d'objectes==&lt;br /&gt;
&lt;br /&gt;
La forma més sencilla de crear un nou objecte és amb una intrucció com aquesta :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var obj1 = new Object();&lt;br /&gt;
var obj2 = {};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Això crea un objecte nou, buit i que més tard podem ampliar amb propietats:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var o = {};&lt;br /&gt;
o.name = &amp;quot;Marta&amp;quot;;&lt;br /&gt;
o.feina = &amp;quot;contable&amp;quot;;&lt;br /&gt;
o.antiguitat = 11;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per eliminar una propietat podem utilitzar l'operador ''delete'':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var obj1 = new Object()&lt;br /&gt;
alert(obj1.nombre)   // undefined&lt;br /&gt;
&lt;br /&gt;
obj1.nombre = &amp;quot;mundo&amp;quot;&lt;br /&gt;
alert(obj1.nombre)   // &amp;quot;mundo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
delete obj1.nombre&lt;br /&gt;
&lt;br /&gt;
alert(obj1.nombre)   // undefined otra vez&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per afegir un mètode podem fer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var obj1 = new Object();&lt;br /&gt;
obj1.nombre = &amp;quot;mundo&amp;quot;;&lt;br /&gt;
obj1.saluda = function() { alert(&amp;quot;hola &amp;quot;+this.nombre) };&lt;br /&gt;
obj1.saluda();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
També podem construir objectes de manera literal:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var obj1 = {nombre:&amp;quot;mundo&amp;quot;,&lt;br /&gt;
            saluda: function() { alert(&amp;quot;hola &amp;quot;+this.nombre) }&lt;br /&gt;
};&lt;br /&gt;
obj1.saluda();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I podem accedir als mètodes i a les propietats de diferents maneres:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var obj1 = new Object();&lt;br /&gt;
obj1.nombre = &amp;quot;mundo&amp;quot;;&lt;br /&gt;
obj1.saluda = function() { alert(&amp;quot;hola &amp;quot;+this.nombre) };&lt;br /&gt;
&lt;br /&gt;
alert(&amp;quot;hola &amp;quot; + obj1.nombre);       // Acceso normal&lt;br /&gt;
alert(&amp;quot;hola &amp;quot; + obj1[ &amp;quot;nombre&amp;quot; ]);  // Acceso indexado con un literal&lt;br /&gt;
var prop = &amp;quot;nombre&amp;quot;;&lt;br /&gt;
alert(&amp;quot;hola &amp;quot; + obj1[ prop ]);      // Acceso indexado con una variable&lt;br /&gt;
&lt;br /&gt;
obj1.saluda();         // Invocación normal&lt;br /&gt;
obj1[ &amp;quot;saluda&amp;quot; ]();    // Acceso indexado con un literal&lt;br /&gt;
var func = &amp;quot;saluda&amp;quot;;&lt;br /&gt;
obj1[ func ]();        // Acceso indexado con una variable&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Mètodes privats'''&lt;br /&gt;
Aquesta part ja s'ha vist en el capitol de les funcions, però no està de més tornar a fer una ullada:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var Saludator = function(nom) {&lt;br /&gt;
	this.nombre = nom&lt;br /&gt;
	this.saluda = function() {&lt;br /&gt;
		alert(&amp;quot;hola &amp;quot;+plural(this.nombre))&lt;br /&gt;
	}&lt;br /&gt;
	function plural(n) {&lt;br /&gt;
		return n + &amp;quot;s&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
var obj1 = new Saludator(&amp;quot;mundo&amp;quot;)&lt;br /&gt;
obj1.saluda()&lt;br /&gt;
// obj1.plural()  // fallaría porque plural() es privado&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Els que venim d'un entorn orientat a objectes clàssic trobaran a faltar la encapsulació i la estructuració que implica el concepte de constructor de classe.&lt;br /&gt;
Javascript proporciona aquest mecanisme però d'una manera molt diferent. En Javascript totes les funcions i els objectes tenen una propietat anomenada ''prototype'' que fa referència a un objecte buit de forma inicial. Aquest objecte buit es crea utilitzant la paraula ''new''.&lt;br /&gt;
&lt;br /&gt;
== Prototips i Herència  ==&lt;br /&gt;
&lt;br /&gt;
Analitzarem l'us de la paraula ''new'' a una funció i veurem com la propietat ''prototype'' proporciona propietats per a la nova instància.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function Persona(){}&lt;br /&gt;
&lt;br /&gt;
Persona.prototype.caminar = function(){return true;};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var pere = Persona();&lt;br /&gt;
assert(pere === undefined, &amp;quot;No s'ha creat cap instancia de Persona&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
var jaume = new Persona();&lt;br /&gt;
&lt;br /&gt;
assert(jaume &amp;amp;&amp;amp; jaume.caminar &amp;amp;&amp;amp; jaume.caminar(), &amp;quot;La instancia existeix i el mètode es pot cridar&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podem veure en l'exemple anterior que pere te el valor ''undefined''. Aixó és així per que la funció Persona, si no es crida amb el constructor ''new'' no retorna cap valor.&lt;br /&gt;
Veiem que és veritat, ja que quan el cridem amb el constructor ''new'' Jaume existeix i a més a més té un mètode anomenat ''caminar''.&lt;br /&gt;
&lt;br /&gt;
=== Llavors, què és un prototip?? ===&lt;br /&gt;
&lt;br /&gt;
Un prototype és un objecte del que altres objectes hereten propietats.Aquest objecte pot ser qualsevol objecte.&lt;br /&gt;
L'herència basada en classes no existeix en Javascript, sinó que és herència basada en prototips. Això significa que no hi ha una jerarquia de classes real (amb la seva extends, accés super, etc.), sinó que cada ''classe'' té un objecte de referència (com si fos la seva classe pare) on consultar atributs i mètodes en cas que la nostra classe no els trobi. Podem intentar simular una jerarquia (ull, simular) usant aquests objectes de referència, anomenats prototips, amb una propietat especial que tenen totes les “classes” anomenada prototype. Aquesta propietat és asignable i la seva labor consisteix a guardar un objecte. Vegem-ho amb un exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var Saludator = function(nom) {&lt;br /&gt;
	this.nombre = nom&lt;br /&gt;
	this.saluda = function() {&lt;br /&gt;
		alert(&amp;quot;hola &amp;quot;+this.nombre)&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
// Añade un objeto al prototipo&lt;br /&gt;
Saludator.prototype = {&lt;br /&gt;
	apellido: &amp;quot;cruel&amp;quot;,&lt;br /&gt;
	despide: function() {&lt;br /&gt;
		alert(&amp;quot;adios &amp;quot;+this.nombre+&amp;quot; &amp;quot;+this.apellido)&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
var obj1 = new Saludator(&amp;quot;mundo&amp;quot;)&lt;br /&gt;
obj1.despide() // &amp;quot;adios mundo cruel&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Quins objectes tenen prototip? ====&lt;br /&gt;
&lt;br /&gt;
Tot objecte té un prototip per defecte. Com els prototips són objectes, tots ells tenen un prototip també. Solament hi ha una excepció: el prototip de l'objecte per defecte, al final de la cadena de prototips (Object).&lt;br /&gt;
&lt;br /&gt;
Totes les classes tenen per defecte un objecte prototype buit, com si en crear-les es fes prototype = {}. Per aquesta raó, podem accedir a aquesta variable i assignar-li els atributs d'un en un. El següent exemple és completament equivalent a l'anterior:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var Saludator = function(nom) {&lt;br /&gt;
	this.nombre = nom&lt;br /&gt;
}&lt;br /&gt;
// Añade nuevas propiedades al prototipo&lt;br /&gt;
Saludator.prototype.apellido = &amp;quot;cruel&amp;quot;&lt;br /&gt;
Saludator.prototype.despide = function() {&lt;br /&gt;
	alert(&amp;quot;adios &amp;quot;+this.nombre+&amp;quot; &amp;quot;+this.apellido)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var obj1 = new Saludator(&amp;quot;mundo&amp;quot;)&lt;br /&gt;
obj1.despide() // &amp;quot;adios mundo cruel&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, recapitulem… què deies que era un objecte?&lt;br /&gt;
&lt;br /&gt;
Un objecte en Javascript és una col·lecció qualsevol de parells clau-valor. Si no és un valor primitiu (undefined, null, boolean, number o string) és un objecte.&lt;br /&gt;
&lt;br /&gt;
=== Utilitzant Prototips ===&lt;br /&gt;
&lt;br /&gt;
Estudia aquest codi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function Persona(){&lt;br /&gt;
	this.parat = false;&lt;br /&gt;
	this.caminar = function(){return !this.parat;};&lt;br /&gt;
}&lt;br /&gt;
Persona.prototype.caminar = function(){return this.parat;};&lt;br /&gt;
&lt;br /&gt;
var joan = new Persona();&lt;br /&gt;
&lt;br /&gt;
console.log(joan.caminar()); //La crida a caminar és la crida definida dintre de Persona i no al mètode del prototip&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Això demostra que el membres de la instància creats dintre del constructor bloquejaran les propietats i els mètodes definits amb el mateix nom en el prototip.&lt;br /&gt;
&lt;br /&gt;
=== Com abordar les referències als mètodes i propietats dels prototips ===&lt;br /&gt;
&lt;br /&gt;
Amb els exemples vistos anteriorment, pots arribar a pensar que quan es crea un nou objecte es copien els valors i els mètodes del seu prototip, i si hi ha algún mètode o propietat que s'anomena igual, es sobreescriu el seu valor amb el valor que hi ha en el constructor de l'objecte.&lt;br /&gt;
Si fos així, en el següent codi, el mètode caminar no es podria utilitzar :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function Persona(){&lt;br /&gt;
	this.parat = true;&lt;br /&gt;
}&lt;br /&gt;
var joan = new Persona();&lt;br /&gt;
Persona.prototype.caminar = function(){return this.parat;};&lt;br /&gt;
&lt;br /&gt;
assert(joan.caminar(), &amp;quot;El mètode existeix, fins i tot quan la persona s'ha creat abans.&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Llavors, aixó demostra que no hi ha una copia de propietats si no molt més.&lt;br /&gt;
El que succeeix es que les funcions i mètodes del prototip  s'adjunten a l'objecte construït i es consulta durant la conciliació de les referències de la propietat que es duen a terme en l'objecte. És a dir:&lt;br /&gt;
&lt;br /&gt;
* 1. Quan es fa una referència de propietat a un objecte, es comprova a veure si existeix en el propi objecte, si existeix s'agafa el valor, si no...&lt;br /&gt;
* 2. Es localitza el prototip associat al objecte i es comprova si existeix la propietat, Si existeix es retorna el valor, si no...&lt;br /&gt;
* 3. El valor es ''undefined''&lt;br /&gt;
&lt;br /&gt;
Llavors podem dir que els mètodes i les propietats NO ES COPIEN,  S'ADJUNTEN de forma activa al objecte.&lt;br /&gt;
&lt;br /&gt;
=== Funció constructor d'un objecte ===&lt;br /&gt;
Tots els objectes tenen una referència a la funció que s'ha utilitzat per construir l'objecte. Aquesta propietat s'anomena ''constructor''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function Persona(){&lt;br /&gt;
	this.parat = true;&lt;br /&gt;
}&lt;br /&gt;
var joan = new Persona();&lt;br /&gt;
Persona.prototype.caminar = function(){return this.parat;};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En aquest cas ''joan.constructor'' fa referència a la funció ''Persona()''. Sabem que les funcion son objectes, per tant, aquesta funció té propietats. Una de elles és la propietat ''prototype''.&lt;br /&gt;
Per tant, podem accedir a les propietats i mètodes del prototype des del mateix objecte: ''joan.constructor.prototype.caminar''.&lt;br /&gt;
&lt;br /&gt;
=== Herència amb Prototips ===&lt;br /&gt;
&lt;br /&gt;
Volem crear hereència entre diferents objectes. Analitza el següent codi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function Persona(){}&lt;br /&gt;
Persona.prototype.ballar = function(){alert(&amp;quot;eeeeo&amp;quot;);};&lt;br /&gt;
&lt;br /&gt;
function Alumne(){}&lt;br /&gt;
Alumne.prototype = { ballar : Persona.prototype.ballar};    //fa refència a ballar del mètode de Persona&lt;br /&gt;
&lt;br /&gt;
var joan = new Alumne();&lt;br /&gt;
joan.ballar();&lt;br /&gt;
console.log(joan instanceof Alumne);     //true&lt;br /&gt;
console.log(joan instanceof Persona);    //false&lt;br /&gt;
console.log(joan instanceof Object);     //true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creus que està ben aconseguida la herència? Prova-ho.&lt;br /&gt;
D'aquesta manera estem copiant la funció ''ballar'' definida en Persona en Alumne. ''Però no estem creant herència, estem copiant funcions.''&lt;br /&gt;
Llavors quina tècnica s'utilitza??&lt;br /&gt;
&lt;br /&gt;
El que volem crear és una cadena de prototips per tal que ''Alumne'' pugui ser una ''Persona'' i aquesta a la seva vegada un ''Mamífer'' i aquesta una ''Animal'' i així fins arribar a ''Object''.&lt;br /&gt;
La millor manera de fer-ho és '''utilitzant una instància d'objecte com a prototip'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Subclass.prototype = new SuperClass();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Alumne.prototype = new Persona();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L'exemple anterior quedaria de la següent manera:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function Persona(){}&lt;br /&gt;
Persona.prototype.ballar = function(){alert(&amp;quot;eeeeo&amp;quot;);};&lt;br /&gt;
&lt;br /&gt;
function Alumne(){}&lt;br /&gt;
Alumne.prototype = new Persona();&lt;br /&gt;
&lt;br /&gt;
var joan = new Alumne();&lt;br /&gt;
joan.ballar();          //joan apuntaria a Persona i executaria el mètode de ballar de Persona&lt;br /&gt;
&lt;br /&gt;
console.log(joan instanceof Alumne);      //true    &amp;quot;joan és un alumne&amp;quot;&lt;br /&gt;
console.log(joan instanceof Persona);     //true    &amp;quot;joan és una Persona&amp;quot; &lt;br /&gt;
console.log(joan instanceof Object);      //true    &amp;quot;joan és una Objecte&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Casi casi ho hem aconseguit. L'unic problema es que hem perdut la referència al nostre propi constructor. ''joan.constructor'' apunta a ''Persona'' en compte d'apuntar a ''Alumne''. Com ho solucionem?? fàcil:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function Persona(){}&lt;br /&gt;
Persona.prototype.ballar = function(){alert(&amp;quot;eeeeo&amp;quot;);};&lt;br /&gt;
&lt;br /&gt;
function Alumne(){}&lt;br /&gt;
Alumne.prototype = new Persona();&lt;br /&gt;
Alumne.prototype.constructor = Alumne;&lt;br /&gt;
&lt;br /&gt;
var joan = new Alumne();&lt;br /&gt;
joan.ballar();&lt;br /&gt;
&lt;br /&gt;
console.log(joan instanceof Alumne);      //true&lt;br /&gt;
console.log(joan instanceof Persona);     //true&lt;br /&gt;
console.log(joan instanceof Object);      //true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dibuix amb la cadena de prototips:&lt;br /&gt;
[[Fitxer:cadena_de_prototips.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
=== Exemple d'herència amb prototips ===&lt;br /&gt;
&lt;br /&gt;
Exemple de herència :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// define la clase Person&lt;br /&gt;
function Person() {}&lt;br /&gt;
&lt;br /&gt;
Person.prototype.walk = function(){};&lt;br /&gt;
Person.prototype.sayHello = function(){  alert ('hola');&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// define la clase Student&lt;br /&gt;
function Student() {&lt;br /&gt;
  // Llama al constructor primario&lt;br /&gt;
  Person.call(this);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// hereda Person&lt;br /&gt;
Student.prototype = new Person();&lt;br /&gt;
&lt;br /&gt;
// corrige el puntero del constructor porque apunta a Person&lt;br /&gt;
Student.prototype.constructor = Student;&lt;br /&gt;
 &lt;br /&gt;
// reemplaza el método sayHello&lt;br /&gt;
Student.prototype.sayHello = function(){&lt;br /&gt;
  alert ('hola, soy estudiante');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// agrega el método sayGoodBye&lt;br /&gt;
Student.prototype.sayGoodBye = function(){&lt;br /&gt;
  alert ('adiós');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var student1 = new Student();&lt;br /&gt;
student1.sayHello();&lt;br /&gt;
student1.sayGoodBye();&lt;br /&gt;
&lt;br /&gt;
// comprueba la herencia&lt;br /&gt;
alert(student1 instanceof Person); // true  &lt;br /&gt;
alert(student1 instanceof Student); // true&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Altre Exemple:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function Padre(attPadre) {&lt;br /&gt;
   this.atributoPadre=attPadre;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function Hijo(attHijo, attPadre) {&lt;br /&gt;
   Padre.call(this,attPadre);&lt;br /&gt;
   this.atributoHijo=attHijo;&lt;br /&gt;
}&lt;br /&gt;
Hijo.prototype = new Padre();&lt;br /&gt;
 &lt;br /&gt;
a = new Hijo(2,3);&lt;br /&gt;
alert (a.atributoPadre);&lt;br /&gt;
alert (a.atributoHijo);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercici clase TEXT ==&lt;br /&gt;
Crea una classe TEXT que permeti :&lt;br /&gt;
* Definir una cadena de caràcters d'una mida que es definirà en el constructor&lt;br /&gt;
* Afegir caràcters&lt;br /&gt;
* Saber quantes vocals hi ha en el text&lt;br /&gt;
* Mostrar el text&lt;br /&gt;
&lt;br /&gt;
:[[solucio classe text]]&lt;br /&gt;
&lt;br /&gt;
== Joc de Rol ==&lt;br /&gt;
&lt;br /&gt;
Es vol programar un joc de rol, del que ens han encarregat programar en JavaScript l'esquema dels personatges. Així que ens han donat les següents directrius:&lt;br /&gt;
* S'ha de programar 2 tipus de personantges: Els mags i els monjos.&lt;br /&gt;
* Tots els personatges tenen les següents dades:&lt;br /&gt;
** Nom : una cadena&lt;br /&gt;
** Raça : Pot pendre els següents valors: Humà, Elf, Nan, Orco&lt;br /&gt;
** Força : entre 0 i 20&lt;br /&gt;
** Inteligència : entre 0 i 20&lt;br /&gt;
** Punts de vida màxims : entre 0 i 100&lt;br /&gt;
** Punts de vida actuals : entre 0 i punts de vida màxims&lt;br /&gt;
* Cada personatge té atributs i restriccions específics que es detallen en els següents apartats:&lt;br /&gt;
&lt;br /&gt;
'''Apartat a : Personatge''' &lt;br /&gt;
Escriu la classe Personatge que reuneixi tots els atributs mencionats a l'enunciat. Pe fer-ho implementa:&lt;br /&gt;
* Un constructor que inicialitzi els atributs.&lt;br /&gt;
* Mètodes afegir i aconseguir per a tots els atributs de la classe&lt;br /&gt;
* Mètode imprimeix que mostri per pantalla les dades del personatge.&lt;br /&gt;
&lt;br /&gt;
'''Apartat b : Mag'''&lt;br /&gt;
Escriu la classe mag tenint en compte :&lt;br /&gt;
* Quan es crei un mag no pot tenir una inteligència menor que 17 ni una força mayor que 15.&lt;br /&gt;
* Un mag emmagatzema els noms del encanteris que ha memoritzat. Un mag normal només pot memoritzar 4 encanteris.&lt;br /&gt;
* Crea un mètode anomenat aprenEncanteri que reb un String i memoritza l'encanteri&lt;br /&gt;
* Crea un mètode anomenat llençaEncanteri que reb un parametre que serà un Objecte Personatge que és a qui recau l'encanteri. S'ha de restar 10 punts de vida d'aquest personatge i després s'ha d'esborrar l'encanteri.&lt;br /&gt;
* Escriu el constructor de la classe &lt;br /&gt;
* Escriu el mètode imprimeix per tal que es mostrin les noves dades del personatge&lt;br /&gt;
&lt;br /&gt;
'''Apartat c : Monjo'''&lt;br /&gt;
Escriu la classe Monjo tenint en compte :&lt;br /&gt;
* Quan es crei un monjo no pot tenir una inteligència menor que 12 ni mayor que 16 ni una força menor que 18.&lt;br /&gt;
* Un monjo reça a un Déu. Per tant, s'ha de modificar el constructor per tal que accepti el nom del Déu del que és devot.&lt;br /&gt;
* Un monjo pot curar, per tant, crea un mètode anomentat sanar que reb un personatge i aquest personatge reb 10 punts de vida.&lt;br /&gt;
* Escriu el mètode imprimeix per tal que es mostrin les noves dades del personatge&lt;br /&gt;
&lt;br /&gt;
'''Apartat d : Programa Principal''' &lt;br /&gt;
Crea el programa principal on es crein 2 mags (A,B) i un monjo (C) i realitza les següents accions:&lt;br /&gt;
* Imprimeix les dades dels tres personatges.&lt;br /&gt;
* El mag A aprén 2 encanteris.&lt;br /&gt;
* El mag B aprén 1 encanteri.&lt;br /&gt;
* Imprimeix les dades dels mags.&lt;br /&gt;
* El mag A llença un encanteri sobre el mag B&lt;br /&gt;
* El mag B llença un encanteri sobre el mag A&lt;br /&gt;
* El monjo cura al mag B.&lt;br /&gt;
* El mag A llença un encanteri sobre el mag B.&lt;br /&gt;
* Imprimeix les dades dels tres personatges.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PROFESSORS===&lt;br /&gt;
Crea una classe Persona, que contingui les dades nom, cognoms i edat, es podrà obtenir i modificicar els valors.&lt;br /&gt;
Es haurà de crear una altra classe Professor que baixarà de la classe Persona.&lt;br /&gt;
&lt;br /&gt;
També hi ha una classe ProfessorFixe que heretarà les dades de Professor, a més rebrà com a paràmetre un identificador.&lt;br /&gt;
&lt;br /&gt;
També hi ha una classe ProfessorInteri que heretarà les dades de Professor, a més rebrà com a paràmetre la data que demana l'interinatge.&lt;br /&gt;
&lt;br /&gt;
S'haurà de crear un mètode que mostre les dades de tots els objectes creats. (Nom, cognoms, id, data ...)&lt;br /&gt;
&lt;br /&gt;
S'haurà de crear una classe ListaProfe que contindrà un array on s'aniran emmagatzemant els objectes de ProfeFixe, ProfeInteri i Profes per això hi ha d'haver un mètode insertarProfe i un altre obtenerProfe i per últim mostrarProfes&lt;br /&gt;
&lt;br /&gt;
Insertar 3 profesInteri, 3 profesFixe i 3 Professors.&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&lt;br /&gt;
John Resig, Bear Bibeault, &amp;quot;Secrets of the Javascript Ninja&amp;quot;, Manning Publications, 2012. ISBN 193398869X&lt;br /&gt;
&lt;br /&gt;
[http://albertovilches.com/profundizando-en-javascript-parte-2-objetos-prototipos-herencia-y-namespaces  albertovilches]&lt;br /&gt;
&lt;br /&gt;
[https://developer.mozilla.org/es/docs/Web msdn-firefox]&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Sintaxi_Javascript&amp;diff=7364</id>
		<title>NF2 - Sintaxi Javascript</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Sintaxi_Javascript&amp;diff=7364"/>
				<updated>2016-09-21T20:29:45Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* Instruens Fabulam */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Generalitats ==&lt;br /&gt;
La sintaxi d'un llenguatge de programació es defineix com el conjunt de regles que han de seguir-se en escriure el codi font dels programes per considerar-se com a correctes per a aquest llenguatge de programació.&lt;br /&gt;
&lt;br /&gt;
La sintaxi de Javascript és molt similar a la d'altres llenguatges de programació com Java i C. Les normes bàsiques que defineixen la sintaxi de Javascript són les següents:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;No es tenen en compte els espais en blanc i les noves línies&amp;lt;/b&amp;gt;: com succeeix amb XHTML, l'intèrpret de Javascript ignora qualsevol espai en blanc sobrant, per la qual cosa el codi es pot ordenar de forma adequada per entendre-ho millor (tabulant les línies, afegint espais, creant noves línies, etc.)&lt;br /&gt;
* &amp;lt;b&amp;gt;Es distingeixen les majúscules i minúscules&amp;lt;/b&amp;gt;: igual que succeeix amb la sintaxi de les etiquetes i elements XHTML. No obstant això, si en una pàgina XHTML s'utilitzen indistintament majúscules i minúscules, la pàgina es visualitza correctament, sent l'únic problema la no validació de la pàgina. En canvi, si en Javascript s'intercanvien majúscules i minúscules el script no funciona.&lt;br /&gt;
* &amp;lt;b&amp;gt;No es defineix el tipus de les variables&amp;lt;/b&amp;gt;: en crear una variable, no és necessari indicar el tipus de dada que emmagatzemarà. D'aquesta forma, una mateixa variable pot emmagatzemar diferents tipus de dades durant l'execució del script.&lt;br /&gt;
* &amp;lt;b&amp;gt;No és necessari acabar cada sentència amb el caràcter de punt i coma (;)&amp;lt;/b&amp;gt;: en la majoria de llenguatges de programació, és obligatori acabar cada sentència amb el caràcter ;. Encara que Javascript no obliga a fer-ho, NOSALTRES seguirem la tradició d'acabar cada sentència amb el caràcter del punt i coma (;).&lt;br /&gt;
* &amp;lt;b&amp;gt;Es poden incloure comentaris&amp;lt;/b&amp;gt;: els comentaris s'utilitzen per afegir informació en el codi font del programa. Encara que el contingut dels comentaris no es visualitza per pantalla, si que s'envia al navegador de l'usuari juntament amb la resta del script, per la qual cosa és necessari extremar les precaucions sobre la informació inclosa en els comentaris.&lt;br /&gt;
&lt;br /&gt;
Javascript defineix dos tipus de comentaris: els de una sola línia i els que ocupen diverses línies.&lt;br /&gt;
&lt;br /&gt;
Els comentaris d'una sola línia es defineixen afegint dues barres obliqües (//) al principi de la línia :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// a continuació es mostra un missatge&lt;br /&gt;
&lt;br /&gt;
alert(&amp;quot;missatge de prova&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de comentari de diverses línies:&lt;br /&gt;
&amp;lt;&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Els comentaris de diverses línies són molt útils&lt;br /&gt;
quan es necessita incloure bastant informació&lt;br /&gt;
en els comentaris */&lt;br /&gt;
&lt;br /&gt;
alert(&amp;quot;missatge de prova&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els comentaris multilinia es defineixen tancant el text del comentari entre els símbols /* i */.&lt;br /&gt;
&lt;br /&gt;
== Variables ==&lt;br /&gt;
Les variables en els llenguatges de programació segueixen una lògica similar a les variables utilitzades en altres àmbits com les matemàtiques. Una variable és un element que s'empra per emmagatzemar i fer referència a un altre valor. Gràcies a les variables és possible crear &amp;quot;programes genèrics&amp;quot;, és a dir, programes que funcionen sempre igual independentment dels valors concrets utilitzats.&lt;br /&gt;
&lt;br /&gt;
De la mateixa forma que si en Matemàtiques no existissin les variables no es podrien definir les equacions i fórmules, en programació no es podrien fer programes realment útils sense les variables.&lt;br /&gt;
&lt;br /&gt;
Si no existissin variables, un programa que suma dos nombres podria escriure's com:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
resultat = 3 + 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El programa anterior és tan poc útil que només serveix per al cas en el qual el primer nombre de la summa sigui el 3 i el segon nombre sigui l'1. En qualsevol altre cas, el programa obté un resultat incorrecte.&lt;br /&gt;
&lt;br /&gt;
No obstant això, el programa es pot refer de la següent manera utilitzant variables per emmagatzemar i referir-se a cada nombre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
numero_1 = 3&lt;br /&gt;
numero_2 = 1&lt;br /&gt;
resultat = numero_1 + numero_2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els elements ''numero_1'' i ''numero_2'' són variables que emmagatzemen els valors que utilitza el programa. El resultat es calcula sempre en funció del valor emmagatzemat per les variables, per la qual cosa aquest programa funciona correctament per a qualsevol parell de nombres indicat. Si es modifica el valor de les variables ''numero_1'' i ''numero_2'', el programa segueix funcionant correctament.&lt;br /&gt;
&lt;br /&gt;
Les variables en Javascript es creen mitjançant la paraula reservada '''var'''. D'aquesta forma, l'exemple anterior es pot realitzar en Javascript de la següent manera:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1 = 3;&lt;br /&gt;
var numero_2 = 1;&lt;br /&gt;
var resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La paraula reservada ''var'' solament s'ha d'indicar en definir per primera vegada la variable, la qual cosa es denomina declarar una variable. Quan s'utilitzen les variables en la resta d'instruccions del *script, solament és necessari indicar el seu nom. En altres paraules, en l'exemple anterior seria un error indicar el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1 = 3;&lt;br /&gt;
var numero_2 = 1;&lt;br /&gt;
var resultat = *var numero_1 + *var numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si quan es declara una variable se li assigna també un valor, es diu que la variable ha estat inicialitzada. ''En Javascript no és obligatori inicialitzar les variables'', ja que es poden declarar d'una banda i assignar-los un valor posteriorment. Per tant, l'exemple anterior es pot refer de la següent manera:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1;&lt;br /&gt;
var numero_2;&lt;br /&gt;
&lt;br /&gt;
numero_1 = 3;&lt;br /&gt;
numero_2 = 1;&lt;br /&gt;
&lt;br /&gt;
var resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Una de les característiques més sorprenents de JavaSript per als programadors habituats a altres llenguatges de programació és que tampoc és necessari declarar les variables. En altres paraules, es poden utilitzar variables que no s'han definit anteriorment mitjançant la paraula reservada *var. L'exemple anterior també és correcte en Javascript de la següent forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1 = 3;&lt;br /&gt;
var numero_2 = 1;&lt;br /&gt;
&lt;br /&gt;
resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La variable resultat no està declarada, per la qual cosa Javascript crea una variable global (més endavant es veuran les diferències entre variables locals i globals) i li assigna el valor corresponent. De la mateixa forma, també seria correcte el següent codi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
numero_1 = 3;&lt;br /&gt;
numero_2 = 1;&lt;br /&gt;
&lt;br /&gt;
resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En qualsevol cas, es recomana declarar totes les variables que es vagin a utilitzar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;El nom d'una variable&amp;lt;/u&amp;gt; també es coneix com a identificador i &amp;lt;u&amp;gt;ha de complir les següents normes:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Només pot estar format per lletres, nombres i els símbols $ (dòlar) i _ (guió baix).&lt;br /&gt;
* El primer caràcter no pot ser un nombre.&lt;br /&gt;
&lt;br /&gt;
Per tant, les següents variables tenen noms correctes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var $numero1;&lt;br /&gt;
var _$lletra;&lt;br /&gt;
var $$$*otroNumero;&lt;br /&gt;
var $_a__$4;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
No obstant això, les següents variables tenen identificadors incorrectes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var 1numero; // Comença per un nombre&lt;br /&gt;
var numero;1_123; // Conté un caràcter &amp;quot;;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tipus de variables ===&lt;br /&gt;
Encara que totes les variables de Javascript es creen de la mateixa forma (mitjançant la paraula reservada var), la forma en la qual se'ls assigna un valor depèn del tipus de valor que es vol emmagatzemar (nombres, textos, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Numèriques ====&lt;br /&gt;
S'utilitzen per emmagatzemar valors numèrics enters (anomenats integer en anglès) o decimals (anomenats float en anglès). En aquest cas, el valor s'assigna indicant directament el nombre enter o decimal. Els nombres decimals utilitzen el caràcter . (punt) en comptes de , (coma) per separar la part sencera i la part decimal:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var iva = 16; // variable tipus sencer&lt;br /&gt;
var total = 234.65; // variable tipus decimal&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==== Cadenes de text ====&lt;br /&gt;
S'utilitzen per emmagatzemar caràcters, paraules i/o frases de text. Per assignar el valor a la variable, es tanca el valor entre cometes dobles o simples, per delimitar el seu començament i el seu final:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Benvingut al nostre lloc web&amp;quot;;&lt;br /&gt;
var nombreProducto = 'Producte ABC';&lt;br /&gt;
var letraSeleccionada = 'c';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En ocasions, el text que s'emmagatzema en les variables no és tan senzill. Si per exemple el propi text conté cometes simples o dobles, l'estratègia que se segueix és la de tancar el text amb les cometes (simples o dobles) que no utilitzi el text:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* El contingut de text1 té cometes simples, per&lt;br /&gt;
la qual cosa es tanca amb cometes dobles */&lt;br /&gt;
var text1 = &amp;quot;Una frase amb 'cometes simples' dins&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* El contingut de text2 té cometes dobles, per&lt;br /&gt;
la qual cosa es tanca amb cometes simples */&lt;br /&gt;
var text2 = 'Una frase amb &amp;quot;cometes dobles&amp;quot; dins';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No obstant això, de vegades les cadenes de text contenen tant cometes simples com a dobles. A més, existeixen altres caràcters que són difícils d'incloure en una variable de text (tabulador, ENTER, etc.) Per resoldre aquests problemes, Javascript defineix un mecanisme per incloure de forma senzilla caràcters especials i problemàtics dins d'una cadena de text.&lt;br /&gt;
&lt;br /&gt;
El mecanisme consisteix a substituir el caràcter problemàtic per una combinació simple de caràcters. A continuació es mostra la taula de conversió que s'ha d'utilitzar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Si es vol incloure...	S'ha d'incloure...&lt;br /&gt;
Una nova línia          \n	&lt;br /&gt;
Un tabulador	        \t&lt;br /&gt;
Una cometa simple	\'&lt;br /&gt;
Una cometa doble	\&amp;quot;&lt;br /&gt;
Una barra inclinada	\\&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
D'aquesta forma, l'exemple anterior que contenia cometes simples i dobles dins del text es pot refer de la següent forma:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var text1 = 'Una frase amb \'cometes simples\' dins';&lt;br /&gt;
&lt;br /&gt;
var text2 = &amp;quot;Una frase amb \&amp;quot;cometes dobles\&amp;quot; dins&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Aquest mecanisme de Javascript es denomina &amp;quot;mecanisme de fuita&amp;quot; dels caràcters problemàtics, i és habitual referir-se al fet que els caràcters han estat &amp;quot;escapats&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Arrays ====&lt;br /&gt;
En ocasions, als arrays se'ls anomena vectors, matrius i fins i tot arranjaments. No obstant això, el terme array és el més utilitzat i és una paraula comunament acceptada a l'entorn de la programació.&lt;br /&gt;
&lt;br /&gt;
Un array és una col·lecció de variables, que poden ser totes del mateix tipus o cadascuna d'un tipus diferent. La seva utilitat es comprèn millor amb un exemple senzill: si una aplicació necessita utilitzar els dies de la setmana, es podrien crear set variables de tipus text:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dia1 = &amp;quot;Dilluns&amp;quot;;&lt;br /&gt;
var dia2 = &amp;quot;Dimarts&amp;quot;;&lt;br /&gt;
...&lt;br /&gt;
var dia7 = &amp;quot;Diumenge&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Encara que el codi anterior no és incorrecte, sí que és poc eficient i complica a l'excés la programació. Si en comptes dels dies de la setmana s'hagués de guardar el nom dels mesos de l'any, el nom de tots els països del món o els mesuraments diaris de temperatura dels últims 100 anys, s'haurien de crear desenes o centenars de variables.&lt;br /&gt;
&lt;br /&gt;
En aquest tipus de casos, es poden agrupar totes les variables relacionades en una col·lecció de variables o array. L'exemple anterior es pot refer de la següent forma:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dies = [&amp;quot;Dilluns&amp;quot;, &amp;quot;Dimarts&amp;quot;, &amp;quot;Dimecres&amp;quot;, &amp;quot;Dijous&amp;quot;, &amp;quot;Divendres&amp;quot;, &amp;quot;Dissabte&amp;quot;, &amp;quot;Diumenge&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ara, una única variable anomenada ''dies'' emmagatzema tots els valors relacionats entre si, en aquest cas els dies de la setmana. Per definir un array, s'utilitzen els caràcters [ i ] per delimitar el seu començament i el seu final i s'utilitza el caràcter , (coma) per separar els seus elements:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nom_array = [valor1, valor2, ...,valorN];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Una vegada definit un array, és molt senzill accedir a cadascun dels seus elements. Cada element s'accedeix indicant la seva posició dins del array. L'única complicació, que és responsable de molts errors quan es comença a programar, és que les posicions dels elements comencen a explicar-se en el 0 i no en l'1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var diaSeleccionat = dies[0]; // diaSeleccionat = &amp;quot;Dilluns&amp;quot;&lt;br /&gt;
&lt;br /&gt;
var altreDia = dies[5]; // altreDia = &amp;quot;Dissabte&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En l'exemple anterior, la primera instrucció vol obtenir el primer element del array. Per a això, s'indica el nom del array i entre claudàtors la posició de l'element dins del array. Com s'ha comentat, ''les posicions del array comencen a partir del 0'', per la qual cosa el primer element ocupa la posició 0 i s'accedeix al mitjançant dias[0].&lt;br /&gt;
&lt;br /&gt;
El valor dies[5] fa referència a l'element que ocupa la sisena posició dins del array dies. Com les posicions comencen a explicar-se en 0, la posició 5 fa referència al sisè element, en aquest cas, el valor Dissabte.&lt;br /&gt;
&lt;br /&gt;
==== Booleans ====&lt;br /&gt;
Les variables de tipus boolean o booleà també es coneixen amb el nom de variables de tipus lògic. El seu funcionament bàsic és molt senzill.&lt;br /&gt;
&lt;br /&gt;
Una variable de tipus boolean emmagatzema un tipus especial de valor que solament pot prendre dos valors: '''true''' (veritable) o '''false''' (fals). No es pot utilitzar per emmagatzemar nombres i tampoc permet guardar cadenes de text.&lt;br /&gt;
&lt;br /&gt;
Els únics valors que poden emmagatzemar aquestes variables són true i false, per la qual cosa no poden utilitzar-se els valors veritable i fals. A continuació es mostra un parell de variables de tipus booleà:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var clientRegistrat = false;&lt;br /&gt;
var iva = true;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Operadors ===&lt;br /&gt;
&lt;br /&gt;
Els operadors permeten manipular el valor de les variables, realitzar operacions matemàtiques amb els seus valors i comparar diferents variables. D'aquesta forma, els operadors permeten als programes realitzar càlculs complexos i prendre decisions lògiques en funció de comparacions i altres tipus de condicions.&lt;br /&gt;
&lt;br /&gt;
==== Assignació ====&lt;br /&gt;
&lt;br /&gt;
L'operador d'assignació és el més utilitzat i el més senzill. Aquest operador s'utilitza per guardar un valor específic en una variable. El símbol utilitzat és = (no confondre amb l'operador == que es veurà més endavant):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 3;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A l'esquerra de l'operador, sempre ha d'indicar-se el nom d'una variable. A la dreta de l'operador, es poden indicar variables, valors, condicions lògiques, etc:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 3;&lt;br /&gt;
var numero2 = 4;&lt;br /&gt;
&lt;br /&gt;
/* Error, l'assignació sempre es realitza a una variable,&lt;br /&gt;
per la qual cosa en l'esquerra no es pot indicar un número */&lt;br /&gt;
5 = numero1;&lt;br /&gt;
&lt;br /&gt;
// Ara, la variable numero1 val 5&lt;br /&gt;
numero1 = 5;&lt;br /&gt;
&lt;br /&gt;
// Ara, la variable numero1 val 4&lt;br /&gt;
numero1 = numero2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Increment i decrement====&lt;br /&gt;
Aquests dos operadors solament són vàlids per a les variables numèriques i s'utilitzen per incrementar o decrementar en una unitat el valor d'una variable.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
++numero;&lt;br /&gt;
alert(numero); // numero = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L'operador d'increment s'indica mitjançant el prefix ++ en el nom de la variable. El resultat és que el valor d'aquesta variable s'incrementa en una unitat. Per tant, l'anterior exemple és equivalent a:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
numero = numero + 1;&lt;br /&gt;
alert(numero); // numero = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
De forma equivalent, l'operador decrement (indicat com un prefix -- en el nom de la variable) s'utilitza per decrementar el valor de la variable:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
--numero;&lt;br /&gt;
alert(numero); // numero = 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'anterior exemple és equivalent a:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
numero = numero - 1;&lt;br /&gt;
alert(numero); // numero = 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els operadors d'increment i decremento no solament es poden indicar com a prefix del nom de la variable, sinó que també és possible utilitzar-los com a sufix. En aquest cas, el seu comportament és similar però molt diferent. En el següent exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
numero++;&lt;br /&gt;
alert(numero); // numero = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El resultat d'executar el script anterior és el mateix que quan s'utilitza l'operador ++numero, per la qual cosa pot semblar que és equivalent indicar l'operador ++ davant o darrere de l'identificador de la variable. No obstant això, el següent exemple mostra les seves diferències:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
var numero2 = 2;&lt;br /&gt;
numero3 = numero1++ + numero2;&lt;br /&gt;
// numero3 = 7, numero1 = 6&lt;br /&gt;
&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
var numero2 = 2;&lt;br /&gt;
numero3 = ++numero1 + numero2;&lt;br /&gt;
// numero3 = 8, numero1 = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si l'operador ++ s'indica com a prefix de l'identificador de la variable, el seu valor s'incrementa abans de realitzar qualsevol altra operació. Si l'operador ++ s'indica com a sufix de l'identificador de la variable, el seu valor s'incrementa després d'executar la sentència en la qual apareix.&lt;br /&gt;
&lt;br /&gt;
Per tant, en la instrucció numero3 = numero1++ + numero2;, el valor de numero1 s'incrementa després de realitzar l'operació (primer se sumeixi i numero3 val 7, després s'incrementa el valor de numero1 i val 6). No obstant això, en la instrucció numero3 = ++numero1 + numero2;, en primer lloc s'incrementa el valor de numero1 i després es realitza la summa (primer s'incrementa numero1 i val 6, després es realitza la summa i numero3 val 8).&lt;br /&gt;
&lt;br /&gt;
==== Lògics ====&lt;br /&gt;
Els operadors lògics són imprescindibles per realitzar aplicacions complexes, ja que s'utilitzen per prendre decisions sobre les instruccions que hauria d'executar el programa en funció de certes condicions.&lt;br /&gt;
&lt;br /&gt;
El resultat de qualsevol operació que utilitzi operadors lògics sempre és un valor lògic o booleà.&lt;br /&gt;
&lt;br /&gt;
===== Negació =====&lt;br /&gt;
Un dels operadors lògics més utilitzats és el de la negació. S'utilitza per obtenir el valor contrari al valor de la variable:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var visible = true;&lt;br /&gt;
alert(!visible); // Mostra &amp;quot;false&amp;quot; i no &amp;quot;true&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La negació lògica s'obté prefixant el símbol ! a l'identificador de la variable. El funcionament d'aquest operador es resumeix en la següent taula:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
variable	!variable&lt;br /&gt;
true    	false&lt;br /&gt;
false	        true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si la variable original és de tipus booleà, és molt senzill obtenir la seva negació. No obstant això, què succeeix quan la variable és un nombre o una cadena de text? Per obtenir la negació en aquest tipus de variables, es realitza en primer lloc la seva conversió a un valor booleà:&lt;br /&gt;
&lt;br /&gt;
Si la variable conté un nombre, es transforma en false si val 0 i en true per a qualsevol altre nombre (positiu o negatiu, decimal o sencer).&lt;br /&gt;
Si la variable conté una cadena de text, es transforma en false si la cadena és buida (&amp;quot;&amp;quot;) i en true en qualsevol altre cas.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quantitat = 0;&lt;br /&gt;
buit = !quantitat; // buit = true&lt;br /&gt;
&lt;br /&gt;
quantitat = 2;&lt;br /&gt;
buit = !quantitat; // buit = false&lt;br /&gt;
&lt;br /&gt;
var missatge = &amp;quot;&amp;quot;;&lt;br /&gt;
missatgebuit = !missatge; // missatgebuit = true&lt;br /&gt;
&lt;br /&gt;
missatge = &amp;quot;Benvingut&amp;quot;;&lt;br /&gt;
missatgebuit = !missatge; // missatgebuit = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== AND =====&lt;br /&gt;
L'operació lògica AND obté el seu resultat combinant dos valors booleans. L'operador s'indica mitjançant el símbol &amp;amp;&amp;amp; i el seu resultat solament és true si els dos operands són true:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
variable1	variable2	variable1 &amp;amp;&amp;amp; variable2&lt;br /&gt;
  true	           true	                 true&lt;br /&gt;
  true	           false	         false&lt;br /&gt;
  false	           true	                 false&lt;br /&gt;
  false	           false	         false&lt;br /&gt;
&lt;br /&gt;
var valor1 = true;&lt;br /&gt;
var valor2 = false;&lt;br /&gt;
resultat = valor1 &amp;amp;&amp;amp; valor2; // resultat = false&lt;br /&gt;
&lt;br /&gt;
valor1 = true;&lt;br /&gt;
valor2 = true;&lt;br /&gt;
resultat = valor1 &amp;amp;&amp;amp; valor2; // resultat = true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== OR =====&lt;br /&gt;
L'operació lògica OR també combina dos valors booleans. L'operador s'indica mitjançant el símbol || i el seu resultat és true si algun dels dos operands és true:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
variable1	variable2	variable1 || variable2&lt;br /&gt;
  true	           true	                 true&lt;br /&gt;
  true	           false	         true&lt;br /&gt;
  false	           true	                 true&lt;br /&gt;
  false	           false	         false&lt;br /&gt;
&lt;br /&gt;
var valor1 = true;&lt;br /&gt;
var valor2 = false;&lt;br /&gt;
resultat = valor1 || valor2; // resultat = true&lt;br /&gt;
&lt;br /&gt;
valor1 = false;&lt;br /&gt;
valor2 = false;&lt;br /&gt;
resultat = valor1 || valor2; // resultat = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Matemàtics ====&lt;br /&gt;
Javascript permet realitzar manipulacions matemàtiques sobre el valor de les variables numèriques. Els operadors definits són: suma (+), resta (-), multiplicació (*) i divisió (/). Exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 10;&lt;br /&gt;
var numero2 = 5;&lt;br /&gt;
&lt;br /&gt;
resultat = numero1 / numero2; // resultat = 2&lt;br /&gt;
resultat = 3 + numero1; // resultat = 13&lt;br /&gt;
resultat = numero2 – 4; // resultat = 1&lt;br /&gt;
resultat = numero1 * numero 2; // resultat = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A més dels quatre operadors bàsics, Javascript defineix un altre operador matemàtic que no és senzill d'entendre quan s'estudia per primera vegada, però que és molt útil en algunes ocasions.&lt;br /&gt;
&lt;br /&gt;
Es tracta de l'operador &amp;quot;mòdul&amp;quot;, que calcula la resta de la divisió sencera de dos nombres. Si es divideix per exemple 10 i 5, la divisió és exacta i dóna un resultat de 2. La resta d'aquesta divisió és 0, per la qual cosa mòdul de 10 i 5 és igual a 0.&lt;br /&gt;
&lt;br /&gt;
No obstant això, si es divideix 9 i 5, la divisió no és exacta, el resultat és 1 i la resta 4, per la qual cosa mòdul de 9 i 5 és igual a 4.&lt;br /&gt;
&lt;br /&gt;
L'operador mòdul en Javascript s'indica mitjançant el símbol %, que no ha de confondre's amb el càlcul del percentatge:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 10;&lt;br /&gt;
var numero2 = 5;&lt;br /&gt;
resultat = numero1 % numero2; // resultat = 0&lt;br /&gt;
&lt;br /&gt;
numero1 = 9;&lt;br /&gt;
numero2 = 5;&lt;br /&gt;
resultat = numero1 % numero2; // resultat = 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els operadors matemàtics també es poden combinar amb l'operador d'assignació per abreujar la seva notació:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
numero1 += 3; // numero1 = numero1 + 3 = 8&lt;br /&gt;
numero1 -= 1; // numero1 = numero1 - 1 = 4&lt;br /&gt;
numero1 *= 2; // numero1 = numero1 * 2 = 10&lt;br /&gt;
numero1 /= 5; // numero1 = numero1 / 5 = 1&lt;br /&gt;
numero1 %= 4; // numero1 = numero1 % 4 = 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Relacionals ====&lt;br /&gt;
Els operadors relacionals definits per Javascript són idèntics als quals defineixen les matemàtiques: major que (&amp;gt;), menor que (&amp;lt;), major o igual (&amp;gt;=), menor o igual (&amp;lt;=), igual que (==) i diferent de (!=).&lt;br /&gt;
&lt;br /&gt;
Els operadors que relacionen variables són imprescindibles per realitzar qualsevol aplicació complexa, com es veurà en el següent capítol de programació avançada. El resultat de tots aquests operadors sempre és un valor booleà:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 3;&lt;br /&gt;
var numero2 = 5;&lt;br /&gt;
resultat = numero1 &amp;gt; numero2; // resultat = false&lt;br /&gt;
resultat = numero1 &amp;lt; numero2; // resultat = true&lt;br /&gt;
&lt;br /&gt;
numero1 = 5;&lt;br /&gt;
numero2 = 5;&lt;br /&gt;
resultat = numero1 &amp;gt;= numero2; // resultat = true&lt;br /&gt;
resultat = numero1 &amp;lt;= numero2; // resultat = true&lt;br /&gt;
resultat = numero1 == numero2; // resultat = true&lt;br /&gt;
resultat = numero1 != numero2; // resultat = false&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
S'ha de tenir especial cura amb l'operador d'igualtat (==), ja que és l'origen de la majoria d'errors de programació, fins i tot per als usuaris que ja tenen certa experiència desenvolupant scripts. L'operador == s'utilitza per comparar el valor de dues variables, per la qual cosa és molt diferent de l'operador =, que s'utilitza per assignar un valor a una variable:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// L'operador &amp;quot;=&amp;quot; assigna valors&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
resultat = numero1 = 3; // numero1 = 3 i resultat = 3&lt;br /&gt;
&lt;br /&gt;
// L'operador &amp;quot;==&amp;quot; compara variables&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
resultat = numero1 == 3; // numero1 = 5 i resultat = *false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els operadors relacionals també es poden utilitzar amb variables de tipus cadena de text:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var text1 = &amp;quot;hola&amp;quot;;&lt;br /&gt;
var text2 = &amp;quot;hola&amp;quot;;&lt;br /&gt;
var text3 = &amp;quot;*adios&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
resultat = text1 == text3; // resultat = false&lt;br /&gt;
resultat = text1 != text2; // resultat = false&lt;br /&gt;
resultat = text3 &amp;gt;= text2; // resultat = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Quan s'utilitzen cadenes de text, els operadors &amp;quot;major que&amp;quot; (&amp;gt;) i &amp;quot;menor que&amp;quot; (&amp;lt;) segueixen un raonament no intuïtiu: es compara lletra a lletra començant des de l'esquerra fins que es trobi una diferència entre les dues cadenes de text. Per determinar si una lletra és major o menor que una altra, les majúscules es consideren menors que les minúscules i les primeres lletres de l'alfabet són menors que les últimes (a és menor que b, b és menor que c, A és menor que a, etc.)&lt;br /&gt;
=== Àmbit de les Varibles ===&lt;br /&gt;
Un altre aspecte a tenir en compte a l'hora d'usar les variables és el seu àmbit, és a dir, quines funcions tenen accés a elles. Si es crea una ''variable dins d'una funció'' només serà coneguda dins d'aquesta funció, es tracta de ''variables locals''. Si es necessita que diverses funcions tinguin accés a una determinada variable aquesta ha de crear-se com a variable global, això es fa creant-la fora de totes les funcions. Per exemple en el següent script tenim variables globals i locals:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script language=&amp;quot;Javascript&amp;quot;&amp;gt;&lt;br /&gt;
     var navegador_versio = 0;&lt;br /&gt;
     function veureNavegador()&lt;br /&gt;
     {&lt;br /&gt;
          var versio;&lt;br /&gt;
          versio = document.appVersion;&lt;br /&gt;
          return versio;&lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En aquest exemple ''navegador_versio'' és una variable global i ''versió'' és una variable local que només existeix dintre de la funciò ''veureNavegador''.&lt;br /&gt;
Què succeeix si una funció defineix una variable local amb el mateix nom que una variable global que ja existeix? En aquest cas, l''es variables locals prevalen sobre les globals, però només dins de la funció'':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var missatge = &amp;quot;guanya la de fora&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    function mostraMissatge() {&lt;br /&gt;
        var missatge = &amp;quot;guanya la de dins&amp;quot;;&lt;br /&gt;
        alert(missatge);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
    mostraMissatge();&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Què succeeix si dins d'una funció es defineix una variable global amb el mateix nom que una altra variable global que ja existeix? En aquest altre cas, la variable global definida dins de la funció simplement modifica el valor de la variable global definida anteriorment:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var missatge = &amp;quot;guanya la de fora&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    function mostraMissatge() {&lt;br /&gt;
        missatge = &amp;quot;guanya la de dins&amp;quot;;&lt;br /&gt;
        alert(missatge);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
    mostraMissatge();&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La diferencia dels dos exemples anteriors ve donat per la definició d'una variable anomenada igual que una altre global. En el primer exemple s'utilitza la paraula reservada '''var''' i en el últim exemple NO s'utilitza. El fet de NO utilitzar la paraula reservada '''var''' s'interpreta com que es vol utilitzar la variable global definida abans de la funció.&lt;br /&gt;
&lt;br /&gt;
Resumint, la recomanació general és definir com a variables locals totes les variables que siguin d'ús exclusiu per realitzar les tasques encarregades a cada funció. Les variables globals s'utilitzen per compartir dades entre funcions de forma senzilla.&lt;br /&gt;
&lt;br /&gt;
== Estructures de control de Flux ==&lt;br /&gt;
&lt;br /&gt;
=== Estructura IF ===&lt;br /&gt;
L'estructura més utilitzada en Javascript i en la majoria de llenguatges de programació és l'estructura if. S'empra per prendre decisions en funció d'una condició. La seva definició formal és:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if(condicion) {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si la condició es compleix (és a dir, si el seu valor és true) s'executen totes les instruccions que es troben dins de {...}. Si la condició no es compleix (és a dir, si el seu valor és false) no s'executa cap instrucció continguda en {...} i el programa continua executant la resta d'instruccions del script.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var mostrado = false;&lt;br /&gt;
var usuarioPermiteMensajes = true;&lt;br /&gt;
 &lt;br /&gt;
if(!mostrado &amp;amp;&amp;amp; usuarioPermiteMensajes) {&lt;br /&gt;
  alert(&amp;quot;Es la primera vez que se muestra el mensaje&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Estructura IF....ELSE ===&lt;br /&gt;
Normalment les condicions solen ser del tipus &amp;quot;si es compleix aquesta condició, fes-ho; si no es compleix, fes això un altre&amp;quot;. Existeix una variant de l'estructura if trucada if...else. La seva definició formal és la següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if(condicion) {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La estructura if...else es pot encadenar per realitzar diverses comprovacions seguides:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if(edad &amp;lt; 12) {&lt;br /&gt;
  alert(&amp;quot;Todavía eres muy pequeño&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if(edad &amp;lt; 19) {&lt;br /&gt;
  alert(&amp;quot;Eres un adolescente&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if(edad &amp;lt; 35) {&lt;br /&gt;
  alert(&amp;quot;Aun sigues siendo joven&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
  alert(&amp;quot;Piensa en cuidarte un poco más&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selecció Múltiple ===&lt;br /&gt;
Poden existir casos en els quals el programa hagi de tenir mes de dues alternatives, per exemple si volem un programa que mostri un títol en un idioma de quatre possibles. Això pot solucionar-se mitjançant diversos if. Hem de triar entre idiomes: castellà, engonals, francès i alemany.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (leng == &amp;quot;ESPANYOL&amp;quot;)&lt;br /&gt;
       pagCast();&lt;br /&gt;
else&lt;br /&gt;
       if (leng == &amp;quot;ANGLES&amp;quot;)&lt;br /&gt;
              pagIng();&lt;br /&gt;
       else&lt;br /&gt;
             if (leng == &amp;quot;FRANCES&amp;quot;)&lt;br /&gt;
                    pagFran();&lt;br /&gt;
             else&lt;br /&gt;
                   if (leng == &amp;quot;CATALA&amp;quot;)&lt;br /&gt;
                          pagCat();&lt;br /&gt;
                   else&lt;br /&gt;
                            error('idioma desconegut');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per a aquests casos disposem de la sentència switch...casi...default, de selecció múltiple. L'exemple anterior quedaria:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
switch (idioma) {&lt;br /&gt;
    case 'espanyol' :&lt;br /&gt;
          pagCast();&lt;br /&gt;
          break;&lt;br /&gt;
    case 'ingles' :&lt;br /&gt;
          pagIng();&lt;br /&gt;
          break;&lt;br /&gt;
    case 'frances' :&lt;br /&gt;
          pagFran();&lt;br /&gt;
          break;&lt;br /&gt;
    case 'catala' :&lt;br /&gt;
          pagCat();&lt;br /&gt;
          break;&lt;br /&gt;
    default :&lt;br /&gt;
          error ('Idioma desconegut');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La instrucció ''break'' posa fi al bloc i fa que el programa salti a la instrucció següent a la sentència ''switch''(), si s'omet el programa continuaria amb la següent comparació. La secció del ''default'' és opcional, la seva finalitat és executar algun codi quan cap de les condicions es compleixi.&lt;br /&gt;
&lt;br /&gt;
=== Estructura WHILE ===&lt;br /&gt;
En aquesta estructura el programa primer comprova la condició: si és certa pansa a executar el cos del bucle, i si és falsa pansa a la instrucció següent a la sentència while.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
while(condició){&lt;br /&gt;
....&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var resultat = 0;&lt;br /&gt;
var numero = 100;&lt;br /&gt;
var i = 0;&lt;br /&gt;
 &lt;br /&gt;
while(i &amp;lt;= numero) {&lt;br /&gt;
  resultat += i;&lt;br /&gt;
  i++;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
alert(resultat);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El programa ha de sumar tots els nombres menors o igual que un altre donat. Per exemple si el nombre és 5, s'ha de calcular: 1 + 2 + 3 + 4 + 5 = 15&lt;br /&gt;
&lt;br /&gt;
=== Estructura DO...WHILE ===&lt;br /&gt;
Es tracta d'un bucle en el qual la condició es comprova després de la primera iteració, és a dir que el cos del bucle s'executa almenys una vegada. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  ...&lt;br /&gt;
} while(condició);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Utilitzant aquest bucle es pot calcular fàcilment el factorial d'un numero:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var resultat = 1;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
 &lt;br /&gt;
do {&lt;br /&gt;
  resultat *= numero;  // resultat = resultat * numero&lt;br /&gt;
  numero--;&lt;br /&gt;
} while(numero &amp;gt; 0);&lt;br /&gt;
 &lt;br /&gt;
alert(resultat);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Estructura FOR ===&lt;br /&gt;
L'estructura for permet realitzar repeticions (també anomenades bucles) d'instruccions d'una forma molt senzilla. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for(inicializació; condició; actualizació) {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La idea del funcionament d'un bucle for és la següent: &amp;quot;mentre la condició indicada se segueixi complint, repeteix l'execució de les instruccions definides dins del for. A més, després de cada repetició, actualitza el valor de les variables que s'utilitzen en la condició&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* La &amp;quot;inicialització&amp;quot; és la zona en la qual s'estableix els valors inicials de les variables que controlen la repetició.&lt;br /&gt;
* La &amp;quot;condició&amp;quot; és l'únic element que decideix si contínua o es deté la repetició.&lt;br /&gt;
* La &amp;quot;actualització&amp;quot; és el nou valor que s'assigna després de cada repetició a les variables que controlen la repetició.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola, estic dintre d'un bucle&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
for(var i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
  alert(missatge);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Un altre exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dies = [&amp;quot;Dilluns&amp;quot;, &amp;quot;Dimarts&amp;quot;, &amp;quot;Dimecres&amp;quot;, &amp;quot;Dijous&amp;quot;, &amp;quot;Divendres&amp;quot;, &amp;quot;Dissabte&amp;quot;, &amp;quot;Diumenge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
for(var i=0; i&amp;lt;7; i++) {&lt;br /&gt;
  alert(dies[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Estructura For...IN ===&lt;br /&gt;
La seva definició exacta implica l'ús d'objectes, que és un element de programació que encara no anem a estudiar. Per tant, solament es va a presentar l'estructura for...in adaptada al seu ús en arrays. La seva definició formal adaptada als arrays és:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for(indice in array) {&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dies = [&amp;quot;Dilluns&amp;quot;, &amp;quot;Dimarts&amp;quot;, &amp;quot;Dimecres&amp;quot;, &amp;quot;Dijous&amp;quot;, &amp;quot;Divendres&amp;quot;, &amp;quot;Dissabte&amp;quot;, &amp;quot;Diumenge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
for(i in dies) {&lt;br /&gt;
  alert(dies[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Funcions útils del llenguatge ==&lt;br /&gt;
=== Funcions de cadenes de text ===&lt;br /&gt;
&lt;br /&gt;
'''length''', calcula la longitud d'una cadena de text (el nombre de caràcters que la formen)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var numeroLetras = missatge.length; // numeroLetras = 10&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''+''', s'empra per concatenar diverses cadenes de text&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = &amp;quot; Món&amp;quot;;&lt;br /&gt;
var missatge = missatge1 + missatge2; // missatge = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A més de l'operador +, també es pot utilitzar la funció '''concat()'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = missatge1.concat(&amp;quot; Món&amp;quot;); // missatge2 = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les cadenes de text també es poden unir amb variables numèriques:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var variable1 = &amp;quot;Hola &amp;quot;;&lt;br /&gt;
var variable2 = 3;&lt;br /&gt;
var missatge = variable1 + variable2; // missatge = &amp;quot;Hola 3&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Quan s'uneixen diverses cadenes de text és habitual oblidar afegir un espai de separació entre les paraules:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = &amp;quot;Món&amp;quot;;&lt;br /&gt;
var missatge = missatge1 + missatge2; // missatge = &amp;quot;HolaMón&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els espais en blanc es poden afegir al final o al principi de les cadenes i també es poden indicar forma explícita:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = &amp;quot;Món&amp;quot;;&lt;br /&gt;
var missatge = missatge1 + &amp;quot; &amp;quot; + missatge2; // missatge = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''toUpperCase()''', transforma tots els caràcters de la cadena als seus corresponents caràcters en majúscules:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = missatge1.toUpperCase(); // missatge2 = &amp;quot;HOLA&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''toLowerCase()''', transforma tots els caràcters de la cadena als seus corresponents caràcters en minúscules:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;HOLA&amp;quot;;&lt;br /&gt;
var missatge2 = missatge1.toLowerCase(); // missatge2 = &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''charAt(posició)''', obté el caràcter que es troba en la posició indicada:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var lletra = missatge.charAt(0); // lletra = H&lt;br /&gt;
lletra = missatge.charAt(2); // lletra = l&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''indexOf(caracter)''', calcula la posició en la qual es troba el caràcter indicat dins de la cadena de text. Si el caràcter s'inclou diverses vegades dins de la cadena de text, es retorna la seva primera posició començant a buscar des de l'esquerra. Si la cadena no conté el caràcter, la funció retorna el valor -1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var posicion = missatge.indexOf('a'); // posicion = 3&lt;br /&gt;
posicion = missatge.indexOf('b'); // posicion = -1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La seva funció anàloga és lastIndexOf():&lt;br /&gt;
&lt;br /&gt;
'''lastIndexOf(caracter'''), calcula l'última posició en la qual es troba el caràcter indicat dins de la cadena de text. Si la cadena no conté el caràcter, la funció retorna el valor -1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var posicion = missatge.lastIndexOf('a'); // posicion = 3&lt;br /&gt;
posicion = missatge.lastIndexOf('b'); // posicion = -1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La funció lastIndexOf() comença la seva cerca des del final de la cadena cap al principi, encara que la posició retornada és la correcta començant a explicar des del principi de la paraula.&lt;br /&gt;
&lt;br /&gt;
'''substring(inici, final)''', extreu una porció d'una cadena de text. El segon paràmetre és opcional. Si només s'indica el paràmetre inicio, la funció retorna la part de la cadena original corresponent des d'aquesta posició fins al final:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(2); // porcion = &amp;quot;la Món&amp;quot;&lt;br /&gt;
porcion = missatge.substring(5); // porcion = &amp;quot;Món&amp;quot;&lt;br /&gt;
porcion = missatge.substring(7); // porcion = &amp;quot;ndo&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si s'indica un inici negatiu, es retorna la mateixa cadena original:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(-2); // porcion = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Quan s'indica l'inici i el final, es retorna la part de la cadena original compresa entre la posició inicial i la immediatament anterior a la posició final (és a dir, la posició inicio està inclosa i la posició final no):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(1, 8); // porcion = &amp;quot;ona Mun&amp;quot;&lt;br /&gt;
porcion = missatge.substring(3, 4); // porcion = &amp;quot;a&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si s'indica un final més petit que l'inici, Javascript els considera de forma inversa, ja que automàticament assigna el valor més petit a l'inici i el més gran al final:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(5, 0); // porcion = &amp;quot;Hola &amp;quot;&lt;br /&gt;
porcion = missatge.substring(0, 5); // porcion = &amp;quot;Hola &amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''split(separador'''), converteix una cadena de text en un array de cadenes de text. La funció parteix la cadena de text determinant els seus trossos a partir del caràcter separador indicat:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món, sóc una cadena de text!&amp;quot;;&lt;br /&gt;
var paraules = missatge.split(&amp;quot; &amp;quot;);&lt;br /&gt;
// paraules = [&amp;quot;Hola&amp;quot;, &amp;quot;Món,&amp;quot;, &amp;quot;sóc&amp;quot;, &amp;quot;una&amp;quot;, &amp;quot;cadena&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;text!&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Amb aquesta funció es poden extreure fàcilment les lletres que formen una paraula:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var paraula = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var lletres = paraula.split(&amp;quot;&amp;quot;); // lletres = [&amp;quot;H&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;a&amp;quot;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Funcions d'arrays ===&lt;br /&gt;
'''length''', calcula el nombre d'elements d'un array&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var vocals = [&amp;quot;a&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;o&amp;quot;];&lt;br /&gt;
var numeroVocales = vocals.length; // numeroVocales = 5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''concat()''', s'empra per concatenar els elements de diversos arrays&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array1 = [1, 2, 3];&lt;br /&gt;
array2 = array1.concat(4, 5, 6); // array2 = [1, 2, 3, 4, 5, 6]&lt;br /&gt;
array3 = array1.concat([4, 5, 6]); // array3 = [1, 2, 3, 4, 5, 6]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''join(separador)''', és la funció contrària a split(). Uneix tots els elements d'un array per formar una cadena de text. Per unir els elements s'utilitza el caràcter separador indicat&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [&amp;quot;hola&amp;quot;, &amp;quot;món&amp;quot;];&lt;br /&gt;
var missatge = array.join(&amp;quot;&amp;quot;); // missatge = &amp;quot;holamundo&amp;quot;&lt;br /&gt;
missatge = array.join(&amp;quot; &amp;quot;); // missatge = &amp;quot;hola món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''pop()''', elimina l'últim element del array i ho retorna. El array original es modifica i la seva longitud disminueix en 1 element.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
var ultimo = array.pop();&lt;br /&gt;
// ara array = [1, 2], ultimo = 3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''push()''', afegeix un element al final del array. El array original es modifica i augmenta la seva longitud en 1 element. (També és possible afegir més d'un element alhora)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
array.push(4);&lt;br /&gt;
// ara array = [1, 2, 3, 4]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''shift()''', elimina el primer element del array i ho retorna. El array original es veu modificat i la seva longitud disminuïda en 1 element.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
var primer = array.shift();&lt;br /&gt;
// ara array = [2, 3], primer = 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''unshift()''', afegeix un element al principi del array. El array original es modifica i augmenta la seva longitud en 1 element. (També és possible afegir més d'un element alhora)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
array.unshift(0);&lt;br /&gt;
// ara array = [0, 1, 2, 3]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''reverse()''', modifica un array col·locant els seus elements en l'ordre invers a la seva posició original:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
array.reverse();&lt;br /&gt;
// ara array = [3, 2, 1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''sort()''', ordena els elements del array, tan numèrics com alfabètics.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [4, 2, 1, 3];&lt;br /&gt;
array.sort();&lt;br /&gt;
// ara array = [1, 2, 3, 4]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''splice()''', afegeix i elimina elements.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;Inici&amp;lt;/i&amp;gt; es la posició on començarà a afegir o eliminar.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;Eliminats&amp;lt;/i&amp;gt; es el nombre d'elements que es volven borrar. Si posem un 0, solament afegirà valors.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;Valor1, valor2, …, valorN&amp;lt;/i&amp;gt; son els valor que volem afegir.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3, 4, 5];&lt;br /&gt;
array.splice(1,3);&lt;br /&gt;
// ara array = [1, 5], elimina a partir de la posició 1, tres elements.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array =[1, 2, 3, 4, 5];&lt;br /&gt;
array.splice(2, 0, 2.5);&lt;br /&gt;
//ara el array = [1, 2, 2.5, 3, 4, 5]&lt;br /&gt;
//afegeix a partir de la posició dos el element 2.5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array= [1, 2, 3, 4, 5, 6];&lt;br /&gt;
array.splice(2, 3);&lt;br /&gt;
//Eliminem, a partir del segon element (no inclos) 3 elements&lt;br /&gt;
//ara el array = [1, 2, 6]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3, 4, 5];&lt;br /&gt;
array.splice(1, 3, &amp;quot;two&amp;quot;, &amp;quot;three&amp;quot;, &amp;quot;four&amp;quot;);&lt;br /&gt;
//Eliminem tres elements a partir del primer element, y afegim 3 més&lt;br /&gt;
//ara el array = [1, &amp;quot;two&amp;quot;, &amp;quot;three&amp;quot;, &amp;quot;four&amp;quot;, 5]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Funcions de nombres ===&lt;br /&gt;
'''NaN''', (de l'anglès, &amp;quot;Not a Number&amp;quot;) Javascript empra el valor NaN per indicar un valor numèric no definit (per exemple, la divisió 0/0).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 0;&lt;br /&gt;
var numero2 = 0;&lt;br /&gt;
alert(numero1/numero2); // es mostra el valor NaN&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''isNaN()''', permet protegir a l'aplicació de possibles valors numèrics no definits&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 0;&lt;br /&gt;
var numero2 = 0;&lt;br /&gt;
if(isNaN(numero1/numero2)) {&lt;br /&gt;
alert(&amp;quot;La divisió no està definida per als nombres indicats&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
alert(&amp;quot;La divisió és igual a =&amp;gt; &amp;quot; + numero1/numero2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''Infinity''', fa referència a un valor numèric infinit i positiu (també existeix el valor –Infinity per als infinits negatius)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 10;&lt;br /&gt;
var numero2 = 0;&lt;br /&gt;
alert(numero1/numero2); // es mostra el valor Infinity&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''toFixed(digits)''', retorna el nombre original amb punts decimals com els indicats pel paràmetre digits i realitza els arrodoniments necessaris. Es tracta d'una funció molt útil per exemple per mostrar preus.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 4564.34567;&lt;br /&gt;
numero1.toFixed(2); // 4564.35&lt;br /&gt;
numero1.toFixed(6); // 4564.345670&lt;br /&gt;
numero1.toFixed(); // 4564&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conversió de tipus ===&lt;br /&gt;
No és capaç de convertir un string en nombre (tret que el string sigui solament un nombre). Per a això existeixen dues funcions preconstruidas en Javascript que ens permeten convertir un string en nombre enter o decimal, amb dues limitacions:&lt;br /&gt;
Ha d'aparèixer com string el nombre (sencer o decimal) que volem convertir.&lt;br /&gt;
Ha d'aparèixer al principi del string.&lt;br /&gt;
'''parseInt(String)''' --&amp;gt; converteix a integer&lt;br /&gt;
'''parseFloat(String)''' --&amp;gt; Converteix a Float&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parseInt(&amp;quot;4.33333&amp;quot;); --&amp;gt; 4&lt;br /&gt;
parseFloat(&amp;quot;4.333&amp;quot;); --&amp;gt; 4.333&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
=== Exercici : Arrays ===&lt;br /&gt;
Crear un array anomenat mesos i que emmagatzemi el nom dels dotze mesos de l'any. Mostrar per pantalla els dotze noms utilitzant la funció alert().&lt;br /&gt;
&lt;br /&gt;
:[[Solució Exercici Arrays]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici : Operadors ===&lt;br /&gt;
A partir del següent array que es proporciona: &lt;br /&gt;
&amp;lt;pre&amp;gt;var valors = [true, 5, false, &amp;quot;hola&amp;quot;, &amp;quot;adios&amp;quot;, 2];&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Determinar quin dels dos elements de text és major&lt;br /&gt;
* Utilitzant exclusivament els dos valors booleans del array, determinar els operadors necessaris per obtenir un resultat true i un altre resultat false&lt;br /&gt;
* Determinar el resultat de les cinc operacions matemàtiques realitzades amb els dos elements numèrics&lt;br /&gt;
&lt;br /&gt;
:[[Solució Exercici Operadors]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici DNI ===&lt;br /&gt;
El càlcul de la lletra del Document Nacional d'Identitat (DNI) és un procés matemàtic senzill que es basa a obtenir la resta de la divisió sencera del nombre de DNI i el número 23. A partir de la resta de la divisió, s'obté la lletra seleccionant-la dins d'un array de lletres.&lt;br /&gt;
El array de lletres és:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var lletres = ['T', 'R', 'W', 'A', 'G', 'M', 'I', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'I', 'T'];&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per tant si la resta de la divisió és 0, la lletra del DNI és la T i si la resta és 3 la lletra és l'A. Amb aquestes dades, elaborar un petit script que:&lt;br /&gt;
* Emmagatzemi en una variable el nombre de DNI indicat per l'usuari i en una altra variable la lletra del DNI que s'ha indicat. (Pista: si es vol demanar directament a l'usuari que indiqui el seu nombre i la seva lletra, es pot utilitzar la funció prompt())&lt;br /&gt;
* En primer lloc (i en una sola instrucció) s'ha de comprovar si el nombre és menor que 0 o major que 99999999. Si aquest és el cas, es mostra un missatge a l'usuari indicant que el nombre proporcionat no és vàlid i el programa no mostra més missatges.&lt;br /&gt;
* Si el nombre és vàlid, es calcula la lletra que li correspon segons el mètode explicat anteriorment.&lt;br /&gt;
* Una vegada calculada la lletra, s'ha de comparar amb la lletra indicada per l'usuari. Si no coincideixen, es mostra un missatge a l'usuari dient-li que la lletra que ha indicat no és correcta. En un altre cas, es mostra un missatge indicant que el nombre i la lletra de DNI són correctes.&lt;br /&gt;
&lt;br /&gt;
:[[Solució DNI]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Factorial ===&lt;br /&gt;
El factorial d'un nombre enter n és una operació matemàtica que consisteix a multiplicar tots els factors n x (n-1) x (n-2) x ... x 1. Així, el factorial de 5 (escrit com 5!) és igual a: 5! = 5 x 4 x 3 x 2 x 1 = 120&lt;br /&gt;
Utilitzant l'estructura for, crear un script que calculi el factorial d'un nombre enter.&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
:[[Solució Factorial]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Exercici de Cadenes ===&lt;br /&gt;
Escriure funcions que donades dues cadenes de caràcters:&lt;br /&gt;
a) Indiqui si la segona cadena és una subcadena de la primera. Per exemple, ’cadena’ és una&lt;br /&gt;
subcadena de ’subcadena’.&lt;br /&gt;
b) Retorni la que sigui anterior en ordre alfábetico. Per exemple, si rep ’kde’ i ’gnome’&lt;br /&gt;
ha de retornar ’gnome’.&lt;br /&gt;
&lt;br /&gt;
:[[Solució cadenes]]&lt;br /&gt;
&lt;br /&gt;
=== Joc d'adivinació ===&lt;br /&gt;
Considerem el següent joc entre els jugadors A (endeví) y P (pensador): P pensa un nombre entre 1 y 1000. A intenta adivinar-ho mitjançant aproximacions fins que adivina el número. &lt;br /&gt;
Suposem que la màquina interpreta el paper d'endeví i l'usuari ha de pensar el número. El pensador només pot donar 3 tipus de respostes per cada nombre proposat per l'endeví:&lt;br /&gt;
* &amp;quot;MAJOR&amp;quot; : vol dir que el numero proposat pel l'endeví és major que el que ha pensat.&lt;br /&gt;
* &amp;quot;MENOR&amp;quot; : vol dir que el numero proposat pel l'endeví és menor que el que ha pensat.&lt;br /&gt;
* &amp;quot;OK&amp;quot; : vol dir que ha adivinat el número. &lt;br /&gt;
&lt;br /&gt;
:[[Solució Joc d'adivinació]]&lt;br /&gt;
&lt;br /&gt;
=== Palíndrom ===&lt;br /&gt;
Volem sapiguer si una determinada paraula o frase és un [http://es.wikipedia.org/wiki/Pal%C3%ADndromo palíndrom]. Escriu un programa que demani una text i aquest indiqui si és o no palíndrom.&lt;br /&gt;
&lt;br /&gt;
:[[Solució Palíndrom]]&lt;br /&gt;
&lt;br /&gt;
=== Triangle bonic ===&lt;br /&gt;
Utilitzant bucles i amb els dígits {0...9} es poden dibuixar triangles com el següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         1 &lt;br /&gt;
        232&lt;br /&gt;
       34543&lt;br /&gt;
      4567654&lt;br /&gt;
     567898765&lt;br /&gt;
    67890109876&lt;br /&gt;
   7890123210987&lt;br /&gt;
  890123454321098&lt;br /&gt;
 90123456765432109&lt;br /&gt;
0123456789876543210&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
T'atreveixes?&lt;br /&gt;
&lt;br /&gt;
:[[Solució Triangle bonic]]&lt;br /&gt;
&lt;br /&gt;
=== Xifrat Julio César ===&lt;br /&gt;
El dictador Julio César utilitzava un codi quan volia mantenir en secret un missatge. El xifrat consistia a substituir la primera lletra de l'alfabet, A, per la quarta, D, i així successivament amb les altres, és a dir, B, per la cinquena, I, la tercera, C, per la sisena, F ...&lt;br /&gt;
&lt;br /&gt;
L'alfabet llatí que utilitzava Julio César constava de 21 lletres, per tant la substitució de lletres per xifrar o desxifrar missatges queda descrita en la taula següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Alfabet original : A B C D E F G H I K L M N O P Q R S T V&lt;br /&gt;
Alfabet xifrat   : D E F G H I K L M N O P Q R S T V A B C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aquest tipus de xifrat és un codi de rotació, on la clau de rotació és 3.&lt;br /&gt;
&lt;br /&gt;
Escriu un programa que permeti xifrar o desxifrar utilitzant un codi de rotació. La clau del codi podrà triar-se.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[Solució Xifrat]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Password segur? ===&lt;br /&gt;
Volem saber si una contrasenya és segura. Per tal que sigui segura ha de complir les següents regles:&lt;br /&gt;
* Ha de contenir almenys una vocal.&lt;br /&gt;
* No ha de tenir tres vocals consecutives o tres consonants consecutives.&lt;br /&gt;
* No ha de tenir dues ocurrències consecutives de la mateixa lletra, excepte per ‘ee’ o ‘oo’.&lt;br /&gt;
* La longitud mínima és de 6 caràcters i la màxima de 10.&lt;br /&gt;
* Els espais en blanc no estan permesos&lt;br /&gt;
&lt;br /&gt;
:[[Solució Password segur?]]&lt;br /&gt;
&lt;br /&gt;
=== Separador de milers ===&lt;br /&gt;
Escriure una funció que rebi una cadena que conté un llarg nombre enter i retorni una cadena amb el nombre i les separacions de milers. Per exemple, si rep ’1234567890’, ha de retornar ’1.234.567.890’.&lt;br /&gt;
&lt;br /&gt;
:[[Solució Separador de milers]]&lt;br /&gt;
&lt;br /&gt;
=== Dibuixos amb asteriscos ===&lt;br /&gt;
&lt;br /&gt;
Escriu un programa que dibuixi per pantalla les següents figures:&lt;br /&gt;
*volcà : composta per línies de 2,4,8,16,32 i 64 asteriscos&lt;br /&gt;
[[Fitxer:volca.png]]&lt;br /&gt;
*Mosaic: Compost per una matriu de 8x8 caràcters.&lt;br /&gt;
[[Fitxer:mosaic.png]]&lt;br /&gt;
*Taulers: Com l'anterior però cada quadrat d'amplària L (nombre de línies)&lt;br /&gt;
[[Fitxer:taulers.png]]&lt;br /&gt;
&lt;br /&gt;
=== Instruens Fabulam ===&lt;br /&gt;
Instruens Fabulam és la manera de dibuixar un quadre (o taula) en idioma Llatí. Això és el que has de fer per a aquest problema.&lt;br /&gt;
Cada descripció comença amb una línia d'encapçalat que conté un o més caràcters que defineixen el nombre i l'alineament de de les columnes de la taula. &lt;br /&gt;
Els caràcters de l'encapçalat són:&lt;br /&gt;
* ‘&amp;lt;’ justificació per esquerra&lt;br /&gt;
* ’=’ justificació per central&lt;br /&gt;
* ‘&amp;gt;’ justificació per dreta&lt;br /&gt;
Després de l'encapçalat hi ha almenys dos i com a màxim 21 línies de dades que contenen les entrades de cada fila.&lt;br /&gt;
Cada línia de dades consisteix en una o més entrades (no buides) separades per un ampersand (‘&amp;amp;’), on el nombre d'entrades és igual al nombre de columnes definides en l'encapçalat.&lt;br /&gt;
La primera línia conté els títols de les columnes, i les línies de dades restants contenen les entrades del cos de la taula. Els  espais poden aparèixer dins d'una entrada, però mai al principi ni al final de l'entrada. Els caràcters '&amp;lt;', '=', '&amp;gt;', '&amp;amp;', i 'comilles simples' no apareixeran en l'entrada excepte en els llocs indicats a dalt.&lt;br /&gt;
Per cada descripció de taula, desplegui la taula usant el format exacte mostrat en l'exemple. Noti que: &lt;br /&gt;
* L'ample total de la taula no excedirà els 79 caràcters (sense explicar la fi-de-línia).&lt;br /&gt;
* Els guions ('-') són usats per dibuixar línies horitzontals, no ('_'). El signe d'arrova ('@') apareix en cada cantonada. El signe de summa (‘+’) apareix en una intersecció entre la línia que separa el títol i el cos de la taula.&lt;br /&gt;
* Les entrades d'una columna estan separades pel caràcter (‘|’) per exactament un espai.&lt;br /&gt;
* Si una entrada centrada no està exactament centrada en una columna, l'espai extra ha d'anar a la dreta de l'entrada.&lt;br /&gt;
Exemples:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció Instruens Fabulam:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&lt;br /&gt;
What is the answer?&lt;br /&gt;
42&lt;br /&gt;
&lt;br /&gt;
Quadre:&lt;br /&gt;
@---------------------@&lt;br /&gt;
| What is the answer? |&lt;br /&gt;
|---------------------|&lt;br /&gt;
|                     |&lt;br /&gt;
|                   42|&lt;br /&gt;
@---------------------@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;gt;&lt;br /&gt;
Tweedledum&amp;amp;Tweedledee&lt;br /&gt;
&amp;quot;Knock, knock.&amp;quot;&amp;amp;&amp;quot;Who's there?&amp;quot;&lt;br /&gt;
&amp;quot;Boo.&amp;quot;&amp;amp;&amp;quot;Boo who?&amp;quot;&lt;br /&gt;
&amp;quot;Don't cry, it's only me.&amp;quot;&amp;amp;(groan)&lt;br /&gt;
&lt;br /&gt;
Quadre:&lt;br /&gt;
@---------------------------------------------@&lt;br /&gt;
| Tweedledum                 |     Tweedledee |&lt;br /&gt;
|----------------------------+----------------|&lt;br /&gt;
| &amp;quot;Knock, knock.&amp;quot;            | &amp;quot;Who's there?&amp;quot; |&lt;br /&gt;
| &amp;quot;Boo.&amp;quot;                     |     &amp;quot;Boo who?&amp;quot; |&lt;br /&gt;
| &amp;quot;Don't cry, it's only me.&amp;quot; |        (groan) |&lt;br /&gt;
@---------------------------------------------@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;gt;=&amp;gt;&lt;br /&gt;
TITLE&amp;amp;VERSION&amp;amp;OPERATING SYSTEM&amp;amp;PRICE&lt;br /&gt;
Slug Farm&amp;amp;2.0&amp;amp;FreeBSD&amp;amp;49.99&lt;br /&gt;
Figs of Doom&amp;amp;1.7&amp;amp;Linux&amp;amp;9.98&lt;br /&gt;
Smiley Goes to Happy Town&amp;amp;11.0&amp;amp;Windows&amp;amp;129.25&lt;br /&gt;
Wheelbarrow Motocross&amp;amp;1.0&amp;amp;BeOS&amp;amp;34.97&lt;br /&gt;
&lt;br /&gt;
Quadre:&lt;br /&gt;
@-----------------------------------------------------------------@&lt;br /&gt;
| TITLE                     |  VERSION| OPERATING SYSTEM |   PRICE|&lt;br /&gt;
|---------------------------+---------+------------------+--------|&lt;br /&gt;
| Slug Farm                 |     2.0 |          FreeBSD |  49.99 | &lt;br /&gt;
| Figs of Doom              |     1.7 |            Linux |   9.98 |&lt;br /&gt;
| Smiley Goes to Happy Town |    11.0 |          Windows | 129.25 |&lt;br /&gt;
| Wheelbarrow Motocross     |     1.0 |             BeOS |  34.97 |&lt;br /&gt;
@-----------------------------------------------------------------@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Nota''': Per emmagatzemar en una sola línea la Descripció pots utilitzar el simbol %: exemple: var d = &amp;quot;&amp;gt;%what is the answer?%42&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:[[Solució Instruens Fabulam]]&lt;br /&gt;
&lt;br /&gt;
== Exercicis per entregar ==&lt;br /&gt;
&lt;br /&gt;
=== Text al revés ===&lt;br /&gt;
Escriu un programa que posi al revés un text donat. S'ha de poder escollir si es vol caràcter a caràcter o paraula a paraula.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
text: &amp;quot;hola a tots&amp;quot;&lt;br /&gt;
caracter a caracter: &amp;quot;stot a aloh&amp;quot;&lt;br /&gt;
paraula a paraula : &amp;quot;tots a hola&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Nombres Romans ===&lt;br /&gt;
Escriu un programa que converteixi un enter positiu en un nombre romà. Assumeix que els nombres a convertir són menors a 3500. Les regles per construir un nombre romà són les que segueixen. En el sistema de nombres romans, i és el símbol per 1, v per 5, x per 10, l per 50, c per 100, d per 500 i m per 1000.&lt;br /&gt;
Les regles per formar numeros romans les tens [http://roble.pntic.mec.es/~msanto1/ortografia/numrom.htm aquí.]&lt;br /&gt;
Exemple: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
entrada : 1990&lt;br /&gt;
sortida : mcmxc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Retrat Robot ===&lt;br /&gt;
A causa de les dificultats de la policia per identificar als sospitosos, fa temps es va decidir substituir als dibuixants tradicionals per un programa que efectua el retrat robot a partir d'una descripció del delinqüent.&lt;br /&gt;
&lt;br /&gt;
El programa prototip requeria descripcions molt simples, on cada línia del dibuix es consigna indicant quantes vegades apareix cada caràcter.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció = &amp;quot;1 9W;1 1|2 1o1 1o2 1|;1@4 1U4 1@;1 1|2 3=2 1|;2 1\5_1/&amp;quot;&lt;br /&gt;
Dibuix:&lt;br /&gt;
 WWWWWWWWW&lt;br /&gt;
 |  O O  |&lt;br /&gt;
@    U    @&lt;br /&gt;
 |  ===  |&lt;br /&gt;
  \_____/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Escriu un programa que llegeixi una cadena de text on se separen pel caràcter ';' la descripció de cada línia del dibuix. El programa ha de donar com resultat el dibuix corresponent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Bibliografia / Webgrafia  ==&lt;br /&gt;
Luis Llana, Carlos Gregorio, Raquel Martínez, Pedro Palao y C. Pareja, &amp;quot;Ejercicios creativos y recreativos en C++&amp;quot;, Ed. Prentice-Hall, 2002. ISBN 84-205-3211-8.&lt;br /&gt;
&lt;br /&gt;
[http://librosweb.es/javascript/capitulo_3.html Introducció a Javascript] &lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[http://www.internetmania.net/int0/int0.htm Internetmania]&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Sintaxi_Javascript&amp;diff=7363</id>
		<title>NF2 - Sintaxi Javascript</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Sintaxi_Javascript&amp;diff=7363"/>
				<updated>2016-09-21T20:29:31Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* Dibuixos amb asteriscos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Generalitats ==&lt;br /&gt;
La sintaxi d'un llenguatge de programació es defineix com el conjunt de regles que han de seguir-se en escriure el codi font dels programes per considerar-se com a correctes per a aquest llenguatge de programació.&lt;br /&gt;
&lt;br /&gt;
La sintaxi de Javascript és molt similar a la d'altres llenguatges de programació com Java i C. Les normes bàsiques que defineixen la sintaxi de Javascript són les següents:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;No es tenen en compte els espais en blanc i les noves línies&amp;lt;/b&amp;gt;: com succeeix amb XHTML, l'intèrpret de Javascript ignora qualsevol espai en blanc sobrant, per la qual cosa el codi es pot ordenar de forma adequada per entendre-ho millor (tabulant les línies, afegint espais, creant noves línies, etc.)&lt;br /&gt;
* &amp;lt;b&amp;gt;Es distingeixen les majúscules i minúscules&amp;lt;/b&amp;gt;: igual que succeeix amb la sintaxi de les etiquetes i elements XHTML. No obstant això, si en una pàgina XHTML s'utilitzen indistintament majúscules i minúscules, la pàgina es visualitza correctament, sent l'únic problema la no validació de la pàgina. En canvi, si en Javascript s'intercanvien majúscules i minúscules el script no funciona.&lt;br /&gt;
* &amp;lt;b&amp;gt;No es defineix el tipus de les variables&amp;lt;/b&amp;gt;: en crear una variable, no és necessari indicar el tipus de dada que emmagatzemarà. D'aquesta forma, una mateixa variable pot emmagatzemar diferents tipus de dades durant l'execució del script.&lt;br /&gt;
* &amp;lt;b&amp;gt;No és necessari acabar cada sentència amb el caràcter de punt i coma (;)&amp;lt;/b&amp;gt;: en la majoria de llenguatges de programació, és obligatori acabar cada sentència amb el caràcter ;. Encara que Javascript no obliga a fer-ho, NOSALTRES seguirem la tradició d'acabar cada sentència amb el caràcter del punt i coma (;).&lt;br /&gt;
* &amp;lt;b&amp;gt;Es poden incloure comentaris&amp;lt;/b&amp;gt;: els comentaris s'utilitzen per afegir informació en el codi font del programa. Encara que el contingut dels comentaris no es visualitza per pantalla, si que s'envia al navegador de l'usuari juntament amb la resta del script, per la qual cosa és necessari extremar les precaucions sobre la informació inclosa en els comentaris.&lt;br /&gt;
&lt;br /&gt;
Javascript defineix dos tipus de comentaris: els de una sola línia i els que ocupen diverses línies.&lt;br /&gt;
&lt;br /&gt;
Els comentaris d'una sola línia es defineixen afegint dues barres obliqües (//) al principi de la línia :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// a continuació es mostra un missatge&lt;br /&gt;
&lt;br /&gt;
alert(&amp;quot;missatge de prova&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de comentari de diverses línies:&lt;br /&gt;
&amp;lt;&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Els comentaris de diverses línies són molt útils&lt;br /&gt;
quan es necessita incloure bastant informació&lt;br /&gt;
en els comentaris */&lt;br /&gt;
&lt;br /&gt;
alert(&amp;quot;missatge de prova&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els comentaris multilinia es defineixen tancant el text del comentari entre els símbols /* i */.&lt;br /&gt;
&lt;br /&gt;
== Variables ==&lt;br /&gt;
Les variables en els llenguatges de programació segueixen una lògica similar a les variables utilitzades en altres àmbits com les matemàtiques. Una variable és un element que s'empra per emmagatzemar i fer referència a un altre valor. Gràcies a les variables és possible crear &amp;quot;programes genèrics&amp;quot;, és a dir, programes que funcionen sempre igual independentment dels valors concrets utilitzats.&lt;br /&gt;
&lt;br /&gt;
De la mateixa forma que si en Matemàtiques no existissin les variables no es podrien definir les equacions i fórmules, en programació no es podrien fer programes realment útils sense les variables.&lt;br /&gt;
&lt;br /&gt;
Si no existissin variables, un programa que suma dos nombres podria escriure's com:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
resultat = 3 + 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El programa anterior és tan poc útil que només serveix per al cas en el qual el primer nombre de la summa sigui el 3 i el segon nombre sigui l'1. En qualsevol altre cas, el programa obté un resultat incorrecte.&lt;br /&gt;
&lt;br /&gt;
No obstant això, el programa es pot refer de la següent manera utilitzant variables per emmagatzemar i referir-se a cada nombre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
numero_1 = 3&lt;br /&gt;
numero_2 = 1&lt;br /&gt;
resultat = numero_1 + numero_2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els elements ''numero_1'' i ''numero_2'' són variables que emmagatzemen els valors que utilitza el programa. El resultat es calcula sempre en funció del valor emmagatzemat per les variables, per la qual cosa aquest programa funciona correctament per a qualsevol parell de nombres indicat. Si es modifica el valor de les variables ''numero_1'' i ''numero_2'', el programa segueix funcionant correctament.&lt;br /&gt;
&lt;br /&gt;
Les variables en Javascript es creen mitjançant la paraula reservada '''var'''. D'aquesta forma, l'exemple anterior es pot realitzar en Javascript de la següent manera:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1 = 3;&lt;br /&gt;
var numero_2 = 1;&lt;br /&gt;
var resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La paraula reservada ''var'' solament s'ha d'indicar en definir per primera vegada la variable, la qual cosa es denomina declarar una variable. Quan s'utilitzen les variables en la resta d'instruccions del *script, solament és necessari indicar el seu nom. En altres paraules, en l'exemple anterior seria un error indicar el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1 = 3;&lt;br /&gt;
var numero_2 = 1;&lt;br /&gt;
var resultat = *var numero_1 + *var numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si quan es declara una variable se li assigna també un valor, es diu que la variable ha estat inicialitzada. ''En Javascript no és obligatori inicialitzar les variables'', ja que es poden declarar d'una banda i assignar-los un valor posteriorment. Per tant, l'exemple anterior es pot refer de la següent manera:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1;&lt;br /&gt;
var numero_2;&lt;br /&gt;
&lt;br /&gt;
numero_1 = 3;&lt;br /&gt;
numero_2 = 1;&lt;br /&gt;
&lt;br /&gt;
var resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Una de les característiques més sorprenents de JavaSript per als programadors habituats a altres llenguatges de programació és que tampoc és necessari declarar les variables. En altres paraules, es poden utilitzar variables que no s'han definit anteriorment mitjançant la paraula reservada *var. L'exemple anterior també és correcte en Javascript de la següent forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1 = 3;&lt;br /&gt;
var numero_2 = 1;&lt;br /&gt;
&lt;br /&gt;
resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La variable resultat no està declarada, per la qual cosa Javascript crea una variable global (més endavant es veuran les diferències entre variables locals i globals) i li assigna el valor corresponent. De la mateixa forma, també seria correcte el següent codi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
numero_1 = 3;&lt;br /&gt;
numero_2 = 1;&lt;br /&gt;
&lt;br /&gt;
resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En qualsevol cas, es recomana declarar totes les variables que es vagin a utilitzar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;El nom d'una variable&amp;lt;/u&amp;gt; també es coneix com a identificador i &amp;lt;u&amp;gt;ha de complir les següents normes:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Només pot estar format per lletres, nombres i els símbols $ (dòlar) i _ (guió baix).&lt;br /&gt;
* El primer caràcter no pot ser un nombre.&lt;br /&gt;
&lt;br /&gt;
Per tant, les següents variables tenen noms correctes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var $numero1;&lt;br /&gt;
var _$lletra;&lt;br /&gt;
var $$$*otroNumero;&lt;br /&gt;
var $_a__$4;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
No obstant això, les següents variables tenen identificadors incorrectes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var 1numero; // Comença per un nombre&lt;br /&gt;
var numero;1_123; // Conté un caràcter &amp;quot;;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tipus de variables ===&lt;br /&gt;
Encara que totes les variables de Javascript es creen de la mateixa forma (mitjançant la paraula reservada var), la forma en la qual se'ls assigna un valor depèn del tipus de valor que es vol emmagatzemar (nombres, textos, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Numèriques ====&lt;br /&gt;
S'utilitzen per emmagatzemar valors numèrics enters (anomenats integer en anglès) o decimals (anomenats float en anglès). En aquest cas, el valor s'assigna indicant directament el nombre enter o decimal. Els nombres decimals utilitzen el caràcter . (punt) en comptes de , (coma) per separar la part sencera i la part decimal:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var iva = 16; // variable tipus sencer&lt;br /&gt;
var total = 234.65; // variable tipus decimal&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==== Cadenes de text ====&lt;br /&gt;
S'utilitzen per emmagatzemar caràcters, paraules i/o frases de text. Per assignar el valor a la variable, es tanca el valor entre cometes dobles o simples, per delimitar el seu començament i el seu final:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Benvingut al nostre lloc web&amp;quot;;&lt;br /&gt;
var nombreProducto = 'Producte ABC';&lt;br /&gt;
var letraSeleccionada = 'c';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En ocasions, el text que s'emmagatzema en les variables no és tan senzill. Si per exemple el propi text conté cometes simples o dobles, l'estratègia que se segueix és la de tancar el text amb les cometes (simples o dobles) que no utilitzi el text:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* El contingut de text1 té cometes simples, per&lt;br /&gt;
la qual cosa es tanca amb cometes dobles */&lt;br /&gt;
var text1 = &amp;quot;Una frase amb 'cometes simples' dins&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* El contingut de text2 té cometes dobles, per&lt;br /&gt;
la qual cosa es tanca amb cometes simples */&lt;br /&gt;
var text2 = 'Una frase amb &amp;quot;cometes dobles&amp;quot; dins';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No obstant això, de vegades les cadenes de text contenen tant cometes simples com a dobles. A més, existeixen altres caràcters que són difícils d'incloure en una variable de text (tabulador, ENTER, etc.) Per resoldre aquests problemes, Javascript defineix un mecanisme per incloure de forma senzilla caràcters especials i problemàtics dins d'una cadena de text.&lt;br /&gt;
&lt;br /&gt;
El mecanisme consisteix a substituir el caràcter problemàtic per una combinació simple de caràcters. A continuació es mostra la taula de conversió que s'ha d'utilitzar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Si es vol incloure...	S'ha d'incloure...&lt;br /&gt;
Una nova línia          \n	&lt;br /&gt;
Un tabulador	        \t&lt;br /&gt;
Una cometa simple	\'&lt;br /&gt;
Una cometa doble	\&amp;quot;&lt;br /&gt;
Una barra inclinada	\\&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
D'aquesta forma, l'exemple anterior que contenia cometes simples i dobles dins del text es pot refer de la següent forma:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var text1 = 'Una frase amb \'cometes simples\' dins';&lt;br /&gt;
&lt;br /&gt;
var text2 = &amp;quot;Una frase amb \&amp;quot;cometes dobles\&amp;quot; dins&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Aquest mecanisme de Javascript es denomina &amp;quot;mecanisme de fuita&amp;quot; dels caràcters problemàtics, i és habitual referir-se al fet que els caràcters han estat &amp;quot;escapats&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Arrays ====&lt;br /&gt;
En ocasions, als arrays se'ls anomena vectors, matrius i fins i tot arranjaments. No obstant això, el terme array és el més utilitzat i és una paraula comunament acceptada a l'entorn de la programació.&lt;br /&gt;
&lt;br /&gt;
Un array és una col·lecció de variables, que poden ser totes del mateix tipus o cadascuna d'un tipus diferent. La seva utilitat es comprèn millor amb un exemple senzill: si una aplicació necessita utilitzar els dies de la setmana, es podrien crear set variables de tipus text:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dia1 = &amp;quot;Dilluns&amp;quot;;&lt;br /&gt;
var dia2 = &amp;quot;Dimarts&amp;quot;;&lt;br /&gt;
...&lt;br /&gt;
var dia7 = &amp;quot;Diumenge&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Encara que el codi anterior no és incorrecte, sí que és poc eficient i complica a l'excés la programació. Si en comptes dels dies de la setmana s'hagués de guardar el nom dels mesos de l'any, el nom de tots els països del món o els mesuraments diaris de temperatura dels últims 100 anys, s'haurien de crear desenes o centenars de variables.&lt;br /&gt;
&lt;br /&gt;
En aquest tipus de casos, es poden agrupar totes les variables relacionades en una col·lecció de variables o array. L'exemple anterior es pot refer de la següent forma:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dies = [&amp;quot;Dilluns&amp;quot;, &amp;quot;Dimarts&amp;quot;, &amp;quot;Dimecres&amp;quot;, &amp;quot;Dijous&amp;quot;, &amp;quot;Divendres&amp;quot;, &amp;quot;Dissabte&amp;quot;, &amp;quot;Diumenge&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ara, una única variable anomenada ''dies'' emmagatzema tots els valors relacionats entre si, en aquest cas els dies de la setmana. Per definir un array, s'utilitzen els caràcters [ i ] per delimitar el seu començament i el seu final i s'utilitza el caràcter , (coma) per separar els seus elements:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nom_array = [valor1, valor2, ...,valorN];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Una vegada definit un array, és molt senzill accedir a cadascun dels seus elements. Cada element s'accedeix indicant la seva posició dins del array. L'única complicació, que és responsable de molts errors quan es comença a programar, és que les posicions dels elements comencen a explicar-se en el 0 i no en l'1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var diaSeleccionat = dies[0]; // diaSeleccionat = &amp;quot;Dilluns&amp;quot;&lt;br /&gt;
&lt;br /&gt;
var altreDia = dies[5]; // altreDia = &amp;quot;Dissabte&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En l'exemple anterior, la primera instrucció vol obtenir el primer element del array. Per a això, s'indica el nom del array i entre claudàtors la posició de l'element dins del array. Com s'ha comentat, ''les posicions del array comencen a partir del 0'', per la qual cosa el primer element ocupa la posició 0 i s'accedeix al mitjançant dias[0].&lt;br /&gt;
&lt;br /&gt;
El valor dies[5] fa referència a l'element que ocupa la sisena posició dins del array dies. Com les posicions comencen a explicar-se en 0, la posició 5 fa referència al sisè element, en aquest cas, el valor Dissabte.&lt;br /&gt;
&lt;br /&gt;
==== Booleans ====&lt;br /&gt;
Les variables de tipus boolean o booleà també es coneixen amb el nom de variables de tipus lògic. El seu funcionament bàsic és molt senzill.&lt;br /&gt;
&lt;br /&gt;
Una variable de tipus boolean emmagatzema un tipus especial de valor que solament pot prendre dos valors: '''true''' (veritable) o '''false''' (fals). No es pot utilitzar per emmagatzemar nombres i tampoc permet guardar cadenes de text.&lt;br /&gt;
&lt;br /&gt;
Els únics valors que poden emmagatzemar aquestes variables són true i false, per la qual cosa no poden utilitzar-se els valors veritable i fals. A continuació es mostra un parell de variables de tipus booleà:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var clientRegistrat = false;&lt;br /&gt;
var iva = true;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Operadors ===&lt;br /&gt;
&lt;br /&gt;
Els operadors permeten manipular el valor de les variables, realitzar operacions matemàtiques amb els seus valors i comparar diferents variables. D'aquesta forma, els operadors permeten als programes realitzar càlculs complexos i prendre decisions lògiques en funció de comparacions i altres tipus de condicions.&lt;br /&gt;
&lt;br /&gt;
==== Assignació ====&lt;br /&gt;
&lt;br /&gt;
L'operador d'assignació és el més utilitzat i el més senzill. Aquest operador s'utilitza per guardar un valor específic en una variable. El símbol utilitzat és = (no confondre amb l'operador == que es veurà més endavant):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 3;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A l'esquerra de l'operador, sempre ha d'indicar-se el nom d'una variable. A la dreta de l'operador, es poden indicar variables, valors, condicions lògiques, etc:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 3;&lt;br /&gt;
var numero2 = 4;&lt;br /&gt;
&lt;br /&gt;
/* Error, l'assignació sempre es realitza a una variable,&lt;br /&gt;
per la qual cosa en l'esquerra no es pot indicar un número */&lt;br /&gt;
5 = numero1;&lt;br /&gt;
&lt;br /&gt;
// Ara, la variable numero1 val 5&lt;br /&gt;
numero1 = 5;&lt;br /&gt;
&lt;br /&gt;
// Ara, la variable numero1 val 4&lt;br /&gt;
numero1 = numero2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Increment i decrement====&lt;br /&gt;
Aquests dos operadors solament són vàlids per a les variables numèriques i s'utilitzen per incrementar o decrementar en una unitat el valor d'una variable.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
++numero;&lt;br /&gt;
alert(numero); // numero = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L'operador d'increment s'indica mitjançant el prefix ++ en el nom de la variable. El resultat és que el valor d'aquesta variable s'incrementa en una unitat. Per tant, l'anterior exemple és equivalent a:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
numero = numero + 1;&lt;br /&gt;
alert(numero); // numero = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
De forma equivalent, l'operador decrement (indicat com un prefix -- en el nom de la variable) s'utilitza per decrementar el valor de la variable:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
--numero;&lt;br /&gt;
alert(numero); // numero = 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'anterior exemple és equivalent a:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
numero = numero - 1;&lt;br /&gt;
alert(numero); // numero = 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els operadors d'increment i decremento no solament es poden indicar com a prefix del nom de la variable, sinó que també és possible utilitzar-los com a sufix. En aquest cas, el seu comportament és similar però molt diferent. En el següent exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
numero++;&lt;br /&gt;
alert(numero); // numero = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El resultat d'executar el script anterior és el mateix que quan s'utilitza l'operador ++numero, per la qual cosa pot semblar que és equivalent indicar l'operador ++ davant o darrere de l'identificador de la variable. No obstant això, el següent exemple mostra les seves diferències:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
var numero2 = 2;&lt;br /&gt;
numero3 = numero1++ + numero2;&lt;br /&gt;
// numero3 = 7, numero1 = 6&lt;br /&gt;
&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
var numero2 = 2;&lt;br /&gt;
numero3 = ++numero1 + numero2;&lt;br /&gt;
// numero3 = 8, numero1 = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si l'operador ++ s'indica com a prefix de l'identificador de la variable, el seu valor s'incrementa abans de realitzar qualsevol altra operació. Si l'operador ++ s'indica com a sufix de l'identificador de la variable, el seu valor s'incrementa després d'executar la sentència en la qual apareix.&lt;br /&gt;
&lt;br /&gt;
Per tant, en la instrucció numero3 = numero1++ + numero2;, el valor de numero1 s'incrementa després de realitzar l'operació (primer se sumeixi i numero3 val 7, després s'incrementa el valor de numero1 i val 6). No obstant això, en la instrucció numero3 = ++numero1 + numero2;, en primer lloc s'incrementa el valor de numero1 i després es realitza la summa (primer s'incrementa numero1 i val 6, després es realitza la summa i numero3 val 8).&lt;br /&gt;
&lt;br /&gt;
==== Lògics ====&lt;br /&gt;
Els operadors lògics són imprescindibles per realitzar aplicacions complexes, ja que s'utilitzen per prendre decisions sobre les instruccions que hauria d'executar el programa en funció de certes condicions.&lt;br /&gt;
&lt;br /&gt;
El resultat de qualsevol operació que utilitzi operadors lògics sempre és un valor lògic o booleà.&lt;br /&gt;
&lt;br /&gt;
===== Negació =====&lt;br /&gt;
Un dels operadors lògics més utilitzats és el de la negació. S'utilitza per obtenir el valor contrari al valor de la variable:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var visible = true;&lt;br /&gt;
alert(!visible); // Mostra &amp;quot;false&amp;quot; i no &amp;quot;true&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La negació lògica s'obté prefixant el símbol ! a l'identificador de la variable. El funcionament d'aquest operador es resumeix en la següent taula:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
variable	!variable&lt;br /&gt;
true    	false&lt;br /&gt;
false	        true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si la variable original és de tipus booleà, és molt senzill obtenir la seva negació. No obstant això, què succeeix quan la variable és un nombre o una cadena de text? Per obtenir la negació en aquest tipus de variables, es realitza en primer lloc la seva conversió a un valor booleà:&lt;br /&gt;
&lt;br /&gt;
Si la variable conté un nombre, es transforma en false si val 0 i en true per a qualsevol altre nombre (positiu o negatiu, decimal o sencer).&lt;br /&gt;
Si la variable conté una cadena de text, es transforma en false si la cadena és buida (&amp;quot;&amp;quot;) i en true en qualsevol altre cas.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quantitat = 0;&lt;br /&gt;
buit = !quantitat; // buit = true&lt;br /&gt;
&lt;br /&gt;
quantitat = 2;&lt;br /&gt;
buit = !quantitat; // buit = false&lt;br /&gt;
&lt;br /&gt;
var missatge = &amp;quot;&amp;quot;;&lt;br /&gt;
missatgebuit = !missatge; // missatgebuit = true&lt;br /&gt;
&lt;br /&gt;
missatge = &amp;quot;Benvingut&amp;quot;;&lt;br /&gt;
missatgebuit = !missatge; // missatgebuit = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== AND =====&lt;br /&gt;
L'operació lògica AND obté el seu resultat combinant dos valors booleans. L'operador s'indica mitjançant el símbol &amp;amp;&amp;amp; i el seu resultat solament és true si els dos operands són true:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
variable1	variable2	variable1 &amp;amp;&amp;amp; variable2&lt;br /&gt;
  true	           true	                 true&lt;br /&gt;
  true	           false	         false&lt;br /&gt;
  false	           true	                 false&lt;br /&gt;
  false	           false	         false&lt;br /&gt;
&lt;br /&gt;
var valor1 = true;&lt;br /&gt;
var valor2 = false;&lt;br /&gt;
resultat = valor1 &amp;amp;&amp;amp; valor2; // resultat = false&lt;br /&gt;
&lt;br /&gt;
valor1 = true;&lt;br /&gt;
valor2 = true;&lt;br /&gt;
resultat = valor1 &amp;amp;&amp;amp; valor2; // resultat = true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== OR =====&lt;br /&gt;
L'operació lògica OR també combina dos valors booleans. L'operador s'indica mitjançant el símbol || i el seu resultat és true si algun dels dos operands és true:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
variable1	variable2	variable1 || variable2&lt;br /&gt;
  true	           true	                 true&lt;br /&gt;
  true	           false	         true&lt;br /&gt;
  false	           true	                 true&lt;br /&gt;
  false	           false	         false&lt;br /&gt;
&lt;br /&gt;
var valor1 = true;&lt;br /&gt;
var valor2 = false;&lt;br /&gt;
resultat = valor1 || valor2; // resultat = true&lt;br /&gt;
&lt;br /&gt;
valor1 = false;&lt;br /&gt;
valor2 = false;&lt;br /&gt;
resultat = valor1 || valor2; // resultat = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Matemàtics ====&lt;br /&gt;
Javascript permet realitzar manipulacions matemàtiques sobre el valor de les variables numèriques. Els operadors definits són: suma (+), resta (-), multiplicació (*) i divisió (/). Exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 10;&lt;br /&gt;
var numero2 = 5;&lt;br /&gt;
&lt;br /&gt;
resultat = numero1 / numero2; // resultat = 2&lt;br /&gt;
resultat = 3 + numero1; // resultat = 13&lt;br /&gt;
resultat = numero2 – 4; // resultat = 1&lt;br /&gt;
resultat = numero1 * numero 2; // resultat = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A més dels quatre operadors bàsics, Javascript defineix un altre operador matemàtic que no és senzill d'entendre quan s'estudia per primera vegada, però que és molt útil en algunes ocasions.&lt;br /&gt;
&lt;br /&gt;
Es tracta de l'operador &amp;quot;mòdul&amp;quot;, que calcula la resta de la divisió sencera de dos nombres. Si es divideix per exemple 10 i 5, la divisió és exacta i dóna un resultat de 2. La resta d'aquesta divisió és 0, per la qual cosa mòdul de 10 i 5 és igual a 0.&lt;br /&gt;
&lt;br /&gt;
No obstant això, si es divideix 9 i 5, la divisió no és exacta, el resultat és 1 i la resta 4, per la qual cosa mòdul de 9 i 5 és igual a 4.&lt;br /&gt;
&lt;br /&gt;
L'operador mòdul en Javascript s'indica mitjançant el símbol %, que no ha de confondre's amb el càlcul del percentatge:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 10;&lt;br /&gt;
var numero2 = 5;&lt;br /&gt;
resultat = numero1 % numero2; // resultat = 0&lt;br /&gt;
&lt;br /&gt;
numero1 = 9;&lt;br /&gt;
numero2 = 5;&lt;br /&gt;
resultat = numero1 % numero2; // resultat = 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els operadors matemàtics també es poden combinar amb l'operador d'assignació per abreujar la seva notació:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
numero1 += 3; // numero1 = numero1 + 3 = 8&lt;br /&gt;
numero1 -= 1; // numero1 = numero1 - 1 = 4&lt;br /&gt;
numero1 *= 2; // numero1 = numero1 * 2 = 10&lt;br /&gt;
numero1 /= 5; // numero1 = numero1 / 5 = 1&lt;br /&gt;
numero1 %= 4; // numero1 = numero1 % 4 = 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Relacionals ====&lt;br /&gt;
Els operadors relacionals definits per Javascript són idèntics als quals defineixen les matemàtiques: major que (&amp;gt;), menor que (&amp;lt;), major o igual (&amp;gt;=), menor o igual (&amp;lt;=), igual que (==) i diferent de (!=).&lt;br /&gt;
&lt;br /&gt;
Els operadors que relacionen variables són imprescindibles per realitzar qualsevol aplicació complexa, com es veurà en el següent capítol de programació avançada. El resultat de tots aquests operadors sempre és un valor booleà:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 3;&lt;br /&gt;
var numero2 = 5;&lt;br /&gt;
resultat = numero1 &amp;gt; numero2; // resultat = false&lt;br /&gt;
resultat = numero1 &amp;lt; numero2; // resultat = true&lt;br /&gt;
&lt;br /&gt;
numero1 = 5;&lt;br /&gt;
numero2 = 5;&lt;br /&gt;
resultat = numero1 &amp;gt;= numero2; // resultat = true&lt;br /&gt;
resultat = numero1 &amp;lt;= numero2; // resultat = true&lt;br /&gt;
resultat = numero1 == numero2; // resultat = true&lt;br /&gt;
resultat = numero1 != numero2; // resultat = false&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
S'ha de tenir especial cura amb l'operador d'igualtat (==), ja que és l'origen de la majoria d'errors de programació, fins i tot per als usuaris que ja tenen certa experiència desenvolupant scripts. L'operador == s'utilitza per comparar el valor de dues variables, per la qual cosa és molt diferent de l'operador =, que s'utilitza per assignar un valor a una variable:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// L'operador &amp;quot;=&amp;quot; assigna valors&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
resultat = numero1 = 3; // numero1 = 3 i resultat = 3&lt;br /&gt;
&lt;br /&gt;
// L'operador &amp;quot;==&amp;quot; compara variables&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
resultat = numero1 == 3; // numero1 = 5 i resultat = *false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els operadors relacionals també es poden utilitzar amb variables de tipus cadena de text:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var text1 = &amp;quot;hola&amp;quot;;&lt;br /&gt;
var text2 = &amp;quot;hola&amp;quot;;&lt;br /&gt;
var text3 = &amp;quot;*adios&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
resultat = text1 == text3; // resultat = false&lt;br /&gt;
resultat = text1 != text2; // resultat = false&lt;br /&gt;
resultat = text3 &amp;gt;= text2; // resultat = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Quan s'utilitzen cadenes de text, els operadors &amp;quot;major que&amp;quot; (&amp;gt;) i &amp;quot;menor que&amp;quot; (&amp;lt;) segueixen un raonament no intuïtiu: es compara lletra a lletra començant des de l'esquerra fins que es trobi una diferència entre les dues cadenes de text. Per determinar si una lletra és major o menor que una altra, les majúscules es consideren menors que les minúscules i les primeres lletres de l'alfabet són menors que les últimes (a és menor que b, b és menor que c, A és menor que a, etc.)&lt;br /&gt;
=== Àmbit de les Varibles ===&lt;br /&gt;
Un altre aspecte a tenir en compte a l'hora d'usar les variables és el seu àmbit, és a dir, quines funcions tenen accés a elles. Si es crea una ''variable dins d'una funció'' només serà coneguda dins d'aquesta funció, es tracta de ''variables locals''. Si es necessita que diverses funcions tinguin accés a una determinada variable aquesta ha de crear-se com a variable global, això es fa creant-la fora de totes les funcions. Per exemple en el següent script tenim variables globals i locals:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script language=&amp;quot;Javascript&amp;quot;&amp;gt;&lt;br /&gt;
     var navegador_versio = 0;&lt;br /&gt;
     function veureNavegador()&lt;br /&gt;
     {&lt;br /&gt;
          var versio;&lt;br /&gt;
          versio = document.appVersion;&lt;br /&gt;
          return versio;&lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En aquest exemple ''navegador_versio'' és una variable global i ''versió'' és una variable local que només existeix dintre de la funciò ''veureNavegador''.&lt;br /&gt;
Què succeeix si una funció defineix una variable local amb el mateix nom que una variable global que ja existeix? En aquest cas, l''es variables locals prevalen sobre les globals, però només dins de la funció'':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var missatge = &amp;quot;guanya la de fora&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    function mostraMissatge() {&lt;br /&gt;
        var missatge = &amp;quot;guanya la de dins&amp;quot;;&lt;br /&gt;
        alert(missatge);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
    mostraMissatge();&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Què succeeix si dins d'una funció es defineix una variable global amb el mateix nom que una altra variable global que ja existeix? En aquest altre cas, la variable global definida dins de la funció simplement modifica el valor de la variable global definida anteriorment:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var missatge = &amp;quot;guanya la de fora&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    function mostraMissatge() {&lt;br /&gt;
        missatge = &amp;quot;guanya la de dins&amp;quot;;&lt;br /&gt;
        alert(missatge);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
    mostraMissatge();&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La diferencia dels dos exemples anteriors ve donat per la definició d'una variable anomenada igual que una altre global. En el primer exemple s'utilitza la paraula reservada '''var''' i en el últim exemple NO s'utilitza. El fet de NO utilitzar la paraula reservada '''var''' s'interpreta com que es vol utilitzar la variable global definida abans de la funció.&lt;br /&gt;
&lt;br /&gt;
Resumint, la recomanació general és definir com a variables locals totes les variables que siguin d'ús exclusiu per realitzar les tasques encarregades a cada funció. Les variables globals s'utilitzen per compartir dades entre funcions de forma senzilla.&lt;br /&gt;
&lt;br /&gt;
== Estructures de control de Flux ==&lt;br /&gt;
&lt;br /&gt;
=== Estructura IF ===&lt;br /&gt;
L'estructura més utilitzada en Javascript i en la majoria de llenguatges de programació és l'estructura if. S'empra per prendre decisions en funció d'una condició. La seva definició formal és:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if(condicion) {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si la condició es compleix (és a dir, si el seu valor és true) s'executen totes les instruccions que es troben dins de {...}. Si la condició no es compleix (és a dir, si el seu valor és false) no s'executa cap instrucció continguda en {...} i el programa continua executant la resta d'instruccions del script.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var mostrado = false;&lt;br /&gt;
var usuarioPermiteMensajes = true;&lt;br /&gt;
 &lt;br /&gt;
if(!mostrado &amp;amp;&amp;amp; usuarioPermiteMensajes) {&lt;br /&gt;
  alert(&amp;quot;Es la primera vez que se muestra el mensaje&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Estructura IF....ELSE ===&lt;br /&gt;
Normalment les condicions solen ser del tipus &amp;quot;si es compleix aquesta condició, fes-ho; si no es compleix, fes això un altre&amp;quot;. Existeix una variant de l'estructura if trucada if...else. La seva definició formal és la següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if(condicion) {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La estructura if...else es pot encadenar per realitzar diverses comprovacions seguides:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if(edad &amp;lt; 12) {&lt;br /&gt;
  alert(&amp;quot;Todavía eres muy pequeño&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if(edad &amp;lt; 19) {&lt;br /&gt;
  alert(&amp;quot;Eres un adolescente&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if(edad &amp;lt; 35) {&lt;br /&gt;
  alert(&amp;quot;Aun sigues siendo joven&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
  alert(&amp;quot;Piensa en cuidarte un poco más&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selecció Múltiple ===&lt;br /&gt;
Poden existir casos en els quals el programa hagi de tenir mes de dues alternatives, per exemple si volem un programa que mostri un títol en un idioma de quatre possibles. Això pot solucionar-se mitjançant diversos if. Hem de triar entre idiomes: castellà, engonals, francès i alemany.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (leng == &amp;quot;ESPANYOL&amp;quot;)&lt;br /&gt;
       pagCast();&lt;br /&gt;
else&lt;br /&gt;
       if (leng == &amp;quot;ANGLES&amp;quot;)&lt;br /&gt;
              pagIng();&lt;br /&gt;
       else&lt;br /&gt;
             if (leng == &amp;quot;FRANCES&amp;quot;)&lt;br /&gt;
                    pagFran();&lt;br /&gt;
             else&lt;br /&gt;
                   if (leng == &amp;quot;CATALA&amp;quot;)&lt;br /&gt;
                          pagCat();&lt;br /&gt;
                   else&lt;br /&gt;
                            error('idioma desconegut');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per a aquests casos disposem de la sentència switch...casi...default, de selecció múltiple. L'exemple anterior quedaria:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
switch (idioma) {&lt;br /&gt;
    case 'espanyol' :&lt;br /&gt;
          pagCast();&lt;br /&gt;
          break;&lt;br /&gt;
    case 'ingles' :&lt;br /&gt;
          pagIng();&lt;br /&gt;
          break;&lt;br /&gt;
    case 'frances' :&lt;br /&gt;
          pagFran();&lt;br /&gt;
          break;&lt;br /&gt;
    case 'catala' :&lt;br /&gt;
          pagCat();&lt;br /&gt;
          break;&lt;br /&gt;
    default :&lt;br /&gt;
          error ('Idioma desconegut');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La instrucció ''break'' posa fi al bloc i fa que el programa salti a la instrucció següent a la sentència ''switch''(), si s'omet el programa continuaria amb la següent comparació. La secció del ''default'' és opcional, la seva finalitat és executar algun codi quan cap de les condicions es compleixi.&lt;br /&gt;
&lt;br /&gt;
=== Estructura WHILE ===&lt;br /&gt;
En aquesta estructura el programa primer comprova la condició: si és certa pansa a executar el cos del bucle, i si és falsa pansa a la instrucció següent a la sentència while.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
while(condició){&lt;br /&gt;
....&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var resultat = 0;&lt;br /&gt;
var numero = 100;&lt;br /&gt;
var i = 0;&lt;br /&gt;
 &lt;br /&gt;
while(i &amp;lt;= numero) {&lt;br /&gt;
  resultat += i;&lt;br /&gt;
  i++;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
alert(resultat);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El programa ha de sumar tots els nombres menors o igual que un altre donat. Per exemple si el nombre és 5, s'ha de calcular: 1 + 2 + 3 + 4 + 5 = 15&lt;br /&gt;
&lt;br /&gt;
=== Estructura DO...WHILE ===&lt;br /&gt;
Es tracta d'un bucle en el qual la condició es comprova després de la primera iteració, és a dir que el cos del bucle s'executa almenys una vegada. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  ...&lt;br /&gt;
} while(condició);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Utilitzant aquest bucle es pot calcular fàcilment el factorial d'un numero:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var resultat = 1;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
 &lt;br /&gt;
do {&lt;br /&gt;
  resultat *= numero;  // resultat = resultat * numero&lt;br /&gt;
  numero--;&lt;br /&gt;
} while(numero &amp;gt; 0);&lt;br /&gt;
 &lt;br /&gt;
alert(resultat);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Estructura FOR ===&lt;br /&gt;
L'estructura for permet realitzar repeticions (també anomenades bucles) d'instruccions d'una forma molt senzilla. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for(inicializació; condició; actualizació) {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La idea del funcionament d'un bucle for és la següent: &amp;quot;mentre la condició indicada se segueixi complint, repeteix l'execució de les instruccions definides dins del for. A més, després de cada repetició, actualitza el valor de les variables que s'utilitzen en la condició&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* La &amp;quot;inicialització&amp;quot; és la zona en la qual s'estableix els valors inicials de les variables que controlen la repetició.&lt;br /&gt;
* La &amp;quot;condició&amp;quot; és l'únic element que decideix si contínua o es deté la repetició.&lt;br /&gt;
* La &amp;quot;actualització&amp;quot; és el nou valor que s'assigna després de cada repetició a les variables que controlen la repetició.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola, estic dintre d'un bucle&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
for(var i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
  alert(missatge);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Un altre exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dies = [&amp;quot;Dilluns&amp;quot;, &amp;quot;Dimarts&amp;quot;, &amp;quot;Dimecres&amp;quot;, &amp;quot;Dijous&amp;quot;, &amp;quot;Divendres&amp;quot;, &amp;quot;Dissabte&amp;quot;, &amp;quot;Diumenge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
for(var i=0; i&amp;lt;7; i++) {&lt;br /&gt;
  alert(dies[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Estructura For...IN ===&lt;br /&gt;
La seva definició exacta implica l'ús d'objectes, que és un element de programació que encara no anem a estudiar. Per tant, solament es va a presentar l'estructura for...in adaptada al seu ús en arrays. La seva definició formal adaptada als arrays és:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for(indice in array) {&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dies = [&amp;quot;Dilluns&amp;quot;, &amp;quot;Dimarts&amp;quot;, &amp;quot;Dimecres&amp;quot;, &amp;quot;Dijous&amp;quot;, &amp;quot;Divendres&amp;quot;, &amp;quot;Dissabte&amp;quot;, &amp;quot;Diumenge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
for(i in dies) {&lt;br /&gt;
  alert(dies[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Funcions útils del llenguatge ==&lt;br /&gt;
=== Funcions de cadenes de text ===&lt;br /&gt;
&lt;br /&gt;
'''length''', calcula la longitud d'una cadena de text (el nombre de caràcters que la formen)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var numeroLetras = missatge.length; // numeroLetras = 10&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''+''', s'empra per concatenar diverses cadenes de text&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = &amp;quot; Món&amp;quot;;&lt;br /&gt;
var missatge = missatge1 + missatge2; // missatge = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A més de l'operador +, també es pot utilitzar la funció '''concat()'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = missatge1.concat(&amp;quot; Món&amp;quot;); // missatge2 = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les cadenes de text també es poden unir amb variables numèriques:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var variable1 = &amp;quot;Hola &amp;quot;;&lt;br /&gt;
var variable2 = 3;&lt;br /&gt;
var missatge = variable1 + variable2; // missatge = &amp;quot;Hola 3&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Quan s'uneixen diverses cadenes de text és habitual oblidar afegir un espai de separació entre les paraules:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = &amp;quot;Món&amp;quot;;&lt;br /&gt;
var missatge = missatge1 + missatge2; // missatge = &amp;quot;HolaMón&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els espais en blanc es poden afegir al final o al principi de les cadenes i també es poden indicar forma explícita:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = &amp;quot;Món&amp;quot;;&lt;br /&gt;
var missatge = missatge1 + &amp;quot; &amp;quot; + missatge2; // missatge = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''toUpperCase()''', transforma tots els caràcters de la cadena als seus corresponents caràcters en majúscules:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = missatge1.toUpperCase(); // missatge2 = &amp;quot;HOLA&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''toLowerCase()''', transforma tots els caràcters de la cadena als seus corresponents caràcters en minúscules:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;HOLA&amp;quot;;&lt;br /&gt;
var missatge2 = missatge1.toLowerCase(); // missatge2 = &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''charAt(posició)''', obté el caràcter que es troba en la posició indicada:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var lletra = missatge.charAt(0); // lletra = H&lt;br /&gt;
lletra = missatge.charAt(2); // lletra = l&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''indexOf(caracter)''', calcula la posició en la qual es troba el caràcter indicat dins de la cadena de text. Si el caràcter s'inclou diverses vegades dins de la cadena de text, es retorna la seva primera posició començant a buscar des de l'esquerra. Si la cadena no conté el caràcter, la funció retorna el valor -1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var posicion = missatge.indexOf('a'); // posicion = 3&lt;br /&gt;
posicion = missatge.indexOf('b'); // posicion = -1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La seva funció anàloga és lastIndexOf():&lt;br /&gt;
&lt;br /&gt;
'''lastIndexOf(caracter'''), calcula l'última posició en la qual es troba el caràcter indicat dins de la cadena de text. Si la cadena no conté el caràcter, la funció retorna el valor -1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var posicion = missatge.lastIndexOf('a'); // posicion = 3&lt;br /&gt;
posicion = missatge.lastIndexOf('b'); // posicion = -1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La funció lastIndexOf() comença la seva cerca des del final de la cadena cap al principi, encara que la posició retornada és la correcta començant a explicar des del principi de la paraula.&lt;br /&gt;
&lt;br /&gt;
'''substring(inici, final)''', extreu una porció d'una cadena de text. El segon paràmetre és opcional. Si només s'indica el paràmetre inicio, la funció retorna la part de la cadena original corresponent des d'aquesta posició fins al final:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(2); // porcion = &amp;quot;la Món&amp;quot;&lt;br /&gt;
porcion = missatge.substring(5); // porcion = &amp;quot;Món&amp;quot;&lt;br /&gt;
porcion = missatge.substring(7); // porcion = &amp;quot;ndo&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si s'indica un inici negatiu, es retorna la mateixa cadena original:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(-2); // porcion = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Quan s'indica l'inici i el final, es retorna la part de la cadena original compresa entre la posició inicial i la immediatament anterior a la posició final (és a dir, la posició inicio està inclosa i la posició final no):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(1, 8); // porcion = &amp;quot;ona Mun&amp;quot;&lt;br /&gt;
porcion = missatge.substring(3, 4); // porcion = &amp;quot;a&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si s'indica un final més petit que l'inici, Javascript els considera de forma inversa, ja que automàticament assigna el valor més petit a l'inici i el més gran al final:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(5, 0); // porcion = &amp;quot;Hola &amp;quot;&lt;br /&gt;
porcion = missatge.substring(0, 5); // porcion = &amp;quot;Hola &amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''split(separador'''), converteix una cadena de text en un array de cadenes de text. La funció parteix la cadena de text determinant els seus trossos a partir del caràcter separador indicat:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món, sóc una cadena de text!&amp;quot;;&lt;br /&gt;
var paraules = missatge.split(&amp;quot; &amp;quot;);&lt;br /&gt;
// paraules = [&amp;quot;Hola&amp;quot;, &amp;quot;Món,&amp;quot;, &amp;quot;sóc&amp;quot;, &amp;quot;una&amp;quot;, &amp;quot;cadena&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;text!&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Amb aquesta funció es poden extreure fàcilment les lletres que formen una paraula:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var paraula = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var lletres = paraula.split(&amp;quot;&amp;quot;); // lletres = [&amp;quot;H&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;a&amp;quot;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Funcions d'arrays ===&lt;br /&gt;
'''length''', calcula el nombre d'elements d'un array&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var vocals = [&amp;quot;a&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;o&amp;quot;];&lt;br /&gt;
var numeroVocales = vocals.length; // numeroVocales = 5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''concat()''', s'empra per concatenar els elements de diversos arrays&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array1 = [1, 2, 3];&lt;br /&gt;
array2 = array1.concat(4, 5, 6); // array2 = [1, 2, 3, 4, 5, 6]&lt;br /&gt;
array3 = array1.concat([4, 5, 6]); // array3 = [1, 2, 3, 4, 5, 6]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''join(separador)''', és la funció contrària a split(). Uneix tots els elements d'un array per formar una cadena de text. Per unir els elements s'utilitza el caràcter separador indicat&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [&amp;quot;hola&amp;quot;, &amp;quot;món&amp;quot;];&lt;br /&gt;
var missatge = array.join(&amp;quot;&amp;quot;); // missatge = &amp;quot;holamundo&amp;quot;&lt;br /&gt;
missatge = array.join(&amp;quot; &amp;quot;); // missatge = &amp;quot;hola món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''pop()''', elimina l'últim element del array i ho retorna. El array original es modifica i la seva longitud disminueix en 1 element.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
var ultimo = array.pop();&lt;br /&gt;
// ara array = [1, 2], ultimo = 3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''push()''', afegeix un element al final del array. El array original es modifica i augmenta la seva longitud en 1 element. (També és possible afegir més d'un element alhora)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
array.push(4);&lt;br /&gt;
// ara array = [1, 2, 3, 4]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''shift()''', elimina el primer element del array i ho retorna. El array original es veu modificat i la seva longitud disminuïda en 1 element.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
var primer = array.shift();&lt;br /&gt;
// ara array = [2, 3], primer = 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''unshift()''', afegeix un element al principi del array. El array original es modifica i augmenta la seva longitud en 1 element. (També és possible afegir més d'un element alhora)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
array.unshift(0);&lt;br /&gt;
// ara array = [0, 1, 2, 3]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''reverse()''', modifica un array col·locant els seus elements en l'ordre invers a la seva posició original:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
array.reverse();&lt;br /&gt;
// ara array = [3, 2, 1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''sort()''', ordena els elements del array, tan numèrics com alfabètics.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [4, 2, 1, 3];&lt;br /&gt;
array.sort();&lt;br /&gt;
// ara array = [1, 2, 3, 4]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''splice()''', afegeix i elimina elements.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;Inici&amp;lt;/i&amp;gt; es la posició on començarà a afegir o eliminar.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;Eliminats&amp;lt;/i&amp;gt; es el nombre d'elements que es volven borrar. Si posem un 0, solament afegirà valors.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;Valor1, valor2, …, valorN&amp;lt;/i&amp;gt; son els valor que volem afegir.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3, 4, 5];&lt;br /&gt;
array.splice(1,3);&lt;br /&gt;
// ara array = [1, 5], elimina a partir de la posició 1, tres elements.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array =[1, 2, 3, 4, 5];&lt;br /&gt;
array.splice(2, 0, 2.5);&lt;br /&gt;
//ara el array = [1, 2, 2.5, 3, 4, 5]&lt;br /&gt;
//afegeix a partir de la posició dos el element 2.5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array= [1, 2, 3, 4, 5, 6];&lt;br /&gt;
array.splice(2, 3);&lt;br /&gt;
//Eliminem, a partir del segon element (no inclos) 3 elements&lt;br /&gt;
//ara el array = [1, 2, 6]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3, 4, 5];&lt;br /&gt;
array.splice(1, 3, &amp;quot;two&amp;quot;, &amp;quot;three&amp;quot;, &amp;quot;four&amp;quot;);&lt;br /&gt;
//Eliminem tres elements a partir del primer element, y afegim 3 més&lt;br /&gt;
//ara el array = [1, &amp;quot;two&amp;quot;, &amp;quot;three&amp;quot;, &amp;quot;four&amp;quot;, 5]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Funcions de nombres ===&lt;br /&gt;
'''NaN''', (de l'anglès, &amp;quot;Not a Number&amp;quot;) Javascript empra el valor NaN per indicar un valor numèric no definit (per exemple, la divisió 0/0).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 0;&lt;br /&gt;
var numero2 = 0;&lt;br /&gt;
alert(numero1/numero2); // es mostra el valor NaN&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''isNaN()''', permet protegir a l'aplicació de possibles valors numèrics no definits&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 0;&lt;br /&gt;
var numero2 = 0;&lt;br /&gt;
if(isNaN(numero1/numero2)) {&lt;br /&gt;
alert(&amp;quot;La divisió no està definida per als nombres indicats&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
alert(&amp;quot;La divisió és igual a =&amp;gt; &amp;quot; + numero1/numero2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''Infinity''', fa referència a un valor numèric infinit i positiu (també existeix el valor –Infinity per als infinits negatius)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 10;&lt;br /&gt;
var numero2 = 0;&lt;br /&gt;
alert(numero1/numero2); // es mostra el valor Infinity&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''toFixed(digits)''', retorna el nombre original amb punts decimals com els indicats pel paràmetre digits i realitza els arrodoniments necessaris. Es tracta d'una funció molt útil per exemple per mostrar preus.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 4564.34567;&lt;br /&gt;
numero1.toFixed(2); // 4564.35&lt;br /&gt;
numero1.toFixed(6); // 4564.345670&lt;br /&gt;
numero1.toFixed(); // 4564&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conversió de tipus ===&lt;br /&gt;
No és capaç de convertir un string en nombre (tret que el string sigui solament un nombre). Per a això existeixen dues funcions preconstruidas en Javascript que ens permeten convertir un string en nombre enter o decimal, amb dues limitacions:&lt;br /&gt;
Ha d'aparèixer com string el nombre (sencer o decimal) que volem convertir.&lt;br /&gt;
Ha d'aparèixer al principi del string.&lt;br /&gt;
'''parseInt(String)''' --&amp;gt; converteix a integer&lt;br /&gt;
'''parseFloat(String)''' --&amp;gt; Converteix a Float&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parseInt(&amp;quot;4.33333&amp;quot;); --&amp;gt; 4&lt;br /&gt;
parseFloat(&amp;quot;4.333&amp;quot;); --&amp;gt; 4.333&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
=== Exercici : Arrays ===&lt;br /&gt;
Crear un array anomenat mesos i que emmagatzemi el nom dels dotze mesos de l'any. Mostrar per pantalla els dotze noms utilitzant la funció alert().&lt;br /&gt;
&lt;br /&gt;
:[[Solució Exercici Arrays]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici : Operadors ===&lt;br /&gt;
A partir del següent array que es proporciona: &lt;br /&gt;
&amp;lt;pre&amp;gt;var valors = [true, 5, false, &amp;quot;hola&amp;quot;, &amp;quot;adios&amp;quot;, 2];&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Determinar quin dels dos elements de text és major&lt;br /&gt;
* Utilitzant exclusivament els dos valors booleans del array, determinar els operadors necessaris per obtenir un resultat true i un altre resultat false&lt;br /&gt;
* Determinar el resultat de les cinc operacions matemàtiques realitzades amb els dos elements numèrics&lt;br /&gt;
&lt;br /&gt;
:[[Solució Exercici Operadors]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici DNI ===&lt;br /&gt;
El càlcul de la lletra del Document Nacional d'Identitat (DNI) és un procés matemàtic senzill que es basa a obtenir la resta de la divisió sencera del nombre de DNI i el número 23. A partir de la resta de la divisió, s'obté la lletra seleccionant-la dins d'un array de lletres.&lt;br /&gt;
El array de lletres és:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var lletres = ['T', 'R', 'W', 'A', 'G', 'M', 'I', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'I', 'T'];&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per tant si la resta de la divisió és 0, la lletra del DNI és la T i si la resta és 3 la lletra és l'A. Amb aquestes dades, elaborar un petit script que:&lt;br /&gt;
* Emmagatzemi en una variable el nombre de DNI indicat per l'usuari i en una altra variable la lletra del DNI que s'ha indicat. (Pista: si es vol demanar directament a l'usuari que indiqui el seu nombre i la seva lletra, es pot utilitzar la funció prompt())&lt;br /&gt;
* En primer lloc (i en una sola instrucció) s'ha de comprovar si el nombre és menor que 0 o major que 99999999. Si aquest és el cas, es mostra un missatge a l'usuari indicant que el nombre proporcionat no és vàlid i el programa no mostra més missatges.&lt;br /&gt;
* Si el nombre és vàlid, es calcula la lletra que li correspon segons el mètode explicat anteriorment.&lt;br /&gt;
* Una vegada calculada la lletra, s'ha de comparar amb la lletra indicada per l'usuari. Si no coincideixen, es mostra un missatge a l'usuari dient-li que la lletra que ha indicat no és correcta. En un altre cas, es mostra un missatge indicant que el nombre i la lletra de DNI són correctes.&lt;br /&gt;
&lt;br /&gt;
:[[Solució DNI]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Factorial ===&lt;br /&gt;
El factorial d'un nombre enter n és una operació matemàtica que consisteix a multiplicar tots els factors n x (n-1) x (n-2) x ... x 1. Així, el factorial de 5 (escrit com 5!) és igual a: 5! = 5 x 4 x 3 x 2 x 1 = 120&lt;br /&gt;
Utilitzant l'estructura for, crear un script que calculi el factorial d'un nombre enter.&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
:[[Solució Factorial]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Exercici de Cadenes ===&lt;br /&gt;
Escriure funcions que donades dues cadenes de caràcters:&lt;br /&gt;
a) Indiqui si la segona cadena és una subcadena de la primera. Per exemple, ’cadena’ és una&lt;br /&gt;
subcadena de ’subcadena’.&lt;br /&gt;
b) Retorni la que sigui anterior en ordre alfábetico. Per exemple, si rep ’kde’ i ’gnome’&lt;br /&gt;
ha de retornar ’gnome’.&lt;br /&gt;
&lt;br /&gt;
:[[Solució cadenes]]&lt;br /&gt;
&lt;br /&gt;
=== Joc d'adivinació ===&lt;br /&gt;
Considerem el següent joc entre els jugadors A (endeví) y P (pensador): P pensa un nombre entre 1 y 1000. A intenta adivinar-ho mitjançant aproximacions fins que adivina el número. &lt;br /&gt;
Suposem que la màquina interpreta el paper d'endeví i l'usuari ha de pensar el número. El pensador només pot donar 3 tipus de respostes per cada nombre proposat per l'endeví:&lt;br /&gt;
* &amp;quot;MAJOR&amp;quot; : vol dir que el numero proposat pel l'endeví és major que el que ha pensat.&lt;br /&gt;
* &amp;quot;MENOR&amp;quot; : vol dir que el numero proposat pel l'endeví és menor que el que ha pensat.&lt;br /&gt;
* &amp;quot;OK&amp;quot; : vol dir que ha adivinat el número. &lt;br /&gt;
&lt;br /&gt;
:[[Solució Joc d'adivinació]]&lt;br /&gt;
&lt;br /&gt;
=== Palíndrom ===&lt;br /&gt;
Volem sapiguer si una determinada paraula o frase és un [http://es.wikipedia.org/wiki/Pal%C3%ADndromo palíndrom]. Escriu un programa que demani una text i aquest indiqui si és o no palíndrom.&lt;br /&gt;
&lt;br /&gt;
:[[Solució Palíndrom]]&lt;br /&gt;
&lt;br /&gt;
=== Triangle bonic ===&lt;br /&gt;
Utilitzant bucles i amb els dígits {0...9} es poden dibuixar triangles com el següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         1 &lt;br /&gt;
        232&lt;br /&gt;
       34543&lt;br /&gt;
      4567654&lt;br /&gt;
     567898765&lt;br /&gt;
    67890109876&lt;br /&gt;
   7890123210987&lt;br /&gt;
  890123454321098&lt;br /&gt;
 90123456765432109&lt;br /&gt;
0123456789876543210&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
T'atreveixes?&lt;br /&gt;
&lt;br /&gt;
:[[Solució Triangle bonic]]&lt;br /&gt;
&lt;br /&gt;
=== Xifrat Julio César ===&lt;br /&gt;
El dictador Julio César utilitzava un codi quan volia mantenir en secret un missatge. El xifrat consistia a substituir la primera lletra de l'alfabet, A, per la quarta, D, i així successivament amb les altres, és a dir, B, per la cinquena, I, la tercera, C, per la sisena, F ...&lt;br /&gt;
&lt;br /&gt;
L'alfabet llatí que utilitzava Julio César constava de 21 lletres, per tant la substitució de lletres per xifrar o desxifrar missatges queda descrita en la taula següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Alfabet original : A B C D E F G H I K L M N O P Q R S T V&lt;br /&gt;
Alfabet xifrat   : D E F G H I K L M N O P Q R S T V A B C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aquest tipus de xifrat és un codi de rotació, on la clau de rotació és 3.&lt;br /&gt;
&lt;br /&gt;
Escriu un programa que permeti xifrar o desxifrar utilitzant un codi de rotació. La clau del codi podrà triar-se.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[Solució Xifrat]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Password segur? ===&lt;br /&gt;
Volem saber si una contrasenya és segura. Per tal que sigui segura ha de complir les següents regles:&lt;br /&gt;
* Ha de contenir almenys una vocal.&lt;br /&gt;
* No ha de tenir tres vocals consecutives o tres consonants consecutives.&lt;br /&gt;
* No ha de tenir dues ocurrències consecutives de la mateixa lletra, excepte per ‘ee’ o ‘oo’.&lt;br /&gt;
* La longitud mínima és de 6 caràcters i la màxima de 10.&lt;br /&gt;
* Els espais en blanc no estan permesos&lt;br /&gt;
&lt;br /&gt;
:[[Solució Password segur?]]&lt;br /&gt;
&lt;br /&gt;
=== Separador de milers ===&lt;br /&gt;
Escriure una funció que rebi una cadena que conté un llarg nombre enter i retorni una cadena amb el nombre i les separacions de milers. Per exemple, si rep ’1234567890’, ha de retornar ’1.234.567.890’.&lt;br /&gt;
&lt;br /&gt;
:[[Solució Separador de milers]]&lt;br /&gt;
&lt;br /&gt;
=== Instruens Fabulam ===&lt;br /&gt;
Instruens Fabulam és la manera de dibuixar un quadre (o taula) en idioma Llatí. Això és el que has de fer per a aquest problema.&lt;br /&gt;
Cada descripció comença amb una línia d'encapçalat que conté un o més caràcters que defineixen el nombre i l'alineament de de les columnes de la taula. &lt;br /&gt;
Els caràcters de l'encapçalat són:&lt;br /&gt;
* ‘&amp;lt;’ justificació per esquerra&lt;br /&gt;
* ’=’ justificació per central&lt;br /&gt;
* ‘&amp;gt;’ justificació per dreta&lt;br /&gt;
Després de l'encapçalat hi ha almenys dos i com a màxim 21 línies de dades que contenen les entrades de cada fila.&lt;br /&gt;
Cada línia de dades consisteix en una o més entrades (no buides) separades per un ampersand (‘&amp;amp;’), on el nombre d'entrades és igual al nombre de columnes definides en l'encapçalat.&lt;br /&gt;
La primera línia conté els títols de les columnes, i les línies de dades restants contenen les entrades del cos de la taula. Els  espais poden aparèixer dins d'una entrada, però mai al principi ni al final de l'entrada. Els caràcters '&amp;lt;', '=', '&amp;gt;', '&amp;amp;', i 'comilles simples' no apareixeran en l'entrada excepte en els llocs indicats a dalt.&lt;br /&gt;
Per cada descripció de taula, desplegui la taula usant el format exacte mostrat en l'exemple. Noti que: &lt;br /&gt;
* L'ample total de la taula no excedirà els 79 caràcters (sense explicar la fi-de-línia).&lt;br /&gt;
* Els guions ('-') són usats per dibuixar línies horitzontals, no ('_'). El signe d'arrova ('@') apareix en cada cantonada. El signe de summa (‘+’) apareix en una intersecció entre la línia que separa el títol i el cos de la taula.&lt;br /&gt;
* Les entrades d'una columna estan separades pel caràcter (‘|’) per exactament un espai.&lt;br /&gt;
* Si una entrada centrada no està exactament centrada en una columna, l'espai extra ha d'anar a la dreta de l'entrada.&lt;br /&gt;
Exemples:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció Instruens Fabulam:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&lt;br /&gt;
What is the answer?&lt;br /&gt;
42&lt;br /&gt;
&lt;br /&gt;
Quadre:&lt;br /&gt;
@---------------------@&lt;br /&gt;
| What is the answer? |&lt;br /&gt;
|---------------------|&lt;br /&gt;
|                     |&lt;br /&gt;
|                   42|&lt;br /&gt;
@---------------------@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;gt;&lt;br /&gt;
Tweedledum&amp;amp;Tweedledee&lt;br /&gt;
&amp;quot;Knock, knock.&amp;quot;&amp;amp;&amp;quot;Who's there?&amp;quot;&lt;br /&gt;
&amp;quot;Boo.&amp;quot;&amp;amp;&amp;quot;Boo who?&amp;quot;&lt;br /&gt;
&amp;quot;Don't cry, it's only me.&amp;quot;&amp;amp;(groan)&lt;br /&gt;
&lt;br /&gt;
Quadre:&lt;br /&gt;
@---------------------------------------------@&lt;br /&gt;
| Tweedledum                 |     Tweedledee |&lt;br /&gt;
|----------------------------+----------------|&lt;br /&gt;
| &amp;quot;Knock, knock.&amp;quot;            | &amp;quot;Who's there?&amp;quot; |&lt;br /&gt;
| &amp;quot;Boo.&amp;quot;                     |     &amp;quot;Boo who?&amp;quot; |&lt;br /&gt;
| &amp;quot;Don't cry, it's only me.&amp;quot; |        (groan) |&lt;br /&gt;
@---------------------------------------------@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;gt;=&amp;gt;&lt;br /&gt;
TITLE&amp;amp;VERSION&amp;amp;OPERATING SYSTEM&amp;amp;PRICE&lt;br /&gt;
Slug Farm&amp;amp;2.0&amp;amp;FreeBSD&amp;amp;49.99&lt;br /&gt;
Figs of Doom&amp;amp;1.7&amp;amp;Linux&amp;amp;9.98&lt;br /&gt;
Smiley Goes to Happy Town&amp;amp;11.0&amp;amp;Windows&amp;amp;129.25&lt;br /&gt;
Wheelbarrow Motocross&amp;amp;1.0&amp;amp;BeOS&amp;amp;34.97&lt;br /&gt;
&lt;br /&gt;
Quadre:&lt;br /&gt;
@-----------------------------------------------------------------@&lt;br /&gt;
| TITLE                     |  VERSION| OPERATING SYSTEM |   PRICE|&lt;br /&gt;
|---------------------------+---------+------------------+--------|&lt;br /&gt;
| Slug Farm                 |     2.0 |          FreeBSD |  49.99 | &lt;br /&gt;
| Figs of Doom              |     1.7 |            Linux |   9.98 |&lt;br /&gt;
| Smiley Goes to Happy Town |    11.0 |          Windows | 129.25 |&lt;br /&gt;
| Wheelbarrow Motocross     |     1.0 |             BeOS |  34.97 |&lt;br /&gt;
@-----------------------------------------------------------------@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Nota''': Per emmagatzemar en una sola línea la Descripció pots utilitzar el simbol %: exemple: var d = &amp;quot;&amp;gt;%what is the answer?%42&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:[[Solució Instruens Fabulam]]&lt;br /&gt;
&lt;br /&gt;
== Exercicis per entregar ==&lt;br /&gt;
&lt;br /&gt;
=== Text al revés ===&lt;br /&gt;
Escriu un programa que posi al revés un text donat. S'ha de poder escollir si es vol caràcter a caràcter o paraula a paraula.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
text: &amp;quot;hola a tots&amp;quot;&lt;br /&gt;
caracter a caracter: &amp;quot;stot a aloh&amp;quot;&lt;br /&gt;
paraula a paraula : &amp;quot;tots a hola&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Nombres Romans ===&lt;br /&gt;
Escriu un programa que converteixi un enter positiu en un nombre romà. Assumeix que els nombres a convertir són menors a 3500. Les regles per construir un nombre romà són les que segueixen. En el sistema de nombres romans, i és el símbol per 1, v per 5, x per 10, l per 50, c per 100, d per 500 i m per 1000.&lt;br /&gt;
Les regles per formar numeros romans les tens [http://roble.pntic.mec.es/~msanto1/ortografia/numrom.htm aquí.]&lt;br /&gt;
Exemple: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
entrada : 1990&lt;br /&gt;
sortida : mcmxc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Retrat Robot ===&lt;br /&gt;
A causa de les dificultats de la policia per identificar als sospitosos, fa temps es va decidir substituir als dibuixants tradicionals per un programa que efectua el retrat robot a partir d'una descripció del delinqüent.&lt;br /&gt;
&lt;br /&gt;
El programa prototip requeria descripcions molt simples, on cada línia del dibuix es consigna indicant quantes vegades apareix cada caràcter.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció = &amp;quot;1 9W;1 1|2 1o1 1o2 1|;1@4 1U4 1@;1 1|2 3=2 1|;2 1\5_1/&amp;quot;&lt;br /&gt;
Dibuix:&lt;br /&gt;
 WWWWWWWWW&lt;br /&gt;
 |  O O  |&lt;br /&gt;
@    U    @&lt;br /&gt;
 |  ===  |&lt;br /&gt;
  \_____/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Escriu un programa que llegeixi una cadena de text on se separen pel caràcter ';' la descripció de cada línia del dibuix. El programa ha de donar com resultat el dibuix corresponent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Bibliografia / Webgrafia  ==&lt;br /&gt;
Luis Llana, Carlos Gregorio, Raquel Martínez, Pedro Palao y C. Pareja, &amp;quot;Ejercicios creativos y recreativos en C++&amp;quot;, Ed. Prentice-Hall, 2002. ISBN 84-205-3211-8.&lt;br /&gt;
&lt;br /&gt;
[http://librosweb.es/javascript/capitulo_3.html Introducció a Javascript] &lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[http://www.internetmania.net/int0/int0.htm Internetmania]&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Sintaxi_Javascript&amp;diff=7353</id>
		<title>NF2 - Sintaxi Javascript</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Sintaxi_Javascript&amp;diff=7353"/>
				<updated>2016-09-21T19:08:53Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* Triangle bonic */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Generalitats ==&lt;br /&gt;
La sintaxi d'un llenguatge de programació es defineix com el conjunt de regles que han de seguir-se en escriure el codi font dels programes per considerar-se com a correctes per a aquest llenguatge de programació.&lt;br /&gt;
&lt;br /&gt;
La sintaxi de Javascript és molt similar a la d'altres llenguatges de programació com Java i C. Les normes bàsiques que defineixen la sintaxi de Javascript són les següents:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;No es tenen en compte els espais en blanc i les noves línies&amp;lt;/b&amp;gt;: com succeeix amb XHTML, l'intèrpret de Javascript ignora qualsevol espai en blanc sobrant, per la qual cosa el codi es pot ordenar de forma adequada per entendre-ho millor (tabulant les línies, afegint espais, creant noves línies, etc.)&lt;br /&gt;
* &amp;lt;b&amp;gt;Es distingeixen les majúscules i minúscules&amp;lt;/b&amp;gt;: igual que succeeix amb la sintaxi de les etiquetes i elements XHTML. No obstant això, si en una pàgina XHTML s'utilitzen indistintament majúscules i minúscules, la pàgina es visualitza correctament, sent l'únic problema la no validació de la pàgina. En canvi, si en Javascript s'intercanvien majúscules i minúscules el script no funciona.&lt;br /&gt;
* &amp;lt;b&amp;gt;No es defineix el tipus de les variables&amp;lt;/b&amp;gt;: en crear una variable, no és necessari indicar el tipus de dada que emmagatzemarà. D'aquesta forma, una mateixa variable pot emmagatzemar diferents tipus de dades durant l'execució del script.&lt;br /&gt;
* &amp;lt;b&amp;gt;No és necessari acabar cada sentència amb el caràcter de punt i coma (;)&amp;lt;/b&amp;gt;: en la majoria de llenguatges de programació, és obligatori acabar cada sentència amb el caràcter ;. Encara que Javascript no obliga a fer-ho, NOSALTRES seguirem la tradició d'acabar cada sentència amb el caràcter del punt i coma (;).&lt;br /&gt;
* &amp;lt;b&amp;gt;Es poden incloure comentaris&amp;lt;/b&amp;gt;: els comentaris s'utilitzen per afegir informació en el codi font del programa. Encara que el contingut dels comentaris no es visualitza per pantalla, si que s'envia al navegador de l'usuari juntament amb la resta del script, per la qual cosa és necessari extremar les precaucions sobre la informació inclosa en els comentaris.&lt;br /&gt;
&lt;br /&gt;
Javascript defineix dos tipus de comentaris: els de una sola línia i els que ocupen diverses línies.&lt;br /&gt;
&lt;br /&gt;
Els comentaris d'una sola línia es defineixen afegint dues barres obliqües (//) al principi de la línia :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// a continuació es mostra un missatge&lt;br /&gt;
&lt;br /&gt;
alert(&amp;quot;missatge de prova&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de comentari de diverses línies:&lt;br /&gt;
&amp;lt;&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Els comentaris de diverses línies són molt útils&lt;br /&gt;
quan es necessita incloure bastant informació&lt;br /&gt;
en els comentaris */&lt;br /&gt;
&lt;br /&gt;
alert(&amp;quot;missatge de prova&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els comentaris multilinia es defineixen tancant el text del comentari entre els símbols /* i */.&lt;br /&gt;
&lt;br /&gt;
== Variables ==&lt;br /&gt;
Les variables en els llenguatges de programació segueixen una lògica similar a les variables utilitzades en altres àmbits com les matemàtiques. Una variable és un element que s'empra per emmagatzemar i fer referència a un altre valor. Gràcies a les variables és possible crear &amp;quot;programes genèrics&amp;quot;, és a dir, programes que funcionen sempre igual independentment dels valors concrets utilitzats.&lt;br /&gt;
&lt;br /&gt;
De la mateixa forma que si en Matemàtiques no existissin les variables no es podrien definir les equacions i fórmules, en programació no es podrien fer programes realment útils sense les variables.&lt;br /&gt;
&lt;br /&gt;
Si no existissin variables, un programa que suma dos nombres podria escriure's com:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
resultat = 3 + 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El programa anterior és tan poc útil que només serveix per al cas en el qual el primer nombre de la summa sigui el 3 i el segon nombre sigui l'1. En qualsevol altre cas, el programa obté un resultat incorrecte.&lt;br /&gt;
&lt;br /&gt;
No obstant això, el programa es pot refer de la següent manera utilitzant variables per emmagatzemar i referir-se a cada nombre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
numero_1 = 3&lt;br /&gt;
numero_2 = 1&lt;br /&gt;
resultat = numero_1 + numero_2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els elements ''numero_1'' i ''numero_2'' són variables que emmagatzemen els valors que utilitza el programa. El resultat es calcula sempre en funció del valor emmagatzemat per les variables, per la qual cosa aquest programa funciona correctament per a qualsevol parell de nombres indicat. Si es modifica el valor de les variables ''numero_1'' i ''numero_2'', el programa segueix funcionant correctament.&lt;br /&gt;
&lt;br /&gt;
Les variables en Javascript es creen mitjançant la paraula reservada '''var'''. D'aquesta forma, l'exemple anterior es pot realitzar en Javascript de la següent manera:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1 = 3;&lt;br /&gt;
var numero_2 = 1;&lt;br /&gt;
var resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La paraula reservada ''var'' solament s'ha d'indicar en definir per primera vegada la variable, la qual cosa es denomina declarar una variable. Quan s'utilitzen les variables en la resta d'instruccions del *script, solament és necessari indicar el seu nom. En altres paraules, en l'exemple anterior seria un error indicar el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1 = 3;&lt;br /&gt;
var numero_2 = 1;&lt;br /&gt;
var resultat = *var numero_1 + *var numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si quan es declara una variable se li assigna també un valor, es diu que la variable ha estat inicialitzada. ''En Javascript no és obligatori inicialitzar les variables'', ja que es poden declarar d'una banda i assignar-los un valor posteriorment. Per tant, l'exemple anterior es pot refer de la següent manera:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1;&lt;br /&gt;
var numero_2;&lt;br /&gt;
&lt;br /&gt;
numero_1 = 3;&lt;br /&gt;
numero_2 = 1;&lt;br /&gt;
&lt;br /&gt;
var resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Una de les característiques més sorprenents de JavaSript per als programadors habituats a altres llenguatges de programació és que tampoc és necessari declarar les variables. En altres paraules, es poden utilitzar variables que no s'han definit anteriorment mitjançant la paraula reservada *var. L'exemple anterior també és correcte en Javascript de la següent forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1 = 3;&lt;br /&gt;
var numero_2 = 1;&lt;br /&gt;
&lt;br /&gt;
resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La variable resultat no està declarada, per la qual cosa Javascript crea una variable global (més endavant es veuran les diferències entre variables locals i globals) i li assigna el valor corresponent. De la mateixa forma, també seria correcte el següent codi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
numero_1 = 3;&lt;br /&gt;
numero_2 = 1;&lt;br /&gt;
&lt;br /&gt;
resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En qualsevol cas, es recomana declarar totes les variables que es vagin a utilitzar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;El nom d'una variable&amp;lt;/u&amp;gt; també es coneix com a identificador i &amp;lt;u&amp;gt;ha de complir les següents normes:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Només pot estar format per lletres, nombres i els símbols $ (dòlar) i _ (guió baix).&lt;br /&gt;
* El primer caràcter no pot ser un nombre.&lt;br /&gt;
&lt;br /&gt;
Per tant, les següents variables tenen noms correctes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var $numero1;&lt;br /&gt;
var _$lletra;&lt;br /&gt;
var $$$*otroNumero;&lt;br /&gt;
var $_a__$4;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
No obstant això, les següents variables tenen identificadors incorrectes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var 1numero; // Comença per un nombre&lt;br /&gt;
var numero;1_123; // Conté un caràcter &amp;quot;;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tipus de variables ===&lt;br /&gt;
Encara que totes les variables de Javascript es creen de la mateixa forma (mitjançant la paraula reservada var), la forma en la qual se'ls assigna un valor depèn del tipus de valor que es vol emmagatzemar (nombres, textos, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Numèriques ====&lt;br /&gt;
S'utilitzen per emmagatzemar valors numèrics enters (anomenats integer en anglès) o decimals (anomenats float en anglès). En aquest cas, el valor s'assigna indicant directament el nombre enter o decimal. Els nombres decimals utilitzen el caràcter . (punt) en comptes de , (coma) per separar la part sencera i la part decimal:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var iva = 16; // variable tipus sencer&lt;br /&gt;
var total = 234.65; // variable tipus decimal&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==== Cadenes de text ====&lt;br /&gt;
S'utilitzen per emmagatzemar caràcters, paraules i/o frases de text. Per assignar el valor a la variable, es tanca el valor entre cometes dobles o simples, per delimitar el seu començament i el seu final:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Benvingut al nostre lloc web&amp;quot;;&lt;br /&gt;
var nombreProducto = 'Producte ABC';&lt;br /&gt;
var letraSeleccionada = 'c';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En ocasions, el text que s'emmagatzema en les variables no és tan senzill. Si per exemple el propi text conté cometes simples o dobles, l'estratègia que se segueix és la de tancar el text amb les cometes (simples o dobles) que no utilitzi el text:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* El contingut de text1 té cometes simples, per&lt;br /&gt;
la qual cosa es tanca amb cometes dobles */&lt;br /&gt;
var text1 = &amp;quot;Una frase amb 'cometes simples' dins&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* El contingut de text2 té cometes dobles, per&lt;br /&gt;
la qual cosa es tanca amb cometes simples */&lt;br /&gt;
var text2 = 'Una frase amb &amp;quot;cometes dobles&amp;quot; dins';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No obstant això, de vegades les cadenes de text contenen tant cometes simples com a dobles. A més, existeixen altres caràcters que són difícils d'incloure en una variable de text (tabulador, ENTER, etc.) Per resoldre aquests problemes, Javascript defineix un mecanisme per incloure de forma senzilla caràcters especials i problemàtics dins d'una cadena de text.&lt;br /&gt;
&lt;br /&gt;
El mecanisme consisteix a substituir el caràcter problemàtic per una combinació simple de caràcters. A continuació es mostra la taula de conversió que s'ha d'utilitzar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Si es vol incloure...	S'ha d'incloure...&lt;br /&gt;
Una nova línia          \n	&lt;br /&gt;
Un tabulador	        \t&lt;br /&gt;
Una cometa simple	\'&lt;br /&gt;
Una cometa doble	\&amp;quot;&lt;br /&gt;
Una barra inclinada	\\&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
D'aquesta forma, l'exemple anterior que contenia cometes simples i dobles dins del text es pot refer de la següent forma:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var text1 = 'Una frase amb \'cometes simples\' dins';&lt;br /&gt;
&lt;br /&gt;
var text2 = &amp;quot;Una frase amb \&amp;quot;cometes dobles\&amp;quot; dins&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Aquest mecanisme de Javascript es denomina &amp;quot;mecanisme de fuita&amp;quot; dels caràcters problemàtics, i és habitual referir-se al fet que els caràcters han estat &amp;quot;escapats&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Arrays ====&lt;br /&gt;
En ocasions, als arrays se'ls anomena vectors, matrius i fins i tot arranjaments. No obstant això, el terme array és el més utilitzat i és una paraula comunament acceptada a l'entorn de la programació.&lt;br /&gt;
&lt;br /&gt;
Un array és una col·lecció de variables, que poden ser totes del mateix tipus o cadascuna d'un tipus diferent. La seva utilitat es comprèn millor amb un exemple senzill: si una aplicació necessita utilitzar els dies de la setmana, es podrien crear set variables de tipus text:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dia1 = &amp;quot;Dilluns&amp;quot;;&lt;br /&gt;
var dia2 = &amp;quot;Dimarts&amp;quot;;&lt;br /&gt;
...&lt;br /&gt;
var dia7 = &amp;quot;Diumenge&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Encara que el codi anterior no és incorrecte, sí que és poc eficient i complica a l'excés la programació. Si en comptes dels dies de la setmana s'hagués de guardar el nom dels mesos de l'any, el nom de tots els països del món o els mesuraments diaris de temperatura dels últims 100 anys, s'haurien de crear desenes o centenars de variables.&lt;br /&gt;
&lt;br /&gt;
En aquest tipus de casos, es poden agrupar totes les variables relacionades en una col·lecció de variables o array. L'exemple anterior es pot refer de la següent forma:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dies = [&amp;quot;Dilluns&amp;quot;, &amp;quot;Dimarts&amp;quot;, &amp;quot;Dimecres&amp;quot;, &amp;quot;Dijous&amp;quot;, &amp;quot;Divendres&amp;quot;, &amp;quot;Dissabte&amp;quot;, &amp;quot;Diumenge&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ara, una única variable anomenada ''dies'' emmagatzema tots els valors relacionats entre si, en aquest cas els dies de la setmana. Per definir un array, s'utilitzen els caràcters [ i ] per delimitar el seu començament i el seu final i s'utilitza el caràcter , (coma) per separar els seus elements:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nom_array = [valor1, valor2, ...,valorN];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Una vegada definit un array, és molt senzill accedir a cadascun dels seus elements. Cada element s'accedeix indicant la seva posició dins del array. L'única complicació, que és responsable de molts errors quan es comença a programar, és que les posicions dels elements comencen a explicar-se en el 0 i no en l'1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var diaSeleccionat = dies[0]; // diaSeleccionat = &amp;quot;Dilluns&amp;quot;&lt;br /&gt;
&lt;br /&gt;
var altreDia = dies[5]; // altreDia = &amp;quot;Dissabte&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En l'exemple anterior, la primera instrucció vol obtenir el primer element del array. Per a això, s'indica el nom del array i entre claudàtors la posició de l'element dins del array. Com s'ha comentat, ''les posicions del array comencen a partir del 0'', per la qual cosa el primer element ocupa la posició 0 i s'accedeix al mitjançant dias[0].&lt;br /&gt;
&lt;br /&gt;
El valor dies[5] fa referència a l'element que ocupa la sisena posició dins del array dies. Com les posicions comencen a explicar-se en 0, la posició 5 fa referència al sisè element, en aquest cas, el valor Dissabte.&lt;br /&gt;
&lt;br /&gt;
==== Booleans ====&lt;br /&gt;
Les variables de tipus boolean o booleà també es coneixen amb el nom de variables de tipus lògic. El seu funcionament bàsic és molt senzill.&lt;br /&gt;
&lt;br /&gt;
Una variable de tipus boolean emmagatzema un tipus especial de valor que solament pot prendre dos valors: '''true''' (veritable) o '''false''' (fals). No es pot utilitzar per emmagatzemar nombres i tampoc permet guardar cadenes de text.&lt;br /&gt;
&lt;br /&gt;
Els únics valors que poden emmagatzemar aquestes variables són true i false, per la qual cosa no poden utilitzar-se els valors veritable i fals. A continuació es mostra un parell de variables de tipus booleà:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var clientRegistrat = false;&lt;br /&gt;
var iva = true;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Operadors ===&lt;br /&gt;
&lt;br /&gt;
Els operadors permeten manipular el valor de les variables, realitzar operacions matemàtiques amb els seus valors i comparar diferents variables. D'aquesta forma, els operadors permeten als programes realitzar càlculs complexos i prendre decisions lògiques en funció de comparacions i altres tipus de condicions.&lt;br /&gt;
&lt;br /&gt;
==== Assignació ====&lt;br /&gt;
&lt;br /&gt;
L'operador d'assignació és el més utilitzat i el més senzill. Aquest operador s'utilitza per guardar un valor específic en una variable. El símbol utilitzat és = (no confondre amb l'operador == que es veurà més endavant):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 3;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A l'esquerra de l'operador, sempre ha d'indicar-se el nom d'una variable. A la dreta de l'operador, es poden indicar variables, valors, condicions lògiques, etc:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 3;&lt;br /&gt;
var numero2 = 4;&lt;br /&gt;
&lt;br /&gt;
/* Error, l'assignació sempre es realitza a una variable,&lt;br /&gt;
per la qual cosa en l'esquerra no es pot indicar un número */&lt;br /&gt;
5 = numero1;&lt;br /&gt;
&lt;br /&gt;
// Ara, la variable numero1 val 5&lt;br /&gt;
numero1 = 5;&lt;br /&gt;
&lt;br /&gt;
// Ara, la variable numero1 val 4&lt;br /&gt;
numero1 = numero2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Increment i decrement====&lt;br /&gt;
Aquests dos operadors solament són vàlids per a les variables numèriques i s'utilitzen per incrementar o decrementar en una unitat el valor d'una variable.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
++numero;&lt;br /&gt;
alert(numero); // numero = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L'operador d'increment s'indica mitjançant el prefix ++ en el nom de la variable. El resultat és que el valor d'aquesta variable s'incrementa en una unitat. Per tant, l'anterior exemple és equivalent a:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
numero = numero + 1;&lt;br /&gt;
alert(numero); // numero = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
De forma equivalent, l'operador decrement (indicat com un prefix -- en el nom de la variable) s'utilitza per decrementar el valor de la variable:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
--numero;&lt;br /&gt;
alert(numero); // numero = 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'anterior exemple és equivalent a:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
numero = numero - 1;&lt;br /&gt;
alert(numero); // numero = 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els operadors d'increment i decremento no solament es poden indicar com a prefix del nom de la variable, sinó que també és possible utilitzar-los com a sufix. En aquest cas, el seu comportament és similar però molt diferent. En el següent exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
numero++;&lt;br /&gt;
alert(numero); // numero = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El resultat d'executar el script anterior és el mateix que quan s'utilitza l'operador ++numero, per la qual cosa pot semblar que és equivalent indicar l'operador ++ davant o darrere de l'identificador de la variable. No obstant això, el següent exemple mostra les seves diferències:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
var numero2 = 2;&lt;br /&gt;
numero3 = numero1++ + numero2;&lt;br /&gt;
// numero3 = 7, numero1 = 6&lt;br /&gt;
&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
var numero2 = 2;&lt;br /&gt;
numero3 = ++numero1 + numero2;&lt;br /&gt;
// numero3 = 8, numero1 = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si l'operador ++ s'indica com a prefix de l'identificador de la variable, el seu valor s'incrementa abans de realitzar qualsevol altra operació. Si l'operador ++ s'indica com a sufix de l'identificador de la variable, el seu valor s'incrementa després d'executar la sentència en la qual apareix.&lt;br /&gt;
&lt;br /&gt;
Per tant, en la instrucció numero3 = numero1++ + numero2;, el valor de numero1 s'incrementa després de realitzar l'operació (primer se sumeixi i numero3 val 7, després s'incrementa el valor de numero1 i val 6). No obstant això, en la instrucció numero3 = ++numero1 + numero2;, en primer lloc s'incrementa el valor de numero1 i després es realitza la summa (primer s'incrementa numero1 i val 6, després es realitza la summa i numero3 val 8).&lt;br /&gt;
&lt;br /&gt;
==== Lògics ====&lt;br /&gt;
Els operadors lògics són imprescindibles per realitzar aplicacions complexes, ja que s'utilitzen per prendre decisions sobre les instruccions que hauria d'executar el programa en funció de certes condicions.&lt;br /&gt;
&lt;br /&gt;
El resultat de qualsevol operació que utilitzi operadors lògics sempre és un valor lògic o booleà.&lt;br /&gt;
&lt;br /&gt;
===== Negació =====&lt;br /&gt;
Un dels operadors lògics més utilitzats és el de la negació. S'utilitza per obtenir el valor contrari al valor de la variable:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var visible = true;&lt;br /&gt;
alert(!visible); // Mostra &amp;quot;false&amp;quot; i no &amp;quot;true&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La negació lògica s'obté prefixant el símbol ! a l'identificador de la variable. El funcionament d'aquest operador es resumeix en la següent taula:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
variable	!variable&lt;br /&gt;
true    	false&lt;br /&gt;
false	        true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si la variable original és de tipus booleà, és molt senzill obtenir la seva negació. No obstant això, què succeeix quan la variable és un nombre o una cadena de text? Per obtenir la negació en aquest tipus de variables, es realitza en primer lloc la seva conversió a un valor booleà:&lt;br /&gt;
&lt;br /&gt;
Si la variable conté un nombre, es transforma en false si val 0 i en true per a qualsevol altre nombre (positiu o negatiu, decimal o sencer).&lt;br /&gt;
Si la variable conté una cadena de text, es transforma en false si la cadena és buida (&amp;quot;&amp;quot;) i en true en qualsevol altre cas.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quantitat = 0;&lt;br /&gt;
buit = !quantitat; // buit = true&lt;br /&gt;
&lt;br /&gt;
quantitat = 2;&lt;br /&gt;
buit = !quantitat; // buit = false&lt;br /&gt;
&lt;br /&gt;
var missatge = &amp;quot;&amp;quot;;&lt;br /&gt;
missatgebuit = !missatge; // missatgebuit = true&lt;br /&gt;
&lt;br /&gt;
missatge = &amp;quot;Benvingut&amp;quot;;&lt;br /&gt;
missatgebuit = !missatge; // missatgebuit = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== AND =====&lt;br /&gt;
L'operació lògica AND obté el seu resultat combinant dos valors booleans. L'operador s'indica mitjançant el símbol &amp;amp;&amp;amp; i el seu resultat solament és true si els dos operands són true:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
variable1	variable2	variable1 &amp;amp;&amp;amp; variable2&lt;br /&gt;
  true	           true	                 true&lt;br /&gt;
  true	           false	         false&lt;br /&gt;
  false	           true	                 false&lt;br /&gt;
  false	           false	         false&lt;br /&gt;
&lt;br /&gt;
var valor1 = true;&lt;br /&gt;
var valor2 = false;&lt;br /&gt;
resultat = valor1 &amp;amp;&amp;amp; valor2; // resultat = false&lt;br /&gt;
&lt;br /&gt;
valor1 = true;&lt;br /&gt;
valor2 = true;&lt;br /&gt;
resultat = valor1 &amp;amp;&amp;amp; valor2; // resultat = true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== OR =====&lt;br /&gt;
L'operació lògica OR també combina dos valors booleans. L'operador s'indica mitjançant el símbol || i el seu resultat és true si algun dels dos operands és true:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
variable1	variable2	variable1 || variable2&lt;br /&gt;
  true	           true	                 true&lt;br /&gt;
  true	           false	         true&lt;br /&gt;
  false	           true	                 true&lt;br /&gt;
  false	           false	         false&lt;br /&gt;
&lt;br /&gt;
var valor1 = true;&lt;br /&gt;
var valor2 = false;&lt;br /&gt;
resultat = valor1 || valor2; // resultat = true&lt;br /&gt;
&lt;br /&gt;
valor1 = false;&lt;br /&gt;
valor2 = false;&lt;br /&gt;
resultat = valor1 || valor2; // resultat = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Matemàtics ====&lt;br /&gt;
Javascript permet realitzar manipulacions matemàtiques sobre el valor de les variables numèriques. Els operadors definits són: suma (+), resta (-), multiplicació (*) i divisió (/). Exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 10;&lt;br /&gt;
var numero2 = 5;&lt;br /&gt;
&lt;br /&gt;
resultat = numero1 / numero2; // resultat = 2&lt;br /&gt;
resultat = 3 + numero1; // resultat = 13&lt;br /&gt;
resultat = numero2 – 4; // resultat = 1&lt;br /&gt;
resultat = numero1 * numero 2; // resultat = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A més dels quatre operadors bàsics, Javascript defineix un altre operador matemàtic que no és senzill d'entendre quan s'estudia per primera vegada, però que és molt útil en algunes ocasions.&lt;br /&gt;
&lt;br /&gt;
Es tracta de l'operador &amp;quot;mòdul&amp;quot;, que calcula la resta de la divisió sencera de dos nombres. Si es divideix per exemple 10 i 5, la divisió és exacta i dóna un resultat de 2. La resta d'aquesta divisió és 0, per la qual cosa mòdul de 10 i 5 és igual a 0.&lt;br /&gt;
&lt;br /&gt;
No obstant això, si es divideix 9 i 5, la divisió no és exacta, el resultat és 1 i la resta 4, per la qual cosa mòdul de 9 i 5 és igual a 4.&lt;br /&gt;
&lt;br /&gt;
L'operador mòdul en Javascript s'indica mitjançant el símbol %, que no ha de confondre's amb el càlcul del percentatge:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 10;&lt;br /&gt;
var numero2 = 5;&lt;br /&gt;
resultat = numero1 % numero2; // resultat = 0&lt;br /&gt;
&lt;br /&gt;
numero1 = 9;&lt;br /&gt;
numero2 = 5;&lt;br /&gt;
resultat = numero1 % numero2; // resultat = 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els operadors matemàtics també es poden combinar amb l'operador d'assignació per abreujar la seva notació:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
numero1 += 3; // numero1 = numero1 + 3 = 8&lt;br /&gt;
numero1 -= 1; // numero1 = numero1 - 1 = 4&lt;br /&gt;
numero1 *= 2; // numero1 = numero1 * 2 = 10&lt;br /&gt;
numero1 /= 5; // numero1 = numero1 / 5 = 1&lt;br /&gt;
numero1 %= 4; // numero1 = numero1 % 4 = 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Relacionals ====&lt;br /&gt;
Els operadors relacionals definits per Javascript són idèntics als quals defineixen les matemàtiques: major que (&amp;gt;), menor que (&amp;lt;), major o igual (&amp;gt;=), menor o igual (&amp;lt;=), igual que (==) i diferent de (!=).&lt;br /&gt;
&lt;br /&gt;
Els operadors que relacionen variables són imprescindibles per realitzar qualsevol aplicació complexa, com es veurà en el següent capítol de programació avançada. El resultat de tots aquests operadors sempre és un valor booleà:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 3;&lt;br /&gt;
var numero2 = 5;&lt;br /&gt;
resultat = numero1 &amp;gt; numero2; // resultat = false&lt;br /&gt;
resultat = numero1 &amp;lt; numero2; // resultat = true&lt;br /&gt;
&lt;br /&gt;
numero1 = 5;&lt;br /&gt;
numero2 = 5;&lt;br /&gt;
resultat = numero1 &amp;gt;= numero2; // resultat = true&lt;br /&gt;
resultat = numero1 &amp;lt;= numero2; // resultat = true&lt;br /&gt;
resultat = numero1 == numero2; // resultat = true&lt;br /&gt;
resultat = numero1 != numero2; // resultat = false&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
S'ha de tenir especial cura amb l'operador d'igualtat (==), ja que és l'origen de la majoria d'errors de programació, fins i tot per als usuaris que ja tenen certa experiència desenvolupant scripts. L'operador == s'utilitza per comparar el valor de dues variables, per la qual cosa és molt diferent de l'operador =, que s'utilitza per assignar un valor a una variable:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// L'operador &amp;quot;=&amp;quot; assigna valors&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
resultat = numero1 = 3; // numero1 = 3 i resultat = 3&lt;br /&gt;
&lt;br /&gt;
// L'operador &amp;quot;==&amp;quot; compara variables&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
resultat = numero1 == 3; // numero1 = 5 i resultat = *false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els operadors relacionals també es poden utilitzar amb variables de tipus cadena de text:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var text1 = &amp;quot;hola&amp;quot;;&lt;br /&gt;
var text2 = &amp;quot;hola&amp;quot;;&lt;br /&gt;
var text3 = &amp;quot;*adios&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
resultat = text1 == text3; // resultat = false&lt;br /&gt;
resultat = text1 != text2; // resultat = false&lt;br /&gt;
resultat = text3 &amp;gt;= text2; // resultat = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Quan s'utilitzen cadenes de text, els operadors &amp;quot;major que&amp;quot; (&amp;gt;) i &amp;quot;menor que&amp;quot; (&amp;lt;) segueixen un raonament no intuïtiu: es compara lletra a lletra començant des de l'esquerra fins que es trobi una diferència entre les dues cadenes de text. Per determinar si una lletra és major o menor que una altra, les majúscules es consideren menors que les minúscules i les primeres lletres de l'alfabet són menors que les últimes (a és menor que b, b és menor que c, A és menor que a, etc.)&lt;br /&gt;
=== Àmbit de les Varibles ===&lt;br /&gt;
Un altre aspecte a tenir en compte a l'hora d'usar les variables és el seu àmbit, és a dir, quines funcions tenen accés a elles. Si es crea una ''variable dins d'una funció'' només serà coneguda dins d'aquesta funció, es tracta de ''variables locals''. Si es necessita que diverses funcions tinguin accés a una determinada variable aquesta ha de crear-se com a variable global, això es fa creant-la fora de totes les funcions. Per exemple en el següent script tenim variables globals i locals:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script language=&amp;quot;Javascript&amp;quot;&amp;gt;&lt;br /&gt;
     var navegador_versio = 0;&lt;br /&gt;
     function veureNavegador()&lt;br /&gt;
     {&lt;br /&gt;
          var versio;&lt;br /&gt;
          versio = document.appVersion;&lt;br /&gt;
          return versio;&lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En aquest exemple ''navegador_versio'' és una variable global i ''versió'' és una variable local que només existeix dintre de la funciò ''veureNavegador''.&lt;br /&gt;
Què succeeix si una funció defineix una variable local amb el mateix nom que una variable global que ja existeix? En aquest cas, l''es variables locals prevalen sobre les globals, però només dins de la funció'':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var missatge = &amp;quot;guanya la de fora&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    function mostraMissatge() {&lt;br /&gt;
        var missatge = &amp;quot;guanya la de dins&amp;quot;;&lt;br /&gt;
        alert(missatge);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
    mostraMissatge();&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Què succeeix si dins d'una funció es defineix una variable global amb el mateix nom que una altra variable global que ja existeix? En aquest altre cas, la variable global definida dins de la funció simplement modifica el valor de la variable global definida anteriorment:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var missatge = &amp;quot;guanya la de fora&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    function mostraMissatge() {&lt;br /&gt;
        missatge = &amp;quot;guanya la de dins&amp;quot;;&lt;br /&gt;
        alert(missatge);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
    mostraMissatge();&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La diferencia dels dos exemples anteriors ve donat per la definició d'una variable anomenada igual que una altre global. En el primer exemple s'utilitza la paraula reservada '''var''' i en el últim exemple NO s'utilitza. El fet de NO utilitzar la paraula reservada '''var''' s'interpreta com que es vol utilitzar la variable global definida abans de la funció.&lt;br /&gt;
&lt;br /&gt;
Resumint, la recomanació general és definir com a variables locals totes les variables que siguin d'ús exclusiu per realitzar les tasques encarregades a cada funció. Les variables globals s'utilitzen per compartir dades entre funcions de forma senzilla.&lt;br /&gt;
&lt;br /&gt;
== Estructures de control de Flux ==&lt;br /&gt;
&lt;br /&gt;
=== Estructura IF ===&lt;br /&gt;
L'estructura més utilitzada en Javascript i en la majoria de llenguatges de programació és l'estructura if. S'empra per prendre decisions en funció d'una condició. La seva definició formal és:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if(condicion) {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si la condició es compleix (és a dir, si el seu valor és true) s'executen totes les instruccions que es troben dins de {...}. Si la condició no es compleix (és a dir, si el seu valor és false) no s'executa cap instrucció continguda en {...} i el programa continua executant la resta d'instruccions del script.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var mostrado = false;&lt;br /&gt;
var usuarioPermiteMensajes = true;&lt;br /&gt;
 &lt;br /&gt;
if(!mostrado &amp;amp;&amp;amp; usuarioPermiteMensajes) {&lt;br /&gt;
  alert(&amp;quot;Es la primera vez que se muestra el mensaje&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Estructura IF....ELSE ===&lt;br /&gt;
Normalment les condicions solen ser del tipus &amp;quot;si es compleix aquesta condició, fes-ho; si no es compleix, fes això un altre&amp;quot;. Existeix una variant de l'estructura if trucada if...else. La seva definició formal és la següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if(condicion) {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La estructura if...else es pot encadenar per realitzar diverses comprovacions seguides:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if(edad &amp;lt; 12) {&lt;br /&gt;
  alert(&amp;quot;Todavía eres muy pequeño&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if(edad &amp;lt; 19) {&lt;br /&gt;
  alert(&amp;quot;Eres un adolescente&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if(edad &amp;lt; 35) {&lt;br /&gt;
  alert(&amp;quot;Aun sigues siendo joven&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
  alert(&amp;quot;Piensa en cuidarte un poco más&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selecció Múltiple ===&lt;br /&gt;
Poden existir casos en els quals el programa hagi de tenir mes de dues alternatives, per exemple si volem un programa que mostri un títol en un idioma de quatre possibles. Això pot solucionar-se mitjançant diversos if. Hem de triar entre idiomes: castellà, engonals, francès i alemany.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (leng == &amp;quot;ESPANYOL&amp;quot;)&lt;br /&gt;
       pagCast();&lt;br /&gt;
else&lt;br /&gt;
       if (leng == &amp;quot;ANGLES&amp;quot;)&lt;br /&gt;
              pagIng();&lt;br /&gt;
       else&lt;br /&gt;
             if (leng == &amp;quot;FRANCES&amp;quot;)&lt;br /&gt;
                    pagFran();&lt;br /&gt;
             else&lt;br /&gt;
                   if (leng == &amp;quot;CATALA&amp;quot;)&lt;br /&gt;
                          pagCat();&lt;br /&gt;
                   else&lt;br /&gt;
                            error('idioma desconegut');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per a aquests casos disposem de la sentència switch...casi...default, de selecció múltiple. L'exemple anterior quedaria:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
switch (idioma) {&lt;br /&gt;
    case 'espanyol' :&lt;br /&gt;
          pagCast();&lt;br /&gt;
          break;&lt;br /&gt;
    case 'ingles' :&lt;br /&gt;
          pagIng();&lt;br /&gt;
          break;&lt;br /&gt;
    case 'frances' :&lt;br /&gt;
          pagFran();&lt;br /&gt;
          break;&lt;br /&gt;
    case 'catala' :&lt;br /&gt;
          pagCat();&lt;br /&gt;
          break;&lt;br /&gt;
    default :&lt;br /&gt;
          error ('Idioma desconegut');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La instrucció ''break'' posa fi al bloc i fa que el programa salti a la instrucció següent a la sentència ''switch''(), si s'omet el programa continuaria amb la següent comparació. La secció del ''default'' és opcional, la seva finalitat és executar algun codi quan cap de les condicions es compleixi.&lt;br /&gt;
&lt;br /&gt;
=== Estructura WHILE ===&lt;br /&gt;
En aquesta estructura el programa primer comprova la condició: si és certa pansa a executar el cos del bucle, i si és falsa pansa a la instrucció següent a la sentència while.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
while(condició){&lt;br /&gt;
....&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var resultat = 0;&lt;br /&gt;
var numero = 100;&lt;br /&gt;
var i = 0;&lt;br /&gt;
 &lt;br /&gt;
while(i &amp;lt;= numero) {&lt;br /&gt;
  resultat += i;&lt;br /&gt;
  i++;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
alert(resultat);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El programa ha de sumar tots els nombres menors o igual que un altre donat. Per exemple si el nombre és 5, s'ha de calcular: 1 + 2 + 3 + 4 + 5 = 15&lt;br /&gt;
&lt;br /&gt;
=== Estructura DO...WHILE ===&lt;br /&gt;
Es tracta d'un bucle en el qual la condició es comprova després de la primera iteració, és a dir que el cos del bucle s'executa almenys una vegada. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  ...&lt;br /&gt;
} while(condició);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Utilitzant aquest bucle es pot calcular fàcilment el factorial d'un numero:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var resultat = 1;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
 &lt;br /&gt;
do {&lt;br /&gt;
  resultat *= numero;  // resultat = resultat * numero&lt;br /&gt;
  numero--;&lt;br /&gt;
} while(numero &amp;gt; 0);&lt;br /&gt;
 &lt;br /&gt;
alert(resultat);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Estructura FOR ===&lt;br /&gt;
L'estructura for permet realitzar repeticions (també anomenades bucles) d'instruccions d'una forma molt senzilla. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for(inicializació; condició; actualizació) {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La idea del funcionament d'un bucle for és la següent: &amp;quot;mentre la condició indicada se segueixi complint, repeteix l'execució de les instruccions definides dins del for. A més, després de cada repetició, actualitza el valor de les variables que s'utilitzen en la condició&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* La &amp;quot;inicialització&amp;quot; és la zona en la qual s'estableix els valors inicials de les variables que controlen la repetició.&lt;br /&gt;
* La &amp;quot;condició&amp;quot; és l'únic element que decideix si contínua o es deté la repetició.&lt;br /&gt;
* La &amp;quot;actualització&amp;quot; és el nou valor que s'assigna després de cada repetició a les variables que controlen la repetició.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola, estic dintre d'un bucle&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
for(var i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
  alert(missatge);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Un altre exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dies = [&amp;quot;Dilluns&amp;quot;, &amp;quot;Dimarts&amp;quot;, &amp;quot;Dimecres&amp;quot;, &amp;quot;Dijous&amp;quot;, &amp;quot;Divendres&amp;quot;, &amp;quot;Dissabte&amp;quot;, &amp;quot;Diumenge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
for(var i=0; i&amp;lt;7; i++) {&lt;br /&gt;
  alert(dies[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Estructura For...IN ===&lt;br /&gt;
La seva definició exacta implica l'ús d'objectes, que és un element de programació que encara no anem a estudiar. Per tant, solament es va a presentar l'estructura for...in adaptada al seu ús en arrays. La seva definició formal adaptada als arrays és:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for(indice in array) {&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dies = [&amp;quot;Dilluns&amp;quot;, &amp;quot;Dimarts&amp;quot;, &amp;quot;Dimecres&amp;quot;, &amp;quot;Dijous&amp;quot;, &amp;quot;Divendres&amp;quot;, &amp;quot;Dissabte&amp;quot;, &amp;quot;Diumenge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
for(i in dies) {&lt;br /&gt;
  alert(dies[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Funcions útils del llenguatge ==&lt;br /&gt;
=== Funcions de cadenes de text ===&lt;br /&gt;
&lt;br /&gt;
'''length''', calcula la longitud d'una cadena de text (el nombre de caràcters que la formen)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var numeroLetras = missatge.length; // numeroLetras = 10&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''+''', s'empra per concatenar diverses cadenes de text&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = &amp;quot; Món&amp;quot;;&lt;br /&gt;
var missatge = missatge1 + missatge2; // missatge = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A més de l'operador +, també es pot utilitzar la funció '''concat()'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = missatge1.concat(&amp;quot; Món&amp;quot;); // missatge2 = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les cadenes de text també es poden unir amb variables numèriques:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var variable1 = &amp;quot;Hola &amp;quot;;&lt;br /&gt;
var variable2 = 3;&lt;br /&gt;
var missatge = variable1 + variable2; // missatge = &amp;quot;Hola 3&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Quan s'uneixen diverses cadenes de text és habitual oblidar afegir un espai de separació entre les paraules:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = &amp;quot;Món&amp;quot;;&lt;br /&gt;
var missatge = missatge1 + missatge2; // missatge = &amp;quot;HolaMón&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els espais en blanc es poden afegir al final o al principi de les cadenes i també es poden indicar forma explícita:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = &amp;quot;Món&amp;quot;;&lt;br /&gt;
var missatge = missatge1 + &amp;quot; &amp;quot; + missatge2; // missatge = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''toUpperCase()''', transforma tots els caràcters de la cadena als seus corresponents caràcters en majúscules:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = missatge1.toUpperCase(); // missatge2 = &amp;quot;HOLA&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''toLowerCase()''', transforma tots els caràcters de la cadena als seus corresponents caràcters en minúscules:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;HOLA&amp;quot;;&lt;br /&gt;
var missatge2 = missatge1.toLowerCase(); // missatge2 = &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''charAt(posició)''', obté el caràcter que es troba en la posició indicada:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var lletra = missatge.charAt(0); // lletra = H&lt;br /&gt;
lletra = missatge.charAt(2); // lletra = l&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''indexOf(caracter)''', calcula la posició en la qual es troba el caràcter indicat dins de la cadena de text. Si el caràcter s'inclou diverses vegades dins de la cadena de text, es retorna la seva primera posició començant a buscar des de l'esquerra. Si la cadena no conté el caràcter, la funció retorna el valor -1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var posicion = missatge.indexOf('a'); // posicion = 3&lt;br /&gt;
posicion = missatge.indexOf('b'); // posicion = -1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La seva funció anàloga és lastIndexOf():&lt;br /&gt;
&lt;br /&gt;
'''lastIndexOf(caracter'''), calcula l'última posició en la qual es troba el caràcter indicat dins de la cadena de text. Si la cadena no conté el caràcter, la funció retorna el valor -1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var posicion = missatge.lastIndexOf('a'); // posicion = 3&lt;br /&gt;
posicion = missatge.lastIndexOf('b'); // posicion = -1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La funció lastIndexOf() comença la seva cerca des del final de la cadena cap al principi, encara que la posició retornada és la correcta començant a explicar des del principi de la paraula.&lt;br /&gt;
&lt;br /&gt;
'''substring(inici, final)''', extreu una porció d'una cadena de text. El segon paràmetre és opcional. Si només s'indica el paràmetre inicio, la funció retorna la part de la cadena original corresponent des d'aquesta posició fins al final:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(2); // porcion = &amp;quot;la Món&amp;quot;&lt;br /&gt;
porcion = missatge.substring(5); // porcion = &amp;quot;Món&amp;quot;&lt;br /&gt;
porcion = missatge.substring(7); // porcion = &amp;quot;ndo&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si s'indica un inici negatiu, es retorna la mateixa cadena original:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(-2); // porcion = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Quan s'indica l'inici i el final, es retorna la part de la cadena original compresa entre la posició inicial i la immediatament anterior a la posició final (és a dir, la posició inicio està inclosa i la posició final no):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(1, 8); // porcion = &amp;quot;ona Mun&amp;quot;&lt;br /&gt;
porcion = missatge.substring(3, 4); // porcion = &amp;quot;a&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si s'indica un final més petit que l'inici, Javascript els considera de forma inversa, ja que automàticament assigna el valor més petit a l'inici i el més gran al final:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(5, 0); // porcion = &amp;quot;Hola &amp;quot;&lt;br /&gt;
porcion = missatge.substring(0, 5); // porcion = &amp;quot;Hola &amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''split(separador'''), converteix una cadena de text en un array de cadenes de text. La funció parteix la cadena de text determinant els seus trossos a partir del caràcter separador indicat:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món, sóc una cadena de text!&amp;quot;;&lt;br /&gt;
var paraules = missatge.split(&amp;quot; &amp;quot;);&lt;br /&gt;
// paraules = [&amp;quot;Hola&amp;quot;, &amp;quot;Món,&amp;quot;, &amp;quot;sóc&amp;quot;, &amp;quot;una&amp;quot;, &amp;quot;cadena&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;text!&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Amb aquesta funció es poden extreure fàcilment les lletres que formen una paraula:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var paraula = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var lletres = paraula.split(&amp;quot;&amp;quot;); // lletres = [&amp;quot;H&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;a&amp;quot;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Funcions d'arrays ===&lt;br /&gt;
'''length''', calcula el nombre d'elements d'un array&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var vocals = [&amp;quot;a&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;o&amp;quot;];&lt;br /&gt;
var numeroVocales = vocals.length; // numeroVocales = 5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''concat()''', s'empra per concatenar els elements de diversos arrays&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array1 = [1, 2, 3];&lt;br /&gt;
array2 = array1.concat(4, 5, 6); // array2 = [1, 2, 3, 4, 5, 6]&lt;br /&gt;
array3 = array1.concat([4, 5, 6]); // array3 = [1, 2, 3, 4, 5, 6]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''join(separador)''', és la funció contrària a split(). Uneix tots els elements d'un array per formar una cadena de text. Per unir els elements s'utilitza el caràcter separador indicat&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [&amp;quot;hola&amp;quot;, &amp;quot;món&amp;quot;];&lt;br /&gt;
var missatge = array.join(&amp;quot;&amp;quot;); // missatge = &amp;quot;holamundo&amp;quot;&lt;br /&gt;
missatge = array.join(&amp;quot; &amp;quot;); // missatge = &amp;quot;hola món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''pop()''', elimina l'últim element del array i ho retorna. El array original es modifica i la seva longitud disminueix en 1 element.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
var ultimo = array.pop();&lt;br /&gt;
// ara array = [1, 2], ultimo = 3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''push()''', afegeix un element al final del array. El array original es modifica i augmenta la seva longitud en 1 element. (També és possible afegir més d'un element alhora)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
array.push(4);&lt;br /&gt;
// ara array = [1, 2, 3, 4]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''shift()''', elimina el primer element del array i ho retorna. El array original es veu modificat i la seva longitud disminuïda en 1 element.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
var primer = array.shift();&lt;br /&gt;
// ara array = [2, 3], primer = 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''unshift()''', afegeix un element al principi del array. El array original es modifica i augmenta la seva longitud en 1 element. (També és possible afegir més d'un element alhora)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
array.unshift(0);&lt;br /&gt;
// ara array = [0, 1, 2, 3]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''reverse()''', modifica un array col·locant els seus elements en l'ordre invers a la seva posició original:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
array.reverse();&lt;br /&gt;
// ara array = [3, 2, 1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''sort()''', ordena els elements del array, tan numèrics com alfabètics.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [4, 2, 1, 3];&lt;br /&gt;
array.sort();&lt;br /&gt;
// ara array = [1, 2, 3, 4]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''splice()''', afegeix i elimina elements.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;Inici&amp;lt;/i&amp;gt; es la posició on començarà a afegir o eliminar.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;Eliminats&amp;lt;/i&amp;gt; es el nombre d'elements que es volven borrar. Si posem un 0, solament afegirà valors.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;Valor1, valor2, …, valorN&amp;lt;/i&amp;gt; son els valor que volem afegir.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3, 4, 5];&lt;br /&gt;
array.splice(1,3);&lt;br /&gt;
// ara array = [1, 5], elimina a partir de la posició 1, tres elements.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array =[1, 2, 3, 4, 5];&lt;br /&gt;
array.splice(2, 0, 2.5);&lt;br /&gt;
//ara el array = [1, 2, 2.5, 3, 4, 5]&lt;br /&gt;
//afegeix a partir de la posició dos el element 2.5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array= [1, 2, 3, 4, 5, 6];&lt;br /&gt;
array.splice(2, 3);&lt;br /&gt;
//Eliminem, a partir del segon element (no inclos) 3 elements&lt;br /&gt;
//ara el array = [1, 2, 6]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3, 4, 5];&lt;br /&gt;
array.splice(1, 3, &amp;quot;two&amp;quot;, &amp;quot;three&amp;quot;, &amp;quot;four&amp;quot;);&lt;br /&gt;
//Eliminem tres elements a partir del primer element, y afegim 3 més&lt;br /&gt;
//ara el array = [1, &amp;quot;two&amp;quot;, &amp;quot;three&amp;quot;, &amp;quot;four&amp;quot;, 5]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Funcions de nombres ===&lt;br /&gt;
'''NaN''', (de l'anglès, &amp;quot;Not a Number&amp;quot;) Javascript empra el valor NaN per indicar un valor numèric no definit (per exemple, la divisió 0/0).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 0;&lt;br /&gt;
var numero2 = 0;&lt;br /&gt;
alert(numero1/numero2); // es mostra el valor NaN&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''isNaN()''', permet protegir a l'aplicació de possibles valors numèrics no definits&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 0;&lt;br /&gt;
var numero2 = 0;&lt;br /&gt;
if(isNaN(numero1/numero2)) {&lt;br /&gt;
alert(&amp;quot;La divisió no està definida per als nombres indicats&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
alert(&amp;quot;La divisió és igual a =&amp;gt; &amp;quot; + numero1/numero2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''Infinity''', fa referència a un valor numèric infinit i positiu (també existeix el valor –Infinity per als infinits negatius)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 10;&lt;br /&gt;
var numero2 = 0;&lt;br /&gt;
alert(numero1/numero2); // es mostra el valor Infinity&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''toFixed(digits)''', retorna el nombre original amb punts decimals com els indicats pel paràmetre digits i realitza els arrodoniments necessaris. Es tracta d'una funció molt útil per exemple per mostrar preus.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 4564.34567;&lt;br /&gt;
numero1.toFixed(2); // 4564.35&lt;br /&gt;
numero1.toFixed(6); // 4564.345670&lt;br /&gt;
numero1.toFixed(); // 4564&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conversió de tipus ===&lt;br /&gt;
No és capaç de convertir un string en nombre (tret que el string sigui solament un nombre). Per a això existeixen dues funcions preconstruidas en Javascript que ens permeten convertir un string en nombre enter o decimal, amb dues limitacions:&lt;br /&gt;
Ha d'aparèixer com string el nombre (sencer o decimal) que volem convertir.&lt;br /&gt;
Ha d'aparèixer al principi del string.&lt;br /&gt;
'''parseInt(String)''' --&amp;gt; converteix a integer&lt;br /&gt;
'''parseFloat(String)''' --&amp;gt; Converteix a Float&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parseInt(&amp;quot;4.33333&amp;quot;); --&amp;gt; 4&lt;br /&gt;
parseFloat(&amp;quot;4.333&amp;quot;); --&amp;gt; 4.333&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
=== Exercici : Arrays ===&lt;br /&gt;
Crear un array anomenat mesos i que emmagatzemi el nom dels dotze mesos de l'any. Mostrar per pantalla els dotze noms utilitzant la funció alert().&lt;br /&gt;
&lt;br /&gt;
:[[Solució Exercici Arrays]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici : Operadors ===&lt;br /&gt;
A partir del següent array que es proporciona: &lt;br /&gt;
&amp;lt;pre&amp;gt;var valors = [true, 5, false, &amp;quot;hola&amp;quot;, &amp;quot;adios&amp;quot;, 2];&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Determinar quin dels dos elements de text és major&lt;br /&gt;
* Utilitzant exclusivament els dos valors booleans del array, determinar els operadors necessaris per obtenir un resultat true i un altre resultat false&lt;br /&gt;
* Determinar el resultat de les cinc operacions matemàtiques realitzades amb els dos elements numèrics&lt;br /&gt;
&lt;br /&gt;
:[[Solució Exercici Operadors]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici DNI ===&lt;br /&gt;
El càlcul de la lletra del Document Nacional d'Identitat (DNI) és un procés matemàtic senzill que es basa a obtenir la resta de la divisió sencera del nombre de DNI i el número 23. A partir de la resta de la divisió, s'obté la lletra seleccionant-la dins d'un array de lletres.&lt;br /&gt;
El array de lletres és:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var lletres = ['T', 'R', 'W', 'A', 'G', 'M', 'I', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'I', 'T'];&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per tant si la resta de la divisió és 0, la lletra del DNI és la T i si la resta és 3 la lletra és l'A. Amb aquestes dades, elaborar un petit script que:&lt;br /&gt;
* Emmagatzemi en una variable el nombre de DNI indicat per l'usuari i en una altra variable la lletra del DNI que s'ha indicat. (Pista: si es vol demanar directament a l'usuari que indiqui el seu nombre i la seva lletra, es pot utilitzar la funció prompt())&lt;br /&gt;
* En primer lloc (i en una sola instrucció) s'ha de comprovar si el nombre és menor que 0 o major que 99999999. Si aquest és el cas, es mostra un missatge a l'usuari indicant que el nombre proporcionat no és vàlid i el programa no mostra més missatges.&lt;br /&gt;
* Si el nombre és vàlid, es calcula la lletra que li correspon segons el mètode explicat anteriorment.&lt;br /&gt;
* Una vegada calculada la lletra, s'ha de comparar amb la lletra indicada per l'usuari. Si no coincideixen, es mostra un missatge a l'usuari dient-li que la lletra que ha indicat no és correcta. En un altre cas, es mostra un missatge indicant que el nombre i la lletra de DNI són correctes.&lt;br /&gt;
&lt;br /&gt;
:[[Solució DNI]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Factorial ===&lt;br /&gt;
El factorial d'un nombre enter n és una operació matemàtica que consisteix a multiplicar tots els factors n x (n-1) x (n-2) x ... x 1. Així, el factorial de 5 (escrit com 5!) és igual a: 5! = 5 x 4 x 3 x 2 x 1 = 120&lt;br /&gt;
Utilitzant l'estructura for, crear un script que calculi el factorial d'un nombre enter.&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
:[[Solució Factorial]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Exercici de Cadenes ===&lt;br /&gt;
Escriure funcions que donades dues cadenes de caràcters:&lt;br /&gt;
a) Indiqui si la segona cadena és una subcadena de la primera. Per exemple, ’cadena’ és una&lt;br /&gt;
subcadena de ’subcadena’.&lt;br /&gt;
b) Retorni la que sigui anterior en ordre alfábetico. Per exemple, si rep ’kde’ i ’gnome’&lt;br /&gt;
ha de retornar ’gnome’.&lt;br /&gt;
&lt;br /&gt;
:[[Solució cadenes]]&lt;br /&gt;
&lt;br /&gt;
=== Joc d'adivinació ===&lt;br /&gt;
Considerem el següent joc entre els jugadors A (endeví) y P (pensador): P pensa un nombre entre 1 y 1000. A intenta adivinar-ho mitjançant aproximacions fins que adivina el número. &lt;br /&gt;
Suposem que la màquina interpreta el paper d'endeví i l'usuari ha de pensar el número. El pensador només pot donar 3 tipus de respostes per cada nombre proposat per l'endeví:&lt;br /&gt;
* &amp;quot;MAJOR&amp;quot; : vol dir que el numero proposat pel l'endeví és major que el que ha pensat.&lt;br /&gt;
* &amp;quot;MENOR&amp;quot; : vol dir que el numero proposat pel l'endeví és menor que el que ha pensat.&lt;br /&gt;
* &amp;quot;OK&amp;quot; : vol dir que ha adivinat el número. &lt;br /&gt;
&lt;br /&gt;
:[[Solució Joc d'adivinació]]&lt;br /&gt;
&lt;br /&gt;
=== Palíndrom ===&lt;br /&gt;
Volem sapiguer si una determinada paraula o frase és un [http://es.wikipedia.org/wiki/Pal%C3%ADndromo palíndrom]. Escriu un programa que demani una text i aquest indiqui si és o no palíndrom.&lt;br /&gt;
&lt;br /&gt;
:[[Solució Palíndrom]]&lt;br /&gt;
&lt;br /&gt;
=== Triangle bonic ===&lt;br /&gt;
Utilitzant bucles i amb els dígits {0...9} es poden dibuixar triangles com el següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         1 &lt;br /&gt;
        232&lt;br /&gt;
       34543&lt;br /&gt;
      4567654&lt;br /&gt;
     567898765&lt;br /&gt;
    67890109876&lt;br /&gt;
   7890123210987&lt;br /&gt;
  890123454321098&lt;br /&gt;
 90123456765432109&lt;br /&gt;
0123456789876543210&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
T'atreveixes?&lt;br /&gt;
&lt;br /&gt;
:[[Solució Triangle bonic]]&lt;br /&gt;
&lt;br /&gt;
=== Xifrat Julio César ===&lt;br /&gt;
El dictador Julio César utilitzava un codi quan volia mantenir en secret un missatge. El xifrat consistia a substituir la primera lletra de l'alfabet, A, per la quarta, D, i així successivament amb les altres, és a dir, B, per la cinquena, I, la tercera, C, per la sisena, F ...&lt;br /&gt;
&lt;br /&gt;
L'alfabet llatí que utilitzava Julio César constava de 21 lletres, per tant la substitució de lletres per xifrar o desxifrar missatges queda descrita en la taula següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Alfabet original : A B C D E F G H I K L M N O P Q R S T V&lt;br /&gt;
Alfabet xifrat   : D E F G H I K L M N O P Q R S T V A B C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aquest tipus de xifrat és un codi de rotació, on la clau de rotació és 3.&lt;br /&gt;
&lt;br /&gt;
Escriu un programa que permeti xifrar o desxifrar utilitzant un codi de rotació. La clau del codi podrà triar-se.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[Solució Xifrat]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Password segur? ===&lt;br /&gt;
Volem saber si una contrasenya és segura. Per tal que sigui segura ha de complir les següents regles:&lt;br /&gt;
* Ha de contenir almenys una vocal.&lt;br /&gt;
* No ha de tenir tres vocals consecutives o tres consonants consecutives.&lt;br /&gt;
* No ha de tenir dues ocurrències consecutives de la mateixa lletra, excepte per ‘ee’ o ‘oo’.&lt;br /&gt;
* La longitud mínima és de 6 caràcters i la màxima de 10.&lt;br /&gt;
* Els espais en blanc no estan permesos&lt;br /&gt;
&lt;br /&gt;
:[[Solució Password segur?]]&lt;br /&gt;
&lt;br /&gt;
=== Separador de milers ===&lt;br /&gt;
Escriure una funció que rebi una cadena que conté un llarg nombre enter i retorni una cadena amb el nombre i les separacions de milers. Per exemple, si rep ’1234567890’, ha de retornar ’1.234.567.890’.&lt;br /&gt;
&lt;br /&gt;
:[[Solució Separador de milers]]&lt;br /&gt;
&lt;br /&gt;
=== Instruens Fabulam ===&lt;br /&gt;
Instruens Fabulam és la manera de dibuixar un quadre (o taula) en idioma Llatí. Això és el que has de fer per a aquest problema.&lt;br /&gt;
Cada descripció comença amb una línia d'encapçalat que conté un o més caràcters que defineixen el nombre i l'alineament de de les columnes de la taula. &lt;br /&gt;
Els caràcters de l'encapçalat són:&lt;br /&gt;
* ‘&amp;lt;’ justificació per esquerra&lt;br /&gt;
* ’=’ justificació per central&lt;br /&gt;
* ‘&amp;gt;’ justificació per dreta&lt;br /&gt;
Després de l'encapçalat hi ha almenys dos i com a màxim 21 línies de dades que contenen les entrades de cada fila.&lt;br /&gt;
Cada línia de dades consisteix en una o més entrades (no buides) separades per un ampersand (‘&amp;amp;’), on el nombre d'entrades és igual al nombre de columnes definides en l'encapçalat.&lt;br /&gt;
La primera línia conté els títols de les columnes, i les línies de dades restants contenen les entrades del cos de la taula. Els  espais poden aparèixer dins d'una entrada, però mai al principi ni al final de l'entrada. Els caràcters '&amp;lt;', '=', '&amp;gt;', '&amp;amp;', i 'comilles simples' no apareixeran en l'entrada excepte en els llocs indicats a dalt.&lt;br /&gt;
Per cada descripció de taula, desplegui la taula usant el format exacte mostrat en l'exemple. Noti que: &lt;br /&gt;
* L'ample total de la taula no excedirà els 79 caràcters (sense explicar la fi-de-línia).&lt;br /&gt;
* Els guions ('-') són usats per dibuixar línies horitzontals, no ('_'). El signe d'arrova ('@') apareix en cada cantonada. El signe de summa (‘+’) apareix en una intersecció entre la línia que separa el títol i el cos de la taula.&lt;br /&gt;
* Les entrades d'una columna estan separades pel caràcter (‘|’) per exactament un espai.&lt;br /&gt;
* Si una entrada centrada no està exactament centrada en una columna, l'espai extra ha d'anar a la dreta de l'entrada.&lt;br /&gt;
Exemples:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció Instruens Fabulam:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&lt;br /&gt;
What is the answer?&lt;br /&gt;
42&lt;br /&gt;
&lt;br /&gt;
Quadre:&lt;br /&gt;
@---------------------@&lt;br /&gt;
| What is the answer? |&lt;br /&gt;
|---------------------|&lt;br /&gt;
|                     |&lt;br /&gt;
|                   42|&lt;br /&gt;
@---------------------@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;gt;&lt;br /&gt;
Tweedledum&amp;amp;Tweedledee&lt;br /&gt;
&amp;quot;Knock, knock.&amp;quot;&amp;amp;&amp;quot;Who's there?&amp;quot;&lt;br /&gt;
&amp;quot;Boo.&amp;quot;&amp;amp;&amp;quot;Boo who?&amp;quot;&lt;br /&gt;
&amp;quot;Don't cry, it's only me.&amp;quot;&amp;amp;(groan)&lt;br /&gt;
&lt;br /&gt;
Quadre:&lt;br /&gt;
@---------------------------------------------@&lt;br /&gt;
| Tweedledum                 |     Tweedledee |&lt;br /&gt;
|----------------------------+----------------|&lt;br /&gt;
| &amp;quot;Knock, knock.&amp;quot;            | &amp;quot;Who's there?&amp;quot; |&lt;br /&gt;
| &amp;quot;Boo.&amp;quot;                     |     &amp;quot;Boo who?&amp;quot; |&lt;br /&gt;
| &amp;quot;Don't cry, it's only me.&amp;quot; |        (groan) |&lt;br /&gt;
@---------------------------------------------@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;gt;=&amp;gt;&lt;br /&gt;
TITLE&amp;amp;VERSION&amp;amp;OPERATING SYSTEM&amp;amp;PRICE&lt;br /&gt;
Slug Farm&amp;amp;2.0&amp;amp;FreeBSD&amp;amp;49.99&lt;br /&gt;
Figs of Doom&amp;amp;1.7&amp;amp;Linux&amp;amp;9.98&lt;br /&gt;
Smiley Goes to Happy Town&amp;amp;11.0&amp;amp;Windows&amp;amp;129.25&lt;br /&gt;
Wheelbarrow Motocross&amp;amp;1.0&amp;amp;BeOS&amp;amp;34.97&lt;br /&gt;
&lt;br /&gt;
Quadre:&lt;br /&gt;
@-----------------------------------------------------------------@&lt;br /&gt;
| TITLE                     |  VERSION| OPERATING SYSTEM |   PRICE|&lt;br /&gt;
|---------------------------+---------+------------------+--------|&lt;br /&gt;
| Slug Farm                 |     2.0 |          FreeBSD |  49.99 | &lt;br /&gt;
| Figs of Doom              |     1.7 |            Linux |   9.98 |&lt;br /&gt;
| Smiley Goes to Happy Town |    11.0 |          Windows | 129.25 |&lt;br /&gt;
| Wheelbarrow Motocross     |     1.0 |             BeOS |  34.97 |&lt;br /&gt;
@-----------------------------------------------------------------@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Nota''': Per emmagatzemar en una sola línea la Descripció pots utilitzar el simbol %: exemple: var d = &amp;quot;&amp;gt;%what is the answer?%42&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:[[Solució Instruens Fabulam]]&lt;br /&gt;
&lt;br /&gt;
== Exercicis per entregar ==&lt;br /&gt;
&lt;br /&gt;
=== Text al revés ===&lt;br /&gt;
Escriu un programa que posi al revés un text donat. S'ha de poder escollir si es vol caràcter a caràcter o paraula a paraula.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
text: &amp;quot;hola a tots&amp;quot;&lt;br /&gt;
caracter a caracter: &amp;quot;stot a aloh&amp;quot;&lt;br /&gt;
paraula a paraula : &amp;quot;tots a hola&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Nombres Romans ===&lt;br /&gt;
Escriu un programa que converteixi un enter positiu en un nombre romà. Assumeix que els nombres a convertir són menors a 3500. Les regles per construir un nombre romà són les que segueixen. En el sistema de nombres romans, i és el símbol per 1, v per 5, x per 10, l per 50, c per 100, d per 500 i m per 1000.&lt;br /&gt;
Les regles per formar numeros romans les tens [http://roble.pntic.mec.es/~msanto1/ortografia/numrom.htm aquí.]&lt;br /&gt;
Exemple: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
entrada : 1990&lt;br /&gt;
sortida : mcmxc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Retrat Robot ===&lt;br /&gt;
A causa de les dificultats de la policia per identificar als sospitosos, fa temps es va decidir substituir als dibuixants tradicionals per un programa que efectua el retrat robot a partir d'una descripció del delinqüent.&lt;br /&gt;
&lt;br /&gt;
El programa prototip requeria descripcions molt simples, on cada línia del dibuix es consigna indicant quantes vegades apareix cada caràcter.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció = &amp;quot;1 9W;1 1|2 1o1 1o2 1|;1@4 1U4 1@;1 1|2 3=2 1|;2 1\5_1/&amp;quot;&lt;br /&gt;
Dibuix:&lt;br /&gt;
 WWWWWWWWW&lt;br /&gt;
 |  O O  |&lt;br /&gt;
@    U    @&lt;br /&gt;
 |  ===  |&lt;br /&gt;
  \_____/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Escriu un programa que llegeixi una cadena de text on se separen pel caràcter ';' la descripció de cada línia del dibuix. El programa ha de donar com resultat el dibuix corresponent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Dibuixos amb asteriscos ===&lt;br /&gt;
&lt;br /&gt;
Escriu un programa que dibuixi per pantalla les següents figures:&lt;br /&gt;
*volcà : composta per línies de 2,4,8,16,32 i 64 asteriscos&lt;br /&gt;
[[Fitxer:volca.png]]&lt;br /&gt;
*Mosaic: Compost per una matriu de 8x8 caràcters.&lt;br /&gt;
[[Fitxer:mosaic.png]]&lt;br /&gt;
*Taulers: Com l'anterior però cada quadrat d'amplària L (nombre de línies)&lt;br /&gt;
[[Fitxer:taulers.png]]&lt;br /&gt;
&lt;br /&gt;
== Bibliografia / Webgrafia  ==&lt;br /&gt;
Luis Llana, Carlos Gregorio, Raquel Martínez, Pedro Palao y C. Pareja, &amp;quot;Ejercicios creativos y recreativos en C++&amp;quot;, Ed. Prentice-Hall, 2002. ISBN 84-205-3211-8.&lt;br /&gt;
&lt;br /&gt;
[http://librosweb.es/javascript/capitulo_3.html Introducció a Javascript] &lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[http://www.internetmania.net/int0/int0.htm Internetmania]&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Soluci%C3%B3_Triangle_bonic&amp;diff=7352</id>
		<title>Solució Triangle bonic</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Soluci%C3%B3_Triangle_bonic&amp;diff=7352"/>
				<updated>2016-09-21T19:06:57Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var c = '&amp;amp;amp;nbsp;';&lt;br /&gt;
result=&amp;quot;&amp;quot;;&lt;br /&gt;
for (i=1; i&amp;lt;=10; i++){&lt;br /&gt;
     // escriure el caracters buits&lt;br /&gt;
	for(j=1; j&amp;lt;=10-i; j++){	&lt;br /&gt;
		result = result + c;&lt;br /&gt;
        }&lt;br /&gt;
     &lt;br /&gt;
     // escriure la seqüència creixent&lt;br /&gt;
  	var n = i;&lt;br /&gt;
  	for(j=1; j&amp;lt;=i;j++){&lt;br /&gt;
   		if(n == 10) n = 0;&lt;br /&gt;
		result = result + n;&lt;br /&gt;
		n++;&lt;br /&gt;
	}&lt;br /&gt;
     // escriure la seqüència decreixent&lt;br /&gt;
	n = n-2;&lt;br /&gt;
	for (j=1; j&amp;lt;=i-1; j++){&lt;br /&gt;
		if(n == -1) n =9;&lt;br /&gt;
		result = result + n;&lt;br /&gt;
		n--;&lt;br /&gt;
	}&lt;br /&gt;
	result = result + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
document.write(result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una altre solució sense bucles:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var alfa = [&amp;quot;&amp;quot;,&amp;quot;1&amp;quot;,&amp;quot;2&amp;quot;,&amp;quot;3&amp;quot;,&amp;quot;4&amp;quot;,&amp;quot;5&amp;quot;,&amp;quot;6&amp;quot;,&amp;quot;7&amp;quot;,&amp;quot;8&amp;quot;,&amp;quot;9&amp;quot;,&amp;quot;0&amp;quot;];&lt;br /&gt;
console.log(alfa.reduce(function(data, item, index){&lt;br /&gt;
    &lt;br /&gt;
    var b = alfa.reduce(function(linea, item2, index2){&lt;br /&gt;
        //espais en blanc&lt;br /&gt;
        if (index2 &amp;gt; index) &lt;br /&gt;
            linea[&amp;quot;blancs&amp;quot;] = linea[&amp;quot;blancs&amp;quot;] + &amp;quot; &amp;quot;;&lt;br /&gt;
        //cadena ascendent&lt;br /&gt;
        if((index &amp;gt; (index2 - index)) &amp;amp; index &amp;lt;= index2  )&lt;br /&gt;
            linea[&amp;quot;asc&amp;quot;] = linea[&amp;quot;asc&amp;quot;] + item2;&lt;br /&gt;
        //cadena descenc¡dent&lt;br /&gt;
        if((index &amp;gt; (index2 - index)+1) &amp;amp; index &amp;lt;= index2  )&lt;br /&gt;
            linea[&amp;quot;desc&amp;quot;] =  item2 + linea[&amp;quot;desc&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        //part del mig&lt;br /&gt;
        var n = alfa.length / 2;&lt;br /&gt;
        if (index &amp;gt; n)&lt;br /&gt;
        {&lt;br /&gt;
            //cadena del mig ascendent&lt;br /&gt;
            if(index2 &amp;lt;= index - (alfa.length - index)){&lt;br /&gt;
                linea[&amp;quot;medasc&amp;quot;] = linea[&amp;quot;medasc&amp;quot;] + item2;&lt;br /&gt;
            }&lt;br /&gt;
            //cadena del mig descendent&lt;br /&gt;
            if(index2 &amp;lt; index - (alfa.length - index)){&lt;br /&gt;
                linea[&amp;quot;meddesc&amp;quot;] = item2 + linea[&amp;quot;meddesc&amp;quot;];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return linea;&lt;br /&gt;
        },{blancs: &amp;quot;&amp;quot;, asc:&amp;quot;&amp;quot;, desc:&amp;quot;&amp;quot;, medasc:&amp;quot;&amp;quot;, meddesc:&amp;quot;&amp;quot;});&lt;br /&gt;
        &lt;br /&gt;
    data.push(b[&amp;quot;blancs&amp;quot;] + b[&amp;quot;asc&amp;quot;] + b[&amp;quot;medasc&amp;quot;] + b[&amp;quot;meddesc&amp;quot;] + b[&amp;quot;desc&amp;quot;]+&amp;quot;\n&amp;quot;);&lt;br /&gt;
    return data; &lt;br /&gt;
},[]));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Sintaxi_Javascript&amp;diff=7341</id>
		<title>NF2 - Sintaxi Javascript</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Sintaxi_Javascript&amp;diff=7341"/>
				<updated>2016-09-20T18:30:16Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* Xifrat Julio César */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Generalitats ==&lt;br /&gt;
La sintaxi d'un llenguatge de programació es defineix com el conjunt de regles que han de seguir-se en escriure el codi font dels programes per considerar-se com a correctes per a aquest llenguatge de programació.&lt;br /&gt;
&lt;br /&gt;
La sintaxi de Javascript és molt similar a la d'altres llenguatges de programació com Java i C. Les normes bàsiques que defineixen la sintaxi de Javascript són les següents:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;No es tenen en compte els espais en blanc i les noves línies&amp;lt;/b&amp;gt;: com succeeix amb XHTML, l'intèrpret de Javascript ignora qualsevol espai en blanc sobrant, per la qual cosa el codi es pot ordenar de forma adequada per entendre-ho millor (tabulant les línies, afegint espais, creant noves línies, etc.)&lt;br /&gt;
* &amp;lt;b&amp;gt;Es distingeixen les majúscules i minúscules&amp;lt;/b&amp;gt;: igual que succeeix amb la sintaxi de les etiquetes i elements XHTML. No obstant això, si en una pàgina XHTML s'utilitzen indistintament majúscules i minúscules, la pàgina es visualitza correctament, sent l'únic problema la no validació de la pàgina. En canvi, si en Javascript s'intercanvien majúscules i minúscules el script no funciona.&lt;br /&gt;
* &amp;lt;b&amp;gt;No es defineix el tipus de les variables&amp;lt;/b&amp;gt;: en crear una variable, no és necessari indicar el tipus de dada que emmagatzemarà. D'aquesta forma, una mateixa variable pot emmagatzemar diferents tipus de dades durant l'execució del script.&lt;br /&gt;
* &amp;lt;b&amp;gt;No és necessari acabar cada sentència amb el caràcter de punt i coma (;)&amp;lt;/b&amp;gt;: en la majoria de llenguatges de programació, és obligatori acabar cada sentència amb el caràcter ;. Encara que Javascript no obliga a fer-ho, NOSALTRES seguirem la tradició d'acabar cada sentència amb el caràcter del punt i coma (;).&lt;br /&gt;
* &amp;lt;b&amp;gt;Es poden incloure comentaris&amp;lt;/b&amp;gt;: els comentaris s'utilitzen per afegir informació en el codi font del programa. Encara que el contingut dels comentaris no es visualitza per pantalla, si que s'envia al navegador de l'usuari juntament amb la resta del script, per la qual cosa és necessari extremar les precaucions sobre la informació inclosa en els comentaris.&lt;br /&gt;
&lt;br /&gt;
Javascript defineix dos tipus de comentaris: els de una sola línia i els que ocupen diverses línies.&lt;br /&gt;
&lt;br /&gt;
Els comentaris d'una sola línia es defineixen afegint dues barres obliqües (//) al principi de la línia :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// a continuació es mostra un missatge&lt;br /&gt;
&lt;br /&gt;
alert(&amp;quot;missatge de prova&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de comentari de diverses línies:&lt;br /&gt;
&amp;lt;&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Els comentaris de diverses línies són molt útils&lt;br /&gt;
quan es necessita incloure bastant informació&lt;br /&gt;
en els comentaris */&lt;br /&gt;
&lt;br /&gt;
alert(&amp;quot;missatge de prova&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els comentaris multilinia es defineixen tancant el text del comentari entre els símbols /* i */.&lt;br /&gt;
&lt;br /&gt;
== Variables ==&lt;br /&gt;
Les variables en els llenguatges de programació segueixen una lògica similar a les variables utilitzades en altres àmbits com les matemàtiques. Una variable és un element que s'empra per emmagatzemar i fer referència a un altre valor. Gràcies a les variables és possible crear &amp;quot;programes genèrics&amp;quot;, és a dir, programes que funcionen sempre igual independentment dels valors concrets utilitzats.&lt;br /&gt;
&lt;br /&gt;
De la mateixa forma que si en Matemàtiques no existissin les variables no es podrien definir les equacions i fórmules, en programació no es podrien fer programes realment útils sense les variables.&lt;br /&gt;
&lt;br /&gt;
Si no existissin variables, un programa que suma dos nombres podria escriure's com:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
resultat = 3 + 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El programa anterior és tan poc útil que només serveix per al cas en el qual el primer nombre de la summa sigui el 3 i el segon nombre sigui l'1. En qualsevol altre cas, el programa obté un resultat incorrecte.&lt;br /&gt;
&lt;br /&gt;
No obstant això, el programa es pot refer de la següent manera utilitzant variables per emmagatzemar i referir-se a cada nombre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
numero_1 = 3&lt;br /&gt;
numero_2 = 1&lt;br /&gt;
resultat = numero_1 + numero_2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els elements ''numero_1'' i ''numero_2'' són variables que emmagatzemen els valors que utilitza el programa. El resultat es calcula sempre en funció del valor emmagatzemat per les variables, per la qual cosa aquest programa funciona correctament per a qualsevol parell de nombres indicat. Si es modifica el valor de les variables ''numero_1'' i ''numero_2'', el programa segueix funcionant correctament.&lt;br /&gt;
&lt;br /&gt;
Les variables en Javascript es creen mitjançant la paraula reservada '''var'''. D'aquesta forma, l'exemple anterior es pot realitzar en Javascript de la següent manera:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1 = 3;&lt;br /&gt;
var numero_2 = 1;&lt;br /&gt;
var resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La paraula reservada ''var'' solament s'ha d'indicar en definir per primera vegada la variable, la qual cosa es denomina declarar una variable. Quan s'utilitzen les variables en la resta d'instruccions del *script, solament és necessari indicar el seu nom. En altres paraules, en l'exemple anterior seria un error indicar el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1 = 3;&lt;br /&gt;
var numero_2 = 1;&lt;br /&gt;
var resultat = *var numero_1 + *var numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si quan es declara una variable se li assigna també un valor, es diu que la variable ha estat inicialitzada. ''En Javascript no és obligatori inicialitzar les variables'', ja que es poden declarar d'una banda i assignar-los un valor posteriorment. Per tant, l'exemple anterior es pot refer de la següent manera:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1;&lt;br /&gt;
var numero_2;&lt;br /&gt;
&lt;br /&gt;
numero_1 = 3;&lt;br /&gt;
numero_2 = 1;&lt;br /&gt;
&lt;br /&gt;
var resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Una de les característiques més sorprenents de JavaSript per als programadors habituats a altres llenguatges de programació és que tampoc és necessari declarar les variables. En altres paraules, es poden utilitzar variables que no s'han definit anteriorment mitjançant la paraula reservada *var. L'exemple anterior també és correcte en Javascript de la següent forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1 = 3;&lt;br /&gt;
var numero_2 = 1;&lt;br /&gt;
&lt;br /&gt;
resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La variable resultat no està declarada, per la qual cosa Javascript crea una variable global (més endavant es veuran les diferències entre variables locals i globals) i li assigna el valor corresponent. De la mateixa forma, també seria correcte el següent codi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
numero_1 = 3;&lt;br /&gt;
numero_2 = 1;&lt;br /&gt;
&lt;br /&gt;
resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En qualsevol cas, es recomana declarar totes les variables que es vagin a utilitzar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;El nom d'una variable&amp;lt;/u&amp;gt; també es coneix com a identificador i &amp;lt;u&amp;gt;ha de complir les següents normes:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Només pot estar format per lletres, nombres i els símbols $ (dòlar) i _ (guió baix).&lt;br /&gt;
* El primer caràcter no pot ser un nombre.&lt;br /&gt;
&lt;br /&gt;
Per tant, les següents variables tenen noms correctes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var $numero1;&lt;br /&gt;
var _$lletra;&lt;br /&gt;
var $$$*otroNumero;&lt;br /&gt;
var $_a__$4;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
No obstant això, les següents variables tenen identificadors incorrectes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var 1numero; // Comença per un nombre&lt;br /&gt;
var numero;1_123; // Conté un caràcter &amp;quot;;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tipus de variables ===&lt;br /&gt;
Encara que totes les variables de Javascript es creen de la mateixa forma (mitjançant la paraula reservada var), la forma en la qual se'ls assigna un valor depèn del tipus de valor que es vol emmagatzemar (nombres, textos, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Numèriques ====&lt;br /&gt;
S'utilitzen per emmagatzemar valors numèrics enters (anomenats integer en anglès) o decimals (anomenats float en anglès). En aquest cas, el valor s'assigna indicant directament el nombre enter o decimal. Els nombres decimals utilitzen el caràcter . (punt) en comptes de , (coma) per separar la part sencera i la part decimal:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var iva = 16; // variable tipus sencer&lt;br /&gt;
var total = 234.65; // variable tipus decimal&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==== Cadenes de text ====&lt;br /&gt;
S'utilitzen per emmagatzemar caràcters, paraules i/o frases de text. Per assignar el valor a la variable, es tanca el valor entre cometes dobles o simples, per delimitar el seu començament i el seu final:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Benvingut al nostre lloc web&amp;quot;;&lt;br /&gt;
var nombreProducto = 'Producte ABC';&lt;br /&gt;
var letraSeleccionada = 'c';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En ocasions, el text que s'emmagatzema en les variables no és tan senzill. Si per exemple el propi text conté cometes simples o dobles, l'estratègia que se segueix és la de tancar el text amb les cometes (simples o dobles) que no utilitzi el text:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* El contingut de text1 té cometes simples, per&lt;br /&gt;
la qual cosa es tanca amb cometes dobles */&lt;br /&gt;
var text1 = &amp;quot;Una frase amb 'cometes simples' dins&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* El contingut de text2 té cometes dobles, per&lt;br /&gt;
la qual cosa es tanca amb cometes simples */&lt;br /&gt;
var text2 = 'Una frase amb &amp;quot;cometes dobles&amp;quot; dins';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No obstant això, de vegades les cadenes de text contenen tant cometes simples com a dobles. A més, existeixen altres caràcters que són difícils d'incloure en una variable de text (tabulador, ENTER, etc.) Per resoldre aquests problemes, Javascript defineix un mecanisme per incloure de forma senzilla caràcters especials i problemàtics dins d'una cadena de text.&lt;br /&gt;
&lt;br /&gt;
El mecanisme consisteix a substituir el caràcter problemàtic per una combinació simple de caràcters. A continuació es mostra la taula de conversió que s'ha d'utilitzar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Si es vol incloure...	S'ha d'incloure...&lt;br /&gt;
Una nova línia          \n	&lt;br /&gt;
Un tabulador	        \t&lt;br /&gt;
Una cometa simple	\'&lt;br /&gt;
Una cometa doble	\&amp;quot;&lt;br /&gt;
Una barra inclinada	\\&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
D'aquesta forma, l'exemple anterior que contenia cometes simples i dobles dins del text es pot refer de la següent forma:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var text1 = 'Una frase amb \'cometes simples\' dins';&lt;br /&gt;
&lt;br /&gt;
var text2 = &amp;quot;Una frase amb \&amp;quot;cometes dobles\&amp;quot; dins&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Aquest mecanisme de Javascript es denomina &amp;quot;mecanisme de fuita&amp;quot; dels caràcters problemàtics, i és habitual referir-se al fet que els caràcters han estat &amp;quot;escapats&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Arrays ====&lt;br /&gt;
En ocasions, als arrays se'ls anomena vectors, matrius i fins i tot arranjaments. No obstant això, el terme array és el més utilitzat i és una paraula comunament acceptada a l'entorn de la programació.&lt;br /&gt;
&lt;br /&gt;
Un array és una col·lecció de variables, que poden ser totes del mateix tipus o cadascuna d'un tipus diferent. La seva utilitat es comprèn millor amb un exemple senzill: si una aplicació necessita utilitzar els dies de la setmana, es podrien crear set variables de tipus text:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dia1 = &amp;quot;Dilluns&amp;quot;;&lt;br /&gt;
var dia2 = &amp;quot;Dimarts&amp;quot;;&lt;br /&gt;
...&lt;br /&gt;
var dia7 = &amp;quot;Diumenge&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Encara que el codi anterior no és incorrecte, sí que és poc eficient i complica a l'excés la programació. Si en comptes dels dies de la setmana s'hagués de guardar el nom dels mesos de l'any, el nom de tots els països del món o els mesuraments diaris de temperatura dels últims 100 anys, s'haurien de crear desenes o centenars de variables.&lt;br /&gt;
&lt;br /&gt;
En aquest tipus de casos, es poden agrupar totes les variables relacionades en una col·lecció de variables o array. L'exemple anterior es pot refer de la següent forma:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dies = [&amp;quot;Dilluns&amp;quot;, &amp;quot;Dimarts&amp;quot;, &amp;quot;Dimecres&amp;quot;, &amp;quot;Dijous&amp;quot;, &amp;quot;Divendres&amp;quot;, &amp;quot;Dissabte&amp;quot;, &amp;quot;Diumenge&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ara, una única variable anomenada ''dies'' emmagatzema tots els valors relacionats entre si, en aquest cas els dies de la setmana. Per definir un array, s'utilitzen els caràcters [ i ] per delimitar el seu començament i el seu final i s'utilitza el caràcter , (coma) per separar els seus elements:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nom_array = [valor1, valor2, ...,valorN];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Una vegada definit un array, és molt senzill accedir a cadascun dels seus elements. Cada element s'accedeix indicant la seva posició dins del array. L'única complicació, que és responsable de molts errors quan es comença a programar, és que les posicions dels elements comencen a explicar-se en el 0 i no en l'1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var diaSeleccionat = dies[0]; // diaSeleccionat = &amp;quot;Dilluns&amp;quot;&lt;br /&gt;
&lt;br /&gt;
var altreDia = dies[5]; // altreDia = &amp;quot;Dissabte&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En l'exemple anterior, la primera instrucció vol obtenir el primer element del array. Per a això, s'indica el nom del array i entre claudàtors la posició de l'element dins del array. Com s'ha comentat, ''les posicions del array comencen a partir del 0'', per la qual cosa el primer element ocupa la posició 0 i s'accedeix al mitjançant dias[0].&lt;br /&gt;
&lt;br /&gt;
El valor dies[5] fa referència a l'element que ocupa la sisena posició dins del array dies. Com les posicions comencen a explicar-se en 0, la posició 5 fa referència al sisè element, en aquest cas, el valor Dissabte.&lt;br /&gt;
&lt;br /&gt;
==== Booleans ====&lt;br /&gt;
Les variables de tipus boolean o booleà també es coneixen amb el nom de variables de tipus lògic. El seu funcionament bàsic és molt senzill.&lt;br /&gt;
&lt;br /&gt;
Una variable de tipus boolean emmagatzema un tipus especial de valor que solament pot prendre dos valors: '''true''' (veritable) o '''false''' (fals). No es pot utilitzar per emmagatzemar nombres i tampoc permet guardar cadenes de text.&lt;br /&gt;
&lt;br /&gt;
Els únics valors que poden emmagatzemar aquestes variables són true i false, per la qual cosa no poden utilitzar-se els valors veritable i fals. A continuació es mostra un parell de variables de tipus booleà:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var clientRegistrat = false;&lt;br /&gt;
var iva = true;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Operadors ===&lt;br /&gt;
&lt;br /&gt;
Els operadors permeten manipular el valor de les variables, realitzar operacions matemàtiques amb els seus valors i comparar diferents variables. D'aquesta forma, els operadors permeten als programes realitzar càlculs complexos i prendre decisions lògiques en funció de comparacions i altres tipus de condicions.&lt;br /&gt;
&lt;br /&gt;
==== Assignació ====&lt;br /&gt;
&lt;br /&gt;
L'operador d'assignació és el més utilitzat i el més senzill. Aquest operador s'utilitza per guardar un valor específic en una variable. El símbol utilitzat és = (no confondre amb l'operador == que es veurà més endavant):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 3;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A l'esquerra de l'operador, sempre ha d'indicar-se el nom d'una variable. A la dreta de l'operador, es poden indicar variables, valors, condicions lògiques, etc:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 3;&lt;br /&gt;
var numero2 = 4;&lt;br /&gt;
&lt;br /&gt;
/* Error, l'assignació sempre es realitza a una variable,&lt;br /&gt;
per la qual cosa en l'esquerra no es pot indicar un número */&lt;br /&gt;
5 = numero1;&lt;br /&gt;
&lt;br /&gt;
// Ara, la variable numero1 val 5&lt;br /&gt;
numero1 = 5;&lt;br /&gt;
&lt;br /&gt;
// Ara, la variable numero1 val 4&lt;br /&gt;
numero1 = numero2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Increment i decrement====&lt;br /&gt;
Aquests dos operadors solament són vàlids per a les variables numèriques i s'utilitzen per incrementar o decrementar en una unitat el valor d'una variable.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
++numero;&lt;br /&gt;
alert(numero); // numero = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L'operador d'increment s'indica mitjançant el prefix ++ en el nom de la variable. El resultat és que el valor d'aquesta variable s'incrementa en una unitat. Per tant, l'anterior exemple és equivalent a:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
numero = numero + 1;&lt;br /&gt;
alert(numero); // numero = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
De forma equivalent, l'operador decrement (indicat com un prefix -- en el nom de la variable) s'utilitza per decrementar el valor de la variable:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
--numero;&lt;br /&gt;
alert(numero); // numero = 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'anterior exemple és equivalent a:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
numero = numero - 1;&lt;br /&gt;
alert(numero); // numero = 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els operadors d'increment i decremento no solament es poden indicar com a prefix del nom de la variable, sinó que també és possible utilitzar-los com a sufix. En aquest cas, el seu comportament és similar però molt diferent. En el següent exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
numero++;&lt;br /&gt;
alert(numero); // numero = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El resultat d'executar el script anterior és el mateix que quan s'utilitza l'operador ++numero, per la qual cosa pot semblar que és equivalent indicar l'operador ++ davant o darrere de l'identificador de la variable. No obstant això, el següent exemple mostra les seves diferències:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
var numero2 = 2;&lt;br /&gt;
numero3 = numero1++ + numero2;&lt;br /&gt;
// numero3 = 7, numero1 = 6&lt;br /&gt;
&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
var numero2 = 2;&lt;br /&gt;
numero3 = ++numero1 + numero2;&lt;br /&gt;
// numero3 = 8, numero1 = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si l'operador ++ s'indica com a prefix de l'identificador de la variable, el seu valor s'incrementa abans de realitzar qualsevol altra operació. Si l'operador ++ s'indica com a sufix de l'identificador de la variable, el seu valor s'incrementa després d'executar la sentència en la qual apareix.&lt;br /&gt;
&lt;br /&gt;
Per tant, en la instrucció numero3 = numero1++ + numero2;, el valor de numero1 s'incrementa després de realitzar l'operació (primer se sumeixi i numero3 val 7, després s'incrementa el valor de numero1 i val 6). No obstant això, en la instrucció numero3 = ++numero1 + numero2;, en primer lloc s'incrementa el valor de numero1 i després es realitza la summa (primer s'incrementa numero1 i val 6, després es realitza la summa i numero3 val 8).&lt;br /&gt;
&lt;br /&gt;
==== Lògics ====&lt;br /&gt;
Els operadors lògics són imprescindibles per realitzar aplicacions complexes, ja que s'utilitzen per prendre decisions sobre les instruccions que hauria d'executar el programa en funció de certes condicions.&lt;br /&gt;
&lt;br /&gt;
El resultat de qualsevol operació que utilitzi operadors lògics sempre és un valor lògic o booleà.&lt;br /&gt;
&lt;br /&gt;
===== Negació =====&lt;br /&gt;
Un dels operadors lògics més utilitzats és el de la negació. S'utilitza per obtenir el valor contrari al valor de la variable:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var visible = true;&lt;br /&gt;
alert(!visible); // Mostra &amp;quot;false&amp;quot; i no &amp;quot;true&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La negació lògica s'obté prefixant el símbol ! a l'identificador de la variable. El funcionament d'aquest operador es resumeix en la següent taula:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
variable	!variable&lt;br /&gt;
true    	false&lt;br /&gt;
false	        true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si la variable original és de tipus booleà, és molt senzill obtenir la seva negació. No obstant això, què succeeix quan la variable és un nombre o una cadena de text? Per obtenir la negació en aquest tipus de variables, es realitza en primer lloc la seva conversió a un valor booleà:&lt;br /&gt;
&lt;br /&gt;
Si la variable conté un nombre, es transforma en false si val 0 i en true per a qualsevol altre nombre (positiu o negatiu, decimal o sencer).&lt;br /&gt;
Si la variable conté una cadena de text, es transforma en false si la cadena és buida (&amp;quot;&amp;quot;) i en true en qualsevol altre cas.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quantitat = 0;&lt;br /&gt;
buit = !quantitat; // buit = true&lt;br /&gt;
&lt;br /&gt;
quantitat = 2;&lt;br /&gt;
buit = !quantitat; // buit = false&lt;br /&gt;
&lt;br /&gt;
var missatge = &amp;quot;&amp;quot;;&lt;br /&gt;
missatgebuit = !missatge; // missatgebuit = true&lt;br /&gt;
&lt;br /&gt;
missatge = &amp;quot;Benvingut&amp;quot;;&lt;br /&gt;
missatgebuit = !missatge; // missatgebuit = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== AND =====&lt;br /&gt;
L'operació lògica AND obté el seu resultat combinant dos valors booleans. L'operador s'indica mitjançant el símbol &amp;amp;&amp;amp; i el seu resultat solament és true si els dos operands són true:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
variable1	variable2	variable1 &amp;amp;&amp;amp; variable2&lt;br /&gt;
  true	           true	                 true&lt;br /&gt;
  true	           false	         false&lt;br /&gt;
  false	           true	                 false&lt;br /&gt;
  false	           false	         false&lt;br /&gt;
&lt;br /&gt;
var valor1 = true;&lt;br /&gt;
var valor2 = false;&lt;br /&gt;
resultat = valor1 &amp;amp;&amp;amp; valor2; // resultat = false&lt;br /&gt;
&lt;br /&gt;
valor1 = true;&lt;br /&gt;
valor2 = true;&lt;br /&gt;
resultat = valor1 &amp;amp;&amp;amp; valor2; // resultat = true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== OR =====&lt;br /&gt;
L'operació lògica OR també combina dos valors booleans. L'operador s'indica mitjançant el símbol || i el seu resultat és true si algun dels dos operands és true:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
variable1	variable2	variable1 || variable2&lt;br /&gt;
  true	           true	                 true&lt;br /&gt;
  true	           false	         true&lt;br /&gt;
  false	           true	                 true&lt;br /&gt;
  false	           false	         false&lt;br /&gt;
&lt;br /&gt;
var valor1 = true;&lt;br /&gt;
var valor2 = false;&lt;br /&gt;
resultat = valor1 || valor2; // resultat = true&lt;br /&gt;
&lt;br /&gt;
valor1 = false;&lt;br /&gt;
valor2 = false;&lt;br /&gt;
resultat = valor1 || valor2; // resultat = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Matemàtics ====&lt;br /&gt;
Javascript permet realitzar manipulacions matemàtiques sobre el valor de les variables numèriques. Els operadors definits són: suma (+), resta (-), multiplicació (*) i divisió (/). Exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 10;&lt;br /&gt;
var numero2 = 5;&lt;br /&gt;
&lt;br /&gt;
resultat = numero1 / numero2; // resultat = 2&lt;br /&gt;
resultat = 3 + numero1; // resultat = 13&lt;br /&gt;
resultat = numero2 – 4; // resultat = 1&lt;br /&gt;
resultat = numero1 * numero 2; // resultat = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A més dels quatre operadors bàsics, Javascript defineix un altre operador matemàtic que no és senzill d'entendre quan s'estudia per primera vegada, però que és molt útil en algunes ocasions.&lt;br /&gt;
&lt;br /&gt;
Es tracta de l'operador &amp;quot;mòdul&amp;quot;, que calcula la resta de la divisió sencera de dos nombres. Si es divideix per exemple 10 i 5, la divisió és exacta i dóna un resultat de 2. La resta d'aquesta divisió és 0, per la qual cosa mòdul de 10 i 5 és igual a 0.&lt;br /&gt;
&lt;br /&gt;
No obstant això, si es divideix 9 i 5, la divisió no és exacta, el resultat és 1 i la resta 4, per la qual cosa mòdul de 9 i 5 és igual a 4.&lt;br /&gt;
&lt;br /&gt;
L'operador mòdul en Javascript s'indica mitjançant el símbol %, que no ha de confondre's amb el càlcul del percentatge:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 10;&lt;br /&gt;
var numero2 = 5;&lt;br /&gt;
resultat = numero1 % numero2; // resultat = 0&lt;br /&gt;
&lt;br /&gt;
numero1 = 9;&lt;br /&gt;
numero2 = 5;&lt;br /&gt;
resultat = numero1 % numero2; // resultat = 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els operadors matemàtics també es poden combinar amb l'operador d'assignació per abreujar la seva notació:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
numero1 += 3; // numero1 = numero1 + 3 = 8&lt;br /&gt;
numero1 -= 1; // numero1 = numero1 - 1 = 4&lt;br /&gt;
numero1 *= 2; // numero1 = numero1 * 2 = 10&lt;br /&gt;
numero1 /= 5; // numero1 = numero1 / 5 = 1&lt;br /&gt;
numero1 %= 4; // numero1 = numero1 % 4 = 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Relacionals ====&lt;br /&gt;
Els operadors relacionals definits per Javascript són idèntics als quals defineixen les matemàtiques: major que (&amp;gt;), menor que (&amp;lt;), major o igual (&amp;gt;=), menor o igual (&amp;lt;=), igual que (==) i diferent de (!=).&lt;br /&gt;
&lt;br /&gt;
Els operadors que relacionen variables són imprescindibles per realitzar qualsevol aplicació complexa, com es veurà en el següent capítol de programació avançada. El resultat de tots aquests operadors sempre és un valor booleà:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 3;&lt;br /&gt;
var numero2 = 5;&lt;br /&gt;
resultat = numero1 &amp;gt; numero2; // resultat = false&lt;br /&gt;
resultat = numero1 &amp;lt; numero2; // resultat = true&lt;br /&gt;
&lt;br /&gt;
numero1 = 5;&lt;br /&gt;
numero2 = 5;&lt;br /&gt;
resultat = numero1 &amp;gt;= numero2; // resultat = true&lt;br /&gt;
resultat = numero1 &amp;lt;= numero2; // resultat = true&lt;br /&gt;
resultat = numero1 == numero2; // resultat = true&lt;br /&gt;
resultat = numero1 != numero2; // resultat = false&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
S'ha de tenir especial cura amb l'operador d'igualtat (==), ja que és l'origen de la majoria d'errors de programació, fins i tot per als usuaris que ja tenen certa experiència desenvolupant scripts. L'operador == s'utilitza per comparar el valor de dues variables, per la qual cosa és molt diferent de l'operador =, que s'utilitza per assignar un valor a una variable:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// L'operador &amp;quot;=&amp;quot; assigna valors&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
resultat = numero1 = 3; // numero1 = 3 i resultat = 3&lt;br /&gt;
&lt;br /&gt;
// L'operador &amp;quot;==&amp;quot; compara variables&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
resultat = numero1 == 3; // numero1 = 5 i resultat = *false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els operadors relacionals també es poden utilitzar amb variables de tipus cadena de text:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var text1 = &amp;quot;hola&amp;quot;;&lt;br /&gt;
var text2 = &amp;quot;hola&amp;quot;;&lt;br /&gt;
var text3 = &amp;quot;*adios&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
resultat = text1 == text3; // resultat = false&lt;br /&gt;
resultat = text1 != text2; // resultat = false&lt;br /&gt;
resultat = text3 &amp;gt;= text2; // resultat = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Quan s'utilitzen cadenes de text, els operadors &amp;quot;major que&amp;quot; (&amp;gt;) i &amp;quot;menor que&amp;quot; (&amp;lt;) segueixen un raonament no intuïtiu: es compara lletra a lletra començant des de l'esquerra fins que es trobi una diferència entre les dues cadenes de text. Per determinar si una lletra és major o menor que una altra, les majúscules es consideren menors que les minúscules i les primeres lletres de l'alfabet són menors que les últimes (a és menor que b, b és menor que c, A és menor que a, etc.)&lt;br /&gt;
=== Àmbit de les Varibles ===&lt;br /&gt;
Un altre aspecte a tenir en compte a l'hora d'usar les variables és el seu àmbit, és a dir, quines funcions tenen accés a elles. Si es crea una ''variable dins d'una funció'' només serà coneguda dins d'aquesta funció, es tracta de ''variables locals''. Si es necessita que diverses funcions tinguin accés a una determinada variable aquesta ha de crear-se com a variable global, això es fa creant-la fora de totes les funcions. Per exemple en el següent script tenim variables globals i locals:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script language=&amp;quot;Javascript&amp;quot;&amp;gt;&lt;br /&gt;
     var navegador_versio = 0;&lt;br /&gt;
     function veureNavegador()&lt;br /&gt;
     {&lt;br /&gt;
          var versio;&lt;br /&gt;
          versio = document.appVersion;&lt;br /&gt;
          return versio;&lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En aquest exemple ''navegador_versio'' és una variable global i ''versió'' és una variable local que només existeix dintre de la funciò ''veureNavegador''.&lt;br /&gt;
Què succeeix si una funció defineix una variable local amb el mateix nom que una variable global que ja existeix? En aquest cas, l''es variables locals prevalen sobre les globals, però només dins de la funció'':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var missatge = &amp;quot;guanya la de fora&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    function mostraMissatge() {&lt;br /&gt;
        var missatge = &amp;quot;guanya la de dins&amp;quot;;&lt;br /&gt;
        alert(missatge);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
    mostraMissatge();&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Què succeeix si dins d'una funció es defineix una variable global amb el mateix nom que una altra variable global que ja existeix? En aquest altre cas, la variable global definida dins de la funció simplement modifica el valor de la variable global definida anteriorment:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var missatge = &amp;quot;guanya la de fora&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    function mostraMissatge() {&lt;br /&gt;
        missatge = &amp;quot;guanya la de dins&amp;quot;;&lt;br /&gt;
        alert(missatge);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
    mostraMissatge();&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La diferencia dels dos exemples anteriors ve donat per la definició d'una variable anomenada igual que una altre global. En el primer exemple s'utilitza la paraula reservada '''var''' i en el últim exemple NO s'utilitza. El fet de NO utilitzar la paraula reservada '''var''' s'interpreta com que es vol utilitzar la variable global definida abans de la funció.&lt;br /&gt;
&lt;br /&gt;
Resumint, la recomanació general és definir com a variables locals totes les variables que siguin d'ús exclusiu per realitzar les tasques encarregades a cada funció. Les variables globals s'utilitzen per compartir dades entre funcions de forma senzilla.&lt;br /&gt;
&lt;br /&gt;
== Estructures de control de Flux ==&lt;br /&gt;
&lt;br /&gt;
=== Estructura IF ===&lt;br /&gt;
L'estructura més utilitzada en Javascript i en la majoria de llenguatges de programació és l'estructura if. S'empra per prendre decisions en funció d'una condició. La seva definició formal és:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if(condicion) {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si la condició es compleix (és a dir, si el seu valor és true) s'executen totes les instruccions que es troben dins de {...}. Si la condició no es compleix (és a dir, si el seu valor és false) no s'executa cap instrucció continguda en {...} i el programa continua executant la resta d'instruccions del script.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var mostrado = false;&lt;br /&gt;
var usuarioPermiteMensajes = true;&lt;br /&gt;
 &lt;br /&gt;
if(!mostrado &amp;amp;&amp;amp; usuarioPermiteMensajes) {&lt;br /&gt;
  alert(&amp;quot;Es la primera vez que se muestra el mensaje&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Estructura IF....ELSE ===&lt;br /&gt;
Normalment les condicions solen ser del tipus &amp;quot;si es compleix aquesta condició, fes-ho; si no es compleix, fes això un altre&amp;quot;. Existeix una variant de l'estructura if trucada if...else. La seva definició formal és la següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if(condicion) {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La estructura if...else es pot encadenar per realitzar diverses comprovacions seguides:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if(edad &amp;lt; 12) {&lt;br /&gt;
  alert(&amp;quot;Todavía eres muy pequeño&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if(edad &amp;lt; 19) {&lt;br /&gt;
  alert(&amp;quot;Eres un adolescente&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if(edad &amp;lt; 35) {&lt;br /&gt;
  alert(&amp;quot;Aun sigues siendo joven&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
  alert(&amp;quot;Piensa en cuidarte un poco más&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selecció Múltiple ===&lt;br /&gt;
Poden existir casos en els quals el programa hagi de tenir mes de dues alternatives, per exemple si volem un programa que mostri un títol en un idioma de quatre possibles. Això pot solucionar-se mitjançant diversos if. Hem de triar entre idiomes: castellà, engonals, francès i alemany.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (leng == &amp;quot;ESPANYOL&amp;quot;)&lt;br /&gt;
       pagCast();&lt;br /&gt;
else&lt;br /&gt;
       if (leng == &amp;quot;ANGLES&amp;quot;)&lt;br /&gt;
              pagIng();&lt;br /&gt;
       else&lt;br /&gt;
             if (leng == &amp;quot;FRANCES&amp;quot;)&lt;br /&gt;
                    pagFran();&lt;br /&gt;
             else&lt;br /&gt;
                   if (leng == &amp;quot;CATALA&amp;quot;)&lt;br /&gt;
                          pagCat();&lt;br /&gt;
                   else&lt;br /&gt;
                            error('idioma desconegut');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per a aquests casos disposem de la sentència switch...casi...default, de selecció múltiple. L'exemple anterior quedaria:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
switch (idioma) {&lt;br /&gt;
    case 'espanyol' :&lt;br /&gt;
          pagCast();&lt;br /&gt;
          break;&lt;br /&gt;
    case 'ingles' :&lt;br /&gt;
          pagIng();&lt;br /&gt;
          break;&lt;br /&gt;
    case 'frances' :&lt;br /&gt;
          pagFran();&lt;br /&gt;
          break;&lt;br /&gt;
    case 'catala' :&lt;br /&gt;
          pagCat();&lt;br /&gt;
          break;&lt;br /&gt;
    default :&lt;br /&gt;
          error ('Idioma desconegut');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La instrucció ''break'' posa fi al bloc i fa que el programa salti a la instrucció següent a la sentència ''switch''(), si s'omet el programa continuaria amb la següent comparació. La secció del ''default'' és opcional, la seva finalitat és executar algun codi quan cap de les condicions es compleixi.&lt;br /&gt;
&lt;br /&gt;
=== Estructura WHILE ===&lt;br /&gt;
En aquesta estructura el programa primer comprova la condició: si és certa pansa a executar el cos del bucle, i si és falsa pansa a la instrucció següent a la sentència while.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
while(condició){&lt;br /&gt;
....&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var resultat = 0;&lt;br /&gt;
var numero = 100;&lt;br /&gt;
var i = 0;&lt;br /&gt;
 &lt;br /&gt;
while(i &amp;lt;= numero) {&lt;br /&gt;
  resultat += i;&lt;br /&gt;
  i++;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
alert(resultat);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El programa ha de sumar tots els nombres menors o igual que un altre donat. Per exemple si el nombre és 5, s'ha de calcular: 1 + 2 + 3 + 4 + 5 = 15&lt;br /&gt;
&lt;br /&gt;
=== Estructura DO...WHILE ===&lt;br /&gt;
Es tracta d'un bucle en el qual la condició es comprova després de la primera iteració, és a dir que el cos del bucle s'executa almenys una vegada. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  ...&lt;br /&gt;
} while(condició);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Utilitzant aquest bucle es pot calcular fàcilment el factorial d'un numero:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var resultat = 1;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
 &lt;br /&gt;
do {&lt;br /&gt;
  resultat *= numero;  // resultat = resultat * numero&lt;br /&gt;
  numero--;&lt;br /&gt;
} while(numero &amp;gt; 0);&lt;br /&gt;
 &lt;br /&gt;
alert(resultat);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Estructura FOR ===&lt;br /&gt;
L'estructura for permet realitzar repeticions (també anomenades bucles) d'instruccions d'una forma molt senzilla. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for(inicializació; condició; actualizació) {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La idea del funcionament d'un bucle for és la següent: &amp;quot;mentre la condició indicada se segueixi complint, repeteix l'execució de les instruccions definides dins del for. A més, després de cada repetició, actualitza el valor de les variables que s'utilitzen en la condició&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* La &amp;quot;inicialització&amp;quot; és la zona en la qual s'estableix els valors inicials de les variables que controlen la repetició.&lt;br /&gt;
* La &amp;quot;condició&amp;quot; és l'únic element que decideix si contínua o es deté la repetició.&lt;br /&gt;
* La &amp;quot;actualització&amp;quot; és el nou valor que s'assigna després de cada repetició a les variables que controlen la repetició.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola, estic dintre d'un bucle&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
for(var i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
  alert(missatge);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Un altre exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dies = [&amp;quot;Dilluns&amp;quot;, &amp;quot;Dimarts&amp;quot;, &amp;quot;Dimecres&amp;quot;, &amp;quot;Dijous&amp;quot;, &amp;quot;Divendres&amp;quot;, &amp;quot;Dissabte&amp;quot;, &amp;quot;Diumenge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
for(var i=0; i&amp;lt;7; i++) {&lt;br /&gt;
  alert(dies[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Estructura For...IN ===&lt;br /&gt;
La seva definició exacta implica l'ús d'objectes, que és un element de programació que encara no anem a estudiar. Per tant, solament es va a presentar l'estructura for...in adaptada al seu ús en arrays. La seva definició formal adaptada als arrays és:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for(indice in array) {&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dies = [&amp;quot;Dilluns&amp;quot;, &amp;quot;Dimarts&amp;quot;, &amp;quot;Dimecres&amp;quot;, &amp;quot;Dijous&amp;quot;, &amp;quot;Divendres&amp;quot;, &amp;quot;Dissabte&amp;quot;, &amp;quot;Diumenge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
for(i in dies) {&lt;br /&gt;
  alert(dies[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Funcions útils del llenguatge ==&lt;br /&gt;
=== Funcions de cadenes de text ===&lt;br /&gt;
&lt;br /&gt;
'''length''', calcula la longitud d'una cadena de text (el nombre de caràcters que la formen)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var numeroLetras = missatge.length; // numeroLetras = 10&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''+''', s'empra per concatenar diverses cadenes de text&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = &amp;quot; Món&amp;quot;;&lt;br /&gt;
var missatge = missatge1 + missatge2; // missatge = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A més de l'operador +, també es pot utilitzar la funció '''concat()'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = missatge1.concat(&amp;quot; Món&amp;quot;); // missatge2 = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les cadenes de text també es poden unir amb variables numèriques:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var variable1 = &amp;quot;Hola &amp;quot;;&lt;br /&gt;
var variable2 = 3;&lt;br /&gt;
var missatge = variable1 + variable2; // missatge = &amp;quot;Hola 3&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Quan s'uneixen diverses cadenes de text és habitual oblidar afegir un espai de separació entre les paraules:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = &amp;quot;Món&amp;quot;;&lt;br /&gt;
var missatge = missatge1 + missatge2; // missatge = &amp;quot;HolaMón&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els espais en blanc es poden afegir al final o al principi de les cadenes i també es poden indicar forma explícita:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = &amp;quot;Món&amp;quot;;&lt;br /&gt;
var missatge = missatge1 + &amp;quot; &amp;quot; + missatge2; // missatge = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''toUpperCase()''', transforma tots els caràcters de la cadena als seus corresponents caràcters en majúscules:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = missatge1.toUpperCase(); // missatge2 = &amp;quot;HOLA&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''toLowerCase()''', transforma tots els caràcters de la cadena als seus corresponents caràcters en minúscules:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;HOLA&amp;quot;;&lt;br /&gt;
var missatge2 = missatge1.toLowerCase(); // missatge2 = &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''charAt(posició)''', obté el caràcter que es troba en la posició indicada:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var lletra = missatge.charAt(0); // lletra = H&lt;br /&gt;
lletra = missatge.charAt(2); // lletra = l&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''indexOf(caracter)''', calcula la posició en la qual es troba el caràcter indicat dins de la cadena de text. Si el caràcter s'inclou diverses vegades dins de la cadena de text, es retorna la seva primera posició començant a buscar des de l'esquerra. Si la cadena no conté el caràcter, la funció retorna el valor -1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var posicion = missatge.indexOf('a'); // posicion = 3&lt;br /&gt;
posicion = missatge.indexOf('b'); // posicion = -1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La seva funció anàloga és lastIndexOf():&lt;br /&gt;
&lt;br /&gt;
'''lastIndexOf(caracter'''), calcula l'última posició en la qual es troba el caràcter indicat dins de la cadena de text. Si la cadena no conté el caràcter, la funció retorna el valor -1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var posicion = missatge.lastIndexOf('a'); // posicion = 3&lt;br /&gt;
posicion = missatge.lastIndexOf('b'); // posicion = -1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La funció lastIndexOf() comença la seva cerca des del final de la cadena cap al principi, encara que la posició retornada és la correcta començant a explicar des del principi de la paraula.&lt;br /&gt;
&lt;br /&gt;
'''substring(inici, final)''', extreu una porció d'una cadena de text. El segon paràmetre és opcional. Si només s'indica el paràmetre inicio, la funció retorna la part de la cadena original corresponent des d'aquesta posició fins al final:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(2); // porcion = &amp;quot;la Món&amp;quot;&lt;br /&gt;
porcion = missatge.substring(5); // porcion = &amp;quot;Món&amp;quot;&lt;br /&gt;
porcion = missatge.substring(7); // porcion = &amp;quot;ndo&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si s'indica un inici negatiu, es retorna la mateixa cadena original:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(-2); // porcion = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Quan s'indica l'inici i el final, es retorna la part de la cadena original compresa entre la posició inicial i la immediatament anterior a la posició final (és a dir, la posició inicio està inclosa i la posició final no):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(1, 8); // porcion = &amp;quot;ona Mun&amp;quot;&lt;br /&gt;
porcion = missatge.substring(3, 4); // porcion = &amp;quot;a&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si s'indica un final més petit que l'inici, Javascript els considera de forma inversa, ja que automàticament assigna el valor més petit a l'inici i el més gran al final:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(5, 0); // porcion = &amp;quot;Hola &amp;quot;&lt;br /&gt;
porcion = missatge.substring(0, 5); // porcion = &amp;quot;Hola &amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''split(separador'''), converteix una cadena de text en un array de cadenes de text. La funció parteix la cadena de text determinant els seus trossos a partir del caràcter separador indicat:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món, sóc una cadena de text!&amp;quot;;&lt;br /&gt;
var paraules = missatge.split(&amp;quot; &amp;quot;);&lt;br /&gt;
// paraules = [&amp;quot;Hola&amp;quot;, &amp;quot;Món,&amp;quot;, &amp;quot;sóc&amp;quot;, &amp;quot;una&amp;quot;, &amp;quot;cadena&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;text!&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Amb aquesta funció es poden extreure fàcilment les lletres que formen una paraula:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var paraula = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var lletres = paraula.split(&amp;quot;&amp;quot;); // lletres = [&amp;quot;H&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;a&amp;quot;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Funcions d'arrays ===&lt;br /&gt;
'''length''', calcula el nombre d'elements d'un array&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var vocals = [&amp;quot;a&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;o&amp;quot;];&lt;br /&gt;
var numeroVocales = vocals.length; // numeroVocales = 5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''concat()''', s'empra per concatenar els elements de diversos arrays&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array1 = [1, 2, 3];&lt;br /&gt;
array2 = array1.concat(4, 5, 6); // array2 = [1, 2, 3, 4, 5, 6]&lt;br /&gt;
array3 = array1.concat([4, 5, 6]); // array3 = [1, 2, 3, 4, 5, 6]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''join(separador)''', és la funció contrària a split(). Uneix tots els elements d'un array per formar una cadena de text. Per unir els elements s'utilitza el caràcter separador indicat&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [&amp;quot;hola&amp;quot;, &amp;quot;món&amp;quot;];&lt;br /&gt;
var missatge = array.join(&amp;quot;&amp;quot;); // missatge = &amp;quot;holamundo&amp;quot;&lt;br /&gt;
missatge = array.join(&amp;quot; &amp;quot;); // missatge = &amp;quot;hola món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''pop()''', elimina l'últim element del array i ho retorna. El array original es modifica i la seva longitud disminueix en 1 element.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
var ultimo = array.pop();&lt;br /&gt;
// ara array = [1, 2], ultimo = 3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''push()''', afegeix un element al final del array. El array original es modifica i augmenta la seva longitud en 1 element. (També és possible afegir més d'un element alhora)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
array.push(4);&lt;br /&gt;
// ara array = [1, 2, 3, 4]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''shift()''', elimina el primer element del array i ho retorna. El array original es veu modificat i la seva longitud disminuïda en 1 element.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
var primer = array.shift();&lt;br /&gt;
// ara array = [2, 3], primer = 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''unshift()''', afegeix un element al principi del array. El array original es modifica i augmenta la seva longitud en 1 element. (També és possible afegir més d'un element alhora)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
array.unshift(0);&lt;br /&gt;
// ara array = [0, 1, 2, 3]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''reverse()''', modifica un array col·locant els seus elements en l'ordre invers a la seva posició original:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
array.reverse();&lt;br /&gt;
// ara array = [3, 2, 1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''sort()''', ordena els elements del array, tan numèrics com alfabètics.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [4, 2, 1, 3];&lt;br /&gt;
array.sort();&lt;br /&gt;
// ara array = [1, 2, 3, 4]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''splice()''', afegeix i elimina elements.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;Inici&amp;lt;/i&amp;gt; es la posició on començarà a afegir o eliminar.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;Eliminats&amp;lt;/i&amp;gt; es el nombre d'elements que es volven borrar. Si posem un 0, solament afegirà valors.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;Valor1, valor2, …, valorN&amp;lt;/i&amp;gt; son els valor que volem afegir.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3, 4, 5];&lt;br /&gt;
array.splice(1,3);&lt;br /&gt;
// ara array = [1, 5], elimina a partir de la posició 1, tres elements.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array =[1, 2, 3, 4, 5];&lt;br /&gt;
array.splice(2, 0, 2.5);&lt;br /&gt;
//ara el array = [1, 2, 2.5, 3, 4, 5]&lt;br /&gt;
//afegeix a partir de la posició dos el element 2.5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array= [1, 2, 3, 4, 5, 6];&lt;br /&gt;
array.splice(2, 3);&lt;br /&gt;
//Eliminem, a partir del segon element (no inclos) 3 elements&lt;br /&gt;
//ara el array = [1, 2, 6]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3, 4, 5];&lt;br /&gt;
array.splice(1, 3, &amp;quot;two&amp;quot;, &amp;quot;three&amp;quot;, &amp;quot;four&amp;quot;);&lt;br /&gt;
//Eliminem tres elements a partir del primer element, y afegim 3 més&lt;br /&gt;
//ara el array = [1, &amp;quot;two&amp;quot;, &amp;quot;three&amp;quot;, &amp;quot;four&amp;quot;, 5]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Funcions de nombres ===&lt;br /&gt;
'''NaN''', (de l'anglès, &amp;quot;Not a Number&amp;quot;) Javascript empra el valor NaN per indicar un valor numèric no definit (per exemple, la divisió 0/0).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 0;&lt;br /&gt;
var numero2 = 0;&lt;br /&gt;
alert(numero1/numero2); // es mostra el valor NaN&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''isNaN()''', permet protegir a l'aplicació de possibles valors numèrics no definits&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 0;&lt;br /&gt;
var numero2 = 0;&lt;br /&gt;
if(isNaN(numero1/numero2)) {&lt;br /&gt;
alert(&amp;quot;La divisió no està definida per als nombres indicats&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
alert(&amp;quot;La divisió és igual a =&amp;gt; &amp;quot; + numero1/numero2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''Infinity''', fa referència a un valor numèric infinit i positiu (també existeix el valor –Infinity per als infinits negatius)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 10;&lt;br /&gt;
var numero2 = 0;&lt;br /&gt;
alert(numero1/numero2); // es mostra el valor Infinity&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''toFixed(digits)''', retorna el nombre original amb punts decimals com els indicats pel paràmetre digits i realitza els arrodoniments necessaris. Es tracta d'una funció molt útil per exemple per mostrar preus.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 4564.34567;&lt;br /&gt;
numero1.toFixed(2); // 4564.35&lt;br /&gt;
numero1.toFixed(6); // 4564.345670&lt;br /&gt;
numero1.toFixed(); // 4564&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conversió de tipus ===&lt;br /&gt;
No és capaç de convertir un string en nombre (tret que el string sigui solament un nombre). Per a això existeixen dues funcions preconstruidas en Javascript que ens permeten convertir un string en nombre enter o decimal, amb dues limitacions:&lt;br /&gt;
Ha d'aparèixer com string el nombre (sencer o decimal) que volem convertir.&lt;br /&gt;
Ha d'aparèixer al principi del string.&lt;br /&gt;
'''parseInt(String)''' --&amp;gt; converteix a integer&lt;br /&gt;
'''parseFloat(String)''' --&amp;gt; Converteix a Float&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parseInt(&amp;quot;4.33333&amp;quot;); --&amp;gt; 4&lt;br /&gt;
parseFloat(&amp;quot;4.333&amp;quot;); --&amp;gt; 4.333&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
=== Exercici : Arrays ===&lt;br /&gt;
Crear un array anomenat mesos i que emmagatzemi el nom dels dotze mesos de l'any. Mostrar per pantalla els dotze noms utilitzant la funció alert().&lt;br /&gt;
&lt;br /&gt;
:[[Solució Exercici Arrays]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici : Operadors ===&lt;br /&gt;
A partir del següent array que es proporciona: &lt;br /&gt;
&amp;lt;pre&amp;gt;var valors = [true, 5, false, &amp;quot;hola&amp;quot;, &amp;quot;adios&amp;quot;, 2];&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Determinar quin dels dos elements de text és major&lt;br /&gt;
* Utilitzant exclusivament els dos valors booleans del array, determinar els operadors necessaris per obtenir un resultat true i un altre resultat false&lt;br /&gt;
* Determinar el resultat de les cinc operacions matemàtiques realitzades amb els dos elements numèrics&lt;br /&gt;
&lt;br /&gt;
:[[Solució Exercici Operadors]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici DNI ===&lt;br /&gt;
El càlcul de la lletra del Document Nacional d'Identitat (DNI) és un procés matemàtic senzill que es basa a obtenir la resta de la divisió sencera del nombre de DNI i el número 23. A partir de la resta de la divisió, s'obté la lletra seleccionant-la dins d'un array de lletres.&lt;br /&gt;
El array de lletres és:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var lletres = ['T', 'R', 'W', 'A', 'G', 'M', 'I', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'I', 'T'];&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per tant si la resta de la divisió és 0, la lletra del DNI és la T i si la resta és 3 la lletra és l'A. Amb aquestes dades, elaborar un petit script que:&lt;br /&gt;
* Emmagatzemi en una variable el nombre de DNI indicat per l'usuari i en una altra variable la lletra del DNI que s'ha indicat. (Pista: si es vol demanar directament a l'usuari que indiqui el seu nombre i la seva lletra, es pot utilitzar la funció prompt())&lt;br /&gt;
* En primer lloc (i en una sola instrucció) s'ha de comprovar si el nombre és menor que 0 o major que 99999999. Si aquest és el cas, es mostra un missatge a l'usuari indicant que el nombre proporcionat no és vàlid i el programa no mostra més missatges.&lt;br /&gt;
* Si el nombre és vàlid, es calcula la lletra que li correspon segons el mètode explicat anteriorment.&lt;br /&gt;
* Una vegada calculada la lletra, s'ha de comparar amb la lletra indicada per l'usuari. Si no coincideixen, es mostra un missatge a l'usuari dient-li que la lletra que ha indicat no és correcta. En un altre cas, es mostra un missatge indicant que el nombre i la lletra de DNI són correctes.&lt;br /&gt;
&lt;br /&gt;
:[[Solució DNI]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Factorial ===&lt;br /&gt;
El factorial d'un nombre enter n és una operació matemàtica que consisteix a multiplicar tots els factors n x (n-1) x (n-2) x ... x 1. Així, el factorial de 5 (escrit com 5!) és igual a: 5! = 5 x 4 x 3 x 2 x 1 = 120&lt;br /&gt;
Utilitzant l'estructura for, crear un script que calculi el factorial d'un nombre enter.&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
:[[Solució Factorial]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Exercici de Cadenes ===&lt;br /&gt;
Escriure funcions que donades dues cadenes de caràcters:&lt;br /&gt;
a) Indiqui si la segona cadena és una subcadena de la primera. Per exemple, ’cadena’ és una&lt;br /&gt;
subcadena de ’subcadena’.&lt;br /&gt;
b) Retorni la que sigui anterior en ordre alfábetico. Per exemple, si rep ’kde’ i ’gnome’&lt;br /&gt;
ha de retornar ’gnome’.&lt;br /&gt;
&lt;br /&gt;
:[[Solució cadenes]]&lt;br /&gt;
&lt;br /&gt;
=== Joc d'adivinació ===&lt;br /&gt;
Considerem el següent joc entre els jugadors A (endeví) y P (pensador): P pensa un nombre entre 1 y 1000. A intenta adivinar-ho mitjançant aproximacions fins que adivina el número. &lt;br /&gt;
Suposem que la màquina interpreta el paper d'endeví i l'usuari ha de pensar el número. El pensador només pot donar 3 tipus de respostes per cada nombre proposat per l'endeví:&lt;br /&gt;
* &amp;quot;MAJOR&amp;quot; : vol dir que el numero proposat pel l'endeví és major que el que ha pensat.&lt;br /&gt;
* &amp;quot;MENOR&amp;quot; : vol dir que el numero proposat pel l'endeví és menor que el que ha pensat.&lt;br /&gt;
* &amp;quot;OK&amp;quot; : vol dir que ha adivinat el número. &lt;br /&gt;
&lt;br /&gt;
:[[Solució Joc d'adivinació]]&lt;br /&gt;
&lt;br /&gt;
=== Palíndrom ===&lt;br /&gt;
Volem sapiguer si una determinada paraula o frase és un [http://es.wikipedia.org/wiki/Pal%C3%ADndromo palíndrom]. Escriu un programa que demani una text i aquest indiqui si és o no palíndrom.&lt;br /&gt;
&lt;br /&gt;
:[[Solució Palíndrom]]&lt;br /&gt;
&lt;br /&gt;
=== Triangle bonic ===&lt;br /&gt;
Utilitzant bucles i amb els dígits {0...9} es poden dibuixar triangles com el següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         1 &lt;br /&gt;
        232&lt;br /&gt;
       34543&lt;br /&gt;
      4567654&lt;br /&gt;
     567898765&lt;br /&gt;
    67890109876&lt;br /&gt;
   7890123210987&lt;br /&gt;
  890123454321098&lt;br /&gt;
 90123456765432109&lt;br /&gt;
0123456789876543210&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
T'atreveixes?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:[[Solució Triangle bonic]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Xifrat Julio César ===&lt;br /&gt;
El dictador Julio César utilitzava un codi quan volia mantenir en secret un missatge. El xifrat consistia a substituir la primera lletra de l'alfabet, A, per la quarta, D, i així successivament amb les altres, és a dir, B, per la cinquena, I, la tercera, C, per la sisena, F ...&lt;br /&gt;
&lt;br /&gt;
L'alfabet llatí que utilitzava Julio César constava de 21 lletres, per tant la substitució de lletres per xifrar o desxifrar missatges queda descrita en la taula següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Alfabet original : A B C D E F G H I K L M N O P Q R S T V&lt;br /&gt;
Alfabet xifrat   : D E F G H I K L M N O P Q R S T V A B C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aquest tipus de xifrat és un codi de rotació, on la clau de rotació és 3.&lt;br /&gt;
&lt;br /&gt;
Escriu un programa que permeti xifrar o desxifrar utilitzant un codi de rotació. La clau del codi podrà triar-se.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[Solució Xifrat]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Password segur? ===&lt;br /&gt;
Volem saber si una contrasenya és segura. Per tal que sigui segura ha de complir les següents regles:&lt;br /&gt;
* Ha de contenir almenys una vocal.&lt;br /&gt;
* No ha de tenir tres vocals consecutives o tres consonants consecutives.&lt;br /&gt;
* No ha de tenir dues ocurrències consecutives de la mateixa lletra, excepte per ‘ee’ o ‘oo’.&lt;br /&gt;
* La longitud mínima és de 6 caràcters i la màxima de 10.&lt;br /&gt;
* Els espais en blanc no estan permesos&lt;br /&gt;
&lt;br /&gt;
:[[Solució Password segur?]]&lt;br /&gt;
&lt;br /&gt;
=== Separador de milers ===&lt;br /&gt;
Escriure una funció que rebi una cadena que conté un llarg nombre enter i retorni una cadena amb el nombre i les separacions de milers. Per exemple, si rep ’1234567890’, ha de retornar ’1.234.567.890’.&lt;br /&gt;
&lt;br /&gt;
:[[Solució Separador de milers]]&lt;br /&gt;
&lt;br /&gt;
=== Instruens Fabulam ===&lt;br /&gt;
Instruens Fabulam és la manera de dibuixar un quadre (o taula) en idioma Llatí. Això és el que has de fer per a aquest problema.&lt;br /&gt;
Cada descripció comença amb una línia d'encapçalat que conté un o més caràcters que defineixen el nombre i l'alineament de de les columnes de la taula. &lt;br /&gt;
Els caràcters de l'encapçalat són:&lt;br /&gt;
* ‘&amp;lt;’ justificació per esquerra&lt;br /&gt;
* ’=’ justificació per central&lt;br /&gt;
* ‘&amp;gt;’ justificació per dreta&lt;br /&gt;
Després de l'encapçalat hi ha almenys dos i com a màxim 21 línies de dades que contenen les entrades de cada fila.&lt;br /&gt;
Cada línia de dades consisteix en una o més entrades (no buides) separades per un ampersand (‘&amp;amp;’), on el nombre d'entrades és igual al nombre de columnes definides en l'encapçalat.&lt;br /&gt;
La primera línia conté els títols de les columnes, i les línies de dades restants contenen les entrades del cos de la taula. Els  espais poden aparèixer dins d'una entrada, però mai al principi ni al final de l'entrada. Els caràcters '&amp;lt;', '=', '&amp;gt;', '&amp;amp;', i 'comilles simples' no apareixeran en l'entrada excepte en els llocs indicats a dalt.&lt;br /&gt;
Per cada descripció de taula, desplegui la taula usant el format exacte mostrat en l'exemple. Noti que: &lt;br /&gt;
* L'ample total de la taula no excedirà els 79 caràcters (sense explicar la fi-de-línia).&lt;br /&gt;
* Els guions ('-') són usats per dibuixar línies horitzontals, no ('_'). El signe d'arrova ('@') apareix en cada cantonada. El signe de summa (‘+’) apareix en una intersecció entre la línia que separa el títol i el cos de la taula.&lt;br /&gt;
* Les entrades d'una columna estan separades pel caràcter (‘|’) per exactament un espai.&lt;br /&gt;
* Si una entrada centrada no està exactament centrada en una columna, l'espai extra ha d'anar a la dreta de l'entrada.&lt;br /&gt;
Exemples:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció Instruens Fabulam:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&lt;br /&gt;
What is the answer?&lt;br /&gt;
42&lt;br /&gt;
&lt;br /&gt;
Quadre:&lt;br /&gt;
@---------------------@&lt;br /&gt;
| What is the answer? |&lt;br /&gt;
|---------------------|&lt;br /&gt;
|                     |&lt;br /&gt;
|                   42|&lt;br /&gt;
@---------------------@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;gt;&lt;br /&gt;
Tweedledum&amp;amp;Tweedledee&lt;br /&gt;
&amp;quot;Knock, knock.&amp;quot;&amp;amp;&amp;quot;Who's there?&amp;quot;&lt;br /&gt;
&amp;quot;Boo.&amp;quot;&amp;amp;&amp;quot;Boo who?&amp;quot;&lt;br /&gt;
&amp;quot;Don't cry, it's only me.&amp;quot;&amp;amp;(groan)&lt;br /&gt;
&lt;br /&gt;
Quadre:&lt;br /&gt;
@---------------------------------------------@&lt;br /&gt;
| Tweedledum                 |     Tweedledee |&lt;br /&gt;
|----------------------------+----------------|&lt;br /&gt;
| &amp;quot;Knock, knock.&amp;quot;            | &amp;quot;Who's there?&amp;quot; |&lt;br /&gt;
| &amp;quot;Boo.&amp;quot;                     |     &amp;quot;Boo who?&amp;quot; |&lt;br /&gt;
| &amp;quot;Don't cry, it's only me.&amp;quot; |        (groan) |&lt;br /&gt;
@---------------------------------------------@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;gt;=&amp;gt;&lt;br /&gt;
TITLE&amp;amp;VERSION&amp;amp;OPERATING SYSTEM&amp;amp;PRICE&lt;br /&gt;
Slug Farm&amp;amp;2.0&amp;amp;FreeBSD&amp;amp;49.99&lt;br /&gt;
Figs of Doom&amp;amp;1.7&amp;amp;Linux&amp;amp;9.98&lt;br /&gt;
Smiley Goes to Happy Town&amp;amp;11.0&amp;amp;Windows&amp;amp;129.25&lt;br /&gt;
Wheelbarrow Motocross&amp;amp;1.0&amp;amp;BeOS&amp;amp;34.97&lt;br /&gt;
&lt;br /&gt;
Quadre:&lt;br /&gt;
@-----------------------------------------------------------------@&lt;br /&gt;
| TITLE                     |  VERSION| OPERATING SYSTEM |   PRICE|&lt;br /&gt;
|---------------------------+---------+------------------+--------|&lt;br /&gt;
| Slug Farm                 |     2.0 |          FreeBSD |  49.99 | &lt;br /&gt;
| Figs of Doom              |     1.7 |            Linux |   9.98 |&lt;br /&gt;
| Smiley Goes to Happy Town |    11.0 |          Windows | 129.25 |&lt;br /&gt;
| Wheelbarrow Motocross     |     1.0 |             BeOS |  34.97 |&lt;br /&gt;
@-----------------------------------------------------------------@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Nota''': Per emmagatzemar en una sola línea la Descripció pots utilitzar el simbol %: exemple: var d = &amp;quot;&amp;gt;%what is the answer?%42&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:[[Solució Instruens Fabulam]]&lt;br /&gt;
&lt;br /&gt;
== Exercicis per entregar ==&lt;br /&gt;
&lt;br /&gt;
=== Text al revés ===&lt;br /&gt;
Escriu un programa que posi al revés un text donat. S'ha de poder escollir si es vol caràcter a caràcter o paraula a paraula.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
text: &amp;quot;hola a tots&amp;quot;&lt;br /&gt;
caracter a caracter: &amp;quot;stot a aloh&amp;quot;&lt;br /&gt;
paraula a paraula : &amp;quot;tots a hola&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Nombres Romans ===&lt;br /&gt;
Escriu un programa que converteixi un enter positiu en un nombre romà. Assumeix que els nombres a convertir són menors a 3500. Les regles per construir un nombre romà són les que segueixen. En el sistema de nombres romans, i és el símbol per 1, v per 5, x per 10, l per 50, c per 100, d per 500 i m per 1000.&lt;br /&gt;
Les regles per formar numeros romans les tens [http://roble.pntic.mec.es/~msanto1/ortografia/numrom.htm aquí.]&lt;br /&gt;
Exemple: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
entrada : 1990&lt;br /&gt;
sortida : mcmxc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Retrat Robot ===&lt;br /&gt;
A causa de les dificultats de la policia per identificar als sospitosos, fa temps es va decidir substituir als dibuixants tradicionals per un programa que efectua el retrat robot a partir d'una descripció del delinqüent.&lt;br /&gt;
&lt;br /&gt;
El programa prototip requeria descripcions molt simples, on cada línia del dibuix es consigna indicant quantes vegades apareix cada caràcter.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció = &amp;quot;1 9W;1 1|2 1o1 1o2 1|;1@4 1U4 1@;1 1|2 3=2 1|;2 1\5_1/&amp;quot;&lt;br /&gt;
Dibuix:&lt;br /&gt;
 WWWWWWWWW&lt;br /&gt;
 |  O O  |&lt;br /&gt;
@    U    @&lt;br /&gt;
 |  ===  |&lt;br /&gt;
  \_____/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Escriu un programa que llegeixi una cadena de text on se separen pel caràcter ';' la descripció de cada línia del dibuix. El programa ha de donar com resultat el dibuix corresponent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Dibuixos amb asteriscos ===&lt;br /&gt;
&lt;br /&gt;
Escriu un programa que dibuixi per pantalla les següents figures:&lt;br /&gt;
*volcà : composta per línies de 2,4,8,16,32 i 64 asteriscos&lt;br /&gt;
[[Fitxer:volca.png]]&lt;br /&gt;
*Mosaic: Compost per una matriu de 8x8 caràcters.&lt;br /&gt;
[[Fitxer:mosaic.png]]&lt;br /&gt;
*Taulers: Com l'anterior però cada quadrat d'amplària L (nombre de línies)&lt;br /&gt;
[[Fitxer:taulers.png]]&lt;br /&gt;
&lt;br /&gt;
== Bibliografia / Webgrafia  ==&lt;br /&gt;
Luis Llana, Carlos Gregorio, Raquel Martínez, Pedro Palao y C. Pareja, &amp;quot;Ejercicios creativos y recreativos en C++&amp;quot;, Ed. Prentice-Hall, 2002. ISBN 84-205-3211-8.&lt;br /&gt;
&lt;br /&gt;
[http://librosweb.es/javascript/capitulo_3.html Introducció a Javascript] &lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[http://www.internetmania.net/int0/int0.htm Internetmania]&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Sintaxi_Javascript&amp;diff=7340</id>
		<title>NF2 - Sintaxi Javascript</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Sintaxi_Javascript&amp;diff=7340"/>
				<updated>2016-09-20T18:17:10Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Generalitats ==&lt;br /&gt;
La sintaxi d'un llenguatge de programació es defineix com el conjunt de regles que han de seguir-se en escriure el codi font dels programes per considerar-se com a correctes per a aquest llenguatge de programació.&lt;br /&gt;
&lt;br /&gt;
La sintaxi de Javascript és molt similar a la d'altres llenguatges de programació com Java i C. Les normes bàsiques que defineixen la sintaxi de Javascript són les següents:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;No es tenen en compte els espais en blanc i les noves línies&amp;lt;/b&amp;gt;: com succeeix amb XHTML, l'intèrpret de Javascript ignora qualsevol espai en blanc sobrant, per la qual cosa el codi es pot ordenar de forma adequada per entendre-ho millor (tabulant les línies, afegint espais, creant noves línies, etc.)&lt;br /&gt;
* &amp;lt;b&amp;gt;Es distingeixen les majúscules i minúscules&amp;lt;/b&amp;gt;: igual que succeeix amb la sintaxi de les etiquetes i elements XHTML. No obstant això, si en una pàgina XHTML s'utilitzen indistintament majúscules i minúscules, la pàgina es visualitza correctament, sent l'únic problema la no validació de la pàgina. En canvi, si en Javascript s'intercanvien majúscules i minúscules el script no funciona.&lt;br /&gt;
* &amp;lt;b&amp;gt;No es defineix el tipus de les variables&amp;lt;/b&amp;gt;: en crear una variable, no és necessari indicar el tipus de dada que emmagatzemarà. D'aquesta forma, una mateixa variable pot emmagatzemar diferents tipus de dades durant l'execució del script.&lt;br /&gt;
* &amp;lt;b&amp;gt;No és necessari acabar cada sentència amb el caràcter de punt i coma (;)&amp;lt;/b&amp;gt;: en la majoria de llenguatges de programació, és obligatori acabar cada sentència amb el caràcter ;. Encara que Javascript no obliga a fer-ho, NOSALTRES seguirem la tradició d'acabar cada sentència amb el caràcter del punt i coma (;).&lt;br /&gt;
* &amp;lt;b&amp;gt;Es poden incloure comentaris&amp;lt;/b&amp;gt;: els comentaris s'utilitzen per afegir informació en el codi font del programa. Encara que el contingut dels comentaris no es visualitza per pantalla, si que s'envia al navegador de l'usuari juntament amb la resta del script, per la qual cosa és necessari extremar les precaucions sobre la informació inclosa en els comentaris.&lt;br /&gt;
&lt;br /&gt;
Javascript defineix dos tipus de comentaris: els de una sola línia i els que ocupen diverses línies.&lt;br /&gt;
&lt;br /&gt;
Els comentaris d'una sola línia es defineixen afegint dues barres obliqües (//) al principi de la línia :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// a continuació es mostra un missatge&lt;br /&gt;
&lt;br /&gt;
alert(&amp;quot;missatge de prova&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de comentari de diverses línies:&lt;br /&gt;
&amp;lt;&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Els comentaris de diverses línies són molt útils&lt;br /&gt;
quan es necessita incloure bastant informació&lt;br /&gt;
en els comentaris */&lt;br /&gt;
&lt;br /&gt;
alert(&amp;quot;missatge de prova&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els comentaris multilinia es defineixen tancant el text del comentari entre els símbols /* i */.&lt;br /&gt;
&lt;br /&gt;
== Variables ==&lt;br /&gt;
Les variables en els llenguatges de programació segueixen una lògica similar a les variables utilitzades en altres àmbits com les matemàtiques. Una variable és un element que s'empra per emmagatzemar i fer referència a un altre valor. Gràcies a les variables és possible crear &amp;quot;programes genèrics&amp;quot;, és a dir, programes que funcionen sempre igual independentment dels valors concrets utilitzats.&lt;br /&gt;
&lt;br /&gt;
De la mateixa forma que si en Matemàtiques no existissin les variables no es podrien definir les equacions i fórmules, en programació no es podrien fer programes realment útils sense les variables.&lt;br /&gt;
&lt;br /&gt;
Si no existissin variables, un programa que suma dos nombres podria escriure's com:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
resultat = 3 + 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El programa anterior és tan poc útil que només serveix per al cas en el qual el primer nombre de la summa sigui el 3 i el segon nombre sigui l'1. En qualsevol altre cas, el programa obté un resultat incorrecte.&lt;br /&gt;
&lt;br /&gt;
No obstant això, el programa es pot refer de la següent manera utilitzant variables per emmagatzemar i referir-se a cada nombre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
numero_1 = 3&lt;br /&gt;
numero_2 = 1&lt;br /&gt;
resultat = numero_1 + numero_2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els elements ''numero_1'' i ''numero_2'' són variables que emmagatzemen els valors que utilitza el programa. El resultat es calcula sempre en funció del valor emmagatzemat per les variables, per la qual cosa aquest programa funciona correctament per a qualsevol parell de nombres indicat. Si es modifica el valor de les variables ''numero_1'' i ''numero_2'', el programa segueix funcionant correctament.&lt;br /&gt;
&lt;br /&gt;
Les variables en Javascript es creen mitjançant la paraula reservada '''var'''. D'aquesta forma, l'exemple anterior es pot realitzar en Javascript de la següent manera:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1 = 3;&lt;br /&gt;
var numero_2 = 1;&lt;br /&gt;
var resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La paraula reservada ''var'' solament s'ha d'indicar en definir per primera vegada la variable, la qual cosa es denomina declarar una variable. Quan s'utilitzen les variables en la resta d'instruccions del *script, solament és necessari indicar el seu nom. En altres paraules, en l'exemple anterior seria un error indicar el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1 = 3;&lt;br /&gt;
var numero_2 = 1;&lt;br /&gt;
var resultat = *var numero_1 + *var numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si quan es declara una variable se li assigna també un valor, es diu que la variable ha estat inicialitzada. ''En Javascript no és obligatori inicialitzar les variables'', ja que es poden declarar d'una banda i assignar-los un valor posteriorment. Per tant, l'exemple anterior es pot refer de la següent manera:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1;&lt;br /&gt;
var numero_2;&lt;br /&gt;
&lt;br /&gt;
numero_1 = 3;&lt;br /&gt;
numero_2 = 1;&lt;br /&gt;
&lt;br /&gt;
var resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Una de les característiques més sorprenents de JavaSript per als programadors habituats a altres llenguatges de programació és que tampoc és necessari declarar les variables. En altres paraules, es poden utilitzar variables que no s'han definit anteriorment mitjançant la paraula reservada *var. L'exemple anterior també és correcte en Javascript de la següent forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1 = 3;&lt;br /&gt;
var numero_2 = 1;&lt;br /&gt;
&lt;br /&gt;
resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La variable resultat no està declarada, per la qual cosa Javascript crea una variable global (més endavant es veuran les diferències entre variables locals i globals) i li assigna el valor corresponent. De la mateixa forma, també seria correcte el següent codi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
numero_1 = 3;&lt;br /&gt;
numero_2 = 1;&lt;br /&gt;
&lt;br /&gt;
resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En qualsevol cas, es recomana declarar totes les variables que es vagin a utilitzar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;El nom d'una variable&amp;lt;/u&amp;gt; també es coneix com a identificador i &amp;lt;u&amp;gt;ha de complir les següents normes:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Només pot estar format per lletres, nombres i els símbols $ (dòlar) i _ (guió baix).&lt;br /&gt;
* El primer caràcter no pot ser un nombre.&lt;br /&gt;
&lt;br /&gt;
Per tant, les següents variables tenen noms correctes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var $numero1;&lt;br /&gt;
var _$lletra;&lt;br /&gt;
var $$$*otroNumero;&lt;br /&gt;
var $_a__$4;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
No obstant això, les següents variables tenen identificadors incorrectes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var 1numero; // Comença per un nombre&lt;br /&gt;
var numero;1_123; // Conté un caràcter &amp;quot;;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tipus de variables ===&lt;br /&gt;
Encara que totes les variables de Javascript es creen de la mateixa forma (mitjançant la paraula reservada var), la forma en la qual se'ls assigna un valor depèn del tipus de valor que es vol emmagatzemar (nombres, textos, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Numèriques ====&lt;br /&gt;
S'utilitzen per emmagatzemar valors numèrics enters (anomenats integer en anglès) o decimals (anomenats float en anglès). En aquest cas, el valor s'assigna indicant directament el nombre enter o decimal. Els nombres decimals utilitzen el caràcter . (punt) en comptes de , (coma) per separar la part sencera i la part decimal:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var iva = 16; // variable tipus sencer&lt;br /&gt;
var total = 234.65; // variable tipus decimal&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==== Cadenes de text ====&lt;br /&gt;
S'utilitzen per emmagatzemar caràcters, paraules i/o frases de text. Per assignar el valor a la variable, es tanca el valor entre cometes dobles o simples, per delimitar el seu començament i el seu final:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Benvingut al nostre lloc web&amp;quot;;&lt;br /&gt;
var nombreProducto = 'Producte ABC';&lt;br /&gt;
var letraSeleccionada = 'c';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En ocasions, el text que s'emmagatzema en les variables no és tan senzill. Si per exemple el propi text conté cometes simples o dobles, l'estratègia que se segueix és la de tancar el text amb les cometes (simples o dobles) que no utilitzi el text:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* El contingut de text1 té cometes simples, per&lt;br /&gt;
la qual cosa es tanca amb cometes dobles */&lt;br /&gt;
var text1 = &amp;quot;Una frase amb 'cometes simples' dins&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* El contingut de text2 té cometes dobles, per&lt;br /&gt;
la qual cosa es tanca amb cometes simples */&lt;br /&gt;
var text2 = 'Una frase amb &amp;quot;cometes dobles&amp;quot; dins';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No obstant això, de vegades les cadenes de text contenen tant cometes simples com a dobles. A més, existeixen altres caràcters que són difícils d'incloure en una variable de text (tabulador, ENTER, etc.) Per resoldre aquests problemes, Javascript defineix un mecanisme per incloure de forma senzilla caràcters especials i problemàtics dins d'una cadena de text.&lt;br /&gt;
&lt;br /&gt;
El mecanisme consisteix a substituir el caràcter problemàtic per una combinació simple de caràcters. A continuació es mostra la taula de conversió que s'ha d'utilitzar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Si es vol incloure...	S'ha d'incloure...&lt;br /&gt;
Una nova línia          \n	&lt;br /&gt;
Un tabulador	        \t&lt;br /&gt;
Una cometa simple	\'&lt;br /&gt;
Una cometa doble	\&amp;quot;&lt;br /&gt;
Una barra inclinada	\\&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
D'aquesta forma, l'exemple anterior que contenia cometes simples i dobles dins del text es pot refer de la següent forma:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var text1 = 'Una frase amb \'cometes simples\' dins';&lt;br /&gt;
&lt;br /&gt;
var text2 = &amp;quot;Una frase amb \&amp;quot;cometes dobles\&amp;quot; dins&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Aquest mecanisme de Javascript es denomina &amp;quot;mecanisme de fuita&amp;quot; dels caràcters problemàtics, i és habitual referir-se al fet que els caràcters han estat &amp;quot;escapats&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Arrays ====&lt;br /&gt;
En ocasions, als arrays se'ls anomena vectors, matrius i fins i tot arranjaments. No obstant això, el terme array és el més utilitzat i és una paraula comunament acceptada a l'entorn de la programació.&lt;br /&gt;
&lt;br /&gt;
Un array és una col·lecció de variables, que poden ser totes del mateix tipus o cadascuna d'un tipus diferent. La seva utilitat es comprèn millor amb un exemple senzill: si una aplicació necessita utilitzar els dies de la setmana, es podrien crear set variables de tipus text:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dia1 = &amp;quot;Dilluns&amp;quot;;&lt;br /&gt;
var dia2 = &amp;quot;Dimarts&amp;quot;;&lt;br /&gt;
...&lt;br /&gt;
var dia7 = &amp;quot;Diumenge&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Encara que el codi anterior no és incorrecte, sí que és poc eficient i complica a l'excés la programació. Si en comptes dels dies de la setmana s'hagués de guardar el nom dels mesos de l'any, el nom de tots els països del món o els mesuraments diaris de temperatura dels últims 100 anys, s'haurien de crear desenes o centenars de variables.&lt;br /&gt;
&lt;br /&gt;
En aquest tipus de casos, es poden agrupar totes les variables relacionades en una col·lecció de variables o array. L'exemple anterior es pot refer de la següent forma:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dies = [&amp;quot;Dilluns&amp;quot;, &amp;quot;Dimarts&amp;quot;, &amp;quot;Dimecres&amp;quot;, &amp;quot;Dijous&amp;quot;, &amp;quot;Divendres&amp;quot;, &amp;quot;Dissabte&amp;quot;, &amp;quot;Diumenge&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ara, una única variable anomenada ''dies'' emmagatzema tots els valors relacionats entre si, en aquest cas els dies de la setmana. Per definir un array, s'utilitzen els caràcters [ i ] per delimitar el seu començament i el seu final i s'utilitza el caràcter , (coma) per separar els seus elements:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nom_array = [valor1, valor2, ...,valorN];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Una vegada definit un array, és molt senzill accedir a cadascun dels seus elements. Cada element s'accedeix indicant la seva posició dins del array. L'única complicació, que és responsable de molts errors quan es comença a programar, és que les posicions dels elements comencen a explicar-se en el 0 i no en l'1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var diaSeleccionat = dies[0]; // diaSeleccionat = &amp;quot;Dilluns&amp;quot;&lt;br /&gt;
&lt;br /&gt;
var altreDia = dies[5]; // altreDia = &amp;quot;Dissabte&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En l'exemple anterior, la primera instrucció vol obtenir el primer element del array. Per a això, s'indica el nom del array i entre claudàtors la posició de l'element dins del array. Com s'ha comentat, ''les posicions del array comencen a partir del 0'', per la qual cosa el primer element ocupa la posició 0 i s'accedeix al mitjançant dias[0].&lt;br /&gt;
&lt;br /&gt;
El valor dies[5] fa referència a l'element que ocupa la sisena posició dins del array dies. Com les posicions comencen a explicar-se en 0, la posició 5 fa referència al sisè element, en aquest cas, el valor Dissabte.&lt;br /&gt;
&lt;br /&gt;
==== Booleans ====&lt;br /&gt;
Les variables de tipus boolean o booleà també es coneixen amb el nom de variables de tipus lògic. El seu funcionament bàsic és molt senzill.&lt;br /&gt;
&lt;br /&gt;
Una variable de tipus boolean emmagatzema un tipus especial de valor que solament pot prendre dos valors: '''true''' (veritable) o '''false''' (fals). No es pot utilitzar per emmagatzemar nombres i tampoc permet guardar cadenes de text.&lt;br /&gt;
&lt;br /&gt;
Els únics valors que poden emmagatzemar aquestes variables són true i false, per la qual cosa no poden utilitzar-se els valors veritable i fals. A continuació es mostra un parell de variables de tipus booleà:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var clientRegistrat = false;&lt;br /&gt;
var iva = true;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Operadors ===&lt;br /&gt;
&lt;br /&gt;
Els operadors permeten manipular el valor de les variables, realitzar operacions matemàtiques amb els seus valors i comparar diferents variables. D'aquesta forma, els operadors permeten als programes realitzar càlculs complexos i prendre decisions lògiques en funció de comparacions i altres tipus de condicions.&lt;br /&gt;
&lt;br /&gt;
==== Assignació ====&lt;br /&gt;
&lt;br /&gt;
L'operador d'assignació és el més utilitzat i el més senzill. Aquest operador s'utilitza per guardar un valor específic en una variable. El símbol utilitzat és = (no confondre amb l'operador == que es veurà més endavant):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 3;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A l'esquerra de l'operador, sempre ha d'indicar-se el nom d'una variable. A la dreta de l'operador, es poden indicar variables, valors, condicions lògiques, etc:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 3;&lt;br /&gt;
var numero2 = 4;&lt;br /&gt;
&lt;br /&gt;
/* Error, l'assignació sempre es realitza a una variable,&lt;br /&gt;
per la qual cosa en l'esquerra no es pot indicar un número */&lt;br /&gt;
5 = numero1;&lt;br /&gt;
&lt;br /&gt;
// Ara, la variable numero1 val 5&lt;br /&gt;
numero1 = 5;&lt;br /&gt;
&lt;br /&gt;
// Ara, la variable numero1 val 4&lt;br /&gt;
numero1 = numero2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Increment i decrement====&lt;br /&gt;
Aquests dos operadors solament són vàlids per a les variables numèriques i s'utilitzen per incrementar o decrementar en una unitat el valor d'una variable.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
++numero;&lt;br /&gt;
alert(numero); // numero = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L'operador d'increment s'indica mitjançant el prefix ++ en el nom de la variable. El resultat és que el valor d'aquesta variable s'incrementa en una unitat. Per tant, l'anterior exemple és equivalent a:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
numero = numero + 1;&lt;br /&gt;
alert(numero); // numero = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
De forma equivalent, l'operador decrement (indicat com un prefix -- en el nom de la variable) s'utilitza per decrementar el valor de la variable:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
--numero;&lt;br /&gt;
alert(numero); // numero = 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'anterior exemple és equivalent a:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
numero = numero - 1;&lt;br /&gt;
alert(numero); // numero = 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els operadors d'increment i decremento no solament es poden indicar com a prefix del nom de la variable, sinó que també és possible utilitzar-los com a sufix. En aquest cas, el seu comportament és similar però molt diferent. En el següent exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
numero++;&lt;br /&gt;
alert(numero); // numero = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El resultat d'executar el script anterior és el mateix que quan s'utilitza l'operador ++numero, per la qual cosa pot semblar que és equivalent indicar l'operador ++ davant o darrere de l'identificador de la variable. No obstant això, el següent exemple mostra les seves diferències:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
var numero2 = 2;&lt;br /&gt;
numero3 = numero1++ + numero2;&lt;br /&gt;
// numero3 = 7, numero1 = 6&lt;br /&gt;
&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
var numero2 = 2;&lt;br /&gt;
numero3 = ++numero1 + numero2;&lt;br /&gt;
// numero3 = 8, numero1 = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si l'operador ++ s'indica com a prefix de l'identificador de la variable, el seu valor s'incrementa abans de realitzar qualsevol altra operació. Si l'operador ++ s'indica com a sufix de l'identificador de la variable, el seu valor s'incrementa després d'executar la sentència en la qual apareix.&lt;br /&gt;
&lt;br /&gt;
Per tant, en la instrucció numero3 = numero1++ + numero2;, el valor de numero1 s'incrementa després de realitzar l'operació (primer se sumeixi i numero3 val 7, després s'incrementa el valor de numero1 i val 6). No obstant això, en la instrucció numero3 = ++numero1 + numero2;, en primer lloc s'incrementa el valor de numero1 i després es realitza la summa (primer s'incrementa numero1 i val 6, després es realitza la summa i numero3 val 8).&lt;br /&gt;
&lt;br /&gt;
==== Lògics ====&lt;br /&gt;
Els operadors lògics són imprescindibles per realitzar aplicacions complexes, ja que s'utilitzen per prendre decisions sobre les instruccions que hauria d'executar el programa en funció de certes condicions.&lt;br /&gt;
&lt;br /&gt;
El resultat de qualsevol operació que utilitzi operadors lògics sempre és un valor lògic o booleà.&lt;br /&gt;
&lt;br /&gt;
===== Negació =====&lt;br /&gt;
Un dels operadors lògics més utilitzats és el de la negació. S'utilitza per obtenir el valor contrari al valor de la variable:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var visible = true;&lt;br /&gt;
alert(!visible); // Mostra &amp;quot;false&amp;quot; i no &amp;quot;true&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La negació lògica s'obté prefixant el símbol ! a l'identificador de la variable. El funcionament d'aquest operador es resumeix en la següent taula:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
variable	!variable&lt;br /&gt;
true    	false&lt;br /&gt;
false	        true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si la variable original és de tipus booleà, és molt senzill obtenir la seva negació. No obstant això, què succeeix quan la variable és un nombre o una cadena de text? Per obtenir la negació en aquest tipus de variables, es realitza en primer lloc la seva conversió a un valor booleà:&lt;br /&gt;
&lt;br /&gt;
Si la variable conté un nombre, es transforma en false si val 0 i en true per a qualsevol altre nombre (positiu o negatiu, decimal o sencer).&lt;br /&gt;
Si la variable conté una cadena de text, es transforma en false si la cadena és buida (&amp;quot;&amp;quot;) i en true en qualsevol altre cas.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quantitat = 0;&lt;br /&gt;
buit = !quantitat; // buit = true&lt;br /&gt;
&lt;br /&gt;
quantitat = 2;&lt;br /&gt;
buit = !quantitat; // buit = false&lt;br /&gt;
&lt;br /&gt;
var missatge = &amp;quot;&amp;quot;;&lt;br /&gt;
missatgebuit = !missatge; // missatgebuit = true&lt;br /&gt;
&lt;br /&gt;
missatge = &amp;quot;Benvingut&amp;quot;;&lt;br /&gt;
missatgebuit = !missatge; // missatgebuit = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== AND =====&lt;br /&gt;
L'operació lògica AND obté el seu resultat combinant dos valors booleans. L'operador s'indica mitjançant el símbol &amp;amp;&amp;amp; i el seu resultat solament és true si els dos operands són true:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
variable1	variable2	variable1 &amp;amp;&amp;amp; variable2&lt;br /&gt;
  true	           true	                 true&lt;br /&gt;
  true	           false	         false&lt;br /&gt;
  false	           true	                 false&lt;br /&gt;
  false	           false	         false&lt;br /&gt;
&lt;br /&gt;
var valor1 = true;&lt;br /&gt;
var valor2 = false;&lt;br /&gt;
resultat = valor1 &amp;amp;&amp;amp; valor2; // resultat = false&lt;br /&gt;
&lt;br /&gt;
valor1 = true;&lt;br /&gt;
valor2 = true;&lt;br /&gt;
resultat = valor1 &amp;amp;&amp;amp; valor2; // resultat = true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== OR =====&lt;br /&gt;
L'operació lògica OR també combina dos valors booleans. L'operador s'indica mitjançant el símbol || i el seu resultat és true si algun dels dos operands és true:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
variable1	variable2	variable1 || variable2&lt;br /&gt;
  true	           true	                 true&lt;br /&gt;
  true	           false	         true&lt;br /&gt;
  false	           true	                 true&lt;br /&gt;
  false	           false	         false&lt;br /&gt;
&lt;br /&gt;
var valor1 = true;&lt;br /&gt;
var valor2 = false;&lt;br /&gt;
resultat = valor1 || valor2; // resultat = true&lt;br /&gt;
&lt;br /&gt;
valor1 = false;&lt;br /&gt;
valor2 = false;&lt;br /&gt;
resultat = valor1 || valor2; // resultat = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Matemàtics ====&lt;br /&gt;
Javascript permet realitzar manipulacions matemàtiques sobre el valor de les variables numèriques. Els operadors definits són: suma (+), resta (-), multiplicació (*) i divisió (/). Exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 10;&lt;br /&gt;
var numero2 = 5;&lt;br /&gt;
&lt;br /&gt;
resultat = numero1 / numero2; // resultat = 2&lt;br /&gt;
resultat = 3 + numero1; // resultat = 13&lt;br /&gt;
resultat = numero2 – 4; // resultat = 1&lt;br /&gt;
resultat = numero1 * numero 2; // resultat = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A més dels quatre operadors bàsics, Javascript defineix un altre operador matemàtic que no és senzill d'entendre quan s'estudia per primera vegada, però que és molt útil en algunes ocasions.&lt;br /&gt;
&lt;br /&gt;
Es tracta de l'operador &amp;quot;mòdul&amp;quot;, que calcula la resta de la divisió sencera de dos nombres. Si es divideix per exemple 10 i 5, la divisió és exacta i dóna un resultat de 2. La resta d'aquesta divisió és 0, per la qual cosa mòdul de 10 i 5 és igual a 0.&lt;br /&gt;
&lt;br /&gt;
No obstant això, si es divideix 9 i 5, la divisió no és exacta, el resultat és 1 i la resta 4, per la qual cosa mòdul de 9 i 5 és igual a 4.&lt;br /&gt;
&lt;br /&gt;
L'operador mòdul en Javascript s'indica mitjançant el símbol %, que no ha de confondre's amb el càlcul del percentatge:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 10;&lt;br /&gt;
var numero2 = 5;&lt;br /&gt;
resultat = numero1 % numero2; // resultat = 0&lt;br /&gt;
&lt;br /&gt;
numero1 = 9;&lt;br /&gt;
numero2 = 5;&lt;br /&gt;
resultat = numero1 % numero2; // resultat = 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els operadors matemàtics també es poden combinar amb l'operador d'assignació per abreujar la seva notació:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
numero1 += 3; // numero1 = numero1 + 3 = 8&lt;br /&gt;
numero1 -= 1; // numero1 = numero1 - 1 = 4&lt;br /&gt;
numero1 *= 2; // numero1 = numero1 * 2 = 10&lt;br /&gt;
numero1 /= 5; // numero1 = numero1 / 5 = 1&lt;br /&gt;
numero1 %= 4; // numero1 = numero1 % 4 = 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Relacionals ====&lt;br /&gt;
Els operadors relacionals definits per Javascript són idèntics als quals defineixen les matemàtiques: major que (&amp;gt;), menor que (&amp;lt;), major o igual (&amp;gt;=), menor o igual (&amp;lt;=), igual que (==) i diferent de (!=).&lt;br /&gt;
&lt;br /&gt;
Els operadors que relacionen variables són imprescindibles per realitzar qualsevol aplicació complexa, com es veurà en el següent capítol de programació avançada. El resultat de tots aquests operadors sempre és un valor booleà:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 3;&lt;br /&gt;
var numero2 = 5;&lt;br /&gt;
resultat = numero1 &amp;gt; numero2; // resultat = false&lt;br /&gt;
resultat = numero1 &amp;lt; numero2; // resultat = true&lt;br /&gt;
&lt;br /&gt;
numero1 = 5;&lt;br /&gt;
numero2 = 5;&lt;br /&gt;
resultat = numero1 &amp;gt;= numero2; // resultat = true&lt;br /&gt;
resultat = numero1 &amp;lt;= numero2; // resultat = true&lt;br /&gt;
resultat = numero1 == numero2; // resultat = true&lt;br /&gt;
resultat = numero1 != numero2; // resultat = false&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
S'ha de tenir especial cura amb l'operador d'igualtat (==), ja que és l'origen de la majoria d'errors de programació, fins i tot per als usuaris que ja tenen certa experiència desenvolupant scripts. L'operador == s'utilitza per comparar el valor de dues variables, per la qual cosa és molt diferent de l'operador =, que s'utilitza per assignar un valor a una variable:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// L'operador &amp;quot;=&amp;quot; assigna valors&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
resultat = numero1 = 3; // numero1 = 3 i resultat = 3&lt;br /&gt;
&lt;br /&gt;
// L'operador &amp;quot;==&amp;quot; compara variables&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
resultat = numero1 == 3; // numero1 = 5 i resultat = *false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els operadors relacionals també es poden utilitzar amb variables de tipus cadena de text:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var text1 = &amp;quot;hola&amp;quot;;&lt;br /&gt;
var text2 = &amp;quot;hola&amp;quot;;&lt;br /&gt;
var text3 = &amp;quot;*adios&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
resultat = text1 == text3; // resultat = false&lt;br /&gt;
resultat = text1 != text2; // resultat = false&lt;br /&gt;
resultat = text3 &amp;gt;= text2; // resultat = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Quan s'utilitzen cadenes de text, els operadors &amp;quot;major que&amp;quot; (&amp;gt;) i &amp;quot;menor que&amp;quot; (&amp;lt;) segueixen un raonament no intuïtiu: es compara lletra a lletra començant des de l'esquerra fins que es trobi una diferència entre les dues cadenes de text. Per determinar si una lletra és major o menor que una altra, les majúscules es consideren menors que les minúscules i les primeres lletres de l'alfabet són menors que les últimes (a és menor que b, b és menor que c, A és menor que a, etc.)&lt;br /&gt;
=== Àmbit de les Varibles ===&lt;br /&gt;
Un altre aspecte a tenir en compte a l'hora d'usar les variables és el seu àmbit, és a dir, quines funcions tenen accés a elles. Si es crea una ''variable dins d'una funció'' només serà coneguda dins d'aquesta funció, es tracta de ''variables locals''. Si es necessita que diverses funcions tinguin accés a una determinada variable aquesta ha de crear-se com a variable global, això es fa creant-la fora de totes les funcions. Per exemple en el següent script tenim variables globals i locals:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script language=&amp;quot;Javascript&amp;quot;&amp;gt;&lt;br /&gt;
     var navegador_versio = 0;&lt;br /&gt;
     function veureNavegador()&lt;br /&gt;
     {&lt;br /&gt;
          var versio;&lt;br /&gt;
          versio = document.appVersion;&lt;br /&gt;
          return versio;&lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En aquest exemple ''navegador_versio'' és una variable global i ''versió'' és una variable local que només existeix dintre de la funciò ''veureNavegador''.&lt;br /&gt;
Què succeeix si una funció defineix una variable local amb el mateix nom que una variable global que ja existeix? En aquest cas, l''es variables locals prevalen sobre les globals, però només dins de la funció'':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var missatge = &amp;quot;guanya la de fora&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    function mostraMissatge() {&lt;br /&gt;
        var missatge = &amp;quot;guanya la de dins&amp;quot;;&lt;br /&gt;
        alert(missatge);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
    mostraMissatge();&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Què succeeix si dins d'una funció es defineix una variable global amb el mateix nom que una altra variable global que ja existeix? En aquest altre cas, la variable global definida dins de la funció simplement modifica el valor de la variable global definida anteriorment:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var missatge = &amp;quot;guanya la de fora&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    function mostraMissatge() {&lt;br /&gt;
        missatge = &amp;quot;guanya la de dins&amp;quot;;&lt;br /&gt;
        alert(missatge);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
    mostraMissatge();&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La diferencia dels dos exemples anteriors ve donat per la definició d'una variable anomenada igual que una altre global. En el primer exemple s'utilitza la paraula reservada '''var''' i en el últim exemple NO s'utilitza. El fet de NO utilitzar la paraula reservada '''var''' s'interpreta com que es vol utilitzar la variable global definida abans de la funció.&lt;br /&gt;
&lt;br /&gt;
Resumint, la recomanació general és definir com a variables locals totes les variables que siguin d'ús exclusiu per realitzar les tasques encarregades a cada funció. Les variables globals s'utilitzen per compartir dades entre funcions de forma senzilla.&lt;br /&gt;
&lt;br /&gt;
== Estructures de control de Flux ==&lt;br /&gt;
&lt;br /&gt;
=== Estructura IF ===&lt;br /&gt;
L'estructura més utilitzada en Javascript i en la majoria de llenguatges de programació és l'estructura if. S'empra per prendre decisions en funció d'una condició. La seva definició formal és:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if(condicion) {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si la condició es compleix (és a dir, si el seu valor és true) s'executen totes les instruccions que es troben dins de {...}. Si la condició no es compleix (és a dir, si el seu valor és false) no s'executa cap instrucció continguda en {...} i el programa continua executant la resta d'instruccions del script.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var mostrado = false;&lt;br /&gt;
var usuarioPermiteMensajes = true;&lt;br /&gt;
 &lt;br /&gt;
if(!mostrado &amp;amp;&amp;amp; usuarioPermiteMensajes) {&lt;br /&gt;
  alert(&amp;quot;Es la primera vez que se muestra el mensaje&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Estructura IF....ELSE ===&lt;br /&gt;
Normalment les condicions solen ser del tipus &amp;quot;si es compleix aquesta condició, fes-ho; si no es compleix, fes això un altre&amp;quot;. Existeix una variant de l'estructura if trucada if...else. La seva definició formal és la següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if(condicion) {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La estructura if...else es pot encadenar per realitzar diverses comprovacions seguides:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if(edad &amp;lt; 12) {&lt;br /&gt;
  alert(&amp;quot;Todavía eres muy pequeño&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if(edad &amp;lt; 19) {&lt;br /&gt;
  alert(&amp;quot;Eres un adolescente&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if(edad &amp;lt; 35) {&lt;br /&gt;
  alert(&amp;quot;Aun sigues siendo joven&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
  alert(&amp;quot;Piensa en cuidarte un poco más&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selecció Múltiple ===&lt;br /&gt;
Poden existir casos en els quals el programa hagi de tenir mes de dues alternatives, per exemple si volem un programa que mostri un títol en un idioma de quatre possibles. Això pot solucionar-se mitjançant diversos if. Hem de triar entre idiomes: castellà, engonals, francès i alemany.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (leng == &amp;quot;ESPANYOL&amp;quot;)&lt;br /&gt;
       pagCast();&lt;br /&gt;
else&lt;br /&gt;
       if (leng == &amp;quot;ANGLES&amp;quot;)&lt;br /&gt;
              pagIng();&lt;br /&gt;
       else&lt;br /&gt;
             if (leng == &amp;quot;FRANCES&amp;quot;)&lt;br /&gt;
                    pagFran();&lt;br /&gt;
             else&lt;br /&gt;
                   if (leng == &amp;quot;CATALA&amp;quot;)&lt;br /&gt;
                          pagCat();&lt;br /&gt;
                   else&lt;br /&gt;
                            error('idioma desconegut');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per a aquests casos disposem de la sentència switch...casi...default, de selecció múltiple. L'exemple anterior quedaria:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
switch (idioma) {&lt;br /&gt;
    case 'espanyol' :&lt;br /&gt;
          pagCast();&lt;br /&gt;
          break;&lt;br /&gt;
    case 'ingles' :&lt;br /&gt;
          pagIng();&lt;br /&gt;
          break;&lt;br /&gt;
    case 'frances' :&lt;br /&gt;
          pagFran();&lt;br /&gt;
          break;&lt;br /&gt;
    case 'catala' :&lt;br /&gt;
          pagCat();&lt;br /&gt;
          break;&lt;br /&gt;
    default :&lt;br /&gt;
          error ('Idioma desconegut');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La instrucció ''break'' posa fi al bloc i fa que el programa salti a la instrucció següent a la sentència ''switch''(), si s'omet el programa continuaria amb la següent comparació. La secció del ''default'' és opcional, la seva finalitat és executar algun codi quan cap de les condicions es compleixi.&lt;br /&gt;
&lt;br /&gt;
=== Estructura WHILE ===&lt;br /&gt;
En aquesta estructura el programa primer comprova la condició: si és certa pansa a executar el cos del bucle, i si és falsa pansa a la instrucció següent a la sentència while.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
while(condició){&lt;br /&gt;
....&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var resultat = 0;&lt;br /&gt;
var numero = 100;&lt;br /&gt;
var i = 0;&lt;br /&gt;
 &lt;br /&gt;
while(i &amp;lt;= numero) {&lt;br /&gt;
  resultat += i;&lt;br /&gt;
  i++;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
alert(resultat);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El programa ha de sumar tots els nombres menors o igual que un altre donat. Per exemple si el nombre és 5, s'ha de calcular: 1 + 2 + 3 + 4 + 5 = 15&lt;br /&gt;
&lt;br /&gt;
=== Estructura DO...WHILE ===&lt;br /&gt;
Es tracta d'un bucle en el qual la condició es comprova després de la primera iteració, és a dir que el cos del bucle s'executa almenys una vegada. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  ...&lt;br /&gt;
} while(condició);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Utilitzant aquest bucle es pot calcular fàcilment el factorial d'un numero:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var resultat = 1;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
 &lt;br /&gt;
do {&lt;br /&gt;
  resultat *= numero;  // resultat = resultat * numero&lt;br /&gt;
  numero--;&lt;br /&gt;
} while(numero &amp;gt; 0);&lt;br /&gt;
 &lt;br /&gt;
alert(resultat);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Estructura FOR ===&lt;br /&gt;
L'estructura for permet realitzar repeticions (també anomenades bucles) d'instruccions d'una forma molt senzilla. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for(inicializació; condició; actualizació) {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La idea del funcionament d'un bucle for és la següent: &amp;quot;mentre la condició indicada se segueixi complint, repeteix l'execució de les instruccions definides dins del for. A més, després de cada repetició, actualitza el valor de les variables que s'utilitzen en la condició&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* La &amp;quot;inicialització&amp;quot; és la zona en la qual s'estableix els valors inicials de les variables que controlen la repetició.&lt;br /&gt;
* La &amp;quot;condició&amp;quot; és l'únic element que decideix si contínua o es deté la repetició.&lt;br /&gt;
* La &amp;quot;actualització&amp;quot; és el nou valor que s'assigna després de cada repetició a les variables que controlen la repetició.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola, estic dintre d'un bucle&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
for(var i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
  alert(missatge);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Un altre exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dies = [&amp;quot;Dilluns&amp;quot;, &amp;quot;Dimarts&amp;quot;, &amp;quot;Dimecres&amp;quot;, &amp;quot;Dijous&amp;quot;, &amp;quot;Divendres&amp;quot;, &amp;quot;Dissabte&amp;quot;, &amp;quot;Diumenge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
for(var i=0; i&amp;lt;7; i++) {&lt;br /&gt;
  alert(dies[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Estructura For...IN ===&lt;br /&gt;
La seva definició exacta implica l'ús d'objectes, que és un element de programació que encara no anem a estudiar. Per tant, solament es va a presentar l'estructura for...in adaptada al seu ús en arrays. La seva definició formal adaptada als arrays és:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for(indice in array) {&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dies = [&amp;quot;Dilluns&amp;quot;, &amp;quot;Dimarts&amp;quot;, &amp;quot;Dimecres&amp;quot;, &amp;quot;Dijous&amp;quot;, &amp;quot;Divendres&amp;quot;, &amp;quot;Dissabte&amp;quot;, &amp;quot;Diumenge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
for(i in dies) {&lt;br /&gt;
  alert(dies[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Funcions útils del llenguatge ==&lt;br /&gt;
=== Funcions de cadenes de text ===&lt;br /&gt;
&lt;br /&gt;
'''length''', calcula la longitud d'una cadena de text (el nombre de caràcters que la formen)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var numeroLetras = missatge.length; // numeroLetras = 10&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''+''', s'empra per concatenar diverses cadenes de text&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = &amp;quot; Món&amp;quot;;&lt;br /&gt;
var missatge = missatge1 + missatge2; // missatge = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A més de l'operador +, també es pot utilitzar la funció '''concat()'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = missatge1.concat(&amp;quot; Món&amp;quot;); // missatge2 = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les cadenes de text també es poden unir amb variables numèriques:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var variable1 = &amp;quot;Hola &amp;quot;;&lt;br /&gt;
var variable2 = 3;&lt;br /&gt;
var missatge = variable1 + variable2; // missatge = &amp;quot;Hola 3&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Quan s'uneixen diverses cadenes de text és habitual oblidar afegir un espai de separació entre les paraules:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = &amp;quot;Món&amp;quot;;&lt;br /&gt;
var missatge = missatge1 + missatge2; // missatge = &amp;quot;HolaMón&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els espais en blanc es poden afegir al final o al principi de les cadenes i també es poden indicar forma explícita:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = &amp;quot;Món&amp;quot;;&lt;br /&gt;
var missatge = missatge1 + &amp;quot; &amp;quot; + missatge2; // missatge = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''toUpperCase()''', transforma tots els caràcters de la cadena als seus corresponents caràcters en majúscules:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = missatge1.toUpperCase(); // missatge2 = &amp;quot;HOLA&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''toLowerCase()''', transforma tots els caràcters de la cadena als seus corresponents caràcters en minúscules:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;HOLA&amp;quot;;&lt;br /&gt;
var missatge2 = missatge1.toLowerCase(); // missatge2 = &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''charAt(posició)''', obté el caràcter que es troba en la posició indicada:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var lletra = missatge.charAt(0); // lletra = H&lt;br /&gt;
lletra = missatge.charAt(2); // lletra = l&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''indexOf(caracter)''', calcula la posició en la qual es troba el caràcter indicat dins de la cadena de text. Si el caràcter s'inclou diverses vegades dins de la cadena de text, es retorna la seva primera posició començant a buscar des de l'esquerra. Si la cadena no conté el caràcter, la funció retorna el valor -1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var posicion = missatge.indexOf('a'); // posicion = 3&lt;br /&gt;
posicion = missatge.indexOf('b'); // posicion = -1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La seva funció anàloga és lastIndexOf():&lt;br /&gt;
&lt;br /&gt;
'''lastIndexOf(caracter'''), calcula l'última posició en la qual es troba el caràcter indicat dins de la cadena de text. Si la cadena no conté el caràcter, la funció retorna el valor -1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var posicion = missatge.lastIndexOf('a'); // posicion = 3&lt;br /&gt;
posicion = missatge.lastIndexOf('b'); // posicion = -1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La funció lastIndexOf() comença la seva cerca des del final de la cadena cap al principi, encara que la posició retornada és la correcta començant a explicar des del principi de la paraula.&lt;br /&gt;
&lt;br /&gt;
'''substring(inici, final)''', extreu una porció d'una cadena de text. El segon paràmetre és opcional. Si només s'indica el paràmetre inicio, la funció retorna la part de la cadena original corresponent des d'aquesta posició fins al final:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(2); // porcion = &amp;quot;la Món&amp;quot;&lt;br /&gt;
porcion = missatge.substring(5); // porcion = &amp;quot;Món&amp;quot;&lt;br /&gt;
porcion = missatge.substring(7); // porcion = &amp;quot;ndo&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si s'indica un inici negatiu, es retorna la mateixa cadena original:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(-2); // porcion = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Quan s'indica l'inici i el final, es retorna la part de la cadena original compresa entre la posició inicial i la immediatament anterior a la posició final (és a dir, la posició inicio està inclosa i la posició final no):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(1, 8); // porcion = &amp;quot;ona Mun&amp;quot;&lt;br /&gt;
porcion = missatge.substring(3, 4); // porcion = &amp;quot;a&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si s'indica un final més petit que l'inici, Javascript els considera de forma inversa, ja que automàticament assigna el valor més petit a l'inici i el més gran al final:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(5, 0); // porcion = &amp;quot;Hola &amp;quot;&lt;br /&gt;
porcion = missatge.substring(0, 5); // porcion = &amp;quot;Hola &amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''split(separador'''), converteix una cadena de text en un array de cadenes de text. La funció parteix la cadena de text determinant els seus trossos a partir del caràcter separador indicat:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món, sóc una cadena de text!&amp;quot;;&lt;br /&gt;
var paraules = missatge.split(&amp;quot; &amp;quot;);&lt;br /&gt;
// paraules = [&amp;quot;Hola&amp;quot;, &amp;quot;Món,&amp;quot;, &amp;quot;sóc&amp;quot;, &amp;quot;una&amp;quot;, &amp;quot;cadena&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;text!&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Amb aquesta funció es poden extreure fàcilment les lletres que formen una paraula:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var paraula = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var lletres = paraula.split(&amp;quot;&amp;quot;); // lletres = [&amp;quot;H&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;a&amp;quot;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Funcions d'arrays ===&lt;br /&gt;
'''length''', calcula el nombre d'elements d'un array&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var vocals = [&amp;quot;a&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;o&amp;quot;];&lt;br /&gt;
var numeroVocales = vocals.length; // numeroVocales = 5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''concat()''', s'empra per concatenar els elements de diversos arrays&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array1 = [1, 2, 3];&lt;br /&gt;
array2 = array1.concat(4, 5, 6); // array2 = [1, 2, 3, 4, 5, 6]&lt;br /&gt;
array3 = array1.concat([4, 5, 6]); // array3 = [1, 2, 3, 4, 5, 6]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''join(separador)''', és la funció contrària a split(). Uneix tots els elements d'un array per formar una cadena de text. Per unir els elements s'utilitza el caràcter separador indicat&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [&amp;quot;hola&amp;quot;, &amp;quot;món&amp;quot;];&lt;br /&gt;
var missatge = array.join(&amp;quot;&amp;quot;); // missatge = &amp;quot;holamundo&amp;quot;&lt;br /&gt;
missatge = array.join(&amp;quot; &amp;quot;); // missatge = &amp;quot;hola món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''pop()''', elimina l'últim element del array i ho retorna. El array original es modifica i la seva longitud disminueix en 1 element.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
var ultimo = array.pop();&lt;br /&gt;
// ara array = [1, 2], ultimo = 3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''push()''', afegeix un element al final del array. El array original es modifica i augmenta la seva longitud en 1 element. (També és possible afegir més d'un element alhora)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
array.push(4);&lt;br /&gt;
// ara array = [1, 2, 3, 4]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''shift()''', elimina el primer element del array i ho retorna. El array original es veu modificat i la seva longitud disminuïda en 1 element.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
var primer = array.shift();&lt;br /&gt;
// ara array = [2, 3], primer = 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''unshift()''', afegeix un element al principi del array. El array original es modifica i augmenta la seva longitud en 1 element. (També és possible afegir més d'un element alhora)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
array.unshift(0);&lt;br /&gt;
// ara array = [0, 1, 2, 3]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''reverse()''', modifica un array col·locant els seus elements en l'ordre invers a la seva posició original:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
array.reverse();&lt;br /&gt;
// ara array = [3, 2, 1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''sort()''', ordena els elements del array, tan numèrics com alfabètics.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [4, 2, 1, 3];&lt;br /&gt;
array.sort();&lt;br /&gt;
// ara array = [1, 2, 3, 4]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''splice()''', afegeix i elimina elements.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;Inici&amp;lt;/i&amp;gt; es la posició on començarà a afegir o eliminar.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;Eliminats&amp;lt;/i&amp;gt; es el nombre d'elements que es volven borrar. Si posem un 0, solament afegirà valors.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;Valor1, valor2, …, valorN&amp;lt;/i&amp;gt; son els valor que volem afegir.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3, 4, 5];&lt;br /&gt;
array.splice(1,3);&lt;br /&gt;
// ara array = [1, 5], elimina a partir de la posició 1, tres elements.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array =[1, 2, 3, 4, 5];&lt;br /&gt;
array.splice(2, 0, 2.5);&lt;br /&gt;
//ara el array = [1, 2, 2.5, 3, 4, 5]&lt;br /&gt;
//afegeix a partir de la posició dos el element 2.5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array= [1, 2, 3, 4, 5, 6];&lt;br /&gt;
array.splice(2, 3);&lt;br /&gt;
//Eliminem, a partir del segon element (no inclos) 3 elements&lt;br /&gt;
//ara el array = [1, 2, 6]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3, 4, 5];&lt;br /&gt;
array.splice(1, 3, &amp;quot;two&amp;quot;, &amp;quot;three&amp;quot;, &amp;quot;four&amp;quot;);&lt;br /&gt;
//Eliminem tres elements a partir del primer element, y afegim 3 més&lt;br /&gt;
//ara el array = [1, &amp;quot;two&amp;quot;, &amp;quot;three&amp;quot;, &amp;quot;four&amp;quot;, 5]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Funcions de nombres ===&lt;br /&gt;
'''NaN''', (de l'anglès, &amp;quot;Not a Number&amp;quot;) Javascript empra el valor NaN per indicar un valor numèric no definit (per exemple, la divisió 0/0).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 0;&lt;br /&gt;
var numero2 = 0;&lt;br /&gt;
alert(numero1/numero2); // es mostra el valor NaN&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''isNaN()''', permet protegir a l'aplicació de possibles valors numèrics no definits&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 0;&lt;br /&gt;
var numero2 = 0;&lt;br /&gt;
if(isNaN(numero1/numero2)) {&lt;br /&gt;
alert(&amp;quot;La divisió no està definida per als nombres indicats&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
alert(&amp;quot;La divisió és igual a =&amp;gt; &amp;quot; + numero1/numero2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''Infinity''', fa referència a un valor numèric infinit i positiu (també existeix el valor –Infinity per als infinits negatius)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 10;&lt;br /&gt;
var numero2 = 0;&lt;br /&gt;
alert(numero1/numero2); // es mostra el valor Infinity&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''toFixed(digits)''', retorna el nombre original amb punts decimals com els indicats pel paràmetre digits i realitza els arrodoniments necessaris. Es tracta d'una funció molt útil per exemple per mostrar preus.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 4564.34567;&lt;br /&gt;
numero1.toFixed(2); // 4564.35&lt;br /&gt;
numero1.toFixed(6); // 4564.345670&lt;br /&gt;
numero1.toFixed(); // 4564&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conversió de tipus ===&lt;br /&gt;
No és capaç de convertir un string en nombre (tret que el string sigui solament un nombre). Per a això existeixen dues funcions preconstruidas en Javascript que ens permeten convertir un string en nombre enter o decimal, amb dues limitacions:&lt;br /&gt;
Ha d'aparèixer com string el nombre (sencer o decimal) que volem convertir.&lt;br /&gt;
Ha d'aparèixer al principi del string.&lt;br /&gt;
'''parseInt(String)''' --&amp;gt; converteix a integer&lt;br /&gt;
'''parseFloat(String)''' --&amp;gt; Converteix a Float&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parseInt(&amp;quot;4.33333&amp;quot;); --&amp;gt; 4&lt;br /&gt;
parseFloat(&amp;quot;4.333&amp;quot;); --&amp;gt; 4.333&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
=== Exercici : Arrays ===&lt;br /&gt;
Crear un array anomenat mesos i que emmagatzemi el nom dels dotze mesos de l'any. Mostrar per pantalla els dotze noms utilitzant la funció alert().&lt;br /&gt;
&lt;br /&gt;
:[[Solució Exercici Arrays]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici : Operadors ===&lt;br /&gt;
A partir del següent array que es proporciona: &lt;br /&gt;
&amp;lt;pre&amp;gt;var valors = [true, 5, false, &amp;quot;hola&amp;quot;, &amp;quot;adios&amp;quot;, 2];&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Determinar quin dels dos elements de text és major&lt;br /&gt;
* Utilitzant exclusivament els dos valors booleans del array, determinar els operadors necessaris per obtenir un resultat true i un altre resultat false&lt;br /&gt;
* Determinar el resultat de les cinc operacions matemàtiques realitzades amb els dos elements numèrics&lt;br /&gt;
&lt;br /&gt;
:[[Solució Exercici Operadors]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici DNI ===&lt;br /&gt;
El càlcul de la lletra del Document Nacional d'Identitat (DNI) és un procés matemàtic senzill que es basa a obtenir la resta de la divisió sencera del nombre de DNI i el número 23. A partir de la resta de la divisió, s'obté la lletra seleccionant-la dins d'un array de lletres.&lt;br /&gt;
El array de lletres és:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var lletres = ['T', 'R', 'W', 'A', 'G', 'M', 'I', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'I', 'T'];&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per tant si la resta de la divisió és 0, la lletra del DNI és la T i si la resta és 3 la lletra és l'A. Amb aquestes dades, elaborar un petit script que:&lt;br /&gt;
* Emmagatzemi en una variable el nombre de DNI indicat per l'usuari i en una altra variable la lletra del DNI que s'ha indicat. (Pista: si es vol demanar directament a l'usuari que indiqui el seu nombre i la seva lletra, es pot utilitzar la funció prompt())&lt;br /&gt;
* En primer lloc (i en una sola instrucció) s'ha de comprovar si el nombre és menor que 0 o major que 99999999. Si aquest és el cas, es mostra un missatge a l'usuari indicant que el nombre proporcionat no és vàlid i el programa no mostra més missatges.&lt;br /&gt;
* Si el nombre és vàlid, es calcula la lletra que li correspon segons el mètode explicat anteriorment.&lt;br /&gt;
* Una vegada calculada la lletra, s'ha de comparar amb la lletra indicada per l'usuari. Si no coincideixen, es mostra un missatge a l'usuari dient-li que la lletra que ha indicat no és correcta. En un altre cas, es mostra un missatge indicant que el nombre i la lletra de DNI són correctes.&lt;br /&gt;
&lt;br /&gt;
:[[Solució DNI]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Factorial ===&lt;br /&gt;
El factorial d'un nombre enter n és una operació matemàtica que consisteix a multiplicar tots els factors n x (n-1) x (n-2) x ... x 1. Així, el factorial de 5 (escrit com 5!) és igual a: 5! = 5 x 4 x 3 x 2 x 1 = 120&lt;br /&gt;
Utilitzant l'estructura for, crear un script que calculi el factorial d'un nombre enter.&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
:[[Solució Factorial]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Exercici de Cadenes ===&lt;br /&gt;
Escriure funcions que donades dues cadenes de caràcters:&lt;br /&gt;
a) Indiqui si la segona cadena és una subcadena de la primera. Per exemple, ’cadena’ és una&lt;br /&gt;
subcadena de ’subcadena’.&lt;br /&gt;
b) Retorni la que sigui anterior en ordre alfábetico. Per exemple, si rep ’kde’ i ’gnome’&lt;br /&gt;
ha de retornar ’gnome’.&lt;br /&gt;
&lt;br /&gt;
:[[Solució cadenes]]&lt;br /&gt;
&lt;br /&gt;
=== Joc d'adivinació ===&lt;br /&gt;
Considerem el següent joc entre els jugadors A (endeví) y P (pensador): P pensa un nombre entre 1 y 1000. A intenta adivinar-ho mitjançant aproximacions fins que adivina el número. &lt;br /&gt;
Suposem que la màquina interpreta el paper d'endeví i l'usuari ha de pensar el número. El pensador només pot donar 3 tipus de respostes per cada nombre proposat per l'endeví:&lt;br /&gt;
* &amp;quot;MAJOR&amp;quot; : vol dir que el numero proposat pel l'endeví és major que el que ha pensat.&lt;br /&gt;
* &amp;quot;MENOR&amp;quot; : vol dir que el numero proposat pel l'endeví és menor que el que ha pensat.&lt;br /&gt;
* &amp;quot;OK&amp;quot; : vol dir que ha adivinat el número. &lt;br /&gt;
&lt;br /&gt;
:[[Solució Joc d'adivinació]]&lt;br /&gt;
&lt;br /&gt;
=== Palíndrom ===&lt;br /&gt;
Volem sapiguer si una determinada paraula o frase és un [http://es.wikipedia.org/wiki/Pal%C3%ADndromo palíndrom]. Escriu un programa que demani una text i aquest indiqui si és o no palíndrom.&lt;br /&gt;
&lt;br /&gt;
:[[Solució Palíndrom]]&lt;br /&gt;
&lt;br /&gt;
=== Triangle bonic ===&lt;br /&gt;
Utilitzant bucles i amb els dígits {0...9} es poden dibuixar triangles com el següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         1 &lt;br /&gt;
        232&lt;br /&gt;
       34543&lt;br /&gt;
      4567654&lt;br /&gt;
     567898765&lt;br /&gt;
    67890109876&lt;br /&gt;
   7890123210987&lt;br /&gt;
  890123454321098&lt;br /&gt;
 90123456765432109&lt;br /&gt;
0123456789876543210&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
T'atreveixes?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:[[Solució Triangle bonic]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Xifrat Julio César ===&lt;br /&gt;
El dictador Julio César utilitzava un codi quan volia mantenir en secret un missatge. El xifrat consistia a substituir la primera lletra de l'alfabet, A, per la quarta, D, i així successivament amb les altres, és a dir, B, per la cinquena, I, la tercera, C, per la sisena, F ...&lt;br /&gt;
&lt;br /&gt;
L'alfabet llatí que utilitzava Julio César constava de 21 lletres, per tant la substitució de lletres per xifrar o desxifrar missatges queda descrita en la taula següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Alfabet original : A B C D E F G H I K L M N O P Q R S T V&lt;br /&gt;
Alfabet xifrat   : D E F G H I K L M N O P Q R S T V A B C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aquest tipus de xifrat és un codi de rotació, on la clau de rotació és 3.&lt;br /&gt;
&lt;br /&gt;
Escriu un programa que permeti xifrar o desxifrar utilitzant un codi de rotació. La clau del codi podrà triar-se.&lt;br /&gt;
&lt;br /&gt;
:[[Solució Xifrat]]&lt;br /&gt;
&lt;br /&gt;
=== Password segur? ===&lt;br /&gt;
Volem saber si una contrasenya és segura. Per tal que sigui segura ha de complir les següents regles:&lt;br /&gt;
* Ha de contenir almenys una vocal.&lt;br /&gt;
* No ha de tenir tres vocals consecutives o tres consonants consecutives.&lt;br /&gt;
* No ha de tenir dues ocurrències consecutives de la mateixa lletra, excepte per ‘ee’ o ‘oo’.&lt;br /&gt;
* La longitud mínima és de 6 caràcters i la màxima de 10.&lt;br /&gt;
* Els espais en blanc no estan permesos&lt;br /&gt;
&lt;br /&gt;
:[[Solució Password segur?]]&lt;br /&gt;
&lt;br /&gt;
=== Separador de milers ===&lt;br /&gt;
Escriure una funció que rebi una cadena que conté un llarg nombre enter i retorni una cadena amb el nombre i les separacions de milers. Per exemple, si rep ’1234567890’, ha de retornar ’1.234.567.890’.&lt;br /&gt;
&lt;br /&gt;
:[[Solució Separador de milers]]&lt;br /&gt;
&lt;br /&gt;
=== Instruens Fabulam ===&lt;br /&gt;
Instruens Fabulam és la manera de dibuixar un quadre (o taula) en idioma Llatí. Això és el que has de fer per a aquest problema.&lt;br /&gt;
Cada descripció comença amb una línia d'encapçalat que conté un o més caràcters que defineixen el nombre i l'alineament de de les columnes de la taula. &lt;br /&gt;
Els caràcters de l'encapçalat són:&lt;br /&gt;
* ‘&amp;lt;’ justificació per esquerra&lt;br /&gt;
* ’=’ justificació per central&lt;br /&gt;
* ‘&amp;gt;’ justificació per dreta&lt;br /&gt;
Després de l'encapçalat hi ha almenys dos i com a màxim 21 línies de dades que contenen les entrades de cada fila.&lt;br /&gt;
Cada línia de dades consisteix en una o més entrades (no buides) separades per un ampersand (‘&amp;amp;’), on el nombre d'entrades és igual al nombre de columnes definides en l'encapçalat.&lt;br /&gt;
La primera línia conté els títols de les columnes, i les línies de dades restants contenen les entrades del cos de la taula. Els  espais poden aparèixer dins d'una entrada, però mai al principi ni al final de l'entrada. Els caràcters '&amp;lt;', '=', '&amp;gt;', '&amp;amp;', i 'comilles simples' no apareixeran en l'entrada excepte en els llocs indicats a dalt.&lt;br /&gt;
Per cada descripció de taula, desplegui la taula usant el format exacte mostrat en l'exemple. Noti que: &lt;br /&gt;
* L'ample total de la taula no excedirà els 79 caràcters (sense explicar la fi-de-línia).&lt;br /&gt;
* Els guions ('-') són usats per dibuixar línies horitzontals, no ('_'). El signe d'arrova ('@') apareix en cada cantonada. El signe de summa (‘+’) apareix en una intersecció entre la línia que separa el títol i el cos de la taula.&lt;br /&gt;
* Les entrades d'una columna estan separades pel caràcter (‘|’) per exactament un espai.&lt;br /&gt;
* Si una entrada centrada no està exactament centrada en una columna, l'espai extra ha d'anar a la dreta de l'entrada.&lt;br /&gt;
Exemples:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció Instruens Fabulam:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&lt;br /&gt;
What is the answer?&lt;br /&gt;
42&lt;br /&gt;
&lt;br /&gt;
Quadre:&lt;br /&gt;
@---------------------@&lt;br /&gt;
| What is the answer? |&lt;br /&gt;
|---------------------|&lt;br /&gt;
|                     |&lt;br /&gt;
|                   42|&lt;br /&gt;
@---------------------@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;gt;&lt;br /&gt;
Tweedledum&amp;amp;Tweedledee&lt;br /&gt;
&amp;quot;Knock, knock.&amp;quot;&amp;amp;&amp;quot;Who's there?&amp;quot;&lt;br /&gt;
&amp;quot;Boo.&amp;quot;&amp;amp;&amp;quot;Boo who?&amp;quot;&lt;br /&gt;
&amp;quot;Don't cry, it's only me.&amp;quot;&amp;amp;(groan)&lt;br /&gt;
&lt;br /&gt;
Quadre:&lt;br /&gt;
@---------------------------------------------@&lt;br /&gt;
| Tweedledum                 |     Tweedledee |&lt;br /&gt;
|----------------------------+----------------|&lt;br /&gt;
| &amp;quot;Knock, knock.&amp;quot;            | &amp;quot;Who's there?&amp;quot; |&lt;br /&gt;
| &amp;quot;Boo.&amp;quot;                     |     &amp;quot;Boo who?&amp;quot; |&lt;br /&gt;
| &amp;quot;Don't cry, it's only me.&amp;quot; |        (groan) |&lt;br /&gt;
@---------------------------------------------@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;gt;=&amp;gt;&lt;br /&gt;
TITLE&amp;amp;VERSION&amp;amp;OPERATING SYSTEM&amp;amp;PRICE&lt;br /&gt;
Slug Farm&amp;amp;2.0&amp;amp;FreeBSD&amp;amp;49.99&lt;br /&gt;
Figs of Doom&amp;amp;1.7&amp;amp;Linux&amp;amp;9.98&lt;br /&gt;
Smiley Goes to Happy Town&amp;amp;11.0&amp;amp;Windows&amp;amp;129.25&lt;br /&gt;
Wheelbarrow Motocross&amp;amp;1.0&amp;amp;BeOS&amp;amp;34.97&lt;br /&gt;
&lt;br /&gt;
Quadre:&lt;br /&gt;
@-----------------------------------------------------------------@&lt;br /&gt;
| TITLE                     |  VERSION| OPERATING SYSTEM |   PRICE|&lt;br /&gt;
|---------------------------+---------+------------------+--------|&lt;br /&gt;
| Slug Farm                 |     2.0 |          FreeBSD |  49.99 | &lt;br /&gt;
| Figs of Doom              |     1.7 |            Linux |   9.98 |&lt;br /&gt;
| Smiley Goes to Happy Town |    11.0 |          Windows | 129.25 |&lt;br /&gt;
| Wheelbarrow Motocross     |     1.0 |             BeOS |  34.97 |&lt;br /&gt;
@-----------------------------------------------------------------@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Nota''': Per emmagatzemar en una sola línea la Descripció pots utilitzar el simbol %: exemple: var d = &amp;quot;&amp;gt;%what is the answer?%42&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:[[Solució Instruens Fabulam]]&lt;br /&gt;
&lt;br /&gt;
== Exercicis per entregar ==&lt;br /&gt;
&lt;br /&gt;
=== Text al revés ===&lt;br /&gt;
Escriu un programa que posi al revés un text donat. S'ha de poder escollir si es vol caràcter a caràcter o paraula a paraula.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
text: &amp;quot;hola a tots&amp;quot;&lt;br /&gt;
caracter a caracter: &amp;quot;stot a aloh&amp;quot;&lt;br /&gt;
paraula a paraula : &amp;quot;tots a hola&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Nombres Romans ===&lt;br /&gt;
Escriu un programa que converteixi un enter positiu en un nombre romà. Assumeix que els nombres a convertir són menors a 3500. Les regles per construir un nombre romà són les que segueixen. En el sistema de nombres romans, i és el símbol per 1, v per 5, x per 10, l per 50, c per 100, d per 500 i m per 1000.&lt;br /&gt;
Les regles per formar numeros romans les tens [http://roble.pntic.mec.es/~msanto1/ortografia/numrom.htm aquí.]&lt;br /&gt;
Exemple: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
entrada : 1990&lt;br /&gt;
sortida : mcmxc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Retrat Robot ===&lt;br /&gt;
A causa de les dificultats de la policia per identificar als sospitosos, fa temps es va decidir substituir als dibuixants tradicionals per un programa que efectua el retrat robot a partir d'una descripció del delinqüent.&lt;br /&gt;
&lt;br /&gt;
El programa prototip requeria descripcions molt simples, on cada línia del dibuix es consigna indicant quantes vegades apareix cada caràcter.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció = &amp;quot;1 9W;1 1|2 1o1 1o2 1|;1@4 1U4 1@;1 1|2 3=2 1|;2 1\5_1/&amp;quot;&lt;br /&gt;
Dibuix:&lt;br /&gt;
 WWWWWWWWW&lt;br /&gt;
 |  O O  |&lt;br /&gt;
@    U    @&lt;br /&gt;
 |  ===  |&lt;br /&gt;
  \_____/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Escriu un programa que llegeixi una cadena de text on se separen pel caràcter ';' la descripció de cada línia del dibuix. El programa ha de donar com resultat el dibuix corresponent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Dibuixos amb asteriscos ===&lt;br /&gt;
&lt;br /&gt;
Escriu un programa que dibuixi per pantalla les següents figures:&lt;br /&gt;
*volcà : composta per línies de 2,4,8,16,32 i 64 asteriscos&lt;br /&gt;
[[Fitxer:volca.png]]&lt;br /&gt;
*Mosaic: Compost per una matriu de 8x8 caràcters.&lt;br /&gt;
[[Fitxer:mosaic.png]]&lt;br /&gt;
*Taulers: Com l'anterior però cada quadrat d'amplària L (nombre de línies)&lt;br /&gt;
[[Fitxer:taulers.png]]&lt;br /&gt;
&lt;br /&gt;
== Bibliografia / Webgrafia  ==&lt;br /&gt;
Luis Llana, Carlos Gregorio, Raquel Martínez, Pedro Palao y C. Pareja, &amp;quot;Ejercicios creativos y recreativos en C++&amp;quot;, Ed. Prentice-Hall, 2002. ISBN 84-205-3211-8.&lt;br /&gt;
&lt;br /&gt;
[http://librosweb.es/javascript/capitulo_3.html Introducció a Javascript] &lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[http://www.internetmania.net/int0/int0.htm Internetmania]&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF3_-_Objectes_predefinits_del_llenguatge_Javascript&amp;diff=7275</id>
		<title>NF3 - Objectes predefinits del llenguatge Javascript</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF3_-_Objectes_predefinits_del_llenguatge_Javascript&amp;diff=7275"/>
				<updated>2016-09-14T20:15:19Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* Intercanvi de missatges entre finestres */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== The Browser Object Model (BOM) ==&lt;br /&gt;
&lt;br /&gt;
Si creus que JavaScript viu dins del navegador de web, és parcialment correcte, és cert que el navegador web és l'amfitrió pel vostres programes JavaScript, però els vostres programes mai interaccionaran directament amb el navegador web. En comptes d'això s'ha de treballar amb una col·lecció d'objectes JavaScript que actuen com un intermediari entre el vostre JavaScript i el navegador web. Aquesta col·lecció d'objectes s'anomena BOM(Model d'Objecte del Navegador). El seu objectiu és proporcionar una interfície simple, compatible entre els programes javascript i el navegador web.&lt;br /&gt;
&lt;br /&gt;
Els programes escrits per una plataforma (com l'UNIX) no funcionen en una altra plataforma (com Windows) sense molta feina de conversió. Això és a causa que utilitzen una interfície de programació molt diferent per dur a terme la mateixa tasca. Considerem ara la indústria dels navegadors web. El codi Javascript que crea per a l'Internet Explorer ha de ser capaç de funcionar a la perfecció en el Netscape Navigator. Pots fins i tot utilitzar el codi que va escriure per al navegador en Linux amb Internet Explorer en Macintosh. Això és a causa que tots dos navegadors són compatibles amb la mateixa interfície de programació, és a dir, el model d'objectes del navegador.&lt;br /&gt;
&lt;br /&gt;
El model d'objectes del navegador es compon de una gran col·lecció d'objectes que permeten als programes Javascript ficar-se en cada racó del navegador web. Tots els objectes estan disposats en una estructura d'arbre.&lt;br /&gt;
L'objecte de la finestra es troba en la part superior d'aquest arbre i tots els altres objectes del model d'objectes del navegador es pot trobar en el seu interior, BOM és molt gran i bastant complex.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:bom.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
=== Objecte Window ===&lt;br /&gt;
&lt;br /&gt;
L'objecte '''Window''' és compatible amb tots els navegadors. Representa la finestra del navegador.&lt;br /&gt;
Tots els objectes globals de Javascript, funcions i variables es converteixen automàticament en membres de l'objecte Window.&lt;br /&gt;
Les variables globals són propietats de l'objecte Window. Les funcions globals són mètodes de l'objecte Window.&lt;br /&gt;
Fins i tot l'objecte document (de l'HTML DOM) és una propietat de l'objecte Window:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
window.document.getElementById(&amp;quot;header&amp;quot;);&lt;br /&gt;
// es igual a:&lt;br /&gt;
document.getElementById(&amp;quot;header&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ara veurem els mètodes i propietats d'aquest objecte:&lt;br /&gt;
&lt;br /&gt;
==== La mida del navegador ====&lt;br /&gt;
&lt;br /&gt;
Hi ha diverses maneres de determinar la mida de la finestra del navegador (viewport) que no inclou les barres de lliscament ni les barres d'eines.&lt;br /&gt;
Segons sigui el teu navegador Chrome, Firefox, Opera o Safari&lt;br /&gt;
* window.innerHeight =  la altura de la finestra&lt;br /&gt;
* window.innerinnerWidth = la amplada de la finestra&lt;br /&gt;
Si el navegador és Internet Explorer 5 o superior:&lt;br /&gt;
* document.documentElement.clientHeight&lt;br /&gt;
* document.documentElement.clientWidth&lt;br /&gt;
* document.body.clientHeight;&lt;br /&gt;
* document.body.clientWidth;&lt;br /&gt;
&lt;br /&gt;
Per solucionar el problema podem fer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var w=window.innerWidth&lt;br /&gt;
|| document.documentElement.clientWidth&lt;br /&gt;
|| document.body.clientWidth;&lt;br /&gt;
&lt;br /&gt;
var h=window.innerHeight&lt;br /&gt;
|| document.documentElement.clientHeight&lt;br /&gt;
|| document.body.clientHeight;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podeu veure tots els métodes en aquesta pàgina : [http://www.w3schools.com/jsref/obj_window.asp  w3schools window]&lt;br /&gt;
&lt;br /&gt;
=== Objecte Navigator ===&lt;br /&gt;
&lt;br /&gt;
L'objecte navigator ens dona informació sobre el navegador utilitzat per l'usuari.&lt;br /&gt;
&lt;br /&gt;
Per veuere els seu métodes i propietats vegeu aquesta pàgina: [http://www.w3schools.com/jsref/obj_navigator.asp w3schools navigator]&lt;br /&gt;
&lt;br /&gt;
=== Objecte History ===&lt;br /&gt;
&lt;br /&gt;
L'objecte History ens dona informació sobre les pàgines visitades.&lt;br /&gt;
&lt;br /&gt;
Per veuere els seu métodes i propietats vegeu aquesta pàgina: [http://www.w3schools.com/jsref/obj_history.asp w3schools history]&lt;br /&gt;
&lt;br /&gt;
=== Objecte Screen ===&lt;br /&gt;
&lt;br /&gt;
L'objecte Screen ens dona informació sobre la pantalla del usuari. Per exemple, la propietat ''screen.availWidth'' ens dona l'altura sense incloure la barra de windows.&lt;br /&gt;
&lt;br /&gt;
Per veuere els seu métodes i propietats vegeu aquesta pàgina: [http://www.w3schools.com/jsref/obj_screen.asp w3schools screen]&lt;br /&gt;
&lt;br /&gt;
=== Objecte Location ===&lt;br /&gt;
&lt;br /&gt;
L'objecte Location ens dona informació sobre la URL actual de la pàgina.&lt;br /&gt;
&lt;br /&gt;
Per veuere els seu métodes i propietats vegeu aquesta pàgina: [http://www.w3schools.com/jsref/obj_location.asp w3schools location]&lt;br /&gt;
&lt;br /&gt;
== Popup Window ==&lt;br /&gt;
Una finestra PopUp és un dels mètodes més antics de mostrar informació (html) a l'usuari. Normalment, només has d'escriure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
window.open(&amp;quot;http://www.infomerce.es&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Y s'obrirà una nova finetra amb la url corresponent. Molts navegadors el que obren és una nova pestanya en comptes d'una finestra separada.&lt;br /&gt;
Moltes pàgines han abusat dels PopUps, per això, els navegadors intenten bloquejar-les i protegir l'usuari. Però, pot ser hi ha situacions on el seu ús està indicat, com per exemple a l'hora de comprar algun producte a una tenda on-line podem conversar via chat amb un dels depenents reals de la botiga per preguntar quelcom.&lt;br /&gt;
&lt;br /&gt;
Perquè és beneficiós?&lt;br /&gt;
* La finestra emergent és independent amb el seu propi entorn de Javascript. Així que el servei de xat no necessita integrar-se amb javascripts del lloc de la tenda. &lt;br /&gt;
* La finestra emergent és molt simple agregar al lloc. És només un petit botó, sense javascripts addicionals per carregar-se.&lt;br /&gt;
* L'element emergent pot persistir fins i tot si l'usuari deixa la pàgina. Per exemple, el depenent avisa a l'usuari que hi ha una oferta especial en una altre pàgina. L'usuari pot navegar amb l'altre finestra sense tancar el xat.&lt;br /&gt;
&lt;br /&gt;
=== Sintaxy de window.open() ===&lt;br /&gt;
&lt;br /&gt;
La sintaxi és: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
window.open(url, name, params)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*url :  La url que es vol mostrar&lt;br /&gt;
*name: El nom de la finestra, pot ser usat com a ''target'' dels formularis.&lt;br /&gt;
*params: Es pot definir molts paràmetres separats tots ell amb una coma.&lt;br /&gt;
&lt;br /&gt;
'''Params:'''&lt;br /&gt;
*left/top (numeric) : Coordenades top/left de la finestra&lt;br /&gt;
*width/heith (numeric) : L'amplada i la llargada de la finestra&lt;br /&gt;
*menubar(yes/no) : Mostra o oculta el menu del navegador&lt;br /&gt;
*toolbar (yes/no) : mostra o oculta les opcions del navegador (pag. endavant, enrera, recàrrega,...)&lt;br /&gt;
*location (yes/no) : mostra o oculta la url&lt;br /&gt;
*status (yes/no) : mostra o oculta la barra d'estat del navegador&lt;br /&gt;
*resizable (yes/no) : Permet o no canviar la mida de la finestra.&lt;br /&gt;
*scrollbars (yes/no) : Mostra o no les barres de lliscament de la finestra.&lt;br /&gt;
&lt;br /&gt;
Exemple: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var p1 = 'scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no'&lt;br /&gt;
var p2 = 'width=0,height=0,left=-1000,top=-1000'&lt;br /&gt;
window.open('/', 'test', p1+p2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Com accedir a la finestra:'''&lt;br /&gt;
Una vegada la finestra s'ha obert, podem canviar el seu contingut des de la finestra 'pare'. Ho podem fer amb el valor retornat per la funció window.open().&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var win = window.open('/', 'exemple', 'width=300,height=300');&lt;br /&gt;
win.focus();&lt;br /&gt;
win.onload = function() {&lt;br /&gt;
  var div = win.document.createElement('div');&lt;br /&gt;
  div.innerHTML = 'Hola a tots!';&lt;br /&gt;
  div.style.fontSize = '30px';&lt;br /&gt;
  win.document.body.insertBefore( div, win.document.body.firstChild );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
També, des de la finestra oberta podem accedir al 'pare' utilitzant la propietat '''window.opener'''. Aquesta propietat la tenen tots els popUps. Les altres finestres contenen el valor ''null''.&lt;br /&gt;
&lt;br /&gt;
== Politica de seguretat : &amp;quot;El mateix Origen&amp;quot; ==&lt;br /&gt;
La política de &amp;quot;mateix origen&amp;quot; limita l'accés d'una finestra a una altra.&lt;br /&gt;
La raó darrere d'això és la seguretat. Si tens ''blabla.com'' en una finestra i gmail.com en un altre, llavors no voldries que un script des de ''blabla.com'' pugui accedir o modificar el teu correu electrònic o executar accions en gmail en nom teu.&lt;br /&gt;
&lt;br /&gt;
L'essència de la política del mateix origen pot formular-se com: les finestres poden comunicar-se entre elles només si són del mateix protocol://domini: port o, en breument, del mateix origen.&lt;br /&gt;
&lt;br /&gt;
Aquest exemples son del mateix origen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://site.com&lt;br /&gt;
http://site.com/&lt;br /&gt;
http://site.com/my/page.html&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquestes altres, en canvi, son s'origen diferent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://www.site.com (another domain)&lt;br /&gt;
http://site.org (another domain)&lt;br /&gt;
https://site.com (another protocol)&lt;br /&gt;
http://site.com:8080 (another port)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
Escriu una pàgina que contingui un iframe de 100px i carrega la url: &amp;quot;http://google.com&amp;quot;. Crea un script i obtè la url del iframe.&lt;br /&gt;
&lt;br /&gt;
[[solució exercici accès prohibit]]&lt;br /&gt;
&lt;br /&gt;
'''No podem llegir propietats d'altres origens però es pot escriure!'''&lt;br /&gt;
Algunes de les propietats es poden modificar.&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
Modifica l'exercici anterior per tal de que l'iframe intenti carregar google, però des de l'script modifica el location per carregar la wikipedia.&lt;br /&gt;
&lt;br /&gt;
:[[solució execici canviar location]]&lt;br /&gt;
&lt;br /&gt;
== Missatges entre diferents finestres ==&lt;br /&gt;
La API per l'intercanvi de missatges entre diferents finestres és compatible amb tots els navegadors moderns, incloent IE8. Permet finestres / marcs de diversos dominis comunicar-se entre si. Per fer-ho s'utilitza el mètode postMessage.&lt;br /&gt;
&lt;br /&gt;
El mètode window.postMessage permet la comunicació entre scripts amb seguretat. Normalment, els scripts de diferents pàgines se'ls permet comunicar si i només si les pàgines on son executats es troben en llocs amb el mateix protocol (http), el mateix port (80 és el valor predeterminat para HTTP), i domini (document.domain ha d'estar configurat a les dues pàgines amb el mateix valor).&lt;br /&gt;
''Window.postMessage proporciona un mecanisme controlat per eludir aquesta restricció'' d'una manera que és segura quan s'usa correctament.&lt;br /&gt;
&lt;br /&gt;
Sintaxi :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
window.postMessage(data, targetDomain)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ''data'' : El missatge a enviar. La especificació diu que pot ser qualsevol tipus d'objecte, però a la pràctica la majoria de navegadors només implementen strings.&lt;br /&gt;
* ''targetDomain'' : el domini de la pàgina a la qual va dirigit el missatge.&lt;br /&gt;
&lt;br /&gt;
'''El receptor del missatge'''&lt;br /&gt;
El receptor del missatge ha d'implementar un event per tal d'agafar la informació:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;test&amp;quot;&amp;gt;Envia'm un missatge!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function listener(event){&lt;br /&gt;
  if ( event.origin !== &amp;quot;http://javascript.info&amp;quot; )&lt;br /&gt;
    return   document.getElementById(&amp;quot;test&amp;quot;).innerHTML = &amp;quot;received: &amp;quot;+ event.data;&lt;br /&gt;
}&lt;br /&gt;
if (window.addEventListener){&lt;br /&gt;
  addEventListener(&amp;quot;message&amp;quot;, listener, false);    //Per altres Navegadors compatibles&lt;br /&gt;
} else {&lt;br /&gt;
  attachEvent(&amp;quot;onmessage&amp;quot;, listener);              //Per al navegador Microsoft Explorer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* event.origin : contè la informació del domini REAL d'on prové el missatge. No hi ha manera de que un hacker ho reemplaci.&lt;br /&gt;
&lt;br /&gt;
Altres propietats de event:&lt;br /&gt;
*event.source : conté la referència a la finestra que t'envia el missatge. Pot contestar al missatge enviat de la següent manera : event.source.postMessage(&amp;quot;missatge de resposta&amp;quot;, event.origin);&lt;br /&gt;
*event.data : El primer paràmetre de postMessage();&lt;br /&gt;
&lt;br /&gt;
Nota: IE8 no deixa comunicar-se entre pestanyes. Només amb iframes.&lt;br /&gt;
&lt;br /&gt;
== L'atac Clickjacking ==&lt;br /&gt;
La idea general és simple.&lt;br /&gt;
&lt;br /&gt;
*Un visitant és atret a la pàgina del mal. No importa com. &amp;quot;Faci clic per obtenir 1000000 $&amp;quot; o el que sigui.&lt;br /&gt;
*La pàgina del mal posa un link &amp;quot;fer-se ric ara&amp;quot; amb z-index = -1. com ho fa?&lt;br /&gt;
**La pàgina inclou un iframe transparent a un domini que estigués visitant la víctima, exemple facebook.com i el posiciona damunt del botó ''m'agrada''. Quan la victima faci un click en m'agrada, també estarà accedint al link del iframe.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
iframe { /* iframe from facebook.com */&lt;br /&gt;
  width:300px;&lt;br /&gt;
  height:100px;&lt;br /&gt;
  position:absolute;&lt;br /&gt;
  top:0; left:0;&lt;br /&gt;
  filter:alpha(opacity=50); /* in real life opacity=0 */&lt;br /&gt;
  opacity:0.5;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Click en el enllaç per ser ric!:&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;iframe src=&amp;quot;/files/tutorial/window/clicktarget.html&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;http://www.google.com&amp;quot; target=&amp;quot;_blank&amp;quot; style=&amp;quot;position:relative;left:20px;z-index:-1&amp;quot;&amp;gt;CLICK ME!&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Serás ric per tota la teva vida!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Els events de teclats son molt més dificils de hackejar degut a que s'està escrivint sobre l'iframe. Llavors, l'usuari de la pàgina quan intenta entrar les dades no veu el que escriu e immediatament pot parar d'escriure o reiniciar el navegador.&lt;br /&gt;
&lt;br /&gt;
'''Com podem prevenir l'atac?'''&lt;br /&gt;
&lt;br /&gt;
Hi ha moltes maneres, però la més senzilla i efectiva és desactivar els iframes si la teva pàgina no els utilitza. com ho fem?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;meta http-equiv=&amp;quot;X-Frame-Options&amp;quot; content=&amp;quot;deny&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
=== Moure finestra ===&lt;br /&gt;
*Crea una pàgina que tingui un botó que mogui la finestra 100 px cap a la dreta. Fes que la mida de la finestra es vagi fent cada vegada més petita s'arriva al costat dret de la pantalla.&lt;br /&gt;
*Amplia l'exercici anterior per tal que es pugui fer el mateix cap a dalt, cap a baix i cap a l'esquerra.&lt;br /&gt;
&lt;br /&gt;
:[[solució Moure Finestra]]&lt;br /&gt;
&lt;br /&gt;
== Exercicis per entregar ==&lt;br /&gt;
=== Scrollbars &amp;amp; Info ===&lt;br /&gt;
* A l'exercici anterior crea un botó per tal que es puguin amagar o mostrar les barres de desplaçament.&lt;br /&gt;
* A més a més mostra tota la informació que puguis del navegador de l'usuari&lt;br /&gt;
* Mostra el numero de pagines visitades. &lt;br /&gt;
* Mostra la url actual, el port i el protocol.&lt;br /&gt;
&lt;br /&gt;
=== Intercanvi de missatges entre finestres ===&lt;br /&gt;
&lt;br /&gt;
* Crea una página en la que pregunti un text a l'usuari. Envia aquest text a una altre pestanya i escriu-la al html.&lt;br /&gt;
* Modifica el programa anterior per tal que la finestra que reb el missatge comuniqui a la finestra que l'envia que l'ha rebut correctament.&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF3_-_Objectes_predefinits_del_llenguatge_Javascript&amp;diff=7274</id>
		<title>NF3 - Objectes predefinits del llenguatge Javascript</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF3_-_Objectes_predefinits_del_llenguatge_Javascript&amp;diff=7274"/>
				<updated>2016-09-14T20:15:09Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* Scrollbars &amp;amp; Info */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== The Browser Object Model (BOM) ==&lt;br /&gt;
&lt;br /&gt;
Si creus que JavaScript viu dins del navegador de web, és parcialment correcte, és cert que el navegador web és l'amfitrió pel vostres programes JavaScript, però els vostres programes mai interaccionaran directament amb el navegador web. En comptes d'això s'ha de treballar amb una col·lecció d'objectes JavaScript que actuen com un intermediari entre el vostre JavaScript i el navegador web. Aquesta col·lecció d'objectes s'anomena BOM(Model d'Objecte del Navegador). El seu objectiu és proporcionar una interfície simple, compatible entre els programes javascript i el navegador web.&lt;br /&gt;
&lt;br /&gt;
Els programes escrits per una plataforma (com l'UNIX) no funcionen en una altra plataforma (com Windows) sense molta feina de conversió. Això és a causa que utilitzen una interfície de programació molt diferent per dur a terme la mateixa tasca. Considerem ara la indústria dels navegadors web. El codi Javascript que crea per a l'Internet Explorer ha de ser capaç de funcionar a la perfecció en el Netscape Navigator. Pots fins i tot utilitzar el codi que va escriure per al navegador en Linux amb Internet Explorer en Macintosh. Això és a causa que tots dos navegadors són compatibles amb la mateixa interfície de programació, és a dir, el model d'objectes del navegador.&lt;br /&gt;
&lt;br /&gt;
El model d'objectes del navegador es compon de una gran col·lecció d'objectes que permeten als programes Javascript ficar-se en cada racó del navegador web. Tots els objectes estan disposats en una estructura d'arbre.&lt;br /&gt;
L'objecte de la finestra es troba en la part superior d'aquest arbre i tots els altres objectes del model d'objectes del navegador es pot trobar en el seu interior, BOM és molt gran i bastant complex.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:bom.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
=== Objecte Window ===&lt;br /&gt;
&lt;br /&gt;
L'objecte '''Window''' és compatible amb tots els navegadors. Representa la finestra del navegador.&lt;br /&gt;
Tots els objectes globals de Javascript, funcions i variables es converteixen automàticament en membres de l'objecte Window.&lt;br /&gt;
Les variables globals són propietats de l'objecte Window. Les funcions globals són mètodes de l'objecte Window.&lt;br /&gt;
Fins i tot l'objecte document (de l'HTML DOM) és una propietat de l'objecte Window:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
window.document.getElementById(&amp;quot;header&amp;quot;);&lt;br /&gt;
// es igual a:&lt;br /&gt;
document.getElementById(&amp;quot;header&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ara veurem els mètodes i propietats d'aquest objecte:&lt;br /&gt;
&lt;br /&gt;
==== La mida del navegador ====&lt;br /&gt;
&lt;br /&gt;
Hi ha diverses maneres de determinar la mida de la finestra del navegador (viewport) que no inclou les barres de lliscament ni les barres d'eines.&lt;br /&gt;
Segons sigui el teu navegador Chrome, Firefox, Opera o Safari&lt;br /&gt;
* window.innerHeight =  la altura de la finestra&lt;br /&gt;
* window.innerinnerWidth = la amplada de la finestra&lt;br /&gt;
Si el navegador és Internet Explorer 5 o superior:&lt;br /&gt;
* document.documentElement.clientHeight&lt;br /&gt;
* document.documentElement.clientWidth&lt;br /&gt;
* document.body.clientHeight;&lt;br /&gt;
* document.body.clientWidth;&lt;br /&gt;
&lt;br /&gt;
Per solucionar el problema podem fer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var w=window.innerWidth&lt;br /&gt;
|| document.documentElement.clientWidth&lt;br /&gt;
|| document.body.clientWidth;&lt;br /&gt;
&lt;br /&gt;
var h=window.innerHeight&lt;br /&gt;
|| document.documentElement.clientHeight&lt;br /&gt;
|| document.body.clientHeight;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podeu veure tots els métodes en aquesta pàgina : [http://www.w3schools.com/jsref/obj_window.asp  w3schools window]&lt;br /&gt;
&lt;br /&gt;
=== Objecte Navigator ===&lt;br /&gt;
&lt;br /&gt;
L'objecte navigator ens dona informació sobre el navegador utilitzat per l'usuari.&lt;br /&gt;
&lt;br /&gt;
Per veuere els seu métodes i propietats vegeu aquesta pàgina: [http://www.w3schools.com/jsref/obj_navigator.asp w3schools navigator]&lt;br /&gt;
&lt;br /&gt;
=== Objecte History ===&lt;br /&gt;
&lt;br /&gt;
L'objecte History ens dona informació sobre les pàgines visitades.&lt;br /&gt;
&lt;br /&gt;
Per veuere els seu métodes i propietats vegeu aquesta pàgina: [http://www.w3schools.com/jsref/obj_history.asp w3schools history]&lt;br /&gt;
&lt;br /&gt;
=== Objecte Screen ===&lt;br /&gt;
&lt;br /&gt;
L'objecte Screen ens dona informació sobre la pantalla del usuari. Per exemple, la propietat ''screen.availWidth'' ens dona l'altura sense incloure la barra de windows.&lt;br /&gt;
&lt;br /&gt;
Per veuere els seu métodes i propietats vegeu aquesta pàgina: [http://www.w3schools.com/jsref/obj_screen.asp w3schools screen]&lt;br /&gt;
&lt;br /&gt;
=== Objecte Location ===&lt;br /&gt;
&lt;br /&gt;
L'objecte Location ens dona informació sobre la URL actual de la pàgina.&lt;br /&gt;
&lt;br /&gt;
Per veuere els seu métodes i propietats vegeu aquesta pàgina: [http://www.w3schools.com/jsref/obj_location.asp w3schools location]&lt;br /&gt;
&lt;br /&gt;
== Popup Window ==&lt;br /&gt;
Una finestra PopUp és un dels mètodes més antics de mostrar informació (html) a l'usuari. Normalment, només has d'escriure:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
window.open(&amp;quot;http://www.infomerce.es&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Y s'obrirà una nova finetra amb la url corresponent. Molts navegadors el que obren és una nova pestanya en comptes d'una finestra separada.&lt;br /&gt;
Moltes pàgines han abusat dels PopUps, per això, els navegadors intenten bloquejar-les i protegir l'usuari. Però, pot ser hi ha situacions on el seu ús està indicat, com per exemple a l'hora de comprar algun producte a una tenda on-line podem conversar via chat amb un dels depenents reals de la botiga per preguntar quelcom.&lt;br /&gt;
&lt;br /&gt;
Perquè és beneficiós?&lt;br /&gt;
* La finestra emergent és independent amb el seu propi entorn de Javascript. Així que el servei de xat no necessita integrar-se amb javascripts del lloc de la tenda. &lt;br /&gt;
* La finestra emergent és molt simple agregar al lloc. És només un petit botó, sense javascripts addicionals per carregar-se.&lt;br /&gt;
* L'element emergent pot persistir fins i tot si l'usuari deixa la pàgina. Per exemple, el depenent avisa a l'usuari que hi ha una oferta especial en una altre pàgina. L'usuari pot navegar amb l'altre finestra sense tancar el xat.&lt;br /&gt;
&lt;br /&gt;
=== Sintaxy de window.open() ===&lt;br /&gt;
&lt;br /&gt;
La sintaxi és: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
window.open(url, name, params)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*url :  La url que es vol mostrar&lt;br /&gt;
*name: El nom de la finestra, pot ser usat com a ''target'' dels formularis.&lt;br /&gt;
*params: Es pot definir molts paràmetres separats tots ell amb una coma.&lt;br /&gt;
&lt;br /&gt;
'''Params:'''&lt;br /&gt;
*left/top (numeric) : Coordenades top/left de la finestra&lt;br /&gt;
*width/heith (numeric) : L'amplada i la llargada de la finestra&lt;br /&gt;
*menubar(yes/no) : Mostra o oculta el menu del navegador&lt;br /&gt;
*toolbar (yes/no) : mostra o oculta les opcions del navegador (pag. endavant, enrera, recàrrega,...)&lt;br /&gt;
*location (yes/no) : mostra o oculta la url&lt;br /&gt;
*status (yes/no) : mostra o oculta la barra d'estat del navegador&lt;br /&gt;
*resizable (yes/no) : Permet o no canviar la mida de la finestra.&lt;br /&gt;
*scrollbars (yes/no) : Mostra o no les barres de lliscament de la finestra.&lt;br /&gt;
&lt;br /&gt;
Exemple: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var p1 = 'scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no'&lt;br /&gt;
var p2 = 'width=0,height=0,left=-1000,top=-1000'&lt;br /&gt;
window.open('/', 'test', p1+p2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Com accedir a la finestra:'''&lt;br /&gt;
Una vegada la finestra s'ha obert, podem canviar el seu contingut des de la finestra 'pare'. Ho podem fer amb el valor retornat per la funció window.open().&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var win = window.open('/', 'exemple', 'width=300,height=300');&lt;br /&gt;
win.focus();&lt;br /&gt;
win.onload = function() {&lt;br /&gt;
  var div = win.document.createElement('div');&lt;br /&gt;
  div.innerHTML = 'Hola a tots!';&lt;br /&gt;
  div.style.fontSize = '30px';&lt;br /&gt;
  win.document.body.insertBefore( div, win.document.body.firstChild );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
També, des de la finestra oberta podem accedir al 'pare' utilitzant la propietat '''window.opener'''. Aquesta propietat la tenen tots els popUps. Les altres finestres contenen el valor ''null''.&lt;br /&gt;
&lt;br /&gt;
== Politica de seguretat : &amp;quot;El mateix Origen&amp;quot; ==&lt;br /&gt;
La política de &amp;quot;mateix origen&amp;quot; limita l'accés d'una finestra a una altra.&lt;br /&gt;
La raó darrere d'això és la seguretat. Si tens ''blabla.com'' en una finestra i gmail.com en un altre, llavors no voldries que un script des de ''blabla.com'' pugui accedir o modificar el teu correu electrònic o executar accions en gmail en nom teu.&lt;br /&gt;
&lt;br /&gt;
L'essència de la política del mateix origen pot formular-se com: les finestres poden comunicar-se entre elles només si són del mateix protocol://domini: port o, en breument, del mateix origen.&lt;br /&gt;
&lt;br /&gt;
Aquest exemples son del mateix origen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://site.com&lt;br /&gt;
http://site.com/&lt;br /&gt;
http://site.com/my/page.html&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquestes altres, en canvi, son s'origen diferent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://www.site.com (another domain)&lt;br /&gt;
http://site.org (another domain)&lt;br /&gt;
https://site.com (another protocol)&lt;br /&gt;
http://site.com:8080 (another port)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
Escriu una pàgina que contingui un iframe de 100px i carrega la url: &amp;quot;http://google.com&amp;quot;. Crea un script i obtè la url del iframe.&lt;br /&gt;
&lt;br /&gt;
[[solució exercici accès prohibit]]&lt;br /&gt;
&lt;br /&gt;
'''No podem llegir propietats d'altres origens però es pot escriure!'''&lt;br /&gt;
Algunes de les propietats es poden modificar.&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
Modifica l'exercici anterior per tal de que l'iframe intenti carregar google, però des de l'script modifica el location per carregar la wikipedia.&lt;br /&gt;
&lt;br /&gt;
:[[solució execici canviar location]]&lt;br /&gt;
&lt;br /&gt;
== Missatges entre diferents finestres ==&lt;br /&gt;
La API per l'intercanvi de missatges entre diferents finestres és compatible amb tots els navegadors moderns, incloent IE8. Permet finestres / marcs de diversos dominis comunicar-se entre si. Per fer-ho s'utilitza el mètode postMessage.&lt;br /&gt;
&lt;br /&gt;
El mètode window.postMessage permet la comunicació entre scripts amb seguretat. Normalment, els scripts de diferents pàgines se'ls permet comunicar si i només si les pàgines on son executats es troben en llocs amb el mateix protocol (http), el mateix port (80 és el valor predeterminat para HTTP), i domini (document.domain ha d'estar configurat a les dues pàgines amb el mateix valor).&lt;br /&gt;
''Window.postMessage proporciona un mecanisme controlat per eludir aquesta restricció'' d'una manera que és segura quan s'usa correctament.&lt;br /&gt;
&lt;br /&gt;
Sintaxi :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
window.postMessage(data, targetDomain)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ''data'' : El missatge a enviar. La especificació diu que pot ser qualsevol tipus d'objecte, però a la pràctica la majoria de navegadors només implementen strings.&lt;br /&gt;
* ''targetDomain'' : el domini de la pàgina a la qual va dirigit el missatge.&lt;br /&gt;
&lt;br /&gt;
'''El receptor del missatge'''&lt;br /&gt;
El receptor del missatge ha d'implementar un event per tal d'agafar la informació:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;test&amp;quot;&amp;gt;Envia'm un missatge!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function listener(event){&lt;br /&gt;
  if ( event.origin !== &amp;quot;http://javascript.info&amp;quot; )&lt;br /&gt;
    return   document.getElementById(&amp;quot;test&amp;quot;).innerHTML = &amp;quot;received: &amp;quot;+ event.data;&lt;br /&gt;
}&lt;br /&gt;
if (window.addEventListener){&lt;br /&gt;
  addEventListener(&amp;quot;message&amp;quot;, listener, false);    //Per altres Navegadors compatibles&lt;br /&gt;
} else {&lt;br /&gt;
  attachEvent(&amp;quot;onmessage&amp;quot;, listener);              //Per al navegador Microsoft Explorer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* event.origin : contè la informació del domini REAL d'on prové el missatge. No hi ha manera de que un hacker ho reemplaci.&lt;br /&gt;
&lt;br /&gt;
Altres propietats de event:&lt;br /&gt;
*event.source : conté la referència a la finestra que t'envia el missatge. Pot contestar al missatge enviat de la següent manera : event.source.postMessage(&amp;quot;missatge de resposta&amp;quot;, event.origin);&lt;br /&gt;
*event.data : El primer paràmetre de postMessage();&lt;br /&gt;
&lt;br /&gt;
Nota: IE8 no deixa comunicar-se entre pestanyes. Només amb iframes.&lt;br /&gt;
&lt;br /&gt;
== L'atac Clickjacking ==&lt;br /&gt;
La idea general és simple.&lt;br /&gt;
&lt;br /&gt;
*Un visitant és atret a la pàgina del mal. No importa com. &amp;quot;Faci clic per obtenir 1000000 $&amp;quot; o el que sigui.&lt;br /&gt;
*La pàgina del mal posa un link &amp;quot;fer-se ric ara&amp;quot; amb z-index = -1. com ho fa?&lt;br /&gt;
**La pàgina inclou un iframe transparent a un domini que estigués visitant la víctima, exemple facebook.com i el posiciona damunt del botó ''m'agrada''. Quan la victima faci un click en m'agrada, també estarà accedint al link del iframe.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
iframe { /* iframe from facebook.com */&lt;br /&gt;
  width:300px;&lt;br /&gt;
  height:100px;&lt;br /&gt;
  position:absolute;&lt;br /&gt;
  top:0; left:0;&lt;br /&gt;
  filter:alpha(opacity=50); /* in real life opacity=0 */&lt;br /&gt;
  opacity:0.5;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Click en el enllaç per ser ric!:&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;iframe src=&amp;quot;/files/tutorial/window/clicktarget.html&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;http://www.google.com&amp;quot; target=&amp;quot;_blank&amp;quot; style=&amp;quot;position:relative;left:20px;z-index:-1&amp;quot;&amp;gt;CLICK ME!&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Serás ric per tota la teva vida!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Els events de teclats son molt més dificils de hackejar degut a que s'està escrivint sobre l'iframe. Llavors, l'usuari de la pàgina quan intenta entrar les dades no veu el que escriu e immediatament pot parar d'escriure o reiniciar el navegador.&lt;br /&gt;
&lt;br /&gt;
'''Com podem prevenir l'atac?'''&lt;br /&gt;
&lt;br /&gt;
Hi ha moltes maneres, però la més senzilla i efectiva és desactivar els iframes si la teva pàgina no els utilitza. com ho fem?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;meta http-equiv=&amp;quot;X-Frame-Options&amp;quot; content=&amp;quot;deny&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
=== Moure finestra ===&lt;br /&gt;
*Crea una pàgina que tingui un botó que mogui la finestra 100 px cap a la dreta. Fes que la mida de la finestra es vagi fent cada vegada més petita s'arriva al costat dret de la pantalla.&lt;br /&gt;
*Amplia l'exercici anterior per tal que es pugui fer el mateix cap a dalt, cap a baix i cap a l'esquerra.&lt;br /&gt;
&lt;br /&gt;
:[[solució Moure Finestra]]&lt;br /&gt;
&lt;br /&gt;
== Exercicis per entregar ==&lt;br /&gt;
=== Scrollbars &amp;amp; Info ===&lt;br /&gt;
* A l'exercici anterior crea un botó per tal que es puguin amagar o mostrar les barres de desplaçament.&lt;br /&gt;
* A més a més mostra tota la informació que puguis del navegador de l'usuari&lt;br /&gt;
* Mostra el numero de pagines visitades. &lt;br /&gt;
* Mostra la url actual, el port i el protocol.&lt;br /&gt;
&lt;br /&gt;
=== Intercanvi de missatges entre finestres ===&lt;br /&gt;
&lt;br /&gt;
* Crea una página en la que pregunti un text a l'usuari. Envia aquest text a una altre pestanya i escriu-la al html.&lt;br /&gt;
* Modifica el programa anterior per tal que la finestra que reb el missatge comuniqui a la finestra que l'envia que l'ha rebut correctament.&lt;br /&gt;
&lt;br /&gt;
:[[solució envia missatge]]&lt;br /&gt;
&lt;br /&gt;
:[[solució envia i confirma missatge]]&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Sintaxi_Javascript&amp;diff=7273</id>
		<title>NF2 - Sintaxi Javascript</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Sintaxi_Javascript&amp;diff=7273"/>
				<updated>2016-09-14T20:10:22Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* Exercicis per entregar */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Generalitats ==&lt;br /&gt;
La sintaxi d'un llenguatge de programació es defineix com el conjunt de regles que han de seguir-se en escriure el codi font dels programes per considerar-se com a correctes per a aquest llenguatge de programació.&lt;br /&gt;
&lt;br /&gt;
La sintaxi de Javascript és molt similar a la d'altres llenguatges de programació com Java i C. Les normes bàsiques que defineixen la sintaxi de Javascript són les següents:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;No es tenen en compte els espais en blanc i les noves línies&amp;lt;/b&amp;gt;: com succeeix amb XHTML, l'intèrpret de Javascript ignora qualsevol espai en blanc sobrant, per la qual cosa el codi es pot ordenar de forma adequada per entendre-ho millor (tabulant les línies, afegint espais, creant noves línies, etc.)&lt;br /&gt;
* &amp;lt;b&amp;gt;Es distingeixen les majúscules i minúscules&amp;lt;/b&amp;gt;: igual que succeeix amb la sintaxi de les etiquetes i elements XHTML. No obstant això, si en una pàgina XHTML s'utilitzen indistintament majúscules i minúscules, la pàgina es visualitza correctament, sent l'únic problema la no validació de la pàgina. En canvi, si en Javascript s'intercanvien majúscules i minúscules el script no funciona.&lt;br /&gt;
* &amp;lt;b&amp;gt;No es defineix el tipus de les variables&amp;lt;/b&amp;gt;: en crear una variable, no és necessari indicar el tipus de dada que emmagatzemarà. D'aquesta forma, una mateixa variable pot emmagatzemar diferents tipus de dades durant l'execució del script.&lt;br /&gt;
* &amp;lt;b&amp;gt;No és necessari acabar cada sentència amb el caràcter de punt i coma (;)&amp;lt;/b&amp;gt;: en la majoria de llenguatges de programació, és obligatori acabar cada sentència amb el caràcter ;. Encara que Javascript no obliga a fer-ho, NOSALTRES seguirem la tradició d'acabar cada sentència amb el caràcter del punt i coma (;).&lt;br /&gt;
* &amp;lt;b&amp;gt;Es poden incloure comentaris&amp;lt;/b&amp;gt;: els comentaris s'utilitzen per afegir informació en el codi font del programa. Encara que el contingut dels comentaris no es visualitza per pantalla, si que s'envia al navegador de l'usuari juntament amb la resta del script, per la qual cosa és necessari extremar les precaucions sobre la informació inclosa en els comentaris.&lt;br /&gt;
&lt;br /&gt;
Javascript defineix dos tipus de comentaris: els de una sola línia i els que ocupen diverses línies.&lt;br /&gt;
&lt;br /&gt;
Els comentaris d'una sola línia es defineixen afegint dues barres obliqües (//) al principi de la línia :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// a continuació es mostra un missatge&lt;br /&gt;
&lt;br /&gt;
alert(&amp;quot;missatge de prova&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de comentari de diverses línies:&lt;br /&gt;
&amp;lt;&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Els comentaris de diverses línies són molt útils&lt;br /&gt;
quan es necessita incloure bastant informació&lt;br /&gt;
en els comentaris */&lt;br /&gt;
&lt;br /&gt;
alert(&amp;quot;missatge de prova&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els comentaris multilinia es defineixen tancant el text del comentari entre els símbols /* i */.&lt;br /&gt;
&lt;br /&gt;
== Variables ==&lt;br /&gt;
Les variables en els llenguatges de programació segueixen una lògica similar a les variables utilitzades en altres àmbits com les matemàtiques. Una variable és un element que s'empra per emmagatzemar i fer referència a un altre valor. Gràcies a les variables és possible crear &amp;quot;programes genèrics&amp;quot;, és a dir, programes que funcionen sempre igual independentment dels valors concrets utilitzats.&lt;br /&gt;
&lt;br /&gt;
De la mateixa forma que si en Matemàtiques no existissin les variables no es podrien definir les equacions i fórmules, en programació no es podrien fer programes realment útils sense les variables.&lt;br /&gt;
&lt;br /&gt;
Si no existissin variables, un programa que suma dos nombres podria escriure's com:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
resultat = 3 + 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El programa anterior és tan poc útil que només serveix per al cas en el qual el primer nombre de la summa sigui el 3 i el segon nombre sigui l'1. En qualsevol altre cas, el programa obté un resultat incorrecte.&lt;br /&gt;
&lt;br /&gt;
No obstant això, el programa es pot refer de la següent manera utilitzant variables per emmagatzemar i referir-se a cada nombre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
numero_1 = 3&lt;br /&gt;
numero_2 = 1&lt;br /&gt;
resultat = numero_1 + numero_2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els elements ''numero_1'' i ''numero_2'' són variables que emmagatzemen els valors que utilitza el programa. El resultat es calcula sempre en funció del valor emmagatzemat per les variables, per la qual cosa aquest programa funciona correctament per a qualsevol parell de nombres indicat. Si es modifica el valor de les variables ''numero_1'' i ''numero_2'', el programa segueix funcionant correctament.&lt;br /&gt;
&lt;br /&gt;
Les variables en Javascript es creen mitjançant la paraula reservada '''var'''. D'aquesta forma, l'exemple anterior es pot realitzar en Javascript de la següent manera:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1 = 3;&lt;br /&gt;
var numero_2 = 1;&lt;br /&gt;
var resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La paraula reservada ''var'' solament s'ha d'indicar en definir per primera vegada la variable, la qual cosa es denomina declarar una variable. Quan s'utilitzen les variables en la resta d'instruccions del *script, solament és necessari indicar el seu nom. En altres paraules, en l'exemple anterior seria un error indicar el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1 = 3;&lt;br /&gt;
var numero_2 = 1;&lt;br /&gt;
var resultat = *var numero_1 + *var numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si quan es declara una variable se li assigna també un valor, es diu que la variable ha estat inicialitzada. ''En Javascript no és obligatori inicialitzar les variables'', ja que es poden declarar d'una banda i assignar-los un valor posteriorment. Per tant, l'exemple anterior es pot refer de la següent manera:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1;&lt;br /&gt;
var numero_2;&lt;br /&gt;
&lt;br /&gt;
numero_1 = 3;&lt;br /&gt;
numero_2 = 1;&lt;br /&gt;
&lt;br /&gt;
var resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Una de les característiques més sorprenents de JavaSript per als programadors habituats a altres llenguatges de programació és que tampoc és necessari declarar les variables. En altres paraules, es poden utilitzar variables que no s'han definit anteriorment mitjançant la paraula reservada *var. L'exemple anterior també és correcte en Javascript de la següent forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero_1 = 3;&lt;br /&gt;
var numero_2 = 1;&lt;br /&gt;
&lt;br /&gt;
resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La variable resultat no està declarada, per la qual cosa Javascript crea una variable global (més endavant es veuran les diferències entre variables locals i globals) i li assigna el valor corresponent. De la mateixa forma, també seria correcte el següent codi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
numero_1 = 3;&lt;br /&gt;
numero_2 = 1;&lt;br /&gt;
&lt;br /&gt;
resultat = numero_1 + numero_2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En qualsevol cas, es recomana declarar totes les variables que es vagin a utilitzar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;El nom d'una variable&amp;lt;/u&amp;gt; també es coneix com a identificador i &amp;lt;u&amp;gt;ha de complir les següents normes:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Només pot estar format per lletres, nombres i els símbols $ (dòlar) i _ (guió baix).&lt;br /&gt;
* El primer caràcter no pot ser un nombre.&lt;br /&gt;
&lt;br /&gt;
Per tant, les següents variables tenen noms correctes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var $numero1;&lt;br /&gt;
var _$lletra;&lt;br /&gt;
var $$$*otroNumero;&lt;br /&gt;
var $_a__$4;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
No obstant això, les següents variables tenen identificadors incorrectes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var 1numero; // Comença per un nombre&lt;br /&gt;
var numero;1_123; // Conté un caràcter &amp;quot;;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tipus de variables ===&lt;br /&gt;
Encara que totes les variables de Javascript es creen de la mateixa forma (mitjançant la paraula reservada var), la forma en la qual se'ls assigna un valor depèn del tipus de valor que es vol emmagatzemar (nombres, textos, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Numèriques ====&lt;br /&gt;
S'utilitzen per emmagatzemar valors numèrics enters (anomenats integer en anglès) o decimals (anomenats float en anglès). En aquest cas, el valor s'assigna indicant directament el nombre enter o decimal. Els nombres decimals utilitzen el caràcter . (punt) en comptes de , (coma) per separar la part sencera i la part decimal:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var iva = 16; // variable tipus sencer&lt;br /&gt;
var total = 234.65; // variable tipus decimal&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==== Cadenes de text ====&lt;br /&gt;
S'utilitzen per emmagatzemar caràcters, paraules i/o frases de text. Per assignar el valor a la variable, es tanca el valor entre cometes dobles o simples, per delimitar el seu començament i el seu final:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Benvingut al nostre lloc web&amp;quot;;&lt;br /&gt;
var nombreProducto = 'Producte ABC';&lt;br /&gt;
var letraSeleccionada = 'c';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En ocasions, el text que s'emmagatzema en les variables no és tan senzill. Si per exemple el propi text conté cometes simples o dobles, l'estratègia que se segueix és la de tancar el text amb les cometes (simples o dobles) que no utilitzi el text:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* El contingut de text1 té cometes simples, per&lt;br /&gt;
la qual cosa es tanca amb cometes dobles */&lt;br /&gt;
var text1 = &amp;quot;Una frase amb 'cometes simples' dins&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* El contingut de text2 té cometes dobles, per&lt;br /&gt;
la qual cosa es tanca amb cometes simples */&lt;br /&gt;
var text2 = 'Una frase amb &amp;quot;cometes dobles&amp;quot; dins';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No obstant això, de vegades les cadenes de text contenen tant cometes simples com a dobles. A més, existeixen altres caràcters que són difícils d'incloure en una variable de text (tabulador, ENTER, etc.) Per resoldre aquests problemes, Javascript defineix un mecanisme per incloure de forma senzilla caràcters especials i problemàtics dins d'una cadena de text.&lt;br /&gt;
&lt;br /&gt;
El mecanisme consisteix a substituir el caràcter problemàtic per una combinació simple de caràcters. A continuació es mostra la taula de conversió que s'ha d'utilitzar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Si es vol incloure...	S'ha d'incloure...&lt;br /&gt;
Una nova línia          \n	&lt;br /&gt;
Un tabulador	        \t&lt;br /&gt;
Una cometa simple	\'&lt;br /&gt;
Una cometa doble	\&amp;quot;&lt;br /&gt;
Una barra inclinada	\\&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
D'aquesta forma, l'exemple anterior que contenia cometes simples i dobles dins del text es pot refer de la següent forma:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var text1 = 'Una frase amb \'cometes simples\' dins';&lt;br /&gt;
&lt;br /&gt;
var text2 = &amp;quot;Una frase amb \&amp;quot;cometes dobles\&amp;quot; dins&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Aquest mecanisme de Javascript es denomina &amp;quot;mecanisme de fuita&amp;quot; dels caràcters problemàtics, i és habitual referir-se al fet que els caràcters han estat &amp;quot;escapats&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Arrays ====&lt;br /&gt;
En ocasions, als arrays se'ls anomena vectors, matrius i fins i tot arranjaments. No obstant això, el terme array és el més utilitzat i és una paraula comunament acceptada a l'entorn de la programació.&lt;br /&gt;
&lt;br /&gt;
Un array és una col·lecció de variables, que poden ser totes del mateix tipus o cadascuna d'un tipus diferent. La seva utilitat es comprèn millor amb un exemple senzill: si una aplicació necessita utilitzar els dies de la setmana, es podrien crear set variables de tipus text:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dia1 = &amp;quot;Dilluns&amp;quot;;&lt;br /&gt;
var dia2 = &amp;quot;Dimarts&amp;quot;;&lt;br /&gt;
...&lt;br /&gt;
var dia7 = &amp;quot;Diumenge&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Encara que el codi anterior no és incorrecte, sí que és poc eficient i complica a l'excés la programació. Si en comptes dels dies de la setmana s'hagués de guardar el nom dels mesos de l'any, el nom de tots els països del món o els mesuraments diaris de temperatura dels últims 100 anys, s'haurien de crear desenes o centenars de variables.&lt;br /&gt;
&lt;br /&gt;
En aquest tipus de casos, es poden agrupar totes les variables relacionades en una col·lecció de variables o array. L'exemple anterior es pot refer de la següent forma:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dies = [&amp;quot;Dilluns&amp;quot;, &amp;quot;Dimarts&amp;quot;, &amp;quot;Dimecres&amp;quot;, &amp;quot;Dijous&amp;quot;, &amp;quot;Divendres&amp;quot;, &amp;quot;Dissabte&amp;quot;, &amp;quot;Diumenge&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ara, una única variable anomenada ''dies'' emmagatzema tots els valors relacionats entre si, en aquest cas els dies de la setmana. Per definir un array, s'utilitzen els caràcters [ i ] per delimitar el seu començament i el seu final i s'utilitza el caràcter , (coma) per separar els seus elements:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var nom_array = [valor1, valor2, ...,valorN];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Una vegada definit un array, és molt senzill accedir a cadascun dels seus elements. Cada element s'accedeix indicant la seva posició dins del array. L'única complicació, que és responsable de molts errors quan es comença a programar, és que les posicions dels elements comencen a explicar-se en el 0 i no en l'1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var diaSeleccionat = dies[0]; // diaSeleccionat = &amp;quot;Dilluns&amp;quot;&lt;br /&gt;
&lt;br /&gt;
var altreDia = dies[5]; // altreDia = &amp;quot;Dissabte&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En l'exemple anterior, la primera instrucció vol obtenir el primer element del array. Per a això, s'indica el nom del array i entre claudàtors la posició de l'element dins del array. Com s'ha comentat, ''les posicions del array comencen a partir del 0'', per la qual cosa el primer element ocupa la posició 0 i s'accedeix al mitjançant dias[0].&lt;br /&gt;
&lt;br /&gt;
El valor dies[5] fa referència a l'element que ocupa la sisena posició dins del array dies. Com les posicions comencen a explicar-se en 0, la posició 5 fa referència al sisè element, en aquest cas, el valor Dissabte.&lt;br /&gt;
&lt;br /&gt;
==== Booleans ====&lt;br /&gt;
Les variables de tipus boolean o booleà també es coneixen amb el nom de variables de tipus lògic. El seu funcionament bàsic és molt senzill.&lt;br /&gt;
&lt;br /&gt;
Una variable de tipus boolean emmagatzema un tipus especial de valor que solament pot prendre dos valors: '''true''' (veritable) o '''false''' (fals). No es pot utilitzar per emmagatzemar nombres i tampoc permet guardar cadenes de text.&lt;br /&gt;
&lt;br /&gt;
Els únics valors que poden emmagatzemar aquestes variables són true i false, per la qual cosa no poden utilitzar-se els valors veritable i fals. A continuació es mostra un parell de variables de tipus booleà:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var clientRegistrat = false;&lt;br /&gt;
var iva = true;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Operadors ===&lt;br /&gt;
&lt;br /&gt;
Els operadors permeten manipular el valor de les variables, realitzar operacions matemàtiques amb els seus valors i comparar diferents variables. D'aquesta forma, els operadors permeten als programes realitzar càlculs complexos i prendre decisions lògiques en funció de comparacions i altres tipus de condicions.&lt;br /&gt;
&lt;br /&gt;
==== Assignació ====&lt;br /&gt;
&lt;br /&gt;
L'operador d'assignació és el més utilitzat i el més senzill. Aquest operador s'utilitza per guardar un valor específic en una variable. El símbol utilitzat és = (no confondre amb l'operador == que es veurà més endavant):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 3;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A l'esquerra de l'operador, sempre ha d'indicar-se el nom d'una variable. A la dreta de l'operador, es poden indicar variables, valors, condicions lògiques, etc:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 3;&lt;br /&gt;
var numero2 = 4;&lt;br /&gt;
&lt;br /&gt;
/* Error, l'assignació sempre es realitza a una variable,&lt;br /&gt;
per la qual cosa en l'esquerra no es pot indicar un número */&lt;br /&gt;
5 = numero1;&lt;br /&gt;
&lt;br /&gt;
// Ara, la variable numero1 val 5&lt;br /&gt;
numero1 = 5;&lt;br /&gt;
&lt;br /&gt;
// Ara, la variable numero1 val 4&lt;br /&gt;
numero1 = numero2;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Increment i decrement====&lt;br /&gt;
Aquests dos operadors solament són vàlids per a les variables numèriques i s'utilitzen per incrementar o decrementar en una unitat el valor d'una variable.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
++numero;&lt;br /&gt;
alert(numero); // numero = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L'operador d'increment s'indica mitjançant el prefix ++ en el nom de la variable. El resultat és que el valor d'aquesta variable s'incrementa en una unitat. Per tant, l'anterior exemple és equivalent a:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
numero = numero + 1;&lt;br /&gt;
alert(numero); // numero = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
De forma equivalent, l'operador decrement (indicat com un prefix -- en el nom de la variable) s'utilitza per decrementar el valor de la variable:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
--numero;&lt;br /&gt;
alert(numero); // numero = 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'anterior exemple és equivalent a:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
numero = numero - 1;&lt;br /&gt;
alert(numero); // numero = 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els operadors d'increment i decremento no solament es poden indicar com a prefix del nom de la variable, sinó que també és possible utilitzar-los com a sufix. En aquest cas, el seu comportament és similar però molt diferent. En el següent exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
numero++;&lt;br /&gt;
alert(numero); // numero = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El resultat d'executar el script anterior és el mateix que quan s'utilitza l'operador ++numero, per la qual cosa pot semblar que és equivalent indicar l'operador ++ davant o darrere de l'identificador de la variable. No obstant això, el següent exemple mostra les seves diferències:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
var numero2 = 2;&lt;br /&gt;
numero3 = numero1++ + numero2;&lt;br /&gt;
// numero3 = 7, numero1 = 6&lt;br /&gt;
&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
var numero2 = 2;&lt;br /&gt;
numero3 = ++numero1 + numero2;&lt;br /&gt;
// numero3 = 8, numero1 = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si l'operador ++ s'indica com a prefix de l'identificador de la variable, el seu valor s'incrementa abans de realitzar qualsevol altra operació. Si l'operador ++ s'indica com a sufix de l'identificador de la variable, el seu valor s'incrementa després d'executar la sentència en la qual apareix.&lt;br /&gt;
&lt;br /&gt;
Per tant, en la instrucció numero3 = numero1++ + numero2;, el valor de numero1 s'incrementa després de realitzar l'operació (primer se sumeixi i numero3 val 7, després s'incrementa el valor de numero1 i val 6). No obstant això, en la instrucció numero3 = ++numero1 + numero2;, en primer lloc s'incrementa el valor de numero1 i després es realitza la summa (primer s'incrementa numero1 i val 6, després es realitza la summa i numero3 val 8).&lt;br /&gt;
&lt;br /&gt;
==== Lògics ====&lt;br /&gt;
Els operadors lògics són imprescindibles per realitzar aplicacions complexes, ja que s'utilitzen per prendre decisions sobre les instruccions que hauria d'executar el programa en funció de certes condicions.&lt;br /&gt;
&lt;br /&gt;
El resultat de qualsevol operació que utilitzi operadors lògics sempre és un valor lògic o booleà.&lt;br /&gt;
&lt;br /&gt;
===== Negació =====&lt;br /&gt;
Un dels operadors lògics més utilitzats és el de la negació. S'utilitza per obtenir el valor contrari al valor de la variable:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var visible = true;&lt;br /&gt;
alert(!visible); // Mostra &amp;quot;false&amp;quot; i no &amp;quot;true&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La negació lògica s'obté prefixant el símbol ! a l'identificador de la variable. El funcionament d'aquest operador es resumeix en la següent taula:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
variable	!variable&lt;br /&gt;
true    	false&lt;br /&gt;
false	        true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si la variable original és de tipus booleà, és molt senzill obtenir la seva negació. No obstant això, què succeeix quan la variable és un nombre o una cadena de text? Per obtenir la negació en aquest tipus de variables, es realitza en primer lloc la seva conversió a un valor booleà:&lt;br /&gt;
&lt;br /&gt;
Si la variable conté un nombre, es transforma en false si val 0 i en true per a qualsevol altre nombre (positiu o negatiu, decimal o sencer).&lt;br /&gt;
Si la variable conté una cadena de text, es transforma en false si la cadena és buida (&amp;quot;&amp;quot;) i en true en qualsevol altre cas.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var quantitat = 0;&lt;br /&gt;
buit = !quantitat; // buit = true&lt;br /&gt;
&lt;br /&gt;
quantitat = 2;&lt;br /&gt;
buit = !quantitat; // buit = false&lt;br /&gt;
&lt;br /&gt;
var missatge = &amp;quot;&amp;quot;;&lt;br /&gt;
missatgebuit = !missatge; // missatgebuit = true&lt;br /&gt;
&lt;br /&gt;
missatge = &amp;quot;Benvingut&amp;quot;;&lt;br /&gt;
missatgebuit = !missatge; // missatgebuit = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== AND =====&lt;br /&gt;
L'operació lògica AND obté el seu resultat combinant dos valors booleans. L'operador s'indica mitjançant el símbol &amp;amp;&amp;amp; i el seu resultat solament és true si els dos operands són true:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
variable1	variable2	variable1 &amp;amp;&amp;amp; variable2&lt;br /&gt;
  true	           true	                 true&lt;br /&gt;
  true	           false	         false&lt;br /&gt;
  false	           true	                 false&lt;br /&gt;
  false	           false	         false&lt;br /&gt;
&lt;br /&gt;
var valor1 = true;&lt;br /&gt;
var valor2 = false;&lt;br /&gt;
resultat = valor1 &amp;amp;&amp;amp; valor2; // resultat = false&lt;br /&gt;
&lt;br /&gt;
valor1 = true;&lt;br /&gt;
valor2 = true;&lt;br /&gt;
resultat = valor1 &amp;amp;&amp;amp; valor2; // resultat = true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== OR =====&lt;br /&gt;
L'operació lògica OR també combina dos valors booleans. L'operador s'indica mitjançant el símbol || i el seu resultat és true si algun dels dos operands és true:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
variable1	variable2	variable1 || variable2&lt;br /&gt;
  true	           true	                 true&lt;br /&gt;
  true	           false	         true&lt;br /&gt;
  false	           true	                 true&lt;br /&gt;
  false	           false	         false&lt;br /&gt;
&lt;br /&gt;
var valor1 = true;&lt;br /&gt;
var valor2 = false;&lt;br /&gt;
resultat = valor1 || valor2; // resultat = true&lt;br /&gt;
&lt;br /&gt;
valor1 = false;&lt;br /&gt;
valor2 = false;&lt;br /&gt;
resultat = valor1 || valor2; // resultat = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Matemàtics ====&lt;br /&gt;
Javascript permet realitzar manipulacions matemàtiques sobre el valor de les variables numèriques. Els operadors definits són: suma (+), resta (-), multiplicació (*) i divisió (/). Exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 10;&lt;br /&gt;
var numero2 = 5;&lt;br /&gt;
&lt;br /&gt;
resultat = numero1 / numero2; // resultat = 2&lt;br /&gt;
resultat = 3 + numero1; // resultat = 13&lt;br /&gt;
resultat = numero2 – 4; // resultat = 1&lt;br /&gt;
resultat = numero1 * numero 2; // resultat = 50&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A més dels quatre operadors bàsics, Javascript defineix un altre operador matemàtic que no és senzill d'entendre quan s'estudia per primera vegada, però que és molt útil en algunes ocasions.&lt;br /&gt;
&lt;br /&gt;
Es tracta de l'operador &amp;quot;mòdul&amp;quot;, que calcula la resta de la divisió sencera de dos nombres. Si es divideix per exemple 10 i 5, la divisió és exacta i dóna un resultat de 2. La resta d'aquesta divisió és 0, per la qual cosa mòdul de 10 i 5 és igual a 0.&lt;br /&gt;
&lt;br /&gt;
No obstant això, si es divideix 9 i 5, la divisió no és exacta, el resultat és 1 i la resta 4, per la qual cosa mòdul de 9 i 5 és igual a 4.&lt;br /&gt;
&lt;br /&gt;
L'operador mòdul en Javascript s'indica mitjançant el símbol %, que no ha de confondre's amb el càlcul del percentatge:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 10;&lt;br /&gt;
var numero2 = 5;&lt;br /&gt;
resultat = numero1 % numero2; // resultat = 0&lt;br /&gt;
&lt;br /&gt;
numero1 = 9;&lt;br /&gt;
numero2 = 5;&lt;br /&gt;
resultat = numero1 % numero2; // resultat = 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els operadors matemàtics també es poden combinar amb l'operador d'assignació per abreujar la seva notació:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
numero1 += 3; // numero1 = numero1 + 3 = 8&lt;br /&gt;
numero1 -= 1; // numero1 = numero1 - 1 = 4&lt;br /&gt;
numero1 *= 2; // numero1 = numero1 * 2 = 10&lt;br /&gt;
numero1 /= 5; // numero1 = numero1 / 5 = 1&lt;br /&gt;
numero1 %= 4; // numero1 = numero1 % 4 = 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Relacionals ====&lt;br /&gt;
Els operadors relacionals definits per Javascript són idèntics als quals defineixen les matemàtiques: major que (&amp;gt;), menor que (&amp;lt;), major o igual (&amp;gt;=), menor o igual (&amp;lt;=), igual que (==) i diferent de (!=).&lt;br /&gt;
&lt;br /&gt;
Els operadors que relacionen variables són imprescindibles per realitzar qualsevol aplicació complexa, com es veurà en el següent capítol de programació avançada. El resultat de tots aquests operadors sempre és un valor booleà:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 3;&lt;br /&gt;
var numero2 = 5;&lt;br /&gt;
resultat = numero1 &amp;gt; numero2; // resultat = false&lt;br /&gt;
resultat = numero1 &amp;lt; numero2; // resultat = true&lt;br /&gt;
&lt;br /&gt;
numero1 = 5;&lt;br /&gt;
numero2 = 5;&lt;br /&gt;
resultat = numero1 &amp;gt;= numero2; // resultat = true&lt;br /&gt;
resultat = numero1 &amp;lt;= numero2; // resultat = true&lt;br /&gt;
resultat = numero1 == numero2; // resultat = true&lt;br /&gt;
resultat = numero1 != numero2; // resultat = false&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
S'ha de tenir especial cura amb l'operador d'igualtat (==), ja que és l'origen de la majoria d'errors de programació, fins i tot per als usuaris que ja tenen certa experiència desenvolupant scripts. L'operador == s'utilitza per comparar el valor de dues variables, per la qual cosa és molt diferent de l'operador =, que s'utilitza per assignar un valor a una variable:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// L'operador &amp;quot;=&amp;quot; assigna valors&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
resultat = numero1 = 3; // numero1 = 3 i resultat = 3&lt;br /&gt;
&lt;br /&gt;
// L'operador &amp;quot;==&amp;quot; compara variables&lt;br /&gt;
var numero1 = 5;&lt;br /&gt;
resultat = numero1 == 3; // numero1 = 5 i resultat = *false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els operadors relacionals també es poden utilitzar amb variables de tipus cadena de text:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var text1 = &amp;quot;hola&amp;quot;;&lt;br /&gt;
var text2 = &amp;quot;hola&amp;quot;;&lt;br /&gt;
var text3 = &amp;quot;*adios&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
resultat = text1 == text3; // resultat = false&lt;br /&gt;
resultat = text1 != text2; // resultat = false&lt;br /&gt;
resultat = text3 &amp;gt;= text2; // resultat = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Quan s'utilitzen cadenes de text, els operadors &amp;quot;major que&amp;quot; (&amp;gt;) i &amp;quot;menor que&amp;quot; (&amp;lt;) segueixen un raonament no intuïtiu: es compara lletra a lletra començant des de l'esquerra fins que es trobi una diferència entre les dues cadenes de text. Per determinar si una lletra és major o menor que una altra, les majúscules es consideren menors que les minúscules i les primeres lletres de l'alfabet són menors que les últimes (a és menor que b, b és menor que c, A és menor que a, etc.)&lt;br /&gt;
=== Àmbit de les Varibles ===&lt;br /&gt;
Un altre aspecte a tenir en compte a l'hora d'usar les variables és el seu àmbit, és a dir, quines funcions tenen accés a elles. Si es crea una ''variable dins d'una funció'' només serà coneguda dins d'aquesta funció, es tracta de ''variables locals''. Si es necessita que diverses funcions tinguin accés a una determinada variable aquesta ha de crear-se com a variable global, això es fa creant-la fora de totes les funcions. Per exemple en el següent script tenim variables globals i locals:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script language=&amp;quot;Javascript&amp;quot;&amp;gt;&lt;br /&gt;
     var navegador_versio = 0;&lt;br /&gt;
     function veureNavegador()&lt;br /&gt;
     {&lt;br /&gt;
          var versio;&lt;br /&gt;
          versio = document.appVersion;&lt;br /&gt;
          return versio;&lt;br /&gt;
     }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En aquest exemple ''navegador_versio'' és una variable global i ''versió'' és una variable local que només existeix dintre de la funciò ''veureNavegador''.&lt;br /&gt;
Què succeeix si una funció defineix una variable local amb el mateix nom que una variable global que ja existeix? En aquest cas, l''es variables locals prevalen sobre les globals, però només dins de la funció'':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var missatge = &amp;quot;guanya la de fora&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    function mostraMissatge() {&lt;br /&gt;
        var missatge = &amp;quot;guanya la de dins&amp;quot;;&lt;br /&gt;
        alert(missatge);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
    mostraMissatge();&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Què succeeix si dins d'una funció es defineix una variable global amb el mateix nom que una altra variable global que ja existeix? En aquest altre cas, la variable global definida dins de la funció simplement modifica el valor de la variable global definida anteriorment:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var missatge = &amp;quot;guanya la de fora&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    function mostraMissatge() {&lt;br /&gt;
        missatge = &amp;quot;guanya la de dins&amp;quot;;&lt;br /&gt;
        alert(missatge);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
    mostraMissatge();&lt;br /&gt;
    alert(missatge);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La diferencia dels dos exemples anteriors ve donat per la definició d'una variable anomenada igual que una altre global. En el primer exemple s'utilitza la paraula reservada '''var''' i en el últim exemple NO s'utilitza. El fet de NO utilitzar la paraula reservada '''var''' s'interpreta com que es vol utilitzar la variable global definida abans de la funció.&lt;br /&gt;
&lt;br /&gt;
Resumint, la recomanació general és definir com a variables locals totes les variables que siguin d'ús exclusiu per realitzar les tasques encarregades a cada funció. Les variables globals s'utilitzen per compartir dades entre funcions de forma senzilla.&lt;br /&gt;
&lt;br /&gt;
== Estructures de control de Flux ==&lt;br /&gt;
&lt;br /&gt;
=== Estructura IF ===&lt;br /&gt;
L'estructura més utilitzada en Javascript i en la majoria de llenguatges de programació és l'estructura if. S'empra per prendre decisions en funció d'una condició. La seva definició formal és:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if(condicion) {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si la condició es compleix (és a dir, si el seu valor és true) s'executen totes les instruccions que es troben dins de {...}. Si la condició no es compleix (és a dir, si el seu valor és false) no s'executa cap instrucció continguda en {...} i el programa continua executant la resta d'instruccions del script.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var mostrado = false;&lt;br /&gt;
var usuarioPermiteMensajes = true;&lt;br /&gt;
 &lt;br /&gt;
if(!mostrado &amp;amp;&amp;amp; usuarioPermiteMensajes) {&lt;br /&gt;
  alert(&amp;quot;Es la primera vez que se muestra el mensaje&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Estructura IF....ELSE ===&lt;br /&gt;
Normalment les condicions solen ser del tipus &amp;quot;si es compleix aquesta condició, fes-ho; si no es compleix, fes això un altre&amp;quot;. Existeix una variant de l'estructura if trucada if...else. La seva definició formal és la següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if(condicion) {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La estructura if...else es pot encadenar per realitzar diverses comprovacions seguides:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if(edad &amp;lt; 12) {&lt;br /&gt;
  alert(&amp;quot;Todavía eres muy pequeño&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if(edad &amp;lt; 19) {&lt;br /&gt;
  alert(&amp;quot;Eres un adolescente&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if(edad &amp;lt; 35) {&lt;br /&gt;
  alert(&amp;quot;Aun sigues siendo joven&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
  alert(&amp;quot;Piensa en cuidarte un poco más&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selecció Múltiple ===&lt;br /&gt;
Poden existir casos en els quals el programa hagi de tenir mes de dues alternatives, per exemple si volem un programa que mostri un títol en un idioma de quatre possibles. Això pot solucionar-se mitjançant diversos if. Hem de triar entre idiomes: castellà, engonals, francès i alemany.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (leng == &amp;quot;ESPANYOL&amp;quot;)&lt;br /&gt;
       pagCast();&lt;br /&gt;
else&lt;br /&gt;
       if (leng == &amp;quot;ANGLES&amp;quot;)&lt;br /&gt;
              pagIng();&lt;br /&gt;
       else&lt;br /&gt;
             if (leng == &amp;quot;FRANCES&amp;quot;)&lt;br /&gt;
                    pagFran();&lt;br /&gt;
             else&lt;br /&gt;
                   if (leng == &amp;quot;CATALA&amp;quot;)&lt;br /&gt;
                          pagCat();&lt;br /&gt;
                   else&lt;br /&gt;
                            error('idioma desconegut');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per a aquests casos disposem de la sentència switch...casi...default, de selecció múltiple. L'exemple anterior quedaria:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
switch (idioma) {&lt;br /&gt;
    case 'espanyol' :&lt;br /&gt;
          pagCast();&lt;br /&gt;
          break;&lt;br /&gt;
    case 'ingles' :&lt;br /&gt;
          pagIng();&lt;br /&gt;
          break;&lt;br /&gt;
    case 'frances' :&lt;br /&gt;
          pagFran();&lt;br /&gt;
          break;&lt;br /&gt;
    case 'catala' :&lt;br /&gt;
          pagCat();&lt;br /&gt;
          break;&lt;br /&gt;
    default :&lt;br /&gt;
          error ('Idioma desconegut');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La instrucció ''break'' posa fi al bloc i fa que el programa salti a la instrucció següent a la sentència ''switch''(), si s'omet el programa continuaria amb la següent comparació. La secció del ''default'' és opcional, la seva finalitat és executar algun codi quan cap de les condicions es compleixi.&lt;br /&gt;
&lt;br /&gt;
=== Estructura WHILE ===&lt;br /&gt;
En aquesta estructura el programa primer comprova la condició: si és certa pansa a executar el cos del bucle, i si és falsa pansa a la instrucció següent a la sentència while.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
while(condició){&lt;br /&gt;
....&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var resultat = 0;&lt;br /&gt;
var numero = 100;&lt;br /&gt;
var i = 0;&lt;br /&gt;
 &lt;br /&gt;
while(i &amp;lt;= numero) {&lt;br /&gt;
  resultat += i;&lt;br /&gt;
  i++;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
alert(resultat);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El programa ha de sumar tots els nombres menors o igual que un altre donat. Per exemple si el nombre és 5, s'ha de calcular: 1 + 2 + 3 + 4 + 5 = 15&lt;br /&gt;
&lt;br /&gt;
=== Estructura DO...WHILE ===&lt;br /&gt;
Es tracta d'un bucle en el qual la condició es comprova després de la primera iteració, és a dir que el cos del bucle s'executa almenys una vegada. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
  ...&lt;br /&gt;
} while(condició);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Utilitzant aquest bucle es pot calcular fàcilment el factorial d'un numero:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var resultat = 1;&lt;br /&gt;
var numero = 5;&lt;br /&gt;
 &lt;br /&gt;
do {&lt;br /&gt;
  resultat *= numero;  // resultat = resultat * numero&lt;br /&gt;
  numero--;&lt;br /&gt;
} while(numero &amp;gt; 0);&lt;br /&gt;
 &lt;br /&gt;
alert(resultat);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Estructura FOR ===&lt;br /&gt;
L'estructura for permet realitzar repeticions (també anomenades bucles) d'instruccions d'una forma molt senzilla. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for(inicializació; condició; actualizació) {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La idea del funcionament d'un bucle for és la següent: &amp;quot;mentre la condició indicada se segueixi complint, repeteix l'execució de les instruccions definides dins del for. A més, després de cada repetició, actualitza el valor de les variables que s'utilitzen en la condició&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* La &amp;quot;inicialització&amp;quot; és la zona en la qual s'estableix els valors inicials de les variables que controlen la repetició.&lt;br /&gt;
* La &amp;quot;condició&amp;quot; és l'únic element que decideix si contínua o es deté la repetició.&lt;br /&gt;
* La &amp;quot;actualització&amp;quot; és el nou valor que s'assigna després de cada repetició a les variables que controlen la repetició.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola, estic dintre d'un bucle&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
for(var i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
  alert(missatge);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Un altre exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dies = [&amp;quot;Dilluns&amp;quot;, &amp;quot;Dimarts&amp;quot;, &amp;quot;Dimecres&amp;quot;, &amp;quot;Dijous&amp;quot;, &amp;quot;Divendres&amp;quot;, &amp;quot;Dissabte&amp;quot;, &amp;quot;Diumenge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
for(var i=0; i&amp;lt;7; i++) {&lt;br /&gt;
  alert(dies[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Estructura For...IN ===&lt;br /&gt;
La seva definició exacta implica l'ús d'objectes, que és un element de programació que encara no anem a estudiar. Per tant, solament es va a presentar l'estructura for...in adaptada al seu ús en arrays. La seva definició formal adaptada als arrays és:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
for(indice in array) {&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var dies = [&amp;quot;Dilluns&amp;quot;, &amp;quot;Dimarts&amp;quot;, &amp;quot;Dimecres&amp;quot;, &amp;quot;Dijous&amp;quot;, &amp;quot;Divendres&amp;quot;, &amp;quot;Dissabte&amp;quot;, &amp;quot;Diumenge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
for(i in dies) {&lt;br /&gt;
  alert(dies[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Funcions útils del llenguatge ==&lt;br /&gt;
=== Funcions de cadenes de text ===&lt;br /&gt;
&lt;br /&gt;
'''length''', calcula la longitud d'una cadena de text (el nombre de caràcters que la formen)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var numeroLetras = missatge.length; // numeroLetras = 10&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''+''', s'empra per concatenar diverses cadenes de text&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = &amp;quot; Món&amp;quot;;&lt;br /&gt;
var missatge = missatge1 + missatge2; // missatge = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A més de l'operador +, també es pot utilitzar la funció '''concat()'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = missatge1.concat(&amp;quot; Món&amp;quot;); // missatge2 = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les cadenes de text també es poden unir amb variables numèriques:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var variable1 = &amp;quot;Hola &amp;quot;;&lt;br /&gt;
var variable2 = 3;&lt;br /&gt;
var missatge = variable1 + variable2; // missatge = &amp;quot;Hola 3&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Quan s'uneixen diverses cadenes de text és habitual oblidar afegir un espai de separació entre les paraules:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = &amp;quot;Món&amp;quot;;&lt;br /&gt;
var missatge = missatge1 + missatge2; // missatge = &amp;quot;HolaMón&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Els espais en blanc es poden afegir al final o al principi de les cadenes i també es poden indicar forma explícita:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = &amp;quot;Món&amp;quot;;&lt;br /&gt;
var missatge = missatge1 + &amp;quot; &amp;quot; + missatge2; // missatge = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''toUpperCase()''', transforma tots els caràcters de la cadena als seus corresponents caràcters en majúscules:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var missatge2 = missatge1.toUpperCase(); // missatge2 = &amp;quot;HOLA&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''toLowerCase()''', transforma tots els caràcters de la cadena als seus corresponents caràcters en minúscules:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge1 = &amp;quot;HOLA&amp;quot;;&lt;br /&gt;
var missatge2 = missatge1.toLowerCase(); // missatge2 = &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''charAt(posició)''', obté el caràcter que es troba en la posició indicada:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var lletra = missatge.charAt(0); // lletra = H&lt;br /&gt;
lletra = missatge.charAt(2); // lletra = l&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''indexOf(caracter)''', calcula la posició en la qual es troba el caràcter indicat dins de la cadena de text. Si el caràcter s'inclou diverses vegades dins de la cadena de text, es retorna la seva primera posició començant a buscar des de l'esquerra. Si la cadena no conté el caràcter, la funció retorna el valor -1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var posicion = missatge.indexOf('a'); // posicion = 3&lt;br /&gt;
posicion = missatge.indexOf('b'); // posicion = -1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La seva funció anàloga és lastIndexOf():&lt;br /&gt;
&lt;br /&gt;
'''lastIndexOf(caracter'''), calcula l'última posició en la qual es troba el caràcter indicat dins de la cadena de text. Si la cadena no conté el caràcter, la funció retorna el valor -1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var posicion = missatge.lastIndexOf('a'); // posicion = 3&lt;br /&gt;
posicion = missatge.lastIndexOf('b'); // posicion = -1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La funció lastIndexOf() comença la seva cerca des del final de la cadena cap al principi, encara que la posició retornada és la correcta començant a explicar des del principi de la paraula.&lt;br /&gt;
&lt;br /&gt;
'''substring(inici, final)''', extreu una porció d'una cadena de text. El segon paràmetre és opcional. Si només s'indica el paràmetre inicio, la funció retorna la part de la cadena original corresponent des d'aquesta posició fins al final:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(2); // porcion = &amp;quot;la Món&amp;quot;&lt;br /&gt;
porcion = missatge.substring(5); // porcion = &amp;quot;Món&amp;quot;&lt;br /&gt;
porcion = missatge.substring(7); // porcion = &amp;quot;ndo&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si s'indica un inici negatiu, es retorna la mateixa cadena original:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(-2); // porcion = &amp;quot;Hola Món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Quan s'indica l'inici i el final, es retorna la part de la cadena original compresa entre la posició inicial i la immediatament anterior a la posició final (és a dir, la posició inicio està inclosa i la posició final no):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(1, 8); // porcion = &amp;quot;ona Mun&amp;quot;&lt;br /&gt;
porcion = missatge.substring(3, 4); // porcion = &amp;quot;a&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si s'indica un final més petit que l'inici, Javascript els considera de forma inversa, ja que automàticament assigna el valor més petit a l'inici i el més gran al final:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món&amp;quot;;&lt;br /&gt;
var porcion = missatge.substring(5, 0); // porcion = &amp;quot;Hola &amp;quot;&lt;br /&gt;
porcion = missatge.substring(0, 5); // porcion = &amp;quot;Hola &amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''split(separador'''), converteix una cadena de text en un array de cadenes de text. La funció parteix la cadena de text determinant els seus trossos a partir del caràcter separador indicat:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var missatge = &amp;quot;Hola Món, sóc una cadena de text!&amp;quot;;&lt;br /&gt;
var paraules = missatge.split(&amp;quot; &amp;quot;);&lt;br /&gt;
// paraules = [&amp;quot;Hola&amp;quot;, &amp;quot;Món,&amp;quot;, &amp;quot;sóc&amp;quot;, &amp;quot;una&amp;quot;, &amp;quot;cadena&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;text!&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Amb aquesta funció es poden extreure fàcilment les lletres que formen una paraula:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var paraula = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
var lletres = paraula.split(&amp;quot;&amp;quot;); // lletres = [&amp;quot;H&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;a&amp;quot;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Funcions d'arrays ===&lt;br /&gt;
'''length''', calcula el nombre d'elements d'un array&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var vocals = [&amp;quot;a&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;o&amp;quot;];&lt;br /&gt;
var numeroVocales = vocals.length; // numeroVocales = 5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''concat()''', s'empra per concatenar els elements de diversos arrays&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array1 = [1, 2, 3];&lt;br /&gt;
array2 = array1.concat(4, 5, 6); // array2 = [1, 2, 3, 4, 5, 6]&lt;br /&gt;
array3 = array1.concat([4, 5, 6]); // array3 = [1, 2, 3, 4, 5, 6]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''join(separador)''', és la funció contrària a split(). Uneix tots els elements d'un array per formar una cadena de text. Per unir els elements s'utilitza el caràcter separador indicat&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [&amp;quot;hola&amp;quot;, &amp;quot;món&amp;quot;];&lt;br /&gt;
var missatge = array.join(&amp;quot;&amp;quot;); // missatge = &amp;quot;holamundo&amp;quot;&lt;br /&gt;
missatge = array.join(&amp;quot; &amp;quot;); // missatge = &amp;quot;hola món&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''pop()''', elimina l'últim element del array i ho retorna. El array original es modifica i la seva longitud disminueix en 1 element.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
var ultimo = array.pop();&lt;br /&gt;
// ara array = [1, 2], ultimo = 3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''push()''', afegeix un element al final del array. El array original es modifica i augmenta la seva longitud en 1 element. (També és possible afegir més d'un element alhora)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
array.push(4);&lt;br /&gt;
// ara array = [1, 2, 3, 4]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''shift()''', elimina el primer element del array i ho retorna. El array original es veu modificat i la seva longitud disminuïda en 1 element.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
var primer = array.shift();&lt;br /&gt;
// ara array = [2, 3], primer = 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''unshift()''', afegeix un element al principi del array. El array original es modifica i augmenta la seva longitud en 1 element. (També és possible afegir més d'un element alhora)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
array.unshift(0);&lt;br /&gt;
// ara array = [0, 1, 2, 3]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''reverse()''', modifica un array col·locant els seus elements en l'ordre invers a la seva posició original:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3];&lt;br /&gt;
array.reverse();&lt;br /&gt;
// ara array = [3, 2, 1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''sort()''', ordena els elements del array, tan numèrics com alfabètics.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [4, 2, 1, 3];&lt;br /&gt;
array.sort();&lt;br /&gt;
// ara array = [1, 2, 3, 4]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''splice()''', afegeix i elimina elements.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;Inici&amp;lt;/i&amp;gt; es la posició on començarà a afegir o eliminar.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;Eliminats&amp;lt;/i&amp;gt; es el nombre d'elements que es volven borrar. Si posem un 0, solament afegirà valors.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;Valor1, valor2, …, valorN&amp;lt;/i&amp;gt; son els valor que volem afegir.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3, 4, 5];&lt;br /&gt;
array.splice(1,3);&lt;br /&gt;
// ara array = [1, 5], elimina a partir de la posició 1, tres elements.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array =[1, 2, 3, 4, 5];&lt;br /&gt;
array.splice(2, 0, 2.5);&lt;br /&gt;
//ara el array = [1, 2, 2.5, 3, 4, 5]&lt;br /&gt;
//afegeix a partir de la posició dos el element 2.5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array= [1, 2, 3, 4, 5, 6];&lt;br /&gt;
array.splice(2, 3);&lt;br /&gt;
//Eliminem, a partir del segon element (no inclos) 3 elements&lt;br /&gt;
//ara el array = [1, 2, 6]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var array = [1, 2, 3, 4, 5];&lt;br /&gt;
array.splice(1, 3, &amp;quot;two&amp;quot;, &amp;quot;three&amp;quot;, &amp;quot;four&amp;quot;);&lt;br /&gt;
//Eliminem tres elements a partir del primer element, y afegim 3 més&lt;br /&gt;
//ara el array = [1, &amp;quot;two&amp;quot;, &amp;quot;three&amp;quot;, &amp;quot;four&amp;quot;, 5]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Funcions de nombres ===&lt;br /&gt;
'''NaN''', (de l'anglès, &amp;quot;Not a Number&amp;quot;) Javascript empra el valor NaN per indicar un valor numèric no definit (per exemple, la divisió 0/0).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 0;&lt;br /&gt;
var numero2 = 0;&lt;br /&gt;
alert(numero1/numero2); // es mostra el valor NaN&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''isNaN()''', permet protegir a l'aplicació de possibles valors numèrics no definits&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 0;&lt;br /&gt;
var numero2 = 0;&lt;br /&gt;
if(isNaN(numero1/numero2)) {&lt;br /&gt;
alert(&amp;quot;La divisió no està definida per als nombres indicats&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
alert(&amp;quot;La divisió és igual a =&amp;gt; &amp;quot; + numero1/numero2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''Infinity''', fa referència a un valor numèric infinit i positiu (també existeix el valor –Infinity per als infinits negatius)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 10;&lt;br /&gt;
var numero2 = 0;&lt;br /&gt;
alert(numero1/numero2); // es mostra el valor Infinity&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''toFixed(digits)''', retorna el nombre original amb punts decimals com els indicats pel paràmetre digits i realitza els arrodoniments necessaris. Es tracta d'una funció molt útil per exemple per mostrar preus.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var numero1 = 4564.34567;&lt;br /&gt;
numero1.toFixed(2); // 4564.35&lt;br /&gt;
numero1.toFixed(6); // 4564.345670&lt;br /&gt;
numero1.toFixed(); // 4564&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conversió de tipus ===&lt;br /&gt;
No és capaç de convertir un string en nombre (tret que el string sigui solament un nombre). Per a això existeixen dues funcions preconstruidas en Javascript que ens permeten convertir un string en nombre enter o decimal, amb dues limitacions:&lt;br /&gt;
Ha d'aparèixer com string el nombre (sencer o decimal) que volem convertir.&lt;br /&gt;
Ha d'aparèixer al principi del string.&lt;br /&gt;
'''parseInt(String)''' --&amp;gt; converteix a integer&lt;br /&gt;
'''parseFloat(String)''' --&amp;gt; Converteix a Float&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
parseInt(&amp;quot;4.33333&amp;quot;); --&amp;gt; 4&lt;br /&gt;
parseFloat(&amp;quot;4.333&amp;quot;); --&amp;gt; 4.333&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
=== Exercici : Arrays ===&lt;br /&gt;
Crear un array anomenat mesos i que emmagatzemi el nom dels dotze mesos de l'any. Mostrar per pantalla els dotze noms utilitzant la funció alert().&lt;br /&gt;
&lt;br /&gt;
:[[Solució Exercici Arrays]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici : Operadors ===&lt;br /&gt;
A partir del següent array que es proporciona: &lt;br /&gt;
&amp;lt;pre&amp;gt;var valors = [true, 5, false, &amp;quot;hola&amp;quot;, &amp;quot;adios&amp;quot;, 2];&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Determinar quin dels dos elements de text és major&lt;br /&gt;
* Utilitzant exclusivament els dos valors booleans del array, determinar els operadors necessaris per obtenir un resultat true i un altre resultat false&lt;br /&gt;
* Determinar el resultat de les cinc operacions matemàtiques realitzades amb els dos elements numèrics&lt;br /&gt;
&lt;br /&gt;
:[[Solució Exercici Operadors]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici DNI ===&lt;br /&gt;
El càlcul de la lletra del Document Nacional d'Identitat (DNI) és un procés matemàtic senzill que es basa a obtenir la resta de la divisió sencera del nombre de DNI i el número 23. A partir de la resta de la divisió, s'obté la lletra seleccionant-la dins d'un array de lletres.&lt;br /&gt;
El array de lletres és:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var lletres = ['T', 'R', 'W', 'A', 'G', 'M', 'I', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'I', 'T'];&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per tant si la resta de la divisió és 0, la lletra del DNI és la T i si la resta és 3 la lletra és l'A. Amb aquestes dades, elaborar un petit script que:&lt;br /&gt;
* Emmagatzemi en una variable el nombre de DNI indicat per l'usuari i en una altra variable la lletra del DNI que s'ha indicat. (Pista: si es vol demanar directament a l'usuari que indiqui el seu nombre i la seva lletra, es pot utilitzar la funció prompt())&lt;br /&gt;
* En primer lloc (i en una sola instrucció) s'ha de comprovar si el nombre és menor que 0 o major que 99999999. Si aquest és el cas, es mostra un missatge a l'usuari indicant que el nombre proporcionat no és vàlid i el programa no mostra més missatges.&lt;br /&gt;
* Si el nombre és vàlid, es calcula la lletra que li correspon segons el mètode explicat anteriorment.&lt;br /&gt;
* Una vegada calculada la lletra, s'ha de comparar amb la lletra indicada per l'usuari. Si no coincideixen, es mostra un missatge a l'usuari dient-li que la lletra que ha indicat no és correcta. En un altre cas, es mostra un missatge indicant que el nombre i la lletra de DNI són correctes.&lt;br /&gt;
&lt;br /&gt;
:[[Solució DNI]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici Factorial ===&lt;br /&gt;
El factorial d'un nombre enter n és una operació matemàtica que consisteix a multiplicar tots els factors n x (n-1) x (n-2) x ... x 1. Així, el factorial de 5 (escrit com 5!) és igual a: 5! = 5 x 4 x 3 x 2 x 1 = 120&lt;br /&gt;
Utilitzant l'estructura for, crear un script que calculi el factorial d'un nombre enter.&lt;br /&gt;
:[[Solució Factorial]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici de Cadenes ===&lt;br /&gt;
Escriure funcions que donades dues cadenes de caràcters:&lt;br /&gt;
a) Indiqui si la segona cadena és una subcadena de la primera. Per exemple, ’cadena’ és una&lt;br /&gt;
subcadena de ’subcadena’.&lt;br /&gt;
b) Retorni la que sigui anterior en ordre alfábetico. Per exemple, si rep ’kde’ i ’gnome’&lt;br /&gt;
ha de retornar ’gnome’.&lt;br /&gt;
&lt;br /&gt;
:[[Solució cadenes]]&lt;br /&gt;
&lt;br /&gt;
=== Joc d'adivinació ===&lt;br /&gt;
Considerem el següent joc entre els jugadors A (endeví) y P (pensador): P pensa un nombre entre 1 y 1000. A intenta adivinar-ho mitjançant aproximacions fins que adivina el número. &lt;br /&gt;
Suposem que la màquina interpreta el paper d'endeví i l'usuari ha de pensar el número. El pensador només pot donar 3 tipus de respostes per cada nombre proposat per l'endeví:&lt;br /&gt;
* &amp;quot;MAJOR&amp;quot; : vol dir que el numero proposat pel l'endeví és major que el que ha pensat.&lt;br /&gt;
* &amp;quot;MENOR&amp;quot; : vol dir que el numero proposat pel l'endeví és menor que el que ha pensat.&lt;br /&gt;
* &amp;quot;OK&amp;quot; : vol dir que ha adivinat el número. &lt;br /&gt;
&lt;br /&gt;
:[[Solució Joc d'adivinació]]&lt;br /&gt;
&lt;br /&gt;
=== Palíndrom ===&lt;br /&gt;
Volem sapiguer si una determinada paraula o frase és un [http://es.wikipedia.org/wiki/Pal%C3%ADndromo palíndrom]. Escriu un programa que demani una text i aquest indiqui si és o no palíndrom.&lt;br /&gt;
&lt;br /&gt;
:[[Solució Palíndrom]]&lt;br /&gt;
&lt;br /&gt;
=== Triangle bonic ===&lt;br /&gt;
Utilitzant bucles i amb els dígits {0...9} es poden dibuixar triangles com el següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         1 &lt;br /&gt;
        232&lt;br /&gt;
       34543&lt;br /&gt;
      4567654&lt;br /&gt;
     567898765&lt;br /&gt;
    67890109876&lt;br /&gt;
   7890123210987&lt;br /&gt;
  890123454321098&lt;br /&gt;
 90123456765432109&lt;br /&gt;
0123456789876543210&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
T'atreveixes?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:[[Solució Triangle bonic]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Xifrat Julio César ===&lt;br /&gt;
El dictador Julio César utilitzava un codi quan volia mantenir en secret un missatge. El xifrat consistia a substituir la primera lletra de l'alfabet, A, per la quarta, D, i així successivament amb les altres, és a dir, B, per la cinquena, I, la tercera, C, per la sisena, F ...&lt;br /&gt;
&lt;br /&gt;
L'alfabet llatí que utilitzava Julio César constava de 21 lletres, per tant la substitució de lletres per xifrar o desxifrar missatges queda descrita en la taula següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Alfabet original : A B C D E F G H I K L M N O P Q R S T V&lt;br /&gt;
Alfabet xifrat   : D E F G H I K L M N O P Q R S T V A B C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aquest tipus de xifrat és un codi de rotació, on la clau de rotació és 3.&lt;br /&gt;
&lt;br /&gt;
Escriu un programa que permeti xifrar o desxifrar utilitzant un codi de rotació. La clau del codi podrà triar-se.&lt;br /&gt;
&lt;br /&gt;
:[[Solució Xifrat]]&lt;br /&gt;
&lt;br /&gt;
=== Password segur? ===&lt;br /&gt;
Volem saber si una contrasenya és segura. Per tal que sigui segura ha de complir les següents regles:&lt;br /&gt;
* Ha de contenir almenys una vocal.&lt;br /&gt;
* No ha de tenir tres vocals consecutives o tres consonants consecutives.&lt;br /&gt;
* No ha de tenir dues ocurrències consecutives de la mateixa lletra, excepte per ‘ee’ o ‘oo’.&lt;br /&gt;
* La longitud mínima és de 6 caràcters i la màxima de 10.&lt;br /&gt;
* Els espais en blanc no estan permesos&lt;br /&gt;
&lt;br /&gt;
:[[Solució Password segur?]]&lt;br /&gt;
&lt;br /&gt;
=== Separador de milers ===&lt;br /&gt;
Escriure una funció que rebi una cadena que conté un llarg nombre enter i retorni una cadena amb el nombre i les separacions de milers. Per exemple, si rep ’1234567890’, ha de retornar ’1.234.567.890’.&lt;br /&gt;
&lt;br /&gt;
:[[Solució Separador de milers]]&lt;br /&gt;
&lt;br /&gt;
=== Instruens Fabulam ===&lt;br /&gt;
Instruens Fabulam és la manera de dibuixar un quadre (o taula) en idioma Llatí. Això és el que has de fer per a aquest problema.&lt;br /&gt;
Cada descripció comença amb una línia d'encapçalat que conté un o més caràcters que defineixen el nombre i l'alineament de de les columnes de la taula. &lt;br /&gt;
Els caràcters de l'encapçalat són:&lt;br /&gt;
* ‘&amp;lt;’ justificació per esquerra&lt;br /&gt;
* ’=’ justificació per central&lt;br /&gt;
* ‘&amp;gt;’ justificació per dreta&lt;br /&gt;
Després de l'encapçalat hi ha almenys dos i com a màxim 21 línies de dades que contenen les entrades de cada fila.&lt;br /&gt;
Cada línia de dades consisteix en una o més entrades (no buides) separades per un ampersand (‘&amp;amp;’), on el nombre d'entrades és igual al nombre de columnes definides en l'encapçalat.&lt;br /&gt;
La primera línia conté els títols de les columnes, i les línies de dades restants contenen les entrades del cos de la taula. Els  espais poden aparèixer dins d'una entrada, però mai al principi ni al final de l'entrada. Els caràcters '&amp;lt;', '=', '&amp;gt;', '&amp;amp;', i 'comilles simples' no apareixeran en l'entrada excepte en els llocs indicats a dalt.&lt;br /&gt;
Per cada descripció de taula, desplegui la taula usant el format exacte mostrat en l'exemple. Noti que: &lt;br /&gt;
* L'ample total de la taula no excedirà els 79 caràcters (sense explicar la fi-de-línia).&lt;br /&gt;
* Els guions ('-') són usats per dibuixar línies horitzontals, no ('_'). El signe d'arrova ('@') apareix en cada cantonada. El signe de summa (‘+’) apareix en una intersecció entre la línia que separa el títol i el cos de la taula.&lt;br /&gt;
* Les entrades d'una columna estan separades pel caràcter (‘|’) per exactament un espai.&lt;br /&gt;
* Si una entrada centrada no està exactament centrada en una columna, l'espai extra ha d'anar a la dreta de l'entrada.&lt;br /&gt;
Exemples:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció Instruens Fabulam:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&lt;br /&gt;
What is the answer?&lt;br /&gt;
42&lt;br /&gt;
&lt;br /&gt;
Quadre:&lt;br /&gt;
@---------------------@&lt;br /&gt;
| What is the answer? |&lt;br /&gt;
|---------------------|&lt;br /&gt;
|                     |&lt;br /&gt;
|                   42|&lt;br /&gt;
@---------------------@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;gt;&lt;br /&gt;
Tweedledum&amp;amp;Tweedledee&lt;br /&gt;
&amp;quot;Knock, knock.&amp;quot;&amp;amp;&amp;quot;Who's there?&amp;quot;&lt;br /&gt;
&amp;quot;Boo.&amp;quot;&amp;amp;&amp;quot;Boo who?&amp;quot;&lt;br /&gt;
&amp;quot;Don't cry, it's only me.&amp;quot;&amp;amp;(groan)&lt;br /&gt;
&lt;br /&gt;
Quadre:&lt;br /&gt;
@---------------------------------------------@&lt;br /&gt;
| Tweedledum                 |     Tweedledee |&lt;br /&gt;
|----------------------------+----------------|&lt;br /&gt;
| &amp;quot;Knock, knock.&amp;quot;            | &amp;quot;Who's there?&amp;quot; |&lt;br /&gt;
| &amp;quot;Boo.&amp;quot;                     |     &amp;quot;Boo who?&amp;quot; |&lt;br /&gt;
| &amp;quot;Don't cry, it's only me.&amp;quot; |        (groan) |&lt;br /&gt;
@---------------------------------------------@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;gt;=&amp;gt;&lt;br /&gt;
TITLE&amp;amp;VERSION&amp;amp;OPERATING SYSTEM&amp;amp;PRICE&lt;br /&gt;
Slug Farm&amp;amp;2.0&amp;amp;FreeBSD&amp;amp;49.99&lt;br /&gt;
Figs of Doom&amp;amp;1.7&amp;amp;Linux&amp;amp;9.98&lt;br /&gt;
Smiley Goes to Happy Town&amp;amp;11.0&amp;amp;Windows&amp;amp;129.25&lt;br /&gt;
Wheelbarrow Motocross&amp;amp;1.0&amp;amp;BeOS&amp;amp;34.97&lt;br /&gt;
&lt;br /&gt;
Quadre:&lt;br /&gt;
@-----------------------------------------------------------------@&lt;br /&gt;
| TITLE                     |  VERSION| OPERATING SYSTEM |   PRICE|&lt;br /&gt;
|---------------------------+---------+------------------+--------|&lt;br /&gt;
| Slug Farm                 |     2.0 |          FreeBSD |  49.99 | &lt;br /&gt;
| Figs of Doom              |     1.7 |            Linux |   9.98 |&lt;br /&gt;
| Smiley Goes to Happy Town |    11.0 |          Windows | 129.25 |&lt;br /&gt;
| Wheelbarrow Motocross     |     1.0 |             BeOS |  34.97 |&lt;br /&gt;
@-----------------------------------------------------------------@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Nota''': Per emmagatzemar en una sola línea la Descripció pots utilitzar el simbol %: exemple: var d = &amp;quot;&amp;gt;%what is the answer?%42&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:[[Solució Instruens Fabulam]]&lt;br /&gt;
&lt;br /&gt;
== Exercicis per entregar ==&lt;br /&gt;
&lt;br /&gt;
=== Text al revés ===&lt;br /&gt;
Escriu un programa que posi al revés un text donat. S'ha de poder escollir si es vol caràcter a caràcter o paraula a paraula.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
text: &amp;quot;hola a tots&amp;quot;&lt;br /&gt;
caracter a caracter: &amp;quot;stot a aloh&amp;quot;&lt;br /&gt;
paraula a paraula : &amp;quot;tots a hola&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Nombres Romans ===&lt;br /&gt;
Escriu un programa que converteixi un enter positiu en un nombre romà. Assumeix que els nombres a convertir són menors a 3500. Les regles per construir un nombre romà són les que segueixen. En el sistema de nombres romans, i és el símbol per 1, v per 5, x per 10, l per 50, c per 100, d per 500 i m per 1000.&lt;br /&gt;
Les regles per formar numeros romans les tens [http://roble.pntic.mec.es/~msanto1/ortografia/numrom.htm aquí.]&lt;br /&gt;
Exemple: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
entrada : 1990&lt;br /&gt;
sortida : mcmxc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Retrat Robot ===&lt;br /&gt;
A causa de les dificultats de la policia per identificar als sospitosos, fa temps es va decidir substituir als dibuixants tradicionals per un programa que efectua el retrat robot a partir d'una descripció del delinqüent.&lt;br /&gt;
&lt;br /&gt;
El programa prototip requeria descripcions molt simples, on cada línia del dibuix es consigna indicant quantes vegades apareix cada caràcter.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Descripció = &amp;quot;1 9W;1 1|2 1o1 1o2 1|;1@4 1U4 1@;1 1|2 3=2 1|;2 1\5_1/&amp;quot;&lt;br /&gt;
Dibuix:&lt;br /&gt;
 WWWWWWWWW&lt;br /&gt;
 |  O O  |&lt;br /&gt;
@    U    @&lt;br /&gt;
 |  ===  |&lt;br /&gt;
  \_____/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Escriu un programa que llegeixi una cadena de text on se separen pel caràcter ';' la descripció de cada línia del dibuix. El programa ha de donar com resultat el dibuix corresponent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Dibuixos amb asteriscos ===&lt;br /&gt;
&lt;br /&gt;
Escriu un programa que dibuixi per pantalla les següents figures:&lt;br /&gt;
*volcà : composta per línies de 2,4,8,16,32 i 64 asteriscos&lt;br /&gt;
[[Fitxer:volca.png]]&lt;br /&gt;
*Mosaic: Compost per una matriu de 8x8 caràcters.&lt;br /&gt;
[[Fitxer:mosaic.png]]&lt;br /&gt;
*Taulers: Com l'anterior però cada quadrat d'amplària L (nombre de línies)&lt;br /&gt;
[[Fitxer:taulers.png]]&lt;br /&gt;
&lt;br /&gt;
== Bibliografia / Webgrafia  ==&lt;br /&gt;
Luis Llana, Carlos Gregorio, Raquel Martínez, Pedro Palao y C. Pareja, &amp;quot;Ejercicios creativos y recreativos en C++&amp;quot;, Ed. Prentice-Hall, 2002. ISBN 84-205-3211-8.&lt;br /&gt;
&lt;br /&gt;
[http://librosweb.es/javascript/capitulo_3.html Introducció a Javascript] &lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[http://www.internetmania.net/int0/int0.htm Internetmania]&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_PHP_(15h)&amp;diff=7181</id>
		<title>NF2 - Framework PHP (15h)</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_PHP_(15h)&amp;diff=7181"/>
				<updated>2016-06-17T14:43:23Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* Enllaçant pàgines */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introducció a Symfony=&lt;br /&gt;
&amp;lt;div width=&amp;quot;100%&amp;quot; style=&amp;quot;clear:both; &amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:30%;&amp;quot;&amp;gt;&lt;br /&gt;
[[fitxer:symfony.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:70%;&amp;quot;&amp;gt;&lt;br /&gt;
Un framework simplifica el desenvolupament de les aplicacions, ja que automatitza molts dels patrons utilitzats per resoldre les tasques comunes. A més, un framework proporciona estructura al codi font, forçant al desenvolupador a crear codi més llegible i més fàcil de mantenir. Finalment, un framework facilita la programació d'aplicacions, ja que encapsula operacions complexes en instruccions senzilles.&lt;br /&gt;
&lt;br /&gt;
Symfony és un complet framework dissenyat per optimitzar, gràcies a les seves característiques, el desenvolupament de les aplicacions web. Per començar, separa la lògica de negoci, la lògica de servidor i la presentació de l'aplicació web. Proporciona diverses eines i classes encaminades a reduir el temps de desenvolupament d'una aplicació web complexa. A més, automatitza les tasques més comunes, permetent al desenvolupador dedicar-se per complet als aspectes específics de cada aplicació. El resultat de tots aquests avantatges és que no s'ha de reinventar la roda cada vegada que es crea una nova aplicació web.&lt;br /&gt;
&lt;br /&gt;
Symfony està desenvolupat completament amb PHP i ha estat provat amb èxit en llocs com Yahoo! Answers, delicious, DailyMotion i molts altres llocs web de primer nivell. Symfony és compatible amb la majoria de gestors de bases de dades, com MySQL, PostgreSQL, Oracle i SQL Server de Microsoft. Es pot executar tant en plataformes Unix (Unix, Linux, etc.) com en plataformes Windows. A continuació es mostren algunes de les seves característiques.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt; &lt;br /&gt;
=Característiques=&lt;br /&gt;
Symfony es va dissenyar perquè s'ajustés als següents requisits:&lt;br /&gt;
&lt;br /&gt;
*Fàcil d'instal·lar i configurar en la majoria de plataformes (i amb la garantia que funciona correctament en els sistemes Windows i *nix estàndards)&lt;br /&gt;
*Independent del sistema gestor de bases de dades&lt;br /&gt;
*Senzill d'usar en la majoria de casos, però prou flexible com per adaptar-se als casos més complexos&lt;br /&gt;
*Basat en la premissa de &amp;quot;convenir en comptes de configurar&amp;quot;, en la qual el desenvolupador solament ha de configurar allò que no és convencional&lt;br /&gt;
*Segueix la majoria de millors pràctiques i patrons de disseny per a la web&lt;br /&gt;
*Preparat per a aplicacions empresarials i adaptable a les polítiques i arquitectures pròpies de cada empresa, a més de ser prou estable com per desenvolupar aplicacions a llarg termini&lt;br /&gt;
*Codi fàcil de llegir que inclou comentaris de phpDocumentor i que permet un manteniment molt senzill&lt;br /&gt;
*Fàcil d'estendre, la qual cosa permet la seva integració amb llibreries desenvolupades per tercers&lt;br /&gt;
&lt;br /&gt;
Symfony pot ser completament personalitzat per complir amb els requisits de les empreses que disposen de les seves pròpies polítiques i regles per a la gestió de projectes i la programació d'aplicacions. Per defecte incorpora diversos entorns de desenvolupament diferents i inclou diverses eines que permeten automatitzar les tasques més comunes de l'enginyeria del programari:&lt;br /&gt;
&lt;br /&gt;
Les eines que generen automàticament codi han estat dissenyades per fer prototips d'aplicacions i per crear fàcilment la part de gestió de les aplicacions.&lt;br /&gt;
*El framework de desenvolupament de proves unitàries i funcionals proporciona les eines ideals per al desenvolupament basat en proves &amp;quot;test-driven development&amp;quot;).&lt;br /&gt;
*La barra de depuració web simplifica la depuració de les aplicacions, ja que mostra tota la informació que els programadors necessiten sobre la pàgina en la qual estan treballant.&lt;br /&gt;
*La interfície de línia de comandos automatitza la instal·lació de les aplicacions entre servidors.&lt;br /&gt;
*És possible realitzar canvis &amp;quot;en calent&amp;quot; de la configuració (sense necessitat de reiniciar el servidor).&lt;br /&gt;
*El complet sistema de log permet als administradors accedir fins a l'últim detall de les activitats que realitza l'aplicació.&lt;br /&gt;
&lt;br /&gt;
=Desenvolupament ràpid d'aplicacions (RAD)=&lt;br /&gt;
&lt;br /&gt;
Durant molt temps, la programació d'aplicacions web va ser un tasca tediosa i molt lenta. Seguint els cicles habituals de l'enginyeria del programari (com els proposats pel Procés Racional Unificat o Rational Unified Process) el desenvolupament d'una aplicació web no pot començar fins que s'han establert per escrit una sèrie de requisits, s'han creat els diagrames UML Unified Modeling Language) i s'ha produït abundant documentació sobre el projecte. Aquest model es veia afavorit per la baixa velocitat de desenvolupament, la falta de versatilitat dels llenguatges de programació (abans d'executar el programa s'ha de construir, compilar i reiniciar) i sobretot pel fet que els clients no estaven disposats a adaptar-se a altres metodologies.&lt;br /&gt;
&lt;br /&gt;
Avui dia, les empreses reaccionen més ràpidament i els clients canvien d'opinió constantment durant el desenvolupament dels projectes. D'aquesta manera, els equips de desenvolupament han d'adaptar-se a aquestes necessitats i han de poder canviar l'estructura d'una aplicació de forma ràpida. Afortunadament, l'ús de llenguatges de script com Python, Ruby i PHP permeten seguir altres estratègies de programació, com RAD (desenvolupament ràpid d'aplicacions) i el desenvolupament àgil de programari.&lt;br /&gt;
&lt;br /&gt;
Una de les idees centrals d'aquesta metodologia és que el desenvolupament comença al més aviat possible perquè el client pugui revisar un prototip que funciona i pugui indicar el camí a seguir. A partir d'aquí, l'aplicació es desenvolupa de forma iterativa, en la qual cada nova versió incorpora noves funcionalitats i es desenvolupa en un breu espai de temps.&lt;br /&gt;
&lt;br /&gt;
Les conseqüències d'aquestes metodologies per al desenvolupador són nombroses. El programador no ha de pensar sobre les versions futures en incloure una nova funcionalitat. Els mètodes utilitzats han de ser el més senzills i directes possibles. Aquestes idees es resumeixen en el principi denominat ''KISS'': Fes-ho senzill, idiota!''Keep It Simple, Stupid''&lt;br /&gt;
&lt;br /&gt;
Quan es modifiquen els requisits o quan s'afegeix una nova funcionalitat, normalment s'ha de reescriure part del codi existent. Aquest procés es diu refactorización i succeeix sovint durant el desenvolupament d'una aplicació web. El codi sol moure's a altres llocs en funció de la seva naturalesa. Els blocs de codi repetits es refactorizan en un únic lloc, aplicant el principi ''DRY'': No et repeteixis ''Don't Repeat Yourself''.&lt;br /&gt;
&lt;br /&gt;
Per assegurar que l'aplicació segueix funcionant correctament malgrat els canvis constants, es necessita una sèrie de proves unitàries que puguin ser automatitzades. Si estan ben escrites, les proves unitàries permeten assegurar que gens ha deixat de funcionar després d'haver-hi refactorizado part del codi de l'aplicació. Algunes metodologies de desenvolupament d'aplicacions obliguen a escriure les proves abans que el propi codi, la qual cosa es coneix com TDD: desenvolupament basat en proves ''test-driven development.''&lt;br /&gt;
&lt;br /&gt;
Symfony és l'eina ideal pel RAD. De fet, el framework ha estat desenvolupat per una empresa que aplica el RAD als seus propis projectes. Per aquest motiu, aprendre a utilitzar Symfony no és com aprendre un nou llenguatge de programació, sinó que consite a aprendre a prendre les decisions correctes per desenvolupar les aplicacions de forma més efectiva.&lt;br /&gt;
&lt;br /&gt;
=La implementació del MVC que realitza Symfony=&lt;br /&gt;
*La capa del Modelo&lt;br /&gt;
**Abstracció de la base de dades&lt;br /&gt;
**Accés a les dades&lt;br /&gt;
*La capa de la Vista &lt;br /&gt;
**Vista&lt;br /&gt;
**Plantilla&lt;br /&gt;
**Layout&lt;br /&gt;
*La capa del Controlador&lt;br /&gt;
**Controlador frontal&lt;br /&gt;
**Acció&lt;br /&gt;
&lt;br /&gt;
En total són set scripts, la qual cosa semblen molts arxius per obrir i modificar cada vegada que es crea una pàgina. Afortunadament, Symfony simplifica aquest procés. Symfony pren el millor de l'arquitectura MVC i la implementa de manera que el desenvolupament d'aplicacions sigui ràpid i senzill.&lt;br /&gt;
&lt;br /&gt;
En primer lloc, el controlador frontal i el layout són comuns per a totes les accions de l'aplicació. Es poden tenir diversos controladors i diversos layouts, però solament és obligatori tenir un de cada. El controlador frontal és un component que només té codi relatiu al MVC, per la qual cosa no és necessari crear un, ja que Symfony ho genera de forma automàtica.&lt;br /&gt;
&lt;br /&gt;
L'altra bona notícia és que les classes de la capa del model també es generen automàticament, en funció de l'estructura de dades de l'aplicació. El ORM s'encarrega de crear l'esquelet o estructura bàsica de les classes i genera automàticament tot el codi necessari. Quan el ORM troba restriccions de claus foranes (o externes) o quan troba dades de tipus data, crea mètodes especials per accedir i modificar aquestes dades, per la qual cosa la manipulació de dades es converteix en un joc de nens. L'abstracció de la base de dades és completament transparent per al programador, ja que es realitza de forma nativa mitjançant PDO PHP Data Objects). Així, si es canvia el sistema gestor de bases de dades a qualsevol moment, no s'ha de reescriure ni una línia de codi, ja que tan sols és necessari modificar un paràmetre en un arxiu de configuració.&lt;br /&gt;
&lt;br /&gt;
Finalment, la lògica de la vista es pot transformar en un arxiu de configuració senzill, sense necessitat de programar-la.&lt;br /&gt;
&lt;br /&gt;
[[fitxer:mvc-symfony.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Instal·lació de Symfony=&lt;br /&gt;
Utilitzarem la versió de symfony 2.4.&lt;br /&gt;
&lt;br /&gt;
[[Instal·lació de la versió 2.4 de symfony ]] (antic)&lt;br /&gt;
&lt;br /&gt;
[[Instal·lació de la versió LTS 2.8 de symfony ]]&lt;br /&gt;
&lt;br /&gt;
[http://symfony.com/doc/current/index.html Llibre gratuït de symfony2].&lt;br /&gt;
&lt;br /&gt;
Accedeix a la URL:&lt;br /&gt;
http://localhost/m7/web/app.php&lt;br /&gt;
&lt;br /&gt;
'''nota:''' m7 és, en aquest cas, el nomProjecteSymfony utilitzat en la creació del projecte symfony.&lt;br /&gt;
&lt;br /&gt;
Hauries de veure una pàgina com aquesta:&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:symfony2.8_inici.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
==Creació de la primera pàgina:==&lt;br /&gt;
Una vegada executis la línia següent anirà preguntant opcions. Tot per defecte. Al nom del bundle podeu posar: HolaMonBundle&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php app/console generate:bundle --namespace=m7/HolaMon --format=yml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Iniciar el servidor ==&lt;br /&gt;
Symfony pot ser instal·lat dintre d'un servidor apache2 però per entorns de desenvolupament porta un servidor web integrat. Per executar el servidor i poder provar les aplicacions podeu iniciar-lo amb la comanda de terminal:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php app/console server:run&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Si heu engegat el servidor integrat podeu provar la pàgina creada en el punt anterior utilitzant aquesta [http://localhost:8000/ url]&lt;br /&gt;
&lt;br /&gt;
Si teniu apache2 instal·lat, podeu provar la pàgina utilitzant aquesta [http://localhost/m7/web/app.php/ url_apache_m7]&lt;br /&gt;
== Si hi ha un error accedint a la pàgina!!==&lt;br /&gt;
Amb apache2, si en algun moment deixa de funcionar heu de provar de fer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo php app/console cache:clear --env=prod &amp;amp;&amp;amp; sudo php app/console cache:warmup --env=prod&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
i donar-li permisos (una altre vegada) a la carpeta principal (dintre de /var/www/html):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod 777 nomprojecte/ -R&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exercici [opcional]:===&lt;br /&gt;
Utilitzant el servidor web apache2 creeu un virtualhost per poder utilitzar symfony2 directament posant: http://localhost/&lt;br /&gt;
&lt;br /&gt;
=Estructura del projecte: Aplicacions, Mòduls i Accions=&lt;br /&gt;
Symfony considera un projecte com '''un conjunt de serveis i operacions disponibles sota un determinat nom de domini i que comparteixen el mateix model d'objectes'''.&lt;br /&gt;
&lt;br /&gt;
Dins d'un projecte, les operacions s'agrupen de forma lògica en aplicacions. Normalment, una aplicació s'executa de forma independent respecte d'altres aplicacions del mateix projecte. L'habitual és que un projecte contingui dues aplicacions: una per a la part pública i una altra per a la part de gestió, compartint ambdues la mateixa base de dades. També és possible definir projectes que estiguin formats per diversos llocs web petits, cadascun d'ells considerat com una aplicació. En aquest cas, és important tenir en compte que els enllaços entre aplicacions s'han d'indicar de forma absoluta.&lt;br /&gt;
&lt;br /&gt;
Cada aplicació està formada per un o més mòduls. Un mòdul normalment representa&lt;br /&gt;
*a una pàgina web o &lt;br /&gt;
*a un grup de pàgines amb un propòsit relacionat.&lt;br /&gt;
Per exemple, una aplicació podria tenir mòduls com home, articulos, ajuda, carritoCompra, compte, etc.&lt;br /&gt;
&lt;br /&gt;
Els mòduls emmagatzemen les accions, que representen cadascuna de les operacions que es pot realitzar en un mòdul. Per exemple el mòdul ''carretCompra'' pot definir accions com ''afegir'', mostrar i actualitzar. Normalment les accions es descriuen mitjançant verbs. Treballar amb accions és molt similar a treballar amb les pàgines d'una aplicació web tradicional, encara que en aquest cas dues accions diferents poden acabar mostrant la mateixa pàgina (com per exemple l'acció d'afegir un comentari a una entrada d'un blog, que acaba tornant a mostrar la pàgina de l'entrada amb el nou comentari).&lt;br /&gt;
=Estructura de l'arbre de arxius=&lt;br /&gt;
Normalment, tots els projectes web comparteixen el mateix tipus de continguts, com per exemple:&lt;br /&gt;
&lt;br /&gt;
Una base de dades, com MySQL o PostgreSQL&lt;br /&gt;
*Arxiu estàtics (HTML, imatges, arxius de Javascript, fulles d'estils, etc.)&lt;br /&gt;
*Arxius pujats al lloc web per part dels usuaris o els administradors&lt;br /&gt;
*Classes i llibreries PHP&lt;br /&gt;
*Llibreries externes (scripts desenvolupats per tercers)&lt;br /&gt;
*Arxius que s'executen per lots batch files) que normalment són scripts que s'executen via línia de comandos o mitjançant cron&lt;br /&gt;
*Arxius de log (les traces que generen les aplicacions i/o el servidor)&lt;br /&gt;
*Arxius de configuració&lt;br /&gt;
&lt;br /&gt;
Symfony proporciona una estructura en forma d'arbre d'arxius per organitzar de forma lògica tots aquests continguts, a més de ser consistent amb l'arquitectura MVC utilitzada i amb l'agrupació projecto / aplicació / mòdul. Cada vegada que es crea un nou projecte, aplicació o mòdul, es genera de forma automàtica la part corresponent d'aquesta estructura. A més, l'estructura es pot personalitzar completament, per reorganitzar els arxius i directoris o per complir amb les exigències d'organització d'un client.&lt;br /&gt;
&lt;br /&gt;
Encara que es pot canviar, per defecte totes les aplicacions Symfony tenen la mateixa estructura de directoris senzilla (i recomanada):&lt;br /&gt;
&lt;br /&gt;
*'''app/''': conté la configuració de l'aplicació.&lt;br /&gt;
*'''src/''': aquí es troba tot el codi PHP de l'aplicació.&lt;br /&gt;
*'''vendor/''': per convenció aquí es guarden totes les llibreries creades per tercers.&lt;br /&gt;
*'''web/''': est és el directori web arrel i conté tots els arxius que es poden accedir públicament.&lt;br /&gt;
==El directori web==&lt;br /&gt;
El directori web arrel és el lloc on es troben tots els arxius públics i estàtics tals com a imatges, fulles d'estil i arxius Javascript. També és el lloc on es defineixen tots els controladors frontals, com per exemple el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// web/app.php&lt;br /&gt;
require_once __DIR__.'/../app/bootstrap.php.cache';&lt;br /&gt;
require_once __DIR__.'/../app/AppKernel.php';&lt;br /&gt;
 &lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
 &lt;br /&gt;
$kernel = new AppKernel('prod', false);&lt;br /&gt;
$kernel-&amp;gt;loadClassCache();&lt;br /&gt;
$kernel-&amp;gt;handle(Request::createFromGlobals())-&amp;gt;send();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'arxiu del controlador frontal ('''app.php''' en aquest exemple) és l'arxiu PHP que realment s'executa quan utilitzes una aplicació Symfony2 i el seu treball consisteix a arrencar l'aplicació utilitzant una classe del nucli ('''AppKernel''').&lt;br /&gt;
&lt;br /&gt;
Tenir un controlador frontal significa que s'utilitzen URL diferents i més flexibles que les d'una aplicació PHP típica. Quan es disposa d'un controlador frontal, les URL es formaten de la següent manera:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://localhost/app.php/hello/Ryan&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
El controlador frontal, '''app.php''', s'executa i la URL interna: ''/hello/Ryan'' es dirigeix internament segons la configuració d'encaminament.&lt;br /&gt;
&lt;br /&gt;
Si a més utilitzes el mòdul '''mod_rewrite''' d'Apache, pots forçar l'execució de l'arxiu '''app.php''' sense necessitat d'incloure-ho en la URL, per la qual cosa així les URL són encara més netes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://localhost/hello/Ryan&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==El directori de l'aplicació (app)==&lt;br /&gt;
La classe '''AppKernel''' és el punt d'entrada principal de l'aplicació i és la responsable de tota la configuració. Com a tal, s'emmagatzema en el directori '''app/'''.&lt;br /&gt;
&lt;br /&gt;
Aquesta classe ha d'implementar dos mètodes que defineixen tot el que Symfony necessita saber sobre la teva aplicació. Ni tan sols has de preocupar-te d'aquests mètodes durant l'arrencada — Symfony els emplena per tu amb paràmetres predeterminats.&lt;br /&gt;
&lt;br /&gt;
*'''registerBundles()''': retorna un array amb tots els bundles necessaris per executar l'aplicació.&lt;br /&gt;
*'''registerContainerConfiguration()''': carrega l'arxiu de configuració de recursos de l'aplicació (consulta la secció Configurant l'aplicació).&lt;br /&gt;
Durant el desenvolupament d'una aplicació, normalment el directori '''app/''' solament els utilitzes per modificar la configuració i els arxius d'encaminament en el directori '''app/config/'''.&lt;br /&gt;
&lt;br /&gt;
Aquest directori també conté el directori '''caché''' de l'aplicació (app/cache), un directori de '''logs''' (app/logs) i un directori per a arxius de '''recursos globals''', tals com a plantilles (app/Resources).&lt;br /&gt;
&lt;br /&gt;
'''Carga automàtica'''&lt;br /&gt;
En arrencar Symfony, s'inclou un arxiu especial anomenat ''vendor/autoload.php''. Aquest arxiu, creat per ''Composer'', s'encarrega de configurar el carregador automàtic de classes, que al seu torn '''carrega automàticament tots els arxius''' de la teva aplicació que es trobin '''en el directori src/''' i '''totes les llibreries externes''' configurades en l'arxiu '''composer.json'''.&lt;br /&gt;
&lt;br /&gt;
Gràcies al carregador automàtic, '''mai hauràs de preocupar-te d'usar declaracions include o require'''. Això és possible perquè Composer utilitza namespace o espai de noms d'una classe per determinar la seva ubicació i així '''inclou automàticament l'arxiu en l'instant en què necessites una classe'''.&lt;br /&gt;
&lt;br /&gt;
El carregador automàtic '''ja està configurat per buscar qualsevol de les teves classes PHP en el directori src/'''. Perquè funcioni la càrrega automàtica, el nom de la classe i la ruta de l'arxiu '''han de seguir el mateix patró''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Nom de la classe: Acme\HelloBundle\Controller\HelloController&lt;br /&gt;
Ruta física de l'arxiu: src/Acme/HelloBundle/Controller/HelloController.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Configuració de l'aplicació ==&lt;br /&gt;
Segons el lloc web oficial de YAML (http://www.yaml.org/), YAML és &amp;quot;un estàndard per serializar dades en qualsevol llenguatge de programació i amb un format fàcil de llegir per part de les persones&amp;quot;. Dit d'una altra forma, YAML és un llenguatge molt senzill que permet descriure les dades com en XML, però amb una sintaxi molt més senzilla. YAML és un format especialment útil per descriure dades que poden ser transformats en arrays simples i associatius, com per exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$casa = array(&lt;br /&gt;
  'familia' =&amp;gt; array(&lt;br /&gt;
    'apellido'  =&amp;gt; 'García',&lt;br /&gt;
    'padres'  =&amp;gt; array('Antonio', 'María'),&lt;br /&gt;
    'hijos'   =&amp;gt; array('Jose', 'Manuel', 'Carmen')&lt;br /&gt;
  ),&lt;br /&gt;
  'direccion' =&amp;gt; array(&lt;br /&gt;
    'numero'        =&amp;gt; 34,&lt;br /&gt;
    'calle'         =&amp;gt; 'Gran Vía',&lt;br /&gt;
    'ciudad'        =&amp;gt; 'Cualquiera',&lt;br /&gt;
    'codigopostal'  =&amp;gt; '12345'&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//format yml:&lt;br /&gt;
casa:&lt;br /&gt;
  familia:&lt;br /&gt;
    apellido: García&lt;br /&gt;
    padres:&lt;br /&gt;
      - Antonio&lt;br /&gt;
      - María&lt;br /&gt;
    hijos:&lt;br /&gt;
      - Jose&lt;br /&gt;
      - Manuel&lt;br /&gt;
      - Carmen&lt;br /&gt;
  direccion:&lt;br /&gt;
    numero: 34&lt;br /&gt;
    calle: Gran Vía&lt;br /&gt;
    ciudad: Cualquiera&lt;br /&gt;
    codigopostal: &amp;quot;12345&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
YAML és l'acrònim de &amp;quot;YAML Ain't Markup Language&amp;quot; (&amp;quot;YAML No és un Llenguatge de Marcat&amp;quot;) i es pronuncia &amp;quot;yamel&amp;quot;. El format es porta utilitzant des de 2001 i existeixen utilitats per processar YAML en una gran varietat de llenguatges de programació.&lt;br /&gt;
&lt;br /&gt;
YAML és molt més ràpid d'escriure que XML (ja que no fan falta les etiquetes de tancament i l'ús continu de les cometes) i és molt més poderós que els tradicionals arxius .ini (ja que aquests últims no suporten l'herència i les estructures complexes). Per aquest motiu, Symfony utilitza el format YAML com el llenguatge preferit per emmagatzemar la seva configuració.&lt;br /&gt;
&lt;br /&gt;
Per saber més sobre aquest format pots consultar la [http://symfony.com/legacy/doc/reference/1_4/en/02-YAML següent] pàgina web.&lt;br /&gt;
==El directori font (src)==&lt;br /&gt;
El directori '''src/''' conté tot el codi real (codi PHP, plantilles, arxius de configuració, estils, etc.) que pertany a la teva aplicació. De fet, en programar una aplicació Symfony, la major part del teu treball es durà a terme dins d'un o més''' bundles '''creats en aquest directori.&lt;br /&gt;
&lt;br /&gt;
=Els Bundles=&lt;br /&gt;
[[Els bundles a symfony 2.]]&lt;br /&gt;
&lt;br /&gt;
=Entorn de desenvolupament i entorn de producció=&lt;br /&gt;
Una aplicació pot funcionar en diversos entorns. Els diferents entorns comparteixen el mateix codi PHP (solament és diferent el controlador frontal), però usen una configuració diferent. Per exemple, un entorn de desenvolupament '''dev''' guarda els advertiments i errors, mentre que un entorn de producció '''prod''' només registra els errors. Alguns arxius es tornen a generar en cada petició en l'entorn '''dev''' (para major comoditat dels desenvolupadors), però s'escorcollen en l'entorn '''prod'''. Tots els entorns es troben en la mateixa màquina i executen la mateixa aplicació.&lt;br /&gt;
&lt;br /&gt;
Un projecte Symfony2 '''normalment comença amb tres entorns (dev, test i prod)''', encara que resulta senzill crear nous entorns.''' Pots veure la teva aplicació en diferents entorn''' amb només '''canviar el controlador frontal'''en el teu navegador. Per veure l'aplicació en l'entorn '''dev''', accedeix a l'aplicació a través del controlador frontal de desenvolupament:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://localhost/app_dev.php/hola&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Si desitges veure com es comportarà la teva aplicació a l'entorn de producció, utilitza en el seu lloc el controlador frontal '''prod''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://localhost/app.php/hola&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Si fas qualsevol canvi en les plantilles, no ho veuràs en l'entorn prod tret que esborris la cache de l'aplicació i així forcis a Symfony a tornar a compilar les plantilles. Per esborrar la cache de l'entorn de producció, executa la següent comanda de consola:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo php app/console cache:clear --env=prod &amp;amp;&amp;amp; sudo php app/console cache:warmup --env=prod&lt;br /&gt;
i donar-li permísos:&lt;br /&gt;
chmod 777 nomprojecte/ -R&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=El controlador=&lt;br /&gt;
Un controlador és una funció PHP creada per tu i que s'encarrega d'obtenir la informació de la petició HTTP i de generar i retornar la resposta HTTP (en forma d'objecte de tipus Response de Symfony2).&lt;br /&gt;
La resposta pot ser:&lt;br /&gt;
*una pàgina HTML,&lt;br /&gt;
*un document XML, &lt;br /&gt;
*un array JSON serializado, &lt;br /&gt;
*una imatge, &lt;br /&gt;
*una redirecció a una altra pàgina, &lt;br /&gt;
*un error de tipus 404 &lt;br /&gt;
*o qualsevol altra cosa que se t'ocorri. &lt;br /&gt;
El controlador conté tota la lògica que la teva aplicació necessita per generar el contingut de la pàgina. L'objectiu d'un controlador sempre és el mateix: crear i retornar un objecte '''Response'''.&lt;br /&gt;
==Cicle de vida d'una petició==&lt;br /&gt;
* 1.Cada petició és tractada per un únic arxiu: el controlador frontal (per exemple, '''app.php''' o '''app_dev.php''') el qual és responsable d'iniciar l'aplicació.&lt;br /&gt;
* 2. El sistema d'encaminament (classe Routing) llegeix la informació de la petició (per exemple, la URI), troba una ruta que coincideixi amb aquesta informació, i llegeix el paràmetre '''_controller''' de la ruta.&lt;br /&gt;
* 3. S'executa el controlador assignat a la ruta i aquest controlador crea i retorna un objecte '''Response'''.&lt;br /&gt;
* 4. Les capçaleres HTTP i el contingut de l'objecte Response s'envien de tornada al client.&lt;br /&gt;
&lt;br /&gt;
Exemple de controlador:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/HelloBundle/Controller/HelloController.php&lt;br /&gt;
 &lt;br /&gt;
namespace Acme\HelloBundle\Controller;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Response;&lt;br /&gt;
 &lt;br /&gt;
class HelloController&lt;br /&gt;
{&lt;br /&gt;
    public function indexAction()&lt;br /&gt;
    {&lt;br /&gt;
      return new Response('&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;Hello world!&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Associant una URI a un controlador==&lt;br /&gt;
El nou controlador retorna una pàgina HTML simple. Per poder provar realment aquesta pàgina en el teu navegador, has de crear una ruta que el seu path sigui la URI que vols associar al controlador al fitxer '''routing.yml''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
hello:&lt;br /&gt;
    path:         /hello&lt;br /&gt;
    defaults:     { _controller: AcmeHelloBundle:Hello:index }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Observa la sintaxi utilitzada per referir-se al controlador: '''AcmeHelloBundle:Hello:index'''. Symfony2 utilitza aquesta notació curta per referir-se als controladors. Es tracta de la '''sintaxi recomanada''' i li diu a Symfony2 que busqui una '''classe controlador anomenada HelloController''' dins d'un '''paquet''' anomenat''' AcmeHelloBundle '''i que després '''executi el mètode indexAction()'''.&lt;br /&gt;
&lt;br /&gt;
'''Passar arguments al mètode del controlador'''&lt;br /&gt;
Exemple de controlador amb un argument en un dels seus mètodes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// src/Acme/HelloBundle/Controller/HelloController.php&lt;br /&gt;
 &lt;br /&gt;
namespace Acme\HelloBundle\Controller;&lt;br /&gt;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;&lt;br /&gt;
 &lt;br /&gt;
class HelloController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function indexAction($name)&lt;br /&gt;
    {&lt;br /&gt;
      // ...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El controlador anterior té un sol argument, anomenat '''$name''', el valor del qual correspon al paràmetre '''{name}''' de la ruta associada. De fet, quan executes el teu controlador, Symfony2 associa cada argument del controlador amb un paràmetre de la ruta. &lt;br /&gt;
L'arxiu d'enrutament hauria de ser aquest:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
hello:&lt;br /&gt;
    path:         /hello&lt;br /&gt;
    defaults:     { _controller: AcmeHelloBundle:Hello:index }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Considera el següent exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/routing.yml&lt;br /&gt;
hello:&lt;br /&gt;
    path:         /hello/{firstName}/{lastName}&lt;br /&gt;
    defaults:     { _controller: AcmeHelloBundle:Hello:index, color: green }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function indexAction($firstName, $lastName, $color)&lt;br /&gt;
{&lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les variables '''{firstName}''' i '''{lastName}''' de la ruta es diuen '''placeholders''', ja que &amp;quot;guarden el lloc&amp;quot; perquè qualsevol valor substitueixi aquesta variable. D'altra banda, la variable '''color''' és una variable de '''tipus default''', ja que el seu valor sempre '''està definit per a totes les rutes'''.&lt;br /&gt;
Existeixen regles amb els arguments (paràmetres):&lt;br /&gt;
*Cada argument obligatori del controlador ha de tenir associat un paràmetre en la ruta&lt;br /&gt;
*No tots els paràmetres de la ruta han de ser arguments en el teu controlador&lt;br /&gt;
*és perfectament vàlid fer que l'argument sigui opcional.&lt;br /&gt;
&lt;br /&gt;
El següent exemple no llançarà una excepció:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function indexAction($firstName, $lastName, $color, $foo = 'bar')&lt;br /&gt;
{&lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==objecte Request com a argument del controlador==&lt;br /&gt;
Sol ser molt útil disposar en el controlador de l'objecte '''Request''' associat a la petició de l'usuari, especialment quan treballes amb formularis. Per fer que Symfony passi aquest objecte automàticament com a argument del controlador, utilitza el següent codi:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
 &lt;br /&gt;
public function updateAction(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    $form = $this-&amp;gt;createForm(...);&lt;br /&gt;
 &lt;br /&gt;
    $form-&amp;gt;handleRequest($request);&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Generador de controladors==&lt;br /&gt;
Si el que volem és generar un nou controlador a la nostra aplicació podem automatitzar el procés utilitzant la següent comanda:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php app/console generate:controller&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aquesta comanda et demanarà tota la informació necessaria per crear el controlador i els '''actions''' (mètodes) necessaris que podràs utilitzar en el fitxer de rutes. Tant si utilitzes la comanda com si no la utilitzes, sempre podràs canviar la classe generada com tu prefereixis.&lt;br /&gt;
= Encaminament =&lt;br /&gt;
Una ruta és una associació entre un patró d'URL i un controlador. Suposem per exemple que desitges associar URL de tipus ''/blog/el meu-post'' o ''/blog/tot-sobre-symfony'' amb un controlador que sigui capaç de buscar i mostrar l'article sol·licitat.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/routing.yml&lt;br /&gt;
blog_show:&lt;br /&gt;
    path:      /blog/{slug}&lt;br /&gt;
    defaults:  { _controller: AcmeBlogBundle:Blog:show }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Codi PHP del controlador associat a aquesta ruta:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/BlogBundle/Controller/BlogController.php&lt;br /&gt;
 &lt;br /&gt;
namespace Acme\BlogBundle\Controller;&lt;br /&gt;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;&lt;br /&gt;
 &lt;br /&gt;
class BlogController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function showAction($slug)&lt;br /&gt;
    {&lt;br /&gt;
        $blog = // usa la variable $slug para consultar la base de datos&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;render('AcmeBlogBundle:Blog:show.html.twig', array(&lt;br /&gt;
            'blog' =&amp;gt; $blog,&lt;br /&gt;
        ));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquest és l'objectiu del encaminador de Symfony2: associar la URL d'una petició a un controlador&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objectiu del sistema d'encaminament de Symfony2 és analitzar aquesta URL i determinar què controlador s'ha d'executar. El procés complet consta dels següents passos:&lt;br /&gt;
*La petició es processa en el controlador frontal de Symfony2 (per exemple, en l'arxiu''' app.php''').&lt;br /&gt;
*El nucli de Symfony2 (conegut com kernel) sol·licita al enrutador que examini la petició.&lt;br /&gt;
*El enrutador busca què patró de les rutes de l'aplicació coincideix amb la URL entrant i retorna informació sobre la ruta, incloent el controlador que s'ha d'executar.&lt;br /&gt;
*El nucli de Symfony2 executa el controlador, que en última instància, retorna un objecte '''Response'''.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:funcionament-routing.png]]&lt;br /&gt;
&lt;br /&gt;
== Prefix a les rutes ==&lt;br /&gt;
&lt;br /&gt;
Resulta habitual haver d'afegir un prefix a totes les rutes importades des d'un arxiu extern. Si vols per exemple que el patró de la ruta '''acme_hello''' sigui '''/admin/hello/{name}''' en comptes de''' /hello/{name}''', afegeix l'opció prefix en importar les rutes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/routing.yml&lt;br /&gt;
acme_hello:&lt;br /&gt;
    resource: &amp;quot;@AcmeHelloBundle/Resources/config/routing.yml&amp;quot;&lt;br /&gt;
    prefix:   /admin&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
El valor indicat en l'opció prefix (en aquest cas '''/admin''') s'afegeix per davant de tots els patrons de les rutes importades des de l'arxiu extern.&lt;br /&gt;
&lt;br /&gt;
= Sessions a Symfony2=&lt;br /&gt;
&lt;br /&gt;
Symfony2 inclou un objecte de sessió que permet emmagatzemar informació persistent sobre l'usuari, és a dir, informació que es guarda d'una petició a una altra. Per defecte Symfony2 emmagatzema la informació en una cookie usant les sessions natives de PHP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
 &lt;br /&gt;
public function indexAction(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    $session = $request-&amp;gt;getSession();&lt;br /&gt;
 &lt;br /&gt;
    // guarda un atributo para reutilizarlo durante una&lt;br /&gt;
    // petición posterior del usuario&lt;br /&gt;
    $session-&amp;gt;set('foo', 'bar');&lt;br /&gt;
 &lt;br /&gt;
    // obtener el valor de un atributo de la sesión&lt;br /&gt;
    $foo = $session-&amp;gt;get('foo');&lt;br /&gt;
 &lt;br /&gt;
    // utilizar un valor por defecto si el atributo no existe&lt;br /&gt;
    $filters = $session-&amp;gt;get('filters', array());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Plantilles TWIG=&lt;br /&gt;
Una plantilla és un arxiu de text que pot generar qualsevol altre format basat en text (HTML, XML, CSV, LaTeX, etc.). Les plantilles PHP són les més populars, com la qual mostra el següent exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
    &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;¡Bienvenido a Symfony!&amp;lt;/title&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;&amp;lt;?php echo $page_title ?&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;ul id=&amp;quot;navigation&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;?php foreach ($navigation as $item): ?&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;&amp;lt;?php echo $item-&amp;gt;getHref() ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;?php echo $item-&amp;gt;getCaption() ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/a&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Symfony2 inclou un llenguatge de plantilles anomenat '''Twig''' que és molt més potent i elegant que PHP. Gràcies a Twig pots crear plantilles molt concises i fàcils de llegir, per la qual cosa a més són fàcils d'entendre per part dels dissenyadors web. Observa el mateix exemple anterior definit com a plantilla Twig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
    &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;¡Bienvenido a Symfony!&amp;lt;/title&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;{{ page_title }}&amp;lt;/h1&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;ul id=&amp;quot;navigation&amp;quot;&amp;gt;&lt;br /&gt;
            {% for item in navigation %}&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;{{ item.href }}&amp;quot;&amp;gt;{{ item.caption }}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
            {% endfor %}&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Twig es basa en dues etiquetes especials:&lt;br /&gt;
&lt;br /&gt;
*'''{ { ... } }''': serveix per mostrar el contingut d'una variable o el resultat de realitzar alguna operació o processar alguna expressió. En PHP la construcció equivalent és ''echo'' o ''print''.&lt;br /&gt;
*'''{% ... %}''': serveix per definir la lògica de la plantilla, és a dir, la part de programació que controla com es mostren els continguts de la plantilla. Entre uns altres, aquesta etiqueta s'empra per a les instruccions ''if'' i per als bucles ''for''.&lt;br /&gt;
&lt;br /&gt;
==Herència de plantilles i layout==&lt;br /&gt;
Normalment les plantilles d'un mateix projecte comparteixen molts elements comuns, com per exemple la capçalera, el peu de pàgina, una barra lateral, etc. Symfony2 resol aquest problema de forma molt senzilla: una plantilla pot decorar el contingut d'una altra plantilla.&lt;br /&gt;
&lt;br /&gt;
La idea és exactament la mateixa que l'herència de classes PHP: l'herència de plantilles et permet crear una plantilla basi cridada layout i que conté tots els elements comuns del lloc definits com a blocs. Després, les plantilles filla hereten del layout i emplenen o modifiquen aquests blocs.&lt;br /&gt;
&lt;br /&gt;
En primer lloc, crea un arxiu amb el teu disseny base:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# app/Resources/views/base.html.twig #}&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
    &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=utf-8&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;{% block title %}Test Application{% endblock %}&amp;lt;/title&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;sidebar&amp;quot;&amp;gt;&lt;br /&gt;
            {% block sidebar %}&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/blog&amp;quot;&amp;gt;Blog&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
            {% endblock %}&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;div id=&amp;quot;contenido&amp;quot;&amp;gt;&lt;br /&gt;
            {% block body %}{% endblock %}&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Aquesta plantilla defineix l'esquelet d'una pàgina HTML simple de dues columnes. En aquest exemple, '''es defineixen tres blocs amb l'etiqueta {% block %} (title, sidebar i body)'''. Les '''plantilles filla''' poden '''modificar''' els continguts de cadascun dels '''blocs'' o deixar-los tal com estan en la plantilla base.&lt;br /&gt;
&lt;br /&gt;
El següent exemple mostra l'aspecte d'una plantilla filla:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/BlogBundle/Resources/views/Blog/index.html.twig #}&lt;br /&gt;
{% extends '::base.html.twig' %}&lt;br /&gt;
 &lt;br /&gt;
{% block title %}My cool blog posts{% endblock %}&lt;br /&gt;
 &lt;br /&gt;
{% block body %}&lt;br /&gt;
    {% for entry in blog_entries %}&lt;br /&gt;
        &amp;lt;h2&amp;gt;{{ entry.title }}&amp;lt;/h2&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;{{ entry.body }}&amp;lt;/p&amp;gt;&lt;br /&gt;
    {% endfor %}&lt;br /&gt;
{% endblock %}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La clau de l'herència de plantilles és l'etiqueta '''{% extends %}'''. D'aquesta forma el motor de plantilles sap que primer ha de processar la plantilla base, que defineix el disseny de la pàgina i crea diversos blocs de continguts. Després es renderitza la plantilla filla, que reemplaça el contingut dels blocs '''title''' i '''body''' del pare.&lt;br /&gt;
&lt;br /&gt;
Quan treballis amb l'herència de plantilles, tingues en compte:&lt;br /&gt;
*Si inclous l'etiqueta '''{% extends %}''' en una plantilla, aquesta ha de ser la primera etiqueta d'aquesta plantilla.&lt;br /&gt;
*Quantes més etiquetes '''{% block %}''' tinguis en la teva plantilla basi, millor. Recorda que les plantilles filla no tenen l'obligació d'emplenar tots els blocs dels pares, per la qual cosa pots definir tants blocs com vulguis i assignar a cadascun un valor per defecte que sigui lògic per a la major part de les pàgines del lloc. Quants més blocs defineixi el layout, més flexible serà el seu disseny.&lt;br /&gt;
*Si còpies i pegues algun contingut en diverses plantilles, segurament serà millor que moguis aquest contingut a algun bloc del layout. En altres casos el millor és col·locar aquest contingut en alguna altra plantilla i incloure-la amb l'etiqueta '''include''' sempre que sigui necessari.&lt;br /&gt;
*Si vols obtenir el contingut d'algun bloc de la plantilla pare, utilitza la funció''' { { parent() } }'''. Això és molt útil quan vols afegir continguts propis a qualsevol altre contingut que el pare pugui haver definit per a aquest bloc:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{% block sidebar %}&lt;br /&gt;
    &amp;lt;h3&amp;gt;Table of Contents&amp;lt;/h3&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    {# ... #}&lt;br /&gt;
 &lt;br /&gt;
    {{ parent() }}&lt;br /&gt;
{% endblock %}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Localització de les plantilles==&lt;br /&gt;
Les plantilles es troben en dos llocs diferents:&lt;br /&gt;
&lt;br /&gt;
*'''app/Resources/views/''': el directori on s'emmagatzemen les plantilles globals de l'aplicació, com per exemple la plantilla del layout i les plantilles utilitzades per redefinir les plantilles incloses en els bundles de Symfony2.&lt;br /&gt;
*'''ruta/fins a/el/bundle/Resources/views/''': els bundles emmagatzemen les seves pròpies plantilles en el directori '''Resources/views/''' de cada bundle. La immensa majoria de les plantilles s'emmagatzemen dins d'algun bundle.&lt;br /&gt;
Symfony2 identifica a cada plantilla amb la sintaxi especial '''bundle:controlador:plantilla'''. Això permet definir diferents tipus de plantilla, cadascuna emmagatzemada en un lloc diferent:&lt;br /&gt;
&lt;br /&gt;
'''AcmeBlogBundle:Blog:index.html.twig''': indica la plantilla d'una pàgina específica. Est és el significat de cadascuna de les tres parts de la cadena:&lt;br /&gt;
*'''AcmeBlogBundle''': (bundle) la plantilla es troba dins del bundle '''AcmeBlogBundle''' (per exemple, ''src/Acme/BlogBundle'').&lt;br /&gt;
*'''Blog''': (controlador) indica que la plantilla s'emmagatzema en el subdirectori Blog de '''Resources/views'''.&lt;br /&gt;
*'''index.html.twig''': (plantilla) el nom de l'arxiu que guarda la plantilla és '''index.html.twig'''. Suposant que '''AcmeBlogBundle''' es trobi en '''src/Acme/BlogBundle''', la ruta completa de la plantilla seria '''src/Acme/BlogBundle/Resources/views/Blog/index.html.twig'''.&lt;br /&gt;
&lt;br /&gt;
*'''AcmeBlogBundle::layout.html.twig''': indica que és una plantilla global del bundle indicat. Com a falta la part central que es refereix al controlador, aquesta plantilla '''no es troba''' dins de cap subdirectori de '''Resources/views/'''. En altres paraules, '''la ruta '''completa de la plantilla és '''Resources/views/layout.html.twig''' dins del bundle AcmeBlogBundle.&lt;br /&gt;
*'''::base.html.twig''': indica que és una plantilla global de l'aplicació. Observa que la cadena comença amb dos parells de dos punts '''(::)''', per la qual cosa falta la part del bundle i la del controlador. En altres paraules, aquesta plantilla no es troba en cap bundle sinó directament dins de '''app/Resources/views/'''.&lt;br /&gt;
&lt;br /&gt;
== Etiquetes Twig==&lt;br /&gt;
===Incloent unes altres plantilles===&lt;br /&gt;
Resulta habitual voler incloure la mateixa plantilla o fragment de codi a diverses pàgines diferents. Si l'aplicació té per exemple un llistat d'articles, el codi de la plantilla que mostra un article es pot utilitzar a la pàgina de detall de l'article, en una pàgina que mostra els articles més populars, o en una llista dels articles més recents.&lt;br /&gt;
&lt;br /&gt;
En PHP, quan necessites reutilitzar un tros de codi, normalment mous el codi a una nova classe o funció. En les plantilles s'aplica la mateixa idea:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/ArticleBundle/Resources/views/Article/articleDetails.html.twig #}&lt;br /&gt;
&amp;lt;h2&amp;gt;{{ article.title }}&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;h3 class=&amp;quot;byline&amp;quot;&amp;gt;by {{ article.authorName }}&amp;lt;/h3&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
    {{ article.body }}&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ara ja pots incloure fàcilment aquesta plantilla en qualsevol una altra:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/ArticleBundle/Resources/views/Article/list.html.twig #}&lt;br /&gt;
{% extends 'AcmeArticleBundle::layout.html.twig' %}&lt;br /&gt;
 &lt;br /&gt;
{% block body %}&lt;br /&gt;
    &amp;lt;h1&amp;gt;Recent Articles&amp;lt;h1&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    {% for article in articles %}&lt;br /&gt;
        {{ include(&lt;br /&gt;
            'AcmeArticleBundle:Article:articleDetails.html.twig',&lt;br /&gt;
            {'article': article}&lt;br /&gt;
        ) }}&lt;br /&gt;
    {% endfor %}&lt;br /&gt;
{% endblock %}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Renderitzant plantilles enviant-li dades des de el controlador==&lt;br /&gt;
Imagina que en el teu lloc web tens una barra lateral que mostra els tres articles més recents. Per obtenir aquests tres articles és necessari realitzar una consulta a la base de dades o alguna altra operació similar que no es pot incloure en la pròpia plantilla.&lt;br /&gt;
&lt;br /&gt;
La solució consisteix a inserir en la plantilla el resultat retornat per un controlador de l'aplicació. En primer lloc, crea un controlador que renderitzi el llistat dels articles recents:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/ArticleBundle/Controller/ArticleController.php&lt;br /&gt;
class ArticleController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function recentArticlesAction($max = 3)&lt;br /&gt;
    {&lt;br /&gt;
        // hace una llamada a la base de datos u otra lógica&lt;br /&gt;
        // para obtener los &amp;quot;$max&amp;quot; artículos más recientes&lt;br /&gt;
        $articles = ...;&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;render(&lt;br /&gt;
            'AcmeArticleBundle:Article:recentList.html.twig',&lt;br /&gt;
            array('articles' =&amp;gt; $articles)&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
i a la plantilla es pot utilitzar les dades del array enviat des del controlador directament:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/ArticleBundle/Resources/views/Article/recentList.html.twig #}&lt;br /&gt;
{% for article in articles %}&lt;br /&gt;
    &amp;lt;a href=&amp;quot;/article/{{ article.slug }}&amp;quot;&amp;gt;&lt;br /&gt;
        {{ article.title }}&lt;br /&gt;
        &amp;lt;/a&amp;gt;&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per mostrar en qualsevol plantilla el resultat d'executar un controlador, utilitza la funció render i identifica al controlador utilitzant la notació especial '''bundle:controlador:acció''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# app/Resources/views/base.html.twig #}&lt;br /&gt;
 &lt;br /&gt;
{# ... #}&lt;br /&gt;
&amp;lt;div id=&amp;quot;sidebar&amp;quot;&amp;gt;&lt;br /&gt;
    {{ render(controller('AcmeArticleBundle:Article:recentArticles', {&lt;br /&gt;
        'max': 3&lt;br /&gt;
    })) }}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de IF dintre del twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{% if kenny.sick %}&lt;br /&gt;
    Kenny is sick.&lt;br /&gt;
{% elseif kenny.dead %}&lt;br /&gt;
    You killed Kenny! You bastard!!!&lt;br /&gt;
{% else %}&lt;br /&gt;
    Kenny looks okay --- so far&lt;br /&gt;
{% endif %}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Enllaçant pàgines==&lt;br /&gt;
Crear enllaços a altres pàgines de l'aplicació és una de les tasques més comunes d'una plantilla. En lloc de generar a mà les URL dins de la plantilla, utilitza la funció path de Twig (o el helper router en PHP) per generar les URL utilitzant la configuració del sistema de encaminament. D'aquesta manera, si més endavant vols canviar l'aspecte de qualsevol URL, només has d'actualitzar un arxiu de configuració i totes les URL de les plantilles s'actualitzaran instantàniament.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;{{ path('_welcome') }}&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
On '''_welcome''' està definit al fitxer de routes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
_welcome:&lt;br /&gt;
    path:     /&lt;br /&gt;
    defaults: { _controller: AcmeDemoBundle:Welcome:index }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Enllaçant arxius web (css, javascript)==&lt;br /&gt;
Les plantilles de les aplicacions web solen enllaçar amb els web '''assets'' o arxius web, tals com a imatges, fulles d'estil CSS, arxius Javascript, etc.&lt;br /&gt;
&lt;br /&gt;
A la versió 2.8 ja no s'instal·la '''assetic''' per defecte i s'ha d'instal·lar utilitzant aquesta guia: &lt;br /&gt;
http://symfony.com/doc/current/cookbook/assetic/asset_management.html&lt;br /&gt;
&lt;br /&gt;
'''Quan passem a producció hem d'executar:'''&lt;br /&gt;
 sudo php app/console assetic:dump --env=prod --no-debug&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 De nou no és aconsellable generar a mà les URL d'aquest tipus d'arxius, ja que Symfony2 ofereix una solució millor i molt més flexible mitjançant la funció '''asset''' de Twig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ asset('images/logo.png') }}&amp;quot; alt=&amp;quot;Symfony!&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;link href=&amp;quot;{{ asset('css/blog.css') }}&amp;quot; rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La gestió dels arxius CSS i dels arxius Javascript es realitza mitjançant la herència de plantilles. A la plantilla para es pot incloure els arxius que s'utilitzarà a tota la aplicació i després, a les plantilles filles, es poden incloure fitxers específics per aquella part de la web:&lt;br /&gt;
Plantilla pare:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# app/Resources/views/base.html.twig #}&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
    {# ... #}&lt;br /&gt;
 &lt;br /&gt;
    {% block stylesheets %}&lt;br /&gt;
        &amp;lt;link href=&amp;quot;{{ asset('css/main.css') }}&amp;quot; type=&amp;quot;text/css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; /&amp;gt;&lt;br /&gt;
    {% endblock %}&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
    {# ... #}&lt;br /&gt;
 &lt;br /&gt;
    {% block javascripts %}&lt;br /&gt;
        &amp;lt;script src=&amp;quot;{{ asset('js/main.js') }}&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    {% endblock %}&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
i les plantilles filles redefineixen els blocs tot utilitzant la configuració que hi ha en la plantilla pare:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/DemoBundle/Resources/views/Contact/contact.html.twig #}&lt;br /&gt;
{% extends '::base.html.twig' %}&lt;br /&gt;
 &lt;br /&gt;
{% block stylesheets %}&lt;br /&gt;
    {{ parent() }}&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;link href=&amp;quot;{{ asset('css/contact.css') }}&amp;quot; type=&amp;quot;text/css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; /&amp;gt;&lt;br /&gt;
{% endblock %}&lt;br /&gt;
 &lt;br /&gt;
{# ... #}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les plantilles també poden enllaçar arxius que es trobin en el directori Resources/public de qualsevol bundle. Per fer que aquests arxius estiguin disponibles en l'aplicació, executa la comanda:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php app/console assets:install directorio [--symlink]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Si al utilitzar ''assets'' en producció no funciona:===&lt;br /&gt;
http://symfony.com/doc/current/cookbook/assetic/asset_management.html#cookbook-assetic-dumping&lt;br /&gt;
&lt;br /&gt;
== Variables globals que es poden utilitzar directament a les plantilles ==&lt;br /&gt;
*'''app.security''' - el context de seguretat.&lt;br /&gt;
*'''app.user''' - l'objecte qeu representa a l'usuari que està visitant l'aplicació.&lt;br /&gt;
*'''app.request''' - l'objecte Request que conté tota la informació de la petició.&lt;br /&gt;
*'''app.session''' - l'objecte Session relacionat amb l'usuari.&lt;br /&gt;
*'''app.environment''' - l'entorn en el qual s'està executant l'aplicació (dev, prod, etc.)&lt;br /&gt;
*'''app.debug''' - val true si l'aplicació s'està executant en la manera de depuració i false en un altre cas.&lt;br /&gt;
=Formularis=&lt;br /&gt;
Guia Symfony per crear i utilitzar formularis:&lt;br /&gt;
http://symfony.com/doc/2.8/book/forms.html&lt;br /&gt;
&lt;br /&gt;
Symfony incorpora unes llibreries que permeten utilitzar els formularis associant-los amb clases PHP. Exemple:&lt;br /&gt;
Classe Tasca:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/TaskBundle/Entity/Task.php&lt;br /&gt;
namespace Acme\TaskBundle\Entity;&lt;br /&gt;
 &lt;br /&gt;
class Task&lt;br /&gt;
{&lt;br /&gt;
    // descripción de la tarea&lt;br /&gt;
    protected $task;&lt;br /&gt;
 &lt;br /&gt;
    // fecha en la que debe estar completada&lt;br /&gt;
    protected $dueDate;&lt;br /&gt;
 &lt;br /&gt;
    public function getTask()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;task;&lt;br /&gt;
    }&lt;br /&gt;
    public function setTask($task)&lt;br /&gt;
    {&lt;br /&gt;
        $this-&amp;gt;task = $task;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public function getDueDate()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;dueDate;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public function setDueDate(\DateTime $dueDate = null)&lt;br /&gt;
    {&lt;br /&gt;
        $this-&amp;gt;dueDate = $dueDate;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per crear el formulari on demanem totes, o algunes, de les dades que necessitem per crear la tasca anterior fariem el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/TaskBundle/Controller/DefaultController.php&lt;br /&gt;
namespace Acme\TaskBundle\Controller;&lt;br /&gt;
 &lt;br /&gt;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;&lt;br /&gt;
use Acme\TaskBundle\Entity\Task;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
 &lt;br /&gt;
class DefaultController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function newAction(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        // crea una task y le asigna algunos datos ficticios para este ejemplo&lt;br /&gt;
        $task = new Task();&lt;br /&gt;
        $task-&amp;gt;setTask('Write a blog post');&lt;br /&gt;
        $task-&amp;gt;setDueDate(new \DateTime('tomorrow'));&lt;br /&gt;
 &lt;br /&gt;
        $form = $this-&amp;gt;createFormBuilder($task)&lt;br /&gt;
            -&amp;gt;add('task', 'text')&lt;br /&gt;
            -&amp;gt;add('dueDate', 'date')&lt;br /&gt;
            -&amp;gt;add('save', 'submit')&lt;br /&gt;
            -&amp;gt;getForm();&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;render('AcmeTaskBundle:Default:new.html.twig', array(&lt;br /&gt;
            'formulari' =&amp;gt; $form-&amp;gt;createView(),&lt;br /&gt;
        ));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilitzant el formulari en una plantilla TWIG:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #}&lt;br /&gt;
 &lt;br /&gt;
{{ form(formulari) }}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Processant l'enviament del formulari==&lt;br /&gt;
Exemple del controlador que envia i reb les dades d'un formulari:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function newAction(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    // crear un objeto $task nuevo (borra los datos de prueba)&lt;br /&gt;
    $task = new Task();&lt;br /&gt;
 &lt;br /&gt;
    $form =  $this-&amp;gt;createFormBuilder($task)&lt;br /&gt;
    -&amp;gt;setAction($this-&amp;gt;generateUrl('target_route'))&lt;br /&gt;
    -&amp;gt;setMethod('GET')&lt;br /&gt;
    -&amp;gt;add('task', 'text')&lt;br /&gt;
    -&amp;gt;add('dueDate', 'date')&lt;br /&gt;
    -&amp;gt;add('save', 'submit')&lt;br /&gt;
    -&amp;gt;getForm();&lt;br /&gt;
 &lt;br /&gt;
    $form-&amp;gt;handleRequest($request);&lt;br /&gt;
 &lt;br /&gt;
    if ($form-&amp;gt;isValid()) {&lt;br /&gt;
        // guardar la tarea en la base de datos&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;redirect($this-&amp;gt;generateUrl('task_success'));&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Quan es carrega per primera vegada la pàgina associada a aquest controlador, es crea i renderiza el formulari. El mètode '''handleRequest() ''' detecta que el formulari no s'ha enviat i per tant, no fa gens.El mètode '''isValid()''' retorna false si el formulari no s'ha enviat.&lt;br /&gt;
*Quan l'usuari envia el formulari, el mètode '''handleRequest()''' ho detecta i guarda immediatament les dades enviades en les propietats '''task i dueDate''' de l'objecte''' $task.''' Després es valida aquest objecte. Si no és vàlid, el mètode '''isValid()''' retorna '''false''' una altra vegada, per la qual cosa es torna a mostrar el formulari, aquesta vegada amb els missatges d'error corresponents. Si solament vols comprovar si el formulari s'ha enviat, independentment de si és vàlid o no, utilitza el mètode '''isSubmitted()'''.&lt;br /&gt;
*Quan l'usuari envia el formulari amb dades vàlides, les dades enviades es guarden de nou en el formulari, però aquesta vegada el mètode '''isValid()''' retorna '''true'''. En aquest moment ja pots treballar amb l'objecte '''$task''' (per exemple guardant-ho en una base de dades) abans de redirigir a l'usuari a una altra pàgina (per exemple a la pàgina d'agraïment o a la qual mostra un missatge determinat).&lt;br /&gt;
&lt;br /&gt;
=Seguretat=&lt;br /&gt;
És un procés de dues etapes que el seu objectiu és evitar que un usuari accedeixi a un recurs pel qual no hauria de tenir accés.&lt;br /&gt;
&lt;br /&gt;
En el primer pas del procés, el sistema de seguretat identifica qui és l'usuari obligant-ho a enviar algun tipus d'identificació. Això es diu autenticació, i significa que el sistema està tractant d'esbrinar qui ets.&lt;br /&gt;
&lt;br /&gt;
Una vegada que el sistema sap qui ets, el següent pas és decidir si hauries de tenir accés a un determinat recurs. Aquesta part del procés es diu autorització, i significa que el sistema està comprovant si tens suficients privilegis per realitzar una determinada acció.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:seguretat-symfony.png]]&lt;br /&gt;
&lt;br /&gt;
==Firewalls (autenticació)==&lt;br /&gt;
&lt;br /&gt;
El sistema de seguretat de Symfony s'activa quan un usuari fa una petició a una URL que està protegida per un '''firewall''' o tallafocs. El treball del firewall ''consisteix a determinar si l'usuari necessita estar autenticat'', i si ho necessita, enviar una resposta a l'usuari per iniciar el procés d'autenticació.&lt;br /&gt;
&lt;br /&gt;
Un ''firewall s'activa quan la URL d'una petició entrant concorda amb el valor de la seva opció de configuració '''pattern'''''. En aquest exemple el valor de pattern''' (^/)''' concorda amb qualsevol petició entrant. No obstant això, el fet que el firewall estigui activat no significa que el navegador mostra la caixa de login+contrasenya per a totes les URL. Els usuaris poden accedir per exemple a /foo sense que l'aplicació els demani que s'autentiquin.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:firewall-symfony.png]]&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/security.yml&lt;br /&gt;
security:&lt;br /&gt;
    firewalls:&lt;br /&gt;
        secured_area:&lt;br /&gt;
            pattern:    ^/&lt;br /&gt;
            anonymous: ~&lt;br /&gt;
            http_basic:&lt;br /&gt;
                realm: &amp;quot;Secured Demo Area&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    access_control:&lt;br /&gt;
        - { path: ^/admin, roles: ROLE_ADMIN }&lt;br /&gt;
        # Descomenta la siguiente línea para proteger también&lt;br /&gt;
        # la propia URL /admin&lt;br /&gt;
        # - { path: ^/admin$, roles: ROLE_ADMIN }&lt;br /&gt;
&lt;br /&gt;
    providers:&lt;br /&gt;
        in_memory:&lt;br /&gt;
            memory:&lt;br /&gt;
                users:&lt;br /&gt;
                    ryan:  { password: ryanpass, roles: 'ROLE_USER' }&lt;br /&gt;
                    admin: { password: kitten, roles: 'ROLE_ADMIN' }&lt;br /&gt;
&lt;br /&gt;
    encoders:&lt;br /&gt;
        Symfony\Component\Security\Core\User\User: plaintext&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquest funcionament és possible en primer lloc perquè el firewall permet l'accés als usuaris anònims a causa de l'opció de configuració anonymous. En altres paraules, el firewall no exigeix que tots els usuaris s'autentiquin res més accedir a l'aplicació. I com en la configuració de la secció access_control no s'indica que els usuaris hagin de tenir cap role especial per accedir a /foo la petició es processa sense requerir a l'usuari que s'autentiqui.&lt;br /&gt;
&lt;br /&gt;
Si elimines l'opció anonymous, l'efecte és que ara el firewall demana autenticació a qualsevol recurs.&lt;br /&gt;
&lt;br /&gt;
Seguint amb el mateix exemple, si un usuari sol·licita '''/admin/foo''', l'aplicació es comporta de manera diferent. Això és a causa de la configuració de la secció '''access_control''', que indica que qualsevol URL que coincideixi amb l'expressió regular '''^/admin''' (és a dir, la URL '''/admin''' o qualsevol altra URL que coincideixi amb /admin/) requereix el rol''' ROLE_ADMIN'''. Els rols són la clau del sistema d'autorització: l'usuari pot accedir a '''/admin/foo''' només si compta amb el rol'''ROLE_ADMIN'''.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:access-symfony.png ]]&lt;br /&gt;
&lt;br /&gt;
La capa de control d'accés denega l'accés a l'usuari (perquè els usuaris anònims no compten amb el rol ROLE_ADMIN), el firewall pren el control de l'aplicació i inicia el procés d'autenticació.&lt;br /&gt;
&lt;br /&gt;
==Utilitzant el típic formulari de accés==&lt;br /&gt;
En primer lloc, afegeix l'opció form_login en la configuració del firewall:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/security.yml&lt;br /&gt;
security:&lt;br /&gt;
    firewalls:&lt;br /&gt;
        secured_area:&lt;br /&gt;
            pattern:    ^/&lt;br /&gt;
            anonymous:  ~&lt;br /&gt;
            form_login:&lt;br /&gt;
                login_path:  login&lt;br /&gt;
                check_path:  login_check&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El sistema de seguretat inicia el procés d'autenticació, es redirigeix a l'usuari a la ruta que mostra el formulari d'accés (per defecte '''/login'''). El'' formulari has de crear-ho tu mateix a mà, ja que Symfony no ho proporciona''. Primer crea les dues noves rutes utilitzades en la configuració de la seguretat: la ruta '''login''' mostra el formulari (es correspon amb la URL''' /login''') i '''login_check''' que processa l'enviament del formulari (es correspon amb la URL '''/login_check)''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/routing.yml&lt;br /&gt;
login:&lt;br /&gt;
    pattern:   /login&lt;br /&gt;
    defaults:  { _controller: AcmeSecurityBundle:Security:login }&lt;br /&gt;
login_check:&lt;br /&gt;
    pattern:   /login_check&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observa que el nom de la ruta '''login''' coincideix amb el valor de l'opció '''login_path''', ja que és on el sistema de seguretat redirigeix als usuaris que necessiten autenticar-se.&lt;br /&gt;
&lt;br /&gt;
A continuació, crea el controlador que mostra el formulari de accés:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/SecurityBundle/Controller/SecurityController.php;&lt;br /&gt;
namespace Acme\SecurityBundle\Controller;&lt;br /&gt;
 &lt;br /&gt;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
use Symfony\Component\Security\Core\SecurityContext;&lt;br /&gt;
 &lt;br /&gt;
class SecurityController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function loginAction(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $session = $request-&amp;gt;getSession();&lt;br /&gt;
 &lt;br /&gt;
        // get the login error if there is one&lt;br /&gt;
        if ($request-&amp;gt;attributes-&amp;gt;has(SecurityContext::AUTHENTICATION_ERROR)) {&lt;br /&gt;
            $error = $request-&amp;gt;attributes-&amp;gt;get(&lt;br /&gt;
                SecurityContext::AUTHENTICATION_ERROR&lt;br /&gt;
            );&lt;br /&gt;
        } else {&lt;br /&gt;
            $error = $session-&amp;gt;get(SecurityContext::AUTHENTICATION_ERROR);&lt;br /&gt;
            $session-&amp;gt;remove(SecurityContext::AUTHENTICATION_ERROR);&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;render(&lt;br /&gt;
            'AcmeSecurityBundle:Security:login.html.twig',&lt;br /&gt;
            array(&lt;br /&gt;
                // last username entered by the user&lt;br /&gt;
                'last_username' =&amp;gt; $session-&amp;gt;get(SecurityContext::LAST_USERNAME),&lt;br /&gt;
                'error'         =&amp;gt; $error,&lt;br /&gt;
            )&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si l'usuari envia un nom d'usuari o contrasenya no vàlids, aquest controlador obté el missatge d'error del sistema de seguretat i ho mostra a l'usuari.&lt;br /&gt;
Tu t'encarregues de mostrar el formulari a l'usuari i els errors que puguin haver ocorregut, però ''el propi sistema de seguretat s'encarrega de verificar el nom d'usuari i contrasenya i l'autenticació de l'usuari''.&lt;br /&gt;
Plantilla del formulari:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/SecurityBundle/Resources/views/Security/login.html.twig #}&lt;br /&gt;
{% if error %}&lt;br /&gt;
    &amp;lt;div&amp;gt;{{ error.message }}&amp;lt;/div&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ path('login_check') }}&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;label for=&amp;quot;username&amp;quot;&amp;gt;Username:&amp;lt;/label&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;username&amp;quot; name=&amp;quot;_username&amp;quot; value=&amp;quot;{{ last_username }}&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;label for=&amp;quot;password&amp;quot;&amp;gt;Password:&amp;lt;/label&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;password&amp;quot; id=&amp;quot;password&amp;quot; name=&amp;quot;_password&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    {#&lt;br /&gt;
        añade lo siguiente si quieres redirigir al usuario a una&lt;br /&gt;
        URL concreta después del login (explicado más adelante)&lt;br /&gt;
        &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;_target_path&amp;quot; value=&amp;quot;/account&amp;quot; /&amp;gt;&lt;br /&gt;
    #}&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;login&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=Webgrafia=&lt;br /&gt;
Els llibres sobre symfony utilitzats per elaborar un resum de les funcionalitats més importants els podeu trobar a : [http://librosweb.es/libros/ http://librosweb.es/libros/]&lt;br /&gt;
&lt;br /&gt;
També s'ha utilitzat el llibre oficial que podeu trobar a la web:[http://symfony.com/doc/current/book/index.html http://symfony.com/]&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_PHP_(15h)&amp;diff=7180</id>
		<title>NF2 - Framework PHP (15h)</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_PHP_(15h)&amp;diff=7180"/>
				<updated>2016-06-17T14:43:02Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* Renderitzant plantilles enviant-li dades des de el controlador */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introducció a Symfony=&lt;br /&gt;
&amp;lt;div width=&amp;quot;100%&amp;quot; style=&amp;quot;clear:both; &amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:30%;&amp;quot;&amp;gt;&lt;br /&gt;
[[fitxer:symfony.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:70%;&amp;quot;&amp;gt;&lt;br /&gt;
Un framework simplifica el desenvolupament de les aplicacions, ja que automatitza molts dels patrons utilitzats per resoldre les tasques comunes. A més, un framework proporciona estructura al codi font, forçant al desenvolupador a crear codi més llegible i més fàcil de mantenir. Finalment, un framework facilita la programació d'aplicacions, ja que encapsula operacions complexes en instruccions senzilles.&lt;br /&gt;
&lt;br /&gt;
Symfony és un complet framework dissenyat per optimitzar, gràcies a les seves característiques, el desenvolupament de les aplicacions web. Per començar, separa la lògica de negoci, la lògica de servidor i la presentació de l'aplicació web. Proporciona diverses eines i classes encaminades a reduir el temps de desenvolupament d'una aplicació web complexa. A més, automatitza les tasques més comunes, permetent al desenvolupador dedicar-se per complet als aspectes específics de cada aplicació. El resultat de tots aquests avantatges és que no s'ha de reinventar la roda cada vegada que es crea una nova aplicació web.&lt;br /&gt;
&lt;br /&gt;
Symfony està desenvolupat completament amb PHP i ha estat provat amb èxit en llocs com Yahoo! Answers, delicious, DailyMotion i molts altres llocs web de primer nivell. Symfony és compatible amb la majoria de gestors de bases de dades, com MySQL, PostgreSQL, Oracle i SQL Server de Microsoft. Es pot executar tant en plataformes Unix (Unix, Linux, etc.) com en plataformes Windows. A continuació es mostren algunes de les seves característiques.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt; &lt;br /&gt;
=Característiques=&lt;br /&gt;
Symfony es va dissenyar perquè s'ajustés als següents requisits:&lt;br /&gt;
&lt;br /&gt;
*Fàcil d'instal·lar i configurar en la majoria de plataformes (i amb la garantia que funciona correctament en els sistemes Windows i *nix estàndards)&lt;br /&gt;
*Independent del sistema gestor de bases de dades&lt;br /&gt;
*Senzill d'usar en la majoria de casos, però prou flexible com per adaptar-se als casos més complexos&lt;br /&gt;
*Basat en la premissa de &amp;quot;convenir en comptes de configurar&amp;quot;, en la qual el desenvolupador solament ha de configurar allò que no és convencional&lt;br /&gt;
*Segueix la majoria de millors pràctiques i patrons de disseny per a la web&lt;br /&gt;
*Preparat per a aplicacions empresarials i adaptable a les polítiques i arquitectures pròpies de cada empresa, a més de ser prou estable com per desenvolupar aplicacions a llarg termini&lt;br /&gt;
*Codi fàcil de llegir que inclou comentaris de phpDocumentor i que permet un manteniment molt senzill&lt;br /&gt;
*Fàcil d'estendre, la qual cosa permet la seva integració amb llibreries desenvolupades per tercers&lt;br /&gt;
&lt;br /&gt;
Symfony pot ser completament personalitzat per complir amb els requisits de les empreses que disposen de les seves pròpies polítiques i regles per a la gestió de projectes i la programació d'aplicacions. Per defecte incorpora diversos entorns de desenvolupament diferents i inclou diverses eines que permeten automatitzar les tasques més comunes de l'enginyeria del programari:&lt;br /&gt;
&lt;br /&gt;
Les eines que generen automàticament codi han estat dissenyades per fer prototips d'aplicacions i per crear fàcilment la part de gestió de les aplicacions.&lt;br /&gt;
*El framework de desenvolupament de proves unitàries i funcionals proporciona les eines ideals per al desenvolupament basat en proves &amp;quot;test-driven development&amp;quot;).&lt;br /&gt;
*La barra de depuració web simplifica la depuració de les aplicacions, ja que mostra tota la informació que els programadors necessiten sobre la pàgina en la qual estan treballant.&lt;br /&gt;
*La interfície de línia de comandos automatitza la instal·lació de les aplicacions entre servidors.&lt;br /&gt;
*És possible realitzar canvis &amp;quot;en calent&amp;quot; de la configuració (sense necessitat de reiniciar el servidor).&lt;br /&gt;
*El complet sistema de log permet als administradors accedir fins a l'últim detall de les activitats que realitza l'aplicació.&lt;br /&gt;
&lt;br /&gt;
=Desenvolupament ràpid d'aplicacions (RAD)=&lt;br /&gt;
&lt;br /&gt;
Durant molt temps, la programació d'aplicacions web va ser un tasca tediosa i molt lenta. Seguint els cicles habituals de l'enginyeria del programari (com els proposats pel Procés Racional Unificat o Rational Unified Process) el desenvolupament d'una aplicació web no pot començar fins que s'han establert per escrit una sèrie de requisits, s'han creat els diagrames UML Unified Modeling Language) i s'ha produït abundant documentació sobre el projecte. Aquest model es veia afavorit per la baixa velocitat de desenvolupament, la falta de versatilitat dels llenguatges de programació (abans d'executar el programa s'ha de construir, compilar i reiniciar) i sobretot pel fet que els clients no estaven disposats a adaptar-se a altres metodologies.&lt;br /&gt;
&lt;br /&gt;
Avui dia, les empreses reaccionen més ràpidament i els clients canvien d'opinió constantment durant el desenvolupament dels projectes. D'aquesta manera, els equips de desenvolupament han d'adaptar-se a aquestes necessitats i han de poder canviar l'estructura d'una aplicació de forma ràpida. Afortunadament, l'ús de llenguatges de script com Python, Ruby i PHP permeten seguir altres estratègies de programació, com RAD (desenvolupament ràpid d'aplicacions) i el desenvolupament àgil de programari.&lt;br /&gt;
&lt;br /&gt;
Una de les idees centrals d'aquesta metodologia és que el desenvolupament comença al més aviat possible perquè el client pugui revisar un prototip que funciona i pugui indicar el camí a seguir. A partir d'aquí, l'aplicació es desenvolupa de forma iterativa, en la qual cada nova versió incorpora noves funcionalitats i es desenvolupa en un breu espai de temps.&lt;br /&gt;
&lt;br /&gt;
Les conseqüències d'aquestes metodologies per al desenvolupador són nombroses. El programador no ha de pensar sobre les versions futures en incloure una nova funcionalitat. Els mètodes utilitzats han de ser el més senzills i directes possibles. Aquestes idees es resumeixen en el principi denominat ''KISS'': Fes-ho senzill, idiota!''Keep It Simple, Stupid''&lt;br /&gt;
&lt;br /&gt;
Quan es modifiquen els requisits o quan s'afegeix una nova funcionalitat, normalment s'ha de reescriure part del codi existent. Aquest procés es diu refactorización i succeeix sovint durant el desenvolupament d'una aplicació web. El codi sol moure's a altres llocs en funció de la seva naturalesa. Els blocs de codi repetits es refactorizan en un únic lloc, aplicant el principi ''DRY'': No et repeteixis ''Don't Repeat Yourself''.&lt;br /&gt;
&lt;br /&gt;
Per assegurar que l'aplicació segueix funcionant correctament malgrat els canvis constants, es necessita una sèrie de proves unitàries que puguin ser automatitzades. Si estan ben escrites, les proves unitàries permeten assegurar que gens ha deixat de funcionar després d'haver-hi refactorizado part del codi de l'aplicació. Algunes metodologies de desenvolupament d'aplicacions obliguen a escriure les proves abans que el propi codi, la qual cosa es coneix com TDD: desenvolupament basat en proves ''test-driven development.''&lt;br /&gt;
&lt;br /&gt;
Symfony és l'eina ideal pel RAD. De fet, el framework ha estat desenvolupat per una empresa que aplica el RAD als seus propis projectes. Per aquest motiu, aprendre a utilitzar Symfony no és com aprendre un nou llenguatge de programació, sinó que consite a aprendre a prendre les decisions correctes per desenvolupar les aplicacions de forma més efectiva.&lt;br /&gt;
&lt;br /&gt;
=La implementació del MVC que realitza Symfony=&lt;br /&gt;
*La capa del Modelo&lt;br /&gt;
**Abstracció de la base de dades&lt;br /&gt;
**Accés a les dades&lt;br /&gt;
*La capa de la Vista &lt;br /&gt;
**Vista&lt;br /&gt;
**Plantilla&lt;br /&gt;
**Layout&lt;br /&gt;
*La capa del Controlador&lt;br /&gt;
**Controlador frontal&lt;br /&gt;
**Acció&lt;br /&gt;
&lt;br /&gt;
En total són set scripts, la qual cosa semblen molts arxius per obrir i modificar cada vegada que es crea una pàgina. Afortunadament, Symfony simplifica aquest procés. Symfony pren el millor de l'arquitectura MVC i la implementa de manera que el desenvolupament d'aplicacions sigui ràpid i senzill.&lt;br /&gt;
&lt;br /&gt;
En primer lloc, el controlador frontal i el layout són comuns per a totes les accions de l'aplicació. Es poden tenir diversos controladors i diversos layouts, però solament és obligatori tenir un de cada. El controlador frontal és un component que només té codi relatiu al MVC, per la qual cosa no és necessari crear un, ja que Symfony ho genera de forma automàtica.&lt;br /&gt;
&lt;br /&gt;
L'altra bona notícia és que les classes de la capa del model també es generen automàticament, en funció de l'estructura de dades de l'aplicació. El ORM s'encarrega de crear l'esquelet o estructura bàsica de les classes i genera automàticament tot el codi necessari. Quan el ORM troba restriccions de claus foranes (o externes) o quan troba dades de tipus data, crea mètodes especials per accedir i modificar aquestes dades, per la qual cosa la manipulació de dades es converteix en un joc de nens. L'abstracció de la base de dades és completament transparent per al programador, ja que es realitza de forma nativa mitjançant PDO PHP Data Objects). Així, si es canvia el sistema gestor de bases de dades a qualsevol moment, no s'ha de reescriure ni una línia de codi, ja que tan sols és necessari modificar un paràmetre en un arxiu de configuració.&lt;br /&gt;
&lt;br /&gt;
Finalment, la lògica de la vista es pot transformar en un arxiu de configuració senzill, sense necessitat de programar-la.&lt;br /&gt;
&lt;br /&gt;
[[fitxer:mvc-symfony.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Instal·lació de Symfony=&lt;br /&gt;
Utilitzarem la versió de symfony 2.4.&lt;br /&gt;
&lt;br /&gt;
[[Instal·lació de la versió 2.4 de symfony ]] (antic)&lt;br /&gt;
&lt;br /&gt;
[[Instal·lació de la versió LTS 2.8 de symfony ]]&lt;br /&gt;
&lt;br /&gt;
[http://symfony.com/doc/current/index.html Llibre gratuït de symfony2].&lt;br /&gt;
&lt;br /&gt;
Accedeix a la URL:&lt;br /&gt;
http://localhost/m7/web/app.php&lt;br /&gt;
&lt;br /&gt;
'''nota:''' m7 és, en aquest cas, el nomProjecteSymfony utilitzat en la creació del projecte symfony.&lt;br /&gt;
&lt;br /&gt;
Hauries de veure una pàgina com aquesta:&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:symfony2.8_inici.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
==Creació de la primera pàgina:==&lt;br /&gt;
Una vegada executis la línia següent anirà preguntant opcions. Tot per defecte. Al nom del bundle podeu posar: HolaMonBundle&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php app/console generate:bundle --namespace=m7/HolaMon --format=yml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Iniciar el servidor ==&lt;br /&gt;
Symfony pot ser instal·lat dintre d'un servidor apache2 però per entorns de desenvolupament porta un servidor web integrat. Per executar el servidor i poder provar les aplicacions podeu iniciar-lo amb la comanda de terminal:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php app/console server:run&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Si heu engegat el servidor integrat podeu provar la pàgina creada en el punt anterior utilitzant aquesta [http://localhost:8000/ url]&lt;br /&gt;
&lt;br /&gt;
Si teniu apache2 instal·lat, podeu provar la pàgina utilitzant aquesta [http://localhost/m7/web/app.php/ url_apache_m7]&lt;br /&gt;
== Si hi ha un error accedint a la pàgina!!==&lt;br /&gt;
Amb apache2, si en algun moment deixa de funcionar heu de provar de fer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo php app/console cache:clear --env=prod &amp;amp;&amp;amp; sudo php app/console cache:warmup --env=prod&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
i donar-li permisos (una altre vegada) a la carpeta principal (dintre de /var/www/html):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod 777 nomprojecte/ -R&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exercici [opcional]:===&lt;br /&gt;
Utilitzant el servidor web apache2 creeu un virtualhost per poder utilitzar symfony2 directament posant: http://localhost/&lt;br /&gt;
&lt;br /&gt;
=Estructura del projecte: Aplicacions, Mòduls i Accions=&lt;br /&gt;
Symfony considera un projecte com '''un conjunt de serveis i operacions disponibles sota un determinat nom de domini i que comparteixen el mateix model d'objectes'''.&lt;br /&gt;
&lt;br /&gt;
Dins d'un projecte, les operacions s'agrupen de forma lògica en aplicacions. Normalment, una aplicació s'executa de forma independent respecte d'altres aplicacions del mateix projecte. L'habitual és que un projecte contingui dues aplicacions: una per a la part pública i una altra per a la part de gestió, compartint ambdues la mateixa base de dades. També és possible definir projectes que estiguin formats per diversos llocs web petits, cadascun d'ells considerat com una aplicació. En aquest cas, és important tenir en compte que els enllaços entre aplicacions s'han d'indicar de forma absoluta.&lt;br /&gt;
&lt;br /&gt;
Cada aplicació està formada per un o més mòduls. Un mòdul normalment representa&lt;br /&gt;
*a una pàgina web o &lt;br /&gt;
*a un grup de pàgines amb un propòsit relacionat.&lt;br /&gt;
Per exemple, una aplicació podria tenir mòduls com home, articulos, ajuda, carritoCompra, compte, etc.&lt;br /&gt;
&lt;br /&gt;
Els mòduls emmagatzemen les accions, que representen cadascuna de les operacions que es pot realitzar en un mòdul. Per exemple el mòdul ''carretCompra'' pot definir accions com ''afegir'', mostrar i actualitzar. Normalment les accions es descriuen mitjançant verbs. Treballar amb accions és molt similar a treballar amb les pàgines d'una aplicació web tradicional, encara que en aquest cas dues accions diferents poden acabar mostrant la mateixa pàgina (com per exemple l'acció d'afegir un comentari a una entrada d'un blog, que acaba tornant a mostrar la pàgina de l'entrada amb el nou comentari).&lt;br /&gt;
=Estructura de l'arbre de arxius=&lt;br /&gt;
Normalment, tots els projectes web comparteixen el mateix tipus de continguts, com per exemple:&lt;br /&gt;
&lt;br /&gt;
Una base de dades, com MySQL o PostgreSQL&lt;br /&gt;
*Arxiu estàtics (HTML, imatges, arxius de Javascript, fulles d'estils, etc.)&lt;br /&gt;
*Arxius pujats al lloc web per part dels usuaris o els administradors&lt;br /&gt;
*Classes i llibreries PHP&lt;br /&gt;
*Llibreries externes (scripts desenvolupats per tercers)&lt;br /&gt;
*Arxius que s'executen per lots batch files) que normalment són scripts que s'executen via línia de comandos o mitjançant cron&lt;br /&gt;
*Arxius de log (les traces que generen les aplicacions i/o el servidor)&lt;br /&gt;
*Arxius de configuració&lt;br /&gt;
&lt;br /&gt;
Symfony proporciona una estructura en forma d'arbre d'arxius per organitzar de forma lògica tots aquests continguts, a més de ser consistent amb l'arquitectura MVC utilitzada i amb l'agrupació projecto / aplicació / mòdul. Cada vegada que es crea un nou projecte, aplicació o mòdul, es genera de forma automàtica la part corresponent d'aquesta estructura. A més, l'estructura es pot personalitzar completament, per reorganitzar els arxius i directoris o per complir amb les exigències d'organització d'un client.&lt;br /&gt;
&lt;br /&gt;
Encara que es pot canviar, per defecte totes les aplicacions Symfony tenen la mateixa estructura de directoris senzilla (i recomanada):&lt;br /&gt;
&lt;br /&gt;
*'''app/''': conté la configuració de l'aplicació.&lt;br /&gt;
*'''src/''': aquí es troba tot el codi PHP de l'aplicació.&lt;br /&gt;
*'''vendor/''': per convenció aquí es guarden totes les llibreries creades per tercers.&lt;br /&gt;
*'''web/''': est és el directori web arrel i conté tots els arxius que es poden accedir públicament.&lt;br /&gt;
==El directori web==&lt;br /&gt;
El directori web arrel és el lloc on es troben tots els arxius públics i estàtics tals com a imatges, fulles d'estil i arxius Javascript. També és el lloc on es defineixen tots els controladors frontals, com per exemple el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// web/app.php&lt;br /&gt;
require_once __DIR__.'/../app/bootstrap.php.cache';&lt;br /&gt;
require_once __DIR__.'/../app/AppKernel.php';&lt;br /&gt;
 &lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
 &lt;br /&gt;
$kernel = new AppKernel('prod', false);&lt;br /&gt;
$kernel-&amp;gt;loadClassCache();&lt;br /&gt;
$kernel-&amp;gt;handle(Request::createFromGlobals())-&amp;gt;send();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'arxiu del controlador frontal ('''app.php''' en aquest exemple) és l'arxiu PHP que realment s'executa quan utilitzes una aplicació Symfony2 i el seu treball consisteix a arrencar l'aplicació utilitzant una classe del nucli ('''AppKernel''').&lt;br /&gt;
&lt;br /&gt;
Tenir un controlador frontal significa que s'utilitzen URL diferents i més flexibles que les d'una aplicació PHP típica. Quan es disposa d'un controlador frontal, les URL es formaten de la següent manera:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://localhost/app.php/hello/Ryan&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
El controlador frontal, '''app.php''', s'executa i la URL interna: ''/hello/Ryan'' es dirigeix internament segons la configuració d'encaminament.&lt;br /&gt;
&lt;br /&gt;
Si a més utilitzes el mòdul '''mod_rewrite''' d'Apache, pots forçar l'execució de l'arxiu '''app.php''' sense necessitat d'incloure-ho en la URL, per la qual cosa així les URL són encara més netes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://localhost/hello/Ryan&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==El directori de l'aplicació (app)==&lt;br /&gt;
La classe '''AppKernel''' és el punt d'entrada principal de l'aplicació i és la responsable de tota la configuració. Com a tal, s'emmagatzema en el directori '''app/'''.&lt;br /&gt;
&lt;br /&gt;
Aquesta classe ha d'implementar dos mètodes que defineixen tot el que Symfony necessita saber sobre la teva aplicació. Ni tan sols has de preocupar-te d'aquests mètodes durant l'arrencada — Symfony els emplena per tu amb paràmetres predeterminats.&lt;br /&gt;
&lt;br /&gt;
*'''registerBundles()''': retorna un array amb tots els bundles necessaris per executar l'aplicació.&lt;br /&gt;
*'''registerContainerConfiguration()''': carrega l'arxiu de configuració de recursos de l'aplicació (consulta la secció Configurant l'aplicació).&lt;br /&gt;
Durant el desenvolupament d'una aplicació, normalment el directori '''app/''' solament els utilitzes per modificar la configuració i els arxius d'encaminament en el directori '''app/config/'''.&lt;br /&gt;
&lt;br /&gt;
Aquest directori també conté el directori '''caché''' de l'aplicació (app/cache), un directori de '''logs''' (app/logs) i un directori per a arxius de '''recursos globals''', tals com a plantilles (app/Resources).&lt;br /&gt;
&lt;br /&gt;
'''Carga automàtica'''&lt;br /&gt;
En arrencar Symfony, s'inclou un arxiu especial anomenat ''vendor/autoload.php''. Aquest arxiu, creat per ''Composer'', s'encarrega de configurar el carregador automàtic de classes, que al seu torn '''carrega automàticament tots els arxius''' de la teva aplicació que es trobin '''en el directori src/''' i '''totes les llibreries externes''' configurades en l'arxiu '''composer.json'''.&lt;br /&gt;
&lt;br /&gt;
Gràcies al carregador automàtic, '''mai hauràs de preocupar-te d'usar declaracions include o require'''. Això és possible perquè Composer utilitza namespace o espai de noms d'una classe per determinar la seva ubicació i així '''inclou automàticament l'arxiu en l'instant en què necessites una classe'''.&lt;br /&gt;
&lt;br /&gt;
El carregador automàtic '''ja està configurat per buscar qualsevol de les teves classes PHP en el directori src/'''. Perquè funcioni la càrrega automàtica, el nom de la classe i la ruta de l'arxiu '''han de seguir el mateix patró''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Nom de la classe: Acme\HelloBundle\Controller\HelloController&lt;br /&gt;
Ruta física de l'arxiu: src/Acme/HelloBundle/Controller/HelloController.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Configuració de l'aplicació ==&lt;br /&gt;
Segons el lloc web oficial de YAML (http://www.yaml.org/), YAML és &amp;quot;un estàndard per serializar dades en qualsevol llenguatge de programació i amb un format fàcil de llegir per part de les persones&amp;quot;. Dit d'una altra forma, YAML és un llenguatge molt senzill que permet descriure les dades com en XML, però amb una sintaxi molt més senzilla. YAML és un format especialment útil per descriure dades que poden ser transformats en arrays simples i associatius, com per exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$casa = array(&lt;br /&gt;
  'familia' =&amp;gt; array(&lt;br /&gt;
    'apellido'  =&amp;gt; 'García',&lt;br /&gt;
    'padres'  =&amp;gt; array('Antonio', 'María'),&lt;br /&gt;
    'hijos'   =&amp;gt; array('Jose', 'Manuel', 'Carmen')&lt;br /&gt;
  ),&lt;br /&gt;
  'direccion' =&amp;gt; array(&lt;br /&gt;
    'numero'        =&amp;gt; 34,&lt;br /&gt;
    'calle'         =&amp;gt; 'Gran Vía',&lt;br /&gt;
    'ciudad'        =&amp;gt; 'Cualquiera',&lt;br /&gt;
    'codigopostal'  =&amp;gt; '12345'&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//format yml:&lt;br /&gt;
casa:&lt;br /&gt;
  familia:&lt;br /&gt;
    apellido: García&lt;br /&gt;
    padres:&lt;br /&gt;
      - Antonio&lt;br /&gt;
      - María&lt;br /&gt;
    hijos:&lt;br /&gt;
      - Jose&lt;br /&gt;
      - Manuel&lt;br /&gt;
      - Carmen&lt;br /&gt;
  direccion:&lt;br /&gt;
    numero: 34&lt;br /&gt;
    calle: Gran Vía&lt;br /&gt;
    ciudad: Cualquiera&lt;br /&gt;
    codigopostal: &amp;quot;12345&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
YAML és l'acrònim de &amp;quot;YAML Ain't Markup Language&amp;quot; (&amp;quot;YAML No és un Llenguatge de Marcat&amp;quot;) i es pronuncia &amp;quot;yamel&amp;quot;. El format es porta utilitzant des de 2001 i existeixen utilitats per processar YAML en una gran varietat de llenguatges de programació.&lt;br /&gt;
&lt;br /&gt;
YAML és molt més ràpid d'escriure que XML (ja que no fan falta les etiquetes de tancament i l'ús continu de les cometes) i és molt més poderós que els tradicionals arxius .ini (ja que aquests últims no suporten l'herència i les estructures complexes). Per aquest motiu, Symfony utilitza el format YAML com el llenguatge preferit per emmagatzemar la seva configuració.&lt;br /&gt;
&lt;br /&gt;
Per saber més sobre aquest format pots consultar la [http://symfony.com/legacy/doc/reference/1_4/en/02-YAML següent] pàgina web.&lt;br /&gt;
==El directori font (src)==&lt;br /&gt;
El directori '''src/''' conté tot el codi real (codi PHP, plantilles, arxius de configuració, estils, etc.) que pertany a la teva aplicació. De fet, en programar una aplicació Symfony, la major part del teu treball es durà a terme dins d'un o més''' bundles '''creats en aquest directori.&lt;br /&gt;
&lt;br /&gt;
=Els Bundles=&lt;br /&gt;
[[Els bundles a symfony 2.]]&lt;br /&gt;
&lt;br /&gt;
=Entorn de desenvolupament i entorn de producció=&lt;br /&gt;
Una aplicació pot funcionar en diversos entorns. Els diferents entorns comparteixen el mateix codi PHP (solament és diferent el controlador frontal), però usen una configuració diferent. Per exemple, un entorn de desenvolupament '''dev''' guarda els advertiments i errors, mentre que un entorn de producció '''prod''' només registra els errors. Alguns arxius es tornen a generar en cada petició en l'entorn '''dev''' (para major comoditat dels desenvolupadors), però s'escorcollen en l'entorn '''prod'''. Tots els entorns es troben en la mateixa màquina i executen la mateixa aplicació.&lt;br /&gt;
&lt;br /&gt;
Un projecte Symfony2 '''normalment comença amb tres entorns (dev, test i prod)''', encara que resulta senzill crear nous entorns.''' Pots veure la teva aplicació en diferents entorn''' amb només '''canviar el controlador frontal'''en el teu navegador. Per veure l'aplicació en l'entorn '''dev''', accedeix a l'aplicació a través del controlador frontal de desenvolupament:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://localhost/app_dev.php/hola&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Si desitges veure com es comportarà la teva aplicació a l'entorn de producció, utilitza en el seu lloc el controlador frontal '''prod''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://localhost/app.php/hola&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Si fas qualsevol canvi en les plantilles, no ho veuràs en l'entorn prod tret que esborris la cache de l'aplicació i així forcis a Symfony a tornar a compilar les plantilles. Per esborrar la cache de l'entorn de producció, executa la següent comanda de consola:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo php app/console cache:clear --env=prod &amp;amp;&amp;amp; sudo php app/console cache:warmup --env=prod&lt;br /&gt;
i donar-li permísos:&lt;br /&gt;
chmod 777 nomprojecte/ -R&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=El controlador=&lt;br /&gt;
Un controlador és una funció PHP creada per tu i que s'encarrega d'obtenir la informació de la petició HTTP i de generar i retornar la resposta HTTP (en forma d'objecte de tipus Response de Symfony2).&lt;br /&gt;
La resposta pot ser:&lt;br /&gt;
*una pàgina HTML,&lt;br /&gt;
*un document XML, &lt;br /&gt;
*un array JSON serializado, &lt;br /&gt;
*una imatge, &lt;br /&gt;
*una redirecció a una altra pàgina, &lt;br /&gt;
*un error de tipus 404 &lt;br /&gt;
*o qualsevol altra cosa que se t'ocorri. &lt;br /&gt;
El controlador conté tota la lògica que la teva aplicació necessita per generar el contingut de la pàgina. L'objectiu d'un controlador sempre és el mateix: crear i retornar un objecte '''Response'''.&lt;br /&gt;
==Cicle de vida d'una petició==&lt;br /&gt;
* 1.Cada petició és tractada per un únic arxiu: el controlador frontal (per exemple, '''app.php''' o '''app_dev.php''') el qual és responsable d'iniciar l'aplicació.&lt;br /&gt;
* 2. El sistema d'encaminament (classe Routing) llegeix la informació de la petició (per exemple, la URI), troba una ruta que coincideixi amb aquesta informació, i llegeix el paràmetre '''_controller''' de la ruta.&lt;br /&gt;
* 3. S'executa el controlador assignat a la ruta i aquest controlador crea i retorna un objecte '''Response'''.&lt;br /&gt;
* 4. Les capçaleres HTTP i el contingut de l'objecte Response s'envien de tornada al client.&lt;br /&gt;
&lt;br /&gt;
Exemple de controlador:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/HelloBundle/Controller/HelloController.php&lt;br /&gt;
 &lt;br /&gt;
namespace Acme\HelloBundle\Controller;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Response;&lt;br /&gt;
 &lt;br /&gt;
class HelloController&lt;br /&gt;
{&lt;br /&gt;
    public function indexAction()&lt;br /&gt;
    {&lt;br /&gt;
      return new Response('&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;Hello world!&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Associant una URI a un controlador==&lt;br /&gt;
El nou controlador retorna una pàgina HTML simple. Per poder provar realment aquesta pàgina en el teu navegador, has de crear una ruta que el seu path sigui la URI que vols associar al controlador al fitxer '''routing.yml''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
hello:&lt;br /&gt;
    path:         /hello&lt;br /&gt;
    defaults:     { _controller: AcmeHelloBundle:Hello:index }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Observa la sintaxi utilitzada per referir-se al controlador: '''AcmeHelloBundle:Hello:index'''. Symfony2 utilitza aquesta notació curta per referir-se als controladors. Es tracta de la '''sintaxi recomanada''' i li diu a Symfony2 que busqui una '''classe controlador anomenada HelloController''' dins d'un '''paquet''' anomenat''' AcmeHelloBundle '''i que després '''executi el mètode indexAction()'''.&lt;br /&gt;
&lt;br /&gt;
'''Passar arguments al mètode del controlador'''&lt;br /&gt;
Exemple de controlador amb un argument en un dels seus mètodes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// src/Acme/HelloBundle/Controller/HelloController.php&lt;br /&gt;
 &lt;br /&gt;
namespace Acme\HelloBundle\Controller;&lt;br /&gt;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;&lt;br /&gt;
 &lt;br /&gt;
class HelloController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function indexAction($name)&lt;br /&gt;
    {&lt;br /&gt;
      // ...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El controlador anterior té un sol argument, anomenat '''$name''', el valor del qual correspon al paràmetre '''{name}''' de la ruta associada. De fet, quan executes el teu controlador, Symfony2 associa cada argument del controlador amb un paràmetre de la ruta. &lt;br /&gt;
L'arxiu d'enrutament hauria de ser aquest:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
hello:&lt;br /&gt;
    path:         /hello&lt;br /&gt;
    defaults:     { _controller: AcmeHelloBundle:Hello:index }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Considera el següent exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/routing.yml&lt;br /&gt;
hello:&lt;br /&gt;
    path:         /hello/{firstName}/{lastName}&lt;br /&gt;
    defaults:     { _controller: AcmeHelloBundle:Hello:index, color: green }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function indexAction($firstName, $lastName, $color)&lt;br /&gt;
{&lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les variables '''{firstName}''' i '''{lastName}''' de la ruta es diuen '''placeholders''', ja que &amp;quot;guarden el lloc&amp;quot; perquè qualsevol valor substitueixi aquesta variable. D'altra banda, la variable '''color''' és una variable de '''tipus default''', ja que el seu valor sempre '''està definit per a totes les rutes'''.&lt;br /&gt;
Existeixen regles amb els arguments (paràmetres):&lt;br /&gt;
*Cada argument obligatori del controlador ha de tenir associat un paràmetre en la ruta&lt;br /&gt;
*No tots els paràmetres de la ruta han de ser arguments en el teu controlador&lt;br /&gt;
*és perfectament vàlid fer que l'argument sigui opcional.&lt;br /&gt;
&lt;br /&gt;
El següent exemple no llançarà una excepció:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function indexAction($firstName, $lastName, $color, $foo = 'bar')&lt;br /&gt;
{&lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==objecte Request com a argument del controlador==&lt;br /&gt;
Sol ser molt útil disposar en el controlador de l'objecte '''Request''' associat a la petició de l'usuari, especialment quan treballes amb formularis. Per fer que Symfony passi aquest objecte automàticament com a argument del controlador, utilitza el següent codi:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
 &lt;br /&gt;
public function updateAction(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    $form = $this-&amp;gt;createForm(...);&lt;br /&gt;
 &lt;br /&gt;
    $form-&amp;gt;handleRequest($request);&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Generador de controladors==&lt;br /&gt;
Si el que volem és generar un nou controlador a la nostra aplicació podem automatitzar el procés utilitzant la següent comanda:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php app/console generate:controller&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aquesta comanda et demanarà tota la informació necessaria per crear el controlador i els '''actions''' (mètodes) necessaris que podràs utilitzar en el fitxer de rutes. Tant si utilitzes la comanda com si no la utilitzes, sempre podràs canviar la classe generada com tu prefereixis.&lt;br /&gt;
= Encaminament =&lt;br /&gt;
Una ruta és una associació entre un patró d'URL i un controlador. Suposem per exemple que desitges associar URL de tipus ''/blog/el meu-post'' o ''/blog/tot-sobre-symfony'' amb un controlador que sigui capaç de buscar i mostrar l'article sol·licitat.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/routing.yml&lt;br /&gt;
blog_show:&lt;br /&gt;
    path:      /blog/{slug}&lt;br /&gt;
    defaults:  { _controller: AcmeBlogBundle:Blog:show }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Codi PHP del controlador associat a aquesta ruta:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/BlogBundle/Controller/BlogController.php&lt;br /&gt;
 &lt;br /&gt;
namespace Acme\BlogBundle\Controller;&lt;br /&gt;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;&lt;br /&gt;
 &lt;br /&gt;
class BlogController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function showAction($slug)&lt;br /&gt;
    {&lt;br /&gt;
        $blog = // usa la variable $slug para consultar la base de datos&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;render('AcmeBlogBundle:Blog:show.html.twig', array(&lt;br /&gt;
            'blog' =&amp;gt; $blog,&lt;br /&gt;
        ));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquest és l'objectiu del encaminador de Symfony2: associar la URL d'una petició a un controlador&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objectiu del sistema d'encaminament de Symfony2 és analitzar aquesta URL i determinar què controlador s'ha d'executar. El procés complet consta dels següents passos:&lt;br /&gt;
*La petició es processa en el controlador frontal de Symfony2 (per exemple, en l'arxiu''' app.php''').&lt;br /&gt;
*El nucli de Symfony2 (conegut com kernel) sol·licita al enrutador que examini la petició.&lt;br /&gt;
*El enrutador busca què patró de les rutes de l'aplicació coincideix amb la URL entrant i retorna informació sobre la ruta, incloent el controlador que s'ha d'executar.&lt;br /&gt;
*El nucli de Symfony2 executa el controlador, que en última instància, retorna un objecte '''Response'''.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:funcionament-routing.png]]&lt;br /&gt;
&lt;br /&gt;
== Prefix a les rutes ==&lt;br /&gt;
&lt;br /&gt;
Resulta habitual haver d'afegir un prefix a totes les rutes importades des d'un arxiu extern. Si vols per exemple que el patró de la ruta '''acme_hello''' sigui '''/admin/hello/{name}''' en comptes de''' /hello/{name}''', afegeix l'opció prefix en importar les rutes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/routing.yml&lt;br /&gt;
acme_hello:&lt;br /&gt;
    resource: &amp;quot;@AcmeHelloBundle/Resources/config/routing.yml&amp;quot;&lt;br /&gt;
    prefix:   /admin&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
El valor indicat en l'opció prefix (en aquest cas '''/admin''') s'afegeix per davant de tots els patrons de les rutes importades des de l'arxiu extern.&lt;br /&gt;
&lt;br /&gt;
= Sessions a Symfony2=&lt;br /&gt;
&lt;br /&gt;
Symfony2 inclou un objecte de sessió que permet emmagatzemar informació persistent sobre l'usuari, és a dir, informació que es guarda d'una petició a una altra. Per defecte Symfony2 emmagatzema la informació en una cookie usant les sessions natives de PHP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
 &lt;br /&gt;
public function indexAction(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    $session = $request-&amp;gt;getSession();&lt;br /&gt;
 &lt;br /&gt;
    // guarda un atributo para reutilizarlo durante una&lt;br /&gt;
    // petición posterior del usuario&lt;br /&gt;
    $session-&amp;gt;set('foo', 'bar');&lt;br /&gt;
 &lt;br /&gt;
    // obtener el valor de un atributo de la sesión&lt;br /&gt;
    $foo = $session-&amp;gt;get('foo');&lt;br /&gt;
 &lt;br /&gt;
    // utilizar un valor por defecto si el atributo no existe&lt;br /&gt;
    $filters = $session-&amp;gt;get('filters', array());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Plantilles TWIG=&lt;br /&gt;
Una plantilla és un arxiu de text que pot generar qualsevol altre format basat en text (HTML, XML, CSV, LaTeX, etc.). Les plantilles PHP són les més populars, com la qual mostra el següent exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
    &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;¡Bienvenido a Symfony!&amp;lt;/title&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;&amp;lt;?php echo $page_title ?&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;ul id=&amp;quot;navigation&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;?php foreach ($navigation as $item): ?&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;&amp;lt;?php echo $item-&amp;gt;getHref() ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;?php echo $item-&amp;gt;getCaption() ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/a&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Symfony2 inclou un llenguatge de plantilles anomenat '''Twig''' que és molt més potent i elegant que PHP. Gràcies a Twig pots crear plantilles molt concises i fàcils de llegir, per la qual cosa a més són fàcils d'entendre per part dels dissenyadors web. Observa el mateix exemple anterior definit com a plantilla Twig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
    &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;¡Bienvenido a Symfony!&amp;lt;/title&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;{{ page_title }}&amp;lt;/h1&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;ul id=&amp;quot;navigation&amp;quot;&amp;gt;&lt;br /&gt;
            {% for item in navigation %}&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;{{ item.href }}&amp;quot;&amp;gt;{{ item.caption }}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
            {% endfor %}&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Twig es basa en dues etiquetes especials:&lt;br /&gt;
&lt;br /&gt;
*'''{ { ... } }''': serveix per mostrar el contingut d'una variable o el resultat de realitzar alguna operació o processar alguna expressió. En PHP la construcció equivalent és ''echo'' o ''print''.&lt;br /&gt;
*'''{% ... %}''': serveix per definir la lògica de la plantilla, és a dir, la part de programació que controla com es mostren els continguts de la plantilla. Entre uns altres, aquesta etiqueta s'empra per a les instruccions ''if'' i per als bucles ''for''.&lt;br /&gt;
&lt;br /&gt;
==Herència de plantilles i layout==&lt;br /&gt;
Normalment les plantilles d'un mateix projecte comparteixen molts elements comuns, com per exemple la capçalera, el peu de pàgina, una barra lateral, etc. Symfony2 resol aquest problema de forma molt senzilla: una plantilla pot decorar el contingut d'una altra plantilla.&lt;br /&gt;
&lt;br /&gt;
La idea és exactament la mateixa que l'herència de classes PHP: l'herència de plantilles et permet crear una plantilla basi cridada layout i que conté tots els elements comuns del lloc definits com a blocs. Després, les plantilles filla hereten del layout i emplenen o modifiquen aquests blocs.&lt;br /&gt;
&lt;br /&gt;
En primer lloc, crea un arxiu amb el teu disseny base:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# app/Resources/views/base.html.twig #}&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
    &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=utf-8&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;{% block title %}Test Application{% endblock %}&amp;lt;/title&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;sidebar&amp;quot;&amp;gt;&lt;br /&gt;
            {% block sidebar %}&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/blog&amp;quot;&amp;gt;Blog&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
            {% endblock %}&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;div id=&amp;quot;contenido&amp;quot;&amp;gt;&lt;br /&gt;
            {% block body %}{% endblock %}&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Aquesta plantilla defineix l'esquelet d'una pàgina HTML simple de dues columnes. En aquest exemple, '''es defineixen tres blocs amb l'etiqueta {% block %} (title, sidebar i body)'''. Les '''plantilles filla''' poden '''modificar''' els continguts de cadascun dels '''blocs'' o deixar-los tal com estan en la plantilla base.&lt;br /&gt;
&lt;br /&gt;
El següent exemple mostra l'aspecte d'una plantilla filla:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/BlogBundle/Resources/views/Blog/index.html.twig #}&lt;br /&gt;
{% extends '::base.html.twig' %}&lt;br /&gt;
 &lt;br /&gt;
{% block title %}My cool blog posts{% endblock %}&lt;br /&gt;
 &lt;br /&gt;
{% block body %}&lt;br /&gt;
    {% for entry in blog_entries %}&lt;br /&gt;
        &amp;lt;h2&amp;gt;{{ entry.title }}&amp;lt;/h2&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;{{ entry.body }}&amp;lt;/p&amp;gt;&lt;br /&gt;
    {% endfor %}&lt;br /&gt;
{% endblock %}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La clau de l'herència de plantilles és l'etiqueta '''{% extends %}'''. D'aquesta forma el motor de plantilles sap que primer ha de processar la plantilla base, que defineix el disseny de la pàgina i crea diversos blocs de continguts. Després es renderitza la plantilla filla, que reemplaça el contingut dels blocs '''title''' i '''body''' del pare.&lt;br /&gt;
&lt;br /&gt;
Quan treballis amb l'herència de plantilles, tingues en compte:&lt;br /&gt;
*Si inclous l'etiqueta '''{% extends %}''' en una plantilla, aquesta ha de ser la primera etiqueta d'aquesta plantilla.&lt;br /&gt;
*Quantes més etiquetes '''{% block %}''' tinguis en la teva plantilla basi, millor. Recorda que les plantilles filla no tenen l'obligació d'emplenar tots els blocs dels pares, per la qual cosa pots definir tants blocs com vulguis i assignar a cadascun un valor per defecte que sigui lògic per a la major part de les pàgines del lloc. Quants més blocs defineixi el layout, més flexible serà el seu disseny.&lt;br /&gt;
*Si còpies i pegues algun contingut en diverses plantilles, segurament serà millor que moguis aquest contingut a algun bloc del layout. En altres casos el millor és col·locar aquest contingut en alguna altra plantilla i incloure-la amb l'etiqueta '''include''' sempre que sigui necessari.&lt;br /&gt;
*Si vols obtenir el contingut d'algun bloc de la plantilla pare, utilitza la funció''' { { parent() } }'''. Això és molt útil quan vols afegir continguts propis a qualsevol altre contingut que el pare pugui haver definit per a aquest bloc:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{% block sidebar %}&lt;br /&gt;
    &amp;lt;h3&amp;gt;Table of Contents&amp;lt;/h3&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    {# ... #}&lt;br /&gt;
 &lt;br /&gt;
    {{ parent() }}&lt;br /&gt;
{% endblock %}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Localització de les plantilles==&lt;br /&gt;
Les plantilles es troben en dos llocs diferents:&lt;br /&gt;
&lt;br /&gt;
*'''app/Resources/views/''': el directori on s'emmagatzemen les plantilles globals de l'aplicació, com per exemple la plantilla del layout i les plantilles utilitzades per redefinir les plantilles incloses en els bundles de Symfony2.&lt;br /&gt;
*'''ruta/fins a/el/bundle/Resources/views/''': els bundles emmagatzemen les seves pròpies plantilles en el directori '''Resources/views/''' de cada bundle. La immensa majoria de les plantilles s'emmagatzemen dins d'algun bundle.&lt;br /&gt;
Symfony2 identifica a cada plantilla amb la sintaxi especial '''bundle:controlador:plantilla'''. Això permet definir diferents tipus de plantilla, cadascuna emmagatzemada en un lloc diferent:&lt;br /&gt;
&lt;br /&gt;
'''AcmeBlogBundle:Blog:index.html.twig''': indica la plantilla d'una pàgina específica. Est és el significat de cadascuna de les tres parts de la cadena:&lt;br /&gt;
*'''AcmeBlogBundle''': (bundle) la plantilla es troba dins del bundle '''AcmeBlogBundle''' (per exemple, ''src/Acme/BlogBundle'').&lt;br /&gt;
*'''Blog''': (controlador) indica que la plantilla s'emmagatzema en el subdirectori Blog de '''Resources/views'''.&lt;br /&gt;
*'''index.html.twig''': (plantilla) el nom de l'arxiu que guarda la plantilla és '''index.html.twig'''. Suposant que '''AcmeBlogBundle''' es trobi en '''src/Acme/BlogBundle''', la ruta completa de la plantilla seria '''src/Acme/BlogBundle/Resources/views/Blog/index.html.twig'''.&lt;br /&gt;
&lt;br /&gt;
*'''AcmeBlogBundle::layout.html.twig''': indica que és una plantilla global del bundle indicat. Com a falta la part central que es refereix al controlador, aquesta plantilla '''no es troba''' dins de cap subdirectori de '''Resources/views/'''. En altres paraules, '''la ruta '''completa de la plantilla és '''Resources/views/layout.html.twig''' dins del bundle AcmeBlogBundle.&lt;br /&gt;
*'''::base.html.twig''': indica que és una plantilla global de l'aplicació. Observa que la cadena comença amb dos parells de dos punts '''(::)''', per la qual cosa falta la part del bundle i la del controlador. En altres paraules, aquesta plantilla no es troba en cap bundle sinó directament dins de '''app/Resources/views/'''.&lt;br /&gt;
&lt;br /&gt;
== Etiquetes Twig==&lt;br /&gt;
===Incloent unes altres plantilles===&lt;br /&gt;
Resulta habitual voler incloure la mateixa plantilla o fragment de codi a diverses pàgines diferents. Si l'aplicació té per exemple un llistat d'articles, el codi de la plantilla que mostra un article es pot utilitzar a la pàgina de detall de l'article, en una pàgina que mostra els articles més populars, o en una llista dels articles més recents.&lt;br /&gt;
&lt;br /&gt;
En PHP, quan necessites reutilitzar un tros de codi, normalment mous el codi a una nova classe o funció. En les plantilles s'aplica la mateixa idea:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/ArticleBundle/Resources/views/Article/articleDetails.html.twig #}&lt;br /&gt;
&amp;lt;h2&amp;gt;{{ article.title }}&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;h3 class=&amp;quot;byline&amp;quot;&amp;gt;by {{ article.authorName }}&amp;lt;/h3&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
    {{ article.body }}&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ara ja pots incloure fàcilment aquesta plantilla en qualsevol una altra:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/ArticleBundle/Resources/views/Article/list.html.twig #}&lt;br /&gt;
{% extends 'AcmeArticleBundle::layout.html.twig' %}&lt;br /&gt;
 &lt;br /&gt;
{% block body %}&lt;br /&gt;
    &amp;lt;h1&amp;gt;Recent Articles&amp;lt;h1&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    {% for article in articles %}&lt;br /&gt;
        {{ include(&lt;br /&gt;
            'AcmeArticleBundle:Article:articleDetails.html.twig',&lt;br /&gt;
            {'article': article}&lt;br /&gt;
        ) }}&lt;br /&gt;
    {% endfor %}&lt;br /&gt;
{% endblock %}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Renderitzant plantilles enviant-li dades des de el controlador==&lt;br /&gt;
Imagina que en el teu lloc web tens una barra lateral que mostra els tres articles més recents. Per obtenir aquests tres articles és necessari realitzar una consulta a la base de dades o alguna altra operació similar que no es pot incloure en la pròpia plantilla.&lt;br /&gt;
&lt;br /&gt;
La solució consisteix a inserir en la plantilla el resultat retornat per un controlador de l'aplicació. En primer lloc, crea un controlador que renderitzi el llistat dels articles recents:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/ArticleBundle/Controller/ArticleController.php&lt;br /&gt;
class ArticleController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function recentArticlesAction($max = 3)&lt;br /&gt;
    {&lt;br /&gt;
        // hace una llamada a la base de datos u otra lógica&lt;br /&gt;
        // para obtener los &amp;quot;$max&amp;quot; artículos más recientes&lt;br /&gt;
        $articles = ...;&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;render(&lt;br /&gt;
            'AcmeArticleBundle:Article:recentList.html.twig',&lt;br /&gt;
            array('articles' =&amp;gt; $articles)&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
i a la plantilla es pot utilitzar les dades del array enviat des del controlador directament:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/ArticleBundle/Resources/views/Article/recentList.html.twig #}&lt;br /&gt;
{% for article in articles %}&lt;br /&gt;
    &amp;lt;a href=&amp;quot;/article/{{ article.slug }}&amp;quot;&amp;gt;&lt;br /&gt;
        {{ article.title }}&lt;br /&gt;
        &amp;lt;/a&amp;gt;&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per mostrar en qualsevol plantilla el resultat d'executar un controlador, utilitza la funció render i identifica al controlador utilitzant la notació especial '''bundle:controlador:acció''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# app/Resources/views/base.html.twig #}&lt;br /&gt;
 &lt;br /&gt;
{# ... #}&lt;br /&gt;
&amp;lt;div id=&amp;quot;sidebar&amp;quot;&amp;gt;&lt;br /&gt;
    {{ render(controller('AcmeArticleBundle:Article:recentArticles', {&lt;br /&gt;
        'max': 3&lt;br /&gt;
    })) }}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de IF dintre del twig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{% if kenny.sick %}&lt;br /&gt;
    Kenny is sick.&lt;br /&gt;
{% elseif kenny.dead %}&lt;br /&gt;
    You killed Kenny! You bastard!!!&lt;br /&gt;
{% else %}&lt;br /&gt;
    Kenny looks okay --- so far&lt;br /&gt;
{% endif %}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Enllaçant pàgines==&lt;br /&gt;
Crear enllaços a altres pàgines de l'aplicació és una de les tasques més comunes d'una plantilla. En lloc de generar a mà les URL dins de la plantilla, utilitza la funció path de Twig (o el helper router en PHP) per generar les URL utilitzant la configuració del sistema de encaminament. D'aquesta manera, si més endavant vols canviar l'aspecte de qualsevol URL, només has d'actualitzar un arxiu de configuració i totes les URL de les plantilles s'actualitzaran instantàniament.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;{{ path('_welcome') }}&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
On '''_welcome''' està definit al fitxer de routes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
_welcome:&lt;br /&gt;
    path:     /&lt;br /&gt;
    defaults: { _controller: AcmeDemoBundle:Welcome:index }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Enllaçant arxius web (css, javascript)==&lt;br /&gt;
Les plantilles de les aplicacions web solen enllaçar amb els web '''assets'' o arxius web, tals com a imatges, fulles d'estil CSS, arxius Javascript, etc.&lt;br /&gt;
&lt;br /&gt;
A la versió 2.8 ja no s'instal·la '''assetic''' per defecte i s'ha d'instal·lar utilitzant aquesta guia: &lt;br /&gt;
http://symfony.com/doc/current/cookbook/assetic/asset_management.html&lt;br /&gt;
&lt;br /&gt;
'''Quan passem a producció hem d'executar:'''&lt;br /&gt;
 sudo php app/console assetic:dump --env=prod --no-debug&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 De nou no és aconsellable generar a mà les URL d'aquest tipus d'arxius, ja que Symfony2 ofereix una solució millor i molt més flexible mitjançant la funció '''asset''' de Twig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ asset('images/logo.png') }}&amp;quot; alt=&amp;quot;Symfony!&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;link href=&amp;quot;{{ asset('css/blog.css') }}&amp;quot; rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La gestió dels arxius CSS i dels arxius Javascript es realitza mitjançant la herència de plantilles. A la plantilla para es pot incloure els arxius que s'utilitzarà a tota la aplicació i després, a les plantilles filles, es poden incloure fitxers específics per aquella part de la web:&lt;br /&gt;
Plantilla pare:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# app/Resources/views/base.html.twig #}&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
    {# ... #}&lt;br /&gt;
 &lt;br /&gt;
    {% block stylesheets %}&lt;br /&gt;
        &amp;lt;link href=&amp;quot;{{ asset('css/main.css') }}&amp;quot; type=&amp;quot;text/css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; /&amp;gt;&lt;br /&gt;
    {% endblock %}&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
    {# ... #}&lt;br /&gt;
 &lt;br /&gt;
    {% block javascripts %}&lt;br /&gt;
        &amp;lt;script src=&amp;quot;{{ asset('js/main.js') }}&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    {% endblock %}&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
i les plantilles filles redefineixen els blocs tot utilitzant la configuració que hi ha en la plantilla pare:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/DemoBundle/Resources/views/Contact/contact.html.twig #}&lt;br /&gt;
{% extends '::base.html.twig' %}&lt;br /&gt;
 &lt;br /&gt;
{% block stylesheets %}&lt;br /&gt;
    {{ parent() }}&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;link href=&amp;quot;{{ asset('css/contact.css') }}&amp;quot; type=&amp;quot;text/css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; /&amp;gt;&lt;br /&gt;
{% endblock %}&lt;br /&gt;
 &lt;br /&gt;
{# ... #}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les plantilles també poden enllaçar arxius que es trobin en el directori Resources/public de qualsevol bundle. Per fer que aquests arxius estiguin disponibles en l'aplicació, executa la comanda:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php app/console assets:install directorio [--symlink]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Si al utilitzar ''assets'' en producció no funciona:===&lt;br /&gt;
http://symfony.com/doc/current/cookbook/assetic/asset_management.html#cookbook-assetic-dumping&lt;br /&gt;
&lt;br /&gt;
== Variables globals que es poden utilitzar directament a les plantilles ==&lt;br /&gt;
*'''app.security''' - el context de seguretat.&lt;br /&gt;
*'''app.user''' - l'objecte qeu representa a l'usuari que està visitant l'aplicació.&lt;br /&gt;
*'''app.request''' - l'objecte Request que conté tota la informació de la petició.&lt;br /&gt;
*'''app.session''' - l'objecte Session relacionat amb l'usuari.&lt;br /&gt;
*'''app.environment''' - l'entorn en el qual s'està executant l'aplicació (dev, prod, etc.)&lt;br /&gt;
*'''app.debug''' - val true si l'aplicació s'està executant en la manera de depuració i false en un altre cas.&lt;br /&gt;
=Formularis=&lt;br /&gt;
Guia Symfony per crear i utilitzar formularis:&lt;br /&gt;
http://symfony.com/doc/2.8/book/forms.html&lt;br /&gt;
&lt;br /&gt;
Symfony incorpora unes llibreries que permeten utilitzar els formularis associant-los amb clases PHP. Exemple:&lt;br /&gt;
Classe Tasca:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/TaskBundle/Entity/Task.php&lt;br /&gt;
namespace Acme\TaskBundle\Entity;&lt;br /&gt;
 &lt;br /&gt;
class Task&lt;br /&gt;
{&lt;br /&gt;
    // descripción de la tarea&lt;br /&gt;
    protected $task;&lt;br /&gt;
 &lt;br /&gt;
    // fecha en la que debe estar completada&lt;br /&gt;
    protected $dueDate;&lt;br /&gt;
 &lt;br /&gt;
    public function getTask()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;task;&lt;br /&gt;
    }&lt;br /&gt;
    public function setTask($task)&lt;br /&gt;
    {&lt;br /&gt;
        $this-&amp;gt;task = $task;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public function getDueDate()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;dueDate;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public function setDueDate(\DateTime $dueDate = null)&lt;br /&gt;
    {&lt;br /&gt;
        $this-&amp;gt;dueDate = $dueDate;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per crear el formulari on demanem totes, o algunes, de les dades que necessitem per crear la tasca anterior fariem el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/TaskBundle/Controller/DefaultController.php&lt;br /&gt;
namespace Acme\TaskBundle\Controller;&lt;br /&gt;
 &lt;br /&gt;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;&lt;br /&gt;
use Acme\TaskBundle\Entity\Task;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
 &lt;br /&gt;
class DefaultController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function newAction(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        // crea una task y le asigna algunos datos ficticios para este ejemplo&lt;br /&gt;
        $task = new Task();&lt;br /&gt;
        $task-&amp;gt;setTask('Write a blog post');&lt;br /&gt;
        $task-&amp;gt;setDueDate(new \DateTime('tomorrow'));&lt;br /&gt;
 &lt;br /&gt;
        $form = $this-&amp;gt;createFormBuilder($task)&lt;br /&gt;
            -&amp;gt;add('task', 'text')&lt;br /&gt;
            -&amp;gt;add('dueDate', 'date')&lt;br /&gt;
            -&amp;gt;add('save', 'submit')&lt;br /&gt;
            -&amp;gt;getForm();&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;render('AcmeTaskBundle:Default:new.html.twig', array(&lt;br /&gt;
            'formulari' =&amp;gt; $form-&amp;gt;createView(),&lt;br /&gt;
        ));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilitzant el formulari en una plantilla TWIG:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #}&lt;br /&gt;
 &lt;br /&gt;
{{ form(formulari) }}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Processant l'enviament del formulari==&lt;br /&gt;
Exemple del controlador que envia i reb les dades d'un formulari:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function newAction(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    // crear un objeto $task nuevo (borra los datos de prueba)&lt;br /&gt;
    $task = new Task();&lt;br /&gt;
 &lt;br /&gt;
    $form =  $this-&amp;gt;createFormBuilder($task)&lt;br /&gt;
    -&amp;gt;setAction($this-&amp;gt;generateUrl('target_route'))&lt;br /&gt;
    -&amp;gt;setMethod('GET')&lt;br /&gt;
    -&amp;gt;add('task', 'text')&lt;br /&gt;
    -&amp;gt;add('dueDate', 'date')&lt;br /&gt;
    -&amp;gt;add('save', 'submit')&lt;br /&gt;
    -&amp;gt;getForm();&lt;br /&gt;
 &lt;br /&gt;
    $form-&amp;gt;handleRequest($request);&lt;br /&gt;
 &lt;br /&gt;
    if ($form-&amp;gt;isValid()) {&lt;br /&gt;
        // guardar la tarea en la base de datos&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;redirect($this-&amp;gt;generateUrl('task_success'));&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Quan es carrega per primera vegada la pàgina associada a aquest controlador, es crea i renderiza el formulari. El mètode '''handleRequest() ''' detecta que el formulari no s'ha enviat i per tant, no fa gens.El mètode '''isValid()''' retorna false si el formulari no s'ha enviat.&lt;br /&gt;
*Quan l'usuari envia el formulari, el mètode '''handleRequest()''' ho detecta i guarda immediatament les dades enviades en les propietats '''task i dueDate''' de l'objecte''' $task.''' Després es valida aquest objecte. Si no és vàlid, el mètode '''isValid()''' retorna '''false''' una altra vegada, per la qual cosa es torna a mostrar el formulari, aquesta vegada amb els missatges d'error corresponents. Si solament vols comprovar si el formulari s'ha enviat, independentment de si és vàlid o no, utilitza el mètode '''isSubmitted()'''.&lt;br /&gt;
*Quan l'usuari envia el formulari amb dades vàlides, les dades enviades es guarden de nou en el formulari, però aquesta vegada el mètode '''isValid()''' retorna '''true'''. En aquest moment ja pots treballar amb l'objecte '''$task''' (per exemple guardant-ho en una base de dades) abans de redirigir a l'usuari a una altra pàgina (per exemple a la pàgina d'agraïment o a la qual mostra un missatge determinat).&lt;br /&gt;
&lt;br /&gt;
=Seguretat=&lt;br /&gt;
És un procés de dues etapes que el seu objectiu és evitar que un usuari accedeixi a un recurs pel qual no hauria de tenir accés.&lt;br /&gt;
&lt;br /&gt;
En el primer pas del procés, el sistema de seguretat identifica qui és l'usuari obligant-ho a enviar algun tipus d'identificació. Això es diu autenticació, i significa que el sistema està tractant d'esbrinar qui ets.&lt;br /&gt;
&lt;br /&gt;
Una vegada que el sistema sap qui ets, el següent pas és decidir si hauries de tenir accés a un determinat recurs. Aquesta part del procés es diu autorització, i significa que el sistema està comprovant si tens suficients privilegis per realitzar una determinada acció.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:seguretat-symfony.png]]&lt;br /&gt;
&lt;br /&gt;
==Firewalls (autenticació)==&lt;br /&gt;
&lt;br /&gt;
El sistema de seguretat de Symfony s'activa quan un usuari fa una petició a una URL que està protegida per un '''firewall''' o tallafocs. El treball del firewall ''consisteix a determinar si l'usuari necessita estar autenticat'', i si ho necessita, enviar una resposta a l'usuari per iniciar el procés d'autenticació.&lt;br /&gt;
&lt;br /&gt;
Un ''firewall s'activa quan la URL d'una petició entrant concorda amb el valor de la seva opció de configuració '''pattern'''''. En aquest exemple el valor de pattern''' (^/)''' concorda amb qualsevol petició entrant. No obstant això, el fet que el firewall estigui activat no significa que el navegador mostra la caixa de login+contrasenya per a totes les URL. Els usuaris poden accedir per exemple a /foo sense que l'aplicació els demani que s'autentiquin.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:firewall-symfony.png]]&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/security.yml&lt;br /&gt;
security:&lt;br /&gt;
    firewalls:&lt;br /&gt;
        secured_area:&lt;br /&gt;
            pattern:    ^/&lt;br /&gt;
            anonymous: ~&lt;br /&gt;
            http_basic:&lt;br /&gt;
                realm: &amp;quot;Secured Demo Area&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    access_control:&lt;br /&gt;
        - { path: ^/admin, roles: ROLE_ADMIN }&lt;br /&gt;
        # Descomenta la siguiente línea para proteger también&lt;br /&gt;
        # la propia URL /admin&lt;br /&gt;
        # - { path: ^/admin$, roles: ROLE_ADMIN }&lt;br /&gt;
&lt;br /&gt;
    providers:&lt;br /&gt;
        in_memory:&lt;br /&gt;
            memory:&lt;br /&gt;
                users:&lt;br /&gt;
                    ryan:  { password: ryanpass, roles: 'ROLE_USER' }&lt;br /&gt;
                    admin: { password: kitten, roles: 'ROLE_ADMIN' }&lt;br /&gt;
&lt;br /&gt;
    encoders:&lt;br /&gt;
        Symfony\Component\Security\Core\User\User: plaintext&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquest funcionament és possible en primer lloc perquè el firewall permet l'accés als usuaris anònims a causa de l'opció de configuració anonymous. En altres paraules, el firewall no exigeix que tots els usuaris s'autentiquin res més accedir a l'aplicació. I com en la configuració de la secció access_control no s'indica que els usuaris hagin de tenir cap role especial per accedir a /foo la petició es processa sense requerir a l'usuari que s'autentiqui.&lt;br /&gt;
&lt;br /&gt;
Si elimines l'opció anonymous, l'efecte és que ara el firewall demana autenticació a qualsevol recurs.&lt;br /&gt;
&lt;br /&gt;
Seguint amb el mateix exemple, si un usuari sol·licita '''/admin/foo''', l'aplicació es comporta de manera diferent. Això és a causa de la configuració de la secció '''access_control''', que indica que qualsevol URL que coincideixi amb l'expressió regular '''^/admin''' (és a dir, la URL '''/admin''' o qualsevol altra URL que coincideixi amb /admin/) requereix el rol''' ROLE_ADMIN'''. Els rols són la clau del sistema d'autorització: l'usuari pot accedir a '''/admin/foo''' només si compta amb el rol'''ROLE_ADMIN'''.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:access-symfony.png ]]&lt;br /&gt;
&lt;br /&gt;
La capa de control d'accés denega l'accés a l'usuari (perquè els usuaris anònims no compten amb el rol ROLE_ADMIN), el firewall pren el control de l'aplicació i inicia el procés d'autenticació.&lt;br /&gt;
&lt;br /&gt;
==Utilitzant el típic formulari de accés==&lt;br /&gt;
En primer lloc, afegeix l'opció form_login en la configuració del firewall:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/security.yml&lt;br /&gt;
security:&lt;br /&gt;
    firewalls:&lt;br /&gt;
        secured_area:&lt;br /&gt;
            pattern:    ^/&lt;br /&gt;
            anonymous:  ~&lt;br /&gt;
            form_login:&lt;br /&gt;
                login_path:  login&lt;br /&gt;
                check_path:  login_check&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El sistema de seguretat inicia el procés d'autenticació, es redirigeix a l'usuari a la ruta que mostra el formulari d'accés (per defecte '''/login'''). El'' formulari has de crear-ho tu mateix a mà, ja que Symfony no ho proporciona''. Primer crea les dues noves rutes utilitzades en la configuració de la seguretat: la ruta '''login''' mostra el formulari (es correspon amb la URL''' /login''') i '''login_check''' que processa l'enviament del formulari (es correspon amb la URL '''/login_check)''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/routing.yml&lt;br /&gt;
login:&lt;br /&gt;
    pattern:   /login&lt;br /&gt;
    defaults:  { _controller: AcmeSecurityBundle:Security:login }&lt;br /&gt;
login_check:&lt;br /&gt;
    pattern:   /login_check&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observa que el nom de la ruta '''login''' coincideix amb el valor de l'opció '''login_path''', ja que és on el sistema de seguretat redirigeix als usuaris que necessiten autenticar-se.&lt;br /&gt;
&lt;br /&gt;
A continuació, crea el controlador que mostra el formulari de accés:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/SecurityBundle/Controller/SecurityController.php;&lt;br /&gt;
namespace Acme\SecurityBundle\Controller;&lt;br /&gt;
 &lt;br /&gt;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
use Symfony\Component\Security\Core\SecurityContext;&lt;br /&gt;
 &lt;br /&gt;
class SecurityController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function loginAction(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $session = $request-&amp;gt;getSession();&lt;br /&gt;
 &lt;br /&gt;
        // get the login error if there is one&lt;br /&gt;
        if ($request-&amp;gt;attributes-&amp;gt;has(SecurityContext::AUTHENTICATION_ERROR)) {&lt;br /&gt;
            $error = $request-&amp;gt;attributes-&amp;gt;get(&lt;br /&gt;
                SecurityContext::AUTHENTICATION_ERROR&lt;br /&gt;
            );&lt;br /&gt;
        } else {&lt;br /&gt;
            $error = $session-&amp;gt;get(SecurityContext::AUTHENTICATION_ERROR);&lt;br /&gt;
            $session-&amp;gt;remove(SecurityContext::AUTHENTICATION_ERROR);&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;render(&lt;br /&gt;
            'AcmeSecurityBundle:Security:login.html.twig',&lt;br /&gt;
            array(&lt;br /&gt;
                // last username entered by the user&lt;br /&gt;
                'last_username' =&amp;gt; $session-&amp;gt;get(SecurityContext::LAST_USERNAME),&lt;br /&gt;
                'error'         =&amp;gt; $error,&lt;br /&gt;
            )&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si l'usuari envia un nom d'usuari o contrasenya no vàlids, aquest controlador obté el missatge d'error del sistema de seguretat i ho mostra a l'usuari.&lt;br /&gt;
Tu t'encarregues de mostrar el formulari a l'usuari i els errors que puguin haver ocorregut, però ''el propi sistema de seguretat s'encarrega de verificar el nom d'usuari i contrasenya i l'autenticació de l'usuari''.&lt;br /&gt;
Plantilla del formulari:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/SecurityBundle/Resources/views/Security/login.html.twig #}&lt;br /&gt;
{% if error %}&lt;br /&gt;
    &amp;lt;div&amp;gt;{{ error.message }}&amp;lt;/div&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ path('login_check') }}&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;label for=&amp;quot;username&amp;quot;&amp;gt;Username:&amp;lt;/label&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;username&amp;quot; name=&amp;quot;_username&amp;quot; value=&amp;quot;{{ last_username }}&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;label for=&amp;quot;password&amp;quot;&amp;gt;Password:&amp;lt;/label&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;password&amp;quot; id=&amp;quot;password&amp;quot; name=&amp;quot;_password&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    {#&lt;br /&gt;
        añade lo siguiente si quieres redirigir al usuario a una&lt;br /&gt;
        URL concreta después del login (explicado más adelante)&lt;br /&gt;
        &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;_target_path&amp;quot; value=&amp;quot;/account&amp;quot; /&amp;gt;&lt;br /&gt;
    #}&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;login&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=Webgrafia=&lt;br /&gt;
Els llibres sobre symfony utilitzats per elaborar un resum de les funcionalitats més importants els podeu trobar a : [http://librosweb.es/libros/ http://librosweb.es/libros/]&lt;br /&gt;
&lt;br /&gt;
També s'ha utilitzat el llibre oficial que podeu trobar a la web:[http://symfony.com/doc/current/book/index.html http://symfony.com/]&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_PHP_(15h)&amp;diff=7134</id>
		<title>NF2 - Framework PHP (15h)</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_PHP_(15h)&amp;diff=7134"/>
				<updated>2016-05-20T09:47:14Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* Enllaçant arxius web (css, javascript) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introducció a Symfony=&lt;br /&gt;
&amp;lt;div width=&amp;quot;100%&amp;quot; style=&amp;quot;clear:both; &amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:30%;&amp;quot;&amp;gt;&lt;br /&gt;
[[fitxer:symfony.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:70%;&amp;quot;&amp;gt;&lt;br /&gt;
Un framework simplifica el desenvolupament de les aplicacions, ja que automatitza molts dels patrons utilitzats per resoldre les tasques comunes. A més, un framework proporciona estructura al codi font, forçant al desenvolupador a crear codi més llegible i més fàcil de mantenir. Finalment, un framework facilita la programació d'aplicacions, ja que encapsula operacions complexes en instruccions senzilles.&lt;br /&gt;
&lt;br /&gt;
Symfony és un complet framework dissenyat per optimitzar, gràcies a les seves característiques, el desenvolupament de les aplicacions web. Per començar, separa la lògica de negoci, la lògica de servidor i la presentació de l'aplicació web. Proporciona diverses eines i classes encaminades a reduir el temps de desenvolupament d'una aplicació web complexa. A més, automatitza les tasques més comunes, permetent al desenvolupador dedicar-se per complet als aspectes específics de cada aplicació. El resultat de tots aquests avantatges és que no s'ha de reinventar la roda cada vegada que es crea una nova aplicació web.&lt;br /&gt;
&lt;br /&gt;
Symfony està desenvolupat completament amb PHP i ha estat provat amb èxit en llocs com Yahoo! Answers, delicious, DailyMotion i molts altres llocs web de primer nivell. Symfony és compatible amb la majoria de gestors de bases de dades, com MySQL, PostgreSQL, Oracle i SQL Server de Microsoft. Es pot executar tant en plataformes Unix (Unix, Linux, etc.) com en plataformes Windows. A continuació es mostren algunes de les seves característiques.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt; &lt;br /&gt;
=Característiques=&lt;br /&gt;
Symfony es va dissenyar perquè s'ajustés als següents requisits:&lt;br /&gt;
&lt;br /&gt;
*Fàcil d'instal·lar i configurar en la majoria de plataformes (i amb la garantia que funciona correctament en els sistemes Windows i *nix estàndards)&lt;br /&gt;
*Independent del sistema gestor de bases de dades&lt;br /&gt;
*Senzill d'usar en la majoria de casos, però prou flexible com per adaptar-se als casos més complexos&lt;br /&gt;
*Basat en la premissa de &amp;quot;convenir en comptes de configurar&amp;quot;, en la qual el desenvolupador solament ha de configurar allò que no és convencional&lt;br /&gt;
*Segueix la majoria de millors pràctiques i patrons de disseny per a la web&lt;br /&gt;
*Preparat per a aplicacions empresarials i adaptable a les polítiques i arquitectures pròpies de cada empresa, a més de ser prou estable com per desenvolupar aplicacions a llarg termini&lt;br /&gt;
*Codi fàcil de llegir que inclou comentaris de phpDocumentor i que permet un manteniment molt senzill&lt;br /&gt;
*Fàcil d'estendre, la qual cosa permet la seva integració amb llibreries desenvolupades per tercers&lt;br /&gt;
&lt;br /&gt;
Symfony pot ser completament personalitzat per complir amb els requisits de les empreses que disposen de les seves pròpies polítiques i regles per a la gestió de projectes i la programació d'aplicacions. Per defecte incorpora diversos entorns de desenvolupament diferents i inclou diverses eines que permeten automatitzar les tasques més comunes de l'enginyeria del programari:&lt;br /&gt;
&lt;br /&gt;
Les eines que generen automàticament codi han estat dissenyades per fer prototips d'aplicacions i per crear fàcilment la part de gestió de les aplicacions.&lt;br /&gt;
*El framework de desenvolupament de proves unitàries i funcionals proporciona les eines ideals per al desenvolupament basat en proves &amp;quot;test-driven development&amp;quot;).&lt;br /&gt;
*La barra de depuració web simplifica la depuració de les aplicacions, ja que mostra tota la informació que els programadors necessiten sobre la pàgina en la qual estan treballant.&lt;br /&gt;
*La interfície de línia de comandos automatitza la instal·lació de les aplicacions entre servidors.&lt;br /&gt;
*És possible realitzar canvis &amp;quot;en calent&amp;quot; de la configuració (sense necessitat de reiniciar el servidor).&lt;br /&gt;
*El complet sistema de log permet als administradors accedir fins a l'últim detall de les activitats que realitza l'aplicació.&lt;br /&gt;
&lt;br /&gt;
=Desenvolupament ràpid d'aplicacions (RAD)=&lt;br /&gt;
&lt;br /&gt;
Durant molt temps, la programació d'aplicacions web va ser un tasca tediosa i molt lenta. Seguint els cicles habituals de l'enginyeria del programari (com els proposats pel Procés Racional Unificat o Rational Unified Process) el desenvolupament d'una aplicació web no pot començar fins que s'han establert per escrit una sèrie de requisits, s'han creat els diagrames UML Unified Modeling Language) i s'ha produït abundant documentació sobre el projecte. Aquest model es veia afavorit per la baixa velocitat de desenvolupament, la falta de versatilitat dels llenguatges de programació (abans d'executar el programa s'ha de construir, compilar i reiniciar) i sobretot pel fet que els clients no estaven disposats a adaptar-se a altres metodologies.&lt;br /&gt;
&lt;br /&gt;
Avui dia, les empreses reaccionen més ràpidament i els clients canvien d'opinió constantment durant el desenvolupament dels projectes. D'aquesta manera, els equips de desenvolupament han d'adaptar-se a aquestes necessitats i han de poder canviar l'estructura d'una aplicació de forma ràpida. Afortunadament, l'ús de llenguatges de script com Python, Ruby i PHP permeten seguir altres estratègies de programació, com RAD (desenvolupament ràpid d'aplicacions) i el desenvolupament àgil de programari.&lt;br /&gt;
&lt;br /&gt;
Una de les idees centrals d'aquesta metodologia és que el desenvolupament comença al més aviat possible perquè el client pugui revisar un prototip que funciona i pugui indicar el camí a seguir. A partir d'aquí, l'aplicació es desenvolupa de forma iterativa, en la qual cada nova versió incorpora noves funcionalitats i es desenvolupa en un breu espai de temps.&lt;br /&gt;
&lt;br /&gt;
Les conseqüències d'aquestes metodologies per al desenvolupador són nombroses. El programador no ha de pensar sobre les versions futures en incloure una nova funcionalitat. Els mètodes utilitzats han de ser el més senzills i directes possibles. Aquestes idees es resumeixen en el principi denominat ''KISS'': Fes-ho senzill, idiota!''Keep It Simple, Stupid''&lt;br /&gt;
&lt;br /&gt;
Quan es modifiquen els requisits o quan s'afegeix una nova funcionalitat, normalment s'ha de reescriure part del codi existent. Aquest procés es diu refactorización i succeeix sovint durant el desenvolupament d'una aplicació web. El codi sol moure's a altres llocs en funció de la seva naturalesa. Els blocs de codi repetits es refactorizan en un únic lloc, aplicant el principi ''DRY'': No et repeteixis ''Don't Repeat Yourself''.&lt;br /&gt;
&lt;br /&gt;
Per assegurar que l'aplicació segueix funcionant correctament malgrat els canvis constants, es necessita una sèrie de proves unitàries que puguin ser automatitzades. Si estan ben escrites, les proves unitàries permeten assegurar que gens ha deixat de funcionar després d'haver-hi refactorizado part del codi de l'aplicació. Algunes metodologies de desenvolupament d'aplicacions obliguen a escriure les proves abans que el propi codi, la qual cosa es coneix com TDD: desenvolupament basat en proves ''test-driven development.''&lt;br /&gt;
&lt;br /&gt;
Symfony és l'eina ideal pel RAD. De fet, el framework ha estat desenvolupat per una empresa que aplica el RAD als seus propis projectes. Per aquest motiu, aprendre a utilitzar Symfony no és com aprendre un nou llenguatge de programació, sinó que consite a aprendre a prendre les decisions correctes per desenvolupar les aplicacions de forma més efectiva.&lt;br /&gt;
&lt;br /&gt;
=La implementació del MVC que realitza Symfony=&lt;br /&gt;
*La capa del Modelo&lt;br /&gt;
**Abstracció de la base de dades&lt;br /&gt;
**Accés a les dades&lt;br /&gt;
*La capa de la Vista &lt;br /&gt;
**Vista&lt;br /&gt;
**Plantilla&lt;br /&gt;
**Layout&lt;br /&gt;
*La capa del Controlador&lt;br /&gt;
**Controlador frontal&lt;br /&gt;
**Acció&lt;br /&gt;
&lt;br /&gt;
En total són set scripts, la qual cosa semblen molts arxius per obrir i modificar cada vegada que es crea una pàgina. Afortunadament, Symfony simplifica aquest procés. Symfony pren el millor de l'arquitectura MVC i la implementa de manera que el desenvolupament d'aplicacions sigui ràpid i senzill.&lt;br /&gt;
&lt;br /&gt;
En primer lloc, el controlador frontal i el layout són comuns per a totes les accions de l'aplicació. Es poden tenir diversos controladors i diversos layouts, però solament és obligatori tenir un de cada. El controlador frontal és un component que només té codi relatiu al MVC, per la qual cosa no és necessari crear un, ja que Symfony ho genera de forma automàtica.&lt;br /&gt;
&lt;br /&gt;
L'altra bona notícia és que les classes de la capa del model també es generen automàticament, en funció de l'estructura de dades de l'aplicació. El ORM s'encarrega de crear l'esquelet o estructura bàsica de les classes i genera automàticament tot el codi necessari. Quan el ORM troba restriccions de claus foranes (o externes) o quan troba dades de tipus data, crea mètodes especials per accedir i modificar aquestes dades, per la qual cosa la manipulació de dades es converteix en un joc de nens. L'abstracció de la base de dades és completament transparent per al programador, ja que es realitza de forma nativa mitjançant PDO PHP Data Objects). Així, si es canvia el sistema gestor de bases de dades a qualsevol moment, no s'ha de reescriure ni una línia de codi, ja que tan sols és necessari modificar un paràmetre en un arxiu de configuració.&lt;br /&gt;
&lt;br /&gt;
Finalment, la lògica de la vista es pot transformar en un arxiu de configuració senzill, sense necessitat de programar-la.&lt;br /&gt;
&lt;br /&gt;
[[fitxer:mvc-symfony.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Instal·lació de Symfony=&lt;br /&gt;
Utilitzarem la versió de symfony 2.4.&lt;br /&gt;
&lt;br /&gt;
[[Instal·lació de la versió 2.4 de symfony ]] (antic)&lt;br /&gt;
&lt;br /&gt;
[[Instal·lació de la versió LTS 2.8 de symfony ]]&lt;br /&gt;
&lt;br /&gt;
[http://symfony.com/doc/current/index.html Llibre gratuït de symfony2].&lt;br /&gt;
&lt;br /&gt;
Accedeix a la URL:&lt;br /&gt;
http://localhost/m7/web/app.php&lt;br /&gt;
&lt;br /&gt;
'''nota:''' m7 és, en aquest cas, el nomProjecteSymfony utilitzat en la creació del projecte symfony.&lt;br /&gt;
&lt;br /&gt;
Hauries de veure una pàgina com aquesta:&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:symfony2.8_inici.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
==Creació de la primera pàgina:==&lt;br /&gt;
Una vegada executis la línia següent anirà preguntant opcions. Tot per defecte. Al nom del bundle podeu posar: HolaMonBundle&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php app/console generate:bundle --namespace=m7/HolaMon --format=yml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Iniciar el servidor ==&lt;br /&gt;
Symfony pot ser instal·lat dintre d'un servidor apache2 però per entorns de desenvolupament porta un servidor web integrat. Per executar el servidor i poder provar les aplicacions podeu iniciar-lo amb la comanda de terminal:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php app/console server:run&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Si heu engegat el servidor integrat podeu provar la pàgina creada en el punt anterior utilitzant aquesta [http://localhost:8000/ url]&lt;br /&gt;
&lt;br /&gt;
Si teniu apache2 instal·lat, podeu provar la pàgina utilitzant aquesta [http://localhost/m7/web/app.php/ url_apache_m7]&lt;br /&gt;
== Si hi ha un error accedint a la pàgina!!==&lt;br /&gt;
Amb apache2, si en algun moment deixa de funcionar heu de provar de fer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo php app/console cache:clear --env=prod &amp;amp;&amp;amp; sudo php app/console cache:warmup --env=prod&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
i donar-li permisos (una altre vegada) a la carpeta principal (dintre de /var/www/html):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod 777 nomprojecte/ -R&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exercici [opcional]:===&lt;br /&gt;
Utilitzant el servidor web apache2 creeu un virtualhost per poder utilitzar symfony2 directament posant: http://localhost/&lt;br /&gt;
&lt;br /&gt;
=Estructura del projecte: Aplicacions, Mòduls i Accions=&lt;br /&gt;
Symfony considera un projecte com '''un conjunt de serveis i operacions disponibles sota un determinat nom de domini i que comparteixen el mateix model d'objectes'''.&lt;br /&gt;
&lt;br /&gt;
Dins d'un projecte, les operacions s'agrupen de forma lògica en aplicacions. Normalment, una aplicació s'executa de forma independent respecte d'altres aplicacions del mateix projecte. L'habitual és que un projecte contingui dues aplicacions: una per a la part pública i una altra per a la part de gestió, compartint ambdues la mateixa base de dades. També és possible definir projectes que estiguin formats per diversos llocs web petits, cadascun d'ells considerat com una aplicació. En aquest cas, és important tenir en compte que els enllaços entre aplicacions s'han d'indicar de forma absoluta.&lt;br /&gt;
&lt;br /&gt;
Cada aplicació està formada per un o més mòduls. Un mòdul normalment representa&lt;br /&gt;
*a una pàgina web o &lt;br /&gt;
*a un grup de pàgines amb un propòsit relacionat.&lt;br /&gt;
Per exemple, una aplicació podria tenir mòduls com home, articulos, ajuda, carritoCompra, compte, etc.&lt;br /&gt;
&lt;br /&gt;
Els mòduls emmagatzemen les accions, que representen cadascuna de les operacions que es pot realitzar en un mòdul. Per exemple el mòdul ''carretCompra'' pot definir accions com ''afegir'', mostrar i actualitzar. Normalment les accions es descriuen mitjançant verbs. Treballar amb accions és molt similar a treballar amb les pàgines d'una aplicació web tradicional, encara que en aquest cas dues accions diferents poden acabar mostrant la mateixa pàgina (com per exemple l'acció d'afegir un comentari a una entrada d'un blog, que acaba tornant a mostrar la pàgina de l'entrada amb el nou comentari).&lt;br /&gt;
=Estructura de l'arbre de arxius=&lt;br /&gt;
Normalment, tots els projectes web comparteixen el mateix tipus de continguts, com per exemple:&lt;br /&gt;
&lt;br /&gt;
Una base de dades, com MySQL o PostgreSQL&lt;br /&gt;
*Arxiu estàtics (HTML, imatges, arxius de Javascript, fulles d'estils, etc.)&lt;br /&gt;
*Arxius pujats al lloc web per part dels usuaris o els administradors&lt;br /&gt;
*Classes i llibreries PHP&lt;br /&gt;
*Llibreries externes (scripts desenvolupats per tercers)&lt;br /&gt;
*Arxius que s'executen per lots batch files) que normalment són scripts que s'executen via línia de comandos o mitjançant cron&lt;br /&gt;
*Arxius de log (les traces que generen les aplicacions i/o el servidor)&lt;br /&gt;
*Arxius de configuració&lt;br /&gt;
&lt;br /&gt;
Symfony proporciona una estructura en forma d'arbre d'arxius per organitzar de forma lògica tots aquests continguts, a més de ser consistent amb l'arquitectura MVC utilitzada i amb l'agrupació projecto / aplicació / mòdul. Cada vegada que es crea un nou projecte, aplicació o mòdul, es genera de forma automàtica la part corresponent d'aquesta estructura. A més, l'estructura es pot personalitzar completament, per reorganitzar els arxius i directoris o per complir amb les exigències d'organització d'un client.&lt;br /&gt;
&lt;br /&gt;
Encara que es pot canviar, per defecte totes les aplicacions Symfony tenen la mateixa estructura de directoris senzilla (i recomanada):&lt;br /&gt;
&lt;br /&gt;
*'''app/''': conté la configuració de l'aplicació.&lt;br /&gt;
*'''src/''': aquí es troba tot el codi PHP de l'aplicació.&lt;br /&gt;
*'''vendor/''': per convenció aquí es guarden totes les llibreries creades per tercers.&lt;br /&gt;
*'''web/''': est és el directori web arrel i conté tots els arxius que es poden accedir públicament.&lt;br /&gt;
==El directori web==&lt;br /&gt;
El directori web arrel és el lloc on es troben tots els arxius públics i estàtics tals com a imatges, fulles d'estil i arxius Javascript. També és el lloc on es defineixen tots els controladors frontals, com per exemple el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// web/app.php&lt;br /&gt;
require_once __DIR__.'/../app/bootstrap.php.cache';&lt;br /&gt;
require_once __DIR__.'/../app/AppKernel.php';&lt;br /&gt;
 &lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
 &lt;br /&gt;
$kernel = new AppKernel('prod', false);&lt;br /&gt;
$kernel-&amp;gt;loadClassCache();&lt;br /&gt;
$kernel-&amp;gt;handle(Request::createFromGlobals())-&amp;gt;send();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'arxiu del controlador frontal ('''app.php''' en aquest exemple) és l'arxiu PHP que realment s'executa quan utilitzes una aplicació Symfony2 i el seu treball consisteix a arrencar l'aplicació utilitzant una classe del nucli ('''AppKernel''').&lt;br /&gt;
&lt;br /&gt;
Tenir un controlador frontal significa que s'utilitzen URL diferents i més flexibles que les d'una aplicació PHP típica. Quan es disposa d'un controlador frontal, les URL es formaten de la següent manera:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://localhost/app.php/hello/Ryan&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
El controlador frontal, '''app.php''', s'executa i la URL interna: ''/hello/Ryan'' es dirigeix internament segons la configuració d'encaminament.&lt;br /&gt;
&lt;br /&gt;
Si a més utilitzes el mòdul '''mod_rewrite''' d'Apache, pots forçar l'execució de l'arxiu '''app.php''' sense necessitat d'incloure-ho en la URL, per la qual cosa així les URL són encara més netes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://localhost/hello/Ryan&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==El directori de l'aplicació (app)==&lt;br /&gt;
La classe '''AppKernel''' és el punt d'entrada principal de l'aplicació i és la responsable de tota la configuració. Com a tal, s'emmagatzema en el directori '''app/'''.&lt;br /&gt;
&lt;br /&gt;
Aquesta classe ha d'implementar dos mètodes que defineixen tot el que Symfony necessita saber sobre la teva aplicació. Ni tan sols has de preocupar-te d'aquests mètodes durant l'arrencada — Symfony els emplena per tu amb paràmetres predeterminats.&lt;br /&gt;
&lt;br /&gt;
*'''registerBundles()''': retorna un array amb tots els bundles necessaris per executar l'aplicació.&lt;br /&gt;
*'''registerContainerConfiguration()''': carrega l'arxiu de configuració de recursos de l'aplicació (consulta la secció Configurant l'aplicació).&lt;br /&gt;
Durant el desenvolupament d'una aplicació, normalment el directori '''app/''' solament els utilitzes per modificar la configuració i els arxius d'encaminament en el directori '''app/config/'''.&lt;br /&gt;
&lt;br /&gt;
Aquest directori també conté el directori '''caché''' de l'aplicació (app/cache), un directori de '''logs''' (app/logs) i un directori per a arxius de '''recursos globals''', tals com a plantilles (app/Resources).&lt;br /&gt;
&lt;br /&gt;
'''Carga automàtica'''&lt;br /&gt;
En arrencar Symfony, s'inclou un arxiu especial anomenat ''vendor/autoload.php''. Aquest arxiu, creat per ''Composer'', s'encarrega de configurar el carregador automàtic de classes, que al seu torn '''carrega automàticament tots els arxius''' de la teva aplicació que es trobin '''en el directori src/''' i '''totes les llibreries externes''' configurades en l'arxiu '''composer.json'''.&lt;br /&gt;
&lt;br /&gt;
Gràcies al carregador automàtic, '''mai hauràs de preocupar-te d'usar declaracions include o require'''. Això és possible perquè Composer utilitza namespace o espai de noms d'una classe per determinar la seva ubicació i així '''inclou automàticament l'arxiu en l'instant en què necessites una classe'''.&lt;br /&gt;
&lt;br /&gt;
El carregador automàtic '''ja està configurat per buscar qualsevol de les teves classes PHP en el directori src/'''. Perquè funcioni la càrrega automàtica, el nom de la classe i la ruta de l'arxiu '''han de seguir el mateix patró''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Nom de la classe: Acme\HelloBundle\Controller\HelloController&lt;br /&gt;
Ruta física de l'arxiu: src/Acme/HelloBundle/Controller/HelloController.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Configuració de l'aplicació ==&lt;br /&gt;
Segons el lloc web oficial de YAML (http://www.yaml.org/), YAML és &amp;quot;un estàndard per serializar dades en qualsevol llenguatge de programació i amb un format fàcil de llegir per part de les persones&amp;quot;. Dit d'una altra forma, YAML és un llenguatge molt senzill que permet descriure les dades com en XML, però amb una sintaxi molt més senzilla. YAML és un format especialment útil per descriure dades que poden ser transformats en arrays simples i associatius, com per exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$casa = array(&lt;br /&gt;
  'familia' =&amp;gt; array(&lt;br /&gt;
    'apellido'  =&amp;gt; 'García',&lt;br /&gt;
    'padres'  =&amp;gt; array('Antonio', 'María'),&lt;br /&gt;
    'hijos'   =&amp;gt; array('Jose', 'Manuel', 'Carmen')&lt;br /&gt;
  ),&lt;br /&gt;
  'direccion' =&amp;gt; array(&lt;br /&gt;
    'numero'        =&amp;gt; 34,&lt;br /&gt;
    'calle'         =&amp;gt; 'Gran Vía',&lt;br /&gt;
    'ciudad'        =&amp;gt; 'Cualquiera',&lt;br /&gt;
    'codigopostal'  =&amp;gt; '12345'&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//format yml:&lt;br /&gt;
casa:&lt;br /&gt;
  familia:&lt;br /&gt;
    apellido: García&lt;br /&gt;
    padres:&lt;br /&gt;
      - Antonio&lt;br /&gt;
      - María&lt;br /&gt;
    hijos:&lt;br /&gt;
      - Jose&lt;br /&gt;
      - Manuel&lt;br /&gt;
      - Carmen&lt;br /&gt;
  direccion:&lt;br /&gt;
    numero: 34&lt;br /&gt;
    calle: Gran Vía&lt;br /&gt;
    ciudad: Cualquiera&lt;br /&gt;
    codigopostal: &amp;quot;12345&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
YAML és l'acrònim de &amp;quot;YAML Ain't Markup Language&amp;quot; (&amp;quot;YAML No és un Llenguatge de Marcat&amp;quot;) i es pronuncia &amp;quot;yamel&amp;quot;. El format es porta utilitzant des de 2001 i existeixen utilitats per processar YAML en una gran varietat de llenguatges de programació.&lt;br /&gt;
&lt;br /&gt;
YAML és molt més ràpid d'escriure que XML (ja que no fan falta les etiquetes de tancament i l'ús continu de les cometes) i és molt més poderós que els tradicionals arxius .ini (ja que aquests últims no suporten l'herència i les estructures complexes). Per aquest motiu, Symfony utilitza el format YAML com el llenguatge preferit per emmagatzemar la seva configuració.&lt;br /&gt;
&lt;br /&gt;
Per saber més sobre aquest format pots consultar la [http://symfony.com/legacy/doc/reference/1_4/en/02-YAML següent] pàgina web.&lt;br /&gt;
==El directori font (src)==&lt;br /&gt;
El directori '''src/''' conté tot el codi real (codi PHP, plantilles, arxius de configuració, estils, etc.) que pertany a la teva aplicació. De fet, en programar una aplicació Symfony, la major part del teu treball es durà a terme dins d'un o més''' bundles '''creats en aquest directori.&lt;br /&gt;
&lt;br /&gt;
=Els Bundles=&lt;br /&gt;
[[Els bundles a symfony 2.]]&lt;br /&gt;
&lt;br /&gt;
=Entorn de desenvolupament i entorn de producció=&lt;br /&gt;
Una aplicació pot funcionar en diversos entorns. Els diferents entorns comparteixen el mateix codi PHP (solament és diferent el controlador frontal), però usen una configuració diferent. Per exemple, un entorn de desenvolupament '''dev''' guarda els advertiments i errors, mentre que un entorn de producció '''prod''' només registra els errors. Alguns arxius es tornen a generar en cada petició en l'entorn '''dev''' (para major comoditat dels desenvolupadors), però s'escorcollen en l'entorn '''prod'''. Tots els entorns es troben en la mateixa màquina i executen la mateixa aplicació.&lt;br /&gt;
&lt;br /&gt;
Un projecte Symfony2 '''normalment comença amb tres entorns (dev, test i prod)''', encara que resulta senzill crear nous entorns.''' Pots veure la teva aplicació en diferents entorn''' amb només '''canviar el controlador frontal'''en el teu navegador. Per veure l'aplicació en l'entorn '''dev''', accedeix a l'aplicació a través del controlador frontal de desenvolupament:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://localhost/app_dev.php/hola&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Si desitges veure com es comportarà la teva aplicació a l'entorn de producció, utilitza en el seu lloc el controlador frontal '''prod''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://localhost/app.php/hola&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Si fas qualsevol canvi en les plantilles, no ho veuràs en l'entorn prod tret que esborris la cache de l'aplicació i així forcis a Symfony a tornar a compilar les plantilles. Per esborrar la cache de l'entorn de producció, executa la següent comanda de consola:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo php app/console cache:clear --env=prod &amp;amp;&amp;amp; sudo php app/console cache:warmup --env=prod&lt;br /&gt;
i donar-li permísos:&lt;br /&gt;
chmod 777 nomprojecte/ -R&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=El controlador=&lt;br /&gt;
Un controlador és una funció PHP creada per tu i que s'encarrega d'obtenir la informació de la petició HTTP i de generar i retornar la resposta HTTP (en forma d'objecte de tipus Response de Symfony2).&lt;br /&gt;
La resposta pot ser:&lt;br /&gt;
*una pàgina HTML,&lt;br /&gt;
*un document XML, &lt;br /&gt;
*un array JSON serializado, &lt;br /&gt;
*una imatge, &lt;br /&gt;
*una redirecció a una altra pàgina, &lt;br /&gt;
*un error de tipus 404 &lt;br /&gt;
*o qualsevol altra cosa que se t'ocorri. &lt;br /&gt;
El controlador conté tota la lògica que la teva aplicació necessita per generar el contingut de la pàgina. L'objectiu d'un controlador sempre és el mateix: crear i retornar un objecte '''Response'''.&lt;br /&gt;
==Cicle de vida d'una petició==&lt;br /&gt;
* 1.Cada petició és tractada per un únic arxiu: el controlador frontal (per exemple, '''app.php''' o '''app_dev.php''') el qual és responsable d'iniciar l'aplicació.&lt;br /&gt;
* 2. El sistema d'encaminament (classe Routing) llegeix la informació de la petició (per exemple, la URI), troba una ruta que coincideixi amb aquesta informació, i llegeix el paràmetre '''_controller''' de la ruta.&lt;br /&gt;
* 3. S'executa el controlador assignat a la ruta i aquest controlador crea i retorna un objecte '''Response'''.&lt;br /&gt;
* 4. Les capçaleres HTTP i el contingut de l'objecte Response s'envien de tornada al client.&lt;br /&gt;
&lt;br /&gt;
Exemple de controlador:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/HelloBundle/Controller/HelloController.php&lt;br /&gt;
 &lt;br /&gt;
namespace Acme\HelloBundle\Controller;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Response;&lt;br /&gt;
 &lt;br /&gt;
class HelloController&lt;br /&gt;
{&lt;br /&gt;
    public function indexAction()&lt;br /&gt;
    {&lt;br /&gt;
      return new Response('&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;Hello world!&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Associant una URI a un controlador==&lt;br /&gt;
El nou controlador retorna una pàgina HTML simple. Per poder provar realment aquesta pàgina en el teu navegador, has de crear una ruta que el seu path sigui la URI que vols associar al controlador al fitxer '''routing.yml''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
hello:&lt;br /&gt;
    path:         /hello&lt;br /&gt;
    defaults:     { _controller: AcmeHelloBundle:Hello:index }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Observa la sintaxi utilitzada per referir-se al controlador: '''AcmeHelloBundle:Hello:index'''. Symfony2 utilitza aquesta notació curta per referir-se als controladors. Es tracta de la '''sintaxi recomanada''' i li diu a Symfony2 que busqui una '''classe controlador anomenada HelloController''' dins d'un '''paquet''' anomenat''' AcmeHelloBundle '''i que després '''executi el mètode indexAction()'''.&lt;br /&gt;
&lt;br /&gt;
'''Passar arguments al mètode del controlador'''&lt;br /&gt;
Exemple de controlador amb un argument en un dels seus mètodes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// src/Acme/HelloBundle/Controller/HelloController.php&lt;br /&gt;
 &lt;br /&gt;
namespace Acme\HelloBundle\Controller;&lt;br /&gt;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;&lt;br /&gt;
 &lt;br /&gt;
class HelloController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function indexAction($name)&lt;br /&gt;
    {&lt;br /&gt;
      // ...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El controlador anterior té un sol argument, anomenat '''$name''', el valor del qual correspon al paràmetre '''{name}''' de la ruta associada. De fet, quan executes el teu controlador, Symfony2 associa cada argument del controlador amb un paràmetre de la ruta. &lt;br /&gt;
L'arxiu d'enrutament hauria de ser aquest:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
hello:&lt;br /&gt;
    path:         /hello&lt;br /&gt;
    defaults:     { _controller: AcmeHelloBundle:Hello:index }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Considera el següent exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/routing.yml&lt;br /&gt;
hello:&lt;br /&gt;
    path:         /hello/{firstName}/{lastName}&lt;br /&gt;
    defaults:     { _controller: AcmeHelloBundle:Hello:index, color: green }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function indexAction($firstName, $lastName, $color)&lt;br /&gt;
{&lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les variables '''{firstName}''' i '''{lastName}''' de la ruta es diuen '''placeholders''', ja que &amp;quot;guarden el lloc&amp;quot; perquè qualsevol valor substitueixi aquesta variable. D'altra banda, la variable '''color''' és una variable de '''tipus default''', ja que el seu valor sempre '''està definit per a totes les rutes'''.&lt;br /&gt;
Existeixen regles amb els arguments (paràmetres):&lt;br /&gt;
*Cada argument obligatori del controlador ha de tenir associat un paràmetre en la ruta&lt;br /&gt;
*No tots els paràmetres de la ruta han de ser arguments en el teu controlador&lt;br /&gt;
*és perfectament vàlid fer que l'argument sigui opcional.&lt;br /&gt;
&lt;br /&gt;
El següent exemple no llançarà una excepció:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function indexAction($firstName, $lastName, $color, $foo = 'bar')&lt;br /&gt;
{&lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==objecte Request com a argument del controlador==&lt;br /&gt;
Sol ser molt útil disposar en el controlador de l'objecte '''Request''' associat a la petició de l'usuari, especialment quan treballes amb formularis. Per fer que Symfony passi aquest objecte automàticament com a argument del controlador, utilitza el següent codi:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
 &lt;br /&gt;
public function updateAction(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    $form = $this-&amp;gt;createForm(...);&lt;br /&gt;
 &lt;br /&gt;
    $form-&amp;gt;handleRequest($request);&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Generador de controladors==&lt;br /&gt;
Si el que volem és generar un nou controlador a la nostra aplicació podem automatitzar el procés utilitzant la següent comanda:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php app/console generate:controller&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aquesta comanda et demanarà tota la informació necessaria per crear el controlador i els '''actions''' (mètodes) necessaris que podràs utilitzar en el fitxer de rutes. Tant si utilitzes la comanda com si no la utilitzes, sempre podràs canviar la classe generada com tu prefereixis.&lt;br /&gt;
= Encaminament =&lt;br /&gt;
Una ruta és una associació entre un patró d'URL i un controlador. Suposem per exemple que desitges associar URL de tipus ''/blog/el meu-post'' o ''/blog/tot-sobre-symfony'' amb un controlador que sigui capaç de buscar i mostrar l'article sol·licitat.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/routing.yml&lt;br /&gt;
blog_show:&lt;br /&gt;
    path:      /blog/{slug}&lt;br /&gt;
    defaults:  { _controller: AcmeBlogBundle:Blog:show }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Codi PHP del controlador associat a aquesta ruta:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/BlogBundle/Controller/BlogController.php&lt;br /&gt;
 &lt;br /&gt;
namespace Acme\BlogBundle\Controller;&lt;br /&gt;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;&lt;br /&gt;
 &lt;br /&gt;
class BlogController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function showAction($slug)&lt;br /&gt;
    {&lt;br /&gt;
        $blog = // usa la variable $slug para consultar la base de datos&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;render('AcmeBlogBundle:Blog:show.html.twig', array(&lt;br /&gt;
            'blog' =&amp;gt; $blog,&lt;br /&gt;
        ));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquest és l'objectiu del encaminador de Symfony2: associar la URL d'una petició a un controlador&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objectiu del sistema d'encaminament de Symfony2 és analitzar aquesta URL i determinar què controlador s'ha d'executar. El procés complet consta dels següents passos:&lt;br /&gt;
*La petició es processa en el controlador frontal de Symfony2 (per exemple, en l'arxiu''' app.php''').&lt;br /&gt;
*El nucli de Symfony2 (conegut com kernel) sol·licita al enrutador que examini la petició.&lt;br /&gt;
*El enrutador busca què patró de les rutes de l'aplicació coincideix amb la URL entrant i retorna informació sobre la ruta, incloent el controlador que s'ha d'executar.&lt;br /&gt;
*El nucli de Symfony2 executa el controlador, que en última instància, retorna un objecte '''Response'''.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:funcionament-routing.png]]&lt;br /&gt;
&lt;br /&gt;
== Prefix a les rutes ==&lt;br /&gt;
&lt;br /&gt;
Resulta habitual haver d'afegir un prefix a totes les rutes importades des d'un arxiu extern. Si vols per exemple que el patró de la ruta '''acme_hello''' sigui '''/admin/hello/{name}''' en comptes de''' /hello/{name}''', afegeix l'opció prefix en importar les rutes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/routing.yml&lt;br /&gt;
acme_hello:&lt;br /&gt;
    resource: &amp;quot;@AcmeHelloBundle/Resources/config/routing.yml&amp;quot;&lt;br /&gt;
    prefix:   /admin&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
El valor indicat en l'opció prefix (en aquest cas '''/admin''') s'afegeix per davant de tots els patrons de les rutes importades des de l'arxiu extern.&lt;br /&gt;
&lt;br /&gt;
= Sessions a Symfony2=&lt;br /&gt;
&lt;br /&gt;
Symfony2 inclou un objecte de sessió que permet emmagatzemar informació persistent sobre l'usuari, és a dir, informació que es guarda d'una petició a una altra. Per defecte Symfony2 emmagatzema la informació en una cookie usant les sessions natives de PHP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
 &lt;br /&gt;
public function indexAction(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    $session = $request-&amp;gt;getSession();&lt;br /&gt;
 &lt;br /&gt;
    // guarda un atributo para reutilizarlo durante una&lt;br /&gt;
    // petición posterior del usuario&lt;br /&gt;
    $session-&amp;gt;set('foo', 'bar');&lt;br /&gt;
 &lt;br /&gt;
    // obtener el valor de un atributo de la sesión&lt;br /&gt;
    $foo = $session-&amp;gt;get('foo');&lt;br /&gt;
 &lt;br /&gt;
    // utilizar un valor por defecto si el atributo no existe&lt;br /&gt;
    $filters = $session-&amp;gt;get('filters', array());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Plantilles TWIG=&lt;br /&gt;
Una plantilla és un arxiu de text que pot generar qualsevol altre format basat en text (HTML, XML, CSV, LaTeX, etc.). Les plantilles PHP són les més populars, com la qual mostra el següent exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
    &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;¡Bienvenido a Symfony!&amp;lt;/title&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;&amp;lt;?php echo $page_title ?&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;ul id=&amp;quot;navigation&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;?php foreach ($navigation as $item): ?&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;&amp;lt;?php echo $item-&amp;gt;getHref() ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;?php echo $item-&amp;gt;getCaption() ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/a&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Symfony2 inclou un llenguatge de plantilles anomenat '''Twig''' que és molt més potent i elegant que PHP. Gràcies a Twig pots crear plantilles molt concises i fàcils de llegir, per la qual cosa a més són fàcils d'entendre per part dels dissenyadors web. Observa el mateix exemple anterior definit com a plantilla Twig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
    &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;¡Bienvenido a Symfony!&amp;lt;/title&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;{{ page_title }}&amp;lt;/h1&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;ul id=&amp;quot;navigation&amp;quot;&amp;gt;&lt;br /&gt;
            {% for item in navigation %}&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;{{ item.href }}&amp;quot;&amp;gt;{{ item.caption }}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
            {% endfor %}&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Twig es basa en dues etiquetes especials:&lt;br /&gt;
&lt;br /&gt;
*'''{ { ... } }''': serveix per mostrar el contingut d'una variable o el resultat de realitzar alguna operació o processar alguna expressió. En PHP la construcció equivalent és ''echo'' o ''print''.&lt;br /&gt;
*'''{% ... %}''': serveix per definir la lògica de la plantilla, és a dir, la part de programació que controla com es mostren els continguts de la plantilla. Entre uns altres, aquesta etiqueta s'empra per a les instruccions ''if'' i per als bucles ''for''.&lt;br /&gt;
&lt;br /&gt;
==Herència de plantilles i layout==&lt;br /&gt;
Normalment les plantilles d'un mateix projecte comparteixen molts elements comuns, com per exemple la capçalera, el peu de pàgina, una barra lateral, etc. Symfony2 resol aquest problema de forma molt senzilla: una plantilla pot decorar el contingut d'una altra plantilla.&lt;br /&gt;
&lt;br /&gt;
La idea és exactament la mateixa que l'herència de classes PHP: l'herència de plantilles et permet crear una plantilla basi cridada layout i que conté tots els elements comuns del lloc definits com a blocs. Després, les plantilles filla hereten del layout i emplenen o modifiquen aquests blocs.&lt;br /&gt;
&lt;br /&gt;
En primer lloc, crea un arxiu amb el teu disseny base:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# app/Resources/views/base.html.twig #}&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
    &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=utf-8&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;{% block title %}Test Application{% endblock %}&amp;lt;/title&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;sidebar&amp;quot;&amp;gt;&lt;br /&gt;
            {% block sidebar %}&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/blog&amp;quot;&amp;gt;Blog&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
            {% endblock %}&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;div id=&amp;quot;contenido&amp;quot;&amp;gt;&lt;br /&gt;
            {% block body %}{% endblock %}&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Aquesta plantilla defineix l'esquelet d'una pàgina HTML simple de dues columnes. En aquest exemple, '''es defineixen tres blocs amb l'etiqueta {% block %} (title, sidebar i body)'''. Les '''plantilles filla''' poden '''modificar''' els continguts de cadascun dels '''blocs'' o deixar-los tal com estan en la plantilla base.&lt;br /&gt;
&lt;br /&gt;
El següent exemple mostra l'aspecte d'una plantilla filla:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/BlogBundle/Resources/views/Blog/index.html.twig #}&lt;br /&gt;
{% extends '::base.html.twig' %}&lt;br /&gt;
 &lt;br /&gt;
{% block title %}My cool blog posts{% endblock %}&lt;br /&gt;
 &lt;br /&gt;
{% block body %}&lt;br /&gt;
    {% for entry in blog_entries %}&lt;br /&gt;
        &amp;lt;h2&amp;gt;{{ entry.title }}&amp;lt;/h2&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;{{ entry.body }}&amp;lt;/p&amp;gt;&lt;br /&gt;
    {% endfor %}&lt;br /&gt;
{% endblock %}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La clau de l'herència de plantilles és l'etiqueta '''{% extends %}'''. D'aquesta forma el motor de plantilles sap que primer ha de processar la plantilla base, que defineix el disseny de la pàgina i crea diversos blocs de continguts. Després es renderitza la plantilla filla, que reemplaça el contingut dels blocs '''title''' i '''body''' del pare.&lt;br /&gt;
&lt;br /&gt;
Quan treballis amb l'herència de plantilles, tingues en compte:&lt;br /&gt;
*Si inclous l'etiqueta '''{% extends %}''' en una plantilla, aquesta ha de ser la primera etiqueta d'aquesta plantilla.&lt;br /&gt;
*Quantes més etiquetes '''{% block %}''' tinguis en la teva plantilla basi, millor. Recorda que les plantilles filla no tenen l'obligació d'emplenar tots els blocs dels pares, per la qual cosa pots definir tants blocs com vulguis i assignar a cadascun un valor per defecte que sigui lògic per a la major part de les pàgines del lloc. Quants més blocs defineixi el layout, més flexible serà el seu disseny.&lt;br /&gt;
*Si còpies i pegues algun contingut en diverses plantilles, segurament serà millor que moguis aquest contingut a algun bloc del layout. En altres casos el millor és col·locar aquest contingut en alguna altra plantilla i incloure-la amb l'etiqueta '''include''' sempre que sigui necessari.&lt;br /&gt;
*Si vols obtenir el contingut d'algun bloc de la plantilla pare, utilitza la funció''' { { parent() } }'''. Això és molt útil quan vols afegir continguts propis a qualsevol altre contingut que el pare pugui haver definit per a aquest bloc:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{% block sidebar %}&lt;br /&gt;
    &amp;lt;h3&amp;gt;Table of Contents&amp;lt;/h3&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    {# ... #}&lt;br /&gt;
 &lt;br /&gt;
    {{ parent() }}&lt;br /&gt;
{% endblock %}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Localització de les plantilles==&lt;br /&gt;
Les plantilles es troben en dos llocs diferents:&lt;br /&gt;
&lt;br /&gt;
*'''app/Resources/views/''': el directori on s'emmagatzemen les plantilles globals de l'aplicació, com per exemple la plantilla del layout i les plantilles utilitzades per redefinir les plantilles incloses en els bundles de Symfony2.&lt;br /&gt;
*'''ruta/fins a/el/bundle/Resources/views/''': els bundles emmagatzemen les seves pròpies plantilles en el directori '''Resources/views/''' de cada bundle. La immensa majoria de les plantilles s'emmagatzemen dins d'algun bundle.&lt;br /&gt;
Symfony2 identifica a cada plantilla amb la sintaxi especial '''bundle:controlador:plantilla'''. Això permet definir diferents tipus de plantilla, cadascuna emmagatzemada en un lloc diferent:&lt;br /&gt;
&lt;br /&gt;
'''AcmeBlogBundle:Blog:index.html.twig''': indica la plantilla d'una pàgina específica. Est és el significat de cadascuna de les tres parts de la cadena:&lt;br /&gt;
*'''AcmeBlogBundle''': (bundle) la plantilla es troba dins del bundle '''AcmeBlogBundle''' (per exemple, ''src/Acme/BlogBundle'').&lt;br /&gt;
*'''Blog''': (controlador) indica que la plantilla s'emmagatzema en el subdirectori Blog de '''Resources/views'''.&lt;br /&gt;
*'''index.html.twig''': (plantilla) el nom de l'arxiu que guarda la plantilla és '''index.html.twig'''. Suposant que '''AcmeBlogBundle''' es trobi en '''src/Acme/BlogBundle''', la ruta completa de la plantilla seria '''src/Acme/BlogBundle/Resources/views/Blog/index.html.twig'''.&lt;br /&gt;
&lt;br /&gt;
*'''AcmeBlogBundle::layout.html.twig''': indica que és una plantilla global del bundle indicat. Com a falta la part central que es refereix al controlador, aquesta plantilla '''no es troba''' dins de cap subdirectori de '''Resources/views/'''. En altres paraules, '''la ruta '''completa de la plantilla és '''Resources/views/layout.html.twig''' dins del bundle AcmeBlogBundle.&lt;br /&gt;
*'''::base.html.twig''': indica que és una plantilla global de l'aplicació. Observa que la cadena comença amb dos parells de dos punts '''(::)''', per la qual cosa falta la part del bundle i la del controlador. En altres paraules, aquesta plantilla no es troba en cap bundle sinó directament dins de '''app/Resources/views/'''.&lt;br /&gt;
&lt;br /&gt;
== Etiquetes Twig==&lt;br /&gt;
===Incloent unes altres plantilles===&lt;br /&gt;
Resulta habitual voler incloure la mateixa plantilla o fragment de codi a diverses pàgines diferents. Si l'aplicació té per exemple un llistat d'articles, el codi de la plantilla que mostra un article es pot utilitzar a la pàgina de detall de l'article, en una pàgina que mostra els articles més populars, o en una llista dels articles més recents.&lt;br /&gt;
&lt;br /&gt;
En PHP, quan necessites reutilitzar un tros de codi, normalment mous el codi a una nova classe o funció. En les plantilles s'aplica la mateixa idea:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/ArticleBundle/Resources/views/Article/articleDetails.html.twig #}&lt;br /&gt;
&amp;lt;h2&amp;gt;{{ article.title }}&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;h3 class=&amp;quot;byline&amp;quot;&amp;gt;by {{ article.authorName }}&amp;lt;/h3&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
    {{ article.body }}&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ara ja pots incloure fàcilment aquesta plantilla en qualsevol una altra:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/ArticleBundle/Resources/views/Article/list.html.twig #}&lt;br /&gt;
{% extends 'AcmeArticleBundle::layout.html.twig' %}&lt;br /&gt;
 &lt;br /&gt;
{% block body %}&lt;br /&gt;
    &amp;lt;h1&amp;gt;Recent Articles&amp;lt;h1&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    {% for article in articles %}&lt;br /&gt;
        {{ include(&lt;br /&gt;
            'AcmeArticleBundle:Article:articleDetails.html.twig',&lt;br /&gt;
            {'article': article}&lt;br /&gt;
        ) }}&lt;br /&gt;
    {% endfor %}&lt;br /&gt;
{% endblock %}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Renderitzant plantilles enviant-li dades des de el controlador==&lt;br /&gt;
Imagina que en el teu lloc web tens una barra lateral que mostra els tres articles més recents. Per obtenir aquests tres articles és necessari realitzar una consulta a la base de dades o alguna altra operació similar que no es pot incloure en la pròpia plantilla.&lt;br /&gt;
&lt;br /&gt;
La solució consisteix a inserir en la plantilla el resultat retornat per un controlador de l'aplicació. En primer lloc, crea un controlador que renderitzi el llistat dels articles recents:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/ArticleBundle/Controller/ArticleController.php&lt;br /&gt;
class ArticleController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function recentArticlesAction($max = 3)&lt;br /&gt;
    {&lt;br /&gt;
        // hace una llamada a la base de datos u otra lógica&lt;br /&gt;
        // para obtener los &amp;quot;$max&amp;quot; artículos más recientes&lt;br /&gt;
        $articles = ...;&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;render(&lt;br /&gt;
            'AcmeArticleBundle:Article:recentList.html.twig',&lt;br /&gt;
            array('articles' =&amp;gt; $articles)&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
i a la plantilla es pot utilitzar les dades del array enviat des del controlador directament:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/ArticleBundle/Resources/views/Article/recentList.html.twig #}&lt;br /&gt;
{% for article in articles %}&lt;br /&gt;
    &amp;lt;a href=&amp;quot;/article/{{ article.slug }}&amp;quot;&amp;gt;&lt;br /&gt;
        {{ article.title }}&lt;br /&gt;
        &amp;lt;/a&amp;gt;&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per mostrar en qualsevol plantilla el resultat d'executar un controlador, utilitza la funció render i identifica al controlador utilitzant la notació especial '''bundle:controlador:acció''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# app/Resources/views/base.html.twig #}&lt;br /&gt;
 &lt;br /&gt;
{# ... #}&lt;br /&gt;
&amp;lt;div id=&amp;quot;sidebar&amp;quot;&amp;gt;&lt;br /&gt;
    {{ render(controller('AcmeArticleBundle:Article:recentArticles', {&lt;br /&gt;
        'max': 3&lt;br /&gt;
    })) }}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Enllaçant pàgines==&lt;br /&gt;
Crear enllaços a altres pàgines de l'aplicació és una de les tasques més comunes d'una plantilla. En lloc de generar a mà les URL dins de la plantilla, utilitza la funció path de Twig (o el helper router en PHP) per generar les URL utilitzant la configuració del sistema de encaminament. D'aquesta manera, si més endavant vols canviar l'aspecte de qualsevol URL, només has d'actualitzar un arxiu de configuració i totes les URL de les plantilles s'actualitzaran instantàniament.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;{{ path('_welcome') }}&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
On '''_welcome''' està definit al fitxer de routes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
_welcome:&lt;br /&gt;
    path:     /&lt;br /&gt;
    defaults: { _controller: AcmeDemoBundle:Welcome:index }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Enllaçant arxius web (css, javascript)==&lt;br /&gt;
Les plantilles de les aplicacions web solen enllaçar amb els web '''assets'' o arxius web, tals com a imatges, fulles d'estil CSS, arxius Javascript, etc.&lt;br /&gt;
&lt;br /&gt;
A la versió 2.8 ja no s'instal·la '''assetic''' per defecte i s'ha d'instal·lar utilitzant aquesta guia: &lt;br /&gt;
http://symfony.com/doc/current/cookbook/assetic/asset_management.html&lt;br /&gt;
&lt;br /&gt;
'''Quan passem a producció hem d'executar:'''&lt;br /&gt;
 sudo php app/console assetic:dump --env=prod --no-debug&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 De nou no és aconsellable generar a mà les URL d'aquest tipus d'arxius, ja que Symfony2 ofereix una solució millor i molt més flexible mitjançant la funció '''asset''' de Twig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ asset('images/logo.png') }}&amp;quot; alt=&amp;quot;Symfony!&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;link href=&amp;quot;{{ asset('css/blog.css') }}&amp;quot; rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La gestió dels arxius CSS i dels arxius Javascript es realitza mitjançant la herència de plantilles. A la plantilla para es pot incloure els arxius que s'utilitzarà a tota la aplicació i després, a les plantilles filles, es poden incloure fitxers específics per aquella part de la web:&lt;br /&gt;
Plantilla pare:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# app/Resources/views/base.html.twig #}&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
    {# ... #}&lt;br /&gt;
 &lt;br /&gt;
    {% block stylesheets %}&lt;br /&gt;
        &amp;lt;link href=&amp;quot;{{ asset('css/main.css') }}&amp;quot; type=&amp;quot;text/css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; /&amp;gt;&lt;br /&gt;
    {% endblock %}&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
    {# ... #}&lt;br /&gt;
 &lt;br /&gt;
    {% block javascripts %}&lt;br /&gt;
        &amp;lt;script src=&amp;quot;{{ asset('js/main.js') }}&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    {% endblock %}&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
i les plantilles filles redefineixen els blocs tot utilitzant la configuració que hi ha en la plantilla pare:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/DemoBundle/Resources/views/Contact/contact.html.twig #}&lt;br /&gt;
{% extends '::base.html.twig' %}&lt;br /&gt;
 &lt;br /&gt;
{% block stylesheets %}&lt;br /&gt;
    {{ parent() }}&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;link href=&amp;quot;{{ asset('css/contact.css') }}&amp;quot; type=&amp;quot;text/css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; /&amp;gt;&lt;br /&gt;
{% endblock %}&lt;br /&gt;
 &lt;br /&gt;
{# ... #}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les plantilles també poden enllaçar arxius que es trobin en el directori Resources/public de qualsevol bundle. Per fer que aquests arxius estiguin disponibles en l'aplicació, executa la comanda:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php app/console assets:install directorio [--symlink]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Si al utilitzar ''assets'' en producció no funciona:===&lt;br /&gt;
http://symfony.com/doc/current/cookbook/assetic/asset_management.html#cookbook-assetic-dumping&lt;br /&gt;
&lt;br /&gt;
== Variables globals que es poden utilitzar directament a les plantilles ==&lt;br /&gt;
*'''app.security''' - el context de seguretat.&lt;br /&gt;
*'''app.user''' - l'objecte qeu representa a l'usuari que està visitant l'aplicació.&lt;br /&gt;
*'''app.request''' - l'objecte Request que conté tota la informació de la petició.&lt;br /&gt;
*'''app.session''' - l'objecte Session relacionat amb l'usuari.&lt;br /&gt;
*'''app.environment''' - l'entorn en el qual s'està executant l'aplicació (dev, prod, etc.)&lt;br /&gt;
*'''app.debug''' - val true si l'aplicació s'està executant en la manera de depuració i false en un altre cas.&lt;br /&gt;
=Formularis=&lt;br /&gt;
Guia Symfony per crear i utilitzar formularis:&lt;br /&gt;
http://symfony.com/doc/2.8/book/forms.html&lt;br /&gt;
&lt;br /&gt;
Symfony incorpora unes llibreries que permeten utilitzar els formularis associant-los amb clases PHP. Exemple:&lt;br /&gt;
Classe Tasca:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/TaskBundle/Entity/Task.php&lt;br /&gt;
namespace Acme\TaskBundle\Entity;&lt;br /&gt;
 &lt;br /&gt;
class Task&lt;br /&gt;
{&lt;br /&gt;
    // descripción de la tarea&lt;br /&gt;
    protected $task;&lt;br /&gt;
 &lt;br /&gt;
    // fecha en la que debe estar completada&lt;br /&gt;
    protected $dueDate;&lt;br /&gt;
 &lt;br /&gt;
    public function getTask()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;task;&lt;br /&gt;
    }&lt;br /&gt;
    public function setTask($task)&lt;br /&gt;
    {&lt;br /&gt;
        $this-&amp;gt;task = $task;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public function getDueDate()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;dueDate;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public function setDueDate(\DateTime $dueDate = null)&lt;br /&gt;
    {&lt;br /&gt;
        $this-&amp;gt;dueDate = $dueDate;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per crear el formulari on demanem totes, o algunes, de les dades que necessitem per crear la tasca anterior fariem el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/TaskBundle/Controller/DefaultController.php&lt;br /&gt;
namespace Acme\TaskBundle\Controller;&lt;br /&gt;
 &lt;br /&gt;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;&lt;br /&gt;
use Acme\TaskBundle\Entity\Task;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
 &lt;br /&gt;
class DefaultController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function newAction(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        // crea una task y le asigna algunos datos ficticios para este ejemplo&lt;br /&gt;
        $task = new Task();&lt;br /&gt;
        $task-&amp;gt;setTask('Write a blog post');&lt;br /&gt;
        $task-&amp;gt;setDueDate(new \DateTime('tomorrow'));&lt;br /&gt;
 &lt;br /&gt;
        $form = $this-&amp;gt;createFormBuilder($task)&lt;br /&gt;
            -&amp;gt;add('task', 'text')&lt;br /&gt;
            -&amp;gt;add('dueDate', 'date')&lt;br /&gt;
            -&amp;gt;add('save', 'submit')&lt;br /&gt;
            -&amp;gt;getForm();&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;render('AcmeTaskBundle:Default:new.html.twig', array(&lt;br /&gt;
            'formulari' =&amp;gt; $form-&amp;gt;createView(),&lt;br /&gt;
        ));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilitzant el formulari en una plantilla TWIG:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #}&lt;br /&gt;
 &lt;br /&gt;
{{ form(formulari) }}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Processant l'enviament del formulari==&lt;br /&gt;
Exemple del controlador que envia i reb les dades d'un formulari:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function newAction(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    // crear un objeto $task nuevo (borra los datos de prueba)&lt;br /&gt;
    $task = new Task();&lt;br /&gt;
 &lt;br /&gt;
    $form =  $this-&amp;gt;createFormBuilder($task)&lt;br /&gt;
    -&amp;gt;setAction($this-&amp;gt;generateUrl('target_route'))&lt;br /&gt;
    -&amp;gt;setMethod('GET')&lt;br /&gt;
    -&amp;gt;add('task', 'text')&lt;br /&gt;
    -&amp;gt;add('dueDate', 'date')&lt;br /&gt;
    -&amp;gt;add('save', 'submit')&lt;br /&gt;
    -&amp;gt;getForm();&lt;br /&gt;
 &lt;br /&gt;
    $form-&amp;gt;handleRequest($request);&lt;br /&gt;
 &lt;br /&gt;
    if ($form-&amp;gt;isValid()) {&lt;br /&gt;
        // guardar la tarea en la base de datos&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;redirect($this-&amp;gt;generateUrl('task_success'));&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Quan es carrega per primera vegada la pàgina associada a aquest controlador, es crea i renderiza el formulari. El mètode '''handleRequest() ''' detecta que el formulari no s'ha enviat i per tant, no fa gens.El mètode '''isValid()''' retorna false si el formulari no s'ha enviat.&lt;br /&gt;
*Quan l'usuari envia el formulari, el mètode '''handleRequest()''' ho detecta i guarda immediatament les dades enviades en les propietats '''task i dueDate''' de l'objecte''' $task.''' Després es valida aquest objecte. Si no és vàlid, el mètode '''isValid()''' retorna '''false''' una altra vegada, per la qual cosa es torna a mostrar el formulari, aquesta vegada amb els missatges d'error corresponents. Si solament vols comprovar si el formulari s'ha enviat, independentment de si és vàlid o no, utilitza el mètode '''isSubmitted()'''.&lt;br /&gt;
*Quan l'usuari envia el formulari amb dades vàlides, les dades enviades es guarden de nou en el formulari, però aquesta vegada el mètode '''isValid()''' retorna '''true'''. En aquest moment ja pots treballar amb l'objecte '''$task''' (per exemple guardant-ho en una base de dades) abans de redirigir a l'usuari a una altra pàgina (per exemple a la pàgina d'agraïment o a la qual mostra un missatge determinat).&lt;br /&gt;
&lt;br /&gt;
=Seguretat=&lt;br /&gt;
És un procés de dues etapes que el seu objectiu és evitar que un usuari accedeixi a un recurs pel qual no hauria de tenir accés.&lt;br /&gt;
&lt;br /&gt;
En el primer pas del procés, el sistema de seguretat identifica qui és l'usuari obligant-ho a enviar algun tipus d'identificació. Això es diu autenticació, i significa que el sistema està tractant d'esbrinar qui ets.&lt;br /&gt;
&lt;br /&gt;
Una vegada que el sistema sap qui ets, el següent pas és decidir si hauries de tenir accés a un determinat recurs. Aquesta part del procés es diu autorització, i significa que el sistema està comprovant si tens suficients privilegis per realitzar una determinada acció.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:seguretat-symfony.png]]&lt;br /&gt;
&lt;br /&gt;
==Firewalls (autenticació)==&lt;br /&gt;
&lt;br /&gt;
El sistema de seguretat de Symfony s'activa quan un usuari fa una petició a una URL que està protegida per un '''firewall''' o tallafocs. El treball del firewall ''consisteix a determinar si l'usuari necessita estar autenticat'', i si ho necessita, enviar una resposta a l'usuari per iniciar el procés d'autenticació.&lt;br /&gt;
&lt;br /&gt;
Un ''firewall s'activa quan la URL d'una petició entrant concorda amb el valor de la seva opció de configuració '''pattern'''''. En aquest exemple el valor de pattern''' (^/)''' concorda amb qualsevol petició entrant. No obstant això, el fet que el firewall estigui activat no significa que el navegador mostra la caixa de login+contrasenya per a totes les URL. Els usuaris poden accedir per exemple a /foo sense que l'aplicació els demani que s'autentiquin.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:firewall-symfony.png]]&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/security.yml&lt;br /&gt;
security:&lt;br /&gt;
    firewalls:&lt;br /&gt;
        secured_area:&lt;br /&gt;
            pattern:    ^/&lt;br /&gt;
            anonymous: ~&lt;br /&gt;
            http_basic:&lt;br /&gt;
                realm: &amp;quot;Secured Demo Area&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    access_control:&lt;br /&gt;
        - { path: ^/admin, roles: ROLE_ADMIN }&lt;br /&gt;
        # Descomenta la siguiente línea para proteger también&lt;br /&gt;
        # la propia URL /admin&lt;br /&gt;
        # - { path: ^/admin$, roles: ROLE_ADMIN }&lt;br /&gt;
&lt;br /&gt;
    providers:&lt;br /&gt;
        in_memory:&lt;br /&gt;
            memory:&lt;br /&gt;
                users:&lt;br /&gt;
                    ryan:  { password: ryanpass, roles: 'ROLE_USER' }&lt;br /&gt;
                    admin: { password: kitten, roles: 'ROLE_ADMIN' }&lt;br /&gt;
&lt;br /&gt;
    encoders:&lt;br /&gt;
        Symfony\Component\Security\Core\User\User: plaintext&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquest funcionament és possible en primer lloc perquè el firewall permet l'accés als usuaris anònims a causa de l'opció de configuració anonymous. En altres paraules, el firewall no exigeix que tots els usuaris s'autentiquin res més accedir a l'aplicació. I com en la configuració de la secció access_control no s'indica que els usuaris hagin de tenir cap role especial per accedir a /foo la petició es processa sense requerir a l'usuari que s'autentiqui.&lt;br /&gt;
&lt;br /&gt;
Si elimines l'opció anonymous, l'efecte és que ara el firewall demana autenticació a qualsevol recurs.&lt;br /&gt;
&lt;br /&gt;
Seguint amb el mateix exemple, si un usuari sol·licita '''/admin/foo''', l'aplicació es comporta de manera diferent. Això és a causa de la configuració de la secció '''access_control''', que indica que qualsevol URL que coincideixi amb l'expressió regular '''^/admin''' (és a dir, la URL '''/admin''' o qualsevol altra URL que coincideixi amb /admin/) requereix el rol''' ROLE_ADMIN'''. Els rols són la clau del sistema d'autorització: l'usuari pot accedir a '''/admin/foo''' només si compta amb el rol'''ROLE_ADMIN'''.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:access-symfony.png ]]&lt;br /&gt;
&lt;br /&gt;
La capa de control d'accés denega l'accés a l'usuari (perquè els usuaris anònims no compten amb el rol ROLE_ADMIN), el firewall pren el control de l'aplicació i inicia el procés d'autenticació.&lt;br /&gt;
&lt;br /&gt;
==Utilitzant el típic formulari de accés==&lt;br /&gt;
En primer lloc, afegeix l'opció form_login en la configuració del firewall:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/security.yml&lt;br /&gt;
security:&lt;br /&gt;
    firewalls:&lt;br /&gt;
        secured_area:&lt;br /&gt;
            pattern:    ^/&lt;br /&gt;
            anonymous:  ~&lt;br /&gt;
            form_login:&lt;br /&gt;
                login_path:  login&lt;br /&gt;
                check_path:  login_check&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El sistema de seguretat inicia el procés d'autenticació, es redirigeix a l'usuari a la ruta que mostra el formulari d'accés (per defecte '''/login'''). El'' formulari has de crear-ho tu mateix a mà, ja que Symfony no ho proporciona''. Primer crea les dues noves rutes utilitzades en la configuració de la seguretat: la ruta '''login''' mostra el formulari (es correspon amb la URL''' /login''') i '''login_check''' que processa l'enviament del formulari (es correspon amb la URL '''/login_check)''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/routing.yml&lt;br /&gt;
login:&lt;br /&gt;
    pattern:   /login&lt;br /&gt;
    defaults:  { _controller: AcmeSecurityBundle:Security:login }&lt;br /&gt;
login_check:&lt;br /&gt;
    pattern:   /login_check&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observa que el nom de la ruta '''login''' coincideix amb el valor de l'opció '''login_path''', ja que és on el sistema de seguretat redirigeix als usuaris que necessiten autenticar-se.&lt;br /&gt;
&lt;br /&gt;
A continuació, crea el controlador que mostra el formulari de accés:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/SecurityBundle/Controller/SecurityController.php;&lt;br /&gt;
namespace Acme\SecurityBundle\Controller;&lt;br /&gt;
 &lt;br /&gt;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
use Symfony\Component\Security\Core\SecurityContext;&lt;br /&gt;
 &lt;br /&gt;
class SecurityController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function loginAction(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $session = $request-&amp;gt;getSession();&lt;br /&gt;
 &lt;br /&gt;
        // get the login error if there is one&lt;br /&gt;
        if ($request-&amp;gt;attributes-&amp;gt;has(SecurityContext::AUTHENTICATION_ERROR)) {&lt;br /&gt;
            $error = $request-&amp;gt;attributes-&amp;gt;get(&lt;br /&gt;
                SecurityContext::AUTHENTICATION_ERROR&lt;br /&gt;
            );&lt;br /&gt;
        } else {&lt;br /&gt;
            $error = $session-&amp;gt;get(SecurityContext::AUTHENTICATION_ERROR);&lt;br /&gt;
            $session-&amp;gt;remove(SecurityContext::AUTHENTICATION_ERROR);&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;render(&lt;br /&gt;
            'AcmeSecurityBundle:Security:login.html.twig',&lt;br /&gt;
            array(&lt;br /&gt;
                // last username entered by the user&lt;br /&gt;
                'last_username' =&amp;gt; $session-&amp;gt;get(SecurityContext::LAST_USERNAME),&lt;br /&gt;
                'error'         =&amp;gt; $error,&lt;br /&gt;
            )&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si l'usuari envia un nom d'usuari o contrasenya no vàlids, aquest controlador obté el missatge d'error del sistema de seguretat i ho mostra a l'usuari.&lt;br /&gt;
Tu t'encarregues de mostrar el formulari a l'usuari i els errors que puguin haver ocorregut, però ''el propi sistema de seguretat s'encarrega de verificar el nom d'usuari i contrasenya i l'autenticació de l'usuari''.&lt;br /&gt;
Plantilla del formulari:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/SecurityBundle/Resources/views/Security/login.html.twig #}&lt;br /&gt;
{% if error %}&lt;br /&gt;
    &amp;lt;div&amp;gt;{{ error.message }}&amp;lt;/div&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ path('login_check') }}&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;label for=&amp;quot;username&amp;quot;&amp;gt;Username:&amp;lt;/label&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;username&amp;quot; name=&amp;quot;_username&amp;quot; value=&amp;quot;{{ last_username }}&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;label for=&amp;quot;password&amp;quot;&amp;gt;Password:&amp;lt;/label&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;password&amp;quot; id=&amp;quot;password&amp;quot; name=&amp;quot;_password&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    {#&lt;br /&gt;
        añade lo siguiente si quieres redirigir al usuario a una&lt;br /&gt;
        URL concreta después del login (explicado más adelante)&lt;br /&gt;
        &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;_target_path&amp;quot; value=&amp;quot;/account&amp;quot; /&amp;gt;&lt;br /&gt;
    #}&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;login&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=Webgrafia=&lt;br /&gt;
Els llibres sobre symfony utilitzats per elaborar un resum de les funcionalitats més importants els podeu trobar a : [http://librosweb.es/libros/ http://librosweb.es/libros/]&lt;br /&gt;
&lt;br /&gt;
També s'ha utilitzat el llibre oficial que podeu trobar a la web:[http://symfony.com/doc/current/book/index.html http://symfony.com/]&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_PHP_(15h)&amp;diff=7133</id>
		<title>NF2 - Framework PHP (15h)</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_PHP_(15h)&amp;diff=7133"/>
				<updated>2016-05-20T09:46:51Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* Enllaçant arxius web (css, javascript) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introducció a Symfony=&lt;br /&gt;
&amp;lt;div width=&amp;quot;100%&amp;quot; style=&amp;quot;clear:both; &amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:30%;&amp;quot;&amp;gt;&lt;br /&gt;
[[fitxer:symfony.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:70%;&amp;quot;&amp;gt;&lt;br /&gt;
Un framework simplifica el desenvolupament de les aplicacions, ja que automatitza molts dels patrons utilitzats per resoldre les tasques comunes. A més, un framework proporciona estructura al codi font, forçant al desenvolupador a crear codi més llegible i més fàcil de mantenir. Finalment, un framework facilita la programació d'aplicacions, ja que encapsula operacions complexes en instruccions senzilles.&lt;br /&gt;
&lt;br /&gt;
Symfony és un complet framework dissenyat per optimitzar, gràcies a les seves característiques, el desenvolupament de les aplicacions web. Per començar, separa la lògica de negoci, la lògica de servidor i la presentació de l'aplicació web. Proporciona diverses eines i classes encaminades a reduir el temps de desenvolupament d'una aplicació web complexa. A més, automatitza les tasques més comunes, permetent al desenvolupador dedicar-se per complet als aspectes específics de cada aplicació. El resultat de tots aquests avantatges és que no s'ha de reinventar la roda cada vegada que es crea una nova aplicació web.&lt;br /&gt;
&lt;br /&gt;
Symfony està desenvolupat completament amb PHP i ha estat provat amb èxit en llocs com Yahoo! Answers, delicious, DailyMotion i molts altres llocs web de primer nivell. Symfony és compatible amb la majoria de gestors de bases de dades, com MySQL, PostgreSQL, Oracle i SQL Server de Microsoft. Es pot executar tant en plataformes Unix (Unix, Linux, etc.) com en plataformes Windows. A continuació es mostren algunes de les seves característiques.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt; &lt;br /&gt;
=Característiques=&lt;br /&gt;
Symfony es va dissenyar perquè s'ajustés als següents requisits:&lt;br /&gt;
&lt;br /&gt;
*Fàcil d'instal·lar i configurar en la majoria de plataformes (i amb la garantia que funciona correctament en els sistemes Windows i *nix estàndards)&lt;br /&gt;
*Independent del sistema gestor de bases de dades&lt;br /&gt;
*Senzill d'usar en la majoria de casos, però prou flexible com per adaptar-se als casos més complexos&lt;br /&gt;
*Basat en la premissa de &amp;quot;convenir en comptes de configurar&amp;quot;, en la qual el desenvolupador solament ha de configurar allò que no és convencional&lt;br /&gt;
*Segueix la majoria de millors pràctiques i patrons de disseny per a la web&lt;br /&gt;
*Preparat per a aplicacions empresarials i adaptable a les polítiques i arquitectures pròpies de cada empresa, a més de ser prou estable com per desenvolupar aplicacions a llarg termini&lt;br /&gt;
*Codi fàcil de llegir que inclou comentaris de phpDocumentor i que permet un manteniment molt senzill&lt;br /&gt;
*Fàcil d'estendre, la qual cosa permet la seva integració amb llibreries desenvolupades per tercers&lt;br /&gt;
&lt;br /&gt;
Symfony pot ser completament personalitzat per complir amb els requisits de les empreses que disposen de les seves pròpies polítiques i regles per a la gestió de projectes i la programació d'aplicacions. Per defecte incorpora diversos entorns de desenvolupament diferents i inclou diverses eines que permeten automatitzar les tasques més comunes de l'enginyeria del programari:&lt;br /&gt;
&lt;br /&gt;
Les eines que generen automàticament codi han estat dissenyades per fer prototips d'aplicacions i per crear fàcilment la part de gestió de les aplicacions.&lt;br /&gt;
*El framework de desenvolupament de proves unitàries i funcionals proporciona les eines ideals per al desenvolupament basat en proves &amp;quot;test-driven development&amp;quot;).&lt;br /&gt;
*La barra de depuració web simplifica la depuració de les aplicacions, ja que mostra tota la informació que els programadors necessiten sobre la pàgina en la qual estan treballant.&lt;br /&gt;
*La interfície de línia de comandos automatitza la instal·lació de les aplicacions entre servidors.&lt;br /&gt;
*És possible realitzar canvis &amp;quot;en calent&amp;quot; de la configuració (sense necessitat de reiniciar el servidor).&lt;br /&gt;
*El complet sistema de log permet als administradors accedir fins a l'últim detall de les activitats que realitza l'aplicació.&lt;br /&gt;
&lt;br /&gt;
=Desenvolupament ràpid d'aplicacions (RAD)=&lt;br /&gt;
&lt;br /&gt;
Durant molt temps, la programació d'aplicacions web va ser un tasca tediosa i molt lenta. Seguint els cicles habituals de l'enginyeria del programari (com els proposats pel Procés Racional Unificat o Rational Unified Process) el desenvolupament d'una aplicació web no pot començar fins que s'han establert per escrit una sèrie de requisits, s'han creat els diagrames UML Unified Modeling Language) i s'ha produït abundant documentació sobre el projecte. Aquest model es veia afavorit per la baixa velocitat de desenvolupament, la falta de versatilitat dels llenguatges de programació (abans d'executar el programa s'ha de construir, compilar i reiniciar) i sobretot pel fet que els clients no estaven disposats a adaptar-se a altres metodologies.&lt;br /&gt;
&lt;br /&gt;
Avui dia, les empreses reaccionen més ràpidament i els clients canvien d'opinió constantment durant el desenvolupament dels projectes. D'aquesta manera, els equips de desenvolupament han d'adaptar-se a aquestes necessitats i han de poder canviar l'estructura d'una aplicació de forma ràpida. Afortunadament, l'ús de llenguatges de script com Python, Ruby i PHP permeten seguir altres estratègies de programació, com RAD (desenvolupament ràpid d'aplicacions) i el desenvolupament àgil de programari.&lt;br /&gt;
&lt;br /&gt;
Una de les idees centrals d'aquesta metodologia és que el desenvolupament comença al més aviat possible perquè el client pugui revisar un prototip que funciona i pugui indicar el camí a seguir. A partir d'aquí, l'aplicació es desenvolupa de forma iterativa, en la qual cada nova versió incorpora noves funcionalitats i es desenvolupa en un breu espai de temps.&lt;br /&gt;
&lt;br /&gt;
Les conseqüències d'aquestes metodologies per al desenvolupador són nombroses. El programador no ha de pensar sobre les versions futures en incloure una nova funcionalitat. Els mètodes utilitzats han de ser el més senzills i directes possibles. Aquestes idees es resumeixen en el principi denominat ''KISS'': Fes-ho senzill, idiota!''Keep It Simple, Stupid''&lt;br /&gt;
&lt;br /&gt;
Quan es modifiquen els requisits o quan s'afegeix una nova funcionalitat, normalment s'ha de reescriure part del codi existent. Aquest procés es diu refactorización i succeeix sovint durant el desenvolupament d'una aplicació web. El codi sol moure's a altres llocs en funció de la seva naturalesa. Els blocs de codi repetits es refactorizan en un únic lloc, aplicant el principi ''DRY'': No et repeteixis ''Don't Repeat Yourself''.&lt;br /&gt;
&lt;br /&gt;
Per assegurar que l'aplicació segueix funcionant correctament malgrat els canvis constants, es necessita una sèrie de proves unitàries que puguin ser automatitzades. Si estan ben escrites, les proves unitàries permeten assegurar que gens ha deixat de funcionar després d'haver-hi refactorizado part del codi de l'aplicació. Algunes metodologies de desenvolupament d'aplicacions obliguen a escriure les proves abans que el propi codi, la qual cosa es coneix com TDD: desenvolupament basat en proves ''test-driven development.''&lt;br /&gt;
&lt;br /&gt;
Symfony és l'eina ideal pel RAD. De fet, el framework ha estat desenvolupat per una empresa que aplica el RAD als seus propis projectes. Per aquest motiu, aprendre a utilitzar Symfony no és com aprendre un nou llenguatge de programació, sinó que consite a aprendre a prendre les decisions correctes per desenvolupar les aplicacions de forma més efectiva.&lt;br /&gt;
&lt;br /&gt;
=La implementació del MVC que realitza Symfony=&lt;br /&gt;
*La capa del Modelo&lt;br /&gt;
**Abstracció de la base de dades&lt;br /&gt;
**Accés a les dades&lt;br /&gt;
*La capa de la Vista &lt;br /&gt;
**Vista&lt;br /&gt;
**Plantilla&lt;br /&gt;
**Layout&lt;br /&gt;
*La capa del Controlador&lt;br /&gt;
**Controlador frontal&lt;br /&gt;
**Acció&lt;br /&gt;
&lt;br /&gt;
En total són set scripts, la qual cosa semblen molts arxius per obrir i modificar cada vegada que es crea una pàgina. Afortunadament, Symfony simplifica aquest procés. Symfony pren el millor de l'arquitectura MVC i la implementa de manera que el desenvolupament d'aplicacions sigui ràpid i senzill.&lt;br /&gt;
&lt;br /&gt;
En primer lloc, el controlador frontal i el layout són comuns per a totes les accions de l'aplicació. Es poden tenir diversos controladors i diversos layouts, però solament és obligatori tenir un de cada. El controlador frontal és un component que només té codi relatiu al MVC, per la qual cosa no és necessari crear un, ja que Symfony ho genera de forma automàtica.&lt;br /&gt;
&lt;br /&gt;
L'altra bona notícia és que les classes de la capa del model també es generen automàticament, en funció de l'estructura de dades de l'aplicació. El ORM s'encarrega de crear l'esquelet o estructura bàsica de les classes i genera automàticament tot el codi necessari. Quan el ORM troba restriccions de claus foranes (o externes) o quan troba dades de tipus data, crea mètodes especials per accedir i modificar aquestes dades, per la qual cosa la manipulació de dades es converteix en un joc de nens. L'abstracció de la base de dades és completament transparent per al programador, ja que es realitza de forma nativa mitjançant PDO PHP Data Objects). Així, si es canvia el sistema gestor de bases de dades a qualsevol moment, no s'ha de reescriure ni una línia de codi, ja que tan sols és necessari modificar un paràmetre en un arxiu de configuració.&lt;br /&gt;
&lt;br /&gt;
Finalment, la lògica de la vista es pot transformar en un arxiu de configuració senzill, sense necessitat de programar-la.&lt;br /&gt;
&lt;br /&gt;
[[fitxer:mvc-symfony.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Instal·lació de Symfony=&lt;br /&gt;
Utilitzarem la versió de symfony 2.4.&lt;br /&gt;
&lt;br /&gt;
[[Instal·lació de la versió 2.4 de symfony ]] (antic)&lt;br /&gt;
&lt;br /&gt;
[[Instal·lació de la versió LTS 2.8 de symfony ]]&lt;br /&gt;
&lt;br /&gt;
[http://symfony.com/doc/current/index.html Llibre gratuït de symfony2].&lt;br /&gt;
&lt;br /&gt;
Accedeix a la URL:&lt;br /&gt;
http://localhost/m7/web/app.php&lt;br /&gt;
&lt;br /&gt;
'''nota:''' m7 és, en aquest cas, el nomProjecteSymfony utilitzat en la creació del projecte symfony.&lt;br /&gt;
&lt;br /&gt;
Hauries de veure una pàgina com aquesta:&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:symfony2.8_inici.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
==Creació de la primera pàgina:==&lt;br /&gt;
Una vegada executis la línia següent anirà preguntant opcions. Tot per defecte. Al nom del bundle podeu posar: HolaMonBundle&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php app/console generate:bundle --namespace=m7/HolaMon --format=yml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Iniciar el servidor ==&lt;br /&gt;
Symfony pot ser instal·lat dintre d'un servidor apache2 però per entorns de desenvolupament porta un servidor web integrat. Per executar el servidor i poder provar les aplicacions podeu iniciar-lo amb la comanda de terminal:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php app/console server:run&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Si heu engegat el servidor integrat podeu provar la pàgina creada en el punt anterior utilitzant aquesta [http://localhost:8000/ url]&lt;br /&gt;
&lt;br /&gt;
Si teniu apache2 instal·lat, podeu provar la pàgina utilitzant aquesta [http://localhost/m7/web/app.php/ url_apache_m7]&lt;br /&gt;
== Si hi ha un error accedint a la pàgina!!==&lt;br /&gt;
Amb apache2, si en algun moment deixa de funcionar heu de provar de fer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo php app/console cache:clear --env=prod &amp;amp;&amp;amp; sudo php app/console cache:warmup --env=prod&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
i donar-li permisos (una altre vegada) a la carpeta principal (dintre de /var/www/html):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod 777 nomprojecte/ -R&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exercici [opcional]:===&lt;br /&gt;
Utilitzant el servidor web apache2 creeu un virtualhost per poder utilitzar symfony2 directament posant: http://localhost/&lt;br /&gt;
&lt;br /&gt;
=Estructura del projecte: Aplicacions, Mòduls i Accions=&lt;br /&gt;
Symfony considera un projecte com '''un conjunt de serveis i operacions disponibles sota un determinat nom de domini i que comparteixen el mateix model d'objectes'''.&lt;br /&gt;
&lt;br /&gt;
Dins d'un projecte, les operacions s'agrupen de forma lògica en aplicacions. Normalment, una aplicació s'executa de forma independent respecte d'altres aplicacions del mateix projecte. L'habitual és que un projecte contingui dues aplicacions: una per a la part pública i una altra per a la part de gestió, compartint ambdues la mateixa base de dades. També és possible definir projectes que estiguin formats per diversos llocs web petits, cadascun d'ells considerat com una aplicació. En aquest cas, és important tenir en compte que els enllaços entre aplicacions s'han d'indicar de forma absoluta.&lt;br /&gt;
&lt;br /&gt;
Cada aplicació està formada per un o més mòduls. Un mòdul normalment representa&lt;br /&gt;
*a una pàgina web o &lt;br /&gt;
*a un grup de pàgines amb un propòsit relacionat.&lt;br /&gt;
Per exemple, una aplicació podria tenir mòduls com home, articulos, ajuda, carritoCompra, compte, etc.&lt;br /&gt;
&lt;br /&gt;
Els mòduls emmagatzemen les accions, que representen cadascuna de les operacions que es pot realitzar en un mòdul. Per exemple el mòdul ''carretCompra'' pot definir accions com ''afegir'', mostrar i actualitzar. Normalment les accions es descriuen mitjançant verbs. Treballar amb accions és molt similar a treballar amb les pàgines d'una aplicació web tradicional, encara que en aquest cas dues accions diferents poden acabar mostrant la mateixa pàgina (com per exemple l'acció d'afegir un comentari a una entrada d'un blog, que acaba tornant a mostrar la pàgina de l'entrada amb el nou comentari).&lt;br /&gt;
=Estructura de l'arbre de arxius=&lt;br /&gt;
Normalment, tots els projectes web comparteixen el mateix tipus de continguts, com per exemple:&lt;br /&gt;
&lt;br /&gt;
Una base de dades, com MySQL o PostgreSQL&lt;br /&gt;
*Arxiu estàtics (HTML, imatges, arxius de Javascript, fulles d'estils, etc.)&lt;br /&gt;
*Arxius pujats al lloc web per part dels usuaris o els administradors&lt;br /&gt;
*Classes i llibreries PHP&lt;br /&gt;
*Llibreries externes (scripts desenvolupats per tercers)&lt;br /&gt;
*Arxius que s'executen per lots batch files) que normalment són scripts que s'executen via línia de comandos o mitjançant cron&lt;br /&gt;
*Arxius de log (les traces que generen les aplicacions i/o el servidor)&lt;br /&gt;
*Arxius de configuració&lt;br /&gt;
&lt;br /&gt;
Symfony proporciona una estructura en forma d'arbre d'arxius per organitzar de forma lògica tots aquests continguts, a més de ser consistent amb l'arquitectura MVC utilitzada i amb l'agrupació projecto / aplicació / mòdul. Cada vegada que es crea un nou projecte, aplicació o mòdul, es genera de forma automàtica la part corresponent d'aquesta estructura. A més, l'estructura es pot personalitzar completament, per reorganitzar els arxius i directoris o per complir amb les exigències d'organització d'un client.&lt;br /&gt;
&lt;br /&gt;
Encara que es pot canviar, per defecte totes les aplicacions Symfony tenen la mateixa estructura de directoris senzilla (i recomanada):&lt;br /&gt;
&lt;br /&gt;
*'''app/''': conté la configuració de l'aplicació.&lt;br /&gt;
*'''src/''': aquí es troba tot el codi PHP de l'aplicació.&lt;br /&gt;
*'''vendor/''': per convenció aquí es guarden totes les llibreries creades per tercers.&lt;br /&gt;
*'''web/''': est és el directori web arrel i conté tots els arxius que es poden accedir públicament.&lt;br /&gt;
==El directori web==&lt;br /&gt;
El directori web arrel és el lloc on es troben tots els arxius públics i estàtics tals com a imatges, fulles d'estil i arxius Javascript. També és el lloc on es defineixen tots els controladors frontals, com per exemple el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// web/app.php&lt;br /&gt;
require_once __DIR__.'/../app/bootstrap.php.cache';&lt;br /&gt;
require_once __DIR__.'/../app/AppKernel.php';&lt;br /&gt;
 &lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
 &lt;br /&gt;
$kernel = new AppKernel('prod', false);&lt;br /&gt;
$kernel-&amp;gt;loadClassCache();&lt;br /&gt;
$kernel-&amp;gt;handle(Request::createFromGlobals())-&amp;gt;send();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'arxiu del controlador frontal ('''app.php''' en aquest exemple) és l'arxiu PHP que realment s'executa quan utilitzes una aplicació Symfony2 i el seu treball consisteix a arrencar l'aplicació utilitzant una classe del nucli ('''AppKernel''').&lt;br /&gt;
&lt;br /&gt;
Tenir un controlador frontal significa que s'utilitzen URL diferents i més flexibles que les d'una aplicació PHP típica. Quan es disposa d'un controlador frontal, les URL es formaten de la següent manera:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://localhost/app.php/hello/Ryan&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
El controlador frontal, '''app.php''', s'executa i la URL interna: ''/hello/Ryan'' es dirigeix internament segons la configuració d'encaminament.&lt;br /&gt;
&lt;br /&gt;
Si a més utilitzes el mòdul '''mod_rewrite''' d'Apache, pots forçar l'execució de l'arxiu '''app.php''' sense necessitat d'incloure-ho en la URL, per la qual cosa així les URL són encara més netes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://localhost/hello/Ryan&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==El directori de l'aplicació (app)==&lt;br /&gt;
La classe '''AppKernel''' és el punt d'entrada principal de l'aplicació i és la responsable de tota la configuració. Com a tal, s'emmagatzema en el directori '''app/'''.&lt;br /&gt;
&lt;br /&gt;
Aquesta classe ha d'implementar dos mètodes que defineixen tot el que Symfony necessita saber sobre la teva aplicació. Ni tan sols has de preocupar-te d'aquests mètodes durant l'arrencada — Symfony els emplena per tu amb paràmetres predeterminats.&lt;br /&gt;
&lt;br /&gt;
*'''registerBundles()''': retorna un array amb tots els bundles necessaris per executar l'aplicació.&lt;br /&gt;
*'''registerContainerConfiguration()''': carrega l'arxiu de configuració de recursos de l'aplicació (consulta la secció Configurant l'aplicació).&lt;br /&gt;
Durant el desenvolupament d'una aplicació, normalment el directori '''app/''' solament els utilitzes per modificar la configuració i els arxius d'encaminament en el directori '''app/config/'''.&lt;br /&gt;
&lt;br /&gt;
Aquest directori també conté el directori '''caché''' de l'aplicació (app/cache), un directori de '''logs''' (app/logs) i un directori per a arxius de '''recursos globals''', tals com a plantilles (app/Resources).&lt;br /&gt;
&lt;br /&gt;
'''Carga automàtica'''&lt;br /&gt;
En arrencar Symfony, s'inclou un arxiu especial anomenat ''vendor/autoload.php''. Aquest arxiu, creat per ''Composer'', s'encarrega de configurar el carregador automàtic de classes, que al seu torn '''carrega automàticament tots els arxius''' de la teva aplicació que es trobin '''en el directori src/''' i '''totes les llibreries externes''' configurades en l'arxiu '''composer.json'''.&lt;br /&gt;
&lt;br /&gt;
Gràcies al carregador automàtic, '''mai hauràs de preocupar-te d'usar declaracions include o require'''. Això és possible perquè Composer utilitza namespace o espai de noms d'una classe per determinar la seva ubicació i així '''inclou automàticament l'arxiu en l'instant en què necessites una classe'''.&lt;br /&gt;
&lt;br /&gt;
El carregador automàtic '''ja està configurat per buscar qualsevol de les teves classes PHP en el directori src/'''. Perquè funcioni la càrrega automàtica, el nom de la classe i la ruta de l'arxiu '''han de seguir el mateix patró''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Nom de la classe: Acme\HelloBundle\Controller\HelloController&lt;br /&gt;
Ruta física de l'arxiu: src/Acme/HelloBundle/Controller/HelloController.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Configuració de l'aplicació ==&lt;br /&gt;
Segons el lloc web oficial de YAML (http://www.yaml.org/), YAML és &amp;quot;un estàndard per serializar dades en qualsevol llenguatge de programació i amb un format fàcil de llegir per part de les persones&amp;quot;. Dit d'una altra forma, YAML és un llenguatge molt senzill que permet descriure les dades com en XML, però amb una sintaxi molt més senzilla. YAML és un format especialment útil per descriure dades que poden ser transformats en arrays simples i associatius, com per exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$casa = array(&lt;br /&gt;
  'familia' =&amp;gt; array(&lt;br /&gt;
    'apellido'  =&amp;gt; 'García',&lt;br /&gt;
    'padres'  =&amp;gt; array('Antonio', 'María'),&lt;br /&gt;
    'hijos'   =&amp;gt; array('Jose', 'Manuel', 'Carmen')&lt;br /&gt;
  ),&lt;br /&gt;
  'direccion' =&amp;gt; array(&lt;br /&gt;
    'numero'        =&amp;gt; 34,&lt;br /&gt;
    'calle'         =&amp;gt; 'Gran Vía',&lt;br /&gt;
    'ciudad'        =&amp;gt; 'Cualquiera',&lt;br /&gt;
    'codigopostal'  =&amp;gt; '12345'&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//format yml:&lt;br /&gt;
casa:&lt;br /&gt;
  familia:&lt;br /&gt;
    apellido: García&lt;br /&gt;
    padres:&lt;br /&gt;
      - Antonio&lt;br /&gt;
      - María&lt;br /&gt;
    hijos:&lt;br /&gt;
      - Jose&lt;br /&gt;
      - Manuel&lt;br /&gt;
      - Carmen&lt;br /&gt;
  direccion:&lt;br /&gt;
    numero: 34&lt;br /&gt;
    calle: Gran Vía&lt;br /&gt;
    ciudad: Cualquiera&lt;br /&gt;
    codigopostal: &amp;quot;12345&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
YAML és l'acrònim de &amp;quot;YAML Ain't Markup Language&amp;quot; (&amp;quot;YAML No és un Llenguatge de Marcat&amp;quot;) i es pronuncia &amp;quot;yamel&amp;quot;. El format es porta utilitzant des de 2001 i existeixen utilitats per processar YAML en una gran varietat de llenguatges de programació.&lt;br /&gt;
&lt;br /&gt;
YAML és molt més ràpid d'escriure que XML (ja que no fan falta les etiquetes de tancament i l'ús continu de les cometes) i és molt més poderós que els tradicionals arxius .ini (ja que aquests últims no suporten l'herència i les estructures complexes). Per aquest motiu, Symfony utilitza el format YAML com el llenguatge preferit per emmagatzemar la seva configuració.&lt;br /&gt;
&lt;br /&gt;
Per saber més sobre aquest format pots consultar la [http://symfony.com/legacy/doc/reference/1_4/en/02-YAML següent] pàgina web.&lt;br /&gt;
==El directori font (src)==&lt;br /&gt;
El directori '''src/''' conté tot el codi real (codi PHP, plantilles, arxius de configuració, estils, etc.) que pertany a la teva aplicació. De fet, en programar una aplicació Symfony, la major part del teu treball es durà a terme dins d'un o més''' bundles '''creats en aquest directori.&lt;br /&gt;
&lt;br /&gt;
=Els Bundles=&lt;br /&gt;
[[Els bundles a symfony 2.]]&lt;br /&gt;
&lt;br /&gt;
=Entorn de desenvolupament i entorn de producció=&lt;br /&gt;
Una aplicació pot funcionar en diversos entorns. Els diferents entorns comparteixen el mateix codi PHP (solament és diferent el controlador frontal), però usen una configuració diferent. Per exemple, un entorn de desenvolupament '''dev''' guarda els advertiments i errors, mentre que un entorn de producció '''prod''' només registra els errors. Alguns arxius es tornen a generar en cada petició en l'entorn '''dev''' (para major comoditat dels desenvolupadors), però s'escorcollen en l'entorn '''prod'''. Tots els entorns es troben en la mateixa màquina i executen la mateixa aplicació.&lt;br /&gt;
&lt;br /&gt;
Un projecte Symfony2 '''normalment comença amb tres entorns (dev, test i prod)''', encara que resulta senzill crear nous entorns.''' Pots veure la teva aplicació en diferents entorn''' amb només '''canviar el controlador frontal'''en el teu navegador. Per veure l'aplicació en l'entorn '''dev''', accedeix a l'aplicació a través del controlador frontal de desenvolupament:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://localhost/app_dev.php/hola&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Si desitges veure com es comportarà la teva aplicació a l'entorn de producció, utilitza en el seu lloc el controlador frontal '''prod''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://localhost/app.php/hola&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Si fas qualsevol canvi en les plantilles, no ho veuràs en l'entorn prod tret que esborris la cache de l'aplicació i així forcis a Symfony a tornar a compilar les plantilles. Per esborrar la cache de l'entorn de producció, executa la següent comanda de consola:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo php app/console cache:clear --env=prod &amp;amp;&amp;amp; sudo php app/console cache:warmup --env=prod&lt;br /&gt;
i donar-li permísos:&lt;br /&gt;
chmod 777 nomprojecte/ -R&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=El controlador=&lt;br /&gt;
Un controlador és una funció PHP creada per tu i que s'encarrega d'obtenir la informació de la petició HTTP i de generar i retornar la resposta HTTP (en forma d'objecte de tipus Response de Symfony2).&lt;br /&gt;
La resposta pot ser:&lt;br /&gt;
*una pàgina HTML,&lt;br /&gt;
*un document XML, &lt;br /&gt;
*un array JSON serializado, &lt;br /&gt;
*una imatge, &lt;br /&gt;
*una redirecció a una altra pàgina, &lt;br /&gt;
*un error de tipus 404 &lt;br /&gt;
*o qualsevol altra cosa que se t'ocorri. &lt;br /&gt;
El controlador conté tota la lògica que la teva aplicació necessita per generar el contingut de la pàgina. L'objectiu d'un controlador sempre és el mateix: crear i retornar un objecte '''Response'''.&lt;br /&gt;
==Cicle de vida d'una petició==&lt;br /&gt;
* 1.Cada petició és tractada per un únic arxiu: el controlador frontal (per exemple, '''app.php''' o '''app_dev.php''') el qual és responsable d'iniciar l'aplicació.&lt;br /&gt;
* 2. El sistema d'encaminament (classe Routing) llegeix la informació de la petició (per exemple, la URI), troba una ruta que coincideixi amb aquesta informació, i llegeix el paràmetre '''_controller''' de la ruta.&lt;br /&gt;
* 3. S'executa el controlador assignat a la ruta i aquest controlador crea i retorna un objecte '''Response'''.&lt;br /&gt;
* 4. Les capçaleres HTTP i el contingut de l'objecte Response s'envien de tornada al client.&lt;br /&gt;
&lt;br /&gt;
Exemple de controlador:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/HelloBundle/Controller/HelloController.php&lt;br /&gt;
 &lt;br /&gt;
namespace Acme\HelloBundle\Controller;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Response;&lt;br /&gt;
 &lt;br /&gt;
class HelloController&lt;br /&gt;
{&lt;br /&gt;
    public function indexAction()&lt;br /&gt;
    {&lt;br /&gt;
      return new Response('&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;Hello world!&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Associant una URI a un controlador==&lt;br /&gt;
El nou controlador retorna una pàgina HTML simple. Per poder provar realment aquesta pàgina en el teu navegador, has de crear una ruta que el seu path sigui la URI que vols associar al controlador al fitxer '''routing.yml''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
hello:&lt;br /&gt;
    path:         /hello&lt;br /&gt;
    defaults:     { _controller: AcmeHelloBundle:Hello:index }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Observa la sintaxi utilitzada per referir-se al controlador: '''AcmeHelloBundle:Hello:index'''. Symfony2 utilitza aquesta notació curta per referir-se als controladors. Es tracta de la '''sintaxi recomanada''' i li diu a Symfony2 que busqui una '''classe controlador anomenada HelloController''' dins d'un '''paquet''' anomenat''' AcmeHelloBundle '''i que després '''executi el mètode indexAction()'''.&lt;br /&gt;
&lt;br /&gt;
'''Passar arguments al mètode del controlador'''&lt;br /&gt;
Exemple de controlador amb un argument en un dels seus mètodes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// src/Acme/HelloBundle/Controller/HelloController.php&lt;br /&gt;
 &lt;br /&gt;
namespace Acme\HelloBundle\Controller;&lt;br /&gt;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;&lt;br /&gt;
 &lt;br /&gt;
class HelloController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function indexAction($name)&lt;br /&gt;
    {&lt;br /&gt;
      // ...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El controlador anterior té un sol argument, anomenat '''$name''', el valor del qual correspon al paràmetre '''{name}''' de la ruta associada. De fet, quan executes el teu controlador, Symfony2 associa cada argument del controlador amb un paràmetre de la ruta. &lt;br /&gt;
L'arxiu d'enrutament hauria de ser aquest:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
hello:&lt;br /&gt;
    path:         /hello&lt;br /&gt;
    defaults:     { _controller: AcmeHelloBundle:Hello:index }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Considera el següent exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/routing.yml&lt;br /&gt;
hello:&lt;br /&gt;
    path:         /hello/{firstName}/{lastName}&lt;br /&gt;
    defaults:     { _controller: AcmeHelloBundle:Hello:index, color: green }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function indexAction($firstName, $lastName, $color)&lt;br /&gt;
{&lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les variables '''{firstName}''' i '''{lastName}''' de la ruta es diuen '''placeholders''', ja que &amp;quot;guarden el lloc&amp;quot; perquè qualsevol valor substitueixi aquesta variable. D'altra banda, la variable '''color''' és una variable de '''tipus default''', ja que el seu valor sempre '''està definit per a totes les rutes'''.&lt;br /&gt;
Existeixen regles amb els arguments (paràmetres):&lt;br /&gt;
*Cada argument obligatori del controlador ha de tenir associat un paràmetre en la ruta&lt;br /&gt;
*No tots els paràmetres de la ruta han de ser arguments en el teu controlador&lt;br /&gt;
*és perfectament vàlid fer que l'argument sigui opcional.&lt;br /&gt;
&lt;br /&gt;
El següent exemple no llançarà una excepció:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function indexAction($firstName, $lastName, $color, $foo = 'bar')&lt;br /&gt;
{&lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==objecte Request com a argument del controlador==&lt;br /&gt;
Sol ser molt útil disposar en el controlador de l'objecte '''Request''' associat a la petició de l'usuari, especialment quan treballes amb formularis. Per fer que Symfony passi aquest objecte automàticament com a argument del controlador, utilitza el següent codi:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
 &lt;br /&gt;
public function updateAction(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    $form = $this-&amp;gt;createForm(...);&lt;br /&gt;
 &lt;br /&gt;
    $form-&amp;gt;handleRequest($request);&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Generador de controladors==&lt;br /&gt;
Si el que volem és generar un nou controlador a la nostra aplicació podem automatitzar el procés utilitzant la següent comanda:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php app/console generate:controller&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aquesta comanda et demanarà tota la informació necessaria per crear el controlador i els '''actions''' (mètodes) necessaris que podràs utilitzar en el fitxer de rutes. Tant si utilitzes la comanda com si no la utilitzes, sempre podràs canviar la classe generada com tu prefereixis.&lt;br /&gt;
= Encaminament =&lt;br /&gt;
Una ruta és una associació entre un patró d'URL i un controlador. Suposem per exemple que desitges associar URL de tipus ''/blog/el meu-post'' o ''/blog/tot-sobre-symfony'' amb un controlador que sigui capaç de buscar i mostrar l'article sol·licitat.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/routing.yml&lt;br /&gt;
blog_show:&lt;br /&gt;
    path:      /blog/{slug}&lt;br /&gt;
    defaults:  { _controller: AcmeBlogBundle:Blog:show }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Codi PHP del controlador associat a aquesta ruta:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/BlogBundle/Controller/BlogController.php&lt;br /&gt;
 &lt;br /&gt;
namespace Acme\BlogBundle\Controller;&lt;br /&gt;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;&lt;br /&gt;
 &lt;br /&gt;
class BlogController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function showAction($slug)&lt;br /&gt;
    {&lt;br /&gt;
        $blog = // usa la variable $slug para consultar la base de datos&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;render('AcmeBlogBundle:Blog:show.html.twig', array(&lt;br /&gt;
            'blog' =&amp;gt; $blog,&lt;br /&gt;
        ));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquest és l'objectiu del encaminador de Symfony2: associar la URL d'una petició a un controlador&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objectiu del sistema d'encaminament de Symfony2 és analitzar aquesta URL i determinar què controlador s'ha d'executar. El procés complet consta dels següents passos:&lt;br /&gt;
*La petició es processa en el controlador frontal de Symfony2 (per exemple, en l'arxiu''' app.php''').&lt;br /&gt;
*El nucli de Symfony2 (conegut com kernel) sol·licita al enrutador que examini la petició.&lt;br /&gt;
*El enrutador busca què patró de les rutes de l'aplicació coincideix amb la URL entrant i retorna informació sobre la ruta, incloent el controlador que s'ha d'executar.&lt;br /&gt;
*El nucli de Symfony2 executa el controlador, que en última instància, retorna un objecte '''Response'''.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:funcionament-routing.png]]&lt;br /&gt;
&lt;br /&gt;
== Prefix a les rutes ==&lt;br /&gt;
&lt;br /&gt;
Resulta habitual haver d'afegir un prefix a totes les rutes importades des d'un arxiu extern. Si vols per exemple que el patró de la ruta '''acme_hello''' sigui '''/admin/hello/{name}''' en comptes de''' /hello/{name}''', afegeix l'opció prefix en importar les rutes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/routing.yml&lt;br /&gt;
acme_hello:&lt;br /&gt;
    resource: &amp;quot;@AcmeHelloBundle/Resources/config/routing.yml&amp;quot;&lt;br /&gt;
    prefix:   /admin&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
El valor indicat en l'opció prefix (en aquest cas '''/admin''') s'afegeix per davant de tots els patrons de les rutes importades des de l'arxiu extern.&lt;br /&gt;
&lt;br /&gt;
= Sessions a Symfony2=&lt;br /&gt;
&lt;br /&gt;
Symfony2 inclou un objecte de sessió que permet emmagatzemar informació persistent sobre l'usuari, és a dir, informació que es guarda d'una petició a una altra. Per defecte Symfony2 emmagatzema la informació en una cookie usant les sessions natives de PHP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
 &lt;br /&gt;
public function indexAction(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    $session = $request-&amp;gt;getSession();&lt;br /&gt;
 &lt;br /&gt;
    // guarda un atributo para reutilizarlo durante una&lt;br /&gt;
    // petición posterior del usuario&lt;br /&gt;
    $session-&amp;gt;set('foo', 'bar');&lt;br /&gt;
 &lt;br /&gt;
    // obtener el valor de un atributo de la sesión&lt;br /&gt;
    $foo = $session-&amp;gt;get('foo');&lt;br /&gt;
 &lt;br /&gt;
    // utilizar un valor por defecto si el atributo no existe&lt;br /&gt;
    $filters = $session-&amp;gt;get('filters', array());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Plantilles TWIG=&lt;br /&gt;
Una plantilla és un arxiu de text que pot generar qualsevol altre format basat en text (HTML, XML, CSV, LaTeX, etc.). Les plantilles PHP són les més populars, com la qual mostra el següent exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
    &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;¡Bienvenido a Symfony!&amp;lt;/title&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;&amp;lt;?php echo $page_title ?&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;ul id=&amp;quot;navigation&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;?php foreach ($navigation as $item): ?&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;&amp;lt;?php echo $item-&amp;gt;getHref() ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;?php echo $item-&amp;gt;getCaption() ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/a&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Symfony2 inclou un llenguatge de plantilles anomenat '''Twig''' que és molt més potent i elegant que PHP. Gràcies a Twig pots crear plantilles molt concises i fàcils de llegir, per la qual cosa a més són fàcils d'entendre per part dels dissenyadors web. Observa el mateix exemple anterior definit com a plantilla Twig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
    &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;¡Bienvenido a Symfony!&amp;lt;/title&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;{{ page_title }}&amp;lt;/h1&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;ul id=&amp;quot;navigation&amp;quot;&amp;gt;&lt;br /&gt;
            {% for item in navigation %}&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;{{ item.href }}&amp;quot;&amp;gt;{{ item.caption }}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
            {% endfor %}&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Twig es basa en dues etiquetes especials:&lt;br /&gt;
&lt;br /&gt;
*'''{ { ... } }''': serveix per mostrar el contingut d'una variable o el resultat de realitzar alguna operació o processar alguna expressió. En PHP la construcció equivalent és ''echo'' o ''print''.&lt;br /&gt;
*'''{% ... %}''': serveix per definir la lògica de la plantilla, és a dir, la part de programació que controla com es mostren els continguts de la plantilla. Entre uns altres, aquesta etiqueta s'empra per a les instruccions ''if'' i per als bucles ''for''.&lt;br /&gt;
&lt;br /&gt;
==Herència de plantilles i layout==&lt;br /&gt;
Normalment les plantilles d'un mateix projecte comparteixen molts elements comuns, com per exemple la capçalera, el peu de pàgina, una barra lateral, etc. Symfony2 resol aquest problema de forma molt senzilla: una plantilla pot decorar el contingut d'una altra plantilla.&lt;br /&gt;
&lt;br /&gt;
La idea és exactament la mateixa que l'herència de classes PHP: l'herència de plantilles et permet crear una plantilla basi cridada layout i que conté tots els elements comuns del lloc definits com a blocs. Després, les plantilles filla hereten del layout i emplenen o modifiquen aquests blocs.&lt;br /&gt;
&lt;br /&gt;
En primer lloc, crea un arxiu amb el teu disseny base:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# app/Resources/views/base.html.twig #}&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
    &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=utf-8&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;{% block title %}Test Application{% endblock %}&amp;lt;/title&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;sidebar&amp;quot;&amp;gt;&lt;br /&gt;
            {% block sidebar %}&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/blog&amp;quot;&amp;gt;Blog&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
            {% endblock %}&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;div id=&amp;quot;contenido&amp;quot;&amp;gt;&lt;br /&gt;
            {% block body %}{% endblock %}&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Aquesta plantilla defineix l'esquelet d'una pàgina HTML simple de dues columnes. En aquest exemple, '''es defineixen tres blocs amb l'etiqueta {% block %} (title, sidebar i body)'''. Les '''plantilles filla''' poden '''modificar''' els continguts de cadascun dels '''blocs'' o deixar-los tal com estan en la plantilla base.&lt;br /&gt;
&lt;br /&gt;
El següent exemple mostra l'aspecte d'una plantilla filla:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/BlogBundle/Resources/views/Blog/index.html.twig #}&lt;br /&gt;
{% extends '::base.html.twig' %}&lt;br /&gt;
 &lt;br /&gt;
{% block title %}My cool blog posts{% endblock %}&lt;br /&gt;
 &lt;br /&gt;
{% block body %}&lt;br /&gt;
    {% for entry in blog_entries %}&lt;br /&gt;
        &amp;lt;h2&amp;gt;{{ entry.title }}&amp;lt;/h2&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;{{ entry.body }}&amp;lt;/p&amp;gt;&lt;br /&gt;
    {% endfor %}&lt;br /&gt;
{% endblock %}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La clau de l'herència de plantilles és l'etiqueta '''{% extends %}'''. D'aquesta forma el motor de plantilles sap que primer ha de processar la plantilla base, que defineix el disseny de la pàgina i crea diversos blocs de continguts. Després es renderitza la plantilla filla, que reemplaça el contingut dels blocs '''title''' i '''body''' del pare.&lt;br /&gt;
&lt;br /&gt;
Quan treballis amb l'herència de plantilles, tingues en compte:&lt;br /&gt;
*Si inclous l'etiqueta '''{% extends %}''' en una plantilla, aquesta ha de ser la primera etiqueta d'aquesta plantilla.&lt;br /&gt;
*Quantes més etiquetes '''{% block %}''' tinguis en la teva plantilla basi, millor. Recorda que les plantilles filla no tenen l'obligació d'emplenar tots els blocs dels pares, per la qual cosa pots definir tants blocs com vulguis i assignar a cadascun un valor per defecte que sigui lògic per a la major part de les pàgines del lloc. Quants més blocs defineixi el layout, més flexible serà el seu disseny.&lt;br /&gt;
*Si còpies i pegues algun contingut en diverses plantilles, segurament serà millor que moguis aquest contingut a algun bloc del layout. En altres casos el millor és col·locar aquest contingut en alguna altra plantilla i incloure-la amb l'etiqueta '''include''' sempre que sigui necessari.&lt;br /&gt;
*Si vols obtenir el contingut d'algun bloc de la plantilla pare, utilitza la funció''' { { parent() } }'''. Això és molt útil quan vols afegir continguts propis a qualsevol altre contingut que el pare pugui haver definit per a aquest bloc:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{% block sidebar %}&lt;br /&gt;
    &amp;lt;h3&amp;gt;Table of Contents&amp;lt;/h3&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    {# ... #}&lt;br /&gt;
 &lt;br /&gt;
    {{ parent() }}&lt;br /&gt;
{% endblock %}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Localització de les plantilles==&lt;br /&gt;
Les plantilles es troben en dos llocs diferents:&lt;br /&gt;
&lt;br /&gt;
*'''app/Resources/views/''': el directori on s'emmagatzemen les plantilles globals de l'aplicació, com per exemple la plantilla del layout i les plantilles utilitzades per redefinir les plantilles incloses en els bundles de Symfony2.&lt;br /&gt;
*'''ruta/fins a/el/bundle/Resources/views/''': els bundles emmagatzemen les seves pròpies plantilles en el directori '''Resources/views/''' de cada bundle. La immensa majoria de les plantilles s'emmagatzemen dins d'algun bundle.&lt;br /&gt;
Symfony2 identifica a cada plantilla amb la sintaxi especial '''bundle:controlador:plantilla'''. Això permet definir diferents tipus de plantilla, cadascuna emmagatzemada en un lloc diferent:&lt;br /&gt;
&lt;br /&gt;
'''AcmeBlogBundle:Blog:index.html.twig''': indica la plantilla d'una pàgina específica. Est és el significat de cadascuna de les tres parts de la cadena:&lt;br /&gt;
*'''AcmeBlogBundle''': (bundle) la plantilla es troba dins del bundle '''AcmeBlogBundle''' (per exemple, ''src/Acme/BlogBundle'').&lt;br /&gt;
*'''Blog''': (controlador) indica que la plantilla s'emmagatzema en el subdirectori Blog de '''Resources/views'''.&lt;br /&gt;
*'''index.html.twig''': (plantilla) el nom de l'arxiu que guarda la plantilla és '''index.html.twig'''. Suposant que '''AcmeBlogBundle''' es trobi en '''src/Acme/BlogBundle''', la ruta completa de la plantilla seria '''src/Acme/BlogBundle/Resources/views/Blog/index.html.twig'''.&lt;br /&gt;
&lt;br /&gt;
*'''AcmeBlogBundle::layout.html.twig''': indica que és una plantilla global del bundle indicat. Com a falta la part central que es refereix al controlador, aquesta plantilla '''no es troba''' dins de cap subdirectori de '''Resources/views/'''. En altres paraules, '''la ruta '''completa de la plantilla és '''Resources/views/layout.html.twig''' dins del bundle AcmeBlogBundle.&lt;br /&gt;
*'''::base.html.twig''': indica que és una plantilla global de l'aplicació. Observa que la cadena comença amb dos parells de dos punts '''(::)''', per la qual cosa falta la part del bundle i la del controlador. En altres paraules, aquesta plantilla no es troba en cap bundle sinó directament dins de '''app/Resources/views/'''.&lt;br /&gt;
&lt;br /&gt;
== Etiquetes Twig==&lt;br /&gt;
===Incloent unes altres plantilles===&lt;br /&gt;
Resulta habitual voler incloure la mateixa plantilla o fragment de codi a diverses pàgines diferents. Si l'aplicació té per exemple un llistat d'articles, el codi de la plantilla que mostra un article es pot utilitzar a la pàgina de detall de l'article, en una pàgina que mostra els articles més populars, o en una llista dels articles més recents.&lt;br /&gt;
&lt;br /&gt;
En PHP, quan necessites reutilitzar un tros de codi, normalment mous el codi a una nova classe o funció. En les plantilles s'aplica la mateixa idea:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/ArticleBundle/Resources/views/Article/articleDetails.html.twig #}&lt;br /&gt;
&amp;lt;h2&amp;gt;{{ article.title }}&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;h3 class=&amp;quot;byline&amp;quot;&amp;gt;by {{ article.authorName }}&amp;lt;/h3&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
    {{ article.body }}&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ara ja pots incloure fàcilment aquesta plantilla en qualsevol una altra:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/ArticleBundle/Resources/views/Article/list.html.twig #}&lt;br /&gt;
{% extends 'AcmeArticleBundle::layout.html.twig' %}&lt;br /&gt;
 &lt;br /&gt;
{% block body %}&lt;br /&gt;
    &amp;lt;h1&amp;gt;Recent Articles&amp;lt;h1&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    {% for article in articles %}&lt;br /&gt;
        {{ include(&lt;br /&gt;
            'AcmeArticleBundle:Article:articleDetails.html.twig',&lt;br /&gt;
            {'article': article}&lt;br /&gt;
        ) }}&lt;br /&gt;
    {% endfor %}&lt;br /&gt;
{% endblock %}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Renderitzant plantilles enviant-li dades des de el controlador==&lt;br /&gt;
Imagina que en el teu lloc web tens una barra lateral que mostra els tres articles més recents. Per obtenir aquests tres articles és necessari realitzar una consulta a la base de dades o alguna altra operació similar que no es pot incloure en la pròpia plantilla.&lt;br /&gt;
&lt;br /&gt;
La solució consisteix a inserir en la plantilla el resultat retornat per un controlador de l'aplicació. En primer lloc, crea un controlador que renderitzi el llistat dels articles recents:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/ArticleBundle/Controller/ArticleController.php&lt;br /&gt;
class ArticleController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function recentArticlesAction($max = 3)&lt;br /&gt;
    {&lt;br /&gt;
        // hace una llamada a la base de datos u otra lógica&lt;br /&gt;
        // para obtener los &amp;quot;$max&amp;quot; artículos más recientes&lt;br /&gt;
        $articles = ...;&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;render(&lt;br /&gt;
            'AcmeArticleBundle:Article:recentList.html.twig',&lt;br /&gt;
            array('articles' =&amp;gt; $articles)&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
i a la plantilla es pot utilitzar les dades del array enviat des del controlador directament:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/ArticleBundle/Resources/views/Article/recentList.html.twig #}&lt;br /&gt;
{% for article in articles %}&lt;br /&gt;
    &amp;lt;a href=&amp;quot;/article/{{ article.slug }}&amp;quot;&amp;gt;&lt;br /&gt;
        {{ article.title }}&lt;br /&gt;
        &amp;lt;/a&amp;gt;&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per mostrar en qualsevol plantilla el resultat d'executar un controlador, utilitza la funció render i identifica al controlador utilitzant la notació especial '''bundle:controlador:acció''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# app/Resources/views/base.html.twig #}&lt;br /&gt;
 &lt;br /&gt;
{# ... #}&lt;br /&gt;
&amp;lt;div id=&amp;quot;sidebar&amp;quot;&amp;gt;&lt;br /&gt;
    {{ render(controller('AcmeArticleBundle:Article:recentArticles', {&lt;br /&gt;
        'max': 3&lt;br /&gt;
    })) }}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Enllaçant pàgines==&lt;br /&gt;
Crear enllaços a altres pàgines de l'aplicació és una de les tasques més comunes d'una plantilla. En lloc de generar a mà les URL dins de la plantilla, utilitza la funció path de Twig (o el helper router en PHP) per generar les URL utilitzant la configuració del sistema de encaminament. D'aquesta manera, si més endavant vols canviar l'aspecte de qualsevol URL, només has d'actualitzar un arxiu de configuració i totes les URL de les plantilles s'actualitzaran instantàniament.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;{{ path('_welcome') }}&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
On '''_welcome''' està definit al fitxer de routes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
_welcome:&lt;br /&gt;
    path:     /&lt;br /&gt;
    defaults: { _controller: AcmeDemoBundle:Welcome:index }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Enllaçant arxius web (css, javascript)==&lt;br /&gt;
Les plantilles de les aplicacions web solen enllaçar amb els web '''assets'' o arxius web, tals com a imatges, fulles d'estil CSS, arxius Javascript, etc.&lt;br /&gt;
&lt;br /&gt;
A la versió 2.8 ja no s'instal·la '''assetic''' per defecte i s'ha d'instal·lar utilitzant aquesta guia: &lt;br /&gt;
http://symfony.com/doc/current/cookbook/assetic/asset_management.html&lt;br /&gt;
&lt;br /&gt;
''Quan passem a producció hem d'executar:''&lt;br /&gt;
 sudo php app/console assetic:dump --env=prod --no-debug&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 De nou no és aconsellable generar a mà les URL d'aquest tipus d'arxius, ja que Symfony2 ofereix una solució millor i molt més flexible mitjançant la funció '''asset''' de Twig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ asset('images/logo.png') }}&amp;quot; alt=&amp;quot;Symfony!&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;link href=&amp;quot;{{ asset('css/blog.css') }}&amp;quot; rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La gestió dels arxius CSS i dels arxius Javascript es realitza mitjançant la herència de plantilles. A la plantilla para es pot incloure els arxius que s'utilitzarà a tota la aplicació i després, a les plantilles filles, es poden incloure fitxers específics per aquella part de la web:&lt;br /&gt;
Plantilla pare:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# app/Resources/views/base.html.twig #}&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
    {# ... #}&lt;br /&gt;
 &lt;br /&gt;
    {% block stylesheets %}&lt;br /&gt;
        &amp;lt;link href=&amp;quot;{{ asset('css/main.css') }}&amp;quot; type=&amp;quot;text/css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; /&amp;gt;&lt;br /&gt;
    {% endblock %}&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
    {# ... #}&lt;br /&gt;
 &lt;br /&gt;
    {% block javascripts %}&lt;br /&gt;
        &amp;lt;script src=&amp;quot;{{ asset('js/main.js') }}&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    {% endblock %}&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
i les plantilles filles redefineixen els blocs tot utilitzant la configuració que hi ha en la plantilla pare:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/DemoBundle/Resources/views/Contact/contact.html.twig #}&lt;br /&gt;
{% extends '::base.html.twig' %}&lt;br /&gt;
 &lt;br /&gt;
{% block stylesheets %}&lt;br /&gt;
    {{ parent() }}&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;link href=&amp;quot;{{ asset('css/contact.css') }}&amp;quot; type=&amp;quot;text/css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; /&amp;gt;&lt;br /&gt;
{% endblock %}&lt;br /&gt;
 &lt;br /&gt;
{# ... #}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les plantilles també poden enllaçar arxius que es trobin en el directori Resources/public de qualsevol bundle. Per fer que aquests arxius estiguin disponibles en l'aplicació, executa la comanda:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php app/console assets:install directorio [--symlink]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Si al utilitzar ''assets'' en producció no funciona:===&lt;br /&gt;
http://symfony.com/doc/current/cookbook/assetic/asset_management.html#cookbook-assetic-dumping&lt;br /&gt;
&lt;br /&gt;
== Variables globals que es poden utilitzar directament a les plantilles ==&lt;br /&gt;
*'''app.security''' - el context de seguretat.&lt;br /&gt;
*'''app.user''' - l'objecte qeu representa a l'usuari que està visitant l'aplicació.&lt;br /&gt;
*'''app.request''' - l'objecte Request que conté tota la informació de la petició.&lt;br /&gt;
*'''app.session''' - l'objecte Session relacionat amb l'usuari.&lt;br /&gt;
*'''app.environment''' - l'entorn en el qual s'està executant l'aplicació (dev, prod, etc.)&lt;br /&gt;
*'''app.debug''' - val true si l'aplicació s'està executant en la manera de depuració i false en un altre cas.&lt;br /&gt;
=Formularis=&lt;br /&gt;
Guia Symfony per crear i utilitzar formularis:&lt;br /&gt;
http://symfony.com/doc/2.8/book/forms.html&lt;br /&gt;
&lt;br /&gt;
Symfony incorpora unes llibreries que permeten utilitzar els formularis associant-los amb clases PHP. Exemple:&lt;br /&gt;
Classe Tasca:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/TaskBundle/Entity/Task.php&lt;br /&gt;
namespace Acme\TaskBundle\Entity;&lt;br /&gt;
 &lt;br /&gt;
class Task&lt;br /&gt;
{&lt;br /&gt;
    // descripción de la tarea&lt;br /&gt;
    protected $task;&lt;br /&gt;
 &lt;br /&gt;
    // fecha en la que debe estar completada&lt;br /&gt;
    protected $dueDate;&lt;br /&gt;
 &lt;br /&gt;
    public function getTask()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;task;&lt;br /&gt;
    }&lt;br /&gt;
    public function setTask($task)&lt;br /&gt;
    {&lt;br /&gt;
        $this-&amp;gt;task = $task;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public function getDueDate()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;dueDate;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public function setDueDate(\DateTime $dueDate = null)&lt;br /&gt;
    {&lt;br /&gt;
        $this-&amp;gt;dueDate = $dueDate;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per crear el formulari on demanem totes, o algunes, de les dades que necessitem per crear la tasca anterior fariem el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/TaskBundle/Controller/DefaultController.php&lt;br /&gt;
namespace Acme\TaskBundle\Controller;&lt;br /&gt;
 &lt;br /&gt;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;&lt;br /&gt;
use Acme\TaskBundle\Entity\Task;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
 &lt;br /&gt;
class DefaultController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function newAction(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        // crea una task y le asigna algunos datos ficticios para este ejemplo&lt;br /&gt;
        $task = new Task();&lt;br /&gt;
        $task-&amp;gt;setTask('Write a blog post');&lt;br /&gt;
        $task-&amp;gt;setDueDate(new \DateTime('tomorrow'));&lt;br /&gt;
 &lt;br /&gt;
        $form = $this-&amp;gt;createFormBuilder($task)&lt;br /&gt;
            -&amp;gt;add('task', 'text')&lt;br /&gt;
            -&amp;gt;add('dueDate', 'date')&lt;br /&gt;
            -&amp;gt;add('save', 'submit')&lt;br /&gt;
            -&amp;gt;getForm();&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;render('AcmeTaskBundle:Default:new.html.twig', array(&lt;br /&gt;
            'formulari' =&amp;gt; $form-&amp;gt;createView(),&lt;br /&gt;
        ));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilitzant el formulari en una plantilla TWIG:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #}&lt;br /&gt;
 &lt;br /&gt;
{{ form(formulari) }}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Processant l'enviament del formulari==&lt;br /&gt;
Exemple del controlador que envia i reb les dades d'un formulari:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function newAction(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    // crear un objeto $task nuevo (borra los datos de prueba)&lt;br /&gt;
    $task = new Task();&lt;br /&gt;
 &lt;br /&gt;
    $form =  $this-&amp;gt;createFormBuilder($task)&lt;br /&gt;
    -&amp;gt;setAction($this-&amp;gt;generateUrl('target_route'))&lt;br /&gt;
    -&amp;gt;setMethod('GET')&lt;br /&gt;
    -&amp;gt;add('task', 'text')&lt;br /&gt;
    -&amp;gt;add('dueDate', 'date')&lt;br /&gt;
    -&amp;gt;add('save', 'submit')&lt;br /&gt;
    -&amp;gt;getForm();&lt;br /&gt;
 &lt;br /&gt;
    $form-&amp;gt;handleRequest($request);&lt;br /&gt;
 &lt;br /&gt;
    if ($form-&amp;gt;isValid()) {&lt;br /&gt;
        // guardar la tarea en la base de datos&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;redirect($this-&amp;gt;generateUrl('task_success'));&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Quan es carrega per primera vegada la pàgina associada a aquest controlador, es crea i renderiza el formulari. El mètode '''handleRequest() ''' detecta que el formulari no s'ha enviat i per tant, no fa gens.El mètode '''isValid()''' retorna false si el formulari no s'ha enviat.&lt;br /&gt;
*Quan l'usuari envia el formulari, el mètode '''handleRequest()''' ho detecta i guarda immediatament les dades enviades en les propietats '''task i dueDate''' de l'objecte''' $task.''' Després es valida aquest objecte. Si no és vàlid, el mètode '''isValid()''' retorna '''false''' una altra vegada, per la qual cosa es torna a mostrar el formulari, aquesta vegada amb els missatges d'error corresponents. Si solament vols comprovar si el formulari s'ha enviat, independentment de si és vàlid o no, utilitza el mètode '''isSubmitted()'''.&lt;br /&gt;
*Quan l'usuari envia el formulari amb dades vàlides, les dades enviades es guarden de nou en el formulari, però aquesta vegada el mètode '''isValid()''' retorna '''true'''. En aquest moment ja pots treballar amb l'objecte '''$task''' (per exemple guardant-ho en una base de dades) abans de redirigir a l'usuari a una altra pàgina (per exemple a la pàgina d'agraïment o a la qual mostra un missatge determinat).&lt;br /&gt;
&lt;br /&gt;
=Seguretat=&lt;br /&gt;
És un procés de dues etapes que el seu objectiu és evitar que un usuari accedeixi a un recurs pel qual no hauria de tenir accés.&lt;br /&gt;
&lt;br /&gt;
En el primer pas del procés, el sistema de seguretat identifica qui és l'usuari obligant-ho a enviar algun tipus d'identificació. Això es diu autenticació, i significa que el sistema està tractant d'esbrinar qui ets.&lt;br /&gt;
&lt;br /&gt;
Una vegada que el sistema sap qui ets, el següent pas és decidir si hauries de tenir accés a un determinat recurs. Aquesta part del procés es diu autorització, i significa que el sistema està comprovant si tens suficients privilegis per realitzar una determinada acció.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:seguretat-symfony.png]]&lt;br /&gt;
&lt;br /&gt;
==Firewalls (autenticació)==&lt;br /&gt;
&lt;br /&gt;
El sistema de seguretat de Symfony s'activa quan un usuari fa una petició a una URL que està protegida per un '''firewall''' o tallafocs. El treball del firewall ''consisteix a determinar si l'usuari necessita estar autenticat'', i si ho necessita, enviar una resposta a l'usuari per iniciar el procés d'autenticació.&lt;br /&gt;
&lt;br /&gt;
Un ''firewall s'activa quan la URL d'una petició entrant concorda amb el valor de la seva opció de configuració '''pattern'''''. En aquest exemple el valor de pattern''' (^/)''' concorda amb qualsevol petició entrant. No obstant això, el fet que el firewall estigui activat no significa que el navegador mostra la caixa de login+contrasenya per a totes les URL. Els usuaris poden accedir per exemple a /foo sense que l'aplicació els demani que s'autentiquin.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:firewall-symfony.png]]&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/security.yml&lt;br /&gt;
security:&lt;br /&gt;
    firewalls:&lt;br /&gt;
        secured_area:&lt;br /&gt;
            pattern:    ^/&lt;br /&gt;
            anonymous: ~&lt;br /&gt;
            http_basic:&lt;br /&gt;
                realm: &amp;quot;Secured Demo Area&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    access_control:&lt;br /&gt;
        - { path: ^/admin, roles: ROLE_ADMIN }&lt;br /&gt;
        # Descomenta la siguiente línea para proteger también&lt;br /&gt;
        # la propia URL /admin&lt;br /&gt;
        # - { path: ^/admin$, roles: ROLE_ADMIN }&lt;br /&gt;
&lt;br /&gt;
    providers:&lt;br /&gt;
        in_memory:&lt;br /&gt;
            memory:&lt;br /&gt;
                users:&lt;br /&gt;
                    ryan:  { password: ryanpass, roles: 'ROLE_USER' }&lt;br /&gt;
                    admin: { password: kitten, roles: 'ROLE_ADMIN' }&lt;br /&gt;
&lt;br /&gt;
    encoders:&lt;br /&gt;
        Symfony\Component\Security\Core\User\User: plaintext&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquest funcionament és possible en primer lloc perquè el firewall permet l'accés als usuaris anònims a causa de l'opció de configuració anonymous. En altres paraules, el firewall no exigeix que tots els usuaris s'autentiquin res més accedir a l'aplicació. I com en la configuració de la secció access_control no s'indica que els usuaris hagin de tenir cap role especial per accedir a /foo la petició es processa sense requerir a l'usuari que s'autentiqui.&lt;br /&gt;
&lt;br /&gt;
Si elimines l'opció anonymous, l'efecte és que ara el firewall demana autenticació a qualsevol recurs.&lt;br /&gt;
&lt;br /&gt;
Seguint amb el mateix exemple, si un usuari sol·licita '''/admin/foo''', l'aplicació es comporta de manera diferent. Això és a causa de la configuració de la secció '''access_control''', que indica que qualsevol URL que coincideixi amb l'expressió regular '''^/admin''' (és a dir, la URL '''/admin''' o qualsevol altra URL que coincideixi amb /admin/) requereix el rol''' ROLE_ADMIN'''. Els rols són la clau del sistema d'autorització: l'usuari pot accedir a '''/admin/foo''' només si compta amb el rol'''ROLE_ADMIN'''.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:access-symfony.png ]]&lt;br /&gt;
&lt;br /&gt;
La capa de control d'accés denega l'accés a l'usuari (perquè els usuaris anònims no compten amb el rol ROLE_ADMIN), el firewall pren el control de l'aplicació i inicia el procés d'autenticació.&lt;br /&gt;
&lt;br /&gt;
==Utilitzant el típic formulari de accés==&lt;br /&gt;
En primer lloc, afegeix l'opció form_login en la configuració del firewall:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/security.yml&lt;br /&gt;
security:&lt;br /&gt;
    firewalls:&lt;br /&gt;
        secured_area:&lt;br /&gt;
            pattern:    ^/&lt;br /&gt;
            anonymous:  ~&lt;br /&gt;
            form_login:&lt;br /&gt;
                login_path:  login&lt;br /&gt;
                check_path:  login_check&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El sistema de seguretat inicia el procés d'autenticació, es redirigeix a l'usuari a la ruta que mostra el formulari d'accés (per defecte '''/login'''). El'' formulari has de crear-ho tu mateix a mà, ja que Symfony no ho proporciona''. Primer crea les dues noves rutes utilitzades en la configuració de la seguretat: la ruta '''login''' mostra el formulari (es correspon amb la URL''' /login''') i '''login_check''' que processa l'enviament del formulari (es correspon amb la URL '''/login_check)''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/routing.yml&lt;br /&gt;
login:&lt;br /&gt;
    pattern:   /login&lt;br /&gt;
    defaults:  { _controller: AcmeSecurityBundle:Security:login }&lt;br /&gt;
login_check:&lt;br /&gt;
    pattern:   /login_check&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observa que el nom de la ruta '''login''' coincideix amb el valor de l'opció '''login_path''', ja que és on el sistema de seguretat redirigeix als usuaris que necessiten autenticar-se.&lt;br /&gt;
&lt;br /&gt;
A continuació, crea el controlador que mostra el formulari de accés:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/SecurityBundle/Controller/SecurityController.php;&lt;br /&gt;
namespace Acme\SecurityBundle\Controller;&lt;br /&gt;
 &lt;br /&gt;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
use Symfony\Component\Security\Core\SecurityContext;&lt;br /&gt;
 &lt;br /&gt;
class SecurityController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function loginAction(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $session = $request-&amp;gt;getSession();&lt;br /&gt;
 &lt;br /&gt;
        // get the login error if there is one&lt;br /&gt;
        if ($request-&amp;gt;attributes-&amp;gt;has(SecurityContext::AUTHENTICATION_ERROR)) {&lt;br /&gt;
            $error = $request-&amp;gt;attributes-&amp;gt;get(&lt;br /&gt;
                SecurityContext::AUTHENTICATION_ERROR&lt;br /&gt;
            );&lt;br /&gt;
        } else {&lt;br /&gt;
            $error = $session-&amp;gt;get(SecurityContext::AUTHENTICATION_ERROR);&lt;br /&gt;
            $session-&amp;gt;remove(SecurityContext::AUTHENTICATION_ERROR);&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;render(&lt;br /&gt;
            'AcmeSecurityBundle:Security:login.html.twig',&lt;br /&gt;
            array(&lt;br /&gt;
                // last username entered by the user&lt;br /&gt;
                'last_username' =&amp;gt; $session-&amp;gt;get(SecurityContext::LAST_USERNAME),&lt;br /&gt;
                'error'         =&amp;gt; $error,&lt;br /&gt;
            )&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si l'usuari envia un nom d'usuari o contrasenya no vàlids, aquest controlador obté el missatge d'error del sistema de seguretat i ho mostra a l'usuari.&lt;br /&gt;
Tu t'encarregues de mostrar el formulari a l'usuari i els errors que puguin haver ocorregut, però ''el propi sistema de seguretat s'encarrega de verificar el nom d'usuari i contrasenya i l'autenticació de l'usuari''.&lt;br /&gt;
Plantilla del formulari:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/SecurityBundle/Resources/views/Security/login.html.twig #}&lt;br /&gt;
{% if error %}&lt;br /&gt;
    &amp;lt;div&amp;gt;{{ error.message }}&amp;lt;/div&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ path('login_check') }}&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;label for=&amp;quot;username&amp;quot;&amp;gt;Username:&amp;lt;/label&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;username&amp;quot; name=&amp;quot;_username&amp;quot; value=&amp;quot;{{ last_username }}&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;label for=&amp;quot;password&amp;quot;&amp;gt;Password:&amp;lt;/label&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;password&amp;quot; id=&amp;quot;password&amp;quot; name=&amp;quot;_password&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    {#&lt;br /&gt;
        añade lo siguiente si quieres redirigir al usuario a una&lt;br /&gt;
        URL concreta después del login (explicado más adelante)&lt;br /&gt;
        &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;_target_path&amp;quot; value=&amp;quot;/account&amp;quot; /&amp;gt;&lt;br /&gt;
    #}&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;login&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=Webgrafia=&lt;br /&gt;
Els llibres sobre symfony utilitzats per elaborar un resum de les funcionalitats més importants els podeu trobar a : [http://librosweb.es/libros/ http://librosweb.es/libros/]&lt;br /&gt;
&lt;br /&gt;
També s'ha utilitzat el llibre oficial que podeu trobar a la web:[http://symfony.com/doc/current/book/index.html http://symfony.com/]&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7114</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7114"/>
				<updated>2016-05-09T11:52:36Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* Mashups */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://sourceforge.net/projects/nusoap/ | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]][[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
=Mashups=&lt;br /&gt;
&lt;br /&gt;
Una remescla, també coneguda pel terme anglès '''mashup''', és una aplicació web híbrida que utilitza contingut d'altres aplicacions web per a crear un nou contingut complet, consumint serveis directament sempre a través del protocol http.&lt;br /&gt;
&lt;br /&gt;
El contingut d'un mashup normalment prové de llocs web de tercers a través d'una interfície pública o utilitzant una API. Altres mètodes que constitueixen l'origen de les seves dades inclouen: sindicació web (RSS o Atom), screen scraping, etc.&lt;br /&gt;
&lt;br /&gt;
Els mashup estan revolucionant el desenvolupament web de la mateixa manera que els weblogs han revolucionat la publicació en línia. Permeten que qualsevol combini, de forma innovadora, dades que existeixen en diferents pàgines web. Requereixen pocs coneixements tècnics, les API existents són senzilles i potents i els mashup són relativament fàcils de dissenyar. Els creadors de mashups són generalment gent innovadora que vol combinar de formes noves i creatives dades disponibles públicament.&lt;br /&gt;
&lt;br /&gt;
==API de Google Maps==&lt;br /&gt;
A continuació trobareu un llistat amb les funcions més interesant de la API de Googlem maps que podeu utilitzar per realitzar mashups.&lt;br /&gt;
&lt;br /&gt;
Primer heu d'afegir la llibreria de google Maps:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Després heu de un contenidor per al mapa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada teniu el contenidor heu de crear el mapa. Per crea-lo necessiteu informar a l'API de google maps unes quantes propietats:&lt;br /&gt;
* '''center''': Indica on ha de centrar el mapa. S'ha de donar les coordenades de latitud i longitud.&lt;br /&gt;
* '''zoom''': Indica el nivel de ZOOM del mapa. Zomm = 0   mostra la terra sencera.&lt;br /&gt;
* '''mapTypeId''': Indica el tipus de Mapa a mostrar. Existeixen els següents tipus de mapa: ROADMAP, SATELLITE, HYBRID, TERRAIN.&lt;br /&gt;
&lt;br /&gt;
Exemple de les propietats:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
var mapProp = {&lt;br /&gt;
  center:new google.maps.LatLng(51.508742, -0.120850),&lt;br /&gt;
  zoom: 7,&lt;br /&gt;
  mapTypeId: google.maps.MapTypeId.ROADMAP&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha definit les propietats ja es pot crear el mapa i un listener:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;), mapProp);&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de mapa centrat a londres:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function initialize() {&lt;br /&gt;
  var mapProp = {&lt;br /&gt;
    center:new google.maps.LatLng(51.508742,-0.120850),&lt;br /&gt;
    zoom:5,&lt;br /&gt;
    mapTypeId:google.maps.MapTypeId.ROADMAP&lt;br /&gt;
  };&lt;br /&gt;
  var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;),mapProp);&lt;br /&gt;
}&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bé, ja tenim creat el mapa. Potser ens interessa afegir alguna marca dintre del mapa. Aquestes marques s'anomenen '''overlays''' i poden ser de diferents tipus:&lt;br /&gt;
* '''Marker''' - Localitzacions úniques del mapa. Poden tenir icones personalitzats.&lt;br /&gt;
* '''Polyline''' - Series de línies rectes en el mapa&lt;br /&gt;
* '''Polygon''' - Series de línies rectes en el mapa pero la forma resultant ha d'estar tancada.&lt;br /&gt;
* '''Circle and Rectangle'''&lt;br /&gt;
* '''Info Windows''' - Mostra contingut dintre de popups.&lt;br /&gt;
* '''marques personalitzades'''&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//basic:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//Amb animació:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  animation:google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//amb una icona&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  icon:'pinkball.png'&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//amb un poligon&lt;br /&gt;
var myTrip = [stavanger,amsterdam,london,stavanger];&lt;br /&gt;
var flightPath = new google.maps.Polygon({&lt;br /&gt;
  path:myTrip,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb un cercle&lt;br /&gt;
var myCity = new google.maps.Circle({&lt;br /&gt;
  center:amsterdam,&lt;br /&gt;
  radius:20000,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb una finestra d'informacio&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
infowindow.open(map,marker);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
També podem afegir un listener a un marker per, per exemple, obrir un infowindow quan es faci click en ell:&lt;br /&gt;
&amp;lt;source lnag=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
google.maps.event.addListener(marker, 'click', function() {&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de posicionament d'un marker on l'usuari fa click i a més a més afegeix un infowindow:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
google.maps.event.addListener(map, 'click', function(event) {&lt;br /&gt;
  placeMarker(event.latLng);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
function placeMarker(location) {&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: location,&lt;br /&gt;
    map: map,&lt;br /&gt;
  });&lt;br /&gt;
  var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
    content: 'Latitude: ' + location.lat() +&lt;br /&gt;
    '&amp;lt;br&amp;gt;Longitude: ' + location.lng()&lt;br /&gt;
  });&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podeu trobar la referència complerta de la API de google maps [http://www.w3schools.com/googleapi/google_maps_ref.asp | aqui].&lt;br /&gt;
&lt;br /&gt;
== Com trobar les coordenades d'una ciutat ==&lt;br /&gt;
Podeu utilitzar l'API de google per trobar les coordenades d'una ciutat. Pots fer-ho de dues maneres:&lt;br /&gt;
Exemple1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$address = 'india';&lt;br /&gt;
$details_url = &amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=&amp;quot;.$address.&amp;quot;&amp;amp;sensor=falsecurl_init();&lt;br /&gt;
curl_setopt($ch, CURLOPT_URL, $details_url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);&lt;br /&gt;
$response = json_decode(curl_exec($ch), true);&lt;br /&gt;
&lt;br /&gt;
// If Status Code is ZERO_RESULTS, OVER_QUERY_LIMIT, REQUEST_DENIED or INVALID_REQUEST&lt;br /&gt;
if ($response['status'] != 'OK') {&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//print_r($response);&lt;br /&gt;
//print_r($response['results'][0]['geometry']['location']);&lt;br /&gt;
&lt;br /&gt;
$latLng = $response['results'][0]['geometry']['location'];&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng['lat'];&lt;br /&gt;
$lng = $latLng['lng'];	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple2:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$geocode_stats = file_get_contents(&amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=india&amp;amp;sensor=false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$output_deals = json_decode($geocode_stats);&lt;br /&gt;
&lt;br /&gt;
$latLng = $output_deals-&amp;gt;results[0]-&amp;gt;geometry-&amp;gt;location;&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng-&amp;gt;lat;&lt;br /&gt;
$lng = $latLng-&amp;gt;lng;	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7113</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7113"/>
				<updated>2016-05-09T11:37:58Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* API de Google Maps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://sourceforge.net/projects/nusoap/ | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]][[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
=Mashups=&lt;br /&gt;
&lt;br /&gt;
Una remescla, també coneguda pel terme anglès '''mashup''', és una aplicació web híbrida que utilitza contingut d'altres aplicacions web per a crear un nou contingut complet, consumint serveis directament sempre a través del protocol http.&lt;br /&gt;
&lt;br /&gt;
El contingut d'un mashup normalment prové de llocs web de tercers a través d'una interfície pública o utilitzant una API. Altres mètodes que constitueixen l'origen de les seves dades inclouen: sindicació web (RSS o Atom), screen scraping, etc.&lt;br /&gt;
&lt;br /&gt;
Els mashup estan revolucionant el desenvolupament web de la mateixa manera que els weblogs han revolucionat la publicació en línia. Permeten que qualsevol combini, de forma innovadora, dades que existeixen en diferents pàgines web. Requereixen pocs coneixements tècnics, les API existents són senzilles i potents i els mashup són relativament fàcils de dissenyar. Els creadors de mashups són generalment gent innovadora que vol combinar de formes noves i creatives dades disponibles públicament.&lt;br /&gt;
&lt;br /&gt;
==API de Google Maps==&lt;br /&gt;
A continuació trobareu un llistat amb les funcions més interesant de la API de Googlem maps que podeu utilitzar per realitzar mashups.&lt;br /&gt;
&lt;br /&gt;
Primer heu d'afegir la llibreria de google Maps:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Després heu de un contenidor per al mapa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada teniu el contenidor heu de crear el mapa. Per crea-lo necessiteu informar a l'API de google maps unes quantes propietats:&lt;br /&gt;
* '''center''': Indica on ha de centrar el mapa. S'ha de donar les coordenades de latitud i longitud.&lt;br /&gt;
* '''zoom''': Indica el nivel de ZOOM del mapa. Zomm = 0   mostra la terra sencera.&lt;br /&gt;
* '''mapTypeId''': Indica el tipus de Mapa a mostrar. Existeixen els següents tipus de mapa: ROADMAP, SATELLITE, HYBRID, TERRAIN.&lt;br /&gt;
&lt;br /&gt;
Exemple de les propietats:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
var mapProp = {&lt;br /&gt;
  center:new google.maps.LatLng(51.508742, -0.120850),&lt;br /&gt;
  zoom: 7,&lt;br /&gt;
  mapTypeId: google.maps.MapTypeId.ROADMAP&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha definit les propietats ja es pot crear el mapa i un listener:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;), mapProp);&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de mapa centrat a londres:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function initialize() {&lt;br /&gt;
  var mapProp = {&lt;br /&gt;
    center:new google.maps.LatLng(51.508742,-0.120850),&lt;br /&gt;
    zoom:5,&lt;br /&gt;
    mapTypeId:google.maps.MapTypeId.ROADMAP&lt;br /&gt;
  };&lt;br /&gt;
  var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;),mapProp);&lt;br /&gt;
}&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bé, ja tenim creat el mapa. Potser ens interessa afegir alguna marca dintre del mapa. Aquestes marques s'anomenen '''overlays''' i poden ser de diferents tipus:&lt;br /&gt;
* '''Marker''' - Localitzacions úniques del mapa. Poden tenir icones personalitzats.&lt;br /&gt;
* '''Polyline''' - Series de línies rectes en el mapa&lt;br /&gt;
* '''Polygon''' - Series de línies rectes en el mapa pero la forma resultant ha d'estar tancada.&lt;br /&gt;
* '''Circle and Rectangle'''&lt;br /&gt;
* '''Info Windows''' - Mostra contingut dintre de popups.&lt;br /&gt;
* '''marques personalitzades'''&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//basic:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//Amb animació:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  animation:google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//amb una icona&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  icon:'pinkball.png'&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//amb un poligon&lt;br /&gt;
var myTrip = [stavanger,amsterdam,london,stavanger];&lt;br /&gt;
var flightPath = new google.maps.Polygon({&lt;br /&gt;
  path:myTrip,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb un cercle&lt;br /&gt;
var myCity = new google.maps.Circle({&lt;br /&gt;
  center:amsterdam,&lt;br /&gt;
  radius:20000,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb una finestra d'informacio&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
infowindow.open(map,marker);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
També podem afegir un listener a un marker per, per exemple, obrir un infowindow quan es faci click en ell:&lt;br /&gt;
&amp;lt;source lnag=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
google.maps.event.addListener(marker, 'click', function() {&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de posicionament d'un marker on l'usuari fa click i a més a més afegeix un infowindow:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
google.maps.event.addListener(map, 'click', function(event) {&lt;br /&gt;
  placeMarker(event.latLng);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
function placeMarker(location) {&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: location,&lt;br /&gt;
    map: map,&lt;br /&gt;
  });&lt;br /&gt;
  var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
    content: 'Latitude: ' + location.lat() +&lt;br /&gt;
    '&amp;lt;br&amp;gt;Longitude: ' + location.lng()&lt;br /&gt;
  });&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podeu trobar la referència complerta de la API de google maps [http://www.w3schools.com/googleapi/google_maps_ref.asp | aqui].&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7112</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7112"/>
				<updated>2016-05-09T11:36:34Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* API de Google Maps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://sourceforge.net/projects/nusoap/ | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]][[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
=Mashups=&lt;br /&gt;
&lt;br /&gt;
Una remescla, també coneguda pel terme anglès '''mashup''', és una aplicació web híbrida que utilitza contingut d'altres aplicacions web per a crear un nou contingut complet, consumint serveis directament sempre a través del protocol http.&lt;br /&gt;
&lt;br /&gt;
El contingut d'un mashup normalment prové de llocs web de tercers a través d'una interfície pública o utilitzant una API. Altres mètodes que constitueixen l'origen de les seves dades inclouen: sindicació web (RSS o Atom), screen scraping, etc.&lt;br /&gt;
&lt;br /&gt;
Els mashup estan revolucionant el desenvolupament web de la mateixa manera que els weblogs han revolucionat la publicació en línia. Permeten que qualsevol combini, de forma innovadora, dades que existeixen en diferents pàgines web. Requereixen pocs coneixements tècnics, les API existents són senzilles i potents i els mashup són relativament fàcils de dissenyar. Els creadors de mashups són generalment gent innovadora que vol combinar de formes noves i creatives dades disponibles públicament.&lt;br /&gt;
&lt;br /&gt;
==API de Google Maps==&lt;br /&gt;
A continuació trobareu un llistat amb les funcions més interesant de la API de Googlem maps que podeu utilitzar per realitzar mashups.&lt;br /&gt;
&lt;br /&gt;
Primer heu d'afegir la llibreria de google Maps:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Després heu de un contenidor per al mapa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada teniu el contenidor heu de crear el mapa. Per crea-lo necessiteu informar a l'API de google maps unes quantes propietats:&lt;br /&gt;
* '''center''': Indica on ha de centrar el mapa. S'ha de donar les coordenades de latitud i longitud.&lt;br /&gt;
* '''zoom''': Indica el nivel de ZOOM del mapa. Zomm = 0   mostra la terra sencera.&lt;br /&gt;
* '''mapTypeId''': Indica el tipus de Mapa a mostrar. Existeixen els següents tipus de mapa: ROADMAP, SATELLITE, HYBRID, TERRAIN.&lt;br /&gt;
&lt;br /&gt;
Exemple de les propietats:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
var mapProp = {&lt;br /&gt;
  center:new google.maps.LatLng(51.508742, -0.120850),&lt;br /&gt;
  zoom: 7,&lt;br /&gt;
  mapTypeId: google.maps.MapTypeId.ROADMAP&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha definit les propietats ja es pot crear el mapa i un listener:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;), mapProp);&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de mapa centrat a londres:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function initialize() {&lt;br /&gt;
  var mapProp = {&lt;br /&gt;
    center:new google.maps.LatLng(51.508742,-0.120850),&lt;br /&gt;
    zoom:5,&lt;br /&gt;
    mapTypeId:google.maps.MapTypeId.ROADMAP&lt;br /&gt;
  };&lt;br /&gt;
  var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;),mapProp);&lt;br /&gt;
}&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bé, ja tenim creat el mapa. Potser ens interessa afegir alguna marca dintre del mapa. Aquestes marques s'anomenen '''overlays''' i poden ser de diferents tipus:&lt;br /&gt;
* '''Marker''' - Localitzacions úniques del mapa. Poden tenir icones personalitzats.&lt;br /&gt;
* '''Polyline''' - Series de línies rectes en el mapa&lt;br /&gt;
* '''Polygon''' - Series de línies rectes en el mapa pero la forma resultant ha d'estar tancada.&lt;br /&gt;
* '''Circle and Rectangle'''&lt;br /&gt;
* '''Info Windows''' - Mostra contingut dintre de popups.&lt;br /&gt;
* '''marques personalitzades'''&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//basic:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//Amb animació:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  animation:google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//amb una icona&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  icon:'pinkball.png'&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//amb un poligon&lt;br /&gt;
var myTrip = [stavanger,amsterdam,london,stavanger];&lt;br /&gt;
var flightPath = new google.maps.Polygon({&lt;br /&gt;
  path:myTrip,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb un cercle&lt;br /&gt;
var myCity = new google.maps.Circle({&lt;br /&gt;
  center:amsterdam,&lt;br /&gt;
  radius:20000,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb una finestra d'informacio&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
infowindow.open(map,marker);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
També podem afegir un listener a un marker per, per exemple, obrir un infowindow quan es faci click en ell:&lt;br /&gt;
&amp;lt;source lnag=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
google.maps.event.addListener(marker, 'click', function() {&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de posicionament d'un marker on l'usuari fa click i a més a més afegeix un infowindow:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
google.maps.event.addListener(map, 'click', function(event) {&lt;br /&gt;
  placeMarker(event.latLng);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
function placeMarker(location) {&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: location,&lt;br /&gt;
    map: map,&lt;br /&gt;
  });&lt;br /&gt;
  var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
    content: 'Latitude: ' + location.lat() +&lt;br /&gt;
    '&amp;lt;br&amp;gt;Longitude: ' + location.lng()&lt;br /&gt;
  });&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7111</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7111"/>
				<updated>2016-05-09T11:36:01Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* API de Google Maps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://sourceforge.net/projects/nusoap/ | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]][[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
=Mashups=&lt;br /&gt;
&lt;br /&gt;
Una remescla, també coneguda pel terme anglès '''mashup''', és una aplicació web híbrida que utilitza contingut d'altres aplicacions web per a crear un nou contingut complet, consumint serveis directament sempre a través del protocol http.&lt;br /&gt;
&lt;br /&gt;
El contingut d'un mashup normalment prové de llocs web de tercers a través d'una interfície pública o utilitzant una API. Altres mètodes que constitueixen l'origen de les seves dades inclouen: sindicació web (RSS o Atom), screen scraping, etc.&lt;br /&gt;
&lt;br /&gt;
Els mashup estan revolucionant el desenvolupament web de la mateixa manera que els weblogs han revolucionat la publicació en línia. Permeten que qualsevol combini, de forma innovadora, dades que existeixen en diferents pàgines web. Requereixen pocs coneixements tècnics, les API existents són senzilles i potents i els mashup són relativament fàcils de dissenyar. Els creadors de mashups són generalment gent innovadora que vol combinar de formes noves i creatives dades disponibles públicament.&lt;br /&gt;
&lt;br /&gt;
==API de Google Maps==&lt;br /&gt;
A continuació trobareu un llistat amb les funcions més interesant de la API de Googlem maps que podeu utilitzar per realitzar mashups.&lt;br /&gt;
&lt;br /&gt;
Primer heu d'afegir la llibreria de google Maps:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Després heu de un contenidor per al mapa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada teniu el contenidor heu de crear el mapa. Per crea-lo necessiteu informar a l'API de google maps unes quantes propietats:&lt;br /&gt;
* '''center''': Indica on ha de centrar el mapa. S'ha de donar les coordenades de latitud i longitud.&lt;br /&gt;
* '''zoom''': Indica el nivel de ZOOM del mapa. Zomm = 0   mostra la terra sencera.&lt;br /&gt;
* '''mapTypeId''': Indica el tipus de Mapa a mostrar. Existeixen els següents tipus de mapa: ROADMAP, SATELLITE, HYBRID, TERRAIN.&lt;br /&gt;
&lt;br /&gt;
Exemple de les propietats:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
var mapProp = {&lt;br /&gt;
  center:new google.maps.LatLng(51.508742, -0.120850),&lt;br /&gt;
  zoom: 7,&lt;br /&gt;
  mapTypeId: google.maps.MapTypeId.ROADMAP&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha definit les propietats ja es pot crear el mapa i un listener:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;), mapProp);&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de mapa centrat a londres:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function initialize() {&lt;br /&gt;
  var mapProp = {&lt;br /&gt;
    center:new google.maps.LatLng(51.508742,-0.120850),&lt;br /&gt;
    zoom:5,&lt;br /&gt;
    mapTypeId:google.maps.MapTypeId.ROADMAP&lt;br /&gt;
  };&lt;br /&gt;
  var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;),mapProp);&lt;br /&gt;
}&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bé, ja tenim creat el mapa. Potser ens interessa afegir alguna marca dintre del mapa. Aquestes marques s'anomenen '''overlays''' i poden ser de diferents tipus:&lt;br /&gt;
* '''Marker''' - Localitzacions úniques del mapa. Poden tenir icones personalitzats.&lt;br /&gt;
* '''Polyline''' - Series de línies rectes en el mapa&lt;br /&gt;
* '''Polygon''' - Series de línies rectes en el mapa pero la forma resultant ha d'estar tancada.&lt;br /&gt;
* '''Circle and Rectangle'''&lt;br /&gt;
* '''Info Windows''' - Mostra contingut dintre de popups.&lt;br /&gt;
* '''marques personalitzades'''&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//basic:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//Amb animació:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  animation:google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//amb una icona&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  icon:'pinkball.png'&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//amb un poligon&lt;br /&gt;
var myTrip = [stavanger,amsterdam,london,stavanger];&lt;br /&gt;
var flightPath = new google.maps.Polygon({&lt;br /&gt;
  path:myTrip,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb un cercle&lt;br /&gt;
var myCity = new google.maps.Circle({&lt;br /&gt;
  center:amsterdam,&lt;br /&gt;
  radius:20000,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb una finestra d'informacio&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
infowindow.open(map,marker);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
També podem afegir un listener a un marker per, per exemple, obrir un infowindow quan es faci click en ell:&lt;br /&gt;
&amp;lt;source lnag=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
google.maps.event.addListener(marker, 'click', function() {&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de posicionamet d'un marker on lusuari fa click i a més a més afegiex un infowindow:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
google.maps.event.addListener(map, 'click', function(event) {&lt;br /&gt;
  placeMarker(event.latLng);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
function placeMarker(location) {&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: location,&lt;br /&gt;
    map: map,&lt;br /&gt;
  });&lt;br /&gt;
  var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
    content: 'Latitude: ' + location.lat() +&lt;br /&gt;
    '&amp;lt;br&amp;gt;Longitude: ' + location.lng()&lt;br /&gt;
  });&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7110</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7110"/>
				<updated>2016-05-09T11:30:42Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* API de Google Maps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://sourceforge.net/projects/nusoap/ | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]][[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
=Mashups=&lt;br /&gt;
&lt;br /&gt;
Una remescla, també coneguda pel terme anglès '''mashup''', és una aplicació web híbrida que utilitza contingut d'altres aplicacions web per a crear un nou contingut complet, consumint serveis directament sempre a través del protocol http.&lt;br /&gt;
&lt;br /&gt;
El contingut d'un mashup normalment prové de llocs web de tercers a través d'una interfície pública o utilitzant una API. Altres mètodes que constitueixen l'origen de les seves dades inclouen: sindicació web (RSS o Atom), screen scraping, etc.&lt;br /&gt;
&lt;br /&gt;
Els mashup estan revolucionant el desenvolupament web de la mateixa manera que els weblogs han revolucionat la publicació en línia. Permeten que qualsevol combini, de forma innovadora, dades que existeixen en diferents pàgines web. Requereixen pocs coneixements tècnics, les API existents són senzilles i potents i els mashup són relativament fàcils de dissenyar. Els creadors de mashups són generalment gent innovadora que vol combinar de formes noves i creatives dades disponibles públicament.&lt;br /&gt;
&lt;br /&gt;
==API de Google Maps==&lt;br /&gt;
A continuació trobareu un llistat amb les funcions més interesant de la API de Googlem maps que podeu utilitzar per realitzar mashups.&lt;br /&gt;
&lt;br /&gt;
Primer heu d'afegir la llibreria de google Maps:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Després heu de un contenidor per al mapa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada teniu el contenidor heu de crear el mapa. Per crea-lo necessiteu informar a l'API de google maps unes quantes propietats:&lt;br /&gt;
* '''center''': Indica on ha de centrar el mapa. S'ha de donar les coordenades de latitud i longitud.&lt;br /&gt;
* '''zoom''': Indica el nivel de ZOOM del mapa. Zomm = 0   mostra la terra sencera.&lt;br /&gt;
* '''mapTypeId''': Indica el tipus de Mapa a mostrar. Existeixen els següents tipus de mapa: ROADMAP, SATELLITE, HYBRID, TERRAIN.&lt;br /&gt;
&lt;br /&gt;
Exemple de les propietats:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
var mapProp = {&lt;br /&gt;
  center:new google.maps.LatLng(51.508742, -0.120850),&lt;br /&gt;
  zoom: 7,&lt;br /&gt;
  mapTypeId: google.maps.MapTypeId.ROADMAP&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha definit les propietats ja es pot crear el mapa i un listener:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;), mapProp);&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de mapa centrat a londres:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function initialize() {&lt;br /&gt;
  var mapProp = {&lt;br /&gt;
    center:new google.maps.LatLng(51.508742,-0.120850),&lt;br /&gt;
    zoom:5,&lt;br /&gt;
    mapTypeId:google.maps.MapTypeId.ROADMAP&lt;br /&gt;
  };&lt;br /&gt;
  var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;),mapProp);&lt;br /&gt;
}&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bé, ja tenim creat el mapa. Potser ens interessa afegir alguna marca dintre del mapa. Aquestes marques s'anomenen '''overlays''' i poden ser de diferents tipus:&lt;br /&gt;
* '''Marker''' - Localitzacions úniques del mapa. Poden tenir icones personalitzats.&lt;br /&gt;
* '''Polyline''' - Series de línies rectes en el mapa&lt;br /&gt;
* '''Polygon''' - Series de línies rectes en el mapa pero la forma resultant ha d'estar tancada.&lt;br /&gt;
* '''Circle and Rectangle'''&lt;br /&gt;
* '''Info Windows''' - Mostra contingut dintre de popups.&lt;br /&gt;
* '''marques personalitzades'''&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//basic:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//Amb animació:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  animation:google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//amb una icona&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  icon:'pinkball.png'&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//amb un poligon&lt;br /&gt;
var myTrip = [stavanger,amsterdam,london,stavanger];&lt;br /&gt;
var flightPath = new google.maps.Polygon({&lt;br /&gt;
  path:myTrip,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb un cercle&lt;br /&gt;
var myCity = new google.maps.Circle({&lt;br /&gt;
  center:amsterdam,&lt;br /&gt;
  radius:20000,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb una finestra d'informacio&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
infowindow.open(map,marker);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
També podem afegir un listener a un marker per, per exemple, obir un infowindow quan es faci click en ell:&lt;br /&gt;
&amp;lt;source lnag=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
google.maps.event.addListener(marker, 'click', function() {&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7109</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7109"/>
				<updated>2016-05-09T11:24:49Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* API de Google Maps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://sourceforge.net/projects/nusoap/ | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]][[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
=Mashups=&lt;br /&gt;
&lt;br /&gt;
Una remescla, també coneguda pel terme anglès '''mashup''', és una aplicació web híbrida que utilitza contingut d'altres aplicacions web per a crear un nou contingut complet, consumint serveis directament sempre a través del protocol http.&lt;br /&gt;
&lt;br /&gt;
El contingut d'un mashup normalment prové de llocs web de tercers a través d'una interfície pública o utilitzant una API. Altres mètodes que constitueixen l'origen de les seves dades inclouen: sindicació web (RSS o Atom), screen scraping, etc.&lt;br /&gt;
&lt;br /&gt;
Els mashup estan revolucionant el desenvolupament web de la mateixa manera que els weblogs han revolucionat la publicació en línia. Permeten que qualsevol combini, de forma innovadora, dades que existeixen en diferents pàgines web. Requereixen pocs coneixements tècnics, les API existents són senzilles i potents i els mashup són relativament fàcils de dissenyar. Els creadors de mashups són generalment gent innovadora que vol combinar de formes noves i creatives dades disponibles públicament.&lt;br /&gt;
&lt;br /&gt;
==API de Google Maps==&lt;br /&gt;
A continuació trobareu un llistat amb les funcions més interesant de la API de Googlem maps que podeu utilitzar per realitzar mashups.&lt;br /&gt;
&lt;br /&gt;
Primer heu d'afegir la llibreria de google Maps:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Després heu de un contenidor per al mapa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada teniu el contenidor heu de crear el mapa. Per crea-lo necessiteu informar a l'API de google maps unes quantes propietats:&lt;br /&gt;
* '''center''': Indica on ha de centrar el mapa. S'ha de donar les coordenades de latitud i longitud.&lt;br /&gt;
* '''zoom''': Indica el nivel de ZOOM del mapa. Zomm = 0   mostra la terra sencera.&lt;br /&gt;
* '''mapTypeId''': Indica el tipus de Mapa a mostrar. Existeixen els següents tipus de mapa: ROADMAP, SATELLITE, HYBRID, TERRAIN.&lt;br /&gt;
&lt;br /&gt;
Exemple de les propietats:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
var mapProp = {&lt;br /&gt;
  center:new google.maps.LatLng(51.508742, -0.120850),&lt;br /&gt;
  zoom: 7,&lt;br /&gt;
  mapTypeId: google.maps.MapTypeId.ROADMAP&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha definit les propietats ja es pot crear el mapa i un listener:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;), mapProp);&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de mapa centrat a londres:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function initialize() {&lt;br /&gt;
  var mapProp = {&lt;br /&gt;
    center:new google.maps.LatLng(51.508742,-0.120850),&lt;br /&gt;
    zoom:5,&lt;br /&gt;
    mapTypeId:google.maps.MapTypeId.ROADMAP&lt;br /&gt;
  };&lt;br /&gt;
  var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;),mapProp);&lt;br /&gt;
}&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bé, ja tenim creat el mapa. Potser ens interessa afegir alguna marca dintre del mapa. Aquestes marques s'anomenen '''overlays''' i poden ser de diferents tipus:&lt;br /&gt;
* '''Marker''' - Localitzacions úniques del mapa. Poden tenir icones personalitzats.&lt;br /&gt;
* '''Polyline''' - Series de línies rectes en el mapa&lt;br /&gt;
* '''Polygon''' - Series de línies rectes en el mapa pero la forma resultant ha d'estar tancada.&lt;br /&gt;
* '''Circle and Rectangle'''&lt;br /&gt;
* '''Info Windows''' - Mostra contingut dintre de popups.&lt;br /&gt;
* ''marques personalitzades'''&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7108</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7108"/>
				<updated>2016-05-09T11:12:33Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* API de Google Maps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://sourceforge.net/projects/nusoap/ | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]][[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
=Mashups=&lt;br /&gt;
&lt;br /&gt;
Una remescla, també coneguda pel terme anglès '''mashup''', és una aplicació web híbrida que utilitza contingut d'altres aplicacions web per a crear un nou contingut complet, consumint serveis directament sempre a través del protocol http.&lt;br /&gt;
&lt;br /&gt;
El contingut d'un mashup normalment prové de llocs web de tercers a través d'una interfície pública o utilitzant una API. Altres mètodes que constitueixen l'origen de les seves dades inclouen: sindicació web (RSS o Atom), screen scraping, etc.&lt;br /&gt;
&lt;br /&gt;
Els mashup estan revolucionant el desenvolupament web de la mateixa manera que els weblogs han revolucionat la publicació en línia. Permeten que qualsevol combini, de forma innovadora, dades que existeixen en diferents pàgines web. Requereixen pocs coneixements tècnics, les API existents són senzilles i potents i els mashup són relativament fàcils de dissenyar. Els creadors de mashups són generalment gent innovadora que vol combinar de formes noves i creatives dades disponibles públicament.&lt;br /&gt;
&lt;br /&gt;
==API de Google Maps==&lt;br /&gt;
A continuació trobareu un llistat amb les funcions més interesant de la API de Googlem maps que podeu utilitzar per realitzar mashups.&lt;br /&gt;
&lt;br /&gt;
Primer heu d'afegir la llibreria de google Maps:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;HTML&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Després heu de un contenidor per al mapa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada teniu el contenidor heu de crear el mapa. Per crea-lo necessiteu informar a l'API de google maps unes quantes propietats:&lt;br /&gt;
* '''center''': Indica on ha de centrar el mapa. S'ha de donar les coordenades de latitud i longitud.&lt;br /&gt;
* '''zoom''': Indica el nivel de ZOOM del mapa. Zomm = 0   mostra la terra sencera.&lt;br /&gt;
* '''mapTypeId''': Indica el tipus de Mapa a mostrar. Existeixen els següents tipus de mapa: ROADMAP, SATELLITE, HYBRID, TERRAIN.&lt;br /&gt;
&lt;br /&gt;
Exemple de les propietats:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
var mapProp = {&lt;br /&gt;
  center:new google.maps.LatLng(51.508742, -0.120850),&lt;br /&gt;
  zoom: 7,&lt;br /&gt;
  mapTypeId: google.maps.MapTypeId.ROADMAP&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de mapa centrat a londres:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function initialize() {&lt;br /&gt;
  var mapProp = {&lt;br /&gt;
    center:new google.maps.LatLng(51.508742,-0.120850),&lt;br /&gt;
    zoom:5,&lt;br /&gt;
    mapTypeId:google.maps.MapTypeId.ROADMAP&lt;br /&gt;
  };&lt;br /&gt;
  var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;),mapProp);&lt;br /&gt;
}&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7107</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7107"/>
				<updated>2016-05-09T11:12:07Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* API de Google Maps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://sourceforge.net/projects/nusoap/ | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]][[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
=Mashups=&lt;br /&gt;
&lt;br /&gt;
Una remescla, també coneguda pel terme anglès '''mashup''', és una aplicació web híbrida que utilitza contingut d'altres aplicacions web per a crear un nou contingut complet, consumint serveis directament sempre a través del protocol http.&lt;br /&gt;
&lt;br /&gt;
El contingut d'un mashup normalment prové de llocs web de tercers a través d'una interfície pública o utilitzant una API. Altres mètodes que constitueixen l'origen de les seves dades inclouen: sindicació web (RSS o Atom), screen scraping, etc.&lt;br /&gt;
&lt;br /&gt;
Els mashup estan revolucionant el desenvolupament web de la mateixa manera que els weblogs han revolucionat la publicació en línia. Permeten que qualsevol combini, de forma innovadora, dades que existeixen en diferents pàgines web. Requereixen pocs coneixements tècnics, les API existents són senzilles i potents i els mashup són relativament fàcils de dissenyar. Els creadors de mashups són generalment gent innovadora que vol combinar de formes noves i creatives dades disponibles públicament.&lt;br /&gt;
&lt;br /&gt;
==API de Google Maps==&lt;br /&gt;
A continuació trobareu un llistat amb les funcions més interesant de la API de Googlem maps que podeu utilitzar per realitzar mashups.&lt;br /&gt;
&lt;br /&gt;
Primer heu d'afegir la llibreria de google Maps:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;HTML&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Després heu de un contenidor per al mapa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada teniu el contenidor heu de crear el mapa. Per crea-lo necessiteu informar a l'API de google maps unes quantes propietats:&lt;br /&gt;
  * '''center''': Indica on ha de centrar el mapa. S'ha de donar les coordenades de latitud i longitud.&lt;br /&gt;
  * '''zoom''': Indica el nivel de ZOOM del mapa. Zomm = 0   mostra la terra sencera.&lt;br /&gt;
  * '''mapTypeId''': Indica el tipus de Mapa a mostrar. Existeixen els següents tipus de mapa: ROADMAP, SATELLITE, HYBRID, TERRAIN.&lt;br /&gt;
&lt;br /&gt;
Exemple de les propietats:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
var mapProp = {&lt;br /&gt;
  center:new google.maps.LatLng(51.508742, -0.120850),&lt;br /&gt;
  zoom: 7,&lt;br /&gt;
  mapTypeId: google.maps.MapTypeId.ROADMAP&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de mapa centrat a londres:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function initialize() {&lt;br /&gt;
  var mapProp = {&lt;br /&gt;
    center:new google.maps.LatLng(51.508742,-0.120850),&lt;br /&gt;
    zoom:5,&lt;br /&gt;
    mapTypeId:google.maps.MapTypeId.ROADMAP&lt;br /&gt;
  };&lt;br /&gt;
  var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;),mapProp);&lt;br /&gt;
}&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7106</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7106"/>
				<updated>2016-05-09T10:53:43Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* Mashups */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://sourceforge.net/projects/nusoap/ | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]][[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
=Mashups=&lt;br /&gt;
&lt;br /&gt;
Una remescla, també coneguda pel terme anglès '''mashup''', és una aplicació web híbrida que utilitza contingut d'altres aplicacions web per a crear un nou contingut complet, consumint serveis directament sempre a través del protocol http.&lt;br /&gt;
&lt;br /&gt;
El contingut d'un mashup normalment prové de llocs web de tercers a través d'una interfície pública o utilitzant una API. Altres mètodes que constitueixen l'origen de les seves dades inclouen: sindicació web (RSS o Atom), screen scraping, etc.&lt;br /&gt;
&lt;br /&gt;
Els mashup estan revolucionant el desenvolupament web de la mateixa manera que els weblogs han revolucionat la publicació en línia. Permeten que qualsevol combini, de forma innovadora, dades que existeixen en diferents pàgines web. Requereixen pocs coneixements tècnics, les API existents són senzilles i potents i els mashup són relativament fàcils de dissenyar. Els creadors de mashups són generalment gent innovadora que vol combinar de formes noves i creatives dades disponibles públicament.&lt;br /&gt;
&lt;br /&gt;
==API de Google Maps==&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7105</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7105"/>
				<updated>2016-05-09T10:51:11Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* Mashups */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://sourceforge.net/projects/nusoap/ | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]][[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
=Mashups=&lt;br /&gt;
&lt;br /&gt;
Una remescla, també coneguda pel terme anglès ''mashup'', és una aplicació web híbrida que utilitza contingut d'altres aplicacions web per a crear un nou contingut complet, consumint serveis directament sempre a través del protocol http.&lt;br /&gt;
&lt;br /&gt;
El contingut d'una remescla normalment prové de llocs web de tercers a través d'una interfície pública o utilitzant una API. Altres mètodes que constitueixen l'origen de les seves dades inclouen: sindicació web (RSS o Atom), screen scraping, etc.&lt;br /&gt;
&lt;br /&gt;
Les remescles estan revolucionant el desenvolupament web de la mateixa manera que els weblogs han revolucionat la publicació en línia. Permeten que qualsevol combini, de forma innovadora, dades que existeixen en diferents pàgines web. Requereixen pocs coneixements tècnics, les API existents són senzilles i potents i les remescles són relativament fàcils de dissenyar. Els creadors de mashups són generalment gent innovadora que vol combinar de formes noves i creatives dades disponibles públicament.&lt;br /&gt;
&lt;br /&gt;
Així com hi ha remescles molt útils, existeixen altres que no passen de ser només nous o publicitaris, amb una mínima utilitat pràctica. Els defensors i impulsors de les aplicacions Web 2.0 afirmen que les remescles són un exemple d'aquest nou moviment en el qual els usuaris creen, participen i interaccionen activament.&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7104</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7104"/>
				<updated>2016-05-09T10:50:55Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://sourceforge.net/projects/nusoap/ | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]][[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
=Mashups=&lt;br /&gt;
&lt;br /&gt;
Una remescla, també coneguda pel terme anglès mashup, és una aplicació web híbrida que utilitza contingut d'altres aplicacions web per a crear un nou contingut complet, consumint serveis directament sempre a través del protocol http.&lt;br /&gt;
&lt;br /&gt;
El contingut d'una remescla normalment prové de llocs web de tercers a través d'una interfície pública o utilitzant una API. Altres mètodes que constitueixen l'origen de les seves dades inclouen: sindicació web (RSS o Atom), screen scraping, etc.&lt;br /&gt;
&lt;br /&gt;
Les remescles estan revolucionant el desenvolupament web de la mateixa manera que els weblogs han revolucionat la publicació en línia. Permeten que qualsevol combini, de forma innovadora, dades que existeixen en diferents pàgines web. Requereixen pocs coneixements tècnics, les API existents són senzilles i potents i les remescles són relativament fàcils de dissenyar. Els creadors de mashups són generalment gent innovadora que vol combinar de formes noves i creatives dades disponibles públicament.&lt;br /&gt;
&lt;br /&gt;
Així com hi ha remescles molt útils, existeixen altres que no passen de ser només nous o publicitaris, amb una mínima utilitat pràctica. Els defensors i impulsors de les aplicacions Web 2.0 afirmen que les remescles són un exemple d'aquest nou moviment en el qual els usuaris creen, participen i interaccionen activament.&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7102</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7102"/>
				<updated>2016-05-06T16:01:23Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* Obtenir un element del arbre */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://sourceforge.net/projects/nusoap/ | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]][[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7101</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7101"/>
				<updated>2016-05-06T16:01:09Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://sourceforge.net/projects/nusoap/ | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]][[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M7_-_Desenvolupament_web_en_entorn_servidor&amp;diff=7086</id>
		<title>M7 - Desenvolupament web en entorn servidor</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M7_-_Desenvolupament_web_en_entorn_servidor&amp;diff=7086"/>
				<updated>2016-05-04T10:39:59Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* UF4: Serveis web. Pàgines dinàmiques interactives. Webs Híbrids (45h) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== UF1 : Desenvolupament web en entorn servidor (50h) ==&lt;br /&gt;
=== [[NF1 - Llenguatge PHP (35h)]] ===&lt;br /&gt;
=== [[NF2 - Llenguatge JSP (15h)]] ===&lt;br /&gt;
&lt;br /&gt;
== UF2:  Generació dinàmica de pagines web (40h) ==&lt;br /&gt;
=== [[NF1 - Model Vista Controlador (10h)]] ===&lt;br /&gt;
=== [[NF2 - Framework PHP (15h)]] ===&lt;br /&gt;
=== [[NF3 - Framework JSP (15h)]] ===&lt;br /&gt;
&lt;br /&gt;
== UF3:  Tècniques d’accés a dades (30h) ==&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;NF1 -Tècniques d’accés a dades (30h)&amp;lt;/span&amp;gt; ===&lt;br /&gt;
[[A1- Accés a BD amb PHP (10h)]]&lt;br /&gt;
&lt;br /&gt;
[[A2- Framework de capes per a DDBB (20h)]]&lt;br /&gt;
&lt;br /&gt;
== UF4: Serveis web. Pàgines dinàmiques interactives. Webs Híbrids (45h) ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== [[NF1 - Web Services (30h)]] ===&lt;br /&gt;
!--&amp;gt;&lt;br /&gt;
=== [[Serveis Web i Mashups a PHP]] ===&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7085</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7085"/>
				<updated>2016-05-04T10:35:14Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://sourceforge.net/projects/nusoap/ | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]][[Fitxer:wsclient-java12.png|300px]]&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7084</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7084"/>
				<updated>2016-05-04T10:04:57Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://sourceforge.net/projects/nusoap/ | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7083</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7083"/>
				<updated>2016-05-04T09:54:15Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://sourceforge.net/projects/nusoap/ | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
  * '''getProd''' el nom de la funció&lt;br /&gt;
  *&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7082</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7082"/>
				<updated>2016-05-04T09:52:35Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://sourceforge.net/projects/nusoap/ | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7081</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7081"/>
				<updated>2016-05-04T09:40:36Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://sourceforge.net/projects/nusoap/ | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7080</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7080"/>
				<updated>2016-05-04T09:06:37Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7079</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7079"/>
				<updated>2016-05-04T09:06:08Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7078</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7078"/>
				<updated>2016-05-04T09:01:09Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice''' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element '''StockName''' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7077</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7077"/>
				<updated>2016-05-04T08:47:11Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té s'espai de nom sopa a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7076</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7076"/>
				<updated>2016-05-04T08:46:34Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;sourde lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té s'espai de nom sopa a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7075</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=7075"/>
				<updated>2016-05-04T08:26:24Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: Es crea la pàgina amb «=Què són els Serveis Web?= Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wid…».&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes. &lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&amp;lt;!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2-hudson-740-. --&amp;gt;&amp;lt;definitions xmlns:wsu=&amp;quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&amp;quot; xmlns:wsp=&amp;quot;http://www.w3.org/ns/ws-policy&amp;quot; xmlns:wsp1_2=&amp;quot;http://schemas.xmlsoap.org/ws/2004/09/policy&amp;quot; xmlns:wsam=&amp;quot;http://www.w3.org/2007/05/addressing/metadata&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/wsdl/soap/&amp;quot; xmlns:tns=&amp;quot;http://ws/&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns=&amp;quot;http://schemas.xmlsoap.org/wsdl/&amp;quot; targetNamespace=&amp;quot;http://ws/&amp;quot; name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;wsp:Policy wsu:Id=&amp;quot;HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;types&amp;gt;&lt;br /&gt;
        &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;
            &amp;lt;xsd:import namespace=&amp;quot;http://ws/&amp;quot; schemaLocation=&amp;quot;http://localhost:8084/webServiceProject/Hola?xsd=1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
    &amp;lt;/types&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;helloResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;message name=&amp;quot;adeuResponse&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;part name=&amp;quot;parameters&amp;quot; element=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/message&amp;gt;&lt;br /&gt;
    &amp;lt;portType name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/helloRequest&amp;quot; message=&amp;quot;tns:hello&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/helloResponse&amp;quot; message=&amp;quot;tns:helloResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input wsam:Action=&amp;quot;http://ws/Hola/adeuRequest&amp;quot; message=&amp;quot;tns:adeu&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;output wsam:Action=&amp;quot;http://ws/Hola/adeuResponse&amp;quot; message=&amp;quot;tns:adeuResponse&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/portType&amp;gt;&lt;br /&gt;
    &amp;lt;binding name=&amp;quot;HolaPortBinding&amp;quot; type=&amp;quot;tns:Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;wsp:PolicyReference URI=&amp;quot;#HolaPortBindingPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;soap:binding transport=&amp;quot;http://schemas.xmlsoap.org/soap/http&amp;quot; style=&amp;quot;document&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;hello&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
        &amp;lt;operation name=&amp;quot;adeu&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:operation soapAction=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;input&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/input&amp;gt;&lt;br /&gt;
            &amp;lt;output&amp;gt;&lt;br /&gt;
                &amp;lt;soap:body use=&amp;quot;literal&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/output&amp;gt;&lt;br /&gt;
        &amp;lt;/operation&amp;gt;&lt;br /&gt;
    &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;service name=&amp;quot;Hola&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port name=&amp;quot;HolaPort&amp;quot; binding=&amp;quot;tns:HolaPortBinding&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;soap:address location=&amp;quot;http://localhost:8084/webServiceProject/Hola&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/port&amp;gt;&lt;br /&gt;
    &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M7_-_Desenvolupament_web_en_entorn_servidor&amp;diff=7074</id>
		<title>M7 - Desenvolupament web en entorn servidor</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M7_-_Desenvolupament_web_en_entorn_servidor&amp;diff=7074"/>
				<updated>2016-05-04T08:25:50Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* UF4: Serveis web. Pàgines dinàmiques interactives. Webs Híbrids (45h) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== UF1 : Desenvolupament web en entorn servidor (50h) ==&lt;br /&gt;
=== [[NF1 - Llenguatge PHP (35h)]] ===&lt;br /&gt;
=== [[NF2 - Llenguatge JSP (15h)]] ===&lt;br /&gt;
&lt;br /&gt;
== UF2:  Generació dinàmica de pagines web (40h) ==&lt;br /&gt;
=== [[NF1 - Model Vista Controlador (10h)]] ===&lt;br /&gt;
=== [[NF2 - Framework PHP (15h)]] ===&lt;br /&gt;
=== [[NF3 - Framework JSP (15h)]] ===&lt;br /&gt;
&lt;br /&gt;
== UF3:  Tècniques d’accés a dades (30h) ==&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;NF1 -Tècniques d’accés a dades (30h)&amp;lt;/span&amp;gt; ===&lt;br /&gt;
[[A1- Accés a BD amb PHP (10h)]]&lt;br /&gt;
&lt;br /&gt;
[[A2- Framework de capes per a DDBB (20h)]]&lt;br /&gt;
&lt;br /&gt;
== UF4: Serveis web. Pàgines dinàmiques interactives. Webs Híbrids (45h) ==&lt;br /&gt;
=== [[NF1 - Web Services (30h)]] ===&lt;br /&gt;
=== [[Serveis Web i Mashups a PHP]] ===&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M7_-_Planificaci%C3%B3_i_administraci%C3%B3_de_Xarxes&amp;diff=6766</id>
		<title>M7 - Planificació i administració de Xarxes</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M7_-_Planificaci%C3%B3_i_administraci%C3%B3_de_Xarxes&amp;diff=6766"/>
				<updated>2016-04-18T08:38:08Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== UF2: Administració Avançada de Xarxes   ==&lt;br /&gt;
=== [[NF1 - Configuració i administració de commutadors]] ===&lt;br /&gt;
=== [[NF2 - Configuració i administració de routers ]] ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--   !--&amp;gt;&lt;br /&gt;
== UF3: Administració Avançada de Xarxes   ==&lt;br /&gt;
=== [[NF1 - Configuració de Xarxes Virtuals ]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[NF2 - Configuració i administració de protocols dinàmics  ]] ===&lt;br /&gt;
=== [[NF3 - Configuració de l'accés a Internet des d'una LAN  ]] ===&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_PHP_(15h)&amp;diff=6116</id>
		<title>NF2 - Framework PHP (15h)</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_PHP_(15h)&amp;diff=6116"/>
				<updated>2016-03-09T12:32:27Z</updated>
		
		<summary type="html">&lt;p&gt;Asalinas: /* Formularis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introducció a Symfony=&lt;br /&gt;
&amp;lt;div width=&amp;quot;100%&amp;quot; style=&amp;quot;clear:both; &amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:30%;&amp;quot;&amp;gt;&lt;br /&gt;
[[fitxer:symfony.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:70%;&amp;quot;&amp;gt;&lt;br /&gt;
Un framework simplifica el desenvolupament de les aplicacions, ja que automatitza molts dels patrons utilitzats per resoldre les tasques comunes. A més, un framework proporciona estructura al codi font, forçant al desenvolupador a crear codi més llegible i més fàcil de mantenir. Finalment, un framework facilita la programació d'aplicacions, ja que encapsula operacions complexes en instruccions senzilles.&lt;br /&gt;
&lt;br /&gt;
Symfony és un complet framework dissenyat per optimitzar, gràcies a les seves característiques, el desenvolupament de les aplicacions web. Per començar, separa la lògica de negoci, la lògica de servidor i la presentació de l'aplicació web. Proporciona diverses eines i classes encaminades a reduir el temps de desenvolupament d'una aplicació web complexa. A més, automatitza les tasques més comunes, permetent al desenvolupador dedicar-se per complet als aspectes específics de cada aplicació. El resultat de tots aquests avantatges és que no s'ha de reinventar la roda cada vegada que es crea una nova aplicació web.&lt;br /&gt;
&lt;br /&gt;
Symfony està desenvolupat completament amb PHP i ha estat provat amb èxit en llocs com Yahoo! Answers, delicious, DailyMotion i molts altres llocs web de primer nivell. Symfony és compatible amb la majoria de gestors de bases de dades, com MySQL, PostgreSQL, Oracle i SQL Server de Microsoft. Es pot executar tant en plataformes Unix (Unix, Linux, etc.) com en plataformes Windows. A continuació es mostren algunes de les seves característiques.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt; &lt;br /&gt;
=Característiques=&lt;br /&gt;
Symfony es va dissenyar perquè s'ajustés als següents requisits:&lt;br /&gt;
&lt;br /&gt;
*Fàcil d'instal·lar i configurar en la majoria de plataformes (i amb la garantia que funciona correctament en els sistemes Windows i *nix estàndards)&lt;br /&gt;
*Independent del sistema gestor de bases de dades&lt;br /&gt;
*Senzill d'usar en la majoria de casos, però prou flexible com per adaptar-se als casos més complexos&lt;br /&gt;
*Basat en la premissa de &amp;quot;convenir en comptes de configurar&amp;quot;, en la qual el desenvolupador solament ha de configurar allò que no és convencional&lt;br /&gt;
*Segueix la majoria de millors pràctiques i patrons de disseny per a la web&lt;br /&gt;
*Preparat per a aplicacions empresarials i adaptable a les polítiques i arquitectures pròpies de cada empresa, a més de ser prou estable com per desenvolupar aplicacions a llarg termini&lt;br /&gt;
*Codi fàcil de llegir que inclou comentaris de phpDocumentor i que permet un manteniment molt senzill&lt;br /&gt;
*Fàcil d'estendre, la qual cosa permet la seva integració amb llibreries desenvolupades per tercers&lt;br /&gt;
&lt;br /&gt;
Symfony pot ser completament personalitzat per complir amb els requisits de les empreses que disposen de les seves pròpies polítiques i regles per a la gestió de projectes i la programació d'aplicacions. Per defecte incorpora diversos entorns de desenvolupament diferents i inclou diverses eines que permeten automatitzar les tasques més comunes de l'enginyeria del programari:&lt;br /&gt;
&lt;br /&gt;
Les eines que generen automàticament codi han estat dissenyades per fer prototips d'aplicacions i per crear fàcilment la part de gestió de les aplicacions.&lt;br /&gt;
*El framework de desenvolupament de proves unitàries i funcionals proporciona les eines ideals per al desenvolupament basat en proves &amp;quot;test-driven development&amp;quot;).&lt;br /&gt;
*La barra de depuració web simplifica la depuració de les aplicacions, ja que mostra tota la informació que els programadors necessiten sobre la pàgina en la qual estan treballant.&lt;br /&gt;
*La interfície de línia de comandos automatitza la instal·lació de les aplicacions entre servidors.&lt;br /&gt;
*És possible realitzar canvis &amp;quot;en calent&amp;quot; de la configuració (sense necessitat de reiniciar el servidor).&lt;br /&gt;
*El complet sistema de log permet als administradors accedir fins a l'últim detall de les activitats que realitza l'aplicació.&lt;br /&gt;
&lt;br /&gt;
=Desenvolupament ràpid d'aplicacions (RAD)=&lt;br /&gt;
&lt;br /&gt;
Durant molt temps, la programació d'aplicacions web va ser un tasca tediosa i molt lenta. Seguint els cicles habituals de l'enginyeria del programari (com els proposats pel Procés Racional Unificat o Rational Unified Process) el desenvolupament d'una aplicació web no pot començar fins que s'han establert per escrit una sèrie de requisits, s'han creat els diagrames UML Unified Modeling Language) i s'ha produït abundant documentació sobre el projecte. Aquest model es veia afavorit per la baixa velocitat de desenvolupament, la falta de versatilitat dels llenguatges de programació (abans d'executar el programa s'ha de construir, compilar i reiniciar) i sobretot pel fet que els clients no estaven disposats a adaptar-se a altres metodologies.&lt;br /&gt;
&lt;br /&gt;
Avui dia, les empreses reaccionen més ràpidament i els clients canvien d'opinió constantment durant el desenvolupament dels projectes. D'aquesta manera, els equips de desenvolupament han d'adaptar-se a aquestes necessitats i han de poder canviar l'estructura d'una aplicació de forma ràpida. Afortunadament, l'ús de llenguatges de script com Python, Ruby i PHP permeten seguir altres estratègies de programació, com RAD (desenvolupament ràpid d'aplicacions) i el desenvolupament àgil de programari.&lt;br /&gt;
&lt;br /&gt;
Una de les idees centrals d'aquesta metodologia és que el desenvolupament comença al més aviat possible perquè el client pugui revisar un prototip que funciona i pugui indicar el camí a seguir. A partir d'aquí, l'aplicació es desenvolupa de forma iterativa, en la qual cada nova versió incorpora noves funcionalitats i es desenvolupa en un breu espai de temps.&lt;br /&gt;
&lt;br /&gt;
Les conseqüències d'aquestes metodologies per al desenvolupador són nombroses. El programador no ha de pensar sobre les versions futures en incloure una nova funcionalitat. Els mètodes utilitzats han de ser el més senzills i directes possibles. Aquestes idees es resumeixen en el principi denominat ''KISS'': Fes-ho senzill, idiota!''Keep It Simple, Stupid''&lt;br /&gt;
&lt;br /&gt;
Quan es modifiquen els requisits o quan s'afegeix una nova funcionalitat, normalment s'ha de reescriure part del codi existent. Aquest procés es diu refactorización i succeeix sovint durant el desenvolupament d'una aplicació web. El codi sol moure's a altres llocs en funció de la seva naturalesa. Els blocs de codi repetits es refactorizan en un únic lloc, aplicant el principi ''DRY'': No et repeteixis ''Don't Repeat Yourself''.&lt;br /&gt;
&lt;br /&gt;
Per assegurar que l'aplicació segueix funcionant correctament malgrat els canvis constants, es necessita una sèrie de proves unitàries que puguin ser automatitzades. Si estan ben escrites, les proves unitàries permeten assegurar que gens ha deixat de funcionar després d'haver-hi refactorizado part del codi de l'aplicació. Algunes metodologies de desenvolupament d'aplicacions obliguen a escriure les proves abans que el propi codi, la qual cosa es coneix com TDD: desenvolupament basat en proves ''test-driven development.''&lt;br /&gt;
&lt;br /&gt;
Symfony és l'eina ideal pel RAD. De fet, el framework ha estat desenvolupat per una empresa que aplica el RAD als seus propis projectes. Per aquest motiu, aprendre a utilitzar Symfony no és com aprendre un nou llenguatge de programació, sinó que consite a aprendre a prendre les decisions correctes per desenvolupar les aplicacions de forma més efectiva.&lt;br /&gt;
&lt;br /&gt;
=La implementació del MVC que realitza Symfony=&lt;br /&gt;
*La capa del Modelo&lt;br /&gt;
**Abstracció de la base de dades&lt;br /&gt;
**Accés a les dades&lt;br /&gt;
*La capa de la Vista &lt;br /&gt;
**Vista&lt;br /&gt;
**Plantilla&lt;br /&gt;
**Layout&lt;br /&gt;
*La capa del Controlador&lt;br /&gt;
**Controlador frontal&lt;br /&gt;
**Acció&lt;br /&gt;
&lt;br /&gt;
En total són set scripts, la qual cosa semblen molts arxius per obrir i modificar cada vegada que es crea una pàgina. Afortunadament, Symfony simplifica aquest procés. Symfony pren el millor de l'arquitectura MVC i la implementa de manera que el desenvolupament d'aplicacions sigui ràpid i senzill.&lt;br /&gt;
&lt;br /&gt;
En primer lloc, el controlador frontal i el layout són comuns per a totes les accions de l'aplicació. Es poden tenir diversos controladors i diversos layouts, però solament és obligatori tenir un de cada. El controlador frontal és un component que només té codi relatiu al MVC, per la qual cosa no és necessari crear un, ja que Symfony ho genera de forma automàtica.&lt;br /&gt;
&lt;br /&gt;
L'altra bona notícia és que les classes de la capa del model també es generen automàticament, en funció de l'estructura de dades de l'aplicació. El ORM s'encarrega de crear l'esquelet o estructura bàsica de les classes i genera automàticament tot el codi necessari. Quan el ORM troba restriccions de claus foranes (o externes) o quan troba dades de tipus data, crea mètodes especials per accedir i modificar aquestes dades, per la qual cosa la manipulació de dades es converteix en un joc de nens. L'abstracció de la base de dades és completament transparent per al programador, ja que es realitza de forma nativa mitjançant PDO PHP Data Objects). Així, si es canvia el sistema gestor de bases de dades a qualsevol moment, no s'ha de reescriure ni una línia de codi, ja que tan sols és necessari modificar un paràmetre en un arxiu de configuració.&lt;br /&gt;
&lt;br /&gt;
Finalment, la lògica de la vista es pot transformar en un arxiu de configuració senzill, sense necessitat de programar-la.&lt;br /&gt;
&lt;br /&gt;
[[fitxer:mvc-symfony.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Instal·lació de Symfony=&lt;br /&gt;
Utilitzarem la versió de symfony 2.4.&lt;br /&gt;
&lt;br /&gt;
[[Instal·lació de la versió 2.4 de symfony ]] (antic)&lt;br /&gt;
&lt;br /&gt;
[[Instal·lació de la versió LTS 2.8 de symfony ]]&lt;br /&gt;
&lt;br /&gt;
[http://symfony.com/doc/current/index.html Llibre gratuït de symfony2].&lt;br /&gt;
&lt;br /&gt;
Accedeix a la URL:&lt;br /&gt;
http://localhost/m7/web/app.php&lt;br /&gt;
&lt;br /&gt;
'''nota:''' m7 és, en aquest cas, el nomProjecteSymfony utilitzat en la creació del projecte symfony.&lt;br /&gt;
&lt;br /&gt;
Hauries de veure una pàgina com aquesta:&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:symfony2.8_inici.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
==Creació de la primera pàgina:==&lt;br /&gt;
Una vegada executis la línia següent anirà preguntant opcions. Tot per defecte. Al nom del bundle podeu posar: HolaMonBundle&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php app/console generate:bundle --namespace=m7/HolaMon --format=yml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Iniciar el servidor ==&lt;br /&gt;
Symfony pot ser instal·lat dintre d'un servidor apache2 però per entorns de desenvolupament porta un servidor web integrat. Per executar el servidor i poder provar les aplicacions podeu iniciar-lo amb la comanda de terminal:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php app/console server:run&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Si heu engegat el servidor integrat podeu provar la pàgina creada en el punt anterior utilitzant aquesta [http://localhost:8000/ url]&lt;br /&gt;
&lt;br /&gt;
Si teniu apache2 instal·lat, podeu provar la pàgina utilitzant aquesta [http://localhost/m7/web/app.php/ url_apache_m7]&lt;br /&gt;
== Si hi ha un error accedint a la pàgina!!==&lt;br /&gt;
Amb apache2, si en algun moment deixa de funcionar heu de provar de fer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo php app/console cache:clear --env=prod &amp;amp;&amp;amp; sudo php app/console cache:warmup --env=prod&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
i donar-li permisos (una altre vegada) a la carpeta principal (dintre de /var/www/html):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod 777 nomprojecte/ -R&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exercici [opcional]:===&lt;br /&gt;
Utilitzant el servidor web apache2 creeu un virtualhost per poder utilitzar symfony2 directament posant: http://localhost/&lt;br /&gt;
&lt;br /&gt;
=Estructura del projecte: Aplicacions, Mòduls i Accions=&lt;br /&gt;
Symfony considera un projecte com '''un conjunt de serveis i operacions disponibles sota un determinat nom de domini i que comparteixen el mateix model d'objectes'''.&lt;br /&gt;
&lt;br /&gt;
Dins d'un projecte, les operacions s'agrupen de forma lògica en aplicacions. Normalment, una aplicació s'executa de forma independent respecte d'altres aplicacions del mateix projecte. L'habitual és que un projecte contingui dues aplicacions: una per a la part pública i una altra per a la part de gestió, compartint ambdues la mateixa base de dades. També és possible definir projectes que estiguin formats per diversos llocs web petits, cadascun d'ells considerat com una aplicació. En aquest cas, és important tenir en compte que els enllaços entre aplicacions s'han d'indicar de forma absoluta.&lt;br /&gt;
&lt;br /&gt;
Cada aplicació està formada per un o més mòduls. Un mòdul normalment representa&lt;br /&gt;
*a una pàgina web o &lt;br /&gt;
*a un grup de pàgines amb un propòsit relacionat.&lt;br /&gt;
Per exemple, una aplicació podria tenir mòduls com home, articulos, ajuda, carritoCompra, compte, etc.&lt;br /&gt;
&lt;br /&gt;
Els mòduls emmagatzemen les accions, que representen cadascuna de les operacions que es pot realitzar en un mòdul. Per exemple el mòdul ''carretCompra'' pot definir accions com ''afegir'', mostrar i actualitzar. Normalment les accions es descriuen mitjançant verbs. Treballar amb accions és molt similar a treballar amb les pàgines d'una aplicació web tradicional, encara que en aquest cas dues accions diferents poden acabar mostrant la mateixa pàgina (com per exemple l'acció d'afegir un comentari a una entrada d'un blog, que acaba tornant a mostrar la pàgina de l'entrada amb el nou comentari).&lt;br /&gt;
=Estructura de l'arbre de arxius=&lt;br /&gt;
Normalment, tots els projectes web comparteixen el mateix tipus de continguts, com per exemple:&lt;br /&gt;
&lt;br /&gt;
Una base de dades, com MySQL o PostgreSQL&lt;br /&gt;
*Arxiu estàtics (HTML, imatges, arxius de Javascript, fulles d'estils, etc.)&lt;br /&gt;
*Arxius pujats al lloc web per part dels usuaris o els administradors&lt;br /&gt;
*Classes i llibreries PHP&lt;br /&gt;
*Llibreries externes (scripts desenvolupats per tercers)&lt;br /&gt;
*Arxius que s'executen per lots batch files) que normalment són scripts que s'executen via línia de comandos o mitjançant cron&lt;br /&gt;
*Arxius de log (les traces que generen les aplicacions i/o el servidor)&lt;br /&gt;
*Arxius de configuració&lt;br /&gt;
&lt;br /&gt;
Symfony proporciona una estructura en forma d'arbre d'arxius per organitzar de forma lògica tots aquests continguts, a més de ser consistent amb l'arquitectura MVC utilitzada i amb l'agrupació projecto / aplicació / mòdul. Cada vegada que es crea un nou projecte, aplicació o mòdul, es genera de forma automàtica la part corresponent d'aquesta estructura. A més, l'estructura es pot personalitzar completament, per reorganitzar els arxius i directoris o per complir amb les exigències d'organització d'un client.&lt;br /&gt;
&lt;br /&gt;
Encara que es pot canviar, per defecte totes les aplicacions Symfony tenen la mateixa estructura de directoris senzilla (i recomanada):&lt;br /&gt;
&lt;br /&gt;
*'''app/''': conté la configuració de l'aplicació.&lt;br /&gt;
*'''src/''': aquí es troba tot el codi PHP de l'aplicació.&lt;br /&gt;
*'''vendor/''': per convenció aquí es guarden totes les llibreries creades per tercers.&lt;br /&gt;
*'''web/''': est és el directori web arrel i conté tots els arxius que es poden accedir públicament.&lt;br /&gt;
==El directori web==&lt;br /&gt;
El directori web arrel és el lloc on es troben tots els arxius públics i estàtics tals com a imatges, fulles d'estil i arxius Javascript. També és el lloc on es defineixen tots els controladors frontals, com per exemple el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// web/app.php&lt;br /&gt;
require_once __DIR__.'/../app/bootstrap.php.cache';&lt;br /&gt;
require_once __DIR__.'/../app/AppKernel.php';&lt;br /&gt;
 &lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
 &lt;br /&gt;
$kernel = new AppKernel('prod', false);&lt;br /&gt;
$kernel-&amp;gt;loadClassCache();&lt;br /&gt;
$kernel-&amp;gt;handle(Request::createFromGlobals())-&amp;gt;send();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'arxiu del controlador frontal ('''app.php''' en aquest exemple) és l'arxiu PHP que realment s'executa quan utilitzes una aplicació Symfony2 i el seu treball consisteix a arrencar l'aplicació utilitzant una classe del nucli ('''AppKernel''').&lt;br /&gt;
&lt;br /&gt;
Tenir un controlador frontal significa que s'utilitzen URL diferents i més flexibles que les d'una aplicació PHP típica. Quan es disposa d'un controlador frontal, les URL es formaten de la següent manera:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://localhost/app.php/hello/Ryan&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
El controlador frontal, '''app.php''', s'executa i la URL interna: ''/hello/Ryan'' es dirigeix internament segons la configuració d'encaminament.&lt;br /&gt;
&lt;br /&gt;
Si a més utilitzes el mòdul '''mod_rewrite''' d'Apache, pots forçar l'execució de l'arxiu '''app.php''' sense necessitat d'incloure-ho en la URL, per la qual cosa així les URL són encara més netes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://localhost/hello/Ryan&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==El directori de l'aplicació (app)==&lt;br /&gt;
La classe '''AppKernel''' és el punt d'entrada principal de l'aplicació i és la responsable de tota la configuració. Com a tal, s'emmagatzema en el directori '''app/'''.&lt;br /&gt;
&lt;br /&gt;
Aquesta classe ha d'implementar dos mètodes que defineixen tot el que Symfony necessita saber sobre la teva aplicació. Ni tan sols has de preocupar-te d'aquests mètodes durant l'arrencada — Symfony els emplena per tu amb paràmetres predeterminats.&lt;br /&gt;
&lt;br /&gt;
*'''registerBundles()''': retorna un array amb tots els bundles necessaris per executar l'aplicació.&lt;br /&gt;
*'''registerContainerConfiguration()''': carrega l'arxiu de configuració de recursos de l'aplicació (consulta la secció Configurant l'aplicació).&lt;br /&gt;
Durant el desenvolupament d'una aplicació, normalment el directori '''app/''' solament els utilitzes per modificar la configuració i els arxius d'encaminament en el directori '''app/config/'''.&lt;br /&gt;
&lt;br /&gt;
Aquest directori també conté el directori '''caché''' de l'aplicació (app/cache), un directori de '''logs''' (app/logs) i un directori per a arxius de '''recursos globals''', tals com a plantilles (app/Resources).&lt;br /&gt;
&lt;br /&gt;
'''Carga automàtica'''&lt;br /&gt;
En arrencar Symfony, s'inclou un arxiu especial anomenat ''vendor/autoload.php''. Aquest arxiu, creat per ''Composer'', s'encarrega de configurar el carregador automàtic de classes, que al seu torn '''carrega automàticament tots els arxius''' de la teva aplicació que es trobin '''en el directori src/''' i '''totes les llibreries externes''' configurades en l'arxiu '''composer.json'''.&lt;br /&gt;
&lt;br /&gt;
Gràcies al carregador automàtic, '''mai hauràs de preocupar-te d'usar declaracions include o require'''. Això és possible perquè Composer utilitza namespace o espai de noms d'una classe per determinar la seva ubicació i així '''inclou automàticament l'arxiu en l'instant en què necessites una classe'''.&lt;br /&gt;
&lt;br /&gt;
El carregador automàtic '''ja està configurat per buscar qualsevol de les teves classes PHP en el directori src/'''. Perquè funcioni la càrrega automàtica, el nom de la classe i la ruta de l'arxiu '''han de seguir el mateix patró''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Nom de la classe: Acme\HelloBundle\Controller\HelloController&lt;br /&gt;
Ruta física de l'arxiu: src/Acme/HelloBundle/Controller/HelloController.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Configuració de l'aplicació ==&lt;br /&gt;
Segons el lloc web oficial de YAML (http://www.yaml.org/), YAML és &amp;quot;un estàndard per serializar dades en qualsevol llenguatge de programació i amb un format fàcil de llegir per part de les persones&amp;quot;. Dit d'una altra forma, YAML és un llenguatge molt senzill que permet descriure les dades com en XML, però amb una sintaxi molt més senzilla. YAML és un format especialment útil per descriure dades que poden ser transformats en arrays simples i associatius, com per exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$casa = array(&lt;br /&gt;
  'familia' =&amp;gt; array(&lt;br /&gt;
    'apellido'  =&amp;gt; 'García',&lt;br /&gt;
    'padres'  =&amp;gt; array('Antonio', 'María'),&lt;br /&gt;
    'hijos'   =&amp;gt; array('Jose', 'Manuel', 'Carmen')&lt;br /&gt;
  ),&lt;br /&gt;
  'direccion' =&amp;gt; array(&lt;br /&gt;
    'numero'        =&amp;gt; 34,&lt;br /&gt;
    'calle'         =&amp;gt; 'Gran Vía',&lt;br /&gt;
    'ciudad'        =&amp;gt; 'Cualquiera',&lt;br /&gt;
    'codigopostal'  =&amp;gt; '12345'&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//format yml:&lt;br /&gt;
casa:&lt;br /&gt;
  familia:&lt;br /&gt;
    apellido: García&lt;br /&gt;
    padres:&lt;br /&gt;
      - Antonio&lt;br /&gt;
      - María&lt;br /&gt;
    hijos:&lt;br /&gt;
      - Jose&lt;br /&gt;
      - Manuel&lt;br /&gt;
      - Carmen&lt;br /&gt;
  direccion:&lt;br /&gt;
    numero: 34&lt;br /&gt;
    calle: Gran Vía&lt;br /&gt;
    ciudad: Cualquiera&lt;br /&gt;
    codigopostal: &amp;quot;12345&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
YAML és l'acrònim de &amp;quot;YAML Ain't Markup Language&amp;quot; (&amp;quot;YAML No és un Llenguatge de Marcat&amp;quot;) i es pronuncia &amp;quot;yamel&amp;quot;. El format es porta utilitzant des de 2001 i existeixen utilitats per processar YAML en una gran varietat de llenguatges de programació.&lt;br /&gt;
&lt;br /&gt;
YAML és molt més ràpid d'escriure que XML (ja que no fan falta les etiquetes de tancament i l'ús continu de les cometes) i és molt més poderós que els tradicionals arxius .ini (ja que aquests últims no suporten l'herència i les estructures complexes). Per aquest motiu, Symfony utilitza el format YAML com el llenguatge preferit per emmagatzemar la seva configuració.&lt;br /&gt;
&lt;br /&gt;
Per saber més sobre aquest format pots consultar la [http://symfony.com/legacy/doc/reference/1_4/en/02-YAML següent] pàgina web.&lt;br /&gt;
==El directori font (src)==&lt;br /&gt;
El directori '''src/''' conté tot el codi real (codi PHP, plantilles, arxius de configuració, estils, etc.) que pertany a la teva aplicació. De fet, en programar una aplicació Symfony, la major part del teu treball es durà a terme dins d'un o més''' bundles '''creats en aquest directori.&lt;br /&gt;
&lt;br /&gt;
=Els Bundles=&lt;br /&gt;
[[Els bundles a symfony 2.]]&lt;br /&gt;
&lt;br /&gt;
=Entorn de desenvolupament i entorn de producció=&lt;br /&gt;
Una aplicació pot funcionar en diversos entorns. Els diferents entorns comparteixen el mateix codi PHP (solament és diferent el controlador frontal), però usen una configuració diferent. Per exemple, un entorn de desenvolupament '''dev''' guarda els advertiments i errors, mentre que un entorn de producció '''prod''' només registra els errors. Alguns arxius es tornen a generar en cada petició en l'entorn '''dev''' (para major comoditat dels desenvolupadors), però s'escorcollen en l'entorn '''prod'''. Tots els entorns es troben en la mateixa màquina i executen la mateixa aplicació.&lt;br /&gt;
&lt;br /&gt;
Un projecte Symfony2 '''normalment comença amb tres entorns (dev, test i prod)''', encara que resulta senzill crear nous entorns.''' Pots veure la teva aplicació en diferents entorn''' amb només '''canviar el controlador frontal'''en el teu navegador. Per veure l'aplicació en l'entorn '''dev''', accedeix a l'aplicació a través del controlador frontal de desenvolupament:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://localhost/app_dev.php/hola&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Si desitges veure com es comportarà la teva aplicació a l'entorn de producció, utilitza en el seu lloc el controlador frontal '''prod''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://localhost/app.php/hola&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Si fas qualsevol canvi en les plantilles, no ho veuràs en l'entorn prod tret que esborris la cache de l'aplicació i així forcis a Symfony a tornar a compilar les plantilles. Per esborrar la cache de l'entorn de producció, executa la següent comanda de consola:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo php app/console cache:clear --env=prod &amp;amp;&amp;amp; sudo php app/console cache:warmup --env=prod&lt;br /&gt;
i donar-li permísos:&lt;br /&gt;
chmod 777 nomprojecte/ -R&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=El controlador=&lt;br /&gt;
Un controlador és una funció PHP creada per tu i que s'encarrega d'obtenir la informació de la petició HTTP i de generar i retornar la resposta HTTP (en forma d'objecte de tipus Response de Symfony2).&lt;br /&gt;
La resposta pot ser:&lt;br /&gt;
*una pàgina HTML,&lt;br /&gt;
*un document XML, &lt;br /&gt;
*un array JSON serializado, &lt;br /&gt;
*una imatge, &lt;br /&gt;
*una redirecció a una altra pàgina, &lt;br /&gt;
*un error de tipus 404 &lt;br /&gt;
*o qualsevol altra cosa que se t'ocorri. &lt;br /&gt;
El controlador conté tota la lògica que la teva aplicació necessita per generar el contingut de la pàgina. L'objectiu d'un controlador sempre és el mateix: crear i retornar un objecte '''Response'''.&lt;br /&gt;
==Cicle de vida d'una petició==&lt;br /&gt;
* 1.Cada petició és tractada per un únic arxiu: el controlador frontal (per exemple, '''app.php''' o '''app_dev.php''') el qual és responsable d'iniciar l'aplicació.&lt;br /&gt;
* 2. El sistema d'encaminament (classe Routing) llegeix la informació de la petició (per exemple, la URI), troba una ruta que coincideixi amb aquesta informació, i llegeix el paràmetre '''_controller''' de la ruta.&lt;br /&gt;
* 3. S'executa el controlador assignat a la ruta i aquest controlador crea i retorna un objecte '''Response'''.&lt;br /&gt;
* 4. Les capçaleres HTTP i el contingut de l'objecte Response s'envien de tornada al client.&lt;br /&gt;
&lt;br /&gt;
Exemple de controlador:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/HelloBundle/Controller/HelloController.php&lt;br /&gt;
 &lt;br /&gt;
namespace Acme\HelloBundle\Controller;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Response;&lt;br /&gt;
 &lt;br /&gt;
class HelloController&lt;br /&gt;
{&lt;br /&gt;
    public function indexAction()&lt;br /&gt;
    {&lt;br /&gt;
      return new Response('&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;Hello world!&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Associant una URI a un controlador==&lt;br /&gt;
El nou controlador retorna una pàgina HTML simple. Per poder provar realment aquesta pàgina en el teu navegador, has de crear una ruta que el seu path sigui la URI que vols associar al controlador al fitxer '''routing.yml''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
hello:&lt;br /&gt;
    path:         /hello&lt;br /&gt;
    defaults:     { _controller: AcmeHelloBundle:Hello:index }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Observa la sintaxi utilitzada per referir-se al controlador: '''AcmeHelloBundle:Hello:index'''. Symfony2 utilitza aquesta notació curta per referir-se als controladors. Es tracta de la '''sintaxi recomanada''' i li diu a Symfony2 que busqui una '''classe controlador anomenada HelloController''' dins d'un '''paquet''' anomenat''' AcmeHelloBundle '''i que després '''executi el mètode indexAction()'''.&lt;br /&gt;
&lt;br /&gt;
'''Passar arguments al mètode del controlador'''&lt;br /&gt;
Exemple de controlador amb un argument en un dels seus mètodes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// src/Acme/HelloBundle/Controller/HelloController.php&lt;br /&gt;
 &lt;br /&gt;
namespace Acme\HelloBundle\Controller;&lt;br /&gt;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;&lt;br /&gt;
 &lt;br /&gt;
class HelloController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function indexAction($name)&lt;br /&gt;
    {&lt;br /&gt;
      // ...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El controlador anterior té un sol argument, anomenat '''$name''', el valor del qual correspon al paràmetre '''{name}''' de la ruta associada. De fet, quan executes el teu controlador, Symfony2 associa cada argument del controlador amb un paràmetre de la ruta. &lt;br /&gt;
L'arxiu d'enrutament hauria de ser aquest:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
hello:&lt;br /&gt;
    path:         /hello&lt;br /&gt;
    defaults:     { _controller: AcmeHelloBundle:Hello:index }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Considera el següent exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/routing.yml&lt;br /&gt;
hello:&lt;br /&gt;
    path:         /hello/{firstName}/{lastName}&lt;br /&gt;
    defaults:     { _controller: AcmeHelloBundle:Hello:index, color: green }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function indexAction($firstName, $lastName, $color)&lt;br /&gt;
{&lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les variables '''{firstName}''' i '''{lastName}''' de la ruta es diuen '''placeholders''', ja que &amp;quot;guarden el lloc&amp;quot; perquè qualsevol valor substitueixi aquesta variable. D'altra banda, la variable '''color''' és una variable de '''tipus default''', ja que el seu valor sempre '''està definit per a totes les rutes'''.&lt;br /&gt;
Existeixen regles amb els arguments (paràmetres):&lt;br /&gt;
*Cada argument obligatori del controlador ha de tenir associat un paràmetre en la ruta&lt;br /&gt;
*No tots els paràmetres de la ruta han de ser arguments en el teu controlador&lt;br /&gt;
*és perfectament vàlid fer que l'argument sigui opcional.&lt;br /&gt;
&lt;br /&gt;
El següent exemple no llançarà una excepció:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function indexAction($firstName, $lastName, $color, $foo = 'bar')&lt;br /&gt;
{&lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==objecte Request com a argument del controlador==&lt;br /&gt;
Sol ser molt útil disposar en el controlador de l'objecte '''Request''' associat a la petició de l'usuari, especialment quan treballes amb formularis. Per fer que Symfony passi aquest objecte automàticament com a argument del controlador, utilitza el següent codi:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
 &lt;br /&gt;
public function updateAction(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    $form = $this-&amp;gt;createForm(...);&lt;br /&gt;
 &lt;br /&gt;
    $form-&amp;gt;handleRequest($request);&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Generador de controladors==&lt;br /&gt;
Si el que volem és generar un nou controlador a la nostra aplicació podem automatitzar el procés utilitzant la següent comanda:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php app/console generate:controller&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aquesta comanda et demanarà tota la informació necessaria per crear el controlador i els '''actions''' (mètodes) necessaris que podràs utilitzar en el fitxer de rutes. Tant si utilitzes la comanda com si no la utilitzes, sempre podràs canviar la classe generada com tu prefereixis.&lt;br /&gt;
= Encaminament =&lt;br /&gt;
Una ruta és una associació entre un patró d'URL i un controlador. Suposem per exemple que desitges associar URL de tipus ''/blog/el meu-post'' o ''/blog/tot-sobre-symfony'' amb un controlador que sigui capaç de buscar i mostrar l'article sol·licitat.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/routing.yml&lt;br /&gt;
blog_show:&lt;br /&gt;
    path:      /blog/{slug}&lt;br /&gt;
    defaults:  { _controller: AcmeBlogBundle:Blog:show }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Codi PHP del controlador associat a aquesta ruta:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/BlogBundle/Controller/BlogController.php&lt;br /&gt;
 &lt;br /&gt;
namespace Acme\BlogBundle\Controller;&lt;br /&gt;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;&lt;br /&gt;
 &lt;br /&gt;
class BlogController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function showAction($slug)&lt;br /&gt;
    {&lt;br /&gt;
        $blog = // usa la variable $slug para consultar la base de datos&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;render('AcmeBlogBundle:Blog:show.html.twig', array(&lt;br /&gt;
            'blog' =&amp;gt; $blog,&lt;br /&gt;
        ));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquest és l'objectiu del encaminador de Symfony2: associar la URL d'una petició a un controlador&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objectiu del sistema d'encaminament de Symfony2 és analitzar aquesta URL i determinar què controlador s'ha d'executar. El procés complet consta dels següents passos:&lt;br /&gt;
*La petició es processa en el controlador frontal de Symfony2 (per exemple, en l'arxiu''' app.php''').&lt;br /&gt;
*El nucli de Symfony2 (conegut com kernel) sol·licita al enrutador que examini la petició.&lt;br /&gt;
*El enrutador busca què patró de les rutes de l'aplicació coincideix amb la URL entrant i retorna informació sobre la ruta, incloent el controlador que s'ha d'executar.&lt;br /&gt;
*El nucli de Symfony2 executa el controlador, que en última instància, retorna un objecte '''Response'''.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:funcionament-routing.png]]&lt;br /&gt;
&lt;br /&gt;
== Prefix a les rutes ==&lt;br /&gt;
&lt;br /&gt;
Resulta habitual haver d'afegir un prefix a totes les rutes importades des d'un arxiu extern. Si vols per exemple que el patró de la ruta '''acme_hello''' sigui '''/admin/hello/{name}''' en comptes de''' /hello/{name}''', afegeix l'opció prefix en importar les rutes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yml&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/routing.yml&lt;br /&gt;
acme_hello:&lt;br /&gt;
    resource: &amp;quot;@AcmeHelloBundle/Resources/config/routing.yml&amp;quot;&lt;br /&gt;
    prefix:   /admin&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
El valor indicat en l'opció prefix (en aquest cas '''/admin''') s'afegeix per davant de tots els patrons de les rutes importades des de l'arxiu extern.&lt;br /&gt;
&lt;br /&gt;
= Sessions a Symfony2=&lt;br /&gt;
&lt;br /&gt;
Symfony2 inclou un objecte de sessió que permet emmagatzemar informació persistent sobre l'usuari, és a dir, informació que es guarda d'una petició a una altra. Per defecte Symfony2 emmagatzema la informació en una cookie usant les sessions natives de PHP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
 &lt;br /&gt;
public function indexAction(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    $session = $request-&amp;gt;getSession();&lt;br /&gt;
 &lt;br /&gt;
    // guarda un atributo para reutilizarlo durante una&lt;br /&gt;
    // petición posterior del usuario&lt;br /&gt;
    $session-&amp;gt;set('foo', 'bar');&lt;br /&gt;
 &lt;br /&gt;
    // obtener el valor de un atributo de la sesión&lt;br /&gt;
    $foo = $session-&amp;gt;get('foo');&lt;br /&gt;
 &lt;br /&gt;
    // utilizar un valor por defecto si el atributo no existe&lt;br /&gt;
    $filters = $session-&amp;gt;get('filters', array());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Plantilles TWIG=&lt;br /&gt;
Una plantilla és un arxiu de text que pot generar qualsevol altre format basat en text (HTML, XML, CSV, LaTeX, etc.). Les plantilles PHP són les més populars, com la qual mostra el següent exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
    &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;¡Bienvenido a Symfony!&amp;lt;/title&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;&amp;lt;?php echo $page_title ?&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;ul id=&amp;quot;navigation&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;?php foreach ($navigation as $item): ?&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;&amp;lt;?php echo $item-&amp;gt;getHref() ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;?php echo $item-&amp;gt;getCaption() ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/a&amp;gt;&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Symfony2 inclou un llenguatge de plantilles anomenat '''Twig''' que és molt més potent i elegant que PHP. Gràcies a Twig pots crear plantilles molt concises i fàcils de llegir, per la qual cosa a més són fàcils d'entendre per part dels dissenyadors web. Observa el mateix exemple anterior definit com a plantilla Twig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
    &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;¡Bienvenido a Symfony!&amp;lt;/title&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;{{ page_title }}&amp;lt;/h1&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;ul id=&amp;quot;navigation&amp;quot;&amp;gt;&lt;br /&gt;
            {% for item in navigation %}&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;{{ item.href }}&amp;quot;&amp;gt;{{ item.caption }}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
            {% endfor %}&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Twig es basa en dues etiquetes especials:&lt;br /&gt;
&lt;br /&gt;
*'''{ { ... } }''': serveix per mostrar el contingut d'una variable o el resultat de realitzar alguna operació o processar alguna expressió. En PHP la construcció equivalent és ''echo'' o ''print''.&lt;br /&gt;
*'''{% ... %}''': serveix per definir la lògica de la plantilla, és a dir, la part de programació que controla com es mostren els continguts de la plantilla. Entre uns altres, aquesta etiqueta s'empra per a les instruccions ''if'' i per als bucles ''for''.&lt;br /&gt;
&lt;br /&gt;
==Herència de plantilles i layout==&lt;br /&gt;
Normalment les plantilles d'un mateix projecte comparteixen molts elements comuns, com per exemple la capçalera, el peu de pàgina, una barra lateral, etc. Symfony2 resol aquest problema de forma molt senzilla: una plantilla pot decorar el contingut d'una altra plantilla.&lt;br /&gt;
&lt;br /&gt;
La idea és exactament la mateixa que l'herència de classes PHP: l'herència de plantilles et permet crear una plantilla basi cridada layout i que conté tots els elements comuns del lloc definits com a blocs. Després, les plantilles filla hereten del layout i emplenen o modifiquen aquests blocs.&lt;br /&gt;
&lt;br /&gt;
En primer lloc, crea un arxiu amb el teu disseny base:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# app/Resources/views/base.html.twig #}&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
    &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=utf-8&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;{% block title %}Test Application{% endblock %}&amp;lt;/title&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;sidebar&amp;quot;&amp;gt;&lt;br /&gt;
            {% block sidebar %}&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
                &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/blog&amp;quot;&amp;gt;Blog&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
            {% endblock %}&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;div id=&amp;quot;contenido&amp;quot;&amp;gt;&lt;br /&gt;
            {% block body %}{% endblock %}&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Aquesta plantilla defineix l'esquelet d'una pàgina HTML simple de dues columnes. En aquest exemple, '''es defineixen tres blocs amb l'etiqueta {% block %} (title, sidebar i body)'''. Les '''plantilles filla''' poden '''modificar''' els continguts de cadascun dels '''blocs'' o deixar-los tal com estan en la plantilla base.&lt;br /&gt;
&lt;br /&gt;
El següent exemple mostra l'aspecte d'una plantilla filla:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/BlogBundle/Resources/views/Blog/index.html.twig #}&lt;br /&gt;
{% extends '::base.html.twig' %}&lt;br /&gt;
 &lt;br /&gt;
{% block title %}My cool blog posts{% endblock %}&lt;br /&gt;
 &lt;br /&gt;
{% block body %}&lt;br /&gt;
    {% for entry in blog_entries %}&lt;br /&gt;
        &amp;lt;h2&amp;gt;{{ entry.title }}&amp;lt;/h2&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;{{ entry.body }}&amp;lt;/p&amp;gt;&lt;br /&gt;
    {% endfor %}&lt;br /&gt;
{% endblock %}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La clau de l'herència de plantilles és l'etiqueta '''{% extends %}'''. D'aquesta forma el motor de plantilles sap que primer ha de processar la plantilla base, que defineix el disseny de la pàgina i crea diversos blocs de continguts. Després es renderitza la plantilla filla, que reemplaça el contingut dels blocs '''title''' i '''body''' del pare.&lt;br /&gt;
&lt;br /&gt;
Quan treballis amb l'herència de plantilles, tingues en compte:&lt;br /&gt;
*Si inclous l'etiqueta '''{% extends %}''' en una plantilla, aquesta ha de ser la primera etiqueta d'aquesta plantilla.&lt;br /&gt;
*Quantes més etiquetes '''{% block %}''' tinguis en la teva plantilla basi, millor. Recorda que les plantilles filla no tenen l'obligació d'emplenar tots els blocs dels pares, per la qual cosa pots definir tants blocs com vulguis i assignar a cadascun un valor per defecte que sigui lògic per a la major part de les pàgines del lloc. Quants més blocs defineixi el layout, més flexible serà el seu disseny.&lt;br /&gt;
*Si còpies i pegues algun contingut en diverses plantilles, segurament serà millor que moguis aquest contingut a algun bloc del layout. En altres casos el millor és col·locar aquest contingut en alguna altra plantilla i incloure-la amb l'etiqueta '''include''' sempre que sigui necessari.&lt;br /&gt;
*Si vols obtenir el contingut d'algun bloc de la plantilla pare, utilitza la funció''' { { parent() } }'''. Això és molt útil quan vols afegir continguts propis a qualsevol altre contingut que el pare pugui haver definit per a aquest bloc:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{% block sidebar %}&lt;br /&gt;
    &amp;lt;h3&amp;gt;Table of Contents&amp;lt;/h3&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    {# ... #}&lt;br /&gt;
 &lt;br /&gt;
    {{ parent() }}&lt;br /&gt;
{% endblock %}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Localització de les plantilles==&lt;br /&gt;
Les plantilles es troben en dos llocs diferents:&lt;br /&gt;
&lt;br /&gt;
*'''app/Resources/views/''': el directori on s'emmagatzemen les plantilles globals de l'aplicació, com per exemple la plantilla del layout i les plantilles utilitzades per redefinir les plantilles incloses en els bundles de Symfony2.&lt;br /&gt;
*'''ruta/fins a/el/bundle/Resources/views/''': els bundles emmagatzemen les seves pròpies plantilles en el directori '''Resources/views/''' de cada bundle. La immensa majoria de les plantilles s'emmagatzemen dins d'algun bundle.&lt;br /&gt;
Symfony2 identifica a cada plantilla amb la sintaxi especial '''bundle:controlador:plantilla'''. Això permet definir diferents tipus de plantilla, cadascuna emmagatzemada en un lloc diferent:&lt;br /&gt;
&lt;br /&gt;
'''AcmeBlogBundle:Blog:index.html.twig''': indica la plantilla d'una pàgina específica. Est és el significat de cadascuna de les tres parts de la cadena:&lt;br /&gt;
*'''AcmeBlogBundle''': (bundle) la plantilla es troba dins del bundle '''AcmeBlogBundle''' (per exemple, ''src/Acme/BlogBundle'').&lt;br /&gt;
*'''Blog''': (controlador) indica que la plantilla s'emmagatzema en el subdirectori Blog de '''Resources/views'''.&lt;br /&gt;
*'''index.html.twig''': (plantilla) el nom de l'arxiu que guarda la plantilla és '''index.html.twig'''. Suposant que '''AcmeBlogBundle''' es trobi en '''src/Acme/BlogBundle''', la ruta completa de la plantilla seria '''src/Acme/BlogBundle/Resources/views/Blog/index.html.twig'''.&lt;br /&gt;
&lt;br /&gt;
*'''AcmeBlogBundle::layout.html.twig''': indica que és una plantilla global del bundle indicat. Com a falta la part central que es refereix al controlador, aquesta plantilla '''no es troba''' dins de cap subdirectori de '''Resources/views/'''. En altres paraules, '''la ruta '''completa de la plantilla és '''Resources/views/layout.html.twig''' dins del bundle AcmeBlogBundle.&lt;br /&gt;
*'''::base.html.twig''': indica que és una plantilla global de l'aplicació. Observa que la cadena comença amb dos parells de dos punts '''(::)''', per la qual cosa falta la part del bundle i la del controlador. En altres paraules, aquesta plantilla no es troba en cap bundle sinó directament dins de '''app/Resources/views/'''.&lt;br /&gt;
&lt;br /&gt;
== Etiquetes Twig==&lt;br /&gt;
===Incloent unes altres plantilles===&lt;br /&gt;
Resulta habitual voler incloure la mateixa plantilla o fragment de codi a diverses pàgines diferents. Si l'aplicació té per exemple un llistat d'articles, el codi de la plantilla que mostra un article es pot utilitzar a la pàgina de detall de l'article, en una pàgina que mostra els articles més populars, o en una llista dels articles més recents.&lt;br /&gt;
&lt;br /&gt;
En PHP, quan necessites reutilitzar un tros de codi, normalment mous el codi a una nova classe o funció. En les plantilles s'aplica la mateixa idea:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/ArticleBundle/Resources/views/Article/articleDetails.html.twig #}&lt;br /&gt;
&amp;lt;h2&amp;gt;{{ article.title }}&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;h3 class=&amp;quot;byline&amp;quot;&amp;gt;by {{ article.authorName }}&amp;lt;/h3&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
    {{ article.body }}&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ara ja pots incloure fàcilment aquesta plantilla en qualsevol una altra:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/ArticleBundle/Resources/views/Article/list.html.twig #}&lt;br /&gt;
{% extends 'AcmeArticleBundle::layout.html.twig' %}&lt;br /&gt;
 &lt;br /&gt;
{% block body %}&lt;br /&gt;
    &amp;lt;h1&amp;gt;Recent Articles&amp;lt;h1&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    {% for article in articles %}&lt;br /&gt;
        {{ include(&lt;br /&gt;
            'AcmeArticleBundle:Article:articleDetails.html.twig',&lt;br /&gt;
            {'article': article}&lt;br /&gt;
        ) }}&lt;br /&gt;
    {% endfor %}&lt;br /&gt;
{% endblock %}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Renderitzant plantilles enviant-li dades des de el controlador==&lt;br /&gt;
Imagina que en el teu lloc web tens una barra lateral que mostra els tres articles més recents. Per obtenir aquests tres articles és necessari realitzar una consulta a la base de dades o alguna altra operació similar que no es pot incloure en la pròpia plantilla.&lt;br /&gt;
&lt;br /&gt;
La solució consisteix a inserir en la plantilla el resultat retornat per un controlador de l'aplicació. En primer lloc, crea un controlador que renderitzi el llistat dels articles recents:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/ArticleBundle/Controller/ArticleController.php&lt;br /&gt;
class ArticleController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function recentArticlesAction($max = 3)&lt;br /&gt;
    {&lt;br /&gt;
        // hace una llamada a la base de datos u otra lógica&lt;br /&gt;
        // para obtener los &amp;quot;$max&amp;quot; artículos más recientes&lt;br /&gt;
        $articles = ...;&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;render(&lt;br /&gt;
            'AcmeArticleBundle:Article:recentList.html.twig',&lt;br /&gt;
            array('articles' =&amp;gt; $articles)&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
i a la plantilla es pot utilitzar les dades del array enviat des del controlador directament:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/ArticleBundle/Resources/views/Article/recentList.html.twig #}&lt;br /&gt;
{% for article in articles %}&lt;br /&gt;
    &amp;lt;a href=&amp;quot;/article/{{ article.slug }}&amp;quot;&amp;gt;&lt;br /&gt;
        {{ article.title }}&lt;br /&gt;
        &amp;lt;/a&amp;gt;&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per mostrar en qualsevol plantilla el resultat d'executar un controlador, utilitza la funció render i identifica al controlador utilitzant la notació especial '''bundle:controlador:acció''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# app/Resources/views/base.html.twig #}&lt;br /&gt;
 &lt;br /&gt;
{# ... #}&lt;br /&gt;
&amp;lt;div id=&amp;quot;sidebar&amp;quot;&amp;gt;&lt;br /&gt;
    {{ render(controller('AcmeArticleBundle:Article:recentArticles', {&lt;br /&gt;
        'max': 3&lt;br /&gt;
    })) }}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Enllaçant pàgines==&lt;br /&gt;
Crear enllaços a altres pàgines de l'aplicació és una de les tasques més comunes d'una plantilla. En lloc de generar a mà les URL dins de la plantilla, utilitza la funció path de Twig (o el helper router en PHP) per generar les URL utilitzant la configuració del sistema de encaminament. D'aquesta manera, si més endavant vols canviar l'aspecte de qualsevol URL, només has d'actualitzar un arxiu de configuració i totes les URL de les plantilles s'actualitzaran instantàniament.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;{{ path('_welcome') }}&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
On '''_welcome''' està definit al fitxer de routes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
_welcome:&lt;br /&gt;
    path:     /&lt;br /&gt;
    defaults: { _controller: AcmeDemoBundle:Welcome:index }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Enllaçant arxius web (css, javascript)==&lt;br /&gt;
Les plantilles de les aplicacions web solen enllaçar amb els web '''assets'' o arxius web, tals com a imatges, fulles d'estil CSS, arxius Javascript, etc.&lt;br /&gt;
&lt;br /&gt;
A la versió 2.8 ja no s'instal·la '''assetic''' per defecte i s'ha d'instal·lar utilitzant aquesta guia: &lt;br /&gt;
http://symfony.com/doc/current/cookbook/assetic/asset_management.html&lt;br /&gt;
&lt;br /&gt;
 De nou no és aconsellable generar a mà les URL d'aquest tipus d'arxius, ja que Symfony2 ofereix una solució millor i molt més flexible mitjançant la funció '''asset''' de Twig:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ asset('images/logo.png') }}&amp;quot; alt=&amp;quot;Symfony!&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;link href=&amp;quot;{{ asset('css/blog.css') }}&amp;quot; rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La gestió dels arxius CSS i dels arxius Javascript es realitza mitjançant la herència de plantilles. A la plantilla para es pot incloure els arxius que s'utilitzarà a tota la aplicació i després, a les plantilles filles, es poden incloure fitxers específics per aquella part de la web:&lt;br /&gt;
Plantilla pare:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# app/Resources/views/base.html.twig #}&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
    {# ... #}&lt;br /&gt;
 &lt;br /&gt;
    {% block stylesheets %}&lt;br /&gt;
        &amp;lt;link href=&amp;quot;{{ asset('css/main.css') }}&amp;quot; type=&amp;quot;text/css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; /&amp;gt;&lt;br /&gt;
    {% endblock %}&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
    {# ... #}&lt;br /&gt;
 &lt;br /&gt;
    {% block javascripts %}&lt;br /&gt;
        &amp;lt;script src=&amp;quot;{{ asset('js/main.js') }}&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    {% endblock %}&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
i les plantilles filles redefineixen els blocs tot utilitzant la configuració que hi ha en la plantilla pare:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/DemoBundle/Resources/views/Contact/contact.html.twig #}&lt;br /&gt;
{% extends '::base.html.twig' %}&lt;br /&gt;
 &lt;br /&gt;
{% block stylesheets %}&lt;br /&gt;
    {{ parent() }}&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;link href=&amp;quot;{{ asset('css/contact.css') }}&amp;quot; type=&amp;quot;text/css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; /&amp;gt;&lt;br /&gt;
{% endblock %}&lt;br /&gt;
 &lt;br /&gt;
{# ... #}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les plantilles també poden enllaçar arxius que es trobin en el directori Resources/public de qualsevol bundle. Per fer que aquests arxius estiguin disponibles en l'aplicació, executa la comanda:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php app/console assets:install directorio [--symlink]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Si al utilitzar ''assets'' en producció no funciona:===&lt;br /&gt;
http://symfony.com/doc/current/cookbook/assetic/asset_management.html#cookbook-assetic-dumping&lt;br /&gt;
&lt;br /&gt;
== Variables globals que es poden utilitzar directament a les plantilles ==&lt;br /&gt;
*'''app.security''' - el context de seguretat.&lt;br /&gt;
*'''app.user''' - l'objecte qeu representa a l'usuari que està visitant l'aplicació.&lt;br /&gt;
*'''app.request''' - l'objecte Request que conté tota la informació de la petició.&lt;br /&gt;
*'''app.session''' - l'objecte Session relacionat amb l'usuari.&lt;br /&gt;
*'''app.environment''' - l'entorn en el qual s'està executant l'aplicació (dev, prod, etc.)&lt;br /&gt;
*'''app.debug''' - val true si l'aplicació s'està executant en la manera de depuració i false en un altre cas.&lt;br /&gt;
=Formularis=&lt;br /&gt;
Guia Symfony per crear i utilitzar formularis:&lt;br /&gt;
http://symfony.com/doc/2.8/book/forms.html&lt;br /&gt;
&lt;br /&gt;
Symfony incorpora unes llibreries que permeten utilitzar els formularis associant-los amb clases PHP. Exemple:&lt;br /&gt;
Classe Tasca:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/TaskBundle/Entity/Task.php&lt;br /&gt;
namespace Acme\TaskBundle\Entity;&lt;br /&gt;
 &lt;br /&gt;
class Task&lt;br /&gt;
{&lt;br /&gt;
    // descripción de la tarea&lt;br /&gt;
    protected $task;&lt;br /&gt;
 &lt;br /&gt;
    // fecha en la que debe estar completada&lt;br /&gt;
    protected $dueDate;&lt;br /&gt;
 &lt;br /&gt;
    public function getTask()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;task;&lt;br /&gt;
    }&lt;br /&gt;
    public function setTask($task)&lt;br /&gt;
    {&lt;br /&gt;
        $this-&amp;gt;task = $task;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public function getDueDate()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;dueDate;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public function setDueDate(\DateTime $dueDate = null)&lt;br /&gt;
    {&lt;br /&gt;
        $this-&amp;gt;dueDate = $dueDate;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per crear el formulari on demanem totes, o algunes, de les dades que necessitem per crear la tasca anterior fariem el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/TaskBundle/Controller/DefaultController.php&lt;br /&gt;
namespace Acme\TaskBundle\Controller;&lt;br /&gt;
 &lt;br /&gt;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;&lt;br /&gt;
use Acme\TaskBundle\Entity\Task;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
 &lt;br /&gt;
class DefaultController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function newAction(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        // crea una task y le asigna algunos datos ficticios para este ejemplo&lt;br /&gt;
        $task = new Task();&lt;br /&gt;
        $task-&amp;gt;setTask('Write a blog post');&lt;br /&gt;
        $task-&amp;gt;setDueDate(new \DateTime('tomorrow'));&lt;br /&gt;
 &lt;br /&gt;
        $form = $this-&amp;gt;createFormBuilder($task)&lt;br /&gt;
            -&amp;gt;add('task', 'text')&lt;br /&gt;
            -&amp;gt;add('dueDate', 'date')&lt;br /&gt;
            -&amp;gt;add('save', 'submit')&lt;br /&gt;
            -&amp;gt;getForm();&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;render('AcmeTaskBundle:Default:new.html.twig', array(&lt;br /&gt;
            'formulari' =&amp;gt; $form-&amp;gt;createView(),&lt;br /&gt;
        ));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilitzant el formulari en una plantilla TWIG:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #}&lt;br /&gt;
 &lt;br /&gt;
{{ form(formulari) }}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Processant l'enviament del formulari==&lt;br /&gt;
Exemple del controlador que envia i reb les dades d'un formulari:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function newAction(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    // crear un objeto $task nuevo (borra los datos de prueba)&lt;br /&gt;
    $task = new Task();&lt;br /&gt;
 &lt;br /&gt;
    $form =  $this-&amp;gt;createFormBuilder($task)&lt;br /&gt;
    -&amp;gt;setAction($this-&amp;gt;generateUrl('target_route'))&lt;br /&gt;
    -&amp;gt;setMethod('GET')&lt;br /&gt;
    -&amp;gt;add('task', 'text')&lt;br /&gt;
    -&amp;gt;add('dueDate', 'date')&lt;br /&gt;
    -&amp;gt;add('save', 'submit')&lt;br /&gt;
    -&amp;gt;getForm();&lt;br /&gt;
 &lt;br /&gt;
    $form-&amp;gt;handleRequest($request);&lt;br /&gt;
 &lt;br /&gt;
    if ($form-&amp;gt;isValid()) {&lt;br /&gt;
        // guardar la tarea en la base de datos&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;redirect($this-&amp;gt;generateUrl('task_success'));&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Quan es carrega per primera vegada la pàgina associada a aquest controlador, es crea i renderiza el formulari. El mètode '''handleRequest() ''' detecta que el formulari no s'ha enviat i per tant, no fa gens.El mètode '''isValid()''' retorna false si el formulari no s'ha enviat.&lt;br /&gt;
*Quan l'usuari envia el formulari, el mètode '''handleRequest()''' ho detecta i guarda immediatament les dades enviades en les propietats '''task i dueDate''' de l'objecte''' $task.''' Després es valida aquest objecte. Si no és vàlid, el mètode '''isValid()''' retorna '''false''' una altra vegada, per la qual cosa es torna a mostrar el formulari, aquesta vegada amb els missatges d'error corresponents. Si solament vols comprovar si el formulari s'ha enviat, independentment de si és vàlid o no, utilitza el mètode '''isSubmitted()'''.&lt;br /&gt;
*Quan l'usuari envia el formulari amb dades vàlides, les dades enviades es guarden de nou en el formulari, però aquesta vegada el mètode '''isValid()''' retorna '''true'''. En aquest moment ja pots treballar amb l'objecte '''$task''' (per exemple guardant-ho en una base de dades) abans de redirigir a l'usuari a una altra pàgina (per exemple a la pàgina d'agraïment o a la qual mostra un missatge determinat).&lt;br /&gt;
&lt;br /&gt;
=Seguretat=&lt;br /&gt;
És un procés de dues etapes que el seu objectiu és evitar que un usuari accedeixi a un recurs pel qual no hauria de tenir accés.&lt;br /&gt;
&lt;br /&gt;
En el primer pas del procés, el sistema de seguretat identifica qui és l'usuari obligant-ho a enviar algun tipus d'identificació. Això es diu autenticació, i significa que el sistema està tractant d'esbrinar qui ets.&lt;br /&gt;
&lt;br /&gt;
Una vegada que el sistema sap qui ets, el següent pas és decidir si hauries de tenir accés a un determinat recurs. Aquesta part del procés es diu autorització, i significa que el sistema està comprovant si tens suficients privilegis per realitzar una determinada acció.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:seguretat-symfony.png]]&lt;br /&gt;
&lt;br /&gt;
==Firewalls (autenticació)==&lt;br /&gt;
&lt;br /&gt;
El sistema de seguretat de Symfony s'activa quan un usuari fa una petició a una URL que està protegida per un '''firewall''' o tallafocs. El treball del firewall ''consisteix a determinar si l'usuari necessita estar autenticat'', i si ho necessita, enviar una resposta a l'usuari per iniciar el procés d'autenticació.&lt;br /&gt;
&lt;br /&gt;
Un ''firewall s'activa quan la URL d'una petició entrant concorda amb el valor de la seva opció de configuració '''pattern'''''. En aquest exemple el valor de pattern''' (^/)''' concorda amb qualsevol petició entrant. No obstant això, el fet que el firewall estigui activat no significa que el navegador mostra la caixa de login+contrasenya per a totes les URL. Els usuaris poden accedir per exemple a /foo sense que l'aplicació els demani que s'autentiquin.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:firewall-symfony.png]]&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/security.yml&lt;br /&gt;
security:&lt;br /&gt;
    firewalls:&lt;br /&gt;
        secured_area:&lt;br /&gt;
            pattern:    ^/&lt;br /&gt;
            anonymous: ~&lt;br /&gt;
            http_basic:&lt;br /&gt;
                realm: &amp;quot;Secured Demo Area&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    access_control:&lt;br /&gt;
        - { path: ^/admin, roles: ROLE_ADMIN }&lt;br /&gt;
        # Descomenta la siguiente línea para proteger también&lt;br /&gt;
        # la propia URL /admin&lt;br /&gt;
        # - { path: ^/admin$, roles: ROLE_ADMIN }&lt;br /&gt;
&lt;br /&gt;
    providers:&lt;br /&gt;
        in_memory:&lt;br /&gt;
            memory:&lt;br /&gt;
                users:&lt;br /&gt;
                    ryan:  { password: ryanpass, roles: 'ROLE_USER' }&lt;br /&gt;
                    admin: { password: kitten, roles: 'ROLE_ADMIN' }&lt;br /&gt;
&lt;br /&gt;
    encoders:&lt;br /&gt;
        Symfony\Component\Security\Core\User\User: plaintext&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquest funcionament és possible en primer lloc perquè el firewall permet l'accés als usuaris anònims a causa de l'opció de configuració anonymous. En altres paraules, el firewall no exigeix que tots els usuaris s'autentiquin res més accedir a l'aplicació. I com en la configuració de la secció access_control no s'indica que els usuaris hagin de tenir cap role especial per accedir a /foo la petició es processa sense requerir a l'usuari que s'autentiqui.&lt;br /&gt;
&lt;br /&gt;
Si elimines l'opció anonymous, l'efecte és que ara el firewall demana autenticació a qualsevol recurs.&lt;br /&gt;
&lt;br /&gt;
Seguint amb el mateix exemple, si un usuari sol·licita '''/admin/foo''', l'aplicació es comporta de manera diferent. Això és a causa de la configuració de la secció '''access_control''', que indica que qualsevol URL que coincideixi amb l'expressió regular '''^/admin''' (és a dir, la URL '''/admin''' o qualsevol altra URL que coincideixi amb /admin/) requereix el rol''' ROLE_ADMIN'''. Els rols són la clau del sistema d'autorització: l'usuari pot accedir a '''/admin/foo''' només si compta amb el rol'''ROLE_ADMIN'''.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:access-symfony.png ]]&lt;br /&gt;
&lt;br /&gt;
La capa de control d'accés denega l'accés a l'usuari (perquè els usuaris anònims no compten amb el rol ROLE_ADMIN), el firewall pren el control de l'aplicació i inicia el procés d'autenticació.&lt;br /&gt;
&lt;br /&gt;
==Utilitzant el típic formulari de accés==&lt;br /&gt;
En primer lloc, afegeix l'opció form_login en la configuració del firewall:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/security.yml&lt;br /&gt;
security:&lt;br /&gt;
    firewalls:&lt;br /&gt;
        secured_area:&lt;br /&gt;
            pattern:    ^/&lt;br /&gt;
            anonymous:  ~&lt;br /&gt;
            form_login:&lt;br /&gt;
                login_path:  login&lt;br /&gt;
                check_path:  login_check&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El sistema de seguretat inicia el procés d'autenticació, es redirigeix a l'usuari a la ruta que mostra el formulari d'accés (per defecte '''/login'''). El'' formulari has de crear-ho tu mateix a mà, ja que Symfony no ho proporciona''. Primer crea les dues noves rutes utilitzades en la configuració de la seguretat: la ruta '''login''' mostra el formulari (es correspon amb la URL''' /login''') i '''login_check''' que processa l'enviament del formulari (es correspon amb la URL '''/login_check)''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
# app/config/routing.yml&lt;br /&gt;
login:&lt;br /&gt;
    pattern:   /login&lt;br /&gt;
    defaults:  { _controller: AcmeSecurityBundle:Security:login }&lt;br /&gt;
login_check:&lt;br /&gt;
    pattern:   /login_check&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observa que el nom de la ruta '''login''' coincideix amb el valor de l'opció '''login_path''', ja que és on el sistema de seguretat redirigeix als usuaris que necessiten autenticar-se.&lt;br /&gt;
&lt;br /&gt;
A continuació, crea el controlador que mostra el formulari de accés:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// src/Acme/SecurityBundle/Controller/SecurityController.php;&lt;br /&gt;
namespace Acme\SecurityBundle\Controller;&lt;br /&gt;
 &lt;br /&gt;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;&lt;br /&gt;
use Symfony\Component\HttpFoundation\Request;&lt;br /&gt;
use Symfony\Component\Security\Core\SecurityContext;&lt;br /&gt;
 &lt;br /&gt;
class SecurityController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function loginAction(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $session = $request-&amp;gt;getSession();&lt;br /&gt;
 &lt;br /&gt;
        // get the login error if there is one&lt;br /&gt;
        if ($request-&amp;gt;attributes-&amp;gt;has(SecurityContext::AUTHENTICATION_ERROR)) {&lt;br /&gt;
            $error = $request-&amp;gt;attributes-&amp;gt;get(&lt;br /&gt;
                SecurityContext::AUTHENTICATION_ERROR&lt;br /&gt;
            );&lt;br /&gt;
        } else {&lt;br /&gt;
            $error = $session-&amp;gt;get(SecurityContext::AUTHENTICATION_ERROR);&lt;br /&gt;
            $session-&amp;gt;remove(SecurityContext::AUTHENTICATION_ERROR);&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        return $this-&amp;gt;render(&lt;br /&gt;
            'AcmeSecurityBundle:Security:login.html.twig',&lt;br /&gt;
            array(&lt;br /&gt;
                // last username entered by the user&lt;br /&gt;
                'last_username' =&amp;gt; $session-&amp;gt;get(SecurityContext::LAST_USERNAME),&lt;br /&gt;
                'error'         =&amp;gt; $error,&lt;br /&gt;
            )&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si l'usuari envia un nom d'usuari o contrasenya no vàlids, aquest controlador obté el missatge d'error del sistema de seguretat i ho mostra a l'usuari.&lt;br /&gt;
Tu t'encarregues de mostrar el formulari a l'usuari i els errors que puguin haver ocorregut, però ''el propi sistema de seguretat s'encarrega de verificar el nom d'usuari i contrasenya i l'autenticació de l'usuari''.&lt;br /&gt;
Plantilla del formulari:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{# src/Acme/SecurityBundle/Resources/views/Security/login.html.twig #}&lt;br /&gt;
{% if error %}&lt;br /&gt;
    &amp;lt;div&amp;gt;{{ error.message }}&amp;lt;/div&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ path('login_check') }}&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;label for=&amp;quot;username&amp;quot;&amp;gt;Username:&amp;lt;/label&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;username&amp;quot; name=&amp;quot;_username&amp;quot; value=&amp;quot;{{ last_username }}&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;label for=&amp;quot;password&amp;quot;&amp;gt;Password:&amp;lt;/label&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;password&amp;quot; id=&amp;quot;password&amp;quot; name=&amp;quot;_password&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    {#&lt;br /&gt;
        añade lo siguiente si quieres redirigir al usuario a una&lt;br /&gt;
        URL concreta después del login (explicado más adelante)&lt;br /&gt;
        &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;_target_path&amp;quot; value=&amp;quot;/account&amp;quot; /&amp;gt;&lt;br /&gt;
    #}&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;login&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=Webgrafia=&lt;br /&gt;
Els llibres sobre symfony utilitzats per elaborar un resum de les funcionalitats més importants els podeu trobar a : [http://librosweb.es/libros/ http://librosweb.es/libros/]&lt;br /&gt;
&lt;br /&gt;
També s'ha utilitzat el llibre oficial que podeu trobar a la web:[http://symfony.com/doc/current/book/index.html http://symfony.com/]&lt;/div&gt;</summary>
		<author><name>Asalinas</name></author>	</entry>

	</feed>