Back to top

Autore Topic: Validazione lato server in nuovo componente  (Letto 12506 volte)

Offline ricctram

  • Nuovo arrivato
  • *
  • Post: 30
  • Sesso: Maschio
    • Mostra profilo
Validazione lato server in nuovo componente
« il: 21 Gen 2014, 16:27:17 »
Salve ho un problema per quanto riguarda la validazione di alcuni campi in un nuovo componente.


Dunque l'amministratore del sito inserisce ragione sociale e partita iva, però nel momento in cui inserisce una partita iva già presente nel db vorrei che mi restituisse un messaggio di errore e che naturalmente non mi inserisse il record nel db.


Ho creato il file xml per la creazione del form e nel campo "partita iva" ho inserito l'attributo "validate=piva" poi ho creato la cartella "rules" dove all'interno ho inserito il file piva.php con la relativa espressione regolare. E fin qui tutto apposto, controlla correttamente se è una partita iva secondo l'espressione regolare.


Come faccio però ad effettuare un controllo sul db per vedere se esiste quella determinata partita iva e ritornare in caso eventuale errore ?


Grazie a tutti
--
Riccardo

Offline mmleoni

  • Global Moderator
  • Instancabile
  • *****
  • Post: 5547
  • Sesso: Maschio
  • Just another *nix coder/sysadmin...
    • Mostra profilo
Re:Validazione lato server in nuovo componente
« Risposta #1 il: 21 Gen 2014, 17:05:12 »
override del metodo check() della classe table.

ciao

mmleoni web consulting - creazione siti web aziendali ed e-commerce avanzati - sviluppo moduli e componenti Joomla

Offline simone83

  • Appassionato
  • ***
  • Post: 362
  • Sesso: Maschio
    • Mostra profilo
Re:Validazione lato server in nuovo componente
« Risposta #2 il: 21 Gen 2014, 17:38:10 »
in teoria lo puoi fare della rule che ti controlla la prtita iva, basta una semplice query facendo attenzione che la partita iva che stai controllando si stia riferendo ad un nuovo inserimento e non a una modifica.

Se guardi in libraries/joomla/form/rules è lo stesso principio della regola di validazione username
BRAINCODE
Da Psd a Joomla - Sviluppo componenti joomla - SEO con Joomla
x-brain

Offline mmleoni

  • Global Moderator
  • Instancabile
  • *****
  • Post: 5547
  • Sesso: Maschio
  • Just another *nix coder/sysadmin...
    • Mostra profilo
Re:Validazione lato server in nuovo componente
« Risposta #3 il: 21 Gen 2014, 17:54:56 »
quoto simone83  :)

mi piace di più la sua soluzione: segui il suo consiglio.

ciao

mmleoni web consulting - creazione siti web aziendali ed e-commerce avanzati - sviluppo moduli e componenti Joomla

Offline ricctram

  • Nuovo arrivato
  • *
  • Post: 30
  • Sesso: Maschio
    • Mostra profilo
Re:Validazione lato server in nuovo componente
« Risposta #4 il: 21 Gen 2014, 20:03:52 »
Grazie ragazzi ci provo, spero di riuscirci..  :)
--
Riccardo

mau_develop

  • Visitatore
Re:Validazione lato server in nuovo componente
« Risposta #5 il: 21 Gen 2014, 21:42:42 »
io le farei (le faccio) entrambe :) ... solitamente tutte le volte che uso o tratto il dato/var, sono sempre in paranoia che non nascendo e morendo all'interno di una classe sia facile la distrazione di lasciarla "libera" da qualche parte.
Mi sembrava che anche Dexter la pensasse + o meno così tralasciando che lui ha qualche argomentazione tecnica migliore delle mie :):)

ueellaaa! ciao Simone benritrovato
« Ultima modifica: 21 Gen 2014, 21:44:17 da M_W_C »

Offline simone83

  • Appassionato
  • ***
  • Post: 362
  • Sesso: Maschio
    • Mostra profilo
Re:Validazione lato server in nuovo componente
« Risposta #6 il: 22 Gen 2014, 09:17:14 »
son tornato, non so per quanto  :P

Fai bene ad essere paranoico, lo sono anche io. comunque se crei un rule alla check non ci arrivi ti blocchi nel controller, poi sta al programmatore fare le cosine x bene xche puoi non validare la form, ma puoi anche non fare il check
BRAINCODE
Da Psd a Joomla - Sviluppo componenti joomla - SEO con Joomla
x-brain

Offline mmleoni

  • Global Moderator
  • Instancabile
  • *****
  • Post: 5547
  • Sesso: Maschio
  • Just another *nix coder/sysadmin...
    • Mostra profilo
Re:Validazione lato server in nuovo componente
« Risposta #7 il: 22 Gen 2014, 18:00:03 »
la cosa divertente è che il mio component builder scrive le rules per tutti i campi, ma me ne ero proprio dimenticato...

sarà mica la vecchiaia ?  ;D ;D
ciao
mmleoni web consulting - creazione siti web aziendali ed e-commerce avanzati - sviluppo moduli e componenti Joomla

Offline ricctram

  • Nuovo arrivato
  • *
  • Post: 30
  • Sesso: Maschio
    • Mostra profilo
Re:Validazione lato server in nuovo componente
« Risposta #8 il: 23 Gen 2014, 11:25:47 »
in teoria lo puoi fare della rule che ti controlla la prtita iva, basta una semplice query facendo attenzione che la partita iva che stai controllando si stia riferendo ad un nuovo inserimento e non a una modifica.

Se guardi in libraries/joomla/form/rules è lo stesso principio della regola di validazione username


Ma io posso controllare la partita iva secondo espressione regolare e anche se è già presente all'interno del db?


Scusate .. il mio primo componente joomla :)



--
Riccardo

Offline simone83

  • Appassionato
  • ***
  • Post: 362
  • Sesso: Maschio
    • Mostra profilo
Re:Validazione lato server in nuovo componente
« Risposta #9 il: 23 Gen 2014, 15:56:07 »
si!
nel testo che hai citato ti dicevo di guardare il file username.php che fa la stessa cosa, invece che la partita iva ti controlla il nome utente
BRAINCODE
Da Psd a Joomla - Sviluppo componenti joomla - SEO con Joomla
x-brain

Offline ricctram

  • Nuovo arrivato
  • *
  • Post: 30
  • Sesso: Maschio
    • Mostra profilo
Re:Validazione lato server in nuovo componente
« Risposta #10 il: 23 Gen 2014, 17:16:19 »
Simone ecco il codice che ho inserito. Funzionante!


Considera che il campo nel db si chiama "codice_fiscale" e all'interno è possibile inserire sia codice_fiscale che la partita iva.



Codice: [Seleziona]
class JFormRuleCodicefiscale extends JFormRule
{
protected $regex = '^([0-9]{11})$|^([a-zA-Z]{6}[0-9]{2}[a-zA-Z]{1}[0-9]{2}[a-zA-Z]{1}[0-9]{3}[a-zA-Z]{1})$|^([a-zA-Z]{2}[0-9]{11})$';


public function test(&$element, $value, $group = null, &$input = null, &$form = null)
{
// Test the value against the regular expression.
if (!parent::test($element, $value, $group, $input, $form))
{
return false;
}

// Get the database object and a new query object.
$db = JFactory::getDBO();
$query = $db->getQuery(true);


// Build the query.
$query->select('COUNT(*)');
$query->from('#__acc_partecipanti');
$query->where('codice_fiscale = ' . $db->quote($value));


// Set and query the database.
$db->setQuery($query);
$duplicate = (bool) $db->loadResult();


// Check for a database error.
if ($db->getErrorNum())
{
JError::raiseWarning(500, $db->getErrorMsg());
}


if ($duplicate)
{
return false;
}


return true;
}
}
Un'ultima cosa che vorrei chiedervi:
Quando da errore, sia per l'espressione regolare che non corrisponde, sia perchè già presente un codice fiscale o partita iva nel db, il messaggio è sempre lo stesso preso dall'attributo message="Messaggio di errore" nel file xml del form.


Posso restituire un messaggio di errore diverso in funzione dell'errore ?


Grazie
--
Riccardo

Offline simone83

  • Appassionato
  • ***
  • Post: 362
  • Sesso: Maschio
    • Mostra profilo
Re:Validazione lato server in nuovo componente
« Risposta #11 il: 23 Gen 2014, 17:47:32 »
Il codice va bene solo che se faccio una modifica la form mi dara sempre errore in quato il mio codice fiscale c'e quindi come vedi sempre dal file username devi prendere l'id e verificare che sia diverso.

per fare la cosa che dici tu di cambiare il messaggio prova a mettere nel tuo file rule questa riga


Codice: [Seleziona]
$form->setFieldAttribute((string)$element['name'], 'message', 'Messaggio alternativo');
Il messaggio alternativo lu puoi scrivere come ho fatto io oppure leggere un eventuale altro attributo del field tipo

Codice: [Seleziona]
$form->setFieldAttribute((string)$element['name'], 'message', (string)$element['message2']);



BRAINCODE
Da Psd a Joomla - Sviluppo componenti joomla - SEO con Joomla
x-brain

Offline ricctram

  • Nuovo arrivato
  • *
  • Post: 30
  • Sesso: Maschio
    • Mostra profilo
Re:Validazione lato server in nuovo componente
« Risposta #12 il: 23 Gen 2014, 19:06:00 »
Grazie ancora Simone,


Ho inserito la stringa che dici tu e il messaggio alternativo funziona alla grande:


Codice: [Seleziona]


class JFormRuleCodicefiscale extends JFormRule
{
/*Controlla se il codice fiscale o la partita iva sono stati inseriti nel formato corretto*/
protected $regex = '^([0-9]{11})$|^([a-zA-Z]{6}[0-9]{2}[a-zA-Z]{1}[0-9]{2}[a-zA-Z]{1}[0-9]{3}[a-zA-Z]{1})$|^([a-zA-Z]{2}[0-9]{11})$';


/*Controlla che già non esista un record con la stessa partita iva o codice fiscale*/
public function test(&$element, $value, $group = null, &$input = null, &$form = null)
{
// Test the value against the regular expression.
if (!parent::test($element, $value, $group, $input, $form))
{
return false;
}

// Get the database object and a new query object.
$db = JFactory::getDBO();
$query = $db->getQuery(true);


// Build the query.
$query->select('COUNT(*)');
$query->from('#__acc_partecipanti');
$query->where('codice_fiscale = ' . $db->quote($value));

// Get the extra field check attribute.
$userId = ($form instanceof JForm) ? $form->getValue('id') : '';
$query->where($db->quoteName('id') . ' <> ' . (int) $userId);


// Set and query the database.
$db->setQuery($query);
$duplicate = (bool) $db->loadResult();


// Check for a database error.
if ($db->getErrorNum())
{
JError::raiseWarning(500, $db->getErrorMsg());
}


if ($duplicate)
{
$form->setFieldAttribute((string)$element['name'], 'message', (string)$element['message2']);
return false;
}


return true;
}
}
come vedi ho anche inserito


Codice: [Seleziona]

// Get the extra field check attribute.
$userId = ($form instanceof JForm) ? $form->getValue('id') : '';
$query->where($db->quoteName('id') . ' <> ' . (int) $userId);


perchè in effetti non mi permette di fare nessuna modifica in quanto vede che esiste un'altra partita iva uguale nel db, però nonostante abbia inserito questo codice continua ancora a darmi errore in fase di modifica.


ti posto anche il file xml del form, anche se non so se può aiutare:


Codice: [Seleziona]

<?xml version="1.0" encoding="UTF-8"?>
<form addrulepath="/administrator/components/com_accontratti/models/rules">
<fieldset>
<field
name="id"
type="hidden" />
<field
name="ragione_sociale"
type="text"
label="COM_ACCONTRATTI_RAGIONE_SOCIALE"
class="inputbox"
required="true" />
<field
name="codice_fiscale"
size="16"
type="text"
label="COM_ACCONTRATTI_CODICE_FISCALE"
class="inputbox"
validate="codicefiscale"
message="COM_ACCONTRATTI_CODICE_FISCALE_ERRORE"
message2="COM_ACCONTRATTI_CODICE_FISCALE_ESISTE_ERRORE"
required="true" />
<field
name="azienda_madre"
type="aziendamadre"
label="COM_ACCONTRATTI_AZIENDA_MADRE"
class="inputbox" />
<field
name="id_fiscale_estero"
type="text"
label="COM_ACCONTRATTI_ID_FISCALE_ESTERO"
class="inputbox" />
<field
name="ruolo"
type="text"
label="COM_ACCONTRATTI_RUOLO"
class="inputbox" />
<field
                        name="id"
type="text"
default="0"
readonly="true"
class="readonly"
label="JGLOBAL_FIELD_ID_LABEL"
description ="JGLOBAL_FIELD_ID_DESC" />
</fieldset>
</form>


So che è presente due volte il campo id, ma provando a togliere il primo in alto "hidden" il risulatato è sempre lo stesso..




Grazie ancora
--
Riccardo

Offline ricctram

  • Nuovo arrivato
  • *
  • Post: 30
  • Sesso: Maschio
    • Mostra profilo
Re:Validazione lato server in nuovo componente
« Risposta #13 il: 23 Gen 2014, 20:10:40 »
Il problema è che non recupera il valore del campo 'id' attraverso $form->getValue('id'), ma non capisco perchè.


Grazie a tutti
--
Riccardo

Offline simone83

  • Appassionato
  • ***
  • Post: 362
  • Sesso: Maschio
    • Mostra profilo
Re:Validazione lato server in nuovo componente
« Risposta #14 il: 23 Gen 2014, 20:51:57 »
ti popola correttamente il campo id hidden nell momento che visualizzi la form?

controlla con firebug oppure guarda l'html.
BRAINCODE
Da Psd a Joomla - Sviluppo componenti joomla - SEO con Joomla
x-brain

Offline ricctram

  • Nuovo arrivato
  • *
  • Post: 30
  • Sesso: Maschio
    • Mostra profilo
Re:Validazione lato server in nuovo componente
« Risposta #15 il: 23 Gen 2014, 22:09:45 »
Ho eliminato il campo con nome "id" dal file xml


Codice: [Seleziona]

<field
name="id"
type="hidden" />


perchè come puoi vedere dal file xml l'ho inserito erroneamente due volte. Comunque di seguito puoi vedere l'html del campo id che mi riporta correttamente un valore "1" che corrisponde effettivamente all'id del record. Quindi la cosa si infittisce... non so dove andare a parare


E' possibile che ho dimenticato di importare qualche libreria o qualcosa e quindi non riesce a recuperare il valore? E' possibile che il metodo getValue() oltre al nome del campo abbia bisogno di qualche altro parametro obbligatorio?








Codice: [Seleziona]
<li>
    <label id="jform_id-lbl" for="jform_id" class="hasTip" title="" aria-invalid="false">ID</label>
    <input type="text" name="jform[id]" id="jform_id" value="1" class="readonly" readonly="readonly" aria-invalid="false">
</li>
--
Riccardo

Offline simone83

  • Appassionato
  • ***
  • Post: 362
  • Sesso: Maschio
    • Mostra profilo
Re:Validazione lato server in nuovo componente
« Risposta #16 il: 24 Gen 2014, 10:10:18 »
Probabilmente hai un problema nel bind della form al momento della validazione, ma per questo problema diventa come cercare un ago nel pagliaio. Utilizzi le funzioni ereditate dalle classi del controller e del model oppure le hai riscritte tu?
BRAINCODE
Da Psd a Joomla - Sviluppo componenti joomla - SEO con Joomla
x-brain

mau_develop

  • Visitatore
Re:Validazione lato server in nuovo componente
« Risposta #17 il: 24 Gen 2014, 11:59:36 »
 E' possibile che il metodo getValue() oltre al nome del campo abbia bisogno di qualche altro parametro obbligatorio?
---------------------------------

... è possibile che non si chiami id o che sia annidato in altro

Offline simone83

  • Appassionato
  • ***
  • Post: 362
  • Sesso: Maschio
    • Mostra profilo
Re:Validazione lato server in nuovo componente
« Risposta #18 il: 24 Gen 2014, 12:25:52 »
Attento che l'espressione regolare che hai inserito non funziona sempre. Giustappunto sto facendo una cosa simile in un progetto mastodontico è ho a disposizione oltre 10000 codici fiscali da analizzare per fare una sincronizzazione e per alcuni mi dice che sono sbagliati ma ho controllato sul sito dell'agenzia delle entrate e invece sono giusti.

BRAINCODE
Da Psd a Joomla - Sviluppo componenti joomla - SEO con Joomla
x-brain

Offline simone83

  • Appassionato
  • ***
  • Post: 362
  • Sesso: Maschio
    • Mostra profilo
Re:Validazione lato server in nuovo componente
« Risposta #19 il: 24 Gen 2014, 12:32:29 »
non sono un esperto di espressioni regolari, ma il problema lo hai qua

[0-9]{3}

cioe ci si aspetta che i caratteri dal 13 al 15 siano numeri ma invece il penultimo puo anche essere una lettera

non so se è il problema delle omocodie dei codici fiscali
BRAINCODE
Da Psd a Joomla - Sviluppo componenti joomla - SEO con Joomla
x-brain

 



Web Design Bolzano Kreatif