Gestore di widgets

Ciao a tutti e soprattutto a Gianni, volevo chiedere qualche parere riguardo ad una mia idea per la creazione di un sistema di widgets basato sullo zend framework.

Essenzialmente questo gestore deve consentire la creazione di widgets (tralasciando la parte dedicata alla registrazione nel database, al caricamento e rendering) come se fossero dei controller.

I widgets funzioneranno approssimativamente in questo modo:

<?php abstract class Gulp_Widget_Abstract {}
<?php class Gulp_Widget_Normal extends Gulp_Widget_Abstract {}
<?php class Gulp_Widget_Tabbed extends Gulp_Widget_Abstract {}

Praticamente la questione è questa: per la creazione di un widget con tabs è necessario estendere la classe Gulp_Widget_Tabbed e definire alcuni metodi che rappresentano le varie "pagine" del widget, proprio come con gli Action Controllers:

<?php
    class Gulp_Widget_UserProfile extends Gulp_Widget_Tabbed 
    {
        public function mainPane() {
            //do something
            $this->view->render('main');
        }
        // ...     
        public function messagesPane() {
            //do something
            $this->view->render('message');
        }
        
        pulic function infoPane() {
            //do something
            $this->view->render('info');
        }
    }

Il meccanismo che rende interessante il gioco dovrebbe essere questo:

Nella classe Gulp_Widget_Abstract viene definito come tutti i widget si presenteranno (utilizzando un parziale con placeholder per il caricamento del contenuto) e i metodi per popolarli.

La classe Gulp_Widget_Normal è la mera realizzazione del widget astratto, non cambia nulla, è possibile creare un widget che ha solo una "pagina".

La classe Gulp_Widget_Tabbed permette la creazione di un particolare tipo di widget. I widget creati con questa classe contengono tanti tab quanti pannelli sono stati definiti (pannello = <nome pannello>Pane() ).

I tab vengono creati automaticamente durante il rendering, viene creato automaticamente anche il link che punta ad una route del genere:

widget-manager/:widget/:pane/*

questa route dovrebbe essere "gestita" da un dispatcher di widget.

Una volta che la richiesta (asincrona, che ha avuto origine dal tab premuto) viene dispatchata a tale route e si ritorna la risposta (utilizzando il metodo render del componente Zend_View).

Successivamente la risposta sarà gestita dal codice javascript chiamante in modo tale da sostituire il contenuto del pane con quello ottenuto dalla richiesta effettuata in background.

Ad esempio, ho caricato il widget UserProfile, l'utente visualizza i seguenti tab:

  • Main -> /widgets-manages/userProfile/main/
  • Profile -> /widgets-manages/userProfile/profile/
  • Messages -> /widgets-manages/userProfile/messages/
  • Info -> /widgets-manages/userProfile/info/

Di default il tab Main è caricato all'atto del primo rendering del widget (quindi potremmo dire in modo "statico"), se l'utente preme sul tab Messages viene avviata una richiesta asincrona verso l'indirizzo del (controller) Widget /widgets-manages/userProfile/messages/.

Supponiamo che il codice all'interno del metodo messagesPane sia questo:

<?php
    //...
    public function messagesPane()
    {
        $messages = $this->_model->getPersonalMessages(5);
        $this->view->assign('messages', $messages);
        $this->view->render('messages'); 
    }

verrebbero estratti gli ultimi 5 messaggi personali dell'utente e renderizzati in questo modo:

    <p>Hai 3 messaggi:</p>
    <ul>
        <li>Prova - administrator</li>
        <li>Test - administrator</li>
        <li>Benvenuto - administrator</li>
    </ul>

una volta ottenuta la risposta lo script che ha effettuato la chiamata provvederà a sostituire il contenuto del widget che ha dato origine alla richiesta con il contenuto del tab selezionato.

struttura del parziale "widgetBorder"

nota: non sono sicuro sia corretto, devo ancora fare qualche prova con il nuovo componente Zend_View e la two-steps view.

    <div class="widget" id="widget[<?php echo $this->widgetName ?>]">
        <div class="content">
            <?php echo $this->placeholder('content') ?>
        </div>
    </div>

in questo modo il widget che sarà gestito in quel momento avrà rimpiazzato il place holder con il contenuto caricato di default.

Continuando l'esempio del widget UserPanel, così è come si presenterebbe appena renderizzato

<div class="widget" id="widget[UserPanel]">
    <div class="content">
        <div class="tabs">
            <ul>
                <li><a href="http://.../widgets-manages/userProfile/main/">Main</a></li>
                <li><a href="http://.../widgets-manages/userProfile/messags/">Messages</a></li>
                <li><a href="http://.../widgets-manages/userProfile/profile">Profile</a></li> 
                <li><a href="http://.../widgets-manages/userProfile/info">Info</a></li>
            </ul>
        </div>
        <div class="pane">
            <!-- main pane -->
            <p>Benvenuto <b>Trashofmasters</b>.</p>
            <p>La tua ultima visita risale a: bla</p>
        </div>
    </div>
</div>

poi ci sarebbe uno strato di codice JavaScript che per ogni tab assegna un evento click che invia una richiesta asincrona al target (definito nell'attributo href del tag anchor), attende la risposta, e sostituisce il contenuto del div pane del widget che ha richiesto l'aggiornamento.

Il mio pensiero a riguardo è: per l'implementazione di un sistema del genere è necessario estendere la classe Zend_Controller_Dispatcher perché essa compie già un lavoro simile a quello richiesto dal gestore di widgets, basterebbe configurarlo in modo tale da sistemare un attimino le classi che vanno chiamate e la nomenclatura dei metodi. Giusto?

Dopo tante parole, vorrei sapere il vostro parere a riguardo, cosa ve ne pare?

Sono necessarie altre informazioni?

:bye:

inviato 8 anni fa
Andrea Turso
Andrea Turso
86
modificato 8 anni fa
X 0 X

Ciao, il meccanismo mi sembra fattibile però richiede una serie di customizzazioni (es.: dispatcher) e quindi è un lavoro che va testato per bene e che richiede anche un po' di tempo per lo sviluppo.

Comunque ci sono già delle funzionalità dello ZF che potrebbero agevolare la creazione di widgets. Infatti se usi Zend_Layout puoi inserire nello script di layout diversi contenuti provenienti da diverse Action di uno o più Controller, senza usare i placeholder.

Per quanto riguarda poi AJAX lo ZF è già in grado di gestire le richieste asincrone ma se aspetti la prossima release ti troverai DOJO perfettamente integrato nel framework ed il lavoro sarà molto più semplice. Ad esepio DOJO supporta i tab.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda