将TWIG输出发送到Symfony中用于模板的zip

时间:2016-11-14 01:26:27

标签: templates zip twig symfony

我需要根据一组选项(包括菜单1,使用小)创建一个能够输出模板的系统(带有index.html的zip,其中包含所有js,css,img等文件)页脚等)。

所以我可以放入代码块,因此实际输出到浏览器所需的外观并不困难,但如果我想保存渲染的html怎么办(这意味着我们需要更改文件的位置,如js等)改为拉链?

有什么想法吗?目前我认为无论如何都需要在PHP中处理(控制器)和TWIG可能不太有用,但这会使它更复杂。

1 个答案:

答案 0 :(得分:0)

所以我解决了这个问题,这是控制器输出所需的拉链树枝:

<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller
{
    /**
     * @Route("/{variableName}", name="homepage"})
     */
    public function indexAction($variableName = "Default")
    {
        //do whatever you need to get the template correct

        //send rendered TWIG to a variable
        $renderedhtml = $this->render('default/index.html.twig', [
            'variableName' => $variableName
        ])->getContent();

        $zipName = "template.zip";
        $main = $this->get('kernel')->getRootDir() . '/../web/workingdir/';
        $vername = time(); //we use the exact time to get a unique dir name

        //remove any projects older than a few minutes (5 in this case)
        $dirHandle = opendir($main);
        while($item = readdir($dirHandle)){
            if(is_dir($main . $item) && $item != '.' && $item != '..') {
                if ( ( ( $item + ( 60 * 5 ) ) < $vername ) ) {
                    system('/bin/rm -rf ' . escapeshellarg($main . $item));
                }
            }
        }

        //make the project dir and populate it with files (in this case just the template as index.html, you would want to copy all other files here though)
        mkdir($main.$vername);
        file_put_contents($main.$vername."/index.html", $renderedhtml);

        //create the zip
        $zip = new \ZipArchive();
        $zip->open($zipName,  \ZipArchive::CREATE);
        $zip = $this->createZip($zip, $main.$vername);
        $zip->close();

        //get the zip ready to return
        header('Content-Type', 'application/zip');
        header('Content-disposition: attachment; filename="' . $zipName . '"');
        header('Content-Length: ' . filesize($zipName));
        readfile($zipName);
    }

    // Create a zip with zip object and root dir params (find and include sub-dirs with content)
    private function createZip($zip, $source) {
        $source = str_replace('\\', '/', realpath($source));

        if (is_dir($source) === true) {
            $files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($source), \RecursiveIteratorIterator::SELF_FIRST);

            foreach ($files as $file) {
                $file = str_replace('\\', '/', $file);

                if( in_array(substr($file, strrpos($file, '/')+1), array('.', '..')) )
                continue;

                $file = realpath($file);

                if (is_dir($file) === true)
                {
                    $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
                }
                else if (is_file($file) === true)
                {
                    $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
                }
            }
        }
        return $zip;
    }
}

一旦你进入这个阶段,你只需要将任何其他所需的文件添加到工作目录中,但我认为这可以在一个不同的问题上完成,这个是关于将网站变成一个html的拉链。

希望这有助于某人。