Posizione script nei temi

Ciao sto provando i temi.

Ho fatto le sottocartelle dentro la cartella themes e dentro ci ho messo la cartella views e queste funzionano correttamente passando da un tema all’altro.

Nel config ho anche degli script inseriti nella sezione clientScript che vorrei variare a seconda del tema selezionato ma non capisco come fare.

Ho provato a copiarli nella sottocartella del tema e cambiare i css per notale le differenze ma non succede niente.

Sapete come devo fare?

ciao

Visto che hai differenti scripts per differenti temi, mi viene da pensare che la responsabilità di questi scripts è del tema stesso. Dunque sposterei nel tema la logica che cambia il percorso del tema. Oppure, potresti crearti un componente che, dato un tema, restituisce tutti gli elementi javascript e css che devono essere caricati. Ma mi sembrano entrambe soluzioni macchinose.

Grazie della risposta Sensorario. Speravo che il framework gestisse facilmente la cosa e che ero solo io a non trovare l’informazione.

Ma che senso ha un layout differente se non posso neanche personalizzare i css ad esempio di jqueryui in funzione del tema o variare le librerie degli script associati al tema in genere?

Mi sembra strano che un framework che finora si è dimostrato risolvere elegantemente tutte le situazioni si impantani in una banalità del genere.

Ora provo a postare il topic in inglese pessimo e vediamo se magari si desta Quiang :)

Ma, … hai provato a caricare css e js solo nel tema?

In che senso? Fare include nell’header del layout principale? Così creo conflitti con gli include degli script dell’asset manager o non rispetto l’ordine degli include (es. prima jquery e poi tutti gli script che lo usano).

Nel frattempo ho pensato ad una soluzione che funzionerebbe.

Tutte le action derivano da un mio controller che ho esteso dalla classe Controller.

In questo controller includo gli script comuni a tutte le action… quindi jquery, jquery-ui, bootstrap ecc.

Sempre nel controller faccio lo switch al tema associato alle preferenze dell’utente.

Nel config esplodo la sezione clientScript dichiarando invece in un’unica istanza di es. jquery-ui in tante istanze quanti sono i layout (jquery-ui-tema01, jquery-ui-tema02).

Nel controller farò quindi prima lo switch di tema e poi includerò gli script di competenza del tema (Yii::app()->getClientScript()->registerCoreScript("jquery-ui-tema01");

Dovrebbe funzionare anche se non mi sembra elegante.

Ho il sospetto che ci sia una soluzione ad hoc su Yii e che a breve dovrò buttare a terra quest’idea e rifare tutto :)

Non so se c’è una soluzione ad hoc per yii, ma tu stai spostando nel controller una questione che riguarda il tema. Se registri gli script dentro al tema risolvi tutto. Non devi includerli, devi proprio registrarli come fai nel controller.

E ti ripeto: sono di responsabilità del tema, non di Yii. Quindi è giusto metterli dentro al tema.

Hai ragione sarebbero una cosa prettamente di view quindi da mettere nei file delle view ma siccome li ho correlati a informazioni back-end (preferenze utente) e sopratutto perchè "sono anomalo" li ho messi nel controller base dal quale derivano tutti i controller.

Comunque ho appena fatto le modifiche e praticamente lato controller prima verifico se l’utente ha impostanto delle preferenze personali per il layout così:




		if(Yii::app()->session["themename"]){

			Yii::app()->theme = Yii::app()->session["themename"];

		}else{

			Yii::app()->theme = "classic";

		}



… poi nel config, sezione clientScript/packages ho splittato le dichiarazioni dei packages (ad eccezione di jquery che l’ho lasciato comune a tutti i temi) dividendo ad esempio l’include di bootstrap in un’include per ogni tema




				'bootstrap-classic' => array(

					'baseUrl' => '/themes/classic/packages/twitter-bootstrap-2.0.2',

					'js' => array(

						'js/bootstrap.min.js',

					),

					'css' => array(

						'css/bootstrap.min.css',

						'css/bootstrap-responsive.min.css',

					),

					'depends' => array(

						'jquery'

					),

				),





				'bootstrap-tema02' => array(

					'baseUrl' => '/themes/bootstrap-amelia/packages/twitter-bootstrap-2.0.2',

					'js' => array(

						'js/bootstrap.min.js',

					),

					'css' => array(

						'css/bootstrap.min.css',

						'css/bootstrap-responsive.min.css',

					),

					'depends' => array(

						'jquery'

					),

				),

Infine nel controller (dopo la selezione del tema) ho incluso gli script del tema specifico:




		Yii::app()->getClientScript()->registerPackage("jquery");

		Yii::app()->getClientScript()->registerPackage("jquery-ui-" . Yii::app()->theme->name);



… pare funzionare :) … pare