2012-03-07 5 views
9

Potrebbe essere possibile esporre le regole di convalida Symfony2 (per una determinata entità)? Non riesco a trovare nulla di simile. Sto cercando di eseguire la validazione lato client (utilizzando backbone.js) con un approccio DRY. Qualcosa come un fascio o qualsiasi suggerimento sarebbe d'aiuto.Condivisione delle regole di convalida Symfony2 con backbone.js o javascript in generale?

Here is il validatore di componenti. Una possibilità potrebbe essere:

Definire le regole di convalida lato server utilizzando il modo standard di Symfony2. Esempio (YAML, tratto dal loro sito web):

# src/Acme/BlogBundle/Resources/config/validation.yml 
Acme\BlogBundle\Entity\Author: 
    properties: 
     name: 
      - NotBlank: ~ 

Fare /author/rules restituisce un JSON oggetto che mappa i campi dall'entità ad una "compilato" espressione regolare. Non ne sono così sicuro, ma penso che internamente Symfony2 compili le regole validation.yml in espressioni regolari.

Ipotizzando un soggetto autore fatta di name campo con NotBlank (nota io non sono un master in regex, questa è una copia e incolla da un'altra domanda):

{ 'name' : '^\s*\S' } 

Infine recuperare l'oggetto JSON e fare convalida lato client con il sistema backbone.js. Possibilmente fare il caching. Per esempio (avviso di codice pseudo-codice simile all'interno di validate()!):

<script> 
    $(function() { 
     window.MyApp = window.MyApp || { Models : {}, Views : {}, Router : {} }; 

     window.MyApp.Models.Author = Backbone.Models.extend({ 
      initialize : function() { _.bindAll(this, 'validate') }, 
      validator : $.get('/author/rules'); 
      validate: function(attrs) { 

       // Loop each property of this model 
       _.each(attrs, function(field, value) { 

        // Get the regex from the validatior 
        var rule = this.validator[field]; 
        var regex = new RegExp(rule); 

        if(!regex.test(value)) return "Model not valid."; 

       } 
      } 
     }); 
    }); 
</script> 

sto chiedendo la luna?

+0

Forse sei a qualcosa! Immagino che non ci sia modo di farlo in questo momento, ma potrebbe esserci un modo per trasformarlo in un pacchetto! Suggerirei di non utilizzare ajax in questo caso, semplicemente perché caricare le regole di convalida ogni volta è un enorme sovraccarico. Ma che dire dell'esportazione delle regole da yml in un file javascript che definisce la regex differente in modo da poterle usare con backbone.js (o con qualsiasi codice javascript che vorresti)? – Sgoettschkes

+0

@Boo grazie per il tuo commento. Sfortunatamente non sono così bravo in Symfony2 a fare in modo che un bundle sappia.E penso che esportare le regole da yaml a javascript (e quindi scrivere di nuovo le regole javascript) è eccessivo - ci dovrebbe essere un modo per ottenere regole "compilate" direttamente da Symfony2. – gremo

+0

Bene, se hai intenzione di usare ajax, puoi anche solo validare l'oggetto all'interno di symfony e restituire il risultato della convalida tramite un messaggio di ritorno di ajax. Pertanto, se si desidera convalidare il nome dell'autore, si invia una richiesta a/author/validate contenente il nome utente, il controllore lo convalida mediante la convalida di symfony e restituisce se la convalida ha avuto esito positivo o meno. A seconda di questo si mostrano messaggi di errore. – Sgoettschkes

risposta

0

Questo pacchetto può soddisfare le vostre esigenze APYJsFormValidationBundle

Tuttavia è attualmente limitata a far valere vincoli definiti, applicati alle entità.

Il supporto per i vincoli definiti php, yml e xml si trova nell'elenco delle cose da fare.

0

Puoi provare questo pacchetto. L'ho usato con vari successi in passato.

https://github.com/formapro/JsFormValidatorBundle

Esporta tutte le regole di convalida Symfony e discariche poi a una struttura di dati JS. Poi ci sono vari aiutanti per permetterti di applicare queste convalide. Ricorda inoltre di disabilitare la convalida del modulo HTML5 con <form novalidate="novalidate"> ecc.

Penso che potrebbe essere limitato a Symfony < = 2.6 ma ho funzionato fino a Symfony 2.7.7. I manutentori stanno attualmente lavorando sul supporto di Symfony 3.0, credo.

Problemi correlati