oblik / kirby-walker
Kirby 3 插件,用于导出、导入和遍历网站内容。
3.0.0
2022-10-06 10:18 UTC
Requires
- getkirby/cms: ^3.4
- getkirby/composer-installer: ^1.1
- league/html-to-markdown: ^4.8
Requires (Dev)
- getkirby/editor: ^1.0
- oblik/kirby-link-field: ^3.0
- phpunit/phpunit: ^8
README
插件,允许您根据指定的蓝图遍历、导出和导入所有网站数据。它是为了作为其他插件的依赖项而创建的。特性
- 基于字段序列化内容(解析结构中的 YAML,将逗号分隔的标签字段转换为数组等)
- 将 KirbyTags 转换为 XML 并返回(供不认识 KirbyTag 语法的其他 API 使用)
- 将 Markdown 转换为 HTML 并返回(供不与 Markdown 一起工作的 API 使用)
- 导出整个网站、页面和文件模型
- 使用与导出相同的模式导入内容
- 根据其
id
字段遍历块和结构(如果它们有这样的字段) - 易于扩展 PHP 类以实现自定义行为
- 支持已弃用的 Kirby Editor
安装
通过 Composer 从 oblik/kirby-walker on Packagist
composer require oblik/kirby-walker
使用方法
导出
您可以使用 Exporter
类来导出内容
use Oblik\Walker\Walker\Exporter; $exporter = new Exporter(); $result = $exporter->walk(page('home')); echo json_encode($result, JSON_PRETTY_PRINT);
{ "title": "Home", "headline": "Welcome to Kirby's Starterkit", "subheadline": "A fully documented example project" }
导入
您可以使用 Importer
类将输入内容与当前模型内容合并。
use Oblik\Walker\Walker\Importer; $importer = new Importer(); $model = page('home'); $result = $importer->walk($model, [ 'input' => [ 'headline' => 'Updated headline!' ] ]); echo json_encode($data, JSON_PRETTY_PRINT);
{ "title": "Home", "headline": "Updated headline!", "subheadline": "A fully documented example project" }
合并数据后,您可以使用生成的数组将更改应用到模型上
kirby()->impersonate('kirby'); $model->update($result);
选项
有一些选项允许您转换原始内容,使其更适合其他系统。然后,插件可以将重新格式化的内容转换回其原始格式,同时保留对其所做的任何更改。
解析 KirbyTags
将 KirbyTags 转换为 XML
Subheadline: A fully (link: https://getkirby.com/docs/guide text: documented target: _blank) example project
$exporter->walk(page('home'), [ 'options' => [ 'parseKirbyTags' => true ] ]);
{ "subheadline": "A fully <kirby link=\"https://getkirby.com/docs/guide\" text=\"documented\" target=\"_blank\"/> example project" }
默认情况下,KirbyTag 属性被编码为 XML 属性。如果消费系统需要操作这些值(例如,翻译它们),您可能需要将它们的内容从标签中移出。而不是这样
<kirby link="https://getkirby.com/docs/guide" text="documented" target="_blank"/>
…您可能需要这样
<kirby link="https://getkirby.com/docs/guide" target="_blank"> <value name="text" index="1">documented</value> </kirby>
要这样做,只需使用 externalAttributes
设置
$exporter->walk(page('home'), [ 'options' => [ 'parseKirbyTags' => [ 'externalAttributes' => ['text'] ] ] ]);
{ "subheadline": "A fully <kirby link=\"https://getkirby.com/docs/guide\" target=\"_blank\"><value name=\"text\" index=\"1\">documented</value></kirby> example project" }
解析 Markdown
如果消费系统不理解 Markdown,您可以将其转换为 HTML
Text:
# Hello World
This is a fully **documented** example project!
$exporter->walk(page('home'), [ 'options' => [ 'parseMarkdown' => true ] ]);
{ "text": "<h1>Hello World</h1><p>This is a fully <strong>documented</strong> example project!</p>" }
注意: 这仅适用于 textarea
字段类型。
解析模板
将花括号内的内容转换为 XML
Title: {{ site.title }} Home
$exporter->walk(page('home'), [ 'options' => [ 'parseTemplates' => true ] ]);
{ "title": "<meta template=\" site.title \"/> Home" }
扩展
您可以通过扩展基本类轻松添加自定义行为。例如,您可以像这样返回每个字段的字符长度
use Oblik\Walker\Walker\Walker; class CustomWalker extends Walker { protected function walkText(string $text, $context) { return strlen($text); } } $walker = new CustomWalker(); $data = $walker->walk(page('home')); echo json_encode($data, JSON_PRETTY_PRINT);
{ "title": 4, "headline": 29, "subheadline": 34 }
您还可以使用每个字段的蓝图中的值
class CustomWalker extends Walker { protected function walkField(Field $field, $context) { return $context['blueprint']['label'] ?? 'NONE'; } }
{ "title": "NONE", "headline": "Headline", "gap": "Gap", "subheadline": "Subheadline" }
酷的部分是,解析结构字段的 YAML 和布局及块字段的 JSON 已经处理好了。您的自定义逻辑将自动适用于所有嵌套字段。
针对字段类型的单独逻辑
您可以通过添加 walkField{{ field type }}
方法为不同的字段类型提供不同的逻辑。例如,您可以通过添加 walkFieldGap
只更改 gap
字段的行为
class CustomWalker extends Walker { protected function walkFieldGap($field, $context) { return 'Mind the gap!'; } }
{ "title": "Home", "headline": "Welcome to Kirby's Starterkit", "gap": "Mind the gap!", "subheadline": "A fully documented example project" }