Form con calcolo del tempo prima del submit
ciao a tutti,
ho un form con delle domande generatae casualmente e ho bisogno di calcolare il tempo impiegato per rispondere, quindi mi serve il tempo dalla generazione del form fino al submit.
ho provato con microtime impsotandolo in un campo hidden e di nuovo con microtime nella funzione di submit ma mi restituisce un valore sballato come se impiegasse un solo secondo.
ho provato anche con la funzione timer_start e timer_stop di drupal ma usandola ricevo un tempo esagerato non veritiero.
se usato in una pagina normale (basic_page) funziona regolarmente calcolando il tempo esatto
quando utilizzo il form i valori sono completamente sballati non risco a capire come uscirne.
qualche aiuto?
ciao e grazie mille
Risposte
Ciao generalmente il form
Ciao generalmente il form viene ricostruito in fase di submit quindi devi fare in modo di salvare il valore di inizio del contatore solamente alla prima chiamata di buildForm o nel form_alter.
Un modo potrebbe essere usare lo storage del form per passare valori tra una chiamata e l'altra dello stack di generazione, validazione e submit del form:
in buildForm / Form_alter
...
$storage = $form_state->getStorage();
if (!isset($storage['start'])) {
$storage['start'] = microtime();
$form_state->setStorage($storage);
}
...
nella funzione di submit (es submitForm):
...
$storage = $form_state->getStorage();
$diff_time = microtime() - $storage['start'];
...
prova a vedere se così risolvi.
ciao e grazie per la
ciao e grazie per la risposta.
colpa mia che non l'ho scritto ma uso drupal 7 quella funzione credo sia per 8.
sai se esiste un'alternativa su d7?
ciao grazie
Scusami non avevo notato la
Scusami non avevo notato la versione che avevi segnalato correttamente.
Per D7 $form_state non è un oggetto ma un array.
in form build
...
if (!isset($form_state['storage']['start'])) {
$form_state['storage']['start'] = microtime(true);
}
...
in form submit
...
$diff_time = microtime(true) - $form_state['storage']['start'];
...
prova così.
niente sempre risultati
niente sempre risultati minuscoli 0.074944972991943
quando in realtà ci sono stato circa 10 secondi sulla pagina.
ho provato ance time() invvece che microtime ma niente sembra come se facesse tutto nello stesso istante
Strano, questo: <?php
Strano, questo:
<?php
function test_form_alter(&$form, &$form_state) {
$form_state['storage']['start'] = !isset($form_state['storage']['start']) ? microtime(true) : $form_state['storage']['start'];
$form['#submit'][] = 'test_form_submit';
}
function test_form_submit($form, &$form_state) {
drupal_set_message(microtime(true) - $form_state['storage']['start']);
}
?>
messo su un modulo custom "test", sembra funzionare con ogni form e il tempo sembra coerente (rimanendo sul form per circa 5 sec ottengo al submit 5.3847601413727)
<code> function
<code>
function prova_domande(){
return drupal_render(drupal_get_form('genera_domande_form'));
}
function genera_domande_form($form,&$form_state){
$form['mt'] = array(
'#type' => 'hidden',
'#value' => '',
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => 'Verifica',
);
}
function genera_domande_form_submit($form, &$form_state) {
$form_state['redirect'] = 'classifica';
drupal_set_message($form_state['storage']['start'],'status');
}
function gestione_genera_domande_form_alter(&$form, &$form_state){
$form_state['storage']['start'] = !isset($form_state['storage']['start']) ? microtime(true) : $form_state['storage']['start'];
}
</code>
Il mio modulo si chiama gestione, la funzione prova_domande è la page callback dell'url.
se metto il tuo codice della form_state storage nell'hook form l'output del drupal_set_message viene vuoto, quando lo metto nel form vero e proprio invece restituisce pochi microsecondi.
sto sbagliando qualcsa nella creazione delle funzioni credo...
Credo che il nome della
Credo che il nome della funzione gestione_genera_domande_form_alter debba essere gestione_form_genera_domande_form_alter o gestione_form_alter.
si mi ero accorto dell'errore
si mi ero accorto dell'errore e ho usato gestione_form_alter
?ma anche così
?[0] => 1586117162.5741
[1] => 1586117162.5791
a volte lo scarto è pochissimo non capisco
Vedo che il form non viene
Vedo che il form non viene ricostruito tutte le volte e non ha nemmeno la cache attiva (rebuild o cache devono essere almeno a TRUE). Ti posto un esempio completo funzionante:
<?php
function gestione_menu() {
return [
'form-domande' => [
'page callback' => 'drupal_get_form',
'page arguments' => ['gestione_domande_form'],
'access callback' => TRUE
]
];
}
function gestione_domande_form($form, &$form_state) {
$form_state['storage']['start'] = !isset($form_state['storage']['start']) ? microtime(true) : $form_state['storage']['start'];
$form_state['cache'] = TRUE;
$form['choose'] = [
'#type' => 'radios',
'#options' => [1 => 'A',2 => 'B',3 => 'C'],
'#title' => t('Choose')
];
$form['submit'] = [
'#type' => 'submit',
'#value' => t('Submit')
];
return $form;
}
function gestione_domande_form_submit($form, &$form_state) {
drupal_set_message(microtime(true) - $form_state['storage']['start']);
drupal_set_message(var_export($form_state['values'], true));
}
?>
grazie per la dritta della
grazie per la dritta della cache che non sapevo. infatti avevo il problema che mi cambiava i valori nel form_state values.
per il tempo ho risolto così:
nella funzione del form
appena ho un attimo provo se l'aggiunta della cache farà funzionare il vecchio codice.
grazie per l'aiuto prezioso!!
Unica nota alla soluzione con
Unica nota alla soluzione con variable_set ... se più utenti compilano il form il valore viene sovrascritto e potrebbe non dare i risultati corretti
ah si si ovviamente ho messo
ah si si ovviamente ho messo un codice random generato per ogni form in modo che sia univoco.
sto studiando un po' Drupal 8 provando a riportare questo progetto portandolo da d7 a d8.
ovviamente anche qui si è presentato lo stesso problema del timer e della cache.
come riporto questo codice di drupal 7 su d8??
$form_state['cache'] = TRUE;
credo sia questa:
formstate::$cache che di default è settata su false.
come faccio a settarla a true?
grazie in anticipo!
ah si si ovviamente ho messo
se usi sempre variable_set() non è il massimo nemmeno così: ti troverai ben presto la tabella variables piena di record inutilizzati. Le variabili salvate così devono essere eliminate con una chiamata esplicita a variable_del().
Per tutti i metodi di FormState: https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Form!FormState.php/class/FormState
immagino ti riferisca a $form_state->disableCache().
Comunque questa issue è indirizzata a Drupal 7, nel caso aprine una nuova relativa alla giusta versione.