@Manish Si una de las respuestas anteriores te ayudó a resolver el problema, no dudes en marcarlo como una solución.
Siarhey Uchukhlebau
gracias pero esta solución no resuelve mi problema. Tengo que agregar muchas cosas.
Manish
1
Claro, estaré bastante ocupado en este momento, agregaré tan pronto como me libere. Perdón por la molestia
Manish
Respuestas:
13
Para agregar un campo condicional al modelo predeterminado (y utilizarlo aún más para fines de validación), deberá crear un nuevo modelo (o modificar el existente) que contenga estos campos.
Ahora, tenemos una tabla con la descripción del modelo y necesitamos completar el modelo en sí mismo e incluir en él el modelo y la colección de recursos apropiados.
El modelo se llamará 'Regla':
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;}}
Como puede ver, nuestro modelo hereda del Magento\Rule\Model\AbstractModelmodelo que ya tiene todos los métodos requeridos.
Justo en el Constructor, agregaremos fábricas de condiciones que nos permiten trabajar con ellas y crear múltiples métodos. Esto debería darnos la comprensión de cómo funciona el modelo.
Tenga en cuenta que estamos utilizando los modelos de condición predeterminados del \Magento\SalesRule\Model\Rule\Conditionmódulo Magento SalesRule ( ). Si necesita expandir las condiciones, puede agregar sus propias clases y / o reescribirlas completamente o heredar de las clases base disponibles. Puede ser útil cuando desea agregar una condición especial que no está incluida en las condiciones predeterminadas. Por ejemplo, Subtotal con descuento .
....
A continuación, cambiemos a la interfaz en el panel de administración. Necesitamos el controlador con un conjunto de acciones (como Guardar, Agregar, Editar, Mostrar cuadrícula, Recargar condiciones) y un diseño con bloques.
Comencemos con el controlador en sí. Primero, declare el controlador común:
Aquí, debemos llamar a la fábrica de nuestros modelos en el Constructor. Esto se hace para que estén disponibles públicamente (y algunas clases auxiliares, como un registro y un registrador).
El _initRulemétodo es responsable de la inicialización de la regla actual o de la creación de una nueva y vacía con la capacidad de agregarla al registro. El _initAction()método carga un diseño y hace que el menú de los módulos esté disponible para acciones (además, agrega panzas). El _isAllowed()método verifica si el administrador actual tiene acceso al controlador.
En el siguiente paso, agregaremos las acciones predeterminadas:
Cuando termine, debemos agregar el título de los controladores y los botones savey edit current modelen el Constructor. Además, aquí debe agregar el texto principal del bloque.
esto funcionó a las mil maravillas, aunque actualicé la regla de ventas cambiada a las reglas del catálogo. ahora quiero agregar ciertas condiciones en el menú desplegable de mi tabla personalizada. ¿Cómo puedo definirlos?
Umar
Cómo podemos lograr la regla de precio de catálogo en lugar de la regla de precio de carro
Ashna
3
Usando el componente UI para Magento2.1
<fieldset name = "condiciones">
<argumento name = "data" xsi: type = "array">
<item name = "config" xsi: type = "array">
<item name = "label" xsi: type = "string" translate = "true"> Condiciones </item>
<item name = "collapsible" xsi: type = "boolean"> true </item>
<item name = "sortOrder" xsi: type = "number"> 20 </item>
</item>
</argument>
<container name = "condition_apply_to">
<argumento 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">
<argumento name = "block" xsi: type = "object"> Magento \ SalesRule \ Block \ Adminhtml \ Promo \ Quote \ Edit \ Tab \ Condiciones </argument>
</htmlContent>
</container>
</fieldset>
Puedo guardar valores como matriz serializada en db. Pero, ¿cómo puedo recuperarlo?
Shathish
puedo guardar en db, pero no puedo encontrarlo en la edición en form.field está vacío en el formulario de edición. ¿podrías ayudar? magento.stackexchange.com/questions/190537/…
Sameer Bhayani
esto se muestra para ventas, ¿Cómo podemos obtener solo por categoría?
Ashna
¿Podemos obtener condiciones de regla de precio de catálogo en lugar de la regla de precio de carrito?
Ashna
@Sohel Rana señor cómo agregar un conjunto de campos personalizado en forma de regla de ventas en administración como este prnt.sc/oqiac8
Respuestas:
Para agregar un campo condicional al modelo predeterminado (y utilizarlo aún más para fines de validación), deberá crear un nuevo modelo (o modificar el existente) que contenga estos campos.
Ahora, tenemos una tabla con la descripción del modelo y necesitamos completar el modelo en sí mismo e incluir en él el modelo y la colección de recursos apropiados.
El modelo se llamará 'Regla':
Como puede ver, nuestro modelo hereda del
Magento\Rule\Model\AbstractModel
modelo que ya tiene todos los métodos requeridos.Justo en el Constructor, agregaremos fábricas de condiciones que nos permiten trabajar con ellas y crear múltiples métodos. Esto debería darnos la comprensión de cómo funciona el modelo.
Tenga en cuenta que estamos utilizando los modelos de condición predeterminados del
\Magento\SalesRule\Model\Rule\Condition
módulo Magento SalesRule ( ). Si necesita expandir las condiciones, puede agregar sus propias clases y / o reescribirlas completamente o heredar de las clases base disponibles. Puede ser útil cuando desea agregar una condición especial que no está incluida en las condiciones predeterminadas. Por ejemplo, Subtotal con descuento .....
A continuación, cambiemos a la interfaz en el panel de administración. Necesitamos el controlador con un conjunto de acciones (como Guardar, Agregar, Editar, Mostrar cuadrícula, Recargar condiciones) y un diseño con bloques.
Comencemos con el controlador en sí. Primero, declare el controlador común:
Aquí, debemos llamar a la fábrica de nuestros modelos en el Constructor. Esto se hace para que estén disponibles públicamente (y algunas clases auxiliares, como un registro y un registrador).
El
_initRule
método es responsable de la inicialización de la regla actual o de la creación de una nueva y vacía con la capacidad de agregarla al registro. El_initAction()
método carga un diseño y hace que el menú de los módulos esté disponible para acciones (además, agrega panzas). El_isAllowed()
método verifica si el administrador actual tiene acceso al controlador.En el siguiente paso, agregaremos las acciones predeterminadas:
....
Edición:
Así es como agregar nuevas condiciones:
Esta clase es responsable de cargar las condiciones que se han elegido en la interfaz (no se pueden cargar todas las condiciones a la vez).
....
A continuación, necesitamos crear todos los bloques y el diseño necesarios.
Ahora, vamos a crear y editar nuevas reglas. Creemos el bloque contenedor principal para editar:
Cuando termine, debemos agregar el título de los controladores y los botones
save
yedit current model
en el Constructor. Además, aquí debe agregar el texto principal del bloque.Este es un formulario en sí mismo:
y pestañas:
Tendremos las dos pestañas: Información y condiciones del modelo Ceneral.
Condiciones:
Para ver más detalles, siga este enlace .
fuente
Usando el componente UI para Magento2.1
fuente