Magento 2.1 fügt ein neues Komponententyp-Problem hinzu

15

Ich habe einen neuen Form Elementtyp genannt Company\Module\Data\Form\Element\PdfButton, wenn es version EE 2.0.7und verwendet , um dieses Element in einem benutzerdefinierten Register (ergänzt durch Überschreiben Magento\Catalog\Block\Adminhtml\Product\Edit\Tabs) von Admin - Seite Produkt bearbeiten.

Nach dem Upgrade auf Magento EE 2.1 verschwand die benutzerdefinierte Registerkarte. Damit es angezeigt wird, habe ich einen Modifikator hinzugefügt, um eine neue Registerkarte auf der Produktseite zu erstellen. Ich habe erfolgreich eine neue Registerkarte hinzugefügt, indem ich den Modifikator in die Herstellerdatei kopiert und in mein Modul eingefügt habe.

Aber wenn ich mein benutzerdefiniertes Element verwenden möchte. Also habe ich im Kind-Feld des Meta-Arrays folgenden Code hinzugefügt:

$children[$website['id']] = [
                'arguments' => [
                    'data' => [
                        'config' => [
                            'dataType' => Form\Element\DataType\Number::NAME,
                            'componentType' => Form\Field::NAME,
                            'formElement' => Form\Element\Wysiwyg2::NAME,
                            'description' => __($website['name']),
                            'tooltip' => $tooltip,
                            'sortOrder' => $sortOrder,
                            'dataScope' => 'website_ids.' . $website['id'],
                            'label' => "Pdf Upload",
                            'valueMap' => [
                                'true' => (string)$website['id'],
                                'false' => '0',
                            ],
                            'value' => $isChecked ? (string)$website['id'] : '0',
                        ],
                    ],
                ],
            ];

danach habe ich die kopiert Form\Element\Wysiwygund als einfügen Form\Element\Wysiwyg2. In der Wysiwyg2- Klasse:

<?php

/**
 * Copyright © 2016 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Magento\Ui\Component\Form\Element;

use Magento\Framework\Data\Form\Element\Editor;
use Magento\Framework\Data\Form;
use Magento\Framework\Data\FormFactory;
use Magento\Framework\DataObject;
use Magento\Framework\View\Element\UiComponent\ContextInterface;
use Magento\Ui\Component\Wysiwyg\ConfigInterface;

/**
 * Class Input
 */
class Wysiwyg2 extends AbstractElement
{
    const NAME = 'wysiwyg2';

    /**
     * @var Form
     */
    protected $form;

    /**
     * @var Editor
     */
    protected $editor;

    /**
     * @param ContextInterface $context
     * @param FormFactory $formFactory
     * @param ConfigInterface $wysiwygConfig
     * @param array $components
     * @param array $data
     * @param array $config
     */
    public function __construct(
        ContextInterface $context,
        FormFactory $formFactory,
        ConfigInterface $wysiwygConfig,
        array $components = [],
        array $data = [],
        array $config = []
    ) {
        $wysiwygConfigData = isset($config['wysiwygConfigData']) ? $config['wysiwygConfigData'] : [];
        $this->form = $formFactory->create();
        $this->editor = $this->form->addField(
            $context->getNamespace() . '_' . $data['name'],
            'Magento\Framework\Data\Form\Element\Editor',
            [
                'force_load' => true,
                'rows' => 20,
                'name' => $data['name'],
                'config' => $wysiwygConfig->getConfig($wysiwygConfigData),
                'wysiwyg' => isset($config['wysiwyg']) ? $config['wysiwyg'] : null,
            ]
        );
        $data['config']['content'] = $this->editor->getElementHtml();

        parent::__construct($context, $components, $data);
    }

    /**
     * Get component name
     *
     * @return string
     */
    public function getComponentName()
    {
        return static::NAME;
    }}

Aber es gibt einen Fehler und ich weiß nicht, wo ich den Namen hinzufügen soll.

1 exception(s):
Exception #0 (Magento\Framework\Exception\LocalizedException): The requested component ("wysiwyg2") is not found. Before using, you must add the implementation.

Exception #0 (Magento\Framework\Exception\LocalizedException): The requested component ("wysiwyg2") is not found. Before using, you must add the implementation.
#0 /var/www/vhosts/plchk/vendor/magento/module-ui/Model/Manager.php(207): Magento\Framework\View\Element\UiComponent\Config\Provider\Component\Definition->getComponentData('wysiwyg2')
#1 /var/www/vhosts/plchk/vendor/magento/framework/View/Element/UiComponentFactory.php(187): Magento\Ui\Model\Manager->createRawComponentData('wysiwyg2')
#2 /var/www/vhosts/plchk/vendor/magento/module-ui/Component/Form/Field.php(82): Magento\Framework\View\Element\UiComponentFactory->create(1, 'wysiwyg2', Array)
#3 /var/www/vhosts/plchk/vendor/magento/framework/View/Layout/Generator/UiComponent.php(148): Magento\Ui\Component\Form\Field->prepare()
#4 /var/www/vhosts/plchk/vendor/magento/framework/View/Layout/Generator/UiComponent.php(145): Magento\Framework\View\Layout\Generator\UiComponent->prepareComponent(Object(Magento\Ui\Component\Form\Field))
Yau Thomas
quelle

Antworten:

0

Nach meinem Verständnis versuchen Sie, den gesamten neuen Ui-Komponententyp, der aufruft, hinzuzufügen wysiwyg2.

Leider gibt es ein bekanntes Problem beim Hinzufügen eines neuen UI-Komponententyps (ja, nur ein weiterer). Sie können das ursprüngliche Problem an einer anderen Stelle überprüfen .

Schauen wir uns genauer an, wie Magento 2 mit den Ui-Komponenten in Produktform umgeht.

Anbieter / Magento / Modul-Katalog / Ui / DataProvider / Produkt / Form / Modifier / Eav.php

/**
 * Add wysiwyg properties
 *
 * @param ProductAttributeInterface $attribute
 * @param array $meta
 * @return array
 */
private function customizeWysiwyg(ProductAttributeInterface $attribute, array $meta)
{
    if (!$attribute->getIsWysiwygEnabled()) {
        return $meta;
    }

    $meta['arguments']['data']['config']['formElement'] = WysiwygElement::NAME;
    $meta['arguments']['data']['config']['wysiwyg'] = true;
    $meta['arguments']['data']['config']['wysiwygConfigData'] = [
        'add_variables' => false,
        'add_widgets' => false,
        'add_directives' => true,
        'use_container' => true,
        'container_class' => 'hor-scroll',
    ];

    return $meta;
}

Und drinnen public function setupAttributeMeta(ProductAttributeInterface $attribute, $groupCode, $sortOrder)

Zeile 633 (kann für jede Version unterschiedlich sein)

        case 'textarea':
            $meta = $this->customizeWysiwyg($attribute, $meta);
            break;

Wie Sie sehen können, customizeWysiwyg()hartcodiert formElementzu wysiwyg.

Wenn du arbeiten willst wysiwyg2, musst du ein Plugin schreiben setupAttributeMeta(), um so etwas hinzuzufügen$meta = $this->customizeWysiwyg2($attribute, $meta);

Aber ich ermutige dies nicht, Sie können nur eine Präferenz für erstellen \Magento\Ui\Component\Form\Element\Wysiwyg, dann können Sie im Konstruktor so etwas tun

/**
 * Wysiwyg constructor.
 *
 * @param \Magento\Framework\View\Element\UiComponent\ContextInterface $context
 * @param \Magento\Framework\Data\FormFactory                          $formFactory
 * @param \Magento\Ui\Component\Wysiwyg\ConfigInterface                $wysiwygConfig
 * @param array                                                        $components
 * @param array                                                        $data
 * @param array                                                        $config
 */
public function __construct(
    ContextInterface $context,
    FormFactory $formFactory,
    ConfigInterface $wysiwygConfig,
    array $components = [],
    array $data = [],
    array $config = []
) {
    // Override the component for the WYSIWYG
    // This is not done using definition.xml due to https://github.com/magento/magento2/issues/5647
    $data['config']['component'] = 'Stackoverflow_Toan/js/form/element/wysiwyg';

    // Override the templates to include our KnockoutJS code
    $data['config']['template'] = 'Stackoverflow_Toan/wysiwyg';
    $data['config']['elementTmpl'] = 'Stackoverflow_Toan/wysiwyg';

    parent::__construct($context, $formFactory, $wysiwygConfig, $components, $data, $config);
}

Auf diese Weise können Sie Ihre eigenen jsComponent-, Knockout-Vorlagen usw. erstellen und nach Belieben anpassen.

Hoffe das hilft :)

Toan Nguyen
quelle