Magento 2.1 menambahkan masalah tipe komponen baru

15

Saya menambahkan tipe elemen form baru yang disebut Company\Module\Data\Form\Element\PdfButton, ketika itu version EE 2.0.7dan menggunakan elemen ini di tab kustom (ditambahkan dengan mengabaikan Magento\Catalog\Block\Adminhtml\Product\Edit\Tabs) halaman admin edit produk.

Setelah memutakhirkan ke Magento EE 2.1, tab khusus menghilang. Untuk membuatnya muncul, saya menambahkan pengubah untuk membuat tab baru di halaman produk. Saya berhasil menambahkan tab baru dengan menyalin pengubah dalam file vendor dan menyuntikkannya ke modul saya.

Tapi, ketika saya ingin menggunakan elemen kustom saya. Jadi, di bidang anak-anak dari array meta, saya menambahkan kode berikut:

$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',
                        ],
                    ],
                ],
            ];

setelah ini, saya menyalin Form\Element\Wysiwygdan menempelkannya sebagai Form\Element\Wysiwyg2. Di Kelas Wysiwyg2 :

<?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;
    }}

Tetapi ada kesalahan dan saya tidak tahu di mana saya harus menambahkan nama itu.

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
sumber

Jawaban:

0

Sejauh pemahaman saya, Anda mencoba menambahkan tipe komponen Ui baru yang memanggil wysiwyg2 .

Namun sayangnya, ada masalah yang diketahui tentang menambahkan tipe Komponen Ui baru (ya, hanya satu lagi). Anda dapat memeriksa masalah asli overhere .

Mari kita lihat lebih dalam bagaimana Magento 2 berurusan dengan komponen Ui dalam bentuk produk.

vendor / magento / modul-katalog / Ui / DataProvider / Produk / Formulir / Pengubah / 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;
}

Dan di dalam public function setupAttributeMeta(ProductAttributeInterface $attribute, $groupCode, $sortOrder)

Baris 633 (mungkin berbeda untuk setiap versi)

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

Seperti yang Anda lihat, customizeWysiwyg()hard-coded formElementuntukwysiwyg .

Jika Anda ingin wysiwyg2bekerja, Anda perlu menulis plugin untuksetupAttributeMeta() menambahkan sesuatu seperti$meta = $this->customizeWysiwyg2($attribute, $meta);

Tapi saya tidak mendorong ini, Anda hanya dapat membuat preferensi \Magento\Ui\Component\Form\Element\Wysiwyg, lalu di dalam konstruktor Anda dapat melakukan sesuatu seperti

/**
 * 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);
}

Dengan cara ini, Anda dapat memiliki template jsComponent, KO Anda sendiri dll. Dan siap untuk menyesuaikan dengan apa pun yang Anda inginkan.

Semoga ini membantu :)

Toan Nguyen
sumber