Melempar Variable

Hola Kakak Yii Senior,

Saya baru di Yii. Mau nanya, Kak:

Saya generate CRUD dari gii. Nah, secara default kan, ada 3 jenis layout:

  • main.php

  • column1.php

  • column2.php

Bagaimana cara saya melempar variable dari main.php ke column2.php??? Yang sekarang seh saya buat pake bantuan keyword ‘global’, karena saya belum sepenuhnya mengerti flow/life-cycle Yii.

Mohon Bimbingan Kakak Senior sekalian… :)

sama bro, ane juga masih baru di Yii ;).

setahu saya itu cuma layout aja.

kalo mau lempar2an variable mending di Model, View, Controller terkait.

emang variable seperti apa yg dikehendaki ?

Makasih bro udah balas… :)

Gini bro, di view aku dah nge-render model Store:





<?php

$this->breadcrumbs=array(

	'Stores'=>array('index'),

	$model->name,

);


$this->menu=array(

	array('label'=>'List Store', 'url'=>array('index')),

	array('label'=>'Create Store', 'url'=>array('create')),

	array('label'=>'Update Store', 'url'=>array('update', 'id'=>$model->owner_id)),

	array('label'=>'Delete Store', 'url'=>'#', 'linkOptions'=>array('submit'=>array('delete','id'=>$model->owner_id),'confirm'=>'Are you sure you want to delete this item?')),

	array('label'=>'Manage Store', 'url'=>array('admin')),

);


?>


<h1>View Store #<?php echo $model->owner_id; ?></h1>


<?php 

global $current_logo;

$current_logo=StoreLogo::model()->findByPk((int)$model->current_logo);

$current_logo=$current_logo->path;


$this->widget('zii.widgets.CDetailView', array(

	'data'=>$model,

	'attributes'=>array(

		'owner_id',

		'current_logo',

		'name',

		'signature',

		'desc',

		'reputation',

		'created',

		'modified',

	),

)); ?>




Nah, aku mau nempatin current logo di bar kanan web(sidebar column2.php). Awalnya aku coba aja nge-echo image di sidebar itu, ternyata di column2 $model sudah tidak terbaca lagi, makanya di code awal ada pelemparan variable melalui $this->menu. Aku coba sisipkan melalui $this->menu, dengan cara menempatkan $current_logo diarray paling akhir $this->menu, tetap tidak bisa. Solusi terakhir seh, aku manfaat kan keyword global (menurut aku seh, design seperti ini jelek. Pasti ada cara lain).

Berikut code di column2.php


<?php 

$this->beginContent('//layouts/main'); ?>

<div class="container">

	<div class="span-19">

		<div id="content">

			<?php echo $content; ?>

		</div><!-- content -->

	</div>

	<div class="span-5 last">

		<div id="sidebar">

		<div id="store-logo">

		<?php

			global $current_logo;

			echo CHtml::image(Html::imageUrl($current_logo)); 

		?>

		</div> 

		<?php

			$this->beginWidget('zii.widgets.CPortlet', array(

				'title'=>'Operations',

			));

			$this->widget('zii.widgets.CMenu', array(

				'items'=>$this->menu,

				'htmlOptions'=>array('class'=>'operations'),

			));

			$this->endWidget();

		?>

		</div><!-- sidebar -->

	</div>

</div>

<?php $this->endContent();?>

Bagaimana solusinya bro??? :-[

klo mo lebih global lagi, langsung hajar di config/main.php




	'params'=>array(

		'adminEmail'=>'surat@yahoo.com',

		'colum1'=>'pathketheme1',

		'colum2'=>'pathketheme2',

	)


/// cara akses

echo Yii::app()->params['colum1'];




coba di controllernya waktu mau render view ditambahkan variabel lagi.




public function actionView($id)

	{

		$logo = ....... //diisi path logonya

		$this->render('view',array(

			'model'=>$this->loadModel($id), 'logo'=>$logo,

		));

	}



Iya setau ane, cara Saebaryo itu cara yang benar. Karena sistem Yii memakai sistem push, di mana

Controller yang push data ke view, maka memang harus di Controller yang nge-push variabel dengan passing variabel

ke parameter ke dua di fungsi render() atau renderPartial()

Kalo global itu dipakai kalau emang musti dipakai di mana2, baru harus pakai sih. (misalnya email admin, nama perusahaan, dll)

wah tengkyu udah dijelasin, soalnya saya gak ngerti teorinya, bener ato salah juga gak tau, cm kalo pake itu bisa jalan ya pake aja :P

wkk… sebetulnya saya juga belajar best approach-nya. Jadi biar kalau kedepannya ada perubahan di sistem (yang sudah pasti terjadi dalam perancangan suatu sistem), gampang dilakukan.

Ternyata Yii juga support pull…

Mungkin bisa lihat thread ini kalau tertarik Passing Data o a view

Tetap ga dikenal bro…

Dicontroller saya buat demikian:




	public function actionView()

	{   

		$store=$this->loadModel(Yii::app()->user->id);

		$current_logo=StoreLogo::model()->findByPk((int)$store->current_logo);

		$current_logo=$current_logo->path;




		$this->render('view',array(

			'model'=>$store,

			'current_logo'=>$current_logo

		));

	}



kemudian di colum2.php:




.....


<div id="sidebar">

		<div id="store-logo">

		<?php

	 

			echo CHtml::image(Html::imageUrl($current_logo)); 

		?>

		</div> 


...



Error:


Undefined variable: current_logo

:-[

Any suggestion, bro???

Kalau di apps/views/store/view.php

$current_logo bisa kebaca … (hal yg normal, ya ga?)

Mohon pencerahan abang kakak sekalian? Adakah cara lain? ???

oh ya… cara render itu hanya berefek ke file view bersangkutan.

sedangkan kalau yang kamu mau itukan ke bagian sidebar, yang notabene berada di bagian layout yah…

kalau pengen utak atik isi disitu kamu bisa lihat solusi di sini

http://www.yiiframework.com/forum/index.php?/topic/4473-how-to-pass-variable-to-a-layout/

tetapi dari hasil diskusi di thread situ, secara arsitektur, Yii tidak pernah dirancang supaya developer bisa passing variable ke layout. Karena bisa membuat keterikatan antara controller sama layout…

Yup… passing variable to layout…

Izin baca gan… :)

Menurut saya tehniknya fastcrash udah paling bener karena perkiraan saya layout sidebar berada dalam kendali controller yg berbeda makanya variabelnya gak bisa baca… variabel $current_logo pasti hanya terbaca di column1 (main content)… sekali lagi, ini cuman perkiraan… maklum kita sama2 org buta yg saling menuntun dlm kegelapan… hahaha

he hee… tinggal pilih selera masing-masing

tekniknya mindplay yg dikasih linknya sama bro junxiong itu jg menarik.

btw, klo mo bisa dibaca and rewriten variable ke setiap controller yg berbeda

bisa pakai dengan tehnik ini :

di config/main.php




'params'=>array(

     'adminEmail'=>'surat@yahoo.com',

     'myVar'=>'theme1',  //kasih nilai default jika perlu, eg: theme1, true, etc

)



di controller buat function




public function myVar()   //jika di set public maka variabel bisa diakses di semua file/class

{

     $myVar = 'Theme2';     //nilai myVar ini bisa didapat/diolah dari database, EGPCS, dsb

     Yii::app()->params['myVar'] = $myVar;  // nilai params['myVar'] di main.php di overwritten

}



kemudian tinggal akses dimana saja :)




echo $this->myVar();  //jadi nilai myVar bisa berbeda di setiap controllernya



atau kalau function di set private misal




private function myVar()     //jika di set private maka variabel hanya bisa

{                            //diakses di file/class ini saja

     Yii::app()->params['myVar'];

}



disetiap action, baik create, update, admin, etc fungsi ini harus dipanggil terlebih dahulu




// khususnya berguna untuk memfilter data atau privileges tombol edit, add, etc.

public function actionAdmin()

{

     $this->myVar();


     ...

     ...

}


public function actionCreate()

{

     $this->myVar();


     ...

     ...

}


public function actionView()

{

     $this->myVar();


     ...

     ...

}




kemudian tinggal akses dimana saja sesuai actionnya :)




echo Yii::app()->params['myVar'];

echo $this->myVar();  //  tidak bisa diakses  - errno  <img src='http://www.yiiframework.com/forum/public/style_emoticons/default/smile.gif' class='bbc_emoticon' alt=':)' />


//contoh penggunaan di view

if(Yii::app()->params['myVar'] === TRUE)

     echo 'submit/edit/add button here';






mungkin bisa membantu bagi yang pusing lempar-lemparin variabel, klo ada yang kurang, tolong kasih tau yup. maklum sama2 org buta yg saling menuntun dlm kegelapan… hahaha

kok sepertinya ribet ya…

maaf kalo salah tanggap, bulannya column2.php itu secara otomatis dirender didalam main,

artinya semua variable yang ada di main.php, pasti terbaca di column2.php iya gak seh…

coba ah…

sebenarya semua nilai (asal public state) dapat diakses dimana aza dengan mengunakan : Yii::app()->nilai.

refensi :"Application is created as a singleton by the entry script. The application singleton can be accessed at any place via Yii::app()."

jadi ngak perlu didefinisikan ulang dgn param jg ngak masalah, yang penting udah didefinisi kan di kontroller atau model.

atau kalau mau pake param jg ngak apa tp jk belum didefinisi di kedua tempat diatas.

semua Variable yang telah didefinisikan dlm "The application singleton" atau aplikasi dpt di akses langsung dengan Yii::app() dimana pun dia dalam aplikasi itu

untuk render nya seperti render model maupun controller seperti biasa, Yii::app() sebaiknya jangan di panggil di view nya

@YII alvs : thank’s bro buat masukannya, ane juga baru tau

maklum jarang baca manualnya ;D

bisa kasih contohnya gan, ‘can be accessed at any place via Yii::app()’?

jadi pantang gitu panggil Yii::app() di view?

yup bisa, tp yang sedang dibahas ‘nilai variablenya selalu berbeda di setiap controller & dynamic’

mangkanya pake Yii::app() salah satu solusinya ketimbang pake $_SESSION atau $GLOBAL,

mungkin ada yang nemu solusi yg lain?

Tq

wah bener bener, dulu juga sempat kena masalah kayak gini, pengen buat column tapi ternyata isinya dependency dengan controller / data,

dan waktu itu juga karena tidak punya solusi akhirnya buat colukn di view hahaha…

tapi baca dari oom fastcrash kayaknya jitu tuh, trus ane punya pikiran nih oom… tolong dikritisi pikiran ini…

karena semua controller yang ane buat merupakan turunan dari MyCController bukan turunan dari CController, sehingga saya bisa buat myVar didalam MyController.

selanjutnya semua controller jika perlu merubah tingal overwrite, mungkin dengan setter dan getter yang tepat.

wah mantep nih gan, dah bisa nurunin kelas, MyController ini filenya ditaruh dmn gan?

folder components?




class MyController extends CController

{

public $head;

}



sekalian kasih contohnya bro, cara panggilnya diview?

yup betul

iya bener ditaruh dicomponent… dulu yang bikin ide ini bukan ane… tapi tinggal pake… sepertinya bagus nih lebih classy dibanding config…