Modulo o widget?!

Ciao a tutti!

Ho un po’ di confusione relativamente alle differenze tra widget e module.

Ho creato un widget attorno a un flash che scatta foto con la webcam (il codice originale è http://code.google.com/p/jpegcam/ ; l’intenzione è impacchettare una extension e pubblicarla). Come potete immaginare il flash chiama un’url per salvare il jpg, una specie di ajax insomma, e attualmente c’è un controller+action che fa il lavoro, però il controller è quello relativo alla view che include il widget.

Volendo impacchettare il tutto come una extension, dovrei fare un module o un widget? A me sembra più sensato il module, perchè mi permetterebbe di includere anche il relativo controller e action per il salvataggio della foto, ma in tal caso come farei a renderizzare la webcam in una view esterna al modulo? Insomma la stessa funzionalità dovrebbe essere disponibile in qualsiasi controller (User, Profile, MySuperPhotoGallery…)

La soluzione e’ di fare una action apposta, che poi includerai nel controller.

Crea una classe che estende CAction, e implementa il metodo run.

Nel controller puoi includere l’action cosi’:




	public function actions() {

		return array(

			// главная

			'flashLoad' => array(

				'class' => 'application.extension.flaskLoader.loadAction',

			),

		);

	}



E’ lo stesso lavoro che puoi osservare nel siteController per CCacptchaAction.

Ok, grazie mille Zaccaria! ci sono quasi… ho seguito How to use a widget as an action provider e sono riuscito ad agganciare il controller del client code alla CAction del widget (in altre parole sono riuscito a riprodurre il risultato del tutorial)

Ora si tratta di passare un parametro alla CAction, nello specifico devo dirgli dove salvare la foto scattata.

Un primo esperimento semi-riuscito è chiamare la action così: //localhost/miosito/miocontroller/jpegcam.saveJpg?id=27

ed effettivamente nella CAction riesco a catturare l’id così:


class saveJpg extends CAction{    

    public function run($id=null){

        echo $id;

    }

}

Ma non è quello che mi serve: non posso passare il full_path dell’immagine da salvare nell’url… ve l’immaginate che belle url injections si potrebbero fare?

L’url deve rimanere come quella indicata sopra, nel controller Miocontroller devo poter decidere dove salvare e poi passare il nome del file alla CAction. (è anche da escludere che la costruzione del full_path si faccia nella CAction perchè è un widget che si deve poter riutilizzare in ogni applicazione)

Ho letto http://www.yiiframework.com/forum/index.php?/topic/19923-widget-action-provider-parameters/page__view__findpost__p__97673 , che sembra rifarsi a http://www.yiiframework.com/wiki/170/actions-code-reuse-with-caction/#hh4 ma non mi funziona :( .

Ma l’id che gli passi che cos’e’? Il model a cui e’ associata l’immagine?

Se e’ il model, allora e’ fatta: carica il model e crea un metodo nel model per generare il full_path a partire dall’id.

In sostanza, deve essere il model a sapere dove salvare le immagini, non l’action che le salva.

Ok, risolto il problema senza coinvolgere il modulo. Vedi il commento in "Code reuse with CAction"

Dal controller alla CAction i parametri si passano così:


    public function actions()

    {

        return array(

            'providerName.'=>array(

                'class'=>'path.to.ProviderClass',

                'action1'=>array(

                    'property1'=>'value1',

                ),

                'action2'=>array(

                    'property2'=>'value2',

                ),

            ),

        )

    }

dove ‘property1’ e ‘property2’ sono public properties della CAction.

Fatto! come promesso (qui) l’extension è pronta!

yii-jpegcam

Yii extension to embed a webcam and take photos