Autore Topic: Inserimento automatico created_by e modified_by  (Letto 953 volte)

Offline saprile

  • Esploratore
  • **
  • Post: 74
    • Mostra profilo
Inserimento automatico created_by e modified_by
« il: 24 Gen 2018, 15:40:35 »

Ciao a tutti, ho un semplice componente che inserisce record in una tabella con i seguenti campi:


quesito (varchar)
id_categoria (int)
created (datatime)
modified (datatime)


Ovviamente i campi "created" e "modified" devono essere riempiti automaticamente, il primo in fase di inserimento e il secondo in fase di modifica.
Il campo "quesito" e il campo "id_categoria" vengono correttamente riempiti in quanto ho il form a disposizione, gli altri due campi vengono sempre ignorati. Ho provato in vari modi, ma niente.
I due metodi in questione sono allowAdd() e allowEdit() della classe estesa a" JControllerForm", nonostante aggiunga il valore all'array richiesto ($data['created'] o $data['modified']) i due campi non vengono riempiti.


P.S. Ho provato ad inserire nel file .xml i due campi di tipo "hidden", ma nulla.


Qualcuno potrebbe darmi qualche indicazione?

Offline Alex21

  • Appassionato
  • ***
  • Post: 644
    • Mostra profilo
    • servizi web
Re:Inserimento automatico created_by e modified_by
« Risposta #1 il: 24 Gen 2018, 18:04:05 »
Ciao,
credo dipenda dal modo in cui è dichiarata la tabella.
Prendi queste 2 tabelle create da Akeeba:
Codice: [Seleziona]
<!-- Create #__ak_storage if it's missing -->
 <action table="#__ak_storage" canfail="0">
     <condition type="missing" value="" />
     <query><![CDATA[
CREATE TABLE `#__ak_storage` (
   `tag` varchar(255) NOT NULL,
   `lastupdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   `data` longtext,
   PRIMARY KEY (`tag`)
) DEFAULT CHARACTER SET utf8;
            ]]></query>
</action>     


$schemata['#__ak_storage'] = <<<ENDSQL
CREATE TABLE IF NOT EXISTS `#__ak_storage` (
   `tag` VARCHAR(255) NOT NULL,
   `lastupdate` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   `data` LONGTEXT,
   PRIMARY KEY (`tag`)
) DEFAULT CHARACTER SET utf8;
ENDSQL;
Il campo interessato è `lastupdate` equivalente al tuo `modified`. Entrambi sono TIMESTAMP e dovrebbero  aggiornarsi da soli mettendo NULL al posto del valore nella INSERT INTO. Perlomeno il primo che è NOT NULL e se metti NULL forzi il valore di default dichiarato.
Per il campo `created` che hai, se lo dichiari TIMESTAMP dovrebbe pure aggiornarsi da solo, però cambierebbe valore ogni volta che il record viene aggiornato. Forse è meglio mettere un campo normale come hai messo.
Spero ti sia utile
Bye!
« Ultima modifica: 24 Gen 2018, 18:08:17 da Alex21 »

Offline saprile

  • Esploratore
  • **
  • Post: 74
    • Mostra profilo
Re:Inserimento automatico created_by e modified_by
« Risposta #2 il: 24 Gen 2018, 19:33:37 »

Ciao Alex21, grazie per la risposta, ma preferirei utilizzare un'altra maniera, possibilmente tramite codice PHP perchè, seguendo le tue valide indicazioni, il problema lo risolverei soltanto in merito ad un campo di tipo "datatime" e non anche su altri campi di tipi diversi, per esempio il "created_by" che deve contenere l'id dell'utente che ha inserito il record e che non può essere gestito da mysql.


Spero di essere stato chiaro.


Grazie

Offline Ahmed Salvini

  • Appassionato
  • ***
  • Post: 337
    • Mostra profilo
Re:Inserimento automatico created_by e modified_by
« Risposta #3 il: 24 Gen 2018, 20:27:14 »
nella table dovrebbe fare il check prima dell'update, li vengono inseriti i valori come il created_by se non specificato nei dati da uppare o se non coerente con la verifica.
... o almeno mi sembra di ricordare

Offline saprile

  • Esploratore
  • **
  • Post: 74
    • Mostra profilo
[RISOLTO] Re:Inserimento automatico created_by e modified_by
« Risposta #4 il: 25 Gen 2018, 10:21:11 »

Grazie alla risposta di Ahmed Salvini ho risolto così, sperando che sia una maniera corretta nel rispetto degli standard di Joomla:


Nel file "/administrator/components/nome_componente/tables/nome_componente.php", nel metodo "bind" viene passata la variabile $array che contiene i dati da inviare in tabella, se l'id è pieno si tratta di un UPDATE, altrimenti si tratta di una INSERT:


if ($array["id"]==0) {
   $array["created"] = JFactory::getDate()->toSql();
   $array["created_by"] = JFactory::getUser()->get('id', 0);
} else if ($array["id"]!=0 && $array["id"]!="") {
   $array["modified"] = JFactory::getDate()->toSql();
   $array["modified_by"] = JFactory::getUser()->get('id', 0);
}


Grazie

Offline Ahmed Salvini

  • Appassionato
  • ***
  • Post: 337
    • Mostra profilo
Re:Inserimento automatico created_by e modified_by
« Risposta #5 il: 25 Gen 2018, 12:46:30 »
per ragioni di sicurezza è consigliabile usare come verifica dei dati anche il check() oltre al bind che stabilisce se insert o update, imho... ma è tanto che non uso più il fw joomla e quindi non saprei se è cambiata qualche logica.

La distinzione tra insert e update viene fatta verificando se il record ha un id o meno: se ce l'ha è un update sennò un insert
« Ultima modifica: 25 Gen 2018, 12:50:53 da Ahmed Salvini »

 

Torna su