Hook form alter
Ho letto come si usa un hook e fatta un po' di esperienza.
Adesso mi serve approfondire le questioni ma mi sono bloccato ed ho bisogno di alcuni chiarimenti altrimenti non riesco a proseguire.
hook_form_alter fa il rendering della form prima della visualizzazione delle varie etichette e campi ed in questa fase posso operare in varie maniere. Ho fatto delle prove e quelle fatte funzionano altre invece no.
1° Domanda
function calcoli_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id)
{
$form['title']['#title'] = t('Nuovo Titolo'); // non funzione
$form['title']['widget']['0']['value']['#title'] = t('Nuovo Titolo'); // FUNZIONA
}
Questo codice permette di cambiare l'etichetta (label?) del campo titolo. Siccome ho visto vari esempi e filmati dove invece funziona non riesco a capirne il motivo
2° Domanda
$form['title']['widget']['0']['value']['#title']
C'è la possibilità di diminuire tale profondità e come
Dove posso andare a leggere tutte le proprietà inserite nell'array $fom che posso utilizzare?
ho visto anche che
$form['actions']['submit']['#value'] = t('Cambio scritta nel bottone di conferma');
Sono giorni che giro nel web e leggo gli articoli su drupal.org ma nacora non ne vengo fuori
grazie

Risposte
Ciao, questo è
Ciao, questo è corretto:
$form['title']['widget']['0']['value']['#title']
ma se non metti la stringa inglese evita di usare la funzione t().
$form['title']['widget']['0']['value']['#title'] = 'Nuovo titolo';
Per utilizzare agevolmente l'array potresti utilizzare l'operatore di riferimento es:
$elemento_titolo = &$form['title']['widget']['0']['value'];
$elemento_titolo['#title'] = 'Nuovo titolo';
$elemento_titolo['#description'] = 'Nuova descrizione';
Su drupal.org trovi una buona documentazione riguardo gli elementi dei form (https://www.drupal.org/docs/8/api/form-api e https://www.drupal.org/docs/8/api/form-api/form-render-elements).
Un metodo comodo per navigare gli oggetti e array è usare il modulo kint all'interno del modulo devel (https://www.drupal.org/project/devel) e poi utilizzare la funzione:
kint($form);
prova, vedrai che ti sarà molto utile.
Ho installato devel e
Ho installato devel e attivato devel. Ho cercato il modulo kint ma è fermo alla versione per D7. Ho fatto delle ricerche ed ho visto l'installazione tramite drushe D.C. ma non manuale.
Ho trovato questo modulo https://www.drupal.org/project/search_kint
Ottimo hai anticipato la risposta di un'altra domanda per accorciare la riga della prorietà da usare (&$form)
Leggerò i link
Nel frattempo ho letto altro ed ho notato che devo capire bene le route e i controller
Come dicevo il modulo kint è
Come dicevo il modulo kint è all'interno del modulo devel. Devi solo attivarlo.
si hai ragione, avevo
si hai ragione, avevo sbagliato a prendere il link. Avevo preso quello per sviluppatore. Adesso esce ed ho attivato il modulo.
Ho fatto una prova in form_alter e mi ritorna questo errore
$args array(1)
→Called from <ROOT>/prova/modules/devel/kint/kint.module:18 [kint()]
The website encountered an unexpected error. Please try again later.
kint() spedisce subito
kint() spedisce subito all'output i dati e questo può anche generare errori in certi casi. Se devi lavorare con redirect, ajax etc .. puoi usare dsm() che usa kint ma invia l'output ai messaggi di sistema mantenendo anche eventuali messaggi in sessione.
mi sa che sbaglio io qualcosa
mi sa che sbaglio io qualcosa ho provato, sempre all'interno di form_alter
dsm($form);
ma mi riporta lo stesso errore
Non so dirti, potrebbe essere
Non so dirti, potrebbe essere un overflow di memoria, qualche istruzione sbagliata ..
prova a lasciare solo
<?phpfunction calcoli_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id)
{
dsm($form_id);
}
?>
se questo va devi fare un check degli altri codici ...
nulla da fare. Ho cancellato
nulla da fare. Ho cancellato tutto dal modulo e lasciato solo il codice che mi hai inviato ma solo remmando dsm mi apre la pagina
nemmeno usando
nemmeno usando
drupal_set_message(var_export($form, TRUE));
al posto di dsm($form_id);?
Alternative: controllare la memoria a disposizione di php o ridurre i livelli di ricorsione di kint (cerca su google Kint::$maxLevels) o cambiare la libreria di dump (istruzioni qui https://www.drupal.org/project/devel/issues/2820205).
Non saprei che altro dirti ... buon lavoro!
Per il momento provata la tua
Per il momento provata la tua istrzione ma si alluppa
siccome è D8 ho cambiato la tua istruione in
\Drupal::messenger()->addMessage( (var_export($form, TRUE)) );
ma gira senza mai finire
Gli altri consigli controllerò successivamente.
male che vada provo a reinstallare il sito, tanto è quello delle prove e potrei aver fatto delle sciocchezze
Ha fatto bene
Ha fatto bene drupal_set_message è deprecato e verrà rimosso di D9 ma per un test del genere va ancora bene.
Ho cancellato il sito e
Ho cancellato il sito e reinstallato. E per provare ho installato devel kint prima di qualsiasi altro modulo. Quando nella func inserisco il comando Kint($form_ID), mi ritorna errore e poi non mi permette più di entrare in nessuna pagina. Probabilmente inserisce il dato nella cache e non c'è nulla da fare.
Forse ci sono problemi in risoluzione nella versione 8.8.5?
Temo che senza capire
Temo che senza capire esattamente l'errore ci sia davvero poco da fare.
Se hai accesso a drush, potresti rimuovere l'istruzione e poi lanciare un "drush cr" da linea di comando per ripulire la cache. Hai accesso ai log di errore di php? La loro posizione varia in base al sistema e alle configurazioni ma sono utilissimi per debuggare un problema del genere.
sto facendo le prove
sto facendo le prove localmente con xamp. Penso che non ci dovrebbero essere problemi ad aprirlo
No ho installato Drupal Console, ma quando lo richiamo mi ritorna un errore di simphony e non ho capito cosa possa essere. [ERROR] Class Drupal\Core\DrupalKernel does not exist.
Oltre che con drush o drupal console c'è un altro modo per azzerare la cache?
Tutti i metodi per pulire la
Tutti i metodi per pulire la cache:
https://www.drupal.org/docs/user_guide/en/prevent-cache-clear.html
E' probabile che ci sia qualcosa che non va sulle dipendenze della tua installazione Drupal.
Prova a seguire gli step proposti qui (backuppando tutto per sicurezza):
https://www.drupal.org/node/2886985#comment-12132933
Se trovi i log, prova a postare le info e gli errori bloccanti che trovi.
grazie. ma non ho installato
grazie. ma non ho installato drupal col compositore ma manualmente
Stavolta ho disinstallato sia drupal che xampp e reinstallato tutto.
Ho installato la versione 8.9 di drupal, prima di installare qualsiasi consa ho instalalto devel e attivato solo il modulo kint. Ma nulla da fare visualizza la linea dell'array ma dopo mi ritorna
$args array(1)
→Called from <ROOT>/prova/modules/devel/kint/kint.module:18 [kint()]
The website encountered an unexpected error. Please try again later.
Forse c'è incompatibilità con D8
Nel log mi ritorna questo errore
Deprecated function: Array and string offset access syntax with curly braces is deprecated in require() (line 17 of C:\xampp\htdocs\prova\modules\devel\kint\kint\Kint.class.php)
#0 C:\xampp\htdocs\prova\core\includes\bootstrap.inc(600): _drupal_error_handler_real(8192, 'Array and strin...', 'C:\\xampp\\htdocs...', 463, Array)
#1 C:\xampp\htdocs\prova\modules\devel\kint\kint\Kint.class.php(17): _drupal_error_handler(8192, 'Array and strin...', 'C:\\xampp\\htdocs...', 463, Array)
#2 C:\xampp\htdocs\prova\modules\devel\kint\kint\Kint.class.php(17): require()
#3 C:\xampp\htdocs\prova\modules\devel\kint\kint.module(64): require_once('C:\\xampp\\htdocs...')
#4 C:\xampp\htdocs\prova\modules\devel\kint\kint.module(11): kint_require()
#5 C:\xampp\htdocs\prova\core\themes\bartik\bartik.theme(36): kint(Array)
#6 C:\xampp\htdocs\prova\core\lib\Drupal\Core\Theme\ThemeManager.php(287): bartik_preprocess_html(Array, 'html', Array)
#7 C:\xampp\htdocs\prova\core\lib\Drupal\Core\Render\Renderer.php(431): Drupal\Core\Theme\ThemeManager->render('html', Array)
#8 C:\xampp\htdocs\prova\core\lib\Drupal\Core\Render\Renderer.php(200): Drupal\Core\Render\Renderer->doRender(Array, false)
#9 C:\xampp\htdocs\prova\core\lib\Drupal\Core\Render\MainContent\HtmlRenderer.php(147): Drupal\Core\Render\Renderer->render(Array)
#10 C:\xampp\htdocs\prova\core\lib\Drupal\Core\Render\Renderer.php(573): Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}()
#11 C:\xampp\htdocs\prova\core\lib\Drupal\Core\Render\MainContent\HtmlRenderer.php(148): Drupal\Core\Render\Renderer->executeInRenderContext(Object(Drupal\Core\Render\RenderContext), Object(Closure))
#12 C:\xampp\htdocs\prova\core\lib\Drupal\Core\EventSubscriber\MainContentViewSubscriber.php(90): Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object(Symfony\Component\HttpFoundation\Request), Object(Drupal\Core\Routing\CurrentRouteMatch))
#13 [internal function]: Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object(Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent), 'kernel.view', Object(Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher))
#14 C:\xampp\htdocs\prova\core\lib\Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher.php(111): call_user_func(Array, Object(Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent), 'kernel.view', Object(Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher))
#15 C:\xampp\htdocs\prova\vendor\symfony\http-kernel\HttpKernel.php(156): Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch('kernel.view', Object(Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent))
#16 C:\xampp\htdocs\prova\vendor\symfony\http-kernel\HttpKernel.php(68): Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object(Symfony\Component\HttpFoundation\Request), 1)
#17 C:\xampp\htdocs\prova\core\lib\Drupal\Core\StackMiddleware\Session.php(57): Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#18 C:\xampp\htdocs\prova\core\lib\Drupal\Core\StackMiddleware\KernelPreHandle.php(47): Drupal\Core\StackMiddleware\Session->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#19 C:\xampp\htdocs\prova\core\modules\page_cache\src\StackMiddleware\PageCache.php(106): Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#20 C:\xampp\htdocs\prova\core\modules\page_cache\src\StackMiddleware\PageCache.php(85): Drupal\page_cache\StackMiddleware\PageCache->pass(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#21 C:\xampp\htdocs\prova\core\lib\Drupal\Core\StackMiddleware\ReverseProxyMiddleware.php(47): Drupal\page_cache\StackMiddleware\PageCache->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#22 C:\xampp\htdocs\prova\core\lib\Drupal\Core\StackMiddleware\NegotiationMiddleware.php(52): Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#23 C:\xampp\htdocs\prova\vendor\stack\builder\src\Stack\StackedHttpKernel.php(23): Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#24 C:\xampp\htdocs\prova\core\lib\Drupal\Core\DrupalKernel.php(708): Stack\StackedHttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#25 C:\xampp\htdocs\prova\index.php(19): Drupal\Core\DrupalKernel->handle(Object(Symfony\Component\HttpFoundation\Request))
Non so, lo uso giornalmente
Non so, lo uso giornalmente sia su D7 che D8 (varie versioni) e non ho problemi ad utilizzarlo.
Il problema è che se non riesci a capire la causa di questo "unexpected error" non trovi la soluzione per il tuo caso.
Nemmeno nei log di Drupal è segnalato qualcosa?
"Deprecated function: Array
"Deprecated function: Array and string offset access syntax with curly braces is deprecated"
è un warning del modulo devel che usa qualche funzione deprecata. Probabilmente stai usando la versione di php 7.4. Nel caso dovresti provare l'ultima versione dev di devel (8.x-3.x-dev) e vedere se il mantainer ha fatto le dovute modifiche.
Questo però è un warning e non un errore, probabilmente c'è altro.
I log di sistema (apache o php) contengono niente di indicativo?
Ho visto vari post che riportano alcune possibili posizioni sotto Win.
C:\xampp\apache\logs\error.log
C:\xampp\php\logs\php_error_log
Prova a vedere.
Fatto altre prove. Attivato
Fatto altre prove. Attivato sia modulo devel che kint. In settaggi ho inserito pagine e poi kint e adesso sembra funzionare.
Speriamo bene, adesso da capire come si leggono i dati dell'array
grazie per la pazienza