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.

-~----------~----~----~----~------~----~------~--~---


Responder a