@Manish Si l'une des réponses ci-dessus vous a aidé à résoudre le problème, n'hésitez pas à la marquer comme solution.
Siarhey Uchukhlebau
merci mais cette solution ne résout pas mon problème. Je dois ajouter beaucoup de choses.
Manish
1
Bien sûr, je serai très occupé en ce moment, j'ajouterai dès que je serai libre. Désolé pour le désagrément
Manish
Réponses:
13
Pour ajouter un champ conditionnel au modèle par défaut (et l'utiliser davantage à des fins de validation), vous devrez créer un nouveau modèle (ou modifier le modèle existant) qui contient ces champs.
Maintenant, nous avons un tableau avec la description du modèle et nous devons compléter le modèle lui-même et y inclure le modèle de ressource et la collection appropriés.
<?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;}}
Comme vous pouvez le voir, notre modèle hérite du Magento\Rule\Model\AbstractModelmodèle qui possède déjà toutes les méthodes requises.
Dans le constructeur, nous ajouterons des usines de conditions qui nous permettront de travailler avec elles et de créer plusieurs méthodes. Cela devrait nous permettre de comprendre le fonctionnement du modèle.
Notez que nous utilisons les modèles de condition par défaut du \Magento\SalesRule\Model\Rule\Conditionmodule Magento SalesRule ( ). Si vous devez étendre les conditions, vous pouvez ajouter vos propres classes et / ou les réécrire complètement ou hériter des classes disponibles de base. Dans peut être utile lorsque vous souhaitez ajouter une condition spéciale qui n'est pas incluse dans les conditions par défaut. Par exemple, sous - total avec remise .
....
Ensuite, passons à l'interface dans le panneau d'administration. Nous avons besoin du contrôleur avec un ensemble d'actions (telles que Enregistrer, Ajouter, Modifier, Affichage de la grille, Recharger les conditions) et une mise en page avec des blocs.
Commençons par le contrôleur lui-même. Tout d'abord, déclarez le contrôleur commun:
Ici, nous devons appeler l'usine de nos modèles dans le constructeur. Cela est fait pour les rendre disponibles (et certaines classes auxiliaires, comme un registre et un enregistreur).
La _initRuleméthode est responsable de l'initialisation de la règle actuelle ou de la création d'une nouvelle et vide avec la possibilité de l'ajouter au registre. La _initAction()méthode charge une mise en page et rend le menu des modules disponible pour les actions (également, il ajoute des chapelures). La _isAllowed()méthode vérifie si l'administrateur actuel a un accès au contrôleur.
À l'étape suivante, nous allons ajouter les actions par défaut:
Cette classe est responsable du chargement des conditions qui ont été choisies dans l'interface (toutes les conditions ne peuvent pas être chargées en même temps).
....
Ensuite, nous devons créer tous les blocs et la mise en page requis.
Maintenant, passons à la création et à la modification de nouvelles règles. Créons le bloc conteneur principal pour l'édition:
Une fois terminé, nous devrions ajouter le titre des contrôleurs et les boutons saveet edit current modeldans le constructeur. Ici aussi, vous devez ajouter le texte principal du bloc.
cela a fonctionné comme un charme, même si j'ai mis à jour la règle de vente en règles de catalogue. maintenant, je veux ajouter certaines conditions dans le menu déroulant de ma table personnalisée. Comment puis-je les définir?
Umar
Comment nous pouvons atteindre la règle de prix de catalogue au lieu de la règle de prix de panier
Ashna
3
Utilisation du composant d'interface utilisateur pour Magento2.1
<fieldset name = "conditions">
<nom d'argument = "données" xsi: type = "tableau">
<item name = "config" xsi: type = "array">
<item name = "label" xsi: type = "string" translate = "true"> Conditions </item>
<item name = "pliable" xsi: type = "boolean"> true </item>
<item name = "sortOrder" xsi: type = "number"> 20 </item>
</item>
</argument>
<nom du conteneur = "conditions_apply_to">
<nom d'argument = "données" xsi: type = "tableau">
<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>
</htmlContent>
</container>
</fieldset>
Réponses:
Pour ajouter un champ conditionnel au modèle par défaut (et l'utiliser davantage à des fins de validation), vous devrez créer un nouveau modèle (ou modifier le modèle existant) qui contient ces champs.
Maintenant, nous avons un tableau avec la description du modèle et nous devons compléter le modèle lui-même et y inclure le modèle de ressource et la collection appropriés.
Le modèle sera appelé «Règle»:
Comme vous pouvez le voir, notre modèle hérite du
Magento\Rule\Model\AbstractModel
modèle qui possède déjà toutes les méthodes requises.Dans le constructeur, nous ajouterons des usines de conditions qui nous permettront de travailler avec elles et de créer plusieurs méthodes. Cela devrait nous permettre de comprendre le fonctionnement du modèle.
Notez que nous utilisons les modèles de condition par défaut du
\Magento\SalesRule\Model\Rule\Condition
module Magento SalesRule ( ). Si vous devez étendre les conditions, vous pouvez ajouter vos propres classes et / ou les réécrire complètement ou hériter des classes disponibles de base. Dans peut être utile lorsque vous souhaitez ajouter une condition spéciale qui n'est pas incluse dans les conditions par défaut. Par exemple, sous - total avec remise .....
Ensuite, passons à l'interface dans le panneau d'administration. Nous avons besoin du contrôleur avec un ensemble d'actions (telles que Enregistrer, Ajouter, Modifier, Affichage de la grille, Recharger les conditions) et une mise en page avec des blocs.
Commençons par le contrôleur lui-même. Tout d'abord, déclarez le contrôleur commun:
Ici, nous devons appeler l'usine de nos modèles dans le constructeur. Cela est fait pour les rendre disponibles (et certaines classes auxiliaires, comme un registre et un enregistreur).
La
_initRule
méthode est responsable de l'initialisation de la règle actuelle ou de la création d'une nouvelle et vide avec la possibilité de l'ajouter au registre. La_initAction()
méthode charge une mise en page et rend le menu des modules disponible pour les actions (également, il ajoute des chapelures). La_isAllowed()
méthode vérifie si l'administrateur actuel a un accès au contrôleur.À l'étape suivante, nous allons ajouter les actions par défaut:
....
Montage:
Voici comment ajouter de nouvelles conditions:
Cette classe est responsable du chargement des conditions qui ont été choisies dans l'interface (toutes les conditions ne peuvent pas être chargées en même temps).
....
Ensuite, nous devons créer tous les blocs et la mise en page requis.
Maintenant, passons à la création et à la modification de nouvelles règles. Créons le bloc conteneur principal pour l'édition:
Une fois terminé, nous devrions ajouter le titre des contrôleurs et les boutons
save
etedit current model
dans le constructeur. Ici aussi, vous devez ajouter le texte principal du bloc.C'est un formulaire lui-même:
et onglets:
Nous aurons les deux onglets: Informations et conditions du modèle général.
Conditions:
Pour voir plus de détails, veuillez suivre ce lien .
la source
Utilisation du composant d'interface utilisateur pour Magento2.1
la source