martes 12 de enero de 2010

Usando componentes de Zend en kumbiaphp

En este tutorial voy a mostrarles como puedes usar el componente ZendGdata de Zend Framework, este componente hace uso de las apis de google como Youtube, Picasa, Blogger, AppEngine, etc.

Para este tutorial vamos a usar  el componente Photos de ZendGdata para subir nuestras imagenes a nuestro album de Picasaweb desde kumbiaPHP framework php.

Ingredientes:

1. El componente ZendGdata lo descargan desde acá Estoy usando la versión 1.9.6, la documentación acá.
2. Por supuesto KumbiaPHP Framework PHP , estoy usando la versión 1.0 Spirit.
3. Conocimientos previos del Framework.
4. Una cuenta activa de Picasaweb.

Listo, paso a explicar lo que vamos a hacer.

Vamos a tener un formulario donde nos pedira tres datos. Titulo, etiquetas(separados por comas) y por supuesto la imagen. Cuando tengamos estos tres datos los procesamos y si hay éxito nos devolvera tres datos(para el ejemplo claro) la foto original, y dos thumbnail.

Organización de los archivos.

Copiamos nuestra carpeta de componentes en la carpeta del proyecto.



Creamos un archivo libreria donde cargaremos el Loader de nuestro componente.

PHP app/libs/gdata.php
 <?php 
  
 $clientLibraryPath = APP_PATH.'libs/ZendGdata/library/';
  
 set_include_path(get_include_path() . PATH_SEPARATOR . $clientLibraryPath);
  
 require_once 'Zend/Loader.php';
  

Y ya tenemos todo listo para empezar.

Creamos nuestro controller

PHP controllers/gdata1_controller.php
 <?php
  
  class Gdata1Controller extends ApplicationController {
  
      public function index(){
  
      /* mostramos el formulario */
  
           }
  
      public function subir(){
  
           if($this->has_post('submit')){
  
           //La gestión y el proceso la realiza el modelo, en caso de exito nos devuelve el resultado
  
           Load::model('Gdatamodel');
  
           $data = $this->Gdatamodel->save($this->post('foto'), $this->post('titulo'), $this->post('etiquetas'));
  
            if($data != FALSE){
  
             $this->set_persistent('data', $data);
  
             $this->redirect('gdata1/verfoto/');
  
         }
  
 } 
  
 }
  
           public function verfoto(){
  
                $this->data = $this->get_persistent('data');
  
                }
  
      }  

Nuestro modelo
Acá realizamos todo el proceso y la lógica del programa.

PHP models/gdatamodel.php
 <?php 
  
 class Gdatamodel {
  
      public function save($foto, $titulo, $etiquetas){
  
      Load::lib('gdata');
  
      /*cargamos las clases necesarias*/
  
       Zend_Loader::loadClass('Zend_Gdata');
  
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
  
    Zend_Loader::loadClass('Zend_Gdata_Photos');
  
    Zend_Loader::loadClass('Zend_Http_Client');
  
       /*validando el usuario*/
  
       $svc = Zend_Gdata_Photos::AUTH_SERVICE_NAME;
  
    $user = "user@gmail.com";
  
    $pass = "password";
  
    $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $svc);
  
    $gphoto = new Zend_Gdata_Photos($client);
  
           /*datos para la subida */
  
           $albumName = "gdata"; /* tenemos que tener creado un album con este nombre*/
  
         try {    
  
     $photo = $gphoto->newPhotoEntry();
  
     // iniciamos el archivo
  
     $file = $gphoto->newMediaFileSource($_FILES['foto']['tmp_name']);
  
     $file->setContentType("image/jpeg");
  
     $photo->setMediaSource($file);
  
     // El titulo
  
     /*$photo->setSummary($gphoto->newSummary($titulo)); desfazado */  
       $photo->setTitle($gphoto->newTitle($titulo));

  
     // Las etiquetas
  
     $photo->mediaGroup = new Zend_Gdata_Media_Extension_MediaGroup();
  
     $keywords = new Zend_Gdata_Media_Extension_MediaKeywords();
  
     $keywords->setText($etiquetas);
  
     $photo->mediaGroup->keywords = $keywords;
  
     // Nos ubicamos en el album
  
     $album = $gphoto->newAlbumQuery();    
  
     $album->setUser($user);
  
     $album->setAlbumName($albumName);
  
     // Guardamos la foto
  
     $inserted = $gphoto->insertPhotoEntry($photo, $album->getQueryUrl()); 
  
           $thumbnail = $inserted->getMediaGroup()->getThumbnail();
  
           $foto = $inserted->getMediaGroup()->getContent();
  
    } catch (Zend_Gdata_App_Exception $e) {
  
            /*ir con cuidado, solo para version de desarrollo, no usar en produccion*/
  
     echo "Error: No se pudo procesar la orden "; //.$e->getResponse(); 
  
    }
  
       /* devolviendo los datos en caso de exito*/
  
           if(@$foto[0]->url){
  
                $fotos = array($foto[0]->url, $thumbnail[1]->url, $thumbnail[0]->url );
  
                return $fotos;
  
                          }
  
           else{
  
                return "Error no se pudo enviar la foto!";
  
                }
  
           }
  
      }
  


Creamos nuestra vista donde mostraremos el formulario:

PHTML: views/gdata1/subir.phtml
 <!-- por cuestion de comodidad no estoy usando los helper tags -->  
  
  <form method="post" action="/gdata1/subir" enctype="multipart/form-data">
  
    Titulo: <br/>
  
    <input name="titulo" type="text" size="25" />
  
    Archivo a subir: <br/>
  
    <input name="foto" type="file" />
  
    Etiquetas: <br/>
  
    <input name="etiquetas" type="text" size="25" />
  
    <input name="submit" type="submit" value="Enviar" />
  
   </form>  

Mostramos el resultado

PHTML: views/gdata1/verfoto.phtml
 <?php 
  
 View::content();
  
 echo "<img src='".$data[0]."' />";
  
 echo "<img src='".$data[1]."' />";
  
 echo "<img src='".$data[2]."' />";
  
 echo "<br />";
  
 echo "<pre>";
  
 print_r($data);
  
 echo "</pre>";
  

Es todo, una receta fácil y sabrosa  ^.^
 Está demás decir que de esta manera pueden trabajar con cualquier API de google disponible, Blogger, Youtube(SI! pueden subir videos a youtube desde tu web), etc etc.


PD1: Gracias a @cachi que me ayudó en la correción de algunos errores cometidos.
PD2: Existe una practica en nuestro controller innecesaria, estoy trabajando para poder quitar la persistencia de datos de un controller a otro ya que es una carga innecesaria.
PD3: Quize poner un ejemplo pero al tener un VPS  limpio tengo que recompilar mi PHP con Openssl y antes de hacerlo tengo que hacer varios pasos previos y ahora no tengo el tiempo necesario. Se los debo(la mayoria de servidores lo tienen), en local les va a funcionar bien. Probado con Xampp en linux.

Editado: Gracias al amigo @joanhey del IRC de kumbia que me ayudó en un pequeño problema que tuve en la configuración del servidor para poder subir el ejemplo.

Vean el funcionamiento ACA - Tiene user y pass asi que usen: user1 admin
No se abusen con las imágenes!


En definitiva es una idea de como pueden empezar a trabajar con Zend Gdata, si tienen alguna duda dense una vuelta por el IRC de kumbia irc.freenode.org canal #kumbiaphp 

0 comentarios:

Publicar un comentario en la entrada

Related Posts Plugin for WordPress, Blogger...