dipendenza webapp

Salve a tutti, avrei una domanda da porvi. Ho creato la mia webapp e ho già iniziato a modificarla in base alle mie esigenze ma mi sono trovato davanti ad un dubbio. La cartella che yii crea per l’applicazione rimane dipendente dalla cartella base di yii (quella originale del framework per intenderci)? Ho visto che carica dinamicamente degli script .js quando ad esempio si richiama la pagina dei contatti e questo mi crea dei problemi con uno slider avendo già incluso la lib jquery in precedenza, però dentro la cartella della mia applicazione non trovo niente nei controller o nelle viste che si presti a questi richiami, quindi avrei bisogno di capire se le configurazioni che richiamano le librerie sono dentro la cartella del framework originale.

Grazie in anticipo :)

Non ho capito niente di quello che hai detto ma ho capito che hai caricato jquery "a mano".

Se vuoi caricare del codice javsascript, devi passare per:




Yii::app()->getClientScript()->registerScript('nome', '


alert("!!!!");


');



Grazie per la risposta ;D .

Allora…vediamo se riesco a spiegarmi meglio.

Questo è il codice con il richiamo ai vari css/script in head di pagina:




<link rel="stylesheet" type="text/css" href="<?php echo Yii::app()->request->baseUrl; ?>/css/main.css" />

	<link rel="stylesheet" type="text/css" href="<?php echo Yii::app()->request->baseUrl; ?>/css/form.css" />

        <link rel="stylesheet" href="<?php echo Yii::app()->request->baseUrl; ?>/assets/7d6b018b/nivo-slider/nivo-slider.css" type="text/css" media="screen" />

        <script type="text/javascript" src="<?php echo Yii::app()->request->baseUrl; ?>/assets/7d6b018b/jquery.js"></script>

        <script src="<?php echo Yii::app()->request->baseUrl; ?>/assets/7d6b018b/nivo-slider/jquery.nivo.slider.pack.js" type="text/javascript"></script>

        <script>

            $(document).ready(function() {

                $('#slider').nivoSlider({

                effect:'fade',

                animSpeed: 500,

                pauseTime: 5000,

                directionNav: false, 

                directionNavHide: true,

                controlNav: false, 

                controlNavThumbs: false

            });

            $('.form').hide();           

            $('.contact').find('.toform').click(function () {

                var mail= $(this).val();

                $("#ContactForm_email").val(mail);

            $('.form').show(700);

            });

            });

        </script>



Tutto questo funziona bene, ma quando apro la pagina dei contatti, quindi quella del form standard che crea yii, nell’html generato mi ritrovo 2 chiamate che presumo vengano fatte automaticamente e la situazione è questa:




<link rel="stylesheet" type="text/css" href="/Nome_progetto/css/main.css" />

	<link rel="stylesheet" type="text/css" href="/Nome_progetto/css/form.css" />

        <link rel="stylesheet" href="/Nome_progetto/assets/7d6b018b/nivo-slider/nivo-slider.css" type="text/css" media="screen" />

        <script type="text/javascript" src="/Nome_progetto/assets/7d6b018b/jquery.js"></script>

        <script src="/Nome_progetto/assets/7d6b018b/nivo-slider/jquery.nivo.slider.pack.js" type="text/javascript"></script>

        <script>

            $(document).ready(function() {

                $('#slider').nivoSlider({

                effect:'fade',

                animSpeed: 500,

                pauseTime: 5000,

                directionNav: false, 

                directionNavHide: true,

                controlNav: false, 

                controlNavThumbs: false

            });

            $('.form').hide();           

            $('.contact').find('.toform').click(function () {

                var mail= $(this).val();

                $("#ContactForm_email").val(mail);

            $('.form').show(700);

            });

            });

        </script>

	<script type="text/javascript" src="/Nome_progetto/assets/7d6b018b/jquery.js"></script>

<script type="text/javascript" src="/Nome_progetto/assets/7d6b018b/jquery.yiiactiveform.js"></script>



Gli utlimi 2 richiami, da quel che ho capito mi bloccano il funzionamento di quel piccolo script per gestire lo slider lasciandomi in sostanza un div vuoto. Come puoi vedere mi ritrovo anche 2 richiami alla lib di jquery e siccome ho bisogno che sia sempre presente per far girare lo slider mi piacerebbe trovare il modo di bloccare il richiamo dinamico di quella libreria. Il problema è che non trovo il controller e la parte di codice in cui posso fermare questo richiamo. Spero di esser stato un po’ più chiaro a questo giro ;D .

Grazie in anticipo ;D

Ti ripeto: non devi usare il codice javascript schietto: devi passarlo ad yii che poi ci pensa lui a sistemarlo. Nel tuo caso specifico, prova con




Yii::app()->getClientScript()->registerScript('ciaomondo',"


            $('#slider').nivoSlider({

                effect:'fade',

                animSpeed: 500,

                pauseTime: 5000,

                directionNav: false, 

                directionNavHide: true,

                controlNav: false, 

                controlNavThumbs: false

            });

            $('.form').hide();           

            $('.contact').find('.toform').click(function () {

                var mail= $(this).val();

                $('#ContactForm_email').val(mail);

            $('.form').show(700);

            });


", CClientScript::POS_READY);



Ti faccio notare che non ho usato $(document).ready(); ma ho indicato che lo script che voglio registrare si deve trovare in ::POS:READY. E’ la stessa cosa. Ma nel caso che ti ho mostrato, è scritto in standard Yii.

Perfetto adesso provo anche così e domani ti faccio sapere, grazie mille ;D .

Nada niente da fare, non funziona come mi hai suggerito. Quello scriptino non funziona e non funzona più neanche lo slider. Continuo a fare qualche prova. Grazie comunque :) .

Edit: ho risolto aggiungendo lo slider al package base di yii e inserendo:




<?php 

         Yii::app()->clientScript->registerCoreScript('jquery');

         Yii::app()->clientScript->registerCoreScript('nivo');

         Yii::app()->getClientScript()->registerScript('cfg',"


            $('#slider').nivoSlider({

                effect:'fade',

                animSpeed: 500,

                pauseTime: 5000,

                directionNav: false, 

                directionNavHide: true,

                controlNav: false, 

                controlNavThumbs: false

            });

            $('.form').hide();           

            $('.contact').find('.toform').click(function () {

                var mail= $(this).val();

                $('#ContactForm_email').val(mail);

            $('.form').show(700);

            });


", CClientScript::POS_READY);

         ?>



Funziona tutto perfettamente e spero che sia in “standard yii” messa giù così ;D. Grazie ancora per l’aiuto e i suggerimenti ;D.

Deve essere yii a includere nell’header gli script che ti servono non devi metterli brutalmente tu perchè si accavallano ad esempio con jquery già usato da yii.io mi sono fatto una cartella packages nella webroot e là ho messo tutti gli script js/css, poi nel file di configurazione di yii (sezione components di main.php) devi dichiarare la posizione degli script (puoi anche sostituire jquery di yii con una versione più recente… ma prova se è compatibile con yii)

Nota che ad esempio jqueryui dipende da jquery e lo specifichi con il parametro ‘depends’




		'clientScript' => array(

			'packages' => array(

				'jquery' => array(

					'baseUrl' => '/packages/jquery-1.7.2.min',

					'js' => array(

						'jquery-1.7.2.min.js',

					),

				),

				'jquery-ui' => array(

					'baseUrl' => '/packages/jquery-ui-1.8.18.custom',

					'js' => array(

						'js/jquery-ui-1.8.18.custom.min.js',

						'development-bundle/ui/i18n/jquery-ui-i18n.js',

					),

					'css' => array(

						'css/ui-lightness/jquery-ui-1.8.18.custom.css'

					),

					'depends' => array(

						'jquery'

					),

				),

				'bootstrap' => array(

					'baseUrl' => '/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'

					),

				),

			),



Poi per inserirli nella view io personalmente ho ridefinito il controller aggiungendo un filtro comune a tutte le actions che include gli script che sicuramente mi servono


 	public function filters()	{		return array(			'initScriptComuni');	} 


	public function filterInitScriptComuni($filterChain)

	{

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

		Yii::app()->getClientScript()->registerCoreScript("jquery-ui");

		Yii::app()->getClientScript()->registerCoreScript("bootstrap");

		$filterChain->run();

	}



Infine se nella action specifica ti serve un css o uno script specifico lo aggiungi, ma ricordati che lo devi sempre dichiarare nel main.php




Yii::app()->getClientScript()->registerCoreScript("altroscript");



Si più o meno è quello che ho fatto, anche se non ho modificato il controller come hai fatto te. Ho semplicemente aggiunto




'nivo'=>array(

                'js'=>array('nivo-slider/jquery.nivo.slider.pack.js'),

                'depends'=>array('jquery'),

        ),



a package.php, Per poi richiamare gli script con registerCoreScript.Comunque come ho detto sopra adesso funziona tutto, piano piano imparerò anche io si spera ;D.

Grazie ancora a tutti ;D.

P.s: che voi sappiate c’è un extension o un plugin per creare un menu ad albero che non si appoggi al db ma come struttura prenda quella di una cartella?

Scusa non ho ben capito cosa intendi per prendere da una cartella.

Prova a guardare bootstrap, ha tutto una serie completa di componenti omogenei che insieme a jquery e jqueryui dovrebbe essere sufficiente per tutte le esigenze principali (tra cui i menu).

ciao

In pratica i nodi dell’albero devono corrispondere alle sottocartelle di una determinata directory. Bootstrap lo stavo guardando sembra molto carino ;D.

Per risalire alla struttura di una cartella ti servono solo un paio di funzioni: opendir e readdir. Non credo sia necessaria un’estensione.

Per ora ho fatto una semplice classe di prova usando scandir, i risultati non sembrano male. Se funziona poi provo ad estendere un widget, almeno imparo anche a creare estensioni o altro per yii ;D.