Pregunta

Tengo una vista de índice que enumera elementos, y es una lista larga, así que uso Paginator para limitar los elementos a 50 por vista.

Cada elemento tiene un " edit " enlace que va a una vista de edición con entradas / validaciones / etc. Cuando se envía ese formulario, redirijo el uso nuevamente a la vista de índice.

Hasta ahora todo bien, pero aquí está el problema:

Si un usuario está en la página N del índice y hace clic en editar y editar un elemento, quiero que se redirija a la página N del índice. Si supiera el número de página, podría pegar & Quot; / page: N & Quot; hasta el final de la URL, pero no tengo idea de cómo puedo obtener el número de página. (N podría ser cualquier número de página, pero especialmente & Gt; = 2)

Cualquier idea sería apreciada.

¿Fue útil?

Solución

El número de página debe ser parte de la variable $ params en la vista de lista. Simplemente colóquelo al final del enlace de edición y maneje desde allí. En la página de edición, necesitará una forma de incluir el número de página opcional, almacenarlo durante el envío de cualquier formulario y reenviar a la lista con el mismo número de página.

Otros consejos

Creé un componente que guarda la página en la sesión. Luego, en app_controller.php, verifico si hay algo en la sesión para el modelo particular que se está usando y luego lo agrego a la url. Si está interesado en el código del componente, envíeme un mensaje. También almaceno el pedido, si el usuario cambió el orden de clasificación en la página de índice antes de editarlo.

Vea aquí la fuente: http://github.com/-imi pluggables / blob / a0c3774982c19d02cfdd19a2977eabe046a4b294 / controllers / components / memory.php

Aquí está la esencia de lo que estoy haciendo.

//controller or component code
if(!empty($params['named']) && !empty($params['controller']) && $params['action'] == 'admin_index'){
    $this->Session->write("Pagem.{$params['controller']}", $params['named']);
}

//app_controller.php
    $redirectNew = "";
    if(is_array($redirectTo)){
        if(!empty($params['prefix']) && $params['prefix'] == 'admin'){
            $redirectNew .= '/admin';
        }
        if(!empty($params['controller'])){
            $redirectNew .= "/" . $params['controller'];
        }
        if(!empty($redirectTo['action'])){
            $redirectNew .= "/" . $redirectTo['action'];
        }
    } else {
        $redirectNew = $redirectTo;
    }

    $controller = $params['controller'];
    if($this->Session->check("Pagem.$controller")){
        $settings =  $this->Session->read("Pagem.$controller");
        $append = array();
        foreach($settings as $key=>$value){
            $append[] = "$key:$value";
        }
        return $redirectNew . "/" . join("/", $append);
    } else {
        return $redirectNew;
    }

Si entiendo correctamente, lo anterior está bien para editar, pero no para agregar. Esta solución debería funcionar para ambas situaciones:

En sus controladores o en su /app/app_controller.php, agregue algo como esto para agregar:

$insertID = $this->{$this->modelClass}->getLastInsertID();
$page = $this->{$this->modelClass}->getPageNumber($insertID, $this->paginate['limit']);
$this->redirect("/admin/{$controllerName}/index/page:{$page}");

... y algo como esto para editar:

$page = $this->{$this->modelClass}->getPageNumber($id, $this->paginate['limit']);
$this->redirect("/admin/{$controllerName}/index/page:{$page}");

En su /app/app_model.php, ingrese esto:

/**
 * Work out which page a record is on, so the user can be redirected to
 * the correct page.  (Not necessarily the page she came from, as this
 * could be a new record.)
 */

  function getPageNumber($id, $rowsPerPage) {
    $result = $this->find('list'); // id => name
    $resultIDs = array_keys($result); // position - 1 => id
    $resultPositions = array_flip($resultIDs); // id => position - 1
    $position = $resultPositions[$id] + 1; // Find the row number of the record
    $page = ceil($position / $rowsPerPage); // Find the page of that row number
    return $page;
  }

¡Espero que eso ayude!

Hace un simple

$this->redirect($this->referer());

funciona?

A la vista con el paginador:

<?php
if ($this->Paginator->hasPage(null, 2)) {   
$pag_Start = $this->Paginator->counter('{:start}');
$pag_End = $this->Paginator->counter('{:end}');
if( $pag_Start == $pag_End ){
$pageToRedirect = $this->Paginator->current('Posts');
}else{
$pageToRedirect= '';
}}?>

Luego enlace para editar la página

<?php
echo $this->Form->postLink(
'Edit',
array('action' => 'edit', $subscription['Post']['id']));
?>

En el controlador:

public function edit($post_id, $pageToRedirect = false){

    //after all editing its done redirect

    if($pageToRedirect){
    // if record was last in pagination page redirect to previous page
    $pageToRedirect = $pageToRedirect -1;
    return $this->redirect(array('action' => 'index/page:'.$pageToRedirect ));
    }else{
    // else redirect to the same pagination page
    $this->redirect($this->referer());          
    }

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