parametr returnUrl

Witam,

to na pewno głupie pytanie, ale dzień się już kończy, głowa mnie boli…

Jak ustawić returnUrl


	public function actionDelete($id)

	{

		if(Yii::app()->request->isPostRequest)

		{

			// we only allow deletion via POST request

			$this->loadModel($id)->delete();


			// if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser

			if(!isset($_GET['ajax']))

				$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));

		}

		else

			throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');

	}

Dla łącza z widoku


<?php echo CHtml::link('Skasuj wpis', '#', array('submit'=>array('forumPost/delete','id'=>$post->id),'confirm'=>'Na pewno chcesz skasować ten wpis?')); ?>

?

Innymi słowy, chcę wykonać jakąś akcję - w tym przypadku delete - i wrócić do zdefiniowanego przeze mnie URL’a. Potrzebuję to definiować dla łącza (widok), nie dla sesji czy kontrolera.

Mnie będzie bolała głowa dopiero jutro rano, więc nie jeste, pewny czy dobrze rozumiem pytanie:). Czy chcesz po kliknięciu w link przenieść się na jakąś z góry zdefiniowaną stronę, czy też strona na którą zostaniesz przekierowany zależy od linku w który klinkiesz?

Jeżeli pierwsze, to w kontrolerze sprawdzasz, czy istnieje w tablicy $_POST indeks returnUrl. Jeżeli nie, to ustawiasz jakiś swój na który masz być przekierowany po każdym usunięciu.

Jeżeli drugie to musisz po prostu przekazać w linku dodatkową zmienną:


<?php echo CHtml::link('Skasuj wpis', '#', array('submit'=>array('forumPost/delete','id'=>$post->id, 'returnUrl'=>array('kontroler/akcja')),'confirm'=>'Na pewno chcesz skasować ten wpis?')); ?>

a w kontrolerze sprawdzić czy taka zmienna istnieje i na nią przekierować:




if(!isset($_GET['ajax']))

  if(isset($_GET['returnUrl']))

    	$this->redirect($_GET['returnUrl'])

  else

    	$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));



Mam nadzieję, że nie popisałem głupot… Jutro sprawdzę i najwyźej zedytuj.

Hmm… to drugie, a konkretniej będąc w widoku tematu/wątku "forumTopic/view/id/X" - klikam w link, który ma skasować wybrany post w tym temacie "forumPost/delete/id/Y" po skasowaniu tego posta chcę wrócić do widoku tematu.

Jeśli dam:


<?php echo CHtml::link('Skasuj wpis', '#', array('submit'=>array('forumPost/delete','id'=>$post->id, 'returnUrl'=>array('forumTopic/view', 'id'=>$model->id)), 'confirm'=>'Na pewno chcesz skasować ten wpis?')); ?>

Mam 2x id w URLu (co już chyba nie za bardzo zadziała, ale nie jest to problem). Problemem jest to, że Yii odpala mi adres:


/forumPost/delete/id/2968/returnUrl[0]/forumTopic%2Fview/returnUrl[id]/37

co oczywiście kończy się jako 404.

Nie wiem czy dokładnie o to Ci chodziło :slight_smile:

W kontrolerze można zrobić przekierowanie do strony z której przyszło zapytanie.

Wykorzystuje się tutaj nagłówek referer przesyłany przez przeglądarkę.




$this->redirect(Yii::app()->getRequest()->getUrlReferrer());



Można też inaczej. Przed skasowaniem wątku z bazy pobieramy id wątku do którego ten post jest przypisany i wtedy po skasowaniu posta generujemy odpowiednie przekierowanie:




$this->redirect(array('forumTopic/view','id'=>ID_WĄTKU_PRZED_JEGO_SKASOWANIEM));



Dobra, teraz na trzeźwo.

Trochę mnie poniosło z tą tablicą jako parametr GET :). Wystarczy, że wpakujesz tam id wątku który chcesz obejrzeć, czyli:


<?php echo CHtml::link('Skasuj wpis', '#', array('submit'=>array('forumPost/delete','id'=>$post->id, 'parentId'=>'idWątku'), 'confirm'=>'Na pewno chcesz skasować ten wpis?')); ?>

a później w kontrolerze tak jak napisałem wcześniej z tym co napisał Mariusz W.:




if(!isset($_GET['ajax']))

   if(isset($_GET['parentId']))

  	$this->redirect(array('forumTopic/view','id'=>$_GET['parentId']))

   else

  	$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));



Oczywiście to nie będzie działać dla zapytań AJAX bez modyfikacji kontrolera i przekierowania po stronie klienta.

OT! Tuż przed pierwszą w nocy piszesz, że będzie Cię bolała głowa, a już po szóstej rano piszesz “dobra, teraz na trzeźwo”? :] Masz świetny łeb i mega krótkie kace! :P