Nuevo, quiero aprender!

23 views
Skip to first unread message

Daniel Cáceres

unread,
Jun 10, 2014, 4:44:41 PM6/10/14
to sif...@googlegroups.com
Buenas tardes estoy muy interesado en aprender SIFO, lo básico ya entiendo, y ya tengo todo configurado y funcionando, pero me gustaría alguna ayuda para las conexiones de Base de Datos (Models).

Desde ya muchas gracias!!
Daniel Cáceres

Jorge T.M.

unread,
Jun 10, 2014, 5:01:30 PM6/10/14
to sif...@googlegroups.com
Buenas!

Muy fácil, SIFO se basa en patrones MVC para renderizar las páginas y módulos, esto quiere decir que tanto las conexiones como las consultas a base de datos se hacen desde modelos. En SIFO todos los modelos van dentro de la carpeta "models" de tu instancia, por ejemplo:

/var/www/sifo/instances/fooinstance/models/articles/list.model.php

En dicho modelo puedes implementar los métodos que harán las consultas a MySQL (u otro) y que serán llamados desde el controlador. Para esas consultas tienes dos opciones para encararlo:

1- Extender la clase "Model": esto habilitará los métodos del plugin ADODB, el cual es compatible con muchos gestores de bases de datos y abstrae toda la mandanga. Un ejemplo comun:

public function getArticles( $section_id )
{
$sql = <<<QUERY
SELECT
*
FROM
articles
WHERE
section_id = $section_id
QUERY;

return $this->GetAll( $sql );
}

Simple verdad? El GetAll no está implementado en "Model", pero este tiene un método mágico __call que hace de "proxy" a ADODB. Hay otros como GetOne, GetRow, etc, te recomiendo que leas la documentación de AdoDB para más info.

La query de arriba tiene un problema gordo, y es que es susceptible a SQL injection. Para arreglarlo podemos usar un acercamiento a prepared statements:

public function getArticles( $section_id )
{
$sql = <<<QUERY
SELECT
*
FROM
articles
WHERE
section_id = ?
QUERY;

return $this->GetAll( $sql, array( $section_id ) );
}

Pones un "?" en cada parámetro de filtro y luego los pasas en orden al GetAll (u otro) en formato array. No hace falta que uses comillas para los campos tipo string, ADODB ya lo hace por ti.

Para las escrituras (insert, delete, etc), puedes usar $this->Execute( $query ). En el caso de INSERT o REPLACE rellenará un buffer con el último valor autoincremental añadido al que puedes acceder con $this->Insert_ID(). Idem para el affected rows (aunque ahora no recuerdo el nombre del método xD).


2- La segunda opción (y para mí la mejor) es extender de "MysqlModel", que habilita la extensión de PHP llamada PDO. Voy a cenar y luego te la explico.


Saludos!

Daniel Cáceres

unread,
Jun 10, 2014, 5:13:17 PM6/10/14
to sif...@googlegroups.com
Excelente Explicación Jorge!! ya la estoy teniendo clara jeje
Yo trabajo en una Universidad en Paraguay y utilizamos como base de datos Firebird, tenemos nuestro sistema actualmente en Foxpro 9, lo que queremos hacer es migrarlo a Web, pero queremos hacerlo ordenado para ello utilizar un Framework y veo que SIFO tiene soporte para firebird por eso mi interés de entender mejor; si serías tan amable de guiarme con ejemplo de los modelos.

Saludos Cordiales,
Daniel C.

Jorge T.M.

unread,
Jun 10, 2014, 6:13:22 PM6/10/14
to sif...@googlegroups.com
Así que Firebird, en ese caso descartamos la opción de "MysqlModel" y tiramos de "Model", que en teoría es compatible (lo ignoro, nunca he usado Firebird).

Supongamos que nuestra instancia se llama "Foo", esto sería un modelo muy simple en "sifo/instances/foo/models/articles/whatever.model.php":

namespace Foo;

use Sifo\Model;

class ArticlesWhateverModel extends Model
{
public function getArticles( $section_id )
{
$query = "query_de_firebird"; // ni idea de como funciona, oiga

return $this->GetAll( $query );
}
}

Dos cosas a tener en cuenta:

- El nombre de la clase es DirectorioNombrearchivoModel, en camel case. Esto hará que el factory de clases y los generadores funcionen correctamente. Idem para controladores.
- La visibilidad del getArticles es pública, así puede llamarse desde los controladores.

Y esto sería un controlador que usa ese modelo, en sifo/instances/foo/controllers/articles/main.ctrl.php:

namespace Foo;

use Sifo\Controller;

class ArticlesMainController extends Controller
{
public function build()
{
$model = new ArticlesWhateverModel();
// o bien lo siguiente, usando factory:
// $model = $this->getClass( 'ArticlesWhateverModel' );
$articles = $model->getArticles();
$this->assign( 'article_list', $articles );
$this->setLayout( 'articles/list.tpl' );
}
}

La clase "Controller" es abstracta, y todas sus clases hijas tienen que implementar un build() si o si. Es lo que se va a ejecutar siempre, en este caso llamamos al modelo para obtener unos datos y los asignamos a la variable "article_list" de nuestro template (o vista). Para la gestión de templates o vistas, SIFO usa Smarty: http://www.smarty.net/documentation 

Una vez están implementadas estas clases, falta enrutar una URL concreta a ese controlador. Para ello usamos el sifo/instances/foo/config/router.config.php:

$config['articulos'] = 'articles/main';

Con esto, una URL tal que http://dominio/articulos debería cargar ese controlador con la vista que hemos definido.

Por otro lado, asegúrate de que has definido los datos de conexión a DB en tu config/domains.config.php. 


Faltan cosas, pero te recomiendo leer la documentación de SIFO si no lo has hecho ya: http://sifo.me/ 

Saludos!

Daniel Cáceres

unread,
Jun 11, 2014, 8:36:12 AM6/11/14
to sif...@googlegroups.com
Excelente Jorge!! mas claro.. agua!!

Muchas gracias por tu atención y ayuda, voy a probar como con Firebird y os voy a comentar!!

Saludos Cordiales,
Daniel Cáceres

Daniel Cáceres

unread,
Jun 11, 2014, 11:01:58 AM6/11/14
to sif...@googlegroups.com
Solo para comentar que funciona perfecto con Firebird, solo que en la configuración de la base de datos: 'db_init_commands' => array( 'SET NAMES utf8') esto no acepta, me lanza el siguiente error: firebird error: [-104: Dynamic SQL Error SQL error code = -104 Token unknown - line 1, column 5 NAMES ] in EXECUTE("SET NAMES ISO8859_1;") por lo pronto comente eso en domains.config.php
Y ya estoy empezando a mirar al documentación para trabajar con formularios, toda ayuda es bienvenida!!

Saludos Cordiales,
Daniel Cáceres
--
You received this message because you are subscribed to a topic in the Google Groups "SIFO, PHP framework" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/sifophp/YfMpwOVRHHw/unsubscribe.
To unsubscribe from this group and all its topics, send an email to sifophp+u...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Albert Lombarte

unread,
Jun 11, 2014, 1:38:51 PM6/11/14
to sif...@googlegroups.com
Hola Daniel,

Efectivamente la conexión con Firebird funciona correctamente, fue uno de los primeros motores con los que trabajé aunque a partir de la creación del framework ya no he vuelto a usar. Es bueno ver que alguien lo utiliza y ver que con el paso de las versiones sigue funcionando :)

Los comandos de db_init_commands son cualquier cosa que quieras lanzar ANTES de empezar a lanzar comandos contra la base de datos, y esto es propio de cada motor. El comando SET NAMES es para mysql únicamente y no tendrá sentido para Firebird con lo que puedes o bien comentar la entrada o dejar el array vacío.

Para los formularios aquí tienes un ejemplo funcional: http://sifo.me/API/Form

Saludos


--
You received this message because you are subscribed to the Google Groups "SIFO, PHP framework" group.
To unsubscribe from this group and stop receiving emails from it, send an email to sifophp+u...@googlegroups.com.

Daniel Cáceres

unread,
Jun 11, 2014, 1:53:02 PM6/11/14
to sif...@googlegroups.com
Hola Albert, si me parece muy interesante vuestro trabajo y como le habia comentado a Jorge estamos pensando migrar un sistema desktop de una Universidad donde trabajamos a web, como ya manejamos php en el equipo de desarrollo yo estoy investigando sobre SIFO y su compatibilidad con Firebird y me parece una excelente opción.
Me gustaría si no es mucha molestia puedan tirarme un ejemplo practico para manejar los FORM's (Controller,Template y Form).

Muchas Gracias!
Daniel Cáceres

Albert Lombarte

unread,
Jun 11, 2014, 3:36:48 PM6/11/14
to sif...@googlegroups.com
En el enlace que te he pasado tienes exactamente lo que pides, te faltaría solo el template. Te escribo uno de ejemplo para que lo veas (lo escribo aquí directamente, no está probado)

El primer bloque de código que hay en el enlace que te pasó lo puedes pegar en un controlador cualquiera, y el segundo lo guardas en la ruta config/forms/myform.config.php.

El template podría ser algo así:

<ol>
<li{if isset($errors.username)} class="error"{/if}>
<label for="userusername">{t}username{/t}:</label>
<input type="text" maxlength="50" size="30" value="{$form.username}" name="username" required="required"/>
{if isset($errors.username)}<p class="error">{$errors.username}</p>{/if}
</li>
<li{if isset($errors.age)} class="error"{/if}>
<label for="userage">{t}age{/t}:</label>
<input type="text" value="{$form.age}" name="age" required="required"/>
{if isset($errors.age)}<p class="error">{$errors.age}</p>{/if}
</li>
<li>
<label>{t}How others can see my profile?{/t}:</label>
<ul>
<li {if isset($errors.how_can_see_my_profile)} class="error"{/if}>
<input type="radio" id="how_can_see_my_profile_all" name="how_can_see_my_profile" value="all" {if $form.how_can_see_my_profile=='all'|| empty($form.how_can_see_my_profile)} checked="checked"{/if} />
<label for="how_can_see_my_profile_all" class="checkbox">{t}all{/t}</label>
</li>
<li>
<input type="radio" id="how_can_see_my_profile_registered" name="how_can_see_my_profile" value="registered" {if $form.how_can_see_my_profile=='registered'}checked="checked"{/if} />
<label for="how_can_see_my_profile_registered" class="checkbox">{t}registered{/t}</label>
</li>
<li>
<input type="radio" id="how_can_see_my_profile_nobody" name="how_can_see_my_profile" value="nobbody" {if $form.how_can_see_my_profile=='unknown'}checked="checked"{/if} />
<label for="how_can_see_my_profile_nobody" class="checkbox">{t}nobody{/t}</label>
{if isset($errors.how_can_see_my_profile)}<p class="error">{$errors.how_can_see_my_profile}</p>{/if}
</li>
</ul>
</li>
</ol>

A partir de aquí te invito a que vayas probando el funcionamiento y navegando por las clases para comprender un poco más a fondo su funcionamiento.

Un saludo y suerte

Daniel Cáceres

unread,
Jun 11, 2014, 3:54:10 PM6/11/14
to sif...@googlegroups.com
Entiendo Albert, y como quedaría mi form action="" ?

Atte,
Daniel C.

Albert Lombarte

unread,
Jun 11, 2014, 4:50:22 PM6/11/14
to sif...@googlegroups.com
No necesitas ponerlo si el controlador que muestra el form es el mismo que lo recibe. Aunque eso ya no es Sifo, es comportamiento del html solamente.

Saludos

Sent from Mailbox
Reply all
Reply to author
Forward
0 new messages