如何转换ConfigureShowFields以在sonata管理包中生成PDF?

时间:2017-05-04 21:22:59

标签: php symfony sonata-admin symfony-sonata sonata

这是我的ConfigureShowFields使用奏鸣曲包:

My ConfigureShowFilds description in picture

我想将ConfigureShowFields中的数据转换为pdf,可能吗?

1 个答案:

答案 0 :(得分:1)

可以使用

https://github.com/KnpLabs/KnpSnappyBundle

首先安装并配置KnpSnappyBundle

然后:

在您的管理员中创建自定义操作:

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

在管理控制器中为此操作创建逻辑

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"',
        ]
    );
}

创建pdf视图以呈现没有管理员菜单或标题的节目。

应用/管理/ 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 %}

在应用中创建打印控制器。

/**
 * @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;
    }
}

注意:此控制器用于将knpSnappy与url而不是字符串一起使用,以避免与资产发生冲突,例如:如果您不需要打印图像或样式,只需使用$this->get('knp_snappy.pdf')->generateFromHtml()从响应生成pdf而不是发送到另一个URL,并在使用缓存创建时间渲染文件时删除该部分。