Table Of Contents

Previous topic

EXTJS

Next topic

Implementazione Popup di conferma in EXT

This Page

Implementazione ricerca in EXT

Prerequisiti

Per effettuare la ricerca con Ext, la lista che visualizza i dati dovrà essere un oggetto Grid di Ext.

Implementazione Lato Jumbo

Nel metodo layout del template_list.mako sostituire il submit button con un button generico:

<%def name="layout()">
    user..=                     job..=
    D=from.date.gte   D=to.date.lte
    --
    s=Search    <------ DA COSI
</%def>
<%def name="layout()">
    user..=                     job..=
    D=from.date.gte   D=to.date.lte
    --
    b=Search    <------ A COSI
</%def>

Il nome che si da al button diventerà anche l’id dello stesso (tutto in minuscolo, però). in questo caso il button avrà come id “search”

Implementazione Lato Javascript

Importare nel template il file “ext_search.js” (questo file verrà importato automaticament attraverso il comando “jsetup.sh -s”) :

<script type="text/javascript" src="/static/js/ext_search.js"></script>

Aggiungere al file javascript che gestisce la griglia di ext le seguenti righe. ATTENZIONE : Le righe dovranno essere aggiunte dopo la creazione della griglia.:

// Aggiungo la ricerca via Ext
ext_search = new ExtSearch({'url':'/prodotto/ajax/prodotto/',
                            'grid':grid_prodotti,
                            'button_id':'cerca'});

I possibili parametri da passare alla classe ExtSearch sono:

Nome Obbligatorio Descrizione Default
url SI indica l’url che verrà chiamato al click del bottone “Search”  
grid SI istanza della grid che visualizzerà i dati della ricerca  
button_id SI id del bottone “Search”  
waitMsg NO messaggio che appararira’ durante la ricerca. ‘Attendere, ricerca in corso...’
succes NO istanza della funzione che verra’ chiamata se la ricerca nn ha dato errori search_reload_grid (ext_search.js)
failure NO istanza della funzione che verra’ chiamata se la ricerca ha dato errori search_failure_grid (ext_search.js)

Implementazione Lato Django

  • Nel file urls.py associare l’url scelto sul lato javascript ad una vista

    (r'^ajax/model/?$', 'model.views.metodo_della_ricerca')
    
  • Modifica del metodo che torna i dati in json alla griglia di Ext in views.py. Le parti da aggiungere sono quelle tra “INIZIO CODICE DA AGGIUNGERE” e “FINE CODICE DA AGGIUNGERE”

    def metodo_della_ricerca(request, model):
        user = request.user
        get =  request.GET.copy()
    
        queryset = Model.objects.all()
    
        # importo il modulo di Jungle per la ricerca
        #
        from jungle.views.fast_search import search2
    
        ########################################################
        #
        # INIZIO CODICE DA AGGIUNGERE
        #
        #########################################################
    
        # Il modulo mi ritorna un dizionario con pronti i filtri
        # da dare in pasto al filter di django in base alle scelte
        # fatte dall'utente nel form di ricerca.
        # L'unico parametro che a noi interessa sara' "filter_cnd"
        filter_cnd, oldorder_by, form = search2(request, model)
        if filter_cnd:
            queryset = queryset.filter(**filter_cnd)
    
        ########################################################
        #
        # FINE CODICE DA AGGIUNGERE
        #
        #########################################################
    
        # Total serve per dire a Ext quanti sono i risultati trovati
        #
        total = queryset.count()
    
        # Parametri per la paginazione (start, limit) e per
        # l'ordinamento (dir e sort). Vengono passati da Ext ad ogni richiesta
        #
        start = get.get('start', 0)
        limit = get.get('limit', 25)
        dir = get.get('dir', 'ASC')
        sort = get.get('sort', 'nome')
    
        if dir == 'DESC':
            sort = "-%s" % sort
    
        # ordinamento e limit dei dati in base ai parametri ricevuti da Ext
        #
        queryset = queryset.order_by(sort)[int(start):int(start)+int(limit)]
    
        dati = []
        for x in queryset:
            d = {}
            d['id'] = x.id
            d['campo1'] = x.campo1
            d['campo2'] = x.campo2
            d['campo_data'] = x.campo_data.strftime("%m/%d/%Y")
            dati.append(d)
    
        # Creazione del dizionario json nel formato richiesto dalla griglia Ext
        #
        data = '{"success": true, "total": %s, "data": %s}' % (total, simplejson.dumps(dati, ensure_ascii=False))
        return HttpResponse(data, mimetype='text/javascript;')