Como generar archivos Excel desde Yii Framework

php excel yii

Con esta entrada usted sera capaz de generar hojas de calculo como archivos excel ó libreoffice, desde el Framework de PHP Yii. Para ello usaremos una extensión que integra PHPExcel a nuestro sistema en Yii.

– Instalar yii-phpexcel

Sigue leyendo

Instalar Boostrap a Yii Framework

yii booster boostrap yii
  • Descargar Yii Booster de su pagina oficial http://yiibooster.clevertech.biz/
  • Descomprimir
  • Renombrar yiibooster-4.0.1 a yiibooster
  • Copiar yiibooster al /protected/extensions/ quedando entonces /protected/extensions/yiibooster
  • a continuación agregaremos algunos valores en el archivo de configuración   /protected/config/main.php
  • En el arreglo donde se precargan componentes (en la linea 13 si es una instalación limpia) agregamos “yiibooster”, quedando entonces así:   ‘preload’=>array(‘log’, ‘yiibooster’),
  • En la sección del modulo Gii, agregaremos la linea: ‘generatorPaths’ => array(‘booster.gii’),

Sigue leyendo

#Yii – Controlador desde Controlador

controlador-yii

En esta entrada practicaremos hacer llamados a controladores específicos y sus acciones, desde otros controladores en los que sea requerido.

La practica consiste en lo siguiente: Necesitamos desde un controlador ( PrincipalController.php ), usar acciones que se encuentran en otros dos controladores (OperacionesController.php y PublicoController.php respectivamente).

.

OperacionesController.php

<?php

class OperacionesController extends Controller{

public function actionSumar($a,$b){

if( is_null($a) && is_null($b) ){
$a= 6;
$b= 7;
}

$resultado = $a + $b;
if(!is_numeric($a) || !is_numeric($b))
throw new CHttpException(404,'Epa no es un dato numerico.');
else
return $resultado;

}

}

.

PublicoController.php

<?php

class PublicoController extends Controller{

public function actionCapturarVisitante($aleatorio){

$visitante = "<br> IP:{$_SERVER["REMOTE_ADDR"]}<br>";
$visitante .= "HOST:{$_SERVER["REMOTE_PORT"]}<br>";
$visitante .= "URI:{$_SERVER["REQUEST_URI"]}<br>";
$visitante .= "Fecha: ".date("d-m-Y h:i:s")."<br>";
$visitante .= "Navegador: {$_SERVER["HTTP_USER_AGENT"]}<br>";
$visitante .= "Identificador: {$aleatorio}<br><br>";

return $visitante;

}

}

.

PrincipalController.php

En este controlador usamos las acciones de los controladores anteriores. Al controlador OperacionesController.php y sus acciones accederemos indicando que nuestro controlador extiende del mismo (linea 3), recordando y entendiendo que al final de cuentas un controlador no es mas que una clase y sus acciones los métodos de esta clase (linea 7). Ahora las acciones del controlador PublicoController.php las capturaremos indicando: el controlador objetivo + la acción objetivo + los parámetros si los requiere como lo indica la linea 9.

<?php

class PrincipalController extends OperacionesController{

public function actionMivista(){

$suma = $this->actionSumar(11,3);

$visitante = PublicoController::actionCapturarVisitante(rand(10000,99999));

$this->render('mivista',
array( 'suma' => $suma, 'visitante' => $visitante ));
}

}

.

En el archivo protected/config/main.php especificar que se importaran todos los controladores agregando la siguiente linea en el bloque import: ‘application.controllers.*’

De lo contrario es probable que experimenten este tipo de errores:

include(OperacionesController.php): failed to open stream: No such file or directory

.

Vista generada desde PrincipalController.php

protected/views/principal/mivista.php

<h1>Controlador desde controlador en Yii</h1>

<b><?php echo 'El resultado de la suma es: '.$suma ?> </b>

<b><br /><br />Datos del visitante: </b><?php echo $visitante ?>

<div>
<?php echo CHtml::submitButton('Enviar'); ?>
</div>

Finalmente nuestra vista mostrara información que se genero y proceso desde tres controladores distintos.

controlador-yii

Vista en Yii usan en backend 3 controladores

Existen otros medios de realizar tareas iguales o similares, una u otra forma serán mas eficientes o mas acordes según el entorno, variables y las propias reglas de negocio que regulen su desarrollo en yii.

Lecturas muy recomendadas:

http://www.yiiframework.com/doc/guide/1.1/es/basics.controller

http://yiiframework.wordpress.com/2009/01/21/basico-modelo-vistas-y-controladoresmvc/

http://blog.jorgeivanmeza.com/2010/01/los-controladores-en-yii-2/

El problema de los booleanos en Yii usando postgreSQL

error-boolean-integer-yii-postgres

Actualmente Yii en su versión mas reciente (1.1.14) y por lo menos desde la versión 1.0, trae por defecto un inconveniente para el trabajo de inserción en tipos de datos BOOLEAN en el motor de datos PostgreSQL. A continuación un breve recorrido de la problemática, incluyendo la resolución del problema. El ejemplo es en base a: Debian Wheezy, Apache 2.2.22, PHP 5.4.4, PostgreSQL 9.2, Yii 1.1.14.

.

CREATE TABLE tipo_de_datos
(
id integer NOT NULL DEFAULT nextval(‘”tipo-de-datos_id_seq”‘::regclass), — clave primaria
nombre character varying(60) NOT NULL, — campo tipo character varying de 60
valido boolean NOT NULL DEFAULT true, — tipo boolean TRUE o FALSE
creado_en timestamp without time zone, — fecha y hora de creacion del registro timestamp without time zone
actualizado_en timestamp without time zone NOT NULL DEFAULT now(), — fecha y hora de creacion del registro timestamp without time zone
CONSTRAINT pk_id PRIMARY KEY (id)
)

boolean-yii-postgres

boolean-yii-postgres

E.

..:: El error y objetivo de esta entrada:

CDbCommand failed to execute the SQL statement: SQLSTATE[42804]: Datatype mismatch: 7 ERROR: la columna «valido» es de tipo boolean pero la expresión es de tipo integer
LINE 1: … “nombre”, “creado_en”, “actualizado_en”) VALUES (1, ‘prueba…
^
HINT: Necesitará reescribir la expresión o aplicarle una conversión de tipo.. The SQL statement executed was: INSERT INTO “tipo_de_datos” (“valido”, “nombre”, “creado_en”, “actualizado_en”) VALUES (:yp0, :yp1, :yp2, :yp3)

.

error-boolean-integer-yii-postgres

error-boolean-integer-yii-postgres

.

..:: Solución

Comentar la linea: ‘emulatePrepare’ => true, en protected/config/main.php

Para saber mas sobre emulatePrepare y el por que quitarlo visite los siguientes enlaces:

http://www.yiiframework.com/doc/api/1.1/CDbConnection#emulatePrepare-detail

http://www.yiiframework.com/forum/index.php/topic/33152-database-error-convert-boolean-to-integer/

https://bugs.php.net/bug.php?id=62593

Una vez comentada dicha linea (por defecto en el config/main.php en la linea 57) debería guardar el registro.

.

boolean-yii

#Yii guardando booleano en postgreSQL

#Yii – ComboBox en filtros del CGridView

dropdown-yii-CGridView
<?php $this->widget('zii.widgets.grid.CGridView', array(
	'id'=>'localidad-grid',
	'itemsCssClass' => 'table table-striped',
	'dataProvider'=>$model->search(),
	'filter'=>$model,
	'columns'=>array(
		'id',
		'id_estado'=>array(
		    'name' => 'id_estado',
	            'value' => '$data->idEstado->nombre',
	            'filter'=> CHtml::listData(GeoEstado::model()->findAll(array('order'=>'nombre')), 'id', 'nombre')
	        ),
		'id_municipio',
		'id_parroquia',
		/*'texto',*/
		array(
			'class'=>'CButtonColumn',
		),
	),
)); ?>

Estado es una tabla relacionada a Localidad, su campo de clave primaria es id y el campo con el texto para mostrarle al usuario es nombre

filter-yii-CGridView

filter-yii-CGridView

  Sigue leyendo 

Sessions en base de datos con Yii

Yii +Session + Database +Users + Ip

CDbHttpSession es la clase encargada en Yii de proveer almacenamiento de las sesiones en base de datos.

en el archivo protected/config/main.php colocaremos dentro de la sección ‘components’

'session' => array (
    'class' => 'system.web.CDbHttpSession',
    'connectionID' => 'db',
    'sessionTableName' => 'tblsession',
),

Esto nos creara mágicamente una tabla en nuestra base de datos con el nombre que indicamos en sessionTableName, si no indicamos este atributo la tabla sera creada con el nombre YiiSession. Esta tabla tendrá tres (3) campos: id, expire, data

A este punto si usamos el sistema, la tabla tblsession tendrá almacenada nuestra session

yii-sessions

Sessions creadas en Yii y almacenadas en PostgreSQL

.

Extendiendo CDbHttpSession para agregar valores adicionales

Agregaremos el usuario que se autentica y su dirección ip a las sesiones que gestionaremos en nuestra base de datos, para ello extenderemos la clase CDbHttpSession adaptandola a nuestras necesidades. Esto lo lograremos en dos (2) sencillos pasos: Sigue leyendo