<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>jm2dev &#187; PHP</title>
	<atom:link href="http://www.jm2dev.com/category/general/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jm2dev.com</link>
	<description>desarrollo software en el siglo XXI</description>
	<lastBuildDate>Sun, 28 Aug 2011 16:09:44 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Desarrollo web MAMP con CakePHP (III)</title>
		<link>http://www.jm2dev.com/2009/01/desarrollo-web-mamp-con-cakephp-iii/</link>
		<comments>http://www.jm2dev.com/2009/01/desarrollo-web-mamp-con-cakephp-iii/#comments</comments>
		<pubDate>Sun, 25 Jan 2009 19:28:39 +0000</pubDate>
		<dc:creator>josemiguel</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[controlador]]></category>
		<category><![CDATA[modelo]]></category>
		<category><![CDATA[vista]]></category>

		<guid isPermaLink="false">http://www.jm2dev.com/?p=31</guid>
		<description><![CDATA[En esta tercera y última parte se va a desarrollar la aplicación a partir del esqueleto ya disponible en la aplicación pastelito. La aplicación va listar los productos disponibles y su precio, en este caso tartas, por lo que siguiendo las convenciones de CakePHP se va a crear un modelo (Tarta) que implementa los datos, [...]]]></description>
			<content:encoded><![CDATA[<p>En esta tercera y última parte se va a desarrollar la aplicación a partir del esqueleto ya disponible en la aplicación <em>pastelito</em>. La aplicación va listar los productos disponibles y su precio, en este caso tartas, por lo que siguiendo las convenciones de CakePHP se va a crear un modelo (<strong>Tarta</strong>) que implementa los datos, un controlador (<strong>TartasController</strong>) que realizará la lógica, y una vista (tartas/<code>index</code>.ctp) que mostrará la información y se corresponde con la función definida en el controlador.</p>
<p>Recordemos que en la base de datos se tiene una única tabla (<strong>tartas</strong>) que contiene un registro de cada tarta, de ahí que el modelo se denomine en singular, y se crea en <code>/pastelito/models/tarta.php</code> con el siguiente código:</p>
<p><code>&lt;?php<br />
class Tarta extends AppModel {<br />
var $name = 'Tarta';<br />
}<br />
?&gt;</code></p>
<p>Por otro lado el controlador <code>/pastelito/controllers/tartas_controller.php</code> contiene:</p>
<p><code>&lt;?php<br />
class TartasController extends AppController {<br />
var $name = 'Tartas';</code></p>
<p><code>function index() {<br />
$this-&gt;set('tartas', $this-&gt;Tarta-&gt;findAll());<br />
}<br />
}<br />
?&gt;</code></p>
<p>que define una función que invoca a la vista <strong>tartas/index.ctp</strong> pasando como parámetro todos los registros del modelo <strong>Tarta</strong>.</p>
<p>Finalmente la vista debe presentar el resultado, ahora la vista será un directorio <code>/pastelito/views/tartas</code>, con un fichero <code>index.ctp</code> que genera el código HTML a mostrar por el navegador:</p>
<p><code>&lt;h1&gt;Tartas&lt;/h1&gt;</code></p>
<p><code>&lt;table&gt;<br />
&lt;tr&gt;<br />
&lt;th&gt;Id&lt;/th&gt;<br />
&lt;th&gt;Producto&lt;/th&gt;<br />
&lt;th&gt;Precio (eur.)&lt;/th&gt;<br />
&lt;/tr&gt;</code></p>
<p><code>&lt;?php foreach ($tartas as $tarta): ?&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;?php echo $tarta['Tarta']['id']; ?&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;?php echo $tarta['Tarta']['nombre']; ?&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;?php echo $tarta['Tarta']['precio']; ?&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;?php endforeach; ?&gt;<br />
&lt;/table&gt;</code></p>
<p>Se puede ver el resultado visualizando la URL <code>http://www.onestic.dev/tartas</code>.</p>
<p><img class="aligncenter size-medium wp-image-33" title="listatartas" src="http://www.jm2dev.com/wp-content/uploads/2009/01/listatartas-300x206.png" alt="listatartas" width="300" height="206" /></p>
<p>Todo bien, pero la aplicación no deja de ser muy sencilla, se va a añadir funcionalidad: al pinchar sobre el producto se ve un detalle del mismo.</p>
<p>Se modifica index.ctp de forma que el identificador sea un hiperenlace que nos lleve a una nueva vista:</p>
<p><code>&lt;td&gt;&lt;?php echo $html -&gt; link($tarta['Tarta']['id'], "/tartas/view/".$tarta['Tarta']['id']); ?&gt;&lt;/td&gt;</code></p>
<p>Se crea <code>view.ctp</code> que será la vista y que recibe como parámetro de entrada el identificador, para recuperar ese registro:</p>
<p><code>&lt;h1&gt;&lt;?php echo $tarta['Tarta']['nombre']?&gt;&lt;/h1&gt;<br />
&lt;p&gt;&lt;small&gt;Precio: &lt;?php echo $tarta['Tarta']['precio']?&gt;&lt;/small&gt;&lt;/p&gt;<br />
&lt;p&gt;&lt;?php echo $tarta['Tarta']['descripcion']?&gt;&lt;/p&gt;</code></p>
<p>Y se añade la acción asociada a la nueva vista en el controllador con la siguiente función:</p>
<p><code>function view($id = null) {<br />
$this-&gt;Tarta-&gt;id = $id;<br />
$this-&gt;set('tarta', $this-&gt;Tarta-&gt;read());<br />
}</code></p>
<p>Nótese la correspondencia de nombres, la función <code>view</code> lee el registro con identificador = id y la vista <code>view.ctp</code> muestra el resultado.</p>
<p><img class="aligncenter size-medium wp-image-44" title="Información del elemento seleccionado." src="http://www.jm2dev.com/wp-content/uploads/2009/01/detalletarta-300x178.png" alt="Información del elemento seleccionado." width="300" height="178" /></p>
<p>Finalmente se edita /pastelito/config/core.php para modificar el nivel de depurado,<br />
<code>Configure::write('debug', 0);</code><br />
y routes.php para redirigir automáticamente a la página inicial que deseemos: <code>http://www.onestic.dev</code>.<br />
<code><br />
Router::connect('/', array('controller' => 'tartas', 'action' => 'index'));</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jm2dev.com/2009/01/desarrollo-web-mamp-con-cakephp-iii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desarrollo web MAMP con CakePHP (II)</title>
		<link>http://www.jm2dev.com/2009/01/desarrollo-web-mamp-con-cakephp-ii/</link>
		<comments>http://www.jm2dev.com/2009/01/desarrollo-web-mamp-con-cakephp-ii/#comments</comments>
		<pubDate>Sun, 25 Jan 2009 17:19:05 +0000</pubDate>
		<dc:creator>josemiguel</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[bake]]></category>
		<category><![CDATA[cake]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[MAMP]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[os x]]></category>

		<guid isPermaLink="false">http://www.jm2dev.com/?p=20</guid>
		<description><![CDATA[En la anterior entrada se ha configurado la parte web para los desarrollos. Con respecto a la base de datos, no se va a entrar en detalles ahora, se recomienda instalar la versión empaquetada para OS X de MySQL, pues es muy sencilla y autoexplicativa.
A continuación se descarga el framework CakePHP y se descomprime donde [...]]]></description>
			<content:encoded><![CDATA[<p>En la <a href="http://www.jm2dev.com/?p=8">anterior entrada</a> se ha configurado la parte web para los desarrollos. Con respecto a la base de datos, no se va a entrar en detalles ahora, se recomienda instalar la versión empaquetada para OS X de MySQL, pues es muy sencilla y autoexplicativa.</p>
<p>A continuación se descarga el framework <a href="http://cakeforge.org/frs/download.php/699/cake_1.2.1.8004.zip">CakePHP</a> y se descomprime donde uno desee, pero se va a añadir la consola de este framework a la variable PATH por comodidad, para ello se edita el fichero <strong>.bashrc</strong> y se añade la siguiente línea:</p>
<p><code>export PATH=$PATH:/Users/onestic/Sites/cake/cake/console</code></p>
<p>y se ejecuta <code>. .bashrc</code> para actualizar los cambios.</p>
<p>Recordamos que se había configurado un servidor virtual en <strong>/Users/onestic/Sites/pastelito</strong> y que vamos a aprovechar para servir la sencilla aplicación web siguiente: un listado de pasteles y precios de una pastelería virtual, al fin y al cabo esto es CakePHP.</p>
<p>Lo primero será borrar el directorio <strong>pastelito</strong> pues se va a volver a crear conteniendo el esqueleto de una aplicación web basada en CakePHP usando la utilidad de consola que provee, y donde aceptaremos las opciones por defecto salvo en la sección de configuración de base de datos, que en nuestro caso y por tratarse de desarrollo local se usará el usuario root sin contraseña y el nombre de la base de datos.</p>
<p><code>cd Sites<br />
cake bake pastelito</code></p>
<p>Se adjuntan unas capturas de pantalla como orientación:</p>
<p><img src="http://www.jm2dev.com/wp-content/uploads/2009/01/cake_bake_1-300x200.png" alt="Consola Cake (I)." title="Consola Cake (I)." width="300" height="200" class="aligncenter size-medium wp-image-21" /></p>
<p><img src="http://www.jm2dev.com/wp-content/uploads/2009/01/cake_bake_2-279x300.png" alt="Consola Cake (II)." title="Consola Cake (II)." width="279" height="300" class="aligncenter size-medium wp-image-22" /><br />
A continuación se crea la base de datos (<strong>pastelito</strong>) con una tabla (<strong>tartas</strong>) para la persistencia de datos. El nombre de la tabla puede confundir un poco, y es que CakePHP defiende la práctica de <em>convención sobre configuración</em>, y el modelo de datos lógico se nombra en singular mientras que la tabla que almacena los registros de este modelo se denomina en plural pero según la convención anglosajona, esto es, con una s final. De ahí que hayamos optado por <em>tarta</em> y <em>tartas</em> en vez de <em>pastel</em> o <em>pastele</em> por <em>pastels</em> o <em>pasteles</em>.</p>
<p><code>mysql -u root<br />
CREATE DATABASE pastelito;<br />
USE pastelito;<br />
CREATE TABLE tartas (<br />
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,<br />
nombre VARCHAR(50),<br />
descripcion TEXT,<br />
precio FLOAT);</code></p>
<p><code>INSERT INTO tartas (nombre, descripcion, precio) VALUES (<br />
'Lujuría de chocolate', 'Deliciosa tarta con tres variedades de exquisitos chocolates.', 30.99);</code></p>
<p><code>INSERT INTO tartas (nombre, descripcion, precio) VALUES (<br />
'Tarta de Santiago', 'Tradicional tarta elaborada a base de almendras.', 20.99);</code></p>
<p>En este punto podemos comprobar que va todo bien visitando la URL del servidor virtual y se debe ver algo como lo siguiente:</p>
<p><img src="http://www.jm2dev.com/wp-content/uploads/2009/01/appinicial-300x169.png" alt="Nuestra aplicación al principio." title="Nuestra aplicación al principio." width="300" height="169" class="aligncenter size-medium wp-image-25" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jm2dev.com/2009/01/desarrollo-web-mamp-con-cakephp-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desarrollo web MAMP con CakePHP</title>
		<link>http://www.jm2dev.com/2009/01/desarrollo-web-mamp-con-cakephp/</link>
		<comments>http://www.jm2dev.com/2009/01/desarrollo-web-mamp-con-cakephp/#comments</comments>
		<pubDate>Sun, 25 Jan 2009 14:49:42 +0000</pubDate>
		<dc:creator>josemiguel</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[apache2]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[MAMP]]></category>
		<category><![CDATA[os x]]></category>

		<guid isPermaLink="false">http://www.jm2dev.com/?p=8</guid>
		<description><![CDATA[Es de todos conocidos el paradigma de programación web LAMP, acrónimo de Linux, Apache, MySQL y PHP/Perl/Python. Y debido a su popularidad han surgido variantes como SAMP para Solaris o MAMP para Mac OS X. Con respecto a MAMP vamos a comentar que se ha referenciado a un proyecto &#8220;todo en uno&#8221;, aunque aquí se [...]]]></description>
			<content:encoded><![CDATA[<p>Es de todos conocidos el paradigma de programación web LAMP, acrónimo de <a href="http://www.linux.org">Linux</a>, <a href="http://www.apache.org">Apache</a>, <a href="http://dev.mysql.com">MySQL</a> y <a href="http://www.php.net">PHP</a>/<a href="http://www.perl.org">Perl</a>/<a href="http://www.python.org">Python</a>. Y debido a su popularidad han surgido variantes como <a href="http://www.sun.com/software/solaris/amp/">SAMP</a> para Solaris o <a href="http://www.mamp.info/en/index.php">MAMP</a> para Mac OS X. Con respecto a MAMP vamos a comentar que se ha referenciado a un proyecto &#8220;todo en uno&#8221;, aunque aquí se van a tratar los elementos por separado por ser el enfoque más general y aprovecha el software preinstalado en OS X (apache y php).</p>
<p>Como lenguaje de programación trataremos PHP, y concretamente el framework <a href="http://cakephp.org">CakePHP</a> para desarrollar rápidamente aplicaciones web.</p>
<p>OS X en su última versión a fecha de hoy, viene con el servidor Apache 2 instalado y que podemos iniciar a través de <em>System Preferences/Sharing</em>, donde se nos informa de los dos directorios preparados para servir contenidos web. Sin duda es engorroso estar limitado a sólo dos directorios, pues un desarrollador puede estar fácilmente involucrado en varios proyectos, por lo que vamos a presentar la configuración para tener un servidor virtual por nombre.</p>
<p>Se abre una sesión de consola y se edita el fichero de configuración de apache (<strong>/etc/apache2/httpd.conf</strong>) descomentando las líneas para habilitar soporte PHP y servidores virtuales:</p>
<p><code>LoadModule php5_module        libexec/apache2/libphp5.so</code></p>
<p><code># Virtual hosts<br />
Include /private/etc/apache2/extra/httpd-vhosts.conf</code></p>
<p>A continuación se edita el fichero de configuración de servidores virtuales (<strong>httpd-vhosts.conf</strong>) y se inserta el siguiente código:<br />
<code><br />
&lt;VirtualHost *:80&gt;<br />
DocumentRoot "/Users/onestic/Sites/pastelito"<br />
ServerName onestic.dev<br />
ServerAlias www.onestic.dev<br />
&lt;Directory "/Users/onestic/Sites/pastelito/"&gt;<br />
Options FollowSymLinks<br />
AllowOverride All<br />
&lt;/Directory&gt;<br />
&lt;/VirtualHost&gt;<br />
</code></p>
<p>Finalmente se edita el fichero <strong>/etc/hosts</strong> para resolver correctamente el nuevo servidor virtual.</p>
<p><code>127.0.0.1	www.onestic.dev</code></p>
<p>Para comprobar que todo funciona correctamente se crea el fichero <strong>index.php</strong> en la ruta física del servidor virtual (ver etiqueta <strong>Directory</strong>) con el siguiente código:</p>
<p><code>&lt;?php phpinfo(); ?&gt;</code></p>
<p>Y si se visualiza una pantalla similar se ha configurado con éxito un servidor virtual que ejecuta código PHP.</p>
<p><img src="http://www.jm2dev.com/wp-content/uploads/2009/01/picture-1-300x181.png" alt="Servidor virtual con PHP." title="Servidor virtual con PHP." width="300" height="181" class="aligncenter size-medium wp-image-9" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jm2dev.com/2009/01/desarrollo-web-mamp-con-cakephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

