One of the platforms I have to develop for is iSites. This is a Harvard grown LMS that is complicated and annoying, but functional.
Since I have to develop tools that fit within this framework I have to work around its limitations. One of the simpler to understand limitations is the idea of not having control of the headers sent. Since by the time it gets to my tool, the page has already started loading, output has already been sent, so doing a redirect with PHP’s header function is impossible.
Yii has 2 ways to forward things through the controller. redirect and forward. Redirect uses header and forward doesn’t change the URL. So the best way to forward within isites is to use a js forward. I.e. document.location = “www.google.com”
So in the controller.php in components which extends CController I added a method jsredirect:
https://github.com/jazahn/Quizmo/blob/ma…
protected function jsredirect($url){ // set the redirect in a session Yii::app()->session['jsredirect'] = $url; // forward to the jsredirect action $this->forward('/site/jsredirect'); }
This just sets a session var for the redirect and forwards to site/jsredirect so in SiteController.php I have
public function actionJsredirect(){ if(isset(Yii::app()->session['jsredirect'])){ $this->render('jsredirect',array( 'url'=>Yii::app()->session['jsredirect'], )); } }
And then in the jsredirect template file we have
<script> window.location.replace("{$url}"); </script>