Back to top

Autore Topic: Inserimento data creazione automatica nuovo componente  (Letto 3815 volte)

Offline ricctram

  • Nuovo arrivato
  • *
  • Post: 30
  • Sesso: Maschio
    • Mostra profilo
Salve a tutti,


sto realizzando un componente per la versione 2.5 di Joomla e ho praticamente ultimato il lavoro se non fosse per un problema dal quale non riesco ad uscirne. Credo che sarà qualcosa di semplice ma non riesco proprio a capire cosa mi sfugge.


In pratica quando creo un nuovo record nel mio componente vorrei (come avviene nei componenti nativi di joomla) che venisse inserita la data di creazione e l'utente in maniera automatica, ma non capisco il motivo non me li inserisce automaticamente ma mi da soltanto la possibilità di inserirli manualmente.


Quello che ho fatto è inserire i campi specifici nel file item.xml nella cartella forms del model (vedi di seguito)


Codice: [Seleziona]
<field
name="created"
type="calendar"
label="COM_ACCONTRATTI_CREATO_LABEL"
description="COM_ACCONTRATTI_CREATO_DESC"
class="readonly"
size="22"
readonly="true"
format="%Y-%m-%d %H:%M:%S"
filter="user_utc" />


<field
name="created_by"
type="user"
readonly="true"
class="readonly"
label="Creato da"
/>


<field
name="modified"
type="calendar"
class="readonly"
label="JGLOBAL_FIELD_MODIFIED_LABEL"
size="22"
readonly="true"
format="%Y-%m-%d %H:%M:%S"
filter="user_utc" />


<field
name="modified_by"
type="user"
label="JGLOBAL_FIELD_MODIFIED_BY_LABEL"
class="readonly"
readonly="true"
filter="unset" />


ho inserito il seguente codice nel file del template edit.php all'interno della cartella tmpl:


Codice: [Seleziona]
<fieldset class="panelform">
<ul class="adminformlist">
<? foreach ($this->form->getFieldset('publish') as $field) { ?>
<li><?=$field->label?><?=$field->input?></li>
<? } ?>
</ul>
</fieldset>
dopo di che ho creato gli appositi campi nella tabella del database.


Mi visualizza correttamente i campi e se provo ad inserire un valore manualmente, quindi togliendo l'attributo "readonly", mi inserisce correttamente i valori nel database.


Il problema è che non capisco come fare ad evitare di inserire i valori manualmente ma vorrei che fosse il componente stesso ad inserire il valore (es. la data di creazione) in automatico come avviene ad esempio nel componente com_content per gli articoli.


Qualcuno può aiutarmi?


Grazie
--
Riccardo

Offline tomtomeight

  • Global Moderator
  • Fuori controllo
  • ********
  • Post: 32046
  • Sesso: Maschio
  • Gli automatismi aiutano ma non insegnano nulla.
    • Mostra profilo
Re:Inserimento data creazione automatica nuovo componente
« Risposta #1 il: 13 Gen 2014, 21:03:46 »
Ciao
Per il campo created devi scegliere timestamp mentre per l'user devi prima inserire le istruzioni per leggere dal db chi è collegato.

Offline mmleoni

  • Global Moderator
  • Instancabile
  • *****
  • Post: 5547
  • Sesso: Maschio
  • Just another *nix coder/sysadmin...
    • Mostra profilo
Re:Inserimento data creazione automatica nuovo componente
« Risposta #2 il: 14 Gen 2014, 10:29:33 »
1.
se vuoi che sia visualizzato il valore ti devi creare dei custom formfield che inseriscano il valore opportuno.

2.
se ti basta che sia inserito un valore nella tabella al salvataggio dei dati, puoi fare un override del metodo bind() nella classe che definisce la table. (e usare campi di tipo text)


ciao,
marco

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:Inserimento data creazione automatica nuovo componente
« Risposta #3 il: 14 Gen 2014, 10:44:30 »
Ciao
Per il campo created devi scegliere timestamp mentre per l'user devi prima inserire le istruzioni per leggere dal db chi è collegato.
Grazie per il consiglio. Comunque per il mio componente ho seguito le linee guida del componente com_content e il campo created è un campo datetime con valore di default 0000-00-00 00:00:00. Comunque ci provo e ti faccio sapere.



2.
se ti basta che sia inserito un valore nella tabella al salvataggio dei dati, puoi fare un override del metodo bind() nella classe che definisce la table. (e usare campi di tipo text)




Quindi questo secondo metodo è quello utilizzato dal componente com_content di joomla immagino giusto ?Poichè non trovo nessun custom field che riguarda il campo created e user nel componente nativo com_content.


Grazie ancora



--
Riccardo

Offline giovi

  • Instancabile
  • ******
  • Post: 9835
  • Sesso: Maschio
    • Mostra profilo
Re:Inserimento data creazione automatica nuovo componente
« Risposta #4 il: 14 Gen 2014, 10:52:52 »
La data di creazione a mio parere è una data che verrà generata solo nel momento in cui effettui il primo salvataggio per cui dovrebbe essere gestita solo dal database. Nel mio componente ho fatto così: ho creato un timestamp del tipo

Codice: [Seleziona]
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
che in joomla è un campo readonly. In questo modo Joomla non inserisce nulla ed il database vedendo un valore nullo ci inserisce direttamente la data corrente. Al prossimo salvataggio il campo sarà già riempito con la data di creazione quindi non verrà sovrascritto.

Chiaramente puoi anche farlo in altri modi gestendolo direttamente da joomla (in questo caso in mysql puoi usare un campo di qualunque tipo: text,datetime, timestamp,...) ma dovrai sovrascrivere tramite il metodo save() del controller o nel model o in table il contenuto del campo
« Ultima modifica: 14 Gen 2014, 10:54:57 da giovi »

Offline mmleoni

  • Global Moderator
  • Instancabile
  • *****
  • Post: 5547
  • Sesso: Maschio
  • Just another *nix coder/sysadmin...
    • Mostra profilo
Re:Inserimento data creazione automatica nuovo componente
« Risposta #5 il: 14 Gen 2014, 10:59:45 »
1.
ops, guardate che non esiste un type timestamp per i formfield di joomla; comunque puoi impostare il default value a "NOW" per la data corrente. 'user' poi non ha un default.


2.
com_content va per la sua strada e non andrebbe preso a modello, dato che è parte del core più che una normale estensione.
nello specifico comunque, sempre nella classe table, imposta i due valori tramite un override di store(), invece che di bind().
quale usare? dipende da che hai scritto nel controller: se non hai inserito override dei metodi standard allora uno vale l'altro, altrimenti dipende da che hai scritto, come appena detto.

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

Offline mmleoni

  • Global Moderator
  • Instancabile
  • *****
  • Post: 5547
  • Sesso: Maschio
  • Just another *nix coder/sysadmin...
    • Mostra profilo
Re:Inserimento data creazione automatica nuovo componente
« Risposta #6 il: 14 Gen 2014, 11:07:23 »
piccole note:

1. timestamp
timestamp è una cosa, datetime un'altra. non puoi impostare datetime a now se non in mysql 5.6+, nelle versioni precedenti devi usare un trigger. è detto tra noi i "secondi dall'epoca" hanno decisamente rotto...

2. save
io il metodo save nella table eviterei di toccarlo, dato che ha usi specifici (sequenza specifica di azioni). nella table override di bind() o store()

ciao,
marco

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:Inserimento data creazione automatica nuovo componente
« Risposta #7 il: 14 Gen 2014, 11:28:08 »
La data di creazione a mio parere è una data che verrà generata solo nel momento in cui effettui il primo salvataggio per cui dovrebbe essere gestita solo dal database. Nel mio componente ho fatto così: ho creato un timestamp del tipo

Codice: [Seleziona]
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP


In effetti credo che questa soluzione sarebbe la più veloce per il campo "created" dato che deve essere un valore di sola lettura. Per il campo user invece, per logica, dovrei creare un custom field che effettui un controllo dell'utente che ha appena inserito il record e scrivere l'id di riferimento nel campo "created_by".


Sapete qual'è il metodo per rilevare l'utente che ha inserito quel determinato record?


Grazie mille
--
Riccardo

Offline giovi

  • Instancabile
  • ******
  • Post: 9835
  • Sesso: Maschio
    • Mostra profilo

Offline ricctram

  • Nuovo arrivato
  • *
  • Post: 30
  • Sesso: Maschio
    • Mostra profilo
Re:Inserimento data creazione automatica nuovo componente
« Risposta #9 il: 14 Gen 2014, 11:46:09 »
Grazie mille
--
Riccardo

Offline ricctram

  • Nuovo arrivato
  • *
  • Post: 30
  • Sesso: Maschio
    • Mostra profilo
Re:Inserimento data creazione automatica nuovo componente
« Risposta #10 il: 14 Gen 2014, 16:11:52 »
Non riesco proprio a creare un campo personalizzato che mi prende l'utente e lo salvi nel campo created_by.. Qualcuno può aiutarmi?
--
Riccardo

Offline giovi

  • Instancabile
  • ******
  • Post: 9835
  • Sesso: Maschio
    • Mostra profilo
Re:Inserimento data creazione automatica nuovo componente
« Risposta #11 il: 14 Gen 2014, 19:30:58 »
non deve necessariamente essere di tipo personalizzato, l'autore è un id quindi un campo di tipo intero. Anche in questo caso (lo intendevo anche prima ma probabilmente mi sono espresso male parlando del timestamp) basta un campo di tipo "hidden" o text ma non valorizzabile in joomla ed "int" in mysql. L'utente non lo può alterare ma il controller o il model lo riempiranno solo la prima volta con il nome dell'autore.


Se invece vuoi creare un field personalizzato puoi creare un semplice <input ecc...> non alterabile e con valore predefinito l'id dell'utente, ma solo se il campo in precedenza era vuoto, altrimenti riporta il valore precedentemente salvato. Si tratta sempre comunque di un intero corrispondente all'id dell'autore

 



Web Design Bolzano Kreatif