2009-06-09 11 views
11

Folks,Generico Generatore di espressioni dichiarativa in PHP

sto cercando di costruire un pezzo di PHP5 interfaccia utente che sono abbastanza sicuro che è comune a un gruppo di applicazioni. In sostanza, si tratta di un generatore di espressioni che permette agli utenti di specificare espressioni combinate con operatori logici (E/O), in questo modo:

  • FieldX> 3 e Fieldy = 5
  • Fieldy = "bob" e FieldZ non è nullo
  • FieldX> '2007/05/23' OR (Fieldy = 5 e Fieldy non è nullo)

Idealmente, un sistema del genere sarebbe permettetemi come programmatore per specificare l'elenco di parametri che i l'utente può scegliere (colonne) e il tipo di dati per ciascuno. Fornirebbe anche un'interfaccia piacevole e user-friendly per definire espressioni del genere: immagino qualcosa di simile a un tavolo, dove ogni riga ha diversi raccoglitori:

[Colonna] [Condizione] [Valore] [AND/OR ] [Colonna] [Condizione] [Valore] [AND/OR] ...

Conoscete un componente open source che fa qualcosa del genere? O forse una parte di questo tipo di funzionalità?

risposta

12

Una parola di cautela.Questi tipi di generatori di espressioni generiche sono comunemente pensati come soluzioni eccellenti per una varietà di problemi degli utenti. Il pensiero tende ad andare in questa direzione:

  • L'utente vuole che tutti questi diversi rapporti
  • Non c'è modo stiamo dando loro l'accesso SQL (anche se potessero capirlo)
  • Noi non avere il tempo di scrivere tutti questi rapporti personalizzati
  • Pertanto, farò un modo semplice per loro di scrivere query senza dover conoscere sintassi, tabelle e campi specifici.

Questo non è necessariamente una cattiva idea, ma quello che abbiamo trovato alla mia azienda è che gli utenti non-techie hanno sorprendenti difficoltà a comprendere e la costruzione di espressioni più complesse di un gruppo di ANDS o un gruppo di ORS. Questo è difficile da comprendere per noi programmatori, poiché molti di noi probabilmente avevano una comprensione intuitiva della logica booleana ancor prima che imparassimo a programmare.

Si consiglia di non provare a dare loro la massima flessibilità per creare l'espressione desiderata, e invece si crea un'interfaccia utente che consente al programmatore di definire qualcosa di più complicato sul back-end ma offre all'utente scelte semplici sul front-end. Questo è più facile a dirsi che a farsi, ovviamente.

Ricorda - a volte la difficoltà per gli utenti finali non è il fatto che non conoscono la sintassi giusta per esprimere la loro idea. Più spesso è perché non sanno nemmeno come formulare i loro pensieri in modo univoco modo, anche se sono stati forniti un modo semplice per farlo.

NOTA: Non sto dicendo che gli utenti finali siano sempre idioti - solo che le loro menti potrebbero funzionare diversamente da noi pazzi sviluppatori.

+0

Questo è un grande, ottimo punto. La maggior parte delle persone non pensa in termini di alberi decisionali. –

-5

perché non provare a utilizzare smarty che è un motore di template. hai solo bisogno di ottenere e analizzare l'input dell'utente.

Ora che sto pensando, fare questo in qualsiasi modo avrà bisogno di controllare l'input dell'utente per evitare iniezioni.

0

Penso che questo sia più relativo all'interfaccia utente di PHP in generale. Faresti meglio a ripetere la tua domanda. Forse vuoi solo analizzare queste definizioni in PHP, in questo caso suggerirei di usare preg_replace_callback.

0

Vorrei iniziare creando un modello di query orientato agli oggetti. Per esempio. Criteria-objects. Il passo successivo è quindi scrivere un'interfaccia utente che consenta la manipolazione di questa struttura del modello.

0

Recentemente ho eseguito tale funzionalità da solo e, IMHO, è più facile scrivere la propria implementazione.

+0

Era in PHP? Cura di pubblicare parte del tuo codice? Grazie – alex

+0

Sì, PHP. In realtà era zoppo e diretto. Ecco la struttura regola: $ regola = array ( 'campo' => 'nome', 'azione' => 'eq', // test per l'uguaglianza 'valore' = 'John *', 'bit_operation '=>' AND '// join tra questa condizione e successiva } Le regole sono state salvate su array in sessione e utilizzate dalla funzione di creazione query SQL Nessuna classe, nessun OOP - solo questo :) –

+0

Arrgh, nessuna struttura di codice per me. –

1

Penso che questa sia un'idea molto interessante. Stai pensando di lavorare su questo progetto per uso personale o attraverso il lavoro?

Se stai pianificando di lavorare su questo progetto personalmente, forse dovresti scrivere tu stesso e trasformarlo in un progetto open source. Sembra che ci sia già un certo interesse in questo settore e sarebbe una buona esperienza di apprendimento.

Altrimenti, posso vedere come un'azienda potrebbe trovare un valore in qualcosa di simile. Darebbe ai programmatori un'altra utilità che potrebbe aiutarli a svolgere il loro lavoro un po 'più facilmente ea pagare dividendi nel lungo periodo.

In entrambi i casi, questo progetto è vincente. Imparerai molto e creerai qualcosa che gli altri trovano utile.

1

Questo non è esattamente un componente, ma è possibile dare un'occhiata alla scheda Condizioni di Shopping Cart rule builder in Magento per un'implementazione solida di questo tipo di funzionalità PHP. È personalizzato per l'e-commerce, quindi non è un overlay di database generico, ma ha un'interfaccia builder di ottime condizioni.

+0

Che versione è questa in Steve? Penso che sto usando 1.1.3 e non ha questo ... – alex

+0

Dovrebbe - nel menu principale orizzontale, andare a Promozioni> Regole del prezzo del carrello. Quindi aggiungi una nuova regola. Nel nuovo modulo regola, fai clic sulla scheda a sinistra "Condizioni". Sto eseguendo 1.0.19+ –

Problemi correlati