Estas en: Home > Programación

Entradas etiquetadas con Programación

Ebooks de desarrollo gratuitos

0

Al final, por mucho contenido que haya en internet, los desarrolladores terminamos tirando de libros. Por suerte para nuestros bolsillos hay páginas que nos ofrecen muchos conocimientos comprimidos en un ebook, como es el caso que os traigo hoy.

En esta web encontraréis una decena de  ebooks de desarrollo, desde SQL Server a Ensamblador, pasando por Windows Store, F#, Git, jQuery, etc.

Disfrutadlo, y recordad: el conocimiento os hará libres.

http://www.syncfusion.com/resources/techportal/ebooks?utm_medium=devmediaebOct13

Drupal logo

Crear un rol de usuario en Drupal 7 sin usar la interfaz de administración

0

Normalmente cuando trabajamos con Drupal utilizamos la interfaz de administración para configurar nuestra aplicación web, y por norma general esto es suficiente para lo que queremos hacer. Sin embargo, en otros casos nos encontramos con que necesitamos generar nuevos roles de usuario (administrador, usuario identificado, etc.) además de los que vienen por defecto en Drupal, pero a través del código fuente, ya sea porque trabajamos dentro de un equipo de desarrollo y no tiene sentido estar compartiendo la bd entre todos los desarrolladores cada vez que se realiza un cambio de configuración (además de poco productivo terminará provocando perdidas de datos y errores), o porque estamos desarrollando un perfil de instalación y queremos reducir al mínimo los pasos manuales que hay que realizar para instalar nuestra aplicación web, por ejemplo.

Para ello debemos añadir a nuestra aplicación el siguiente código:

 

$new_user_role = new stdClass();
$new_user_role->name = 'moderator';
$new_user_role->weight = 4;
user_role_save($new_user_rol);

Como ves, el código es bastante sencillo. En primer lugar creamos una instancia de la clase stdClass(); a continuación le damos un nombre y un peso (recuerda que el rol de administrador es el 3, que es el más alto de lo roles por defecto de Drupal), y por último lo guardamos.

Cron Job WordPress

WordPress 3.x para desarrolladores: Introducción

0

Después de varias semanas buscando información sobre WordPress para un proyecto que tenía pendiente (ya acabado), he observado que hay cierta escasez de información sobre el desarrollo de WordPress, ya que la mayoría de tutoriales o manuales que rondan por internet están limitados a la creación básica de plugins o a lo más básico de la creación de plantillas.

Por ello voy a realizar un tutorial que, basandome en el tema Twenty Eleven de WordPress permita conocer el funcionamiento de los temas y las plantillas. Para desarrollar la parte de los plugins se creará uno de ejemplo.

Muchos ejemplos de código serán de la documentación principal de WordPress y es la que deberías consultar más habitualmente si vas a desarrollar para WordPresshttp://codex.wordpress.org/Main_Page

Durante las próximas semanas publicaré un tema por semana hasta que se complete el tutorial.

Logo Cassandra

Cassandra 1.x y PHP para desarrolladores SQL: phpCassa (II)

0

En el anterior post traté las acciones habituales que realizamos con Cassandra: guardar, actualizar y eliminar. Sin embargo aun quedan dos acciones muy útiles por tratar: los contadores y los indices secundarios.

 

CONTADORES

Los contadores son en realidad un tipo especial de validador de Column Family.

 

CREAR UN CONTADOR 

Para crearla procedemos de la siguiente manera:

– Accedemos a Cassandra Cluster Admin:

Página principal de Cassandra Cluster Admin

– Entramos en el keyspace con el que estamos trabajando:

Detalle del keyspace my_keyspace

– Pulsamos en Create New Column Family y escribimos los siguientes datos:

Datos para crear una Column Family con contadores

– En Default Validation Class el texto completo a escribir es:

org.apache.cassandra.db.marshal.CounterColumnType

– Y pulsamos el botón Create Column Family.

Varias cosas sobre los CounterColumn:
– Para crear los CounterColumns es obligatorio indicar en Default Validation Class la clase de validador correcto. Indicado más arriba.
– Los contadores puedes tener números positivos o negativos.
– Los CounterColumns no son un sustituto de el autoincrement de las bases relacionales.

Ahora que ya está creada la Column Family es hora de programar.

 

GUARDAR Y/O ACTUALIZAR UN CONTADOR 

En nuestra clase en cassandra.php creamos el siguiente método:

 

  1. <?php
  2.  
  3. public function guardarContador($name_columnFamily, $key, $column, $value=1, $super_column=NULL){
  4.  
  5. try {
  6. if (!is_null($super_column)){
  7. $column_family = new SuperColumnFamily($this->conexion, $name_columnFamily);
  8. $column_family->add($key, $super_column, $column, $value);
  9. }
  10. else{
  11. $column_family = new ColumnFamily($this->conexion, $name_columnFamily);
  12. $column_family->add($key, $column, $value);
  13. }
  14. return true;
  15. }
  16. catch(Exception $e){
  17. return false;
  18. }
  19. }

 

Con este método podremos incrementar o disminuir el contador.


$name_columnFamily
: Es el nombre de la column family donde se encuentra el contador a modificar.

$key: Clave del registro donde se encuentra el contador.
$column: Nombre del contador.
$value: Valor a añadir al contador.
$super_column: Clave de la super column donde se encuentra el contador.

Añadimos el siguiente código a nuestro archivo test.php:

  1. <?php
  2.  
  3. if ( $cass->guardarContador('column_family_counter', 'post', 'num_total_post', 1)){
  4. print "El contador se ha actualizado correctamente<br />";
  5. }else{
  6. print "Error al actualizar el contador<br />";
  7. }
  8.  
  9. $result = $cass->obtener('column_family_counter', 'post');
  10.  
  11. print_r($result);

Como ves, para recuperar un contador se utiliza el mismo método que para obtener cualquier otro registro. El resultado de este código sería:

El contador se ha actualizado correctamente
 Array ( [num_total_post] => 1 )

 

PONER A CERO EL CONTADOR

Para poner a cero un contador hay que restarle el valor que tenga en ese momento el contador. En test.php escribiríamos lo siguiente:

  1. <?php
  2.  
  3. if ( $cass->guardarContador('column_family_counter', 'post', 'num_total_post', ($result['num_total_post']*-1))){
  4. print "El contador se ha actualizado correctamente<br />";
  5. }else{
  6. print "Error al actualizar el contador<br />";
  7. }
  8.  
  9. $result = $cass->obtener('column_family_counter', 'post');
  10.  
  11. print_r($result);

Y el resultado:

El contador se ha actualizado correctamente
 Array ( [num_total_post] => 0 )

 

INDICES SECUNDARIOS

Los indices secundarios son un objeto especial en Cassandra que nos permite realizar búsquedas por columnas concretas.

Estos índices solo funcionan en las column family standard, con lo que su uso se ve bastante limitado.

 

 

CREAR UN INDICE SECUNDARIO

Para ello vamos a nuestro Cassandra Cluster Admin y en la column family my_column_family_standard pulsamos en Create Secondary Index:

Detalle de la ubicación del botón Create Secondary Index

Detalle de la ubicación del botón Create Secondary Index

– Nos aparecerá el siguiente formulario:

Detalle del formulario para crear un índice secundario

Detalle del formulario para crear un índice secundario

– Para nuestro cometido vamos a crear el siguiente índice secundario:

Formulario con los datos para el ejemplo

Formulario con los datos para el ejemplo

–  Pulsamos en Add Secondary Index.

 

REALIZAR UNA CONSULTA CON UN INDICE SECUNDARIO 

Nos vamos a nuestro archivo cassandra.php y añadimos el siguiente método:

  1. <?php
  2.  
  3. private function getIndexOperator($value){
  4. switch ($value){
  5. case '=':
  6. $operator = 'EQ';
  7. break;
  8. case '>=':
  9. $operator = 'GTE';
  10. break;
  11. case '>':
  12. $operator = 'GT';
  13. break;
  14. case '<=':
  15. $operator = 'LTE';
  16. break;
  17. case '<':
  18. $operator = 'LT';
  19. break;
  20. default:
  21. $operator = 'EQ';
  22. break;
  23. }
  24.  
  25. return $operator;
  26. }

Este método nos permitirá trabajar con operadores diferentes a la igualdad, pudiendo utilizar >,<,>=,<=.

Pero para poder trabajar con índices es necesario incluir en nuestro listado de namespaces dos nuevas clases, tal y como se muestra en el siguiente código:

  1. <?php
  2.  
  3. use phpcassa\Connection\ConnectionPool;
  4. use phpcassa\ColumnFamily;
  5. use phpcassa\SuperColumnFamily;
  6. use phpcassa\ColumnSlice;
  7. use phpcassa\SystemManager;
  8. use phpcassa\Schema\StrategyClass;
  9. use phpcassa\Index\IndexExpression;
  10. use phpcassa\Index\IndexClause;

A continuación creamos el método que generará la consulta con los índices secundarios.

 

  1. <?php
  2.  
  3. public function obtenerPorIndices($name_columnFamily, $arrayColumnsValues, $range_start = "", $range_end = '', $column_count = 100, $invertir_orden = false){
  4.  
  5. try{
  6. // Creamos el objeto
  7. $column_family = new ColumnFamily($this->conexion, $name_columnFamily);
  8.  
  9. // Inicializamos las variables
  10. $index_exp = array();
  11. $registros = array();
  12.  
  13. // Creamos un array de index_expression
  14. foreach($arrayColumnsValues as $key => $value){
  15. if (array_key_exists('operator', $value)){
  16. $op = $this->getIndexOperator($value['operator']);
  17. }
  18. else{
  19. $this->getIndexOperator('=');
  20. }
  21.  
  22. $column = $value['values'];
  23. $key_column = key($column);
  24.  
  25. $index_exp[] = new IndexExpression($key_column, $column[$key_column], $op);
  26. }
  27.  
  28. // Creamos la index_clause
  29. $index_clause = new IndexClause($index_exp, $range_start, $column_count);
  30.  
  31. // Creamos la column_slice
  32. $column_slice = new ColumnSlice($range_start, $range_end, $column_count, $invertir_orden);
  33.  
  34. // Recuperamos los registros
  35. $rows = $column_family->get_indexed_slices($index_clause, $column_slice);
  36.  
  37. foreach($rows as $key => $columns){
  38. if (!array_key_exists($key, $registros)){ $registros[$key] = null; }
  39. $registros[$key] = $columns;
  40. }
  41. return $registros;
  42. }catch (Exception $e){
  43. return false;
  44. }
  45. }

 

Con este método podremos buscar registros con varios índices secundarios.

Lo primero que hacemos en este método es crear el objeto ColumnFamily que nos proveerá de los métodos para hacer la consulta con indices secundarios. A continuación inicializamos varias variables necesarias para el método.

Dentro de un bucle creamos un array de IndexExpression(). Este objeto le indicará a Cassandra qué indices, con qué valores y qué operador se deben buscar los registros.

Seguidamente creamos la iIndexClause(), que nos permite indicarle la key desde la que comenzará a recuperar registros y el número de registros a obtener.

Por último recuperamos los registros utilizando el método get_indexed_slices().

Para probar el método vamos a crear datos de prueba en test.php y haremos la consulta:

 

  1. <?php
  2.  
  3. $data[] = array(
  4. 'title' => 'Apache Cassandra',
  5. 'license' => 'Open Source',
  6. 'category' => 'no-sql',
  7. );
  8.  
  9. $data[] = array(
  10. 'title' => 'MongoDB',
  11. 'license' => 'Open Source',
  12. 'category' => 'no-sql',
  13. );
  14.  
  15. $data[] = array(
  16. 'title' => 'MySQL',
  17. 'license' => 'Open Source',
  18. 'category' => 'sql',
  19. );
  20.  
  21. foreach($data as $key => $value){
  22. $cass->guardar('my_column_family_standard', $key, $value);
  23. }
  24.  
  25. $arrayColumnsValues[] = array(
  26. 'values' => array(
  27. 'category' => 'no-sql'
  28. ),
  29. 'operator' => '='
  30. );
  31.  
  32. $result = $cass->obtenerPorIndices('my_column_family_standard', $arrayColumnsValues);
  33.  
  34. print_r($result);

 

Si ejecutamos el código anterior Cassandra nos devolverá:

Array ( [0] => Array ( [title] => Apache Cassandra [license] => Open Source [category] => no-sql ) [1] => Array ( [title] => MongoDB [license] => Open Source [category] => no-sql ) )

[ci-box type=”warning”]Al utilizar un operador diferente al = puede que Cassandra te devuelva un error. Para evitarlo añade otro indice secundario a la consulta pero con el operador =, siendo este la primera columna que Cassandra procese. Por alguna razón Cassandra devuelve un error si no se hace así. [/ci-box]

Con este post concluye la parte básica de PHPCassa, Cassandra y Cassandra Cluster Admin. En el próximo post y siguientes trataré varios temas que se han quedado un poco colgados o faltan por explicar como ordenar registros, cómo crear claves, mejorar el rendimiento de Cassandra, crear clusters, etc.

 

Logo Cassandra

Cassandra y PHP para desarrolladores SQL: phpCassa (II)

0

En el anterior post traté las acciones habituales que realizamos con Cassandra: guardar, actualizar y eliminar. Sin embargo aun quedan dos acciones muy útiles por tratar: los contadores y los indices secundarios.

 

CONTADORES

Los contadores son en realidad un tipo especial de validador de Column Family.

 

CREAR UN CONTADOR 

Para crearla procedemos de la siguiente manera:

– Accedemos a Cassandra Cluster Admin:

Página principal de Cassandra Cluster Admin

– Entramos en el keyspace con el que estamos trabajando:

Detalle del keyspace my_keyspace

– Pulsamos en Create New Column Family y escribimos los siguientes datos:

Datos para crear una Column Family con contadores

– En Default Validation Class el texto completo a escribir es:

org.apache.cassandra.db.marshal.CounterColumnType

– Y pulsamos el botón Create Column Family.

Varias cosas sobre los CounterColumn:
– Para crear los CounterColumns es obligatorio indicar en Default Validation Class la clase de validador correcto. Indicado más arriba.
– Los contadores puedes tener números positivos o negativos.
– Los CounterColumns no son un sustituto de el autoincrement de las bases relacionales.

Ahora que ya está creada la Column Family es hora de programar.

 

GUARDAR Y/O ACTUALIZAR UN CONTADOR 

En nuestra clase en cassandra.php creamos el siguiente método:

  1. <?php
  2.  
  3. public function guardarContador($columnFamily, $key, $column, $value=1, $super_column=NULL){
  4.  
  5. try {
  6. $column_family = new ColumnFamily($this->conexion, $columnFamily);
  7. $column_family->add($row_key, $column, $value, $super_column);
  8. return true;
  9. }
  10. catch(Exception $e){
  11. return false;
  12. }
  13. }

Con este método podremos incrementar o disminuir el contador.


$columnFamily
: Es el nombre de la column family donde se encuentra el contador a modificar.

$key: Clave del registro donde se encuentra el contador.
$column: Nombre del contador.
$value: Valor a añadir al contador.
$super_column: Nombre de la super column donde se encuentra el contador.

Añadimos el siguiente código a nuestro archivo test.php:

  1. <?php
  2.  
  3. if ( $cass->guardarContador('column_family_counter', 'post', 'num_total_post', 1)){
  4. print "El contador se ha actualizado correctamente<br />";
  5. }else{
  6. print "Error al actualizar el contador<br />";
  7. }
  8.  
  9. $result = $cass->obtener('column_family_counter', 'post');
  10.  
  11. print_r($result);

Como ves, para recuperar un contador se utiliza el mismo método que para obtener cualquier otro registro. El resultado de este código sería:

El contador se ha actualizado correctamente
Array ( [num_total_post] => 1 )

 

PONER A CERO EL CONTADOR

Para poner a cero un contador hay que restarle el valor que tenga en ese momento el contador. En test.php escribiríamos lo siguiente:

  1. <?php
  2.  
  3. if ( $cass->guardarContador('column_family_counter', 'post', 'num_total_post', ($result['num_total_post']*-1))){
  4. print "El contador se ha actualizado correctamente<br />";
  5. }else{
  6. print "Error al actualizar el contador<br />";
  7. }
  8.  
  9. $result = $cass->obtener('column_family_counter', 'post');
  10.  
  11. print_r($result);

Y el resultado:

El contador se ha actualizado correctamente
Array ( [num_total_post] => 0 )

 

INDICES SECUNDARIOS

Los indices secundarios son un objeto especial en Cassandra que nos permite realizar búsquedas por columnas concretas.

Estos índices solo funcionan en las column family standard, con lo que su uso se ve bastante limitado.

 

 

CREAR UN INDICE SECUNDARIO

Para ello vamos a nuestro Cassandra Cluster Admin y en la column family my_column_family_standard pulsamos en Create Secondary Index:

Detalle de la ubicación del botón Create Secondary Index

Detalle de la ubicación del botón Create Secondary Index

– Nos aparecerá el siguiente formulario:

Detalle del formulario para crear un índice secundario

Detalle del formulario para crear un índice secundario

– Para nuestro cometido vamos a crear el siguiente índice secundario:

Formulario con los datos para el ejemplo

Formulario con los datos para el ejemplo

–  Pulsamos en Add Secondary Index.

 

REALIZAR UNA CONSULTA CON UN INDICE SECUNDARIO 

Nos vamos a nuestro archivo cassandra.php y añadimos el siguiente método:

  1. <?php
  2.  
  3. public function obtenerPorIndices($columnFamily, $arrayColumnsValues, $rangeStart = "", $columnCount = 100, $ordenar = true){
  4.  
  5. try{
  6. // Creamos el objeto
  7. $column_family = new ColumnFamily($this->conexion, $columnFamily);
  8.  
  9. // Inicializamos las variables
  10. $index_exp = array();
  11. $registros = array();
  12.  
  13. // Creamos un array de index_expression
  14. foreach($arrayColumnsValues as $key => $value){
  15. $index_exp[] = CassandraUtil::create_index_expression($key, $value);
  16. }
  17.  
  18. // Creamos la index_clause
  19. $index_clause = CassandraUtil::create_index_clause($index_exp, $rangeStart, $columnCount);
  20.  
  21. // Recuperamos los registros
  22. $rows = $column_family->get_indexed_slices($index_clause, NULL, $rangeStart, '', $ordenar, $columnCount);
  23.  
  24. return $rows;
  25. }catch (Exception $e){
  26. return false;
  27. }
  28. }

Con este método podremos buscar registros con varios índices secundarios.

Lo primero que hacemos en este método es crear el objeto ColumnFamily que nos proveerá de los métodos para hacer la consulta con indices secundarios. A continuación inicializamos varias variables necesarias para el método.

Dentro de un bucle creamos un array de index_expression(). Este objeto le indicará a Cassandra qué indices y con qué valores se deben buscar los registros.

Seguidamente creamos la index_clause(), que nos permite indicarle la key desde la que comenzará a recuperar registros y el número de registros a obtener.

Por último recuperamos los registros utilizando el método get_indexed_slices().

Para probar el método vamos a crear datos de prueba en test.php y haremos la consulta:

  1. <?php
  2.  
  3. $data[] = array(
  4. 'title' => 'Apache Cassandra',
  5. 'license' => 'Open Source',
  6. 'category' => 'no-sql',
  7. );
  8.  
  9. $data[] = array(
  10. 'title' => 'MongoDB',
  11. 'license' => 'Open Source',
  12. 'category' => 'no-sql',
  13. );
  14.  
  15. $data[] = array(
  16. 'title' => 'MySQL',
  17. 'license' => 'Open Source',
  18. 'category' => 'sql',
  19. );
  20.  
  21. foreach($data as $key => $value){
  22. $cass->guardar('my_column_family_standard', $key, $value);
  23. }
  24.  
  25. $arrayColumnsValues = array(
  26. 'category' => 'no-sql',
  27. );
  28.  
  29. $result = $cass->obtenerPorIndices('my_column_family_standard', $arrayColumnsValues);
  30.  
  31. print_r($result);

Si ejecutamos el código anterior Cassandra nos devolverá:

Array ( [0] => Array ( [title] => Apache Cassandra [license] => Open Source [category] => no-sql ) [1] => Array ( [title] => MongoDB [license] => Open Source [category] => no-sql ) )

Con este post concluye la parte básica de phpCassa, Cassandra y Cassandra Cluster Admin. En el próximo post y siguientes trataré varios temas que se han quedado un poco colgados o faltan por explicar como ordenar registros, cómo crear claves, mejorar el rendimiento de Cassandra, crear clusters, etc.

 

Symfony: La vista (I), fragmentos de código

0

Debido a que la parte de Symfony que explicaré hoy es bastante densa no podré resumir en un solo post todo el capítulo referente a la Vista, por tanto este será el primero de una serie de post sobre la Vista en Symfony que se explica en el manual de Symfony.

La vista

Como ya he comentado en anteriores post, Symfony sigue el sistema de Modelo-Vista-Controlador (MVC) para que la realización de nuestros proyectos estén mucho mejor estructurados y sean más fáciles de comprender por otros programadores.

Symfony para crear las vistas o implementar el diseño que hemos creado a nuestro proyecto, utiliza plantillas, esto son trozos de código html que se unen para formar la página que ha pedido el usuario.

En Symfony todo el diseño se divide de la siguiente manera:

  • Layout: Es la parte del diseño que se mostrará en todas las páginas (cabeceras, pie, menú, etc).
  • Elementos parciales: Si el fragmento contiene poca lógica.
  • Componentes: Si el fragmento tiene mucha lógica o debe acceder a la base de datos.
  • Slots: Si el fragmento va a sustituir a una parte del layout y se mostrará una parte por defecto.

En el libro lo explican bastante bien como se dividen las plantillas, los fragmentos de código que se pueden utilizar, cómo pasar variables desde la acción a los fragmentos de código, y algún detalle más que viene bien conocer. Os dejo el link a los Fragmentos de código.

Normalmente cuando trabajamos con plantillas en nuestros proyectos PHP, utilizamos la instrucción include() y en Symfony podríamos añadir a nuestro código algo como lo siguiente:

<?php include(sfConfig::get(‘sf_app_template_dir’).’/miFragmento.php’) ?>

Pero esta forma de añadir fragmentos de código no es muy limpia y, además, la caché de Symfony no reconoce la instrucción include() con lo que ese fragmento no podría ser cacheado. Aquí es donde entran en juego los fragmentos de código que he comentado anteriormente.

ELEMENTOS PARCIALES

Observa un periódico digital, su portada concretamente, verás que las noticias estan encajadas como en recuadros imaginarios y que cada noticia sigue un patrón: un titular y un pequeño avance de la noticia. Eso es un elemento parcial. Podemos poner ese elemento parcial en cualquier parte de ese periódico digital, ya que siempre será importante que el usuario pueda acceder a otras noticias con un pequeño avance.

Symfony sigue esta misma lógica para los elementos parciales. Estos, al igual que las plantillas, se ubican en la carpeta “templates/” del proyecto y son accesibles desde el módulo en el que se encuentre el archivo, desde otro módulo o desde la carpeta raíz de las plantillas “templates/“. Los elementos parciales se diferencian de las plantillas por llevar un guión bajo al principio del nombre del archivo ( _elementoparcial.php). Veamos como llamar a los elementos parciales desde distintas ubicaciones:

// Incluir el elemento parcial de miaplicacion/modules/mimodulo/templates/_miparcial1.php
// Como la plantilla y el elemento parcial están en el mismo módulo,
// se puede omitir el nombre del módulo
<?php include_partial(‘miparcial1’) ?>

// Incluir el elemento parcial de miaplicacion/modules/otromodulo/templates/_miparcial2.php
// En este caso es obligatorio indicar el nombre del módulo
<?php include_partial(‘otromodulo/miparcial2’) ?>

// Incluir el elemento parcial de miaplicacion/templates/_miparcial3.php
// Se considera que es parte del módulo ‘global’
<?php include_partial(‘global/miparcial3’) ?>

PASANDO VARIABLES AL ELEMENTO PARCIAL

Primero definimos la variable en la acción del módulo llamado mimodulo (mimodulo/actions/actions.class.php)

class mimoduloActions extends sfActions
{
public function executeIndex()
{
$this->total = 100;
}
}

En la plantilla llamamos al elemento parcial con la función include_partial() y le pasamos la variable en mimodulo/templates/indexSuccess.php.

<p>¡Hola Mundo!</p>
<?php include_partial(‘miparcial’, array(‘mitotal’ => $total)
) ?>

De esta manera podremos usar la variable en el elemento parcial en mimodulo/templates/_miparcial.php.

<p>Total: <?php echo $mitotal ?></p>

COMPONENTES

Los componentes son como los módulos, pero más rápidos. Siguen la misma lógica que los módulos y tienen una estructura de archivos parecida. Para nombrar un componente se utiliza la palabra execute seguido del nombre del componente, por ejemplo:

La clase de los componentes, en modules/news/actions/components.class.php

<?php

class newsComponents extends sfComponents
{
public function executeHeadlines()
{
$c = new Criteria();
$c->addDescendingOrderByColumn(NewsPeer::PUBLISHED_AT);
$c->setLimit(5);
$this->news = NewsPeer::doSelect($c);
}
}

La parte visual de los componentes se crea utilizando los elementos parciales. Para nombrarlos se usa lo mismo que para los componentes solo que sustituyendo la palabra execute por un guión bajo.

El elemento parcial, en modules/news/templates/_headlines.php

<div>
<h1>Últimas noticias</h1>
<ul>
<?php foreach($news as $headline): ?>
<li>
<?php echo $headline->getPublishedAt() ?>
<?php echo link_to($headline->getTitle(),’news/show?id=’.$headline->getId()) ?>
</li>
<?php endforeach ?>
</ul>
</div>

Cada vez que se quiera añadir el componente a una plantilla, sólo será necesario escribir el siguiente código:

<?php include_component(‘news’, ‘headlines’) ?>

Paso de parámetros a un componente y su plantilla:

// Llamada al componente
<?php include_component(‘news’, ‘headlines’, array(‘parametro’ => ‘valor’)) ?>

// Dentro del componente
echo $this->parametro;
=> ‘valor’

// Dentro del elemento parcial _headlines.php
echo $parametro;
=> ‘valor’

SLOTS

Aquí debería hablaros de los slots que simplemente son una especie de elemento parcial configurable, y para explicároslo solo se me ocurre hacer un copy&paste del libro, así que os dejo el link (al final de la página) y espero que os ayude.

Pasar un proyecto symfony de un servidor a otro (a capón xD)

6

Sí, soy un poco bestia para algunas cosas jejeje; en este caso tuve que pasar el proyecto con el que estaba trabajando en el portatil al ordenador de sobremesa. En el portatil tengo instalada una versión de WAMP y en el sobremesa AppServ así que cuando pasé la carpeta del proyecto con un copy&paste y fui a ejecutarlo al navegador, obviamente no funcionaba, exactamente daba este error:

Warning: sfAutoload::require(C:/wamp/www/sf_sandbox/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/database/sfDoctrineDatabase.class.php) [sfautoload.require]: failed to open stream: No such file or directory in F:\AppServ\www\sf_sandbox\lib\vendor\symfony\lib\autoload\sfAutoload.class.php on line 188

Fatal error: sfAutoload::require() [function.require]: Failed opening required ‘C:/wamp/www/sf_sandbox/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/database/sfDoctrineDatabase.class.php’ (include_path=’.;F:\AppServ\php5\pear’) in F:\AppServ\www\sf_sandbox\lib\vendor\symfony\lib\autoload\sfAutoload.class.php on line 188

Continue reading “Pasar un proyecto symfony de un servidor a otro (a capón xD)” »

Mi primer ¡Hola Mundo! con Symfony

12

Ayer os mostré mi pequeña odisea para instalar Symfony en WAMP o al menos el SandBox, hoy toca empezar a programar.

Sigo con el libro en español de symfony.es. En el capítulo cuarto la cosa se empieza a poner interesante, voy a empezar a enrear con Symfony jejejeje.

Continue reading “Mi primer ¡Hola Mundo! con Symfony” »

Instalar Symfony + WAMP

26

Una de las cosas más entretenidas de un programador (al menos para mí), es la de reciclarse cada poco tiempo para no quedarse estancado. Yo estoy en este proceso y después de varios días intentando instalar Symfony junto con WAMP al fin lo he conseguido (Sí, me ha costado un huevo, ¡que pasa! xD); para que otros desarrolladores no tengan que dedicarse a buscar información sobre como instalar Symfony junto a WAMP voy a explicar como realizarlo, los fallos que me ha dado, como solucionarlos, etc. Vamos allá.

Continue reading “Instalar Symfony + WAMP” »

GestAuto, programa para gestión de autoescuelas

16

LA APLICACIÓN SE HA RELANZADO, SI QUIERES AYUDAR  PROBANDO LA APLICACIÓN O APORTANDO SUGERENCIAS SIGUE EL SIGUIENTE LINK: GestAuto 0.0.1.0 pre-alpha, la aplicación de gestión de autoescuelas open source se relanza

Hace un tiempo comencé a desarrollar una aplicación para la gestión de autoescuelas, que por desgracia no tengo tiempo para continuar desarrollando, y me daba pena que el trabajo de muchos meses se quedase olvidado en un rincón del disco duro. Al final me he decidido a publicar lo que tengo hecho y bajo la licencia GPL v3.

¡OJO! LA APLICACIÓN NO ESTÁ TERMINADA, (ya me gustaría) AUNQUE SI SE PUEDE PROBAR SIN QUE GENERE ERRORES O LA APLICACIÓN SE CIERRE. PERO REPITO, NO ESTÁ TERMINADA, Y NO ME HAGO RESPONSABLE DE LA PERDIDA DE DATOS QUE PUEDA PRODUCIR UN ERROR EN LA APLICACIÓN.

Datos técnicos de la aplicación:

  • Está programado en VB .NET (sí lo se, no es lo mejor para programar, pero a falta de conocimientos de C/C++, no me quedaba otra), está divido por clases y algún componente que tuve que crear. El código, no está precisamente muy comentado, (lo siento), aunque podréis preguntarme cualquier duda que tengais sobre el código.
  • Base de datos Access (sí, también lo se, no es precisamente lo mejor), aunque sería relativamente sencillo crear una clase para conectar con una base de datos MySQL, por ejemplo, ya que la conexion a la BD y los métodos de acceso a los datos, están en una clase separada del resto del código.
  • A través de MONO se podría ejecutar en GNU/Linux.

Características de la aplicación:

  • Puede manejar multiples autoescuelas (No recuerdo si comprobé que lo hacía correctamente, pero en principio estaba pensado para ello).
  • Puede manejar multiples tasas, matriculas, precios, ofertas, cursos, clases,  etc.
  • Puede elegirse un profesor para las clases teóricas y otro para las prácticas.
  • Impresión de documentos oficiales (Creo que solo imprimía la prueba de aptitud, y únicamente para la Comunidad de Madrid)
  • Listados de alumnos, profesores, vehículos, autoescuelas, etc.
  • Gestión de alumnos, profesores, autoescuelas y vehículos (Esta última parte la deshabilité del programa ya que aun no estaba acabada, aunque en el código si aparece y se puede habilitar la pestaña).
Ir arriba