mvo/contao-content-variants

使用单个整数字段存储内容元素的变体配置。

dev-main 2022-01-19 11:35 UTC

This package is auto-updated.

Last update: 2024-09-19 16:55:45 UTC


README

此DX包简化了处理内容元素二进制变体选项的工作。选定的变体会以位标志的形式存储在 tl_content单个整数列 中。可用的值可以在每个内容元素控制器中定义。

典型的使用场景是预定义的选项,如不同的布局/设计/颜色/……,编辑人员应能够通过选择菜单进行选择。

用法

  1. 为每个变体组向 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时,我们会自动填充相应的选项。

  2. 在您的语言文件中定义标签。默认情况下,将在选项引用的字段名后追加 _

    $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'];
    
    // …
  3. 在片段控制器中实现 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);
        }
    }

    您控制位标志。如果您想在某个时候删除一个选项,只需删除该行并保持其他字段不变。

  4. 在模板中处理变体

    <div>
        {% if variants.effect.highlight %}
            <b>Wow!</b>
        {% endif %}
        
        […]
    </div>