@Manish Se uma das respostas acima o ajudou a resolver o problema, sinta-se à vontade para marcá-lo como uma solução.
Siarhey Uchukhlebau
obrigado mas esta solução não resolve o meu problema. Eu tenho que adicionar muitas coisas.
Manish
11
Claro, eu vou estar muito ocupado agora, vou adicionar assim que ficar livre. Desculpe pelo inconveniente
Manish
Respostas:
13
Para adicionar um campo condicional ao modelo padrão (e utilizá-lo ainda mais para fins de validação), você precisará criar um novo modelo (ou modificar o existente) que contém esses campos.
Agora, temos uma tabela com a descrição do modelo e precisamos concluir o próprio modelo e incluir nele o modelo e a coleção de recursos apropriados.
O modelo será chamado de 'Regra':
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 você pode ver, nosso modelo é herdado do Magento\Rule\Model\AbstractModelmodelo que já possui todos os métodos necessários.
No Construtor, adicionaremos fábricas de condições que nos permitem trabalhar com eles e criar vários métodos. Isso deve nos dar a compreensão de como o modelo funciona.
Observe que estamos usando os modelos de condição padrão do \Magento\SalesRule\Model\Rule\Conditionmódulo Magento SalesRule ( ). Se você precisar expandir as condições, poderá adicionar suas próprias classes e / ou reescrevê-las completamente ou herdar das classes disponíveis básicas. In pode ser útil quando você deseja adicionar uma condição especial que não está incluída nas condições padrão. Por exemplo, subtotal com desconto .
....
Em seguida, vamos mudar para a interface no painel de administração. Precisamos do Controller com um conjunto de ações (como Salvar, Adicionar, Editar, Exibição em grade, Recarregar condições) e um layout com blocos.
Vamos começar com o próprio controlador. Primeiro, declare o controlador comum:
Aqui, precisamos chamar a fábrica de nossos modelos no Constructor. Isso é feito para disponibilizá-las publicamente (e algumas classes auxiliares, como um registro e um criador de logs).
O _initRulemétodo é responsável pela inicialização da regra atual ou pela criação de uma nova e vazia, com a capacidade de adicioná-la ao registro. O _initAction()método carrega um layout e disponibiliza o menu dos módulos para ações (além de adicionar trilhas). O _isAllowed()método verifica se o administrador atual tem acesso ao Controlador.
Quando terminar, devemos adicionar o título dos controladores e os botões savee edit current modelno Construtor. Além disso, aqui você deve adicionar o texto principal do bloco.
isso funcionou como um encanto, embora eu atualizei a regra de vendas alterada para as regras de catálogo. agora quero adicionar algumas condições no menu suspenso da minha tabela personalizada. Como posso defini-los?
Umar
Como podemos alcançar Catálogo regra do preço em vez de regra Cart Price
Ashna
3
Usando o componente UI para Magento2.1
<nome do conjunto de campos = "condições">
<nome do argumento = "data" xsi: type = "array">
<nome do item = "config" xsi: type = "array">
<item name = "label" xsi: type = "string" translate = "true"> Condições </item>
<item name = "recolhível" xsi: type = "boolean"> true </item>
<item name = "sortOrder" xsi: type = "number"> 20 </item>
</item>
</argument>
<nome do contêiner = "conditions_apply_to">
<nome do argumento = "data" xsi: type = "array">
<nome do item = "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>
</htmlContent>
</container>
</fieldset>
Respostas:
Para adicionar um campo condicional ao modelo padrão (e utilizá-lo ainda mais para fins de validação), você precisará criar um novo modelo (ou modificar o existente) que contém esses campos.
Agora, temos uma tabela com a descrição do modelo e precisamos concluir o próprio modelo e incluir nele o modelo e a coleção de recursos apropriados.
O modelo será chamado de 'Regra':
Como você pode ver, nosso modelo é herdado do
Magento\Rule\Model\AbstractModel
modelo que já possui todos os métodos necessários.No Construtor, adicionaremos fábricas de condições que nos permitem trabalhar com eles e criar vários métodos. Isso deve nos dar a compreensão de como o modelo funciona.
Observe que estamos usando os modelos de condição padrão do
\Magento\SalesRule\Model\Rule\Condition
módulo Magento SalesRule ( ). Se você precisar expandir as condições, poderá adicionar suas próprias classes e / ou reescrevê-las completamente ou herdar das classes disponíveis básicas. In pode ser útil quando você deseja adicionar uma condição especial que não está incluída nas condições padrão. Por exemplo, subtotal com desconto .....
Em seguida, vamos mudar para a interface no painel de administração. Precisamos do Controller com um conjunto de ações (como Salvar, Adicionar, Editar, Exibição em grade, Recarregar condições) e um layout com blocos.
Vamos começar com o próprio controlador. Primeiro, declare o controlador comum:
Aqui, precisamos chamar a fábrica de nossos modelos no Constructor. Isso é feito para disponibilizá-las publicamente (e algumas classes auxiliares, como um registro e um criador de logs).
O
_initRule
método é responsável pela inicialização da regra atual ou pela criação de uma nova e vazia, com a capacidade de adicioná-la ao registro. O_initAction()
método carrega um layout e disponibiliza o menu dos módulos para ações (além de adicionar trilhas). O_isAllowed()
método verifica se o administrador atual tem acesso ao Controlador.Na próxima etapa, adicionaremos as ações padrão:
....
Edição:
Eis como adicionar novas condições:
Essa classe é responsável por carregar as condições que foram escolhidas na interface (todas as condições não podem ser carregadas de uma só vez).
....
Em seguida, precisamos criar todos os blocos e layout necessários.
Agora, vamos começar a criar e editar novas regras. Vamos criar o bloco de contêiner principal para edição:
Quando terminar, devemos adicionar o título dos controladores e os botões
save
eedit current model
no Construtor. Além disso, aqui você deve adicionar o texto principal do bloco.Este é um formulário em si:
e guias:
Teremos as duas guias: informações e condições do modelo Ceneral.
Condições:
Para ver mais detalhes, siga este link .
fonte
Usando o componente UI para Magento2.1
fonte