Magento 2.1 yeni bileşen tipi problemi ekleme


16

Ne Company\Module\Data\Form\Element\PdfButtonzaman, adı verilen yeni bir form öğesi türü ekledim version EE 2.0.7ve bu öğeyi Magento\Catalog\Block\Adminhtml\Product\Edit\Tabs, ürün düzenleme yönetici sayfasının özel bir sekmesinde (geçersiz kılınarak eklenmiş ) kullandım.

Magento EE 2.1'e yükselttikten sonra özel sekme kayboldu. Görünmesini sağlamak için ürün sayfasında yeni bir sekme yapmak üzere bir değiştirici ekledim. Satıcı dosyasını değiştiriciyi kopyalayıp modülüme enjekte ederek yeni bir sekme başarıyla ekledim.

Ancak, özel öğemi kullanmak istediğimde. Yani, meta dizinin alt alanına aşağıdaki kodu ekledim:

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

Bundan sonra kopyaladım Form\Element\Wysiwygve yapıştırdım Form\Element\Wysiwyg2. In WYSIWYG2 Sınıf:

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

Ancak bir hata var ve adı nereye eklemem gerektiğini bilmiyorum.

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))

Yanıtlar:


1

Anladığım kadarıyla, çağıran tüm yeni Ui bileşen türünü eklemeye çalışıyorsunuz wysiwyg2.

Ancak ne yazık ki, yeni Ui Bileşen türü ekleme konusunda bilinen bir sorun var (evet, sadece başka bir tane). Orijinal sorunu tekrar gözden geçirebilirsiniz .

Magento 2'nin ürün formundaki Ui bileşenleri ile nasıl başa çıktığına daha yakından bakalım.

satıcı / Magento / modül-katalog / Ui / DataProvider'ın / Ürün / Form / değiştirici / 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;
}

Ve içeride public function setupAttributeMeta(ProductAttributeInterface $attribute, $groupCode, $sortOrder)

Satır 633 (her sürüm için farklı olabilir)

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

Gördüğünüz gibi, customizeWysiwyg()sabit kodlanmış formElementiçin wysiwyg.

Çalışmak istiyorsanız wysiwyg2, setupAttributeMeta()benzer bir şey eklemek için bir eklenti yazmanız gerekir$meta = $this->customizeWysiwyg2($attribute, $meta);

Ama bunu teşvik etmiyorum, sadece bir tercih oluşturabilirsin \Magento\Ui\Component\Form\Element\Wysiwyg, sonra yapıcı içinde böyle bir şey yapabilirsin

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

Bu şekilde, kendi jsComponent'ine, nakavt şablonlarına sahip olabilirsiniz .. vb ve istediğiniz her şeyi özelleştirmeye hazırsınız.

Bu yardımcı olur umarım :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.