Hola chicos !! Estoy probando el maravilloso plugin 'Pagination' sobre cake 1.1 creado por ad7six (http://www.ad7six.com/). En la bakery hay un articulo muy detallado sobre como funciona (http://bakery.cakephp.org/ articles/view/pagination) pero lo que yo realmente encontré util fue el plugin demo creado por ad7six que podeis descargar de (http:// cakeforge.org/frs/download.php/397/1.1pagination_r107.zip) y con el que estoy haciendo pruebas y adaptandolo a mis necesidades. Para probar este plugin lo único que teneis que hacer es descomprimir el archivo dentro del directorio /app/plugins y luego importar el archivo sql 'structure.sql' en nuestra base de datos mysql que se encuentra dentro de la carpeta que acabamos de descomprimir, llamada pagination. Ahora si ponemos en nuestro navegador 'DirectorioInstalacionCake/ Pagination/' nos mostrará una pagina de bienvenida al plugin con um menú para acceder a los diversos metodos de paginacion y busqueda. He estado probando los diversos métodos desarrollados por ad7six para paginar y buscar registros, me parece muy pero que muy bueno. Quiero hacer un poco mas sofisticado la busqueda a través de los formularios, pero por ahora no he conseguido nada. Sabe alguien como se podría modificar el controlador 'PRG' para que la acción 'complex' permita hacer busquedas acotadas para un determinado campo del modelo, es decir, que por ejemplo, en el formulario de busqueda se pudieran buscar todos los libros que tengan un precio mayor a 5 y menor que 20. En el ejemplo creado por ad7six solo permite entrar el valor exacto del campo a buscar. Más o menos comprendo el funcionamiento de la acciòn y de las funciones utilizadas en ella, como el pasar los valores por url al controlador para registrar en todo momento que es lo que se ha buscado y mostrar formulario rellenado con la última busqueda, y como se llama al compomente pagination con sus parametros, he estado leyendo las explicaciones de ad7six pero como no soy un experto no sé como añadir la funcionalidad comentada antes. Muchas gracias de ante mano a todo el mundo ! aunque solo sea por leer mi post-ladrillo ! Os pongo a continuación la acción 'complex' y las funciones usadas para esa acción:
function complex() { $this->_defineSelects(); if ($this->data) { $URL = $this->_generateURL($this->data); return $this->redirect(array($URL)); } $args = $this->_searchParse(); list($criteria,$Display) = $this->_generateConstraint($args); if($Display) { $this->_addFlash('Showing results for Titles matching: '.implode(', ',$Display).'.'); } else { $this->_addFlash('Currently showing all results.'); } list($order,$limit,$page) = $this->Pagination->init($criteria); $results = $this->{$this->modelClass}->findAll($criteria, null, $order, $limit, $page); $this->set('results',$results); $this->render('complex'); } function _generateURL($data) { $URL = ''; foreach ($data as $model => $array1) { $model = Inflector::camelize($model); foreach($array1 as $field => $value) { $value = preg_replace('#\W+#i', '', $value); //$this->log("$field = '". ord($value).'''); //print_r(var_dump(urlencode($value))); if(strlen(trim($value)) > 0 ) { //if ($value) { if(strpos($field, '-')) { list($field, $operator) = split('-', $field); } else { $operator = ''; } $field = Inflector::camelize($field); if ($model == $this->modelClass) { $URL .= $field.':'; } else { $URL .= $model.'-'.$field.':'; } if ($operator) { $URL .= $operator.'-'; } $URL .= $value.'/'; } } } return $URL; } function _searchParse () { $args = $this->passedArgs; $c = count($args); if (is_array($args)) { foreach ($args as $arg) { if(strpos($arg, ':')) { list($field, $value) = split(':', $arg); if(strpos($field, '-')) { list($model, $field) = split('-', $field); } else { $model = 'Title'; } if(strpos($value, '-')) { list($operator, $value) = split('-', $value); //$operator = $this->_convertComparison($operator); } else { $operator = '='; } $a[$model][$field][$operator] = $value; } } return $a; } else { return array(); } } function _generateConstraint($Inputs=null) { uses('inflector'); $restructured = array(); $Constraint = array(); $Display = array(); $data = array(); foreach ($Inputs as $modelName=>$array1) { $modelName = Inflector::camelize($modelName); foreach ($array1 as $field => $array2) { $field = Inflector::underscore($field); foreach ($array2 as $operatorStr =>$value) { if ($modelName == $this->modelClass) { $Dis = Inflector::Humanize($field).' '; } else { $Dis = Inflector::Humanize($modelName).' '.Inflector::Humanize($field).' '; } if ($operatorStr=='cont') { $Constraint[$modelName.'.'.$field] = 'LIKE %'.$value.'%'; $Dis .= 'contains '; $data[$modelName][low($field.'-'.$operatorStr)] = $value; } elseif ($operatorStr<>'=') { $operator = $this->_convertComparison($operatorStr); $Constraint[$modelName.'.'.$field] = $operator.' '.$value; $Dis .= $operatorStr.' '; $data[$modelName][low($field.'-'.$operatorStr)] = $value; } else { $Constraint[$modelName.'.'.$field] = $value; $Dis .= ' is '; $data[$modelName][low($field)] = $value; } $Dis .= $value; $Display[] = $Dis; } } } $this->data= $data; $Constraint=$Constraint?$Constraint:null; $Display=$Display?$Display:null; return array($Constraint,$Display); } function _defineSelects () { $this->set('cats', $this->Title->Category->generatelist()); $this->set('pubs', $this->Title->Publisher->generatelist()); $this->set('selected_cats', array()); $this->set('selected_pubs', array()); } --~--~---------~--~----~------------~-------~--~----~ Has recibido este mensaje porque estás suscrito a Grupo "CakePHP-es" de Grupos de Google. Si quieres publicar en este grupo, envía un mensaje de correo electrónico a CakePHP-es@googlegroups.com Para anular la suscripción a este grupo, envía un mensaje a [EMAIL PROTECTED] Para obtener más opciones, visita este grupo en http://groups.google.com/group/CakePHP-es?hl=es. -~----------~----~----~----~------~----~------~--~---