Deshabilitar CWebLogRoute de Yii para las acciones.

Ok, cual es la razón del por qué quiero hacer esto ? Estoy diseñando un API RESTful para conexión entre sistemas, y al devolverme además el contenido del CWebLogRoute hace que el receptor se maree, por lo que necesito que para las acciones de un controlador específico esto no ocurra. Para mi caso solo deshabilitare … Leer más

Cambiar Checkbox con Ajax en Yii

A veces nos vemos en la necesidad de cambiar una característica del sistema de una manera sencilla. En mi caso fue las operaciones asignadas a los roles de un usuario. Si lo se, existen plugins para esto…. pero para mi era más sencillo hacerlo de manera directa. El resultado es algo como lo siguiente : … Leer más

La forma sencilla de incluir AWS en YII Framework ( Ejemplo con S3 )

Hace poco me vi en la necesidad de generar máquinas auto replicables en EC2 y me di cuenta de que mi arquitectura tenía un pequeño problema.

Si bien la base de datos era externa usando AmazonRDS la inserción de las imágenes en el servidor era local, por lo que si la imagen se subía en una replica y esta era eliminada la imagen también se perdía.

Estuve debatiendo bastante si subir las imágenes a la base de datos como blobs o si tener un servidor externo de imágenes. Al final decidí utilizar AmazonS3 para el almacenamiento de las imágenes.

Amazon posee una amplia gama de scripts y códigos ya incorporados para hacer todas las consultas hacia TODOS sus servicios, además de muchos SDKs para los distintos lenguajes. En mi caso SDK for PHP.

Ahora, la implementación en YII para mi no fue trivial :

  1. Al usar Yii::import no me cargaban todas las clases necesarias. Esto es debido a que el SDK también tiene su propio autoload.
  2. Cargar todas las clases de manera manual es tedioso.
  3. Crear un ClassMap no era una buena opción debido a que el SDK es muy variable y posee muchas actualizaciones.

La solución más sencilla que encontré fue en otro blog. Lenzy simplemente edito el autoload del SDK para que funcionara con el de Yii.

Que es lo que haremos;

  1. Incluiremos el código del SDK en la carpeta protected/vendors/AWS de YII ( Ojo, crear la carpeta AWS )
  2. Modificaremos el loader del SDK
  3. Haremos una pequeña prueba 😀

Asumiendo que todos sabemos como copiar y pegar, nos saltaremos a la parte de modificar el loader. En el archivo sdk.class.php que se encuentra en el root de la carpeta del sdk ( En nuestro caso la carpeta AWS en protected/vedors ). reemplazaremos la siguiente línea de código:

spl_autoload_register(array('CFLoader', 'autoloader'));

con esta :

spl_autoload_register(array('CFLoader', 'autoloader'),false,true);

Con esto dejaremos de tener problemas que las clases no son encontradas, como por ejemplo las clases que aparecen a continuación, además del problema de que no se cargan las credenciales que están en el archivo de configuración.

  1. AmazonSES
  2. AmazonS3
  3. CFRuntime
  4. CFUtilities
  5. CFComplexType
  6. RequestCore
  7. CFRequest
  8. CFResponse
  9. CFSimpleXML
  10. CFCredential
  11. CFCredentials

Para probarlo primero en el archivo de configuración ponemos nuestras credenciales. El archivo es llamado config.inc.php y simplemente cambiamos los valores de key y de secret.

		// Amazon Web Services Key. Found in the AWS Security Credentials. You can also pass
		// this value as the first parameter to a service constructor.
		'key' => 'MYKEY',

		// Amazon Web Services Secret Key. Found in the AWS Security Credentials. You can also
		// pass this value as the second parameter to a service constructor.
		'secret' => 'MYSECRET PASS',

Ahora para probarlo simplemente en una action de prueba para un controlador ingresamos el siguiente código

                    Yii::import('application.vendors.*');
                    require_once('AWS/sdk.class.php');


                    $s3 = new AmazonS3();
                    $bucketname = "elnombre de mi bucket";

                    $response = $s3->create_object($bucketname, "NOMBRE ARCHIVO", array(
                        'fileUpload' => "DIRECCION DE MI ARCHIVO",
                        'acl' => $s3::ACL_PUBLIC
                            ));

Si todo sale bien luego de ejecutarlo podemos ir a la consola de administración para S3 y revisamos si el archivo fue creado satisfactoriamente.

Crear un Widget en Yii + Botón Volver

Crear un widget en Yii es muy sencillo, y nos sirve para rehusar código de una manera muy fácil. En este caso no veremos ningún ejemplo complejo, ni si quiera pasaremos parámetros. Simplemente crearemos un botón volver que podremos insertar en cualquier parte de nuestra página. Para este ejemplo se crea la carpeta ext/data dentro de protected. Aquí … Leer más

Extendiendo YII – Usando PHPExcel como librería externa.

Existen muchas maneras en las que se puede extender un FrameWork y utlizar librerías externas. En este caso usaremos la técnica utilizada en el libro de «Yii 1.1 Application Development Cookbook»

OJO: No es que haga publicidad al libro, simplemente a mi me ha servido bastante como referencia.

PHPExcel es una librería que permite la escritura y lectura de formatos como excel, excel 2007, Office Open XML, CSV, OpenOffice Calc, Gnumeric, PDF, HTML, entre otros. Si te interesa ver todas las caracteristicas revisa la página de features de PHPExcel. ( No es la idea de este tutorial explicar más sobre esta librería.)

Que es lo que necesitamos:

  1. Una aplicación en YII
  2. La librería PHPExcel.
Que debemos hacer:
  1. Primero creamos la carpeta vendors bajo la carpeta protected (protected/vendors).  Asumiendo que tu carpeta de archivos restringida es llamada protected.
  2. Copiamos la carpeta PHPExcel y el archivo PHPExcel.php a la carpeta vendors. ( Estos están bajo la carpeta Classes en el archivo descargado )
  3. En el controlador que queremos utilizar la librería importamos la librería. En nuestro caso :

    Yii::import('application.vendors.*');
  4. Requerimos la clase de PHPExcel :
    require_once(‘PHPExcel.php’);
  5. Y ahora simplemente utilizamos la librería como explicita el proveedor :).

El siguiente es un ejemplo de método para probar que la librería esté funcionando:

 public function actionExcel() {
        Yii::import('application.vendors.*');
        require_once('PHPExcel.php');

        $objPHPExcel = new PHPExcel();

        $objPHPExcel->setActiveSheetIndex(0)
        ->setCellValue('A1', 'Hello')
        ->setCellValue('B2', 'world!')
        ->setCellValue('C1', 'Hello')
        ->setCellValue('D2', 'world!');

        $objPHPExcel->setActiveSheetIndex(0)
        ->setCellValue('A4', 'Miscellaneous glyphs')
        ->setCellValue('A5', 'eaeuaeioueiuyaouc');

        $objPHPExcel->getActiveSheet()->setTitle('Simple');

        $objPHPExcel->setActiveSheetIndex(0);

        ob_end_clean();
        ob_start();

        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename="test.xls"');
        header('Cache-Control: max-age=0');
        $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
        $objWriter->save('php://output');
}

Este es el ejemplo que viene con la librería. No se asombre si ven el mismo en más de un lugar. Esto puedo apostar que le salvará la vida a más de una persona. Para descargar el ejemplo haz click a continuación.

Descargar actionExcel