Frage

Ich habe einen Index Ansicht, die Elemente enthält, und es ist eine lange Liste, so verwende ich Paginator Artikel zu 50-to-a-Ansicht zu begrenzen.

Jedes Element hat einen Link „Bearbeiten“, die mit Ein- / Validierungen / etc zu einer Bearbeitungsansicht geht. Wenn das Formular abgeschickt wird, leite ich die Verwendung zurück in die Indexansicht.

So weit so gut, aber hier ist das Problem:

Wenn ein Benutzer auf Seite N des Index ist und sie bearbeiten klicken und ein Element bearbeiten, möchte ich sie auf Seite N des Index zurück umgeleitet werden. Wenn ich die Seitennummer kenne, konnte ich nur Stick „/ Seite: N“ auf Ende der URL, aber ich habe keine Ahnung, wie ich die Seitenzahl bekommen. (N könnte eine beliebige Seitenzahl sein, aber vor allem> = 2)

würde Irgendwelche Ideen geschätzt.

War es hilfreich?

Lösung

Die Seitenzahl soll einen Teil der $ params var in der Listenansicht sein. heften Sie es einfach auf das Ende des Link Bearbeiten und behandelt es von dort. Auf der Bearbeitungsseite müssen Sie einen Weg in die optionale Seitennummer zu übernehmen, sollte sie während irgendeiner Form Unterwerfung und weiterleiten mit der gleichen Seitennummer in die Liste zurück.

Andere Tipps

Ich habe eine Komponente, die die Seite in der Sitzung speichert. Dann in der app_controller.php, überprüfe ich, um zu sehen, ob es etwas in der Sitzung für das jeweilige Modell verwendet wird und dann das auf die URL hinzuzufügen. Wenn Sie mich in den Code für die Komponente Nachricht interessiert sind. Ich speichere auch die Reihenfolge, wenn der Benutzer die Sortierreihenfolge in der Index-Seite vor der Bearbeitung geändert.

Sehen Sie hier für die Quelle: http://github.com/jimiyash/cake- pluggables / Blob / a0c3774982c19d02cfdd19a2977eabe046a4b294 / controllers / components / memory.php

Hier ist der Kern dessen, was ich tue.

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

Wenn ich richtig verstehe, ist das oben für die Bearbeitung in Ordnung, aber nicht für das Hinzufügen. Diese Lösung sollte für beide Situationen arbeiten:

In Ihrem Controller oder Ihre /app/app_controller.php, setzen Sie in so etwas wie dies für das Hinzufügen von:

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

... und so etwas wie dies für die Bearbeitung:

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

In Ihrem /app/app_model.php, in diesen setzen:

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

Ich hoffe, das hilft!

Gibt es eine einfache

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

funktioniert?

In Ansicht mit paginator:

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

Dann verlinken Seite bearbeiten

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

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

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top