@Manish Wenn eine der obigen Antworten Ihnen bei der Lösung des Problems geholfen hat, können Sie sie gerne als Lösung markieren.
Siarhey Uchukhlebau
danke aber es löst diese lösung mein problem nicht. Ich muss viele Dinge hinzufügen.
Manish
1
Klar, ich werde jetzt ziemlich beschäftigt sein, ich werde hinzufügen, sobald ich frei bin. Entschuldigung für die Unannehmlichkeiten
Manish
Antworten:
13
Um dem Standardmodell ein bedingtes Feld hinzuzufügen (und es zu Validierungszwecken weiter zu verwenden), müssen Sie ein neues Modell erstellen (oder das vorhandene ändern), das diese Felder enthält.
Jetzt haben wir eine Tabelle mit der Modellbeschreibung und müssen das Modell selbst vervollständigen und das entsprechende Ressourcenmodell und die entsprechende Sammlung in das Modell aufnehmen.
Das Modell heißt "Regel":
app / code / Vendor / Rules / Model / Rule.php
<?php
namespaceVendor\Rules\Model;useMagento\Quote\Model\Quote\Address;useMagento\Rule\Model\AbstractModel;/**
* Class Rule
* @package Vendor\Rules\Model
*
* @method int|null getRuleId()
* @method Rule setRuleId(int $id)
*/classRuleextendsAbstractModel{/**
* Prefix of model events names
*
* @var string
*/protected $_eventPrefix ='vendor_rules';/**
* Parameter name in event
*
* In observe method you can use $observer->getEvent()->getRule() in this case
*
* @var string
*/protected $_eventObject ='rule';/** @var \Magento\SalesRule\Model\Rule\Condition\CombineFactory */protected $condCombineFactory;/** @var \Magento\SalesRule\Model\Rule\Condition\Product\CombineFactory */protected $condProdCombineF;/**
* Store already validated addresses and validation results
*
* @var array
*/protected $validatedAddresses =[];/**
* @param \Magento\Framework\Model\Context $context
* @param \Magento\Framework\Registry $registry
* @param \Magento\Framework\Data\FormFactory $formFactory
* @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
* @param \Magento\SalesRule\Model\Rule\Condition\CombineFactory $condCombineFactory
* @param \Magento\SalesRule\Model\Rule\Condition\Product\CombineFactory $condProdCombineF
* @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
* @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
* @param array $data
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/publicfunction __construct(
\Magento\Framework\Model\Context $context,
\Magento\Framework\Registry $registry,
\Magento\Framework\Data\FormFactory $formFactory,
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
\Magento\SalesRule\Model\Rule\Condition\CombineFactory $condCombineFactory,
\Magento\SalesRule\Model\Rule\Condition\Product\CombineFactory $condProdCombineF,
\Magento\Framework\Model\ResourceModel\AbstractResource $resource =null,
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection =null,
array $data =[]){
$this->condCombineFactory = $condCombineFactory;
$this->condProdCombineF = $condProdCombineF;
parent::__construct($context, $registry, $formFactory, $localeDate, $resource, $resourceCollection, $data);}/**
* Set resource model and Id field name
*
* @return void
*/protectedfunction _construct(){
parent::_construct();
$this->_init('Vendor\Rules\Model\ResourceModel\Rule');
$this->setIdFieldName('rule_id');}/**
* Get rule condition combine model instance
*
* @return \Magento\SalesRule\Model\Rule\Condition\Combine
*/publicfunction getConditionsInstance(){return $this->condCombineFactory->create();}/**
* Get rule condition product combine model instance
*
* @return \Magento\SalesRule\Model\Rule\Condition\Product\Combine
*/publicfunction getActionsInstance(){return $this->condProdCombineF->create();}/**
* Check cached validation result for specific address
*
* @param Address $address
* @return bool
*/publicfunction hasIsValidForAddress($address){
$addressId = $this->_getAddressId($address);return isset($this->validatedAddresses[$addressId])?true:false;}/**
* Set validation result for specific address to results cache
*
* @param Address $address
* @param bool $validationResult
* @return $this
*/publicfunction setIsValidForAddress($address, $validationResult){
$addressId = $this->_getAddressId($address);
$this->validatedAddresses[$addressId]= $validationResult;return $this;}/**
* Get cached validation result for specific address
*
* @param Address $address
* @return bool
* @SuppressWarnings(PHPMD.BooleanGetMethodName)
*/publicfunction getIsValidForAddress($address){
$addressId = $this->_getAddressId($address);return isset($this->validatedAddresses[$addressId])? $this->validatedAddresses[$addressId]:false;}/**
* Return id for address
*
* @param Address $address
* @return string
*/privatefunction _getAddressId($address){if($address instanceofAddress){return $address->getId();}return $address;}}
Wie Sie sehen, erbt unser Modell von dem Magento\Rule\Model\AbstractModelModell, das bereits über alle erforderlichen Methoden verfügt.
Direkt im Konstruktor fügen wir Konditionsfabriken hinzu, mit denen wir mit ihnen arbeiten und mehrere Methoden erstellen können. Dies sollte uns ein Verständnis dafür geben, wie das Modell funktioniert.
Beachten Sie, dass wir die Standardbedingungsmodelle aus dem Magento SalesRule ( \Magento\SalesRule\Model\Rule\Condition) -Modul verwenden. Wenn Sie die Bedingungen erweitern müssen, können Sie Ihre eigenen Klassen hinzufügen und / oder sie vollständig neu schreiben oder von den verfügbaren Basisklassen erben. In kann nützlich sein, wenn Sie eine spezielle Bedingung hinzufügen möchten, die nicht in den Standardbedingungen enthalten ist. Zum Beispiel Zwischensumme mit Rabatt .
....
Als nächstes wechseln wir zur Oberfläche im Admin-Bereich. Wir benötigen den Controller mit einer Reihe von Aktionen (wie Speichern, Hinzufügen, Bearbeiten, Rasteranzeige, Neuladen von Bedingungen) und einem Layout mit Blöcken.
Beginnen wir mit dem Controller selbst. Deklarieren Sie zunächst den gemeinsamen Controller:
Hier müssen wir die Fabrik unserer Modelle im Konstruktor anrufen. Dies geschieht, um sie (und einige Hilfsklassen wie ein Register und einen Logger) öffentlich zugänglich zu machen.
Die _initRuleMethode ist für die aktuelle Regelinitialisierung oder das Erstellen einer neuen und leeren Regel mit der Möglichkeit verantwortlich, diese dem Register hinzuzufügen. Die _initAction()Methode lädt ein Layout und stellt das Menü der Module für Aktionen zur Verfügung (außerdem werden Breadcumbs hinzugefügt). Die _isAllowed()Methode prüft, ob der aktuelle Administrator Zugriff auf den Controller hat.
Im nächsten Schritt werden wir die Standardaktionen hinzufügen:
....
Bearbeitung:
app / code / Vendor / Rules / Controller / Adminhtml / Beispiel / Regel / Edit.php
<?php
namespaceVendor\Rules\Controller\Adminhtml\Example\Rule;classEditextends \Vendor\Rules\Controller\Adminhtml\Example\Rule
{/**
* Rule edit action
*
* @return void
*/publicfunction execute(){
$id = $this->getRequest()->getParam('id');/** @var \Vendor\Rules\Model\Rule $model */
$model = $this->ruleFactory->create();if($id){
$model->load($id);if(!$model->getRuleId()){
$this->messageManager->addErrorMessage(__('This rule no longer exists.'));
$this->_redirect('vendor_rules/*');return;}}// set entered data if was error when we do save
$data = $this->_session->getPageData(true);if(!empty($data)){
$model->addData($data);}
$model->getConditions()->setJsFormObject('rule_conditions_fieldset');
$this->coreRegistry->register('current_rule', $model);
$this->_initAction();
$this->_view->getLayout()->getBlock('example_rule_edit')->setData('action', $this->getUrl('vendor_rules/*/save'));
$this->_addBreadcrumb($id ? __('Edit Rule'): __('New Rule'), $id ? __('Edit Rule'): __('New Rule'));
$this->_view->getPage()->getConfig()->getTitle()->prepend(
$model->getRuleId()? $model->getName(): __('New Rule'));
$this->_view->renderLayout();}}
So fügen Sie neue Bedingungen hinzu:
app / code / Vendor / Rules / Controller / Adminhtml / Beispiel / Regel / NewConditionHtml.php
Diese Klasse ist für das Laden der Bedingungen verantwortlich, die in der Schnittstelle ausgewählt wurden (nicht alle Bedingungen können gleichzeitig geladen werden).
....
Als nächstes müssen wir alle erforderlichen Blöcke und Layouts erstellen.
Kommen wir nun zum Erstellen und Bearbeiten neuer Regeln. Erstellen wir den Hauptcontainerblock zum Bearbeiten:
app / code / Vendor / Rules / Block / Adminhtml / Beispiel / Regel / Edit.php
Wenn Sie fertig sind, sollten Sie den Controller-Titel und die Schaltflächen saveund edit current modelim Konstruktor hinzufügen . Außerdem sollten Sie hier den Haupttext für den Block hinzufügen.
Dies ist eine Form selbst:
app / code / Vendor / Rules / Block / Adminhtml / Beispiel / Regel / Bearbeiten / Form.php
Dies funktionierte wie ein Zauber, obwohl ich die geänderte Verkaufsregel in Katalogregeln aktualisiert habe. Jetzt möchte ich einige bestimmte Bedingungen in Dropdown-Liste aus meiner benutzerdefinierten Tabelle hinzufügen. Wie kann ich sie definieren?
Umar
Wie wir die Katalogpreisregel anstelle der Warenkorbpreisregel erreichen können
Ashna
3
Verwenden der UI-Komponente für Magento2.1
<fieldset name = "Bedingungen">
<argument name = "data" xsi: type = "array">
<item name = "config" xsi: type = "array">
<item name = "label" xsi: type = "string" translate = "true"> Bedingungen </ item>
<item name = "reduzierbar" xsi: type = "boolean"> true </ item>
<item name = "sortOrder" xsi: type = "number"> 20 </ item>
</ item>
</ argument>
<container name = "condition_apply_to">
<argument name = "data" xsi: type = "array">
<item name = "config" xsi: type = "array">
<item name = "sortOrder" xsi: type = "number"> 10 </ item>
</ item>
</ argument>
<htmlContent name = "html_content">
<argument name = "block" xsi: type = "object"> Magento \ SalesRule \ Block \ Adminhtml \ Promo \ Quote \ Edit \ Tab \ Conditions </ argument>
</ htmlInhalt>
</ container>
</ fieldset>
Ich kann Werte als serialisiertes Array in db speichern. Aber wie kann ich es zurückholen?
Shathish
Ich kann in DB speichern, aber ich kann nicht finden, wenn Sie in Form bearbeiten. Feld ist in Bearbeitungsformular leer. könntest du helfen? magento.stackexchange.com/questions/190537/…
Sameer Bhayani
Dies zeigt für den Verkauf, wie können wir nur für die Kategorie bekommen?
Ashna
Können wir Katalogpreisregelbedingungen anstelle der Warenkorbpreisregel erhalten?
Ashna
@Sohel Rana Sir, wie man ein benutzerdefiniertes Feldset im Verkaufsregelformular in admin wie diesem hinzufügt prnt.sc/oqiac8
Antworten:
Um dem Standardmodell ein bedingtes Feld hinzuzufügen (und es zu Validierungszwecken weiter zu verwenden), müssen Sie ein neues Modell erstellen (oder das vorhandene ändern), das diese Felder enthält.
Jetzt haben wir eine Tabelle mit der Modellbeschreibung und müssen das Modell selbst vervollständigen und das entsprechende Ressourcenmodell und die entsprechende Sammlung in das Modell aufnehmen.
Das Modell heißt "Regel":
Wie Sie sehen, erbt unser Modell von dem
Magento\Rule\Model\AbstractModel
Modell, das bereits über alle erforderlichen Methoden verfügt.Direkt im Konstruktor fügen wir Konditionsfabriken hinzu, mit denen wir mit ihnen arbeiten und mehrere Methoden erstellen können. Dies sollte uns ein Verständnis dafür geben, wie das Modell funktioniert.
Beachten Sie, dass wir die Standardbedingungsmodelle aus dem Magento SalesRule (
\Magento\SalesRule\Model\Rule\Condition
) -Modul verwenden. Wenn Sie die Bedingungen erweitern müssen, können Sie Ihre eigenen Klassen hinzufügen und / oder sie vollständig neu schreiben oder von den verfügbaren Basisklassen erben. In kann nützlich sein, wenn Sie eine spezielle Bedingung hinzufügen möchten, die nicht in den Standardbedingungen enthalten ist. Zum Beispiel Zwischensumme mit Rabatt .....
Als nächstes wechseln wir zur Oberfläche im Admin-Bereich. Wir benötigen den Controller mit einer Reihe von Aktionen (wie Speichern, Hinzufügen, Bearbeiten, Rasteranzeige, Neuladen von Bedingungen) und einem Layout mit Blöcken.
Beginnen wir mit dem Controller selbst. Deklarieren Sie zunächst den gemeinsamen Controller:
Hier müssen wir die Fabrik unserer Modelle im Konstruktor anrufen. Dies geschieht, um sie (und einige Hilfsklassen wie ein Register und einen Logger) öffentlich zugänglich zu machen.
Die
_initRule
Methode ist für die aktuelle Regelinitialisierung oder das Erstellen einer neuen und leeren Regel mit der Möglichkeit verantwortlich, diese dem Register hinzuzufügen. Die_initAction()
Methode lädt ein Layout und stellt das Menü der Module für Aktionen zur Verfügung (außerdem werden Breadcumbs hinzugefügt). Die_isAllowed()
Methode prüft, ob der aktuelle Administrator Zugriff auf den Controller hat.Im nächsten Schritt werden wir die Standardaktionen hinzufügen:
....
Bearbeitung:
So fügen Sie neue Bedingungen hinzu:
Diese Klasse ist für das Laden der Bedingungen verantwortlich, die in der Schnittstelle ausgewählt wurden (nicht alle Bedingungen können gleichzeitig geladen werden).
....
Als nächstes müssen wir alle erforderlichen Blöcke und Layouts erstellen.
Kommen wir nun zum Erstellen und Bearbeiten neuer Regeln. Erstellen wir den Hauptcontainerblock zum Bearbeiten:
Wenn Sie fertig sind, sollten Sie den Controller-Titel und die Schaltflächen
save
undedit current model
im Konstruktor hinzufügen . Außerdem sollten Sie hier den Haupttext für den Block hinzufügen.Dies ist eine Form selbst:
und Registerkarten:
Wir haben die beiden Registerkarten: Informationen und Bedingungen des Ceneral-Modells.
Bedingungen:
Um weitere Details anzuzeigen, folgen Sie bitte diesem Link .
quelle
Verwenden der UI-Komponente für Magento2.1
quelle