mvo / contao-content-variants
使用单个整数字段存储内容元素的变体配置。
dev-main
2022-01-19 11:35 UTC
Requires
- php: >=8.0
- contao/core-bundle: ^4.9
- doctrine/dbal: ^2.10 || ^3.0
Requires (Dev)
- contao/easy-coding-standard: ^3.0
- contao/manager-plugin: ^2.0
Conflicts
- contao/manager-plugin: <2.0 || >=3.0
This package is auto-updated.
Last update: 2024-09-19 16:55:45 UTC
README
此DX包简化了处理内容元素二进制变体选项的工作。选定的变体会以位标志的形式存储在 tl_content
的 单个整数列 中。可用的值可以在每个内容元素控制器中定义。
典型的使用场景是预定义的选项,如不同的布局/设计/颜色/……,编辑人员应能够通过选择菜单进行选择。
用法
-
为每个变体组向
tl_content
字段部分添加variantSelect
字段。不要包含SQL定义$GLOBALS['TL_DCA']['tl_content']['fields']['effect'] = [ 'inputType' => 'variantSelect', 'eval' => [ 'tl_class' => 'w50', ], ]; $GLOBALS['TL_DCA']['tl_content']['fields']['layout'] = [ 'inputType' => 'variantSelect', 'eval' => [ 'tl_class' => 'w50', ], ];
然后像往常一样添加字段到调色板中。
variantSelect
基本上是一个选择菜单 - 当你在后端访问DCA时,我们会自动填充相应的选项。 -
在您的语言文件中定义标签。默认情况下,将在选项引用的字段名后追加
_
$GLOBALS['TL_LANG']['tl_content']['effect'] = ['Effect', 'Visual variant']; $GLOBALS['TL_LANG']['tl_content']['effect_']['default'] = ['Default']; $GLOBALS['TL_LANG']['tl_content']['effect_']['popup'] = ['Popup']; $GLOBALS['TL_LANG']['tl_content']['effect_']['highlight'] = ['Highlight']; // …
-
在片段控制器中实现
VariantsInterface
并使用VariantsTrait
。然后您可以像这样定义变体组和它们的位标志值/** * @ContentElement(category="texts") */ class MyTextFragment extends AbstractContentElementController implements VariantsInterface { use VariantsTrait; public function getVariants(): array { return [ 'effect' => [ 'default' => (1<<0), 'popup' => (1<<1), 'highlight' => (1<<2), ], 'layout' => [ 'default' => (1<<3), 'centered' => (1<<4), 'align_left' => (1<<5), 'align_right' => (1<<6), ], ]; } protected function getResponse(Template $template, ContentModel $model, Request $request): ?Response { $context = [ 'text' => $model->text, 'variants' => $this->getVariantsMap($model), ]; return $this->render('@Contao/my_text.html.twig', $context); } }
您控制位标志。如果您想在某个时候删除一个选项,只需删除该行并保持其他字段不变。
-
在模板中处理变体
<div> {% if variants.effect.highlight %} <b>Wow!</b> {% endif %} […] </div>