@Manish Если один из приведенных выше ответов помог вам решить проблему, пометьте его как решение.
Сергей Учухлебау
спасибо, но это решение не решит мою проблему. Я должен добавить много вещей.
Маниш
1
Конечно, сейчас я буду очень занят, я добавлю, как только получу бесплатно. Приносим извинения за неудобства
Маниш
Ответы:
13
Чтобы добавить условное поле в модель по умолчанию (и в дальнейшем использовать его для проверки), вам нужно будет создать новую модель (или изменить существующую), содержащую эти поля.
Приложение / код / Vendor / Правила / Setup / InstallSchema.php
Теперь у нас есть таблица с описанием модели, и нам нужно завершить саму модель и включить в нее соответствующую модель ресурсов и коллекцию.
Модель будет называться «Правило»:
Приложение / код / Vendor / Правила / Модель / Rule.php
<?phpnamespaceVendor\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;}}
Как видите, наша модель наследует от Magento\Rule\Model\AbstractModelмодели, в которой уже есть все необходимые методы.
Прямо в Конструкторе мы добавим фабрики условий, которые позволяют нам работать с ними и создавать несколько методов. Это должно дать нам понимание того, как работает модель.
Обратите внимание, что мы используем модели условий по умолчанию из \Magento\SalesRule\Model\Rule\Conditionмодуля Magento SalesRule ( ). Если вам нужно расширить условия, вы можете добавить свои собственные предложения и / или полностью переписать их или наследовать от базовых доступных классов. Может быть полезно, если вы хотите добавить специальное условие, которое не включено в условия по умолчанию. Например, Итого со скидкой .
....
Далее давайте переключимся на интерфейс в админ-панели. Нам нужен контроллер с набором действий (например, Сохранить, Добавить, Изменить, Отображение сетки, Перезагрузка условий) и макет с блоками.
Давайте начнем с самого контроллера. Сначала объявите общий контроллер:
Приложение / код / Продавец / Правила / Controller / Adminhtml / Пример / Rule.php
Здесь нам нужно вызвать фабрику наших моделей в Конструкторе. Это сделано для того, чтобы сделать их (и некоторые вспомогательные классы, такие как регистр и регистратор) общедоступными.
_initRuleМетод отвечает за текущую инициализацию правил или создание нового и пустого , с возможностью добавления его в реестр. _initAction()Метод загружает раскладку и делает меню модулей для действий (кроме того , он добавляет breadcumbs). В _isAllowed()метод проверяет , является ли текущий администратор имеет доступ к контроллеру.
На следующем шаге мы собираемся добавить действия по умолчанию:
....
Редактирование:
Приложение / код / Продавец / Правила / Controller / Adminhtml / Пример / Rule / edit.php
<?phpnamespaceVendor\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();}}
Вот как добавить новые условия:
Приложение / код / Продавец / Правила / Controller / Adminhtml / Пример / Rule / NewConditionHtml.php
Когда это сделано, мы должны добавить название контроллеров и saveи edit current modelкнопки в конструкторе. Также здесь вы должны добавить основной текст блока.
Это сама форма:
Приложение / код / Продавец / Правила / Block / Adminhtml / Пример / Rule / Редактировать / form.php
это работало как очарование, хотя я обновил измененное правило продаж на правила каталога. Теперь я хочу добавить некоторые определенные условия в раскрывающемся списке из моей пользовательской таблицы. Как я могу их определить?
Умар
Как мы можем достичь правила цены каталога вместо правила цены корзины
Ашна
3
Использование компонента пользовательского интерфейса для Magento2.1
<fieldset name = "условия">
<аргумент name = "data" xsi: type = "array">
<item name = "config" xsi: type = "array">
<item name = "label" xsi: type = "string" translate = "true"> Условия </ item>
<item name = "collapsible" xsi: type = "boolean"> true </ item>
<item name = "sortOrder" xsi: type = "number"> 20 </ item>
</ Элемент>
</ Аргумент>
<container name = "condition_apply_to">
<аргумент name = "data" xsi: type = "array">
<item name = "config" xsi: type = "array">
<item name = "sortOrder" xsi: type = "number"> 10 </ item>
</ Элемент>
</ Аргумент>
<htmlContent name = "html_content">
<аргумент name = "блок" xsi: type = "object"> Magento \ SalesRule \ Block \ Adminhtml \ Promo \ Quote \ Edit \ Tab \ Condition </ аргумент>
</ HtmlContent>
</ Контейнер>
</ FIELDSET>
Я могу сохранить значения как сериализованный массив в БД. Но как мне вернуть его обратно?
Shathish
Я могу сохранить в БД, но я не могу найти при редактировании в форме. Поле не заполнено в форме редактирования. не могли бы вы помочь? magento.stackexchange.com/questions/190537/…
Самир Бхайани
это показывает для продажи, как мы можем получить только для категории?
Ашна
Можем ли мы получить условия правила цены каталога вместо правила цены корзины?
Ашна
@ Сохел Рана, сэр, как добавить пользовательский набор полей в форму правил продаж в админке, например, prnt.sc/oqiac8
Ответы:
Чтобы добавить условное поле в модель по умолчанию (и в дальнейшем использовать его для проверки), вам нужно будет создать новую модель (или изменить существующую), содержащую эти поля.
Теперь у нас есть таблица с описанием модели, и нам нужно завершить саму модель и включить в нее соответствующую модель ресурсов и коллекцию.
Модель будет называться «Правило»:
Как видите, наша модель наследует от
Magento\Rule\Model\AbstractModel
модели, в которой уже есть все необходимые методы.Прямо в Конструкторе мы добавим фабрики условий, которые позволяют нам работать с ними и создавать несколько методов. Это должно дать нам понимание того, как работает модель.
Обратите внимание, что мы используем модели условий по умолчанию из
\Magento\SalesRule\Model\Rule\Condition
модуля Magento SalesRule ( ). Если вам нужно расширить условия, вы можете добавить свои собственные предложения и / или полностью переписать их или наследовать от базовых доступных классов. Может быть полезно, если вы хотите добавить специальное условие, которое не включено в условия по умолчанию. Например, Итого со скидкой .....
Далее давайте переключимся на интерфейс в админ-панели. Нам нужен контроллер с набором действий (например, Сохранить, Добавить, Изменить, Отображение сетки, Перезагрузка условий) и макет с блоками.
Давайте начнем с самого контроллера. Сначала объявите общий контроллер:
Здесь нам нужно вызвать фабрику наших моделей в Конструкторе. Это сделано для того, чтобы сделать их (и некоторые вспомогательные классы, такие как регистр и регистратор) общедоступными.
_initRule
Метод отвечает за текущую инициализацию правил или создание нового и пустого , с возможностью добавления его в реестр._initAction()
Метод загружает раскладку и делает меню модулей для действий (кроме того , он добавляет breadcumbs). В_isAllowed()
метод проверяет , является ли текущий администратор имеет доступ к контроллеру.На следующем шаге мы собираемся добавить действия по умолчанию:
....
Редактирование:
Вот как добавить новые условия:
Этот класс отвечает за загрузку условий, которые были выбраны в интерфейсе (все условия не могут быть загружены одновременно).
....
Далее нам нужно создать все необходимые блоки и макет.
Теперь давайте приступим к созданию и редактированию новых правил. Давайте создадим основной контейнерный блок для редактирования:
Когда это сделано, мы должны добавить название контроллеров и
save
иedit current model
кнопки в конструкторе. Также здесь вы должны добавить основной текст блока.Это сама форма:
и вкладки:
У нас будут две вкладки: Общая информация о модели и Условия.
условия:
Для просмотра более подробной информации, пожалуйста, перейдите по этой ссылке .
источник
Использование компонента пользовательского интерфейса для Magento2.1
источник