Implementare un filtro per la maschera di elenco dati

Questo esempio, si riporta il codice e i passi da eseguire, all’interno della propria applicazione AOBuilder, al fine di implementare, in maniera rapida e semplice, un filtro con menù a discesa, per filtrare i dati elencati in tabella o all’iterno di altre strutture grafiche.

Il risultato graficamente si presenta come nell’immagine di seguito riportata:

filtro seleziona struttura

In questo framemento di codice viene descritto come implementare un filtro select nella maschera di elenco che mostra in tabella i dati relativi ad una “Struttura” la cui chiave esterna è rappresentata dal campo “struttura_id”.

Per personalizzare l’esempio nel proprio caso specifico e necessario rinominare quindi in nome della Tabella da cui recuperare i dati, il campo chiave esterna “_id” ed il nome del campo nella form.

Viene di seguito riportato il codice da inserire nel file template con estensione .ctp:

<?php

use Cake\ORM\TableRegistry;

/**
 * $strutture_opt
 */
$this->Struttura = TableRegistry::get('App.Struttura');
$strutture_opt = $this->Struttura->find('list');

/**
 * Imposta il campo $struttura_id per i dati filtrati.
 */
$struttura_id = (isset($this->request->data['struttura_id'])) ? intval($this->request->data['struttura_id']) : 0;
?>

<div class="alert alert-info">
    <div class="row">
        <div class="col-md-1 text-center">
            <i class="fa fa-4x fa-filter"></i>
        </div>
        <div class="col-md-11">
            <?= $this->Form->create() ?>
            <?= $this->Form->input('struttura_id', ['label' => 'Filtra attività per Struttura', 'options' => $strutture_opt, 'empty' => 'Tutte le Strutture...', 'default' => $struttura_id]) ?>
            <?= $this->Form->end() ?>
        </div>
    </div>
</div>

<script>
    /**
     * On Change submit FORM
     */
    $('#struttura-id').change(
            function () {
                this.form.submit();
            });
</script>

Il codice per la gestione del filtro, modificando il metodo filteredWhereConditions() del controller in cui si vuole utilizzare il filtro:

    /**
     * This function is used to filter where conditions
     * 
     * @return type
     */
    public function filteredWhereConditions() {
        $filter = [];

        /**
         * Filtra i dati $this->request->data['struttura_id']
         */
        if (isset($this->request->data['struttura_id']))
            if (intval($this->request->data['struttura_id']) > 0)
                $filter = ['struttura_id' => intval($this->request->data['struttura_id'])];

        return $filter;
    }

Questi sono i passaggi da seguire per realizzare il filtro per come riportato nell’immagine sopra.