Help: UrlManager Problem jika Primary Key (VarChar)

Ada masalah nih teman-teman pada saat menggunakan primaryKey (Varchar)

bukan integer (numeric).

pada saat view or update path urlnya dianggap salah

berikut urlManagernya


'<controller:\w+>/<id:\d+>'=>'<controller>/view',

				'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',

				'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',

contoh Url yg tidak bisa terbaca :

http://xxxxxxx/site/index.php/item/update/ABC

mohon petunjuknya. Thanks

ana belum coba sih tambahin "/*"




'<controller:\w+>/<id:\d+>/*'=>'<controller>/view',

'<controller:\w+>/<action:\w+>/<id:\d+>/*'=>'<controller>/<action>',

'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',

Sudah saya coba tapi masih belum berhasil.

btw, setahu saya seharusnya menggunakan <id:\w+> (karena idnya berupa varchar bukan numeric)

tapi saya coba juga tetap tidak bisa. gimana ya ?? hehehehe

bisa quote pesan errornya gan??

Sudah bisa sih gan, tapi adamasalah satu lagi wkkwkwwkwk.

Saya share dulu dah sampai mana keberhasilan saya. Tapi ini masih ada bugs juga kalau pakai CGridView dengan primaryKey adalah varChar

Jadi yang harus kita rubah sebagai berikut jika kondisi mvc untuk tabel item

main/config.php




		'urlManager'=>array(

			'urlFormat'=>'path',

			'rules'=>array(

				'<controller:\w+>/<id:\d+>'=>'<controller>/view',

				'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',

				'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',

				'item/update/<id:\w+>'=>'item/update', // ini untuk menjalankan update

				'item/view/<id:\w+>'=>'item/view', // ini untuk menjalankan view

			),

		),

controller/ItemController.php




	public function loadModel($id)

	{

		$model=Item::model()->findByPk((int)$id); // pengecekan pertama (id int)

		if($model===null) {

			$model=Item::model()->findByPk($id); // pengecekan kedua (id semua tipe)

			if($model===null)

				throw new CHttpException(404,'The requested page does not exist.');

		}

		return $model;

	}

sejauh ini sudah berhasil gan, namun yang bermasalah adalah CGridView

untuk menu view url langsung diarahkan ke url/site/item/[id], tidak ada path actionnya (cth url/site/item/view/id)

jika kita rubah di urlManagernya ‘<controller:\w+>/<id:\w+>’=>’<controller>/view’, malah jadinya ngaco semua.

kwkwkwkw. gimana neh, ada ide gak untuk viewnya. atau kita kasih tau qiang saja kalau CGridView untuk path menu viewnya mohon dirubah jadi url/site/view/[id]

gw post di forum public gak ada yg jawab. hikz

ada yg bisa bantu gak yah ????? helpppp

ane juga dulu nemu permasalahan kya gini, pk nya varchar kayak contonya nomor surat,

paduan huruf dan angka, alhasil tidak bisa lulus preg_match.

padahal klo di dokumentasi typenya string. harusnya bisa.

ane bongkar2x di class conrtoller-nya klo ga salah…

coba langsng hardcode id nya?




public function loadModel()

{

      $_GET['id'] = 'r123';  //coba test hardcode idnya disini, kyanya bisa deh, 

                             //menurut ane sebelum masuk ke loadModel(), param sdh di-sterilkan

                             //sama class controller, disitulah tidak lulus preg_match


	if($this->_model===null)

	{

	    if(isset($_GET['id'])){

		$this->_model=t_surat::model()->findbyPk($_GET['id']);

--

--




btw, ane cm share pengalaman, mungkin ada solusi yg lebih baik dari yg lain.

wuih akhirnya beres juga. saya rubah di urlManagernya


'urlManager'=>array(

			'urlFormat'=>'path',

			'rules'=>array(

				'<controller:\w+>/<id:\d+>'=>'<controller>/view',

				'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',

				'<controller:\w+>/<action:(create|view|update|delete|admin|index)>'=>'<controller>/<action>', //dilimit hanya untuk action(create|view|update|delete|admin|index)

				'<controller:(item)>/<action:\w+>/<id:\w+>'=>'item/<action>',

				'<controller:(item)>/<id:\w+>'=>'item/view', //rules: tidak boleh input primary key (create|view|update|delete|admin|index)

			),

		),

tapi cara ini keliatannya kurang efektif neh… lebih bagus lagi jika dari crgidviewnya diseragamkan jadi link view itu pakai action view juga. jadi gak perlu pakai ini itu. (ini berlaku jika model yg kita gunakan menggunakan primary key (varchar) bukan integer.

kalau ini sih berhasil gan, tapi tetap bermasalah jika link urlnya situs.com/item/ABC (view dari id yg varchar)

ABC dibaca sebagai action oleh url managernya, karena default dari url managernya itu

‘<controller:\w+>/<action:\w>’=>’<controller>/<action>’,

sedangkan untuk rules yang dibawah ini tidak akan terbaca, karena ini berlaku hanya untuk rules numeric dibelakangnya

‘<controller:\w+>/<id:\d+>’=>’<controller>/view’,

tapi its ok, sudah bisa gan. contoh yg diatas. #8

walaupun menurut ane kurang efektif. maaf, soalnya masih belajar neh. pusing !!! kwwkwkwk

maaf, tapi gimana rendernya kalau ga lewat controller?

Coba aku jelasin dah kenapa bermasalah jika pk kita adalah variable varchar bukan integer / numeric.

Pertama jika kita menggunakan urlManager default dari Yii secara otomatis akan dibaca sebagai berikut


'urlManager'=>array(

                        'urlFormat'=>'path',

                        'rules'=>array(

                                '<controller:\w+>/<id:\d+>'=>'<controller>/view', // 1. jika path kita site.com/item/id[varchar] maka tidak akan diproses, namun jika [id(int)] akan diproses bedanya ada di \w dan \d.

\\ \d itu numeric

\\ \w itu untuk selain numeric (num + char) 

                                '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>', // 2. tidak akan dibaca juga, karena path urlnya dibelakangnya varchar, sedangkan yg di rules ini harus numeric dibelakangnya

                                '<controller:\w+>/<action:\w>'=>'<controller>/<action>', // 3. ini dijalankan. kemudian masuklah ke action controllernya. namun ActionAbc tidak ada di ItemController.php

                        ),

                ),

jadi urlManager untuk langkah 1. 2. dan 3. yg dijalankan adalah yg nomor 3.

namun tidak ada action yg sesuai.

sedangkan jika tidak ada action yg sesuai maka tidak ada yg bisa di proses

jelas gak ya … sori kalo salah neh jelasinnya, tapi kira2 begini gan.