Problema con il naming dei file

Ciao a tutti, da qualche tempo sto sviluppando con Yii e ora ho un problema che non riesco a risolvere:

Sto sviluppando la mia app in locale su MacOsX / MAMP e fin qui tutto bene.

Poche ore fa l’ho caricata su di un server internet, ho configurato il db e anche qui tutto bene. Entrando in una pagina specifica, mi è uscito

PHP Warning - include(address.php) [<a href=‘function.include’>function.include</a>]: failed to open stream: No such file or directory

Il frammento di errore è questo:

/home/onlqoots/public_html/yii-1.1.10.r3566/framework/YiiBase.php(418)


{

407                     foreach(self::$_includePaths as $path)

408                     {

409                         $classFile=$path.DIRECTORY_SEPARATOR.$className.'.php';

410                         if(is_file($classFile))

411                         {

412                             include($classFile);

413                             break;

414                         }

415                     }

416                 }

417                 else


418          ********           include($className.'.php');      ***** (EVIDENZIATO)


419             }

420             else  // class name with namespace in PHP 5.3

421             {

422                 $namespace=str_replace('\\','.',ltrim($className,'\\'));

423                 if(($path=self::getPathOfAlias($namespace))!==false)

424                     include($path.'.php');

425                 else

426                     return false;

427             }

428             return class_exists($className,false) || interface_exists($className,false);

429         }

430         return true;

In pratica indagando ho capito che il metodo autoloader cerca il file address.php, in quanto il nome della relazione della tabella address con la tabella X è appunto "address", solo che il file si chiama "Address.php", perchè giustamenteio ho "class Address extends CActiveRecord".

Rinominando il file in "address.php" il tutto torna apparentemente a funzionare!

Ora il mio dilemma è questo:

rinominare tutti i file delle classi dei modelli? se poi più avanti esce un problema analogo che richiede che il file abbia l’identico nome della classe?

modificare in qualche modo l’autoloader?

…altro?

Grazie a chi avrà la pazienza di rispondermi :)

Questo e il classico problema quando si sviluppa su un sistema operativo case-insensitive (windows,mac) e poi si trasferisce il codize su un sistema case-sensitive (linux)

Le convenzioni di Yii le puoi leggere qui - http://www.yiiframework.com/doc/guide/1.1/en/basics.convention#code

Il model per convenzione dovrebbe errere con la prima lettera maiuscola, e il tuo codice che devi cambiare da


$model = new address();

in


$model = new Address();

Ma il mio codice è già così. Tutte le mie classi iniziano per lettera maiuscola e anche i file che le contengono.

Quando ricevi l’errore il primo bloco di codice e di Yii… il seguente bloco e il tuo codice che e la causa dell erorre… prova a vedere dov’e e stato chiamatto/usato “address”

allora, ho cambiato di nuovo il nome del file da "address.php" a "Address.php".

La prima volta che viene chiamato "address" è qui:

/home/onlqoots/public_html/yii-1.1.10.r3566/framework/db/ar/CActiveRecord.php(1539): CActiveFinder->__construct(Request, "address")





1534 

1535         if(empty($criteria->with))

1536             return $builder->createCountCommand($this->getTableSchema(),$criteria)->queryScalar();

1537         else

1538         {

1539             $finder=new CActiveFinder($this,$criteria->with);   <== EVIDENZIATO

1540             return $finder->count($criteria);

1541         }

1542     }

1543 

1544     /**




Questo e di nuovo codice di Yii… devi trovare dove si trova la chiamata "address" nel tuo codice…

scusa, non riesco a capire. provo ad allegare uno screen dell’errore

Nel post precedente hai messo questa righa

/home/onlqoots/public_html/yii-1.1.10.r3566/framework/db/ar/CActiveRecord.php(1539): CActiveFinder->__construct(Request, "address")

li si trova "address"… vuol dire che da qualche parte nel tuo codice hai usato "address" invece che "Address",

devi guardare piu in giu nel call stack per vedere dove

Allora, all’interno di RequestController ho questa chiamata:




$criteria=new CDbCriteria;


		$criteria->select = '*'; 

		$criteria->with = 'address';

		$criteria->condition = 't.requestingUserID = '.Yii::app()->user->id.' AND ( (t.requestStatus = 2) OR (t.requestStatus = 1  AND t.startingTime >'.$timeNow." ) ) ";

		

		$dataProvider = new CActiveDataProvider('Request', array(

                        'criteria'=>$criteria,

                        'pagination' => array(

                                'pageSize' => 10,

                        	),

               			 ));

		

		

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

			'dataProvider'=>$dataProvider,



la chiamata ad “address” è qui dentro ed è questa che provoca problemi. Però è corretta, perchè “address” in minuscolo è il nome di una delle relations che sono all’interno del model Request.

e la definizione della relazione "address" e ?

queste sono le relazioni all’interno del model Request




public function relations()

	{

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

		return array(

			'offers' => array(self::HAS_MANY, 'Offer', 'requestId', 

							'condition'=>'offers.offerStatus = 1 OR offers.offerStatus = 2',

							),

			'requestingUser' => array(self::BELONGS_TO, 'User', 'requestingUserID'),

			'address' => array(self::MANY_MANY, 'address', 'requestAddress(requestId, addressId)'),

			'requestAddressess'=> array(self::HAS_MANY, 'requestAddress', 'requestId')

		);

	}






Non lo vedi li il "address" tutto in minuscolo ?

‘address’ => array(self::MANY_MANY, ‘address’, ‘requestAddress(requestId, addressId)’)

Hai ragione! Ho modificato in "Address" e ora funziona perfettamente!

Invece "requestAddress", essendo una tabella di una relazione MANY_MANY, deve essere scritta così (sul database è requestAddress)

Ma quindi anche la relazione successiva, "requestAddress" è errata, perchè il nome della classe è "RequestAddress".

Grazie mille mdomba, sei stato di grandissimo aiuto! :)