Wie können die Felder des Feldsatzes multidependierbar gemacht werden?

7

Ich habe ein Feldset im Admin-Bereich mit einer übergeordneten Auswahl (hat 5 Optionen) und 2 Feldern , die angezeigt werden sollten, falls die übergeordnete Wertauswahl 3, 4 oder 5 sein soll. Ich habe die Beispiele für eine ähnliche Logik in Magento nicht gefunden und versuchte, analog mit der üblichen Abhängigkeit zu schreiben, aber es funktioniert nicht. In meinem Beispiel werden die abhängigen Felder nur angezeigt, wenn Sie die Optionen mit dem Wert 5 aus der Auswahl auswählen. Sie werden nicht angezeigt, wenn Sie 1, 2, 3 oder 4 auswählen.

Vollständiger Code (Blockbeispiel):

<?php

namespace Siarhey\Test\Block\Adminhtml\Promo\Quote\Edit\Tab;

class Actions extends \Magento\Backend\Block\Widget\Form\Generic implements
    \Magento\Backend\Block\Widget\Tab\TabInterface
{
    /**
     * @param \Magento\Backend\Block\Template\Context $context
     * @param \Magento\Framework\Registry $registry
     * @param \Magento\Framework\Data\FormFactory $formFactory
     * @param array $data
     */
    public function __construct(
        \Magento\Backend\Block\Template\Context $context,
        \Magento\Framework\Registry $registry,
        \Magento\Framework\Data\FormFactory $formFactory,
        array $data = []
    ) {
        parent::__construct($context, $registry, $formFactory, $data);
    }

    public function getTabLabel()
    {
        return __('Actions');
    }

    public function getTabTitle()
    {
        return __('Actions');
    }

    public function canShowTab()
    {
        return true;
    }

    public function isHidden()
    {
        return false;
    }

    protected function _prepareForm()
    {
        $model = $this->_coreRegistry->registry('current_promo_quote_rule');

        /** @var \Magento\Framework\Data\Form $form */
        $form = $this->_formFactory->create();
        $form->setHtmlIdPrefix('rule_');

        $fieldset = $form->addFieldset(
            'action_fieldset',
            ['legend' => __('Rules')]
        );

        $parentField = $fieldset->addField(
            'simple_action',
            'select',
            [
                'label' => __('Apply'),
                'name' => 'simple_action',
                'options' => [
                    1 => __('Amount 1'),
                    2 => __('Discount 1'),
                    3 => __('Amount 2'),
                    4 => __('Discount 2'),
                ]
            ]
        );

        $childFieldOne = $fieldset->addField(
            'amount',
            'text',
            [
                'name' => 'amount',
                'required' => true,
                'class' => 'validate-not-negative-number',
                'label' => __('Amount')
            ]
        );
        $model->setAmount($model->getAmount() * 1);

        $childFieldTwo = $fieldset->addField(
            'percent',
            'text',
            ['name' => 'percent', 'label' => __('Percent')]
        );
        $model->setPercent($model->getPercent() * 1);

        $this->setChild(
            'form_after',
            $this->getLayout()->createBlock(
                'Magento\Backend\Block\Widget\Form\Element\Dependence'
            )->addFieldMap(
                $parentField->getHtmlId(),
                $parentField->getName()
            )->addFieldMap(
                $childFieldOne->getHtmlId(),
                $childFieldOne->getName()
            )->addFieldMap(
                $childFieldTwo->getHtmlId(),
                $childFieldTwo->getName()
            )->addFieldDependence(
                $childFieldOne->getName(),
                $parentField->getName(),
                '1,3'
            )->addFieldDependence(
                $childFieldTwo->getName(),
                $parentField->getName(),
                '2,4'
            )
        );

        $form->setValues($model->getData());

        if ($model->isReadonly()) {
            foreach ($fieldset->getElements() as $element) {
                $element->setReadonly(true, true);
            }
        }

        $this->setForm($form);
        return parent::_prepareForm();
    }
}

Ergebnis (Ansicht):

Option 1
Option 1 ausgewählt

Option 4 Option 4 ausgewählt

Ohne Abhängigkeit Ohne Abhängigkeit

Codebeispiel 1 (funktioniert nicht):

/*
 * $parentField is select with values (0,1,2,3,4,5)
 */
$this->setChild(
    'form_after',
    $this->getLayout()->createBlock(
        'Magento\Backend\Block\Widget\Form\Element\Dependence'
    )->addFieldMap(
        $parentField->getHtmlId(),
        $parentField->getName()
    )->addFieldMap(
        $childFieldOne->getHtmlId(),
        $childFieldOne->getName()
    )->addFieldDependence(
        $childFieldOne->getName(),
        $parentField->getName(),
        '3'
    )->addFieldDependence(
        $childFieldOne->getName(),
        $parentField->getName(),
        '4'
    )->addFieldDependence(
        $childFieldOne->getName(),
        $parentField->getName(),
        '5'
    )->addFieldMap(
        $parentField->getHtmlId(),
        $parentField->getName()
    )->addFieldMap(
        $childFieldTwo->getHtmlId(),
        $childFieldTwo->getName()
    )->addFieldDependence(
        $childFieldTwo->getName(),
        $parentField->getName(),
        '3'
    )->addFieldDependence(
        $childFieldTwo->getName(),
        $parentField->getName(),
        '4'
    )->addFieldDependence(
        $childFieldTwo->getName(),
        $parentField->getName(),
        '5'
    )
);

Codebeispiel 2 (funktioniert nicht):

/*
 * $parentField is select with values (0,1,2,3,4,5)
 */
$this->setChild(
    'form_after',
    $this->getLayout()->createBlock(
        'Magento\Backend\Block\Widget\Form\Element\Dependence'
    )->addFieldMap(
        $parentField->getHtmlId(),
        $parentField->getName()
    )->addFieldMap(
        $childFieldOne->getHtmlId(),
        $childFieldOne->getName()
    )->addFieldMap(
        $parentField->getHtmlId(),
        $parentField->getName()
    )->addFieldMap(
        $childFieldTwo->getHtmlId(),
        $childFieldTwo->getName()
    )->addFieldDependence(
        $childFieldOne->getName(),
        $parentField->getName(),
        array('3', '4', '5')
    )->addFieldDependence(
        $childFieldTwo->getName(),
        $parentField->getName(),
        array('3', '4', '5')
    )
);

Ergebnis:

Hinweis: Konvertierung von Array in Zeichenfolge in /var/www/magento2/app/code/Magento/Backend/Block/Widget/Form/Element/Dependence.php in Zeile 95

AKTUALISIEREN:


Codebeispiel 3 (funktioniert nicht, wenn der ausgewählte Wert nicht ist '3,4,5'):

// Parent field
$typeField = $fieldset->addField(
    'action_type',
    'select',
    [
        'label' => __('Type'),
        'name' => 'action_type',
        'options' => ['1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5, '3,4,5' => '3,4,5']
    ]
);

$this->setChild(
    'form_after',
    $this->getLayout()->createBlock(
        'Magento\Backend\Block\Widget\Form\Element\Dependence'
    )->addFieldMap(
        $parentField->getHtmlId(),
        $parentField->getName()
    )->addFieldMap(
        $childFieldOne->getHtmlId(),
        $childFieldOne->getName()
    )->addFieldMap(
        $typeField->getHtmlId(),
        $typeField->getName()
    )->addFieldMap(
        $childFieldTwo->getHtmlId(),
        $childFieldTwo->getName()
    )->addFieldDependence(
        $childFieldOne->getName(),
        $parentField->getName(),
        '3,4,5'
    )->addFieldDependence(
        $childFieldTwo->getName(),
        $parentField->getName(),
        '3,4,5'
    )
);

Hat sich jemand dem gleichen Problem gestellt und eine Lösung gefunden?

Aktualisieren:

Vielleicht kann jemand anderes das Vorhandensein dieses Problems überprüfen? Ich habe es bei 3 verschiedenen Installationen überprüft und diese Lösung (die Zeile mit den durch Koma getrennten Werten) funktioniert immer noch nicht.

Siarhey Uchukhlebau
quelle
Könnten Sie Ihren Code voll zeigen, es funktioniert für mich.
Sohel Rana
@SohelRana Ich muss es jetzt reproduzieren (ich bin zu Hause). Ich werde es in ungefähr einer Stunde veröffentlichen können. Vielen Dank für
Ihre
@SohelRana Ich habe meine Frage mit dem Code des Blocks und Screenshots (Ergebnis)
aktualisiert
Überprüfen Sie die aktualisierte Antwort.
Sohel Rana
Ich überprüfe es einfach mit M2.0.4 und es funktioniert
Sohel Rana

Antworten:

6

Wenn Sie den Code überprüfen, der für das Hinzufügen der entsprechenden Felder gemäß den Abhängigkeiten in der Datei verantwortlich ist lib/web/mage/adminhtml/form.js, wird dort das folgende Schema angezeigt:

    var shouldShowUp = true;
    for (var idFrom in valuesFrom) {
        var from = $(idFrom);
        if (from) {
            var values = valuesFrom[idFrom]['values'];
            var isInArray = values.indexOf(from.value) != -1;
            var isNegative = valuesFrom[idFrom]['negative'];
            if (!from || isInArray && isNegative || !isInArray && !isNegative) {
                shouldShowUp = false;
            }
        }
    }

Wenn Sie durch Kommas getrennte Werte festlegen, zum Beispiel:

    /** @var \Magento\Backend\Block\Widget\Form\Element\Dependence $blockDependence */
    $blockDependence->addFieldMap(
        $actionType->getHtmlId(),
        $actionType->getName()
    )->addFieldMap(
        $amountField->getHtmlId(),
        $amountField->getName()
    )->addFieldDependence(
        $amountField->getName(),
        $actionType->getName(),
        implode(',', array(
            Rule::ACTION_TYPE_OVERWRITE_COST,
            Rule::ACTION_TYPE_ADD_SURCHARGE,
            Rule::ACTION_TYPE_ENABLE_SM_AND_OVERWRITE_COST
        ))
    );

Während des Debuggens sehen Sie dann, dass indexOfversucht wird, den vorhandenen Wert im Ein-Element-Array zu finden, das in Ihrem Fall ein durch Kommas getrennter Wert ist. Dieses Element kann nicht gefunden werden:

Geben Sie hier die Bildbeschreibung ein

Eine schrittweise Ausgabe console.logder Methode:

console.log(values);
console.log('Value: '+from.value);
console.log('Is in array: '+isInArray);

Um Felder mit mehreren Abhängigkeiten zu erstellen, können Sie denselben durch Komas getrennten Wert verwenden, jedoch mit einigen Änderungen. Sie benötigen nur den Block, der erweitert wird \Magento\Backend\Block\Widget\Form\Element\Dependence:

<?php

namespace Vendor\Module\Block\Widget\Form\Element;

/**
 * Form element dependencies mapper
 * Assumes that one element may depend on other element values.
 * Will toggle as "enabled" only if all elements it depends from toggle as true.
 */
class Dependence extends \Magento\Backend\Block\Widget\Form\Element\Dependence
{
    /**
     * @param \Magento\Backend\Block\Context $context
     * @param \Magento\Framework\Json\EncoderInterface $jsonEncoder
     * @param \Magento\Config\Model\Config\Structure\Element\Dependency\FieldFactory $fieldFactory
     * @param array $data
     */
    public function _construct(
        \Magento\Backend\Block\Context $context,
        \Magento\Framework\Json\EncoderInterface $jsonEncoder,
        \Magento\Config\Model\Config\Structure\Element\Dependency\FieldFactory $fieldFactory,
        array $data = []
    )
    {
        parent::_construct($context, $jsonEncoder, $fieldFactory, $data);
    }

    /**
     * {@inheritdoc}
     */
    protected function _toHtml()
    {
        if (!$this->_depends) {
            return '';
        }

        return '<script>
                require(["uiRegistry", "mage/adminhtml/form"], function(registry) {
                    var controller = new FormElementDependenceController(' . $this->_getDependsJson() .
        ($this->_configOptions ? ', ' .
            $this->_jsonEncoder->encode(
                $this->_configOptions
            ) : '') . ');
                    registry.set("formDependenceController", controller);
                });</script>';
    }

    /**
     * Field dependences JSON map generator * @return string
     */
    protected function _getDependsJson()
    {
        $result = [];
        foreach ($this->_depends as $to => $row) {
            foreach ($row as $from => $field) {
                $values = $this->_prepareValues($field->getValues());
                /** @var $field \Magento\Config\Model\Config\Structure\Element\Dependency\Field */
                $result[$this->_fields[$to]][$this->_fields[$from]] = [
                    'values' => $values,
                    'negative' => $field->isNegative(),
                ];
            }
        }
        return $this->_jsonEncoder->encode($result);
    }

    /**
     * @param $values
     * @return array
     */
    protected function _prepareValues($values)
    {
        if (!is_array($values)) {
            return $values;
        }

        $result = array();
        foreach ($values as $value) {
            if (stripos($value, ',')) {
                $result += explode(',', $value);
            } else {
                $result += $value;
            }
        }

        return $result;
    }
}

Wie Sie sehen können, wird der Wert gezwungen, in ein Array mit einem Wert geändert zu werden.

Das Hauptproblem liegt in addFieldDependenceder Klasse \Magento\Backend\Block\Widget\Form\Element\Dependence:

Der Punkt ist, dass der Wert (die Linie aus der Abhängigkeit) als einziges Element des Arrays übertragen wird. indexOfversucht, den Wert der entsprechenden ausgewählten Option zu finden, findet jedoch keine genaue Übereinstimmung. Infolgedessen wird "false" zurückgegeben.

Es gibt auch keine Möglichkeit, die Werte als Array zu übertragen, da PHP die Werte Notice: Array to string conversionaufgrund der Konvertierung von zurückgibt 'value' => (string)$refField.

In unserem Beispiel haben wir das Ein-Element-Array in ein Mehr-Element-Array umgewandelt, wobei jedes Element aus mehreren Abhängigkeiten besteht.

Der Code Ihrer Abhängigkeit sollte geändert werden (Sie müssen den Block ändern). So geht's:

// Dependency START
/** @var \Magento\Backend\Block\Widget\Form\Element\Dependence $blockDependence */
$blockDependence = $this->getLayout()->createBlock(
// 'Magento\Backend\Block\Widget\Form\Element\Dependence'
'{Vendor}\{Module}\Block\Widget\Form\Element\Dependence'
);

$blockDependence->addFieldMap(
    $parentField->getHtmlId(),
    $parentField->getName()
)->addFieldMap(
    $childFieldOne->getHtmlId(),
    $childFieldOne->getName()
)->addFieldMap(
    $childFieldTwo->getHtmlId(),
    $childFieldTwo->getName()
)->addFieldDependence(
    $childFieldOne->getName(),
    $parentField->getName(),
    '1,3'
)->addFieldDependence(
    $childFieldTwo->getName(),
    $parentField->getName(),
    '2,4'
);

$this->setChild('form_after', $blockDependence);
// Dependency END

Das Ergebnis sollte folgendermaßen aussehen:

Geben Sie hier die Bildbeschreibung ein

UPD

Wenn Sie sicher sind, dass Sie in Zukunft einen durch Kommas getrennten Wert verwenden werden, fügen Sie UNIQUE_DELIMITERder Klasse am besten die Konstante mit dem erforderlichen Wert des Trennzeichens hinzu Vendor\Module\Block\Widget\Form\Element\Dependence: ZB

const UNIQUE_DELIMITER = '~#!~';

Ändern Sie als Nächstes die Partitionsmethode:

/**
 * @param $values
 * @return array
 */
protected function _prepareValues($values)
{
    if (!is_array($values)) {
        return $values;
    }

    $result = array();
    foreach ($values as $value) {
        if (stripos($value, self::UNIQUE_DELIMITER)) {
            $result += explode(self::UNIQUE_DELIMITER, $value);
        } else {
            $result += $value;
        }
    }

    return $result;
}

Dann verwenden Sie Vendor\Module\Block\Widget\Form\Element\Dependence::UNIQUE_DELIMITERin Ihrer Klasse Actions.

Fügen Sie zur Vereinfachung die Klasse hinzu Dependence(nach dem Namespace):

use Vendor\Module\Block\Widget\Form\Element\Dependence;

Und schreiben Sie den Code folgendermaßen:

 // Dependency START
    /** @var \Magento\Backend\Block\Widget\Form\Element\Dependence $blockDependence */
    $blockDependence = $this->getLayout()->createBlock(
    // 'Magento\Backend\Block\Widget\Form\Element\Dependence'
        '{Vendor}\{Module}\Block\Widget\Form\Element\Dependence'
    );

    $childFieldOneToParentValues = implode(Dependence::UNIQUE_DELIMITER, array('1','3'));
    $childFieldTwoToParentValues = implode(Dependence::UNIQUE_DELIMITER, array('2','4'));

    $blockDependence->addFieldMap(
        $parentField->getHtmlId(),
        $parentField->getName()
    )->addFieldMap(
        $childFieldOne->getHtmlId(),
        $childFieldOne->getName()
    )->addFieldMap(
        $childFieldTwo->getHtmlId(),
        $childFieldTwo->getName()
    )->addFieldDependence(
        $childFieldOne->getName(),
        $parentField->getName(),
        $childFieldOneToParentValues
    )->addFieldDependence(
        $childFieldTwo->getName(),
        $parentField->getName(),
        $childFieldTwoToParentValues
    );

    $this->setChild('form_after', $blockDependence);
    // Dependency END
MageWorx
quelle
2
Schöne Erklärung, ich frage mich nur, was passieren würde, wenn einer der Werte eine Zeichenfolge ist, die ein Komma enthält. Sagen wir "15,50". Wird der Code das noch als zwei Werte behandeln oder richtig als einen Wert?
Raphael bei Digital Pianism
@ RaphaelatDigitalPianism Angemessene Frage :)
Siarhey Uchukhlebau
Vielen Dank für Ihre Antwort! Ich werde heute versuchen, diese Lösung zu implementieren und zu überprüfen. Es ist großartig, wenn Sie Ihre Antwort mit einer Lösung für den Fall Raphael aktualisieren können.
Siarhey Uchukhlebau
@RaphaelatDigitalPianism Wir haben unsere Antwort aktualisiert (sorry, zuerst haben wir sie fälschlicherweise in den falschen Thread gepostet). :)
MageWorx
@MageWorx Jetzt habe ich es überprüft und es funktioniert. Vielen Dank für Ihre Hilfe :)
Siarhey Uchukhlebau
2

Ich kann mich irren, aber leider glaube ich nicht, dass Sie mit der Standardklasse können Magento\Backend\Block\Widget\Form\Element\Dependence.

Lassen Sie mich erklären:

Die addFieldDependenceMethode sieht folgendermaßen aus:

public function addFieldDependence($fieldName, $fieldNameFrom, $refField)
{
    if (!is_object($refField)) {
        /** @var $refField \Magento\Config\Model\Config\Structure\Element\Dependency\Field */
        $refField = $this->_fieldFactory->create(
            ['fieldData' => ['value' => (string)$refField], 'fieldPrefix' => '']
        );
    }
    $this->_depends[$fieldName][$fieldNameFrom] = $refField;
    return $this;
}

Angenommen, Sie versuchen diesen Code:

addFieldDependence($child,$parent,'2,4')

Die valuevon der $refFieldwird die folgende Zeichenfolge sein: 2,4so wie es kein solcher Wert in Ihrer Auswahl ist es wird nie funktionieren.

Wenn Sie diesen Code versuchen:

addFieldDependence($child,$parent,array('2,4'))

Sie erhalten den Array to string conversionFehler aufgrund des (string)$refFieldCodes

Wenn Sie diesen Code versuchen:

addFieldDependence($child,$parent,'2')->addFieldDependence($child,$parent,'4')

Beim ersten Aufruf wird $refFieldder Wert auf 2 gesetzt und mit dem folgenden Code den Abhängigkeiten zugewiesen:

$this->_depends[$fieldName][$fieldNameFrom] = $refField;

Der zweite Code überschreibt diese Abhängigkeit jedoch, da die Variablen $fieldNameund $fieldNameFromdie gleichen sind wie beim ersten Aufruf.

Welche Lösungen haben Sie?

  • Verwenden Sie Einstellungen oder Plugins, um das Verhalten der Magento\Backend\Block\Widget\Form\Element\DependenceKlasse zu ändern

Die wichtigen Methoden, die hier zu betrachten sind, sind addFieldDependenceund _getDependsJson. Das Problem hierbei ist, dass es viele Möglichkeiten gibt, dass Sie auch die JavaScript- FormElementDependenceControllerKlasse ändern müssen , die die Abhängigkeiten behandelt.

  • Verwenden Sie mehrere doppelte Felder mit unterschiedlichen Namen: Nun, das ist schmutzig, aber ich denke, das würde funktionieren.

Beispiel:

    $parentField = $fieldset->addField(
        'simple_action',
        'select',
        [
            'label' => __('Apply'),
            'name' => 'simple_action',
            'options' => [
                1 => __('Amount 1'),
                2 => __('Discount 1'),
                3 => __('Amount 2'),
                4 => __('Discount 2'),
            ]
        ]
    );

    $childFieldOne = $fieldset->addField(
        'amount',
        'text',
        [
            'name' => 'amount',
            'required' => true,
            'class' => 'validate-not-negative-number',
            'label' => __('Amount')
        ]
    );

    $childFieldOneCopy = $fieldset->addField(
        'amount',
        'text',
        [
            'name' => 'amount',
            'required' => true,
            'class' => 'validate-not-negative-number',
            'label' => __('Amount')
        ]
    );

Dann benutze:

->addFieldDependence(
            $childFieldOne->getName(),
            $parentField->getName(),
            '1'
        )    
->addFieldDependence(
            $childFieldOneCopy->getName(),
            $parentField->getName(),
            '3'
        )

Das Problem hierbei ist, dass Sie dem Controller, der die Daten verarbeitet, mehrere Überprüfungen hinzufügen müssen, um sicherzustellen, dass Sie die richtigen Daten und nicht das versteckte Kopierfeld verarbeiten.

Raphael beim digitalen Pianismus
quelle
Vielen Dank für Ihre Antwort. Jetzt ist es klarer. Welche Lösung ist Ihrer Meinung nach besser: Verwenden Sie mehrere Felder oder erstellen Sie einen eigenen Form\Element\DependenceBlock?
Siarhey Uchukhlebau
1
@SiarheyUchukhlebau Wie ich in meiner Antwort sagte, ist das Erstellen Ihrer eigenen Form\Element\Dependencedie Art und Weise, wie es gemacht werden sollte. Das Problem ist, dass die Entwicklung einer solchen Funktion möglicherweise lange dauert, da Sie mit vielen verschiedenen Dateien arbeiten müssen. Die Lösung für mehrere Felder ist schmutziger, aber ich bin mir ziemlich sicher, dass Sie mit dieser Methode schnell das bekommen, was Sie wollen, und es wird funktionieren, ohne dass irgendetwas
kaputt geht
2

Ich denke, dass Sie Klasse aussehen sollten Magento\Backend\Block\Widget\Form\Element\Dependence. Sie können Ihren eigenen Block erstellen, der von dieser Klasse geerbt wurde, und ihn nach Ihren Wünschen umschreiben. In Ihrem Code ersetzt Blockaufruf:

$this->getLayout()->createBlock(
    'Magento\Backend\Block\Widget\Form\Element\Dependence'
)

zu:

this->getLayout()->createBlock(
    'Siarhey\Test\Block\Widget\Form\Element\Dependence'
)

Erstellen Sie einen Block, Siarhey\Test\Block\Widget\Form\Element\Dependenceund Sie können darin Ihre Überprüfungslogik implementieren.

Es ist nur ein Rat. Ich hoffe es hilft dir.

Eugene
quelle
2

Erstellen Sie eine di.xml unter adminhtml und fügen Sie folgenden Code hinzu:

Grundsätzlich muss die Klasse Magento \ Backend \ Block \ Widget \ Form \ Element \ Dependence überschrieben werden


<preference for="Magento\Backend\Block\Widget\Form\Element\Dependence"
                type="Vendor\Module\Block\Widget\Form\Element\Dependence" />


namespace Vendor\Module\Block\Widget\Form\Element;

class Dependence extends \Magento\Backend\Block\Widget\Form\Element\Dependence
{
    /**
     * Register field name dependence one from each other by specified values
     *
     * @param string $fieldName
     * @param string $fieldNameFrom
     * @param \Magento\Config\Model\Config\Structure\Element\Dependency\Field|string $refField
     * @return \Magento\Backend\Block\Widget\Form\Element\Dependence
     */
    public function addFieldDependence($fieldName, $fieldNameFrom, $refField)
    {
        if (!is_object($refField)) {
            /** @var $refField \Magento\Config\Model\Config\Structure\Element\Dependency\Field */
            $refField = $this->_fieldFactory->create(
                ['fieldData' => ['value' => (string)$refField, 'separator' => ','], 'fieldPrefix' => '']
            );
        }
        $this->_depends[$fieldName][$fieldNameFrom] = $refField;
        return $this;
    }
}

Jetzt können Sie folgenden Weg verwenden.


->addFieldDependence(
    $childFieldTwo->getName(),
    $parentField->getName(),
    '2,4'
)

Leeren Sie den Magento2-Cache.

Sohel Rana
quelle
Vielen Dank für Ihre Antwort, funktioniert aber immer noch nicht, wenn der ausgewählte Wert nicht '3,4,5' (Zeichenfolge mit Komma) ist
Siarhey Uchukhlebau
Wenn der ausgewählte Wert einer dieser Zeichenfolgen '3,4,5' ist, sollte er funktionieren.
Sohel Rana
Sie müssen eine durch Kommas getrennte Zeichenfolge anstelle eines Arrays verwenden.
Sohel Rana
Ich habe getestet und es funktioniert nicht, wenn der ausgewählte Wert 3 oder 4 oder 5 :( Aber es funktioniert, wenn der ausgewählte Wert '3,4,5' (Zeichenfolge) ist
Siarhey Uchukhlebau
Zeigen Sie Ihren vollständigen Code nur für diese Datei
Sohel Rana
1

Ich bin mir nicht sicher, ich habe es nicht getestet, aber wenn ich mir die addFieldDependenceMethode und den \Magento\Config\Model\Config\Structure\Element\Dependency\FieldUnterricht anschaue, denke ich, dass es funktionieren könnte.

Fügen Sie dies in Ihre Klasse ein:

protected $fieldFactory;
public function __construct(
   ....
   \Magento\Config\Model\Config\Structure\Element\Dependency\FieldFactory $fieldFactory,
   ....
) {
    $this->fieldFactory = $fieldFactory;
}

Dann statt

->addFieldDependence(
    $childFieldOne->getName(),
    $parentField->getName(),
    '1,3'
)

Versuche dies:

$someField = $this->fieldFactory()->create([
    'fieldData' => [
         'separator' => ',',
          'value' => '1,3',
    ],
    'fieldPrefix' => ''
]);

->addFieldDependence(
    $childFieldOne->getName(),
    $parentField->getName(),
    $someField
)
Marius
quelle
0

Definieren $this->_fieldFactoryund versuchen Sie es unter einem, es funktioniert für mich:

    $blockDependence = $this->getLayout()->createBlock(
        'Magento\Backend\Block\Widget\Form\Element\Dependence'
    );

    $filter = $this->_fieldFactory->create([
        'fieldData' => [
            'separator' => ',',
            'value' => '0,1',
        ],
        'fieldPrefix' => '',
    ]);

    $blockDependence->addFieldMap(
        "discount_type",
        'discount_type'
    )->addFieldMap(
        "discount",
        'discount'
    )->addFieldDependence(
        'discount',
        'discount_type',
        $filter
    );

    $this->setChild('form_after', $blockDependence);
Ankit
quelle