Mențin un modul pentru care am avut un dezvoltator terță parte pentru mine. eu D9 această problemă a apărut când se folosește modulul care altfel funcționează în D8 și ar trebui să fie compatibil cu 8 și 9.
Modulul creează blocuri cu datele evenimentului extrase din serviciul Songkick, dar pe paginile D9 cu un bloc Songkick activat, aruncă această eroare:
Drupal\Core\Security\UntrustedCallbackException: Redați #pre_render
callback-urile trebuie să fie metode ale unei clase care implementează
\Drupal\Core\Security\TrustedCallbackInterface sau fiți un anonim
funcţie. Reapelarea a fost _songkick_block_poweredby_prerender. Vedea
https://www.drupal.org/node/2966725 în
Drupal\Core\Render\Renderer->doTrustedCallback() (linia 96 din
/var/www/html/web/core/lib/Drupal/Core/Security/DoTrustedCallbackTrait.php).
Sunt un simplu constructor de site-uri cu experiență limitată de codare, așa că caut ajutor pentru a remedia problema. Eroarea menţionează această pagină explicând problema.
Codul de mai jos din fișierele mele .module include pre_render în mențiune.
/**
* Implementează hook_block_view_alter().
*/
funcția songkick_block_content_view_alter(array &$build) {
$id = $build['#block_content']->id();
$bloc = \Drupal\block_content\Entity\BlockContent::load($id);
$block_type = $block->type[0]->target_id;
dacă ($block_type == 'songkick_block') {
$build['#pre_render'][] = '_songkick_block_poweredby_prerender';
}
}
/**
* Obțineți date API pentru evenimente viitoare și trecute.
*/
funcția _songkick_block_poweredby_prerender(array &$build) {
$id = $build['#block_content']->id();
$bloc = \Drupal\block_content\Entity\BlockContent::load($id);
$block_type = $block->type[0]->target_id;
dacă ($block_type == 'songkick_block') {
// Obține date personalizate Blocks.
$artis_id = $bloc->field_artist_id[0]->valoare;
$upcoming_show = $bloc->field_display_upcoming_shows[0]->valoare;
$past_show = $bloc->field_display_past_shows[0]->valoare;
$detalii_eveniment = $block->field_ticket_button[0]->valoare;
$date_evenimente = [
'event_details' => $event_details,
'upcoming_show' => $upcoming_show,
'past_show' => $past_show
];
$date_evenimente = [
'#theme' => 'songkick_events',
'#events_data' => $events_data
];
$client = \Drupal::httpClient();
$api_key = \Drupal::config('songkick.settings')->get('songkick_key');
$url = 'http://api.songkick.com/api/3.0/artists/';
// Date despre evenimente viitoare.
dacă ($upcoming_show == '1') {
$apikey = $url . $artis_id. „/calendar.json” . „?apikey=". $api_key;
$cerere = $client->get($apikey);
$corp = $cerere->getBody()->getContents();
$AllData = (matrice)json_decode($corp);
// Datele ultimei pagini
$per_page = $AllData['resultsPage']->perPage;
$total_entry = $AllData['resultsPage']->totalEntries;
$pagina = (int)($total_entry / $per_page);
//$mainData = $AllData['resultsPage']->results->eveniment;
$temp_var = [];
pentru ($x = $pagina; $x >= 0; $x--){
$final_api_key = $apikey . „&page=". $x;
$upcoming_event_request = $client->get($final_api_key);
$upcoming_event_body = $upcoming_event_request->getBody()->getContents();
$UpcomingEventAllData = json_decode($upcoming_event_body);
$mainData = array_reverse($UpcomingEventAllData->resultsPage->results->event);
//$temp_data[] = $mainData;
foreach ($mainData ca $valoare) {
$temp_var[] = $valoare;
}
}
$upcoming_events_data = [
'#theme' => 'songkick_events',
'#upcoming_event' => $temp_var
];
}
altfel{
$upcoming_events_data = [
'#theme' => 'songkick_events',
'#upcoming_event' => ''
];
}
// Date despre evenimentele trecute.
if ($past_show == '1') {
$apikey = $url . $artis_id. „/gigography.json” . „?apikey=". $api_key;
$cerere = $client->get($apikey);
$corp = $cerere->getBody()->getContents();
$AllData = (matrice)json_decode($corp);
// Datele ultimei pagini
$per_page = $AllData['resultsPage']->perPage;
$total_entry = $AllData['resultsPage']->totalEntries;
$pagina = (int)($total_entry / $per_page);
$temp_var = [];
pentru ($x = $pagina; $x >= 0; $x--){
$final_api_key = $apikey . „&page=". $x;
$past_event_request = $client->get($final_api_key);
$past_event_body = $past_event_request->getBody()->getContents();
$PastEventAllData = json_decode($past_event_body);
$mainData = array_reverse($PastEventAllData->resultsPage->results->event);
//$temp_data[] = $mainData;
foreach ($mainData ca $valoare) {
$temp_var[] = $valoare;
}
}
//$final_api_key = $apikey . „&page=". $pagina;
// $past_event_request = $client->get($final_api_key);
// $past_event_body = $past_event_request->getBody()->getContents();
// $PastEventAllData = (matrice)json_decode($past_event_body);
// $mainData = array_reverse($PastEventAllData['resultsPage']->results->event);
$date_evenimente_trecute = [
'#theme' => 'songkick_events',
'#past_event' => $temp_var
];
}
altfel{
$date_evenimente_trecute = [
'#theme' => 'songkick_events',
'#past_event' => ''
];
}
// Îmbină datele evenimentelor viitoare și trecute.
$event_data = array_merge($date_evenimente_upcoming,$date_evenimente_trecute,$date_evenimente);
// Returnează datele evenimentelor.
returnează $date_eveniment;
}
}
Am încercat să urmez instrucțiunile din acest comentariu și am adăugat un fișier numit SongkickBlockPoweredByViewBuilder.php în folderul src cu acest cod:
<?php
spațiu de nume Drupal\Songkick;
utilizați Drupal\Core\Security\TrustedCallbackInterface;
/**
* Oferă un apel invers de încredere pentru blocul Songkick Poweredby.
*
*/
clasa SongkickBlockPoweredByViewBuilder implementează TrustedCallbackInterface {
/**
* {@inheritdoc}
*/
funcție publică statică trustedCallbacks() {
return ['preRender'];
}
/**
* Setează Songkick - #pre_render callback.
*/
funcție publică statică preRender($build) {
$count = $build['conținut']['#count'];
$build['content']['#count_text'] = \Drupal::translation()->formatPlural($count, '(@count)', '(@count)');
returnează $build;
}
}
Și am adăugat următoarele în fișierul meu .module:
utilizați Drupal\Songkick\SongkickBlockPoweredByViewBuilder;
/**
* Implementează TrustedCallbackInterface
*/
funcția _songkick_block_poweredby_prerender(array &$build, Drupal\Core\Block\BlockPluginInterface $block) {
$build['#pre_render'][] = [SongkickBlockPoweredByViewBuilder::class, 'preRender'];
}
Apoi site-ul aruncă această eroare fatală:
Eroare fatală: nu se poate redeclara _songkick_block_poweredby_prerender()
(declarat anterior în
/var/www/html/web/modules/contrib/songkick/songkick.module:14) în
/var/www/html/web/modules/contrib/songkick/songkick.module pe linia 51
Eroarea fatală dispare dacă elimin declarația din linia 14, dar eroarea inițială persistă. Nu știu cum să definesc funcția din linia 51 într-un mod care să rezolve problema. Linia 51 începe imediat după acest comentariu în fragmentul de mai sus din fișierul .module:
/*** Obțineți date API pentru evenimente viitoare și trecute. */
Orice sfaturi?