Pregunta

Quiero hacer algo muy directo y simple.Quiero tener dos conjuntos diferentes de datos paginados en la misma página.Los dos conjuntos diferentes dependen de diferentes modelos.Por el bien de la discusión diremos que son Image y Item.

Puedo configurar dos buscapersonas para dos modelos y obtener el conjunto correcto de objetos.Puedo obtener los enlaces correctos del buscapersonas.Pero cuando se trata de seguir los enlaces a los parámetros, ambos buscapersonas leen los parámetros y asumen que se aplican a ellos.

Termina pareciéndose a esto:

   $this->paginate = array (
        'Item'=>array(
            'conditions'=>array('user_id'=>$id),
            'limit' => 6, 
            'order' => array(
                'Item.votes'=>'desc', 
                'Item.created'=>'desc'
            ),
            'contain'=>array(
                'User', 
                'ItemImage' => array (
                    'order'=>'ItemImage__imageVotes desc'
                )
            )
        ),
        'Image'=>array(
            'limit'=>6,
            'contain'=>array(
                'User',
                'ItemImage'=>array('Item'),
            ),
            'order'=>array(
                'Image.votes'=>'desc',
                'Image.views'=>'desc'
            ),
            'conditions'=>array(
                'Image.isItemImage'=>1,
                'Image.user_id'=>$id
            )
        )
    );
    $this->set('items', $this->paginate('Item'));   
    $this->set('images', $this->paginate('Image'));

Eso está en el controlador.En la vista tengo enlaces de clasificación que se ven así:

<div class="control"><?php echo $this->Paginator->sort('Newest', 'Image.created', array('model'=>'Image')); ?></div>

Sin embargo, eso produce un enlace similar a este:

http://localhost/profile/37/page:1/sort:Image.created/direction:asc

No hay nada allí que le indique al paginador qué modelo pretendo ordenar.Entonces, cuando hago clic en el enlace, intenta ordenar ambos modelos por Image.created.El resultado es un error, porque Item no se puede ordenar por Image.created.¿Hay algo que estoy haciendo mal?¿O es algo que no es compatible con el paginador de CakePHP?

¿Fue útil?

Solución

La solución más sencilla sería la implementación de ambas redes como elementos que recuperan sus propios datos y el uso de AJAX para cargar los elementos en la página.

La única otra opción sería modificar los parametros para que pase los parametros para ambas redes a cada cuadrícula al ordenar o pasar a través de las páginas. El código publicado por Leo anterior es un comienzo bueno. Puede anteponer la clave Modelo de la matriz paginas sobre cada parámetro con nombre y asegurarse de que pase todos los parametros de URL a la función paginate y usted debe ser dirigido en la dirección correcta.

Otros consejos

Deberá anular el método de paginación para el modelo del controlador de esa página.

Hice algo similar, tal vez este fragmento ayude:

function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = array())
{
    $pageParams = compact('conditions', 'fields', 'order', 'limit', 'page', 'recursive', 'group');
    $this->contain('ModuleType', 'NodeDescriptor');
    $pageItems = $this->find('all',$pageParams);
    $pagesOut = array();
    foreach($pageItems as $pageItem)
    {
        $status = $pageItem['SiteAdmin']['status_id'];
        $moduleInfo = null;
        $nodeTitle = $pageItem['NodeDescriptor']['title'];
        $published = $pageItem['NodeDescriptor']['published'];
        $pageitemID = $pageItem['SiteAdmin']['id'];
        $moduleId =  $pageItem['SiteAdmin']['module_id'];
        $contName =  $pageItem['ModuleType']['controller'];
        if($moduleId)
        {
            $thisModel = ClassRegistry::getObject($moduleType);
            $thisModel->contain();
            $moduleInfo = $thisModel->read(null,$moduleId);
            $moduleInfo = $moduleInfo[$moduleType];
        }
        $pagesOut[] = array(
            'status'=>$status,
            'node'=>$nodeTitle,
            'published'=>$published,
            'info'=>$moduleInfo,
            'module_id'=>$moduleId,
            'contName'=>$contName,
            'pageitem_id'=>$pageitemID);
    }
    return $pagesOut;
}

Al hacerlo de esta manera, obtienes control sobre los parámetros pasados ​​para paginar, por lo que puedes pasar datos específicos del modelo, indicadores de control, etc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top