Obtener el ID de un registro almacenado en cakephp

En el hipotético caso de que haya hecho un save de unos datos en el interior de un modelo y quiera saber cuál es el Id que se le ha asignado automáticamente en la BBDD simplemente es necesario hacer

$last_id = $this->ModelName->getInsertId();

Más info en la API de Cakephp en http://api.cakephp.org/class/model#method-ModelgetInsertID

¿Cómo hacer distintas paginaciones en el mismo controlador de cakePHP?

Hoy explicaré cómo hacer dos paginaciones distintas dentro del mismo controlador. Tomaré un reciente ejemplo que tenía que hacer, en el cual debía mostrar los elementos cuyo valor “aceptado” se encontrara a 1 de 15 en 15, y que se encontraran ordenados por el número de votos que habían recibido y también tenía que mostrar aquellos cuyo valor aceptado fuera 0.

Paginacion cakePHP

Los pasos seguidos fueron los siguientes:
1 – Incluir la siguiente variable global en el controlador.

var $paginate = array(
   'conditions'=> array('Suitcase.aceptado'=>1),
   'limit' => 15,
   'order' => array(
     'Suitcase.vote' => 'desc'
   )
);

2 – Hacer uso de esta paginación en cada función del paginador que lo necesitara mediante la introducción de esta línea.

$this->set('cases', $this->paginate('Suitcase'));

3 – Y ahora el problema estaba en cómo hacer otra paginación sin afectar a la primera. Pues simplemente sustituyendo en la función(recordad que no es como antes que lo poníamos en la zona de variables globales del documento!!) la variable $this->paginate por la que en estos momentos necesitaba.

$this->paginate = array(
   'conditions'=> array('Suitcase.aceptado'=>0),
   'limit' => 15,
   'order' => array(
     'Suitcase.vote' => 'desc'
   )
);

4 – Y llamándole de la misma forma.

$this->set('cases', $this->paginate('Suitcase'));

Captcha visual para cakePHP

Hola a todos, hoy vamos a integrar un componente captcha en un proyecto de cakePHP. Es cierto que hay dos o tres por la red, pero la peculiaridad de este es que es un captcha totalmente visual (podéis ver aquí el ejemplo, recordad que tenéis que rellenar los dos campos):

Es decir que tendremos que arrastrar en el caso superior mediante el ratón el reloj desde donde está hasta el círculo quedando de la siguiente forma para que pueda continuarse adecuadamente…

Pasos a seguir:

1- En la función del controlador donde queramos utilizarlo añadimos las siguientes líneas de código

/*Para el captcha*/
$rand = rand(0,4);
$_SESSION['captcha'] = $rand;
$this->set('rand',$rand);

2- En la función del controlador donde queramos recibir los datos incluiremos estas líneas:

/* this compare captcha's number from POST and SESSION */
if($_SERVER['REQUEST_METHOD'] == "POST" && $this->data['captcha'] && $this->data['captcha'] == $_SESSION['captcha']){
        /* this line makes session free, we recommend you to keep it */
        unset($_SESSION['captcha']);
} elseif($_SERVER['REQUEST_METHOD'] == "POST" && !$this->data['captcha']){
       // Aquí redireccionaremos a donde queramos que vaya en 
       // este caso erróneo
       $this->redirect('/');
}

3-En la vista(en mi caso en la plantilla) añadimos las siguientes líneas en el header

<link rel="stylesheet" href="/css/captcha.css" type="text/css" />

<script type="text/javascript" src="/js/jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="/js/jquery-ui-1.7.2.custom.min.js"></script>
<script type="text/javascript" src="/js/jquery.captcha.js"></script>

<?php if(isset($rand)){
   echo '<script type="text/javascript">
      $j(function() {
        $j(".ajax-fc-container").captcha({
          url: '.$rand.',
          borderColor: "silver",
          text: "Arrastra <span>scissors</span> al círculo.",
          formId:"formulario" //aquí el id del formulario
        });
      });
    </script>';
}?>

4-Dentro de la vista donde queramos que se dibuje el captcha añadiremos las siguientes líneas (así de sencillo!!)

<!-- Begin of captcha -->
<div class="ajax-fc-container">You must enable javascript to see captcha here!
</div>
<!-- End of captcha -->

5-Para que funcione será necesario copiar los archivos siguientes en las carpetas que indicamos:

  • captcha.css en la carpeta webroot/css.
  • Las imágenes que se encuentran en la carpeta imgs del zip en la carpeta webroot/imgs (son 13 imágenes, entre ellas están las imágenes entre las cuáles será necesario escoger)
  • Los archivos iepngfix.htcjquery-1.3.2.min.js, jquery-ui-1.7.2.custom.min.js y jquery.captcha.js en la carpeta webroot/js.

6-(Opcional)Modificar la línea 37 del archivo jquery.captcha.js para cambiar el name del input que se generará name=\”data[captcha]\”

Aquí os dejo dichos archivos para que os los descarguéis. Dejar claro también que este componente no lo cree yo, sino estos señores, sólo me he limitado a adaptarlo a cakePHP y a explicar cómo se utiliza en español 😉

Como introducir un icono en tu página web (Normal, CakePHP y WordPress)

La lección de hoy es la de introducir un icono en vuestra página para que en los navegadores se pueda ver justo al lado de la ruta. Quiero explicarlo para tres casos distintos: Para una pa´gina web normal, para una aplicación de cakePHP y para el blog WordPress.

Icono en web Normal

En el primero de los casos hay que realizar los siguientes pasos:

  • Subir un icono mediante ftp a tu servidor.
  • En aquellas páginas que se quiera tener es necesario agregar la siguiente línea de código en el head de la página en la que queráis el iconito (cambiad favicon por el nombre de vuestro icono):
 

Icono en web creada en CakePHP

Para aquellos que estéis trabajando con cakePHP simplemente tenéis que renombrar vuestro icono llamándolo favicon.ico y sustituyéndolo por el que se encuentra en la carpeta webroot de vuestra aplicación (el icono inicial es el que representa a una tarta).

Icono en un blog WordPress

Tenéis que:

  • Subir  vuestro icono a la carpeta raíz de vuestra web
  • Introducir en el header.php del theme que estéis utilizando (ese theme se encontrará en la carpeta wp-content/themes/tutheme) la línea de código siguiente:
  

Buscador de iconos

Y si no sabéis donde encontrar vuestro icono aquí os dejo una página bastante interesante, en la cuál se pueden hacer búsquedas de iconos, que posteriormente te dan la oportunidad de descargar en diferentes tamaños, tipos,…. Realmente muy útil. Es http://findicons.com/.

Nota Importante: Puede que no veáis en un primer momento el icono que habéis instalado. Esto puede deberse a los archivos temporales que ha almacenado el navegador que utilizáis. Borradlos y volved a probar (o esperad a que automáticamente se borren, cosa que puede tardar un montón de tiempo)

Cakephp: Radiobutton en formulario

Pues hoy he necesitado crear unos radiobuttons dentro de un formulario. Este formulario se llama una y otra vez porque su objetivo es el hacer que el usuario conteste una pregunta y si acierta, que conteste otra.

En un principio mi código era el siguiente:

create('User', array('action' => 'index/'.$id));
  $contents .= $form->radio('Respuesta', 
         array('1'=>$answer1, '2'=>$answer2, '3'=>$answer3));
  $contents .= $form->end('Enviar info');
  echo $contents;
?>

Pero esto me generó un problema: por alguna extraña razón me mantenía el valor de la pregunta anterior en el formulario. Es decir, si había marcado la 3ª respuesta como válida en la primera pregunta, pulsaba el botón de enviar la información y en la segunda pregunta me mapeaba esa 3ª respuesta.
Buscando por foros encontré una solución que no me valió, la de añadir un default (quizás hay alguien que lo haya podido desentrañar)
En mi caso, y como lo resolví fue agregando array(‘value’=>’0’) en la creación del radiobutton. De esta forma el código queda así:

create('User', array('action' => 'index/'.$id));
  $contents .= $form->radio('Respuesta', 
         array('1'=>$answer1, '2'=>$answer2, '3'=>$answer3), array('value'=>'0'));
  $contents .= $form->end('Enviar info');
  echo $contents;
?>