Domanda

Ho una vista indice che elenca gli elementi ed è un lungo elenco, quindi uso Paginator per limitare gli oggetti da 50 a una vista.

Ogni articolo ha un " modifica " collegamento che passa a una vista di modifica con input / validazioni / ecc. Quando viene inviato il modulo, reindirizzo l'utilizzo alla visualizzazione indice.

Fin qui tutto bene, ma ecco il problema:

Se un utente si trova nella pagina N dell'indice e fa clic su Modifica e modifica un elemento, voglio che vengano reindirizzati alla pagina N dell'indice. Se conoscessi il numero di pagina, potrei semplicemente attaccare & Quot; / page: N & Quot; alla fine dell'URL, ma non ho idea di come posso ottenere il numero di pagina. (N potrebbe essere qualsiasi numero di pagina, ma soprattutto & Gt; = 2)

Qualsiasi idea sarebbe apprezzata.

È stato utile?

Soluzione

Il numero di pagina dovrebbe essere parte di $ params var nella vista elenco. Basta attaccarlo alla fine del collegamento di modifica e gestirlo da lì. Nella pagina di modifica sarà necessario un modo per inserire il numero di pagina facoltativo, memorizzarlo durante l'invio di qualsiasi modulo e inoltrare di nuovo all'elenco con lo stesso numero di pagina.

Altri suggerimenti

Ho creato un componente che salva la pagina nella sessione. Quindi in app_controller.php, controllo per vedere se c'è qualcosa nella sessione per il particolare modello in uso e quindi aggiungo questo all'URL. Se sei interessato al codice per il componente, inviami un messaggio. Conservo anche l'ordine, se l'utente ha cambiato l'ordinamento nella pagina dell'indice prima di modificarlo.

Vedi qui per la fonte: http://github.com/jimiyash/cake- pluggables / blob / a0c3774982c19d02cfdd19a2977eabe046a4b294 / controller / componenti / memory.php

Ecco l'essenza di ciò che sto facendo.

//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;
    }

Se ho capito bene, quanto sopra va bene per la modifica, ma non per l'aggiunta. Questa soluzione dovrebbe funzionare per entrambe le situazioni:

Nei tuoi controller o nel tuo /app/app_controller.php, inserisci qualcosa del genere per aggiungere:

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

... e qualcosa del genere per l'editing:

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

Nel tuo /app/app_model.php, inserisci questo:

/**
 * 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;
  }

Spero che ti aiuti!

Fa un semplice

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

opere?

In vista con il paginatore:

<?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= '';
}}?>

Quindi collega alla pagina di modifica

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

Nel controller:

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());          
    }

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top