2017-05-04 7 views

Répondre

1

Il est possible en utilisant

https://github.com/KnpLabs/KnpSnappyBundle

Tout d'abord installer et configurer le KnpSnappyBundle

Puis:

créer une action personnalisée dans votre admin:

protected function configureRoutes(RouteCollection $collection) 
{ 
    $collection->add('pdf', $this->getRouterIdParameter().'/pdf'); 
} 

Créer la logique cette action dans le co admin ntroller

public function pdfAction(Request $request) 
{ 
    $id = $request->get($this->admin->getIdParameter()); 

    $object = $this->admin->getObject($id); 

    if (!$object) { 
     throw $this->createNotFoundException(sprintf('unable to find the object with id : %s', $id)); 
    } 

    $this->admin->checkAccess('show', $object); 

    $this->admin->setSubject($object); 

    $response = $this->render(
     '@App/Admin/pdf.html.twig', 
     [ 
      'action' => 'print', 
      'object' => $object, 
      'elements' => $this->admin->getShow(), 
     ], 
     null 
    ); 

    $cacheDir = $this->container->getParameter('kernel.cache_dir'); 
    $name = tempnam($cacheDir.DIRECTORY_SEPARATOR, '_print'); 
    file_put_contents($name, $response->getContent()); 
    $hash = base64_encode($name); 

    $options['viewport-size'] = '769x900'; 

    $url = $this->container->get('router')->generate('app_print', ['hash' => $hash], Router::ABSOLUTE_URL); 

    $pdf = $this->container->get('knp_snappy.pdf')->getOutput($url, $options); 

    return new Response(
     $pdf, 
     200, 
     [ 
      'Content-Type' => 'application/pdf', 
      'Content-Disposition' => 'filename="show.pdf"', 
     ] 
    ); 
} 

Créer l'affichage pdf pour afficher le spectacle sans menu d'administration ou en-têtes.

App/Administrateur/pdf.html.twig

{% extends '@SonataAdmin/CRUD/base_show.html.twig' %} 

{% block html %} 
    <!DOCTYPE html> 
    <html lang="en" dir="ltr"> 
    {% block head %} 
     {{ parent() }} 
    {% endblock %} 
    <body style="background: none"> 
    {% block sonata_admin_content %} 
     {{ parent() }} 
    {% endblock %} 
    </body> 
    </html> 
{% endblock %} 

Créer un contrôleur d'impression dans l'application.

/** 
* @Route(path="/core/print") 
*/ 
class PrinterController 
{ 
    /** 
    * @Route(path="/{hash}", name="app_print") 
    * 
    * @param string $hash 
    * 
    * @return Response 
    */ 
    public function indexAction($hash) 
    { 
     $file = base64_decode($hash); 
     if (!file_exists($file)) { 
      throw new NotFoundHttpException(); 
     } 

     $response = new Response(file_get_contents($file)); 
     unlink($file); 

     return $response; 
    } 
} 

NOTE: Ce contrôleur est utilisé pour utiliser knpSnappy avec une URL au lieu de chaîne, afin d'éviter les conflits avec les actifs, par exemple images etc. Si vous n'avez pas besoin d'imprimer des images ou des styles, utilisez simplement $this->get('knp_snappy.pdf')->generateFromHtml() pour générer le pdf à partir de la réponse au lieu d'envoyer à une autre URL et supprimez la partie lorsque le cache est utilisé pour créer un fichier rendu temporel.