il crud di gii può lavorare con chiavi primarie di tipo stringa?

Oggi ho provato a lavorare con una tabella dell’ambiente di produzione in cui, il campo univoco primario, anziché essere il classico:




id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,



è costituito da caratteri:


  `id` varchar(7) NOT NULL,

Ho poi creato la logica di crud tramite gii, ma ho notato che compare la griglia, ma non si riesce a lavorare sul dettaglio del record.

Ritorna l’errore:

Error 400 [color="#555555"]Your request is invalid.[/color]

[color="#555555"]e non passa per il controller.[/color]

L’url è così costituito:

localhost/demo/index.php/tabella/update/CE01

ho notato che se, ad esempio, modifico l’url così:

localhost/demo/index.php/tabella/update/01

(o un qualunque numero finale)

l’errore cambia così:

Error 404

[color="#555555"][font="Arial, Helvetica, sans-serif"]The requested page does not exist.[/font][/color]

E soprattutto riesce a passare per il controller nella funzione

public function actionUpdate($id)

Da queste prove immagino che pretenda che l’id debba essere formata da una chiave univoca di tipo integer e non char.

Se dovessi creare un nuovo progetto da zero, logicamente creerei il campo come integer, ma dato che sto lavorando su un progetto già avviato, volevo chiedervi se era possibile risolvere in qualche modo il problema.

Dai un occhiatta al loadModel() nel tuo controller…

se hai questa linea


$model = Company::model()->findByPk((int) $id);

chambia per questa


$model = Company::model()->findByPk($id);

Ho controllato il file

/protected/controllers/TabellaController.php

ma è già senza (int)

Ho anche provato a modificarlo così:


$model=Tabella::model()->findByPk( (string) $id);

ma niente di fatto.

Ho poi fatto questo esperimento, modificandola così:





	public function loadModel($id)

	{

		die('ciao ' . $id);

	}



per capire se per lo meno la funzione viene utilizzata e si comporta come prima.

Se passo una stringa

( localhost/demo/tabella/a5 )

restituisce

Error 404 [color="#555555"][font=“Arial, Helvetica, sans-serif”][size=“2”]Il sistema non ha potuto trovare l’azione “a5” richiesta.[/size][/font][/color]

[color="#555555"][font="Arial, Helvetica, sans-serif"] [/font][/color]

Se passo un intero

( localhost/demo/tabella/5 )

allora passa per la funzione che mi hai indicato e restituisce

ciao 5

Allora il problema e nelle rute… per esempio questa ruta


'<_c:\w+>/<_a:\w+>/<id:\d+>' => '<_c>/<_a>',

funziona soltanto con i numeri per via del "\d+" - soltanto numeri

prova a chambiarlo con w+

Bravissimo,

Mille grazie!

Ho apportato la modifica nella unit /protected/config/main.php in questo modo:





		

		// Abilito la gestione degli URLs in path-format

		//Vedi: http://www.yiiframework.com/doc/guide/1.1/it/topics.url#parameterizing-routes		

		'urlManager'=>array(

			'urlFormat'=>'path',

			'showScriptName'=>false, //Non voglio visualizzare index.php

			'caseSensitive'=>true, //Qui trovi tutte le properties per sbizzarrirti: http://www.yiiframework.com/doc/api/1.1/CUrlManager

			'rules'=>array(

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

//				la riga qui sopra, la si può anche scrivere così:

//				'<_c:\w+>/<_a:\w+>/<id:\d+>' => '<_c>/<_a>',

//				la riga qui sopra, la modifico così perchè ho bisogno di gestire anche chiavi stringhe e non solo numeri

				'<_c:\w+>/<_a:\w+>/<id:\w+>' => '<_c>/<_a>',

				

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

			),

		),

		

e adesso funziona. Ti ho votato con un bel +

Mi sono accorto che la fantomatica riga:

<_c:\w+>/<_a:\w+>/<id:\w+>’ => '<_c>/<_a>

mi risolve il problema che avevo di poter lavorare su url così fatti:

[color=#1C2837][size=2]localhost/demo/index.php/tabella/update/CE01[/size][/color],

ma non riesco più a lavorare su rights, nello specifico quando devo generare nuove items per le azioni del controller:

localhost/demo/index.php/rights/authItem/generate

Ripristinando la vecchia configurazione:

<_c:\w+>/<_a:\w+>/<id:\d+>’ => '<_c>/<_a>

funziona rights, ma non più l’altro.

Come posso fare per far funzionare entrambi?

Non ho usato rights… pero prova con questo

<_c:(rights)>/<_a:\w+>/<id:\d+>’ => '<_c>/<_a>

<_c:\w+>/<_a:\w+>/<id:\w+>’ => '<_c>/<_a>

In questo modo i link per rights dovrebbero usare il primo rules… e altri la seconda…

E’ strano pero’ che i numeri non vengano accettati come w+

Grazie mille mdomba.

Certo che le sai proprio tutte.

Ti sei meritato un altro bel [size="3"][color="#006400"]+[/color][/size]