views_pre_render
Ho creato una vista e usato l'hook views_pre_render per personalizzare alcuni campi.
Ho fatto delle prove ed ho notato che bisogna sempre fare la cancellazione della cache per vedere le modifiche effettuate. Visualizzo una scritta con
\Drupal::messenger()->addMessage( "Views ". $view->id() .' - '. $view->current_display .' - '. $view->total_rows );
e per vederla devo fare la cancellazione della cache se poi effettuo i lrefresh della pagina non me la visualizza + è giusto così?
Gaetano
Risposte
In una view nell'intestazione
In una view nell'intestazione ho inserito un bottone (Globale: Riassunto del risultato a cui ho assegnato una classe button) per il richiamo di una function che deve creare un file e poi permetterne il donload.
Non so se si possa fare e come
views_pre_render non viene
views_pre_render non viene eseguito se la vista è in cache, direi che il comportamento è normale.
Il consiglio che ti posso dare è mettere la logica di generazione e download in un controller che esponga un metodo richiamabile da un route specifica. A questo punto linki il bottone nell'header della view alla route che hai creato.
Seguendo il tuo consiglio ho
Seguendo il tuo consiglio ho provveduto a creare un nuovo modulo. Ma mi riporta l'errore di pagina non trovata e non riesco a capire perchè.
Riepilogo quello che ho fatto
Cartella download
download.info.yml
name: download
description: Personalizzazioni
package: Personal
type: module
core: 8.x
download.module
vuoto
download.routing.yml
download.home:
path: '/download'
defaults:
_controller: '\Drupal\download\Controller\downloadController::content'
_title: 'Download C.S.V.'
requirements:
_permission: 'access content'
downloadController.php
namespace Drupal\download\Controller;
use Drupal\Core\Controller\ControllerBase;
class downloadController extends ControllerBase {
public function content() {
return [
'#type' => 'markup',
'#markup' => $this->t('Hello, World!'),
];
}
}
Ho seguito tutte le indicazioni ma non riesco a capire il perchè non trovi la pagina
Sembra ok, assicurati che il
Sembra ok, assicurati che il modulo sia attivo e prova a ripulire la cache di Drupal.
si ho installato il modulo ed
si ho installato il modulo ed eseguito cron e cancellazione della cache. Ho anche disinstallato e reinstallato ma non capisco il perchè
Anche dai messaggi di log non trovo nulla in particlare. Questo i link per richamare la pagina
http://localhost/gep-ce/download
Non saprei. Comunque per
Non saprei. Comunque per generare export di dati se questi sono memorizzati dentro Drupal in qualche modo (tassonomie, utenti, nodi etc..) puoi usare anche views_data_export senza usare il codice.
Si me lo consigliasti già.
Si me lo consigliasti già. Però man mano che scarico i nodi, aggiorno 2 campi del nodo, uno per segnalarlo ocme scaricato e l'altro in che data.
Ho cancellato e riscritto il modulo e adesso mi ritorna questo errore
Si è verificato un errore inatteso. Riprova più tardi, grazie.
ReflectionException: Class \Drupal\download\Controller\downloadController does not exist in ReflectionMethod->__construct() (line 136 of core\lib\Drupal\Core\Entity\EntityResolverManager.php).
Drupal\Core\Entity\EntityResolverManager->setParametersFromReflection(Array, Object) (Line: 221)
Drupal\Core\Entity\EntityResolverManager->setRouteOptions(Object) (Line: 48)
Drupal\Core\EventSubscriber\EntityRouteAlterSubscriber->onRoutingRouteAlterSetType(Object, 'routing.route_alter', Object)
call_user_func(Array, Object, 'routing.route_alter', Object) (Line: 111)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch('routing.route_alter', Object) (Line: 189)
Drupal\Core\Routing\RouteBuilder->rebuild() (Line: 83)
Drupal\Core\ProxyClass\Routing\RouteBuilder->rebuild() (Line: 345)
Drupal\Core\Extension\ModuleInstaller->install(Array, 1) (Line: 83)
Drupal\Core\ProxyClass\Extension\ModuleInstaller->install(Array) (Line: 477)
Drupal\system\Form\ModulesListForm->submitForm(Array, Object)
call_user_func_array(Array, Array) (Line: 114)
Drupal\Core\Form\FormSubmitter->executeSubmitHandlers(Array, Object) (Line: 52)
Drupal\Core\Form\FormSubmitter->doSubmitForm(Array, Object) (Line: 591)
Drupal\Core\Form\FormBuilder->processForm('system_modules', Array, Object) (Line: 320)
Drupal\Core\Form\FormBuilder->buildForm(Object, Object) (Line: 91)
Drupal\Core\Controller\FormController->getContentResult(Object, Object)
call_user_func_array(Array, Array) (Line: 123)
Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}() (Line: 573)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 124)
Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->wrapControllerExecutionInRenderContext(Array, Array) (Line: 97)
Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}() (Line: 151)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 68)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 57)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 47)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 106)
Drupal\page_cache\StackMiddleware\PageCache->pass(Object, 1, 1) (Line: 85)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 47)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 52)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 708)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Creato modulo e funzione per
Creato modulo e funzione per la creazione del file csv da scaricare.
Nella pagina faccio visualizzare le varie righe
Mi trovo in difficoltà perchè non ho capito come effettuare il downLoad del file che è presente in una sottocartella della Cartella dei file Privati. Ho controllato e nella cartella il file è presente
Ho letto vari articoli ma non mi è chiaro il meccaniscmo.
Ho trovato questo codice ma mi scarica il file con dentro il nome del file che ho creato ma senza le rgihe dei nodi.
$content = $NomeFile;
$file_size = strlen($content);
header('Content-Description: File Transfer');
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="a.csv"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . $file_size);
flush();
echo($content);
Perfettamente quello che hai
Perfettamente quello che hai programmato, $content contiene solo il nome del file in questo stralcio.
L'esempio più corretto da seguire però è questo
https://drupal.stackexchange.com/a/277238/92123
cioè usare gli strumenti che Symfony mette a disposizione
Letto e provato il codice.
Letto e provato il codice. Funziona.
Se non ti dispiace vorrei chiederti un chiarimento. Come da te consigliato ho realizzato un nuovo modulo e scritto anche del codice per far visualizzare i nodi che scarico in una pagina web.
Se non eseguo il codice per il downLoad riesco a vedere la pagina web così come l'ho costruita. Se invece attivo il codice tuo o quello che ti ho postato dopo aver effettuato una modifica non me lo fa più vedere. Il perchè l'ho capito in quanto nel codice che mi hai proposto c'è il return
mentre nel mio c'è il die()
C'è la possibilità di far visualizzare la pagina web e poi effettuare il downLoad?
Puoi fare solo una alla volta
Puoi fare solo una alla volta delle due cose su un metodo del controller.
Dalla pagina della views
Dalla pagina della views effettuo il download aggiornando dei campi. È possibile dopo il download fare un refresh della pagina in automatico?
In html esiste il meta
In html esiste il meta refresh puoi usare quello oppure con un javascript. Comunque apri una nuova richiesta perchè stiamo andando completamente off-topic rispetto al post originale.
Scusa, è già la seconda volta
Scusa, è già la seconda volta che mi capita