[Yii 1] Come caricare un .js di un widget che viene caricato dinamicamente

Cerco di spiegarmi.

In una specie di carrello per e-commerce, c’è un tasto ‘acquista’.

Questo, tramite ajax, esegue una action la quale dà una modal in risposta. Il problema non è visualizzare la modal, quanto il fatto che dentro alla modal c’è una dropdown che deve scatenare un evento ‘change’ javascript.

Il problema è che, anche pubblicando il js come assets e quindi registrando il file, il tutto dentro al metodo init(), il file javascript ovviamente non viene caricato dal browser, questo accade perchè la modal è creata da un renderPartial e non da un render, perchè, ovviamente, non devo dare fuori una pagina ma solo un frammento html.

Dato che questa modal verrà reciclata in parecchie pagine, in moduli diversi, vorrei che vosse un widget.

Mi è venuta in mente come unica possibilità di mettere il javascript in un widget a parte e farlo caricare dalla pagina madre, quella che esegue la chiamata ajax. In questo modo il js del widget è precaricato, mentre la modal può essere generata e caricata dinamicamente.

Esiste altra soluzione secondo voi?

questo è facilmente risolvibile e largamente discusso post processando l’output in renderPartial così :


$this->renderPartial('vista', ['param'=>$param], true)]);


Dato che questa modal verrà reciclata in parecchie pagine, in moduli diversi, vorrei che vosse un widget. 

niente di più semplice l’ossatura base di un widget stesso:




<?php


class MioWidget extends CWidget

{

	 /**

	  * Initializes the widget.

	  */

	 public function init()

	 {

		parent::init();


         }


	/**

	 * Runs the widget.

	 */

	public function run()

	{

           // o registri un js esistente

	   Yii::app()->clientScript->registerScriptFile('percorso/al/file/js/'.$filename, $position);


           // o lo sputi nel codice direttamente

              $script = <<<script

      function miaFunzione() { }            

SCRIPT;

        // e poi output js

        $cs->registerScript(....);


	}

}



e poi lo richiami come sai:




$this->widget('MioWidget', [

                    'proprieta1' => 'prop',

                    'proprieta2' => 'prop',

                    'event' => 'onclick',

                    'url' => $this->createUrl();



Grazie, con i widget è da anni che lavoro, mi era sfuggita questa cosa del post processing, mi sfugge tutte le volte, ora provo