Crear archivos batch en symfony
por tryke en Dic.17, 2008, dentro Symfony
Crear archivos batch con symfony considero que es una de las tareas menos documentadas dentro del framework.
En este post veremos un ejemplo de como hacer un proceso batch para enviar un mailing a todos los usuarios con nuestro boletin.
En primer lugar ejecutaremos el comando init-batch de symfony para que cree el archivo batch.
-
symfony init-batch default [yourBatchName] [yourApplicationName]
El comando crea automaticamente un archivo en el directorio batch de nuestro proyecto.
-
<?php
-
-
/**
-
* yourBatchName batch script
-
*
-
* Here goes a brief description of the purpose of the batch script
-
*
-
* @package yourProject
-
* @subpackage batch
-
* @version $Id$
-
*/
-
-
define('SF_ROOT_DIR', realpath(dirname(__file__).'/..'));
-
define('SF_APP', 'yourApplicationName');
-
define('SF_ENVIRONMENT', 'dev');
-
define('SF_DEBUG', 1);
-
-
require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');
-
-
// initialize database manager
-
//$databaseManager = new sfDatabaseManager();
-
//$databaseManager->initialize();
-
-
// batch process here
-
?>
Como podemos observar por defecto te crea un comentario con las llamadas necesarias para inicializar nuestro acceso a la base de datos.
En primer lugar deberemos crearnos un modulo para el envio de emails, a este modulo nosotros lo hemos llamado “email” y la acción “boletin” es la encargada de realizar el envio. En la acción de este modulo leeremos el parametro “usuario_id” que será el que identifica el usuario receptor del mensaje.
actions.class.php
-
<?php
-
class emailActions extends sfActions
-
{
-
public function executeBoletin()
-
{
-
$this->i18n = $this->getContext()->getI18N();
-
$this->usuario = UsuarioPeer::retrieveByPK($this->getRequestParameter('usuario_id'));
-
if (!$this->usuario) {
-
return sfView::NONE;
-
}
-
if (!$this->usuario->getMailavisos()) {
-
return sfView::NONE;
-
}
-
$this->i18n->setCulture($this->usuario->getCulture());
-
-
$this->mail = new sfMail();
-
$this->setMailer('sendmail');
-
$this->setCharset('utf-8');
-
$this->setContentType('text/html');
-
-
$this->mail->setSender('no-reply@miweb.com', 'miweb.com');
-
$this->mail->setFrom('no-reply@miweb.com', 'miweb.com');
-
$this->mail->addAddress($this->usuario->getEmail());
-
$this->mail->setSubject($this->i18n->__('Boletin semanal', null, 'email'));
-
}
-
}
-
?>
Por otro lado montamos el template que será el que contiene el cuerpo del mensaje con el boletin a enviar.
boletinSuccess.php
-
<?php echo sprintf('%s <b>%s</b>', __('Hola', null, 'email'), $usuario->getNombre() ); ?><br>
-
<?php echo __('Este es tu boletin semanal', null, 'email') ?>
Para finalizar solo tenemos que retocar el fichero batch que hemos creado anteriormente para que lea de la base de datos todos los usuarios y vaya enviando el boletin.
batch_boletin.php
-
<?php
-
/**
-
* yourBatchName batch script
-
*
-
* Here goes a brief description of the purpose of the batch script
-
*
-
* @package yourProject
-
* @subpackage batch
-
* @version $Id$
-
*/
-
set_time_limit(0);
-
-
define('SF_ROOT_DIR', realpath(dirname(__file__).'/..'));
-
define('SF_APP', 'yourApplicationName');
-
define('SF_ENVIRONMENT', 'dev');
-
define('SF_DEBUG', 1);
-
define('SF_LOG_DEBUG', 'crit');
-
-
require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');
-
-
// initialize database manager
-
$databaseManager = new sfDatabaseManager();
-
$databaseManager->initialize();
-
-
// batch process here
-
sfLogger::getInstance()->log('Inicio envio boletin (' . date('Y-m-d H:m:i') . ')…', SF_LOG_DEBUG);
-
-
$c = new Criteria();
-
$usuarios = UsuarioPeer::doSelect($c);
-
-
foreach ($usuarios as $s) {
-
sfContext::getInstance()->getRequest()->setParameter('usuario_id', $s->getId()); //Pasa el usuario por parametro
-
sfContext::getInstance()->getController()->sendEmail('email', 'boletin'); //Envia el email al usuario
-
sfLogger::getInstance()->log('envio boletin: ' . $s->getId(), SF_LOG_DEBUG); //Añado una linea en el log
-
sleep(rand(0,4)); //Espera un máximo de 4s por envio para evitar ser catalogado como spam
-
}
-
-
sfLogger::getInstance()->log('Fin envio boletin (' . date('Y-m-d H:m:i') . ')…', SF_LOG_DEBUG);
-
?>
Si quisieramos podriamos poner nuestro archivo batch_boletin en el cron del servidor para que se ejecutará semanalmente.
Crear url a partir de un texto con PHP
por tryke en Dic.17, 2008, dentro PHP
En algunas ocasiones puede interesarnos generar urls dinamicamente a partir de un título.
Esta técnica se utiliza mucho por temas de posicionamiento en buscadores. Yo no he sabido encontrar ninguna función en PHP que te quite los acentos para poder generar una url a partir de un texto. Asi que me cree mi propia solución para este problema.
La idea es muy simple, creamos una pequeña función que mediante expresiones regulares sustituya los caracteres con acentos por el caracter que más se le asemeja.
función para quitar acentos
-
<?php
-
static public function fsPath($texto) {
-
$s = trim($texto);
-
$s = strtolower($s);
-
$s = ereg_replace("[ ]+","-",$s);
-
$s = ereg_replace("ç","c",$s);
-
$s = ereg_replace("ñ","n",$s);
-
$s = ereg_replace("á|à|â|ã|ä|â|ª","a",$s);
-
$s = ereg_replace("í|ì|î|ï","i",$s);
-
$s = ereg_replace("é|è|ê|ë","e",$s);
-
$s = ereg_replace("ó|ò|ô|õ|ö|º","o",$s);
-
$s = ereg_replace("ú|ù|û|ü","u",$s);
-
$s = ereg_replace("[^a-z0-9_-]",'',$s);
-
return substr($s, 0, 40);
-
}
-
?>
Por último se corta el texto para que tenga un máximo de 40 caracteres para evitar que salgan URLs demasiado largas.
ejemplo
-
<?php
-
$titulo = "Casa en cataluña";
-
$url = fsPath($titulo) . ".html";
-
echo $url; //casa-en-cataluna.html
-
?>
Compresor Ziv-Lemple en C++
por admin en Dic.16, 2008, dentro C++
En este articulo os enseñare un pequeño ejemplo de como realizar un compresor de texto.
Es un simple programa para la compresión y descompresión mediante una codificación realizada con el algoritmo Ziv-Lemple.
Compresor / Descompresor Ziv-Lemple

Aquí se encuentra tanto el ejecutable como el código fuente para un compilador C++ Builder.
Esta programado en entorno windows y solo hay que indicar el archivo de origen y el de destino.
Mover objetos 3D en C++
por admin en Dic.16, 2008, dentro C++
El tema de gráficos en 3D es algo tremendamente complicado. Es necesario buenos conocimientos matemáticos para poder realizar cosas medianamente serias.
Siempre es aconsejable utilizar algún tipo de framework que nos permita trabajar de una forma sencilla.
Por suerte nuestros amigos de NeHe han creado un conjunto de librerias bastante utiles para poder realizar efectos mediante el uso de OpenGL.

Este ejemplo esta creado mediante C++ Builder.










