spirit-of-wars / docmvc
DocMVC,用于生成文件(Excel、Word、PDF)的MVC库
v1.0.3
2022-03-31 21:25 UTC
Requires
- php: ^7.2 || ^8.0
- dompdf/dompdf: v1.0.2
- phpoffice/phpspreadsheet: 1.18.0
- phpoffice/phpword: 0.18.2
- psr/log: ^1.0
Requires (Dev)
- phpunit/phpunit: ^9.5
README
该库旨在与PDF、Excel、Word等文件协同工作。这是一个关于MVC-model的微型框架。
一般规定
- 要开始使用,您需要创建DocumentManager实例,然后为他下载类卡(class-cartridge)。
- 数据处理、自定义路径和必需参数必须在类卡中完成。
- 有两种生成文档的方法:从头开始渲染文档(使用视图),从现有文档(模板)渲染文档。
- 文档渲染逻辑必须只编写在视图文件(视图)中。
- 使用外部依赖关系来生成视图逻辑。这些库的处理器对象可以通过变量$driver在视图文件中访问。
- Doc/Docx - phpoffice/phpword
- Excel - phpoffice/phpspreadsheet
- Pdf - dompdf/dompdf - 模板是一个尚未包含必要数据的空白文档,但它们将在生成过程中被替换。此类数据仅在模型中定义。(例如:要生成Excel文档,我们创建了一个空白模板.xlsx,然后在其中指定变量值的位置)
要开始使用
- 创建一个共享目录,其中将存储所有内容。我使用了一个名为'document'的目录。
- 在此目录内,您需要再创建一个目录(任意名称)。现在每个这样的目录都将负责其自身的文档。
- 在此目录中,您需要创建类卡。例如,我需要创建一个财务报告文档,格式为doc和pdf。为此,我在Document/目录下创建了Report/目录,并在Document/目录下创建了两个文件:Doc.php(扩展自SpiritOfWars\DocMVC\Cartridge\DocCartridge)和Pdf.php(SpiritOfWars\DocMVC\Cartridge\PdfCartridge)。
- 每个卡都有一个抽象方法,必须定义
- setupView - 必须返回包含视图文件名称和路径的字符串。不能为空! 必须创建视图文件并指定其路径。每个卡还有三个可选方法
- setupModel - 必须返回数据数组。此数据将在视图文件中使用或在填充模板变量中使用。
- setupTemplate - 必须返回包含模板文件名称和路径的字符串。(对pdf-cartridge不可用)
- setupRequiredParams - 必须返回所需参数数组,您希望传递给构造函数。我们只指定那些无法生成文档的参数。如果没有,则不要触摸此方法
- 创建目录view/(在我的例子中:Document/Report/view/)
- 创建任意名称的视图文件(在我的例子中:我创建了Document/Report/view/view-pdf.php来生成pdf文档)
- 在卡的方法setupView中设置视图文件的路径(在我的例子中:return 'view-pdf.php';)。注意!路径必须是相对的。
- 如果您需要通过模板生成,只需重复步骤6、7、8来处理模板名称。创建的目录必须命名为template/。在卡的方法setupTemplate中设置模板文档的路径。注意!路径必须是相对的。
- 视图文件用于HTML布局或通过$driver变量生成。默认情况下,有两个变量$driver - 用于生成文档内容的对象,$model - 包含您在setupModel方法中指定的数据的数组
- 在您的代码的正确位置,我们创建了一个我们创建的卡式实例,将参数数组传递给构造函数,这些参数将通过属性 $this->params 可用(以我的例子为例 $docObj = new(\Document\Report\Doc(['testKey' => 'testValue'])))
- 创建 DocumentManager 实例:new SpiritOfWars\DocMVC\DocumentManager($docObj)。可选:可以将日志对象作为第二个参数传递
- 构建文档 $docObj->build();
- 现在生成的文档可用于下载或保存到目录。方法: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();