triniti / canvas
v1.0.1
2019-10-29 00:49 UTC
Requires
- php: >=7.1
- gdbots/ncr: ^1.0
- symfony/http-foundation: ^4.2
- triniti/schemas: ^1.0
- twig/twig: ^2.7
Requires (Dev)
- phpunit/phpunit: ^6.4
- triniti/acme-schemas: ^1.0
README
PHP 库,提供 triniti:canvas 架构的实现。使用此库假定您已使用 Pbjc 创建并编译了自己的 pbj 类,并正在使用来自 triniti/schemas 的 "triniti:canvas:mixin:*" 混合。
Symfony 集成
在 Symfony 应用中启用这些服务是通过导入类并让 Symfony 自动配置和自动注入它们来完成的。
config/packages/canvas.yml
services: _defaults: autowire: true autoconfigure: true public: false Triniti\Canvas\: resource: '%kernel.project_dir%/vendor/triniti/canvas/src/**/*'
Twig 扩展
此库提供了一个扩展,目前有一个名为 canvas_render_blocks
的函数。此函数接受一个包含具有 triniti:canvas:mixin:block
混合的消息的块数组和选项数组,用于创建渲染上下文(triniti:common::render-context
的实例)。
如果使用 Symfony 自动注入,则 Twig 扩展将自动可用。
示例
假设我们有一个名为 page
的 acme:canvas:node:page
实例,它有一个名为 blocks
的字段。
# page.html.twig
<html>
<title>{{ page.get('seo_title') }}</title>
</html>
<body>
<h1>{{ page.get('title') }}</h1>
<div class="contents">
{{ canvas_render_blocks(page.get('blocks', []), {
container: page,
section: 'main',
booleans: {
enable_ads: true,
dnt: false,
autoplay_videos: false,
},
strings: {
custom1: 'val1',
custom2: 'val2',
customN: 'val3',
},
}) }}
</div>
</body>
</html>
此函数将使用 Twig 渲染所有块,通过解析上下文和块类型到 Twig 模板。请求的文件名必须在 Twig 命名空间路径 @canvas_blocks
中。所有部分都是可选的,除了平台,默认为 "web"。
使用第一个模板
@canvas_blocks/{$platform}/{$section}/{$blockName}/{$blockName}.{$deviceView}.twig
@canvas_blocks/{$platform}/{$section}/{$blockName}/{$blockName}.twig
@canvas_blocks/{$platform}/{$blockName}/{$blockName}.{$deviceView}.twig
@canvas_blocks/{$platform}/{$blockName}/{$blockName}.twig
@canvas_blocks/{$platform}/missing_block.twig
示例输出
例如
@canvas_blocks/web/blogroll/youtube_video_block/youtube_video_block.smartphone.twig
提供给模板的有效载荷
$twig->render($name, [ 'pbj' => $block, // instance of triniti:canvas:mixin:block 'pbj_name' => $blockName, // e.g. quote_block 'prev_pbj' => $prevBlock, // previous block instance or null 'prev_pbj_name' => $prevBlockName, // previous block name (e.g. youtube_video_block) or null 'next_pbj' => $nextBlock, // next block instance or null 'next_pbj_name' => $nextBlockName, // next block name (e.g. youtube_video_block) or null 'rendered' => $rendered, // a map of the already rendered block names // slug-case and snake_case. e.g. ['page-break-block' => true, 'text-block' => true] 'context' => $context, // instance of triniti:canvas:block:render-context 'idx' => $idx, // array index starting from 1 'is_first' => $isFirst, // bool, true if first block 'is_last' => $isLast, // bool, true if last block 'total_blocks' => $total, // int, total number of blocks being rendered ]);