recortar imagenes en cakephp con jquery.

recortar imagenes en cakephp con jquery.

Para poder recortar una imagen mediante una seleccion se consigue con imgAreaSelect que es un plugin de JQuery para seleccionar un area de una imagen.

El publin se puede configurar y permite diferentes funcionalidades que nos ayudará y nos enriquecerá la tarea de recortar una imagen, ya sea a nosotros a los usuarios cuando por ejemplo quieren subir un avatar y recortar la zona que quieran de la foto previamente subida.

El plugin permite trabajar escalando imágenes o recortando unas dimesiones asignadas. Por ejemplo.
1.- Selecciona y recorta una imagen con unas dimensiones determinadas.

$(document).ready(function () { $('#avatar').imgAreaSelect({ maxWidth: 200, maxHeight: 150, handles: true }); });

2.- Selecciona y recorta la foto manteniendo un porcentaje escalado previamente asignado.

$(document).ready(function () { $('#avatar').imgAreaSelect({ aspectRatio: '4:3', handles: true }); });

Esto es muy sencillo de integrar en php y jquery pero bueno como ya sabemos en Cakephp se complica un poquito mas debiado a que hay que seguir el patrón de diseño MVC.
Como siempre habrá que crear un componente que interactue con el controlador o controladores, un helper para incluir en la vista las funciones de javascript y la implementación de la vista.

Para esta receta necesitaremos 😉

1.- El componente
/app/controllers/components/jq_imgcrop.php

<?php
class JqImgcropComponent extends Object
{

    function uploadImage($uploadedInfo, $uploadTo, $prefix)
    {
        $webpath = $uploadTo;
        $upload_dir = WWW_ROOT.str_replace("/", DS, $uploadTo);
        $upload_path = $upload_dir.DS;
        $max_file = "34457280";
        $max_width = 400;
        // añado al prefijo, el identificador de tiempo, para que el archivo que se suba siempre sea unico
        $prefix = $prefix.time();

        $userfile_name = $uploadedInfo['name'];
        $userfile_tmp =  $uploadedInfo["tmp_name"];
        $userfile_size = $uploadedInfo["size"];
        //$filename = $prefix.basename($uploadedInfo["name"]);
        $id_unic = $uuid = String::uuid();
        $extension =  $this->getFileExtension($uploadedInfo["name"]);
        if (($extension != "jpeg")  && ($extension != "jpg") && ($extension != "gif") && ($extension != "png"))
        {
            return false;
        }
        $filename = $prefix.$id_unic.'.'.$extension;
        //$file_ext = mb_substr($filename, strrpos($filename, ".") + 1);
        $uploadTarget = $upload_path.$filename;

        if(empty($uploadedInfo)) {
                  return false;
                }

        if (isset($uploadedInfo['name'])){
            move_uploaded_file($userfile_tmp, $uploadTarget );
            chmod ($uploadTarget , 0777);
            $width = $this->getWidth($uploadTarget);
            $height = $this->getHeight($uploadTarget);
            // Scale the image if it is greater than the width set above
            if ($width > $max_width){
                $scale = $max_width/$width;
                $uploaded = $this->resizeImage($uploadTarget,$width,$height,$scale);
            }else{
                $scale = 1;
                $uploaded = $this->resizeImage($uploadTarget,$width,$height,$scale);
            }
        }
        return array('imagePath' => $webpath.$filename, 'imageName' => $filename, 'imageWidth' => $this->getWidth($uploadTarget), 'imageHeight' => $this->getHeight($uploadTarget));
    }

    function getHeight($image)
    {
        $sizes = getimagesize($image);
        $height = $sizes[1];
        return $height;
    }

    function getWidth($image)
    {
        $sizes = getimagesize($image);
        $width = $sizes[0];
        return $width;
    }

    function resizeImage($image,$width,$height,$scale)
    {
        $newImageWidth = ceil($width * $scale);
        $newImageHeight = ceil($height * $scale);
        $newImage = imagecreatetruecolor($newImageWidth,$newImageHeight);
$ext = strtolower(mb_substr(basename($image), strrpos(basename($image), ".") + 1));
        $source = "";
        if($ext == "png"){
            $source = imagecreatefrompng($image);
        }elseif($ext == "jpg" || $ext == "jpeg"){
            $source = imagecreatefromjpeg($image);
        }elseif($ext == "gif"){
            $source = imagecreatefromgif($image);
        }
        imagecopyresampled($newImage,$source,0,0,0,0,$newImageWidth,$newImageHeight,$width,$height);
        imagejpeg($newImage,$image,90);
        chmod($image, 0777);
        return $image;
    }

    function resizeThumbnailImage($thumb_image_name, $image, $width, $height, $start_width, $start_height, $scale)
    {
        $newImageWidth = ceil($width * $scale);
        $newImageHeight = ceil($height * $scale);
        $newImage = imagecreatetruecolor($newImageWidth,$newImageHeight);
        $ext = strtolower(mb_substr(basename($image), strrpos(basename($image), ".") + 1));
        $source = "";
        if($ext == "png"){
            $source = imagecreatefrompng($image);
        }elseif($ext == "jpg" || $ext == "jpeg"){
            $source = imagecreatefromjpeg($image);
        }elseif($ext == "gif"){
            $source = imagecreatefromgif($image);
        }
        imagecopyresampled($newImage,$source,0,0,$start_width,$start_height,$newImageWidth,$newImageHeight,$width,$height);
        imagejpeg($newImage,$thumb_image_name,90);
        chmod($thumb_image_name, 0777);
        return $thumb_image_name;
    }

    function cropImage($thumb_width, $x1, $y1, $x2, $y2, $w, $h, $thumbLocation, $imageLocation)
    {
        $scale = $thumb_width/$w;
        $cropped = $this->resizeThumbnailImage(WWW_ROOT.str_replace("/", DS,$thumbLocation),WWW_ROOT.str_replace("/", DS,$imageLocation),$w,$h,$x1,$y1,$scale);
        return $cropped;
    }

     function getFileExtension($str)
     {
        /*
        $i = strrpos($str,".");
        if (!$i) { return ""; }
        $l = strlen($str) - $i;
        $ext = mb_substr($str,$i,$l);
        return $ext;
        */
        return end(explode(".", $str));

    }
}
?>

2.- El Helper

/app/views/helpers/cropimage.php

<?php
class CropimageHelper extends Helper {
    var $helpers = array('Html', 'Javascript', 'Form');

    function createJavaScript($imgW, $imgH, $thumbW, $thumbH) {
            return $this->output("<script type="text/javascript">
                function preview(img, selection) {
                    var scaleX = $thumbW / selection.width;
                    var scaleY = $thumbW / selection.height;

                  /*
                  Esta parte esta dando un bug en IE x aunque en el resto de browsers va ok.
                    $('#thumbnail + div > img').css({
                        width: Math.round(scaleX * $imgW) + 'px',
                        height: Math.round(scaleY * $imgH) + 'px',
                        marginLeft: '-' + Math.round(scaleX * selection.x1) + 'px',
                        marginTop: '-' + Math.round(scaleY * selection.y1) + 'px'
                    });
                    */
                    $('#x1').val(selection.x1);
                    $('#y1').val(selection.y1);
                    $('#x2').val(selection.x2);
                    $('#y2').val(selection.y2);
                    $('#w').val(selection.width);
                    $('#h').val(selection.height);
                }

                $(document).ready(function () {
                    $('#save_thumb').click(function() {
                        var x1 = $('#x1').val();
                        var y1 = $('#y1').val();
                        var x2 = $('#x2').val();
                        var y2 = $('#y2').val();
                        var w = $('#w').val();
                        var h = $('#h').val();
                        if(x1=="" || y1=="" || x2=="" || y2==""|| w=="" || h==""){
                            alert('Seleccione sobre la foto la zona que quiere');
                            return false;
                        }else{
                            return true;
                    }
                });
            });

            $(window).load(function () {
                $('#thumbnail').imgAreaSelect({ aspectRatio:'4:3', onSelectChange: preview });
            });
            </script>");
    }

  function createForm($imagePath, $tH, $tW)
  {
    $x1 = $this->Form->hidden('x1', array("value" => "", "id"=>"x1"));
    $y1 = $this->Form->hidden('y1', array("value" => "", "id"=>"y1"));
    $x2 = $this->Form->hidden('x2', array("value" => "", "id"=>"x2",));
    $y2 = $this->Form->hidden('y2', array("value" => "", "id"=>"y2"));
    $w = $this->Form->hidden('w', array("value" => "", "id"=>"w"));
    $h = $this->Form->hidden('h', array("value" => "", "id"=>"h"));
    $imgP = $this->Form->hidden('imagePath', array("value" => $imagePath));
    return $this->output("<img src="$imagePath" style="float: left; margin-right: 10px;" id="thumbnail" alt="Create Thumbnail" />
                <div style="position:relative; overflow:hidden; width:".$tW."px; height:".$tH."px; display:none">
                    <img src="$imagePath" style="position: relative;" alt="Thumbnail Preview" />
                </div>
                <br style="clear:both;"/>$x1 $y1 $x2 $y2 $w $h $imgP");
    }
}
?>

3.- No olvidar incluir el componente ni el helper en el controlador

var $helpers = array('Cropimage');
var $components = array("JqImgcrop");

4.- Voy a integrar el ejemplo de redimensionar una imagen o una foto en un ejemplo real. En este caso yo he hecho una funcion para crear o modifcar el avatar del usuario en el controlador /app/controllers/usuarios_controller.php

   <?php
    /**
    * funcion para crear/ modificar el avatar del usuario
    * @version 1.0
    * @author Pedro Ventura
    *
    */
    function alterar_avatar()
    {
        $path_thmb_subida = $this->Avatars->comprobar_ruta_subida('usuarios');
        if($path_thmb_subida)
        {
            if(!empty($this->data))
            {
                if(isset($this->data['Avatar']['step']) && ($this->data['Avatar']['step']=='1'))
                {
                    # subo esta que será la original
                    # esta que subo despues se pisará con el thumb del cropping
                    $uploaded = $this->JqImgcrop->uploadImage($this->data['Avatar']['name1'], $path_thmb_subida, 'original_');
                    if($uploaded)
                    {
                        $this->set('uploaded',$uploaded);
                        $this->set('step',2);
                    }
                    else
                    {
                        $this->Session->setFlash(__('Tipo de archivo incorrecto, seleciona una imagen .jpg, .jpeg, .gif o .png',true));
                        $this->set('step',1);
                    }
                }
                if(isset($this->data['Avatar']['step']) && ($this->data['Avatar']['step']=='2'))
                {
                    # sustituyo el path del thumbnail que se acaba de subir pues es el original y cambio el nombre del archivo,
                    # para que se genere un thumbnail con un nombre nuevo
                    $path_thmb =  str_replace('original_','thumb_',$this->data['Usuario']['imagePath']);
                    $cropped = $this->JqImgcrop->cropImage(85, $this->data['Usuario']['x1'], $this->data['Usuario']['y1'], $this->data['Usuario']['x2'], $this->data['Usuario']['y2'], $this->data['Usuario']['w'], $this->data['Usuario']['h'], $path_thmb, $this->data['Usuario']['imagePath']);
                    $this->set('step',3);
                    # guardo el path del avatar en el registro del usuario
                    $this->Usuario->id = $_SESSION['Usuario']['id'];
                    $this->Usuario->saveField('avatar_path',$path_thmb);
                    $this->Session->setFlash(__('Avatar Alterado con éxito',true));
                    # seteo el avatar resultante despues de la redimension y lo asigno a la vista
                    $this->set('avatar_final',str_replace(WWW_ROOT,'',$cropped));
                }
            }
            else
            {
                $this->set('step',1);
            }
        }
    }
?>

5.- Los pasos para recortar la imagen integrados en la vista son los siguientes

<?
    /* librerías para crop de imagenes */
    echo $html->css('img_select/imgareaselect-animated_0.9.2',NULL, false). " n";
    echo $javascript->link('jquery.imgareaselect_0.9.2.js',NULL, false);
    # formulario paso 1 de crear avatar
    if(isset($step) && ($step == 1))
    {
        echo $form->create('Usuario', array('type' => 'file','url' => array('controller' => 'usuarios', 'action' => 'alterar_avatar')));
        echo '<br />';
        echo $form->input('Avatar.step', array('label' => false,'div'=>null, 'type' => 'hidden', 'value'=>$step));
        echo '<br />';
        echo 'Selecciona tu avatar : '.  $form->file('Avatar.name1', array('size' => '60'));
        echo $form->submit('Guarda Avatar');
    }
    elseif(isset($step) && ($step == 2))
    {
        echo $cropimage->createJavaScript($uploaded['imageWidth'],$uploaded['imageHeight'],85,85,$uploaded["imagePath"]);
        echo $form->create('Usuario', array('type' => 'file','url' => array('controller' => 'usuarios', 'action' => 'alterar_avatar')));
        echo $form->input('Avatar.step', array('label' => false,'div'=>null, 'type' => 'hidden', 'value'=>$step));
        echo $cropimage->createForm($uploaded["imagePath"], 85, 85);
        echo $form->submit('Terminar', array("id"=>"save_thumb"));
        echo $form->end();
    }
    elseif(isset($step) && ($step == 3))
    {
        ?>
        <br />
        <p>Enhorabuena!! ya has creado tu avatar!! lo podrás ver en tu perfil.</p>
        <br />
        <?
        echo $html->image($avatar_final);
    }
    else
    {
        # sin acciones
    }
?>

Para los que les cueste seguir el flujo de datos, resumo a de manera básica.

  1. Se incluyen el helper y el componente en el controlador
  2. Una vez que se hace la llamada a la funcion empieza en step =1, es decir que dentro de la vista se va a mostrar la renderización que hay dentro de step 1. Esto se hace porque dentro de la funcionalidad de recortar hay 3 fases:
    • La fase inicial donde el usuario selecciona la foto que quiere subir y se envía. El controlador la recoge y la envía al componente que la sube.
    • Si el paso anterior se ha realizado con éxito, se para al step 2 que es cuando se tiene que seleccionar una zona de la foto mediante el propio plugin de Jquery ImgAreaSelect. Se recorgan y en en formulario se generan unas variables en input hidden con los valores del recorte realizado. Se envia al controlador y el contralador se lo delega al componente que realiza la redimension o recorte
    • Finalmente ya tenemos la imagen final recortada dependiendo de los patrones de redimension que hayamos configurado

En el helper hay un comentario, ya que hay un bug que no consigo arreglar, por falta de tiempo o simplemente porque estoy ciego y no veo el error. Hay una función preview que muestra una previsualizacion de como quedará la imagen o la foto después de ser recortada, yo la tengo comentada por esto mismo que comento. Está fallando en cualquier version de IE, intuyo que será por un tema de comillas, que no las interpreta bien y no es capaz de cerrarlas. Si alguien consigue debugear esta parte, por favor que lo comente!!

/*
  Esta parte esta dando un bug en IE x aunque en el resto de browsers va ok.
    $('#thumbnail + div > img').css({
        width: Math.round(scaleX * $imgW) + 'px',
        height: Math.round(scaleY * $imgH) + 'px',
        marginLeft: '-' + Math.round(scaleX * selection.x1) + 'px',
        marginTop: '-' + Math.round(scaleY * selection.y1) + 'px'
    });
    */

Cualquier duda o pregunta comentarlas y las iré resolviendo.

Actualización: 25/11/201
Se me ha olvidado por completo indicar que hay que descargar la libreria de jquery, así como el plugin de imageArea.
Los adjunto en el siguiente zip.
También contiene un css y algunas imágenes para hacer todo el efecto de recorte.

[download id=”8″ format=”4″ autop=”false”]

Tags de búsquedas:

cakephp jquery,jquery cakephp,jquery recortar foto,funcion para recortar imagenes jquery,recortar y editar fotos jsquery,recortar imagenes con cakephp,Recortar imagen y subir perl y jquery,plugin javascript para recortar imagenes,plugin de fotos en cakephp,Mejor apk recorte crop,codigo android recortar entorno de la imagen,comprar plugin cakephp,imageareaselect recortar imagen,htt://app tuenti com/s E-OJquuy,usuarios y grupos cakephp

Noticias relacionadas »

16 comentarios en recortar imagenes en cakephp con jquery.

  1. Jose Sosa
    / Responder

    Hola Pedro, buscando y buscando en la red noté tu página y revisando tus artículos comprendo el nivel que tienes usando CakePHP. Quisiera consultarte lo siguiente: hay alguna forma de hacer una excepción al Cake para incluir un directorio con todo un sistema hecho en PHP tradicional? Puedo incluirlo de alguna forma que Cake me lo tome como un plugin que no cumpla la estructura, o sacarlo del control de enrutamiento que hace? porque sería imposible pasar todas las vistas de sistema anterior al MVC que proponen ellos, es preferible utilizarlo como un servicio vertical. Si no es posible hacerlo, has trabajado con el envío de información de sesión y autentificación del entorno Cake a una aplicación externa? (como para tenerla en un directorio anterior al de cake fuera de su entorno y pasarle los parámetros). Me pidieron desarrollar unos módulos y autentificar con ACL pero ahora hay que integrar con otros desarrollos previos y no encuentro cómo. Agradezco mucho tu tiempo y atención.

    • Pedro Ventura
      / Responder

      Hola Jose,

      Si se puede, tienes que colgar tu desarrollo en una carpeta dentro de webroot. De hecho dentro de uno de mis desarrollos en cakephp he metido un blog de wordpress y un servidor de banners (openAds). Como te digo tan sólo tienes que meterlo dentro de webroot y accedes a través de la url tipo: mi_dominio.com/mi_aplicacion_no_cake/index.php o como proceda en tu caso.

      Cualquier duda me dices.

      Un saludo!

      • Jose Sosa
        / Responder

        Gracias, me funcionó tal y como me dijiste. Pero no me respeta los permisos ACL (y es lógico). Lo que hice fue crear un controller aplicacionExterna bajo Cake (para que lo controlaran los ACOS ACL), y de allí redirecciono a la aplicación externa y controlo que venga de la dirección que requiero con el $_SERVER[‘HTTP_REFERER’] y un key que mando por sesión (por si acaso). Es mucho mejor insertar el código dentro de webroot, mas ordenado, no me gustaba que estuviese al mismo nivel de la app de Cake. Muchas gracias por la respuesta y por la info en general, me ha sido muy util. Recomendado con el +1 y con mis amigos desarrolladores!

  2. Tres
    / Responder

    Hi Pedro, i think it’s still missing the controller named “Image”… infact i get this:

    http://img600.imageshack.us/img600/3163/missingcomponent.png

    tnx !

    Tres

    • Tres
      / Responder

      sorry I meant “Image” component (not controller)

    • Pedro Ventura
      / Responder

      Remove the “Image” component element from the array $components

      var $components = array("Image","RequestHandler","JqImgcrop","Avatars");
      

      Like this

      var $components = array("RequestHandler","JqImgcrop","Avatars");
      
      • Tres
        / Responder

        Hello Pedro

        now i get this:

        http://img703.imageshack.us/img703/9332/noimagecomponent01.png

        even if I’ve chcked that the referred folders are set 777

        Anyway if I try to perform a selection & upload i get this:

        http://img8.imageshack.us/img8/8360/noimagecomponent02.png

        (with no image uploaded)

        Any further step I should follow to adjust ?

        Tnx a lot

        Tres

        • Pedro Ventura
          / Responder

          Did you create the next directories?

          /app/webroot/img/avatars/ (777 permissions)
          /app/webroot/img/avatars/grupos (777 permissions)
          /app/webroot/img/avatars/usuarios (777 permissions)

          You can customize the “avatar component”. It is a file that i made it for my own use, and for my application. The whole article is a guia but it not obligatory to follow it step by step. You can change the code as you want, adapting it for you application.

          So those kind of errors are because you are using it literally. You must adapt it. For example by changing the folders directory, or not using the avatars components, and just save the upload images in other directory you want.

          If you are starting in cakephp try some articles and codes less complicated. this article is not really than complicated for people that already worked with cakephp.. but anyway you almost have it done.

          Try to customize it, and keeping let me know if you get more errors.

          • Tres

            Dear Pedro,

            I’ve added the two subfolders

            /app/webroot/img/avatars/grupos
            /app/webroot/img/avatars/usuarios

            that i was missing and now the errors are disappeared… 🙂

            Now the image is finally uploaded in the folder even if the preview (supposed above the button Terminar ) is missed because, looking at the url, it miss the foldername where cake is installed… As you say it is probably easier than i think to solve this last thing… so I’ll look forward to fix it myself and let you know…

            Thank you so much again for your help

            Kind regards

            Tres

        • Pedro Ventura
          / Responder

          Hi Tres!!

          I have updated my article.
          I forgot to mention that you need to download jquery and the library of “ImageArea”.
          I have created a zip with all those files, you can download it from here. Look at the end of the article. Before the comments.

          Also add this line at the top ot the step 5, It’s the include of jquery library

          echo $javascript->link('jquery-1.3.2.min.js',NULL, false);
          
  3. Tres
    / Responder

    Well, I’ve tried following al the steps of your tutorial, but when a point to

    localhost/mycake/usuarios/alterar_avatar

    i get the following error message:

    Notice (8): Undefined property: UsuariosController::$Avatars [APPcontrollersusuarios_controller.php, line 12]
    Code
    UsuariosController::alterar_avatar() – APPcontrollersusuarios_controller.php, line 12
    Dispatcher::_invoke() – COREcakedispatcher.php, line 204
    Dispatcher::dispatch() – COREcakedispatcher.php, line 171
    [main] – APPwebrootindex.php, line 83

    Fatal error: Call to a member function comprobar_ruta_subida() on a non-object in C:xampphtdocsmycakeappcontrollersusuarios_controller.php on line 12

    …any idea on what i should check to solve ?

    Tnx a lot

    Tres

    • Pedro Ventura
      / Responder

      Create de component /app/controllers/components/avatars.php with the following code:

      <?php
      class AvatarsComponent extends Object
      {
          
          //llamado antse de  Controller::beforeFilter()
          function initialize(&$controller) {
              // salvando la referencia al controlador para uso posterior
              $this->controller =& $controller;
          }
      
          //llamado tras Controller::beforeFilter()
          function startup(&$controller) {
          }
          
          /**
          * Los avatares de los grupos estarán organizados en carpetas en funcion del año y del mes.
          * De esta manera aligeramos la cantidad de fotos que pueda contener una misma carpeta.
          * De manera que en img/grupos/ contendra una carpeta 2010,2011,etc.. y dentro de éstas carptas con el mes actual: 07,08,09,10,etc..
          * Éste es el mismo método que usa WP para almacenar los fotos subidas.
          * Esta funcion se encarga exactamente de comprobar automaticamente donde se debe subir un avatar.
          * 
          * @return desta funcion devuelve la carpeta actual a la que se deben subir los avatares.
          * @version 1.0
          * Añadida esta funcion al nuevo componente avatars, que gestionará los avatares de la web.
          * De esta manera se hace mas genérica esta funcionalidad.
          * Añadido switch par comprobar el tipo de avatar que se envia, tan solo puede ser de dos tipos de momento: usuarios y grupos
          * En caso de que no sea el tipo de avatar ninguno de estos dará un error y devolverá fasle, para que no cree carpetas donde no tiene que crearlas.
          * El unico proceso manual que habrá que hacer es cada vez que se cree un nuevo tipo de avatar habrá que meterlo a mano en el switch
          * @version 1.1
          * @param $tipo_avatar, es el tipo de avatar que queremos comprobar, ya sea de un gurpo o usuario
          * Eliminadas las funciones exec() por funciones mas seguras a nivel servidor, por ejemplo para comprobar si existe un fichero ahora se hace con file_exists()
          * @version 1.2
          * 
          */
          function comprobar_ruta_subida($tipo_avatar)
          {
              switch($tipo_avatar)
              {
                  case 'grupos':
                  case 'usuarios':
                      $comprobacion = true;
                  break;
                  default: $comprobacion = false;
              }
              # si el tipo indicado existe en el bucle continua.
              if($comprobacion)
              {
                 # obtengo el año actual
                  $anio_actual = date('Y',time());
                  #compruebo que existe la carpeta del año actual
                  //$resultado = exec('[ -e '.WWW_ROOT.'img/avatars/'.$tipo_avatar.DS.$anio_actual.' ] && echo "1" || echo "0"');
                  if(!file_exists(WWW_ROOT.'img/avatars/'.$tipo_avatar.DS.$anio_actual))
                  {
                      mkdir(WWW_ROOT.'img/avatars/'.$tipo_avatar.DS.$anio_actual,0775);
                      //chmod(WWW_ROOT.'img/avatars/'.$tipo_avatar.DS.$anio_actual,0777);
                  }
                  #obtengo el dia del mes, en formato numerico y con los ceros delante
                  $mes_actual = date('m',time());
                  //$resultado_m = exec('[ -e '.WWW_ROOT.'img/avatars/'.$tipo_avatar.DS.$anio_actual.'/'.$mes_actual.' ] && echo "1" || echo "0"');
                  if(!file_exists(WWW_ROOT.'img/avatars/'.$tipo_avatar.DS.$anio_actual.'/'.$mes_actual))
                  {
                      mkdir(WWW_ROOT.'img/avatars/'.$tipo_avatar.DS.$anio_actual.'/'.$mes_actual,0775);
                      //chmod(WWW_ROOT.'img/avatars/'.$tipo_avatar.DS.$anio_actual.'/'.$mes_actual,0777);
                  }
                  $path_subida_avatar = DS.'img/avatars/'.$tipo_avatar.DS.$anio_actual.'/'.$mes_actual.DS; 
                  return $path_subida_avatar; 
              }
              else
              {
                  $this->log('error al comprobar tipo avatar:'.$tipo_avatar,'avatars');
                  return false;
              }
          }
      }
      ?>
      

      Don’t forget to include the new component in your controller with:

      var $components = array("Image","RequestHandler","JqImgcrop","Avatars");
      

      Let me know it finally works… or keep posting the error messages

  4. Tres
    / Responder

    Dear Pedro,

    thanks a lot for your fast reply… i’m gonna try and let you know
    Your is english is perfect 🙂

    thanks again

    Tres

  5. Tres
    / Responder

    Hola Pedro !
    I would like to test your script but I don’t uderstand which exactly is the models structure it refers to (Avatar and Usuario ?)… could you please post a mysql dump ?

    Thanks a lot in advance and kind regards

    Tres

    • Pedro Ventura
      / Responder

      Hi Tres,

      Avatar it´s not really a model. I used it in the form to pass data to the controller, i get the data in the controller with the $this->data[‘Avatar’] (it’s like passing data with $_POST) and i used it to process the logic of the 3 steps of cropping.

      “Usuario” is the model that connects to my users table.

      CREATE TABLE `usuarios` (                             
                       `id` int(11) NOT NULL auto_increment,                    
                       `avatar_path` varchar(200) default NULL,                 
                     ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 
      

      Sorry for my english! I will try to get a tar.gz of codes and i will update my post with it.

      Try the code and if you have more questions feel free to contact me

  6. / Responder

    Excelente Articulo! lo estoy leyendo, luego te comento si me fue de utilidad! muchas gracias! sigue así! 🙂

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

  • marcelino (3 días)
    Os dejo un grupo donde opera uno de los trader…
  • Pedro Ventura (2 semanas)
    Hola Pablo, Creo que puedes configurar los códigos de adsense…
  • Pedro Ventura (2 semanas)
    Buenas, El proveedor cierra facturación el día 10 de cada…
  • pedro (4 semanas)
    Hola pero este sitio paga o no paga , ya…
  • Pedro (1 mes)
    Buenos días Margherita El plugin está obsoleto y ya no…
  • Juan Carlos Díaz (1 mes)
    Este grupo de Telegram me ha dado muy buenas señales…

Suscríbete al newsletter »

Proporciona tu correo electrónico a continuación y recibe las últimas noticias! Funciona con Feedburner de Google

Archivo »

Leer entrada anterior
y Google Wave murió..

A últimos del año pasado escribía un post preguntándome que había pasado con Google Wave:"Que pasa con Google Wave?" y...

Cerrar