DocMVC,用于生成文件(Excel、Word、PDF)的MVC库

v1.0.3 2022-03-31 21:25 UTC

This package is auto-updated.

Last update: 2024-09-29 05:21:28 UTC


README

该库旨在与PDF、Excel、Word等文件协同工作。这是一个关于MVC-model的微型框架。

一般规定

  • 要开始使用,您需要创建DocumentManager实例,然后为他下载类卡(class-cartridge)。
  • 数据处理、自定义路径和必需参数必须在类卡中完成。
  • 有两种生成文档的方法:从头开始渲染文档(使用视图),从现有文档(模板)渲染文档。
  • 文档渲染逻辑必须只编写在视图文件(视图)中。
  • 使用外部依赖关系来生成视图逻辑。这些库的处理器对象可以通过变量$driver在视图文件中访问。
    - Doc/Docx - phpoffice/phpword
    - Excel - phpoffice/phpspreadsheet
    - Pdf - dompdf/dompdf
  • 模板是一个尚未包含必要数据的空白文档,但它们将在生成过程中被替换。此类数据仅在模型中定义。(例如:要生成Excel文档,我们创建了一个空白模板.xlsx,然后在其中指定变量值的位置)

要开始使用

  1. 创建一个共享目录,其中将存储所有内容。我使用了一个名为'document'的目录。
  2. 在此目录内,您需要再创建一个目录(任意名称)。现在每个这样的目录都将负责其自身的文档。
  3. 在此目录中,您需要创建类卡。例如,我需要创建一个财务报告文档,格式为doc和pdf。为此,我在Document/目录下创建了Report/目录,并在Document/目录下创建了两个文件:Doc.php(扩展自SpiritOfWars\DocMVC\Cartridge\DocCartridge)和Pdf.php(SpiritOfWars\DocMVC\Cartridge\PdfCartridge)。
  4. 每个卡都有一个抽象方法,必须定义
    • setupView - 必须返回包含视图文件名称和路径的字符串。不能为空! 必须创建视图文件并指定其路径。每个卡还有三个可选方法
    • setupModel - 必须返回数据数组。此数据将在视图文件中使用或在填充模板变量中使用。
    • setupTemplate - 必须返回包含模板文件名称和路径的字符串。(对pdf-cartridge不可用)
    • setupRequiredParams - 必须返回所需参数数组,您希望传递给构造函数。我们只指定那些无法生成文档的参数。如果没有,则不要触摸此方法
  5. 创建目录view/(在我的例子中:Document/Report/view/)
  6. 创建任意名称的视图文件(在我的例子中:我创建了Document/Report/view/view-pdf.php来生成pdf文档)
  7. 在卡的方法setupView中设置视图文件的路径(在我的例子中:return 'view-pdf.php';)。注意!路径必须是相对的。
  8. 如果您需要通过模板生成,只需重复步骤6、7、8来处理模板名称。创建的目录必须命名为template/。在卡的方法setupTemplate中设置模板文档的路径。注意!路径必须是相对的。
  9. 视图文件用于HTML布局或通过$driver变量生成。默认情况下,有两个变量$driver - 用于生成文档内容的对象,$model - 包含您在setupModel方法中指定的数据的数组
  10. 在您的代码的正确位置,我们创建了一个我们创建的卡式实例,将参数数组传递给构造函数,这些参数将通过属性 $this->params 可用(以我的例子为例 $docObj = new(\Document\Report\Doc(['testKey' => 'testValue'])))
  11. 创建 DocumentManager 实例:new SpiritOfWars\DocMVC\DocumentManager($docObj)。可选:可以将日志对象作为第二个参数传递
  12. 构建文档 $docObj->build();
  13. 现在生成的文档可用于下载或保存到目录。方法:saveAs(),download()

一些重要的注意事项

  • 模板对 pdf 文档不可用
  • 在下载文档时,请确保页面上没有额外显示的内容。因为所有这些也将生成文档。甚至可能导致其不可读
  • 默认情况下,下载的文档名称将采用形式 timestamp().{扩展名}。您需要重写方法 setupDocName() 来更改名称。名称不得包含文件扩展名。
  • 每个类都有自己的默认文档扩展名。您可以通过重写方法 setupFileExt 来更改它。但是,您在其中指定的扩展名必须允许列表中的(方法 allowedExt)
  • /sample/ 文件夹包含与文档交互的示例
  • 如果您需要将数据从一个方法传递到另一个方法,可以使用 $this->commonData 属性

代码示例:生成 docx 文档以供下载

类卡式 Doc.php,位于目录 document/test/Doc.php 中

 use SpiritOfWars\DocMVC\Cartridge\DocCartridge;
 
 class Doc extends DocCartridge
 {
 
     public function setupView()
     {
         return 'doc/view.php';
     }
 
     public function setupModel()
     {
         $test = $this->params['test']; // required param
         $randParam = $this->params['test2'];
         return [
             'test' => $test,
             'randParam' => $randParam
         ];
     }
 
     public function setupRequiredParams()
     {
         return ['test'];
     }
 
     public function setupDocName()
     {
         return 'test-name';
     }
 }

视图文件 view.php,位于目录 document/test/view/view.php 中

 $PHPWord = $driver;
 $data = $model;
 
 $PHPWord->addFontStyle('nStyle', array('size'=>10,'name'=>'Arial CYR'));
 $PHPWord->addParagraphStyle('pRight', array('align'=>'right','spaceAfter'=>0));
 $PHPWord->addParagraphStyle('pRightT', array('align'=>'right','spaceBefore'=>400,'spaceAfter'=>0));
 $PHPWord->addParagraphStyle('pRightB', array('align'=>'right','spaceAfter'=>400,'spaceAfter'=>0));
 $PHPWord->addParagraphStyle('pCenter', array('align'=>'center','spaceAfter'=>0));
 $PHPWord->addParagraphStyle('pLeft', array('align'=>'left','spaceAfter'=>0));
 $PHPWord->addParagraphStyle('pLeftT', array('align'=>'left','spaceBefore'=>400,'spaceAfter'=>0));
 
 $PHPWord->setDefaultFontName('Arial CYR');
 $PHPWord->setDefaultFontSize(10);
 
 
 $section = $PHPWord->createSection(array('marginLeft'=>1100, 'marginRight'=>1100, 'marginTop'=>1100, 'marginBottom'=>1100));
 $section->addText('Test text', 'nStyle', 'pRight');
 $section->addText('Test text №2', 'nStyle', 'pRight');
 
 $textrun = $section->createTextRun('pRight');
 $textrun->addText($data['test']);
 $textrun->addText($data['randParam']);

创建类实例,传递参数给它,然后下载结果文档

$testDoc = new Doc([
   'test' => 'test content',
   'randParam' => 'random param'
]);

$documentManager = new DocumentManager($testDoc);

$documentManager->build()->download();