Nasıl sonra CakePHP yönlendirme sayfası sayısını korumak mı?

4 Cevap php

Ben öğeleri listeleyen bir dizin görünümü var, ve bu yüzden 50-to-a-view öğeleri sınırlamak için paginator kullanabileceğiniz uzun bir liste var.

Her madde giriş / onaylama / vb bir düzenleme görünümü gider "edit" bağlantı vardır. Bu form gönderildiğinde, geri dizin görünümüne kullanımını yönlendirmek.

Şimdiye kadar çok iyi, ama burada ovmak:

Bir kullanıcı endeksin sayfa N üzerinde olduğunu ve düzenle seçeneğini tıklayın ve bir öğeyi düzenlerseniz, ben onları geri indeksi sayfa N yönlendirilmesini istiyorsanız. URL'nin sonuna üzerine, ama ben sayfa numarasını almak nasıl hiçbir fikrim yok: ben sayfa numarasını bilseydim, ben sadece "N / sayfa" sopa olabilir. (N herhangi bir sayfa numarası olacak, ama özellikle> = 2 olabilir)

Herhangi bir fikir mutluluk duyacağız.

4 Cevap

Sayfa numarası liste görünümünde $ params var parçası olmalıdır. Sadece düzenleme bağlantının sonuna üzerine çakmak ve oradan hallederim. Düzenleme sayfada, isteğe bağlı sayfa numarası almak herhangi bir form gönderme sırasında saklamak ve aynı sayfa numarası ile geri listesine iletmek için bir yol gerekir.

Ben oturumda sayfasını kaydeder bir bileşen yarattı. Sonra app_controller.php de, ben orada kullanılan belirli bir model için oturumda bir şey ve sonra url eklemek olmadığını görmek için kontrol edin. Eğer bileşen, mesajın beni için kod istiyorsanız. Kullanıcı düzenlemeden önce dizin sayfa sıralama düzeni değişti, ben de sipariş saklayın.

See here for the source: http://github.com/jimiyash/cake-pluggables/blob/a0c3774982c19d02cfdd19a2977eabe046a4b294/controllers/components/memory.php

İşte ben ne yapıyorum özü olduğunu.

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

Eğer doğru anlamak, yukarıdaki düzenleme için değil eklemek için gayet iyi. Bu çözüm her iki durum için çalışması gerekir:

Lütfen denetleyicileri veya eklemek için böyle bir şey koymak için / app / app_controller.php, In:

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

... Ve düzenleme için böyle bir şey:

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

Sizin / app / app_model.php konumunda yer alır, bu koymak:

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

Umarım ki olur!

Bir basit mu

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

çalışır?