Yii Framework Forum: parametr returnUrl - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

parametr returnUrl CRUD actionDelete Rate Topic: -----

#1 User is offline   TomaszKane 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 8
  • Joined: 29-July 11

Posted 01 February 2012 - 11:20 AM

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.
0

#2 User is offline   sidewinder 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 208
  • Joined: 08-July 09
  • Location:Poland

Posted 01 February 2012 - 05:42 PM

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.
---------------------------------------------------------------------
"Never memorize what you can look up in books."
Albert Einstein
0

#3 User is offline   TomaszKane 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 8
  • Joined: 29-July 11

Posted 02 February 2012 - 03:12 AM

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.
0

#4 User is offline   Mariusz W. 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 24
  • Joined: 15-December 11
  • Location:Poland/Warsaw

Posted 02 February 2012 - 10:10 AM

Nie wiem czy dokładnie o to Ci chodziło :-)

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

This post has been edited by Mariusz W.: 02 February 2012 - 10:15 AM

Posted Image
Posted Image
0

#5 User is offline   sidewinder 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 208
  • Joined: 08-July 09
  • Location:Poland

Posted 02 February 2012 - 11:27 AM

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.
---------------------------------------------------------------------
"Never memorize what you can look up in books."
Albert Einstein
0

#6 User is offline   Trejder 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 1,193
  • Joined: 06-October 10
  • Location:Southern Poland

Posted 13 October 2012 - 02:39 PM

View Postsidewinder, on 02 February 2012 - 11:27 AM, said:

Dobra, teraz na trzeźwo.

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
Proud Cookbook author, though still learning powerful Yii! :] See my generic profile for more information. Cheers!
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users