How to extend Bundle product type in Magento 2












0















When I create new product type and extend Bundle, I don`t have "Bundle Items" tab, how I can get the same functionality in my custom product type like in Bundle product? enter image description here



product_type.xml



<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/product_types.xsd">
<type name="super_bundle" label="Super Bundle Product" modelInstance="VendorModuleModelProductType" composite='true' indexPriority="40" sortOrder="50">
<priceModel instance="MagentoBundleModelProductPrice" />
<indexerModel instance="MagentoBundleModelResourceModelIndexerPrice" />
<stockIndexerModel instance="MagentoBundleModelResourceModelIndexerStock" />
<allowedSelectionTypes>
<type name="virtual" />
</allowedSelectionTypes>
<customAttributes>
<attribute name="refundable" value="true"/>
</customAttributes>
</type>
</config>



When I use


----------










share|improve this question

























  • i have the same problem. Did you solve it?

    – Wojciech Ka
    Jul 24 '18 at 21:08
















0















When I create new product type and extend Bundle, I don`t have "Bundle Items" tab, how I can get the same functionality in my custom product type like in Bundle product? enter image description here



product_type.xml



<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/product_types.xsd">
<type name="super_bundle" label="Super Bundle Product" modelInstance="VendorModuleModelProductType" composite='true' indexPriority="40" sortOrder="50">
<priceModel instance="MagentoBundleModelProductPrice" />
<indexerModel instance="MagentoBundleModelResourceModelIndexerPrice" />
<stockIndexerModel instance="MagentoBundleModelResourceModelIndexerStock" />
<allowedSelectionTypes>
<type name="virtual" />
</allowedSelectionTypes>
<customAttributes>
<attribute name="refundable" value="true"/>
</customAttributes>
</type>
</config>



When I use


----------










share|improve this question

























  • i have the same problem. Did you solve it?

    – Wojciech Ka
    Jul 24 '18 at 21:08














0












0








0








When I create new product type and extend Bundle, I don`t have "Bundle Items" tab, how I can get the same functionality in my custom product type like in Bundle product? enter image description here



product_type.xml



<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/product_types.xsd">
<type name="super_bundle" label="Super Bundle Product" modelInstance="VendorModuleModelProductType" composite='true' indexPriority="40" sortOrder="50">
<priceModel instance="MagentoBundleModelProductPrice" />
<indexerModel instance="MagentoBundleModelResourceModelIndexerPrice" />
<stockIndexerModel instance="MagentoBundleModelResourceModelIndexerStock" />
<allowedSelectionTypes>
<type name="virtual" />
</allowedSelectionTypes>
<customAttributes>
<attribute name="refundable" value="true"/>
</customAttributes>
</type>
</config>



When I use


----------










share|improve this question
















When I create new product type and extend Bundle, I don`t have "Bundle Items" tab, how I can get the same functionality in my custom product type like in Bundle product? enter image description here



product_type.xml



<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/product_types.xsd">
<type name="super_bundle" label="Super Bundle Product" modelInstance="VendorModuleModelProductType" composite='true' indexPriority="40" sortOrder="50">
<priceModel instance="MagentoBundleModelProductPrice" />
<indexerModel instance="MagentoBundleModelResourceModelIndexerPrice" />
<stockIndexerModel instance="MagentoBundleModelResourceModelIndexerStock" />
<allowedSelectionTypes>
<type name="virtual" />
</allowedSelectionTypes>
<customAttributes>
<attribute name="refundable" value="true"/>
</customAttributes>
</type>
</config>



When I use


----------







magento2 bundle-product






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Sep 20 '17 at 15:01







Kostya Kovalchuk

















asked Sep 20 '17 at 12:41









Kostya KovalchukKostya Kovalchuk

13




13













  • i have the same problem. Did you solve it?

    – Wojciech Ka
    Jul 24 '18 at 21:08



















  • i have the same problem. Did you solve it?

    – Wojciech Ka
    Jul 24 '18 at 21:08

















i have the same problem. Did you solve it?

– Wojciech Ka
Jul 24 '18 at 21:08





i have the same problem. Did you solve it?

– Wojciech Ka
Jul 24 '18 at 21:08










1 Answer
1






active

oldest

votes


















0














I hope you were both able to Figure out your issue, If not I believe the Following should be the fix.



<vendor>/<module>/etc/product_types.xml:



<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/product_types.xsd">
<type name="custom_bundle" label="Custom Bundle Product" modelInstance="<vendor><module>ModelProductType" composite='true' indexPriority="40" sortOrder="50">
<priceModel instance="MagentoBundleModelProductPrice" />
<indexerModel instance="MagentoBundleModelResourceModelIndexerPrice" />
<stockIndexerModel instance="MagentoBundleModelResourceModelIndexerStock" />
<allowedSelectionTypes>
<type name="simple" />
<type name="virtual" />
</allowedSelectionTypes>
<customAttributes>
<attribute name="refundable" value="true"/>
</customAttributes>
</type>
</config>


<vendor>/<module>/Model/Product/Type.php:



<?php

namespace <vendor><module>ModelProduct;

/**
* Class Type
* @package <vendor><module>ModelProduct
*/
class Type extends MagentoBundleModelProductType {

const TYPE_CODE = 'custom_bundle';

// Class Intentionally left blank
}


<vendor>/<module>/Setup/InstallData.php:



namespace <vendor><module>Setup;

use MagentoEavSetupEavSetup;
use MagentoEavSetupEavSetupFactory;
use MagentoFrameworkSetupInstallDataInterface;
use MagentoFrameworkSetupModuleContextInterface;
use MagentoFrameworkSetupModuleDataSetupInterface;
use MagentoCatalogModelProduct;
use <vendor><module>ModelProductType as CustomPoductType;

/**
* Class InstallData
* @package <vendor><module>Setup
*/
class InstallData implements InstallDataInterface
{
/**
* EAV setup factory
*
* @var EavSetupFactory
*/
private $eavSetupFactory;

/**
* Init
*
* @param EavSetupFactory $eavSetupFactory
*/
public function __construct(EavSetupFactory $eavSetupFactory)
{
$this->eavSetupFactory = $eavSetupFactory;
}

public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
/** @var EavSetup $eavSetup */
$eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);

$fieldList = [
'price',
'special_price',
'special_from_date',
'special_to_date',
'minimal_price',
'cost',
'tier_price',
'weight',
'price_type',
'sku_type',
'weight_type',
'price_view',
'shipment_type',
];

foreach ($fieldList as $field) {
$applyTo = explode(',', $eavSetup->getAttribute(Product::ENTITY, $field, 'apply_to'));

if (!in_array(CustomPoductType::TYPE_CODE, $applyTo)) {
$applyTo = CustomPoductType::TYPE_CODE;
$eavSetup->updateAttribute(
Product::ENTITY,
$field,
'apply_to',
implode(',', $applyTo)
);
}
}
}
}


From your question i think the main part you are missing is the EAV Attributes assignment. if you were to take a look at the Magento_Bundle module Setup/InstallData.php you will see that this has a list of existing attributes that it assigns plus creates some new ones, it is the new attributes that are required, specifically shipment_type for the highlighted area in the screenshot.






share|improve this answer

























    Your Answer








    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "479"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: false,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmagento.stackexchange.com%2fquestions%2f193965%2fhow-to-extend-bundle-product-type-in-magento-2%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    I hope you were both able to Figure out your issue, If not I believe the Following should be the fix.



    <vendor>/<module>/etc/product_types.xml:



    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/product_types.xsd">
    <type name="custom_bundle" label="Custom Bundle Product" modelInstance="<vendor><module>ModelProductType" composite='true' indexPriority="40" sortOrder="50">
    <priceModel instance="MagentoBundleModelProductPrice" />
    <indexerModel instance="MagentoBundleModelResourceModelIndexerPrice" />
    <stockIndexerModel instance="MagentoBundleModelResourceModelIndexerStock" />
    <allowedSelectionTypes>
    <type name="simple" />
    <type name="virtual" />
    </allowedSelectionTypes>
    <customAttributes>
    <attribute name="refundable" value="true"/>
    </customAttributes>
    </type>
    </config>


    <vendor>/<module>/Model/Product/Type.php:



    <?php

    namespace <vendor><module>ModelProduct;

    /**
    * Class Type
    * @package <vendor><module>ModelProduct
    */
    class Type extends MagentoBundleModelProductType {

    const TYPE_CODE = 'custom_bundle';

    // Class Intentionally left blank
    }


    <vendor>/<module>/Setup/InstallData.php:



    namespace <vendor><module>Setup;

    use MagentoEavSetupEavSetup;
    use MagentoEavSetupEavSetupFactory;
    use MagentoFrameworkSetupInstallDataInterface;
    use MagentoFrameworkSetupModuleContextInterface;
    use MagentoFrameworkSetupModuleDataSetupInterface;
    use MagentoCatalogModelProduct;
    use <vendor><module>ModelProductType as CustomPoductType;

    /**
    * Class InstallData
    * @package <vendor><module>Setup
    */
    class InstallData implements InstallDataInterface
    {
    /**
    * EAV setup factory
    *
    * @var EavSetupFactory
    */
    private $eavSetupFactory;

    /**
    * Init
    *
    * @param EavSetupFactory $eavSetupFactory
    */
    public function __construct(EavSetupFactory $eavSetupFactory)
    {
    $this->eavSetupFactory = $eavSetupFactory;
    }

    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
    /** @var EavSetup $eavSetup */
    $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);

    $fieldList = [
    'price',
    'special_price',
    'special_from_date',
    'special_to_date',
    'minimal_price',
    'cost',
    'tier_price',
    'weight',
    'price_type',
    'sku_type',
    'weight_type',
    'price_view',
    'shipment_type',
    ];

    foreach ($fieldList as $field) {
    $applyTo = explode(',', $eavSetup->getAttribute(Product::ENTITY, $field, 'apply_to'));

    if (!in_array(CustomPoductType::TYPE_CODE, $applyTo)) {
    $applyTo = CustomPoductType::TYPE_CODE;
    $eavSetup->updateAttribute(
    Product::ENTITY,
    $field,
    'apply_to',
    implode(',', $applyTo)
    );
    }
    }
    }
    }


    From your question i think the main part you are missing is the EAV Attributes assignment. if you were to take a look at the Magento_Bundle module Setup/InstallData.php you will see that this has a list of existing attributes that it assigns plus creates some new ones, it is the new attributes that are required, specifically shipment_type for the highlighted area in the screenshot.






    share|improve this answer






























      0














      I hope you were both able to Figure out your issue, If not I believe the Following should be the fix.



      <vendor>/<module>/etc/product_types.xml:



      <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/product_types.xsd">
      <type name="custom_bundle" label="Custom Bundle Product" modelInstance="<vendor><module>ModelProductType" composite='true' indexPriority="40" sortOrder="50">
      <priceModel instance="MagentoBundleModelProductPrice" />
      <indexerModel instance="MagentoBundleModelResourceModelIndexerPrice" />
      <stockIndexerModel instance="MagentoBundleModelResourceModelIndexerStock" />
      <allowedSelectionTypes>
      <type name="simple" />
      <type name="virtual" />
      </allowedSelectionTypes>
      <customAttributes>
      <attribute name="refundable" value="true"/>
      </customAttributes>
      </type>
      </config>


      <vendor>/<module>/Model/Product/Type.php:



      <?php

      namespace <vendor><module>ModelProduct;

      /**
      * Class Type
      * @package <vendor><module>ModelProduct
      */
      class Type extends MagentoBundleModelProductType {

      const TYPE_CODE = 'custom_bundle';

      // Class Intentionally left blank
      }


      <vendor>/<module>/Setup/InstallData.php:



      namespace <vendor><module>Setup;

      use MagentoEavSetupEavSetup;
      use MagentoEavSetupEavSetupFactory;
      use MagentoFrameworkSetupInstallDataInterface;
      use MagentoFrameworkSetupModuleContextInterface;
      use MagentoFrameworkSetupModuleDataSetupInterface;
      use MagentoCatalogModelProduct;
      use <vendor><module>ModelProductType as CustomPoductType;

      /**
      * Class InstallData
      * @package <vendor><module>Setup
      */
      class InstallData implements InstallDataInterface
      {
      /**
      * EAV setup factory
      *
      * @var EavSetupFactory
      */
      private $eavSetupFactory;

      /**
      * Init
      *
      * @param EavSetupFactory $eavSetupFactory
      */
      public function __construct(EavSetupFactory $eavSetupFactory)
      {
      $this->eavSetupFactory = $eavSetupFactory;
      }

      public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
      {
      /** @var EavSetup $eavSetup */
      $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);

      $fieldList = [
      'price',
      'special_price',
      'special_from_date',
      'special_to_date',
      'minimal_price',
      'cost',
      'tier_price',
      'weight',
      'price_type',
      'sku_type',
      'weight_type',
      'price_view',
      'shipment_type',
      ];

      foreach ($fieldList as $field) {
      $applyTo = explode(',', $eavSetup->getAttribute(Product::ENTITY, $field, 'apply_to'));

      if (!in_array(CustomPoductType::TYPE_CODE, $applyTo)) {
      $applyTo = CustomPoductType::TYPE_CODE;
      $eavSetup->updateAttribute(
      Product::ENTITY,
      $field,
      'apply_to',
      implode(',', $applyTo)
      );
      }
      }
      }
      }


      From your question i think the main part you are missing is the EAV Attributes assignment. if you were to take a look at the Magento_Bundle module Setup/InstallData.php you will see that this has a list of existing attributes that it assigns plus creates some new ones, it is the new attributes that are required, specifically shipment_type for the highlighted area in the screenshot.






      share|improve this answer




























        0












        0








        0







        I hope you were both able to Figure out your issue, If not I believe the Following should be the fix.



        <vendor>/<module>/etc/product_types.xml:



        <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/product_types.xsd">
        <type name="custom_bundle" label="Custom Bundle Product" modelInstance="<vendor><module>ModelProductType" composite='true' indexPriority="40" sortOrder="50">
        <priceModel instance="MagentoBundleModelProductPrice" />
        <indexerModel instance="MagentoBundleModelResourceModelIndexerPrice" />
        <stockIndexerModel instance="MagentoBundleModelResourceModelIndexerStock" />
        <allowedSelectionTypes>
        <type name="simple" />
        <type name="virtual" />
        </allowedSelectionTypes>
        <customAttributes>
        <attribute name="refundable" value="true"/>
        </customAttributes>
        </type>
        </config>


        <vendor>/<module>/Model/Product/Type.php:



        <?php

        namespace <vendor><module>ModelProduct;

        /**
        * Class Type
        * @package <vendor><module>ModelProduct
        */
        class Type extends MagentoBundleModelProductType {

        const TYPE_CODE = 'custom_bundle';

        // Class Intentionally left blank
        }


        <vendor>/<module>/Setup/InstallData.php:



        namespace <vendor><module>Setup;

        use MagentoEavSetupEavSetup;
        use MagentoEavSetupEavSetupFactory;
        use MagentoFrameworkSetupInstallDataInterface;
        use MagentoFrameworkSetupModuleContextInterface;
        use MagentoFrameworkSetupModuleDataSetupInterface;
        use MagentoCatalogModelProduct;
        use <vendor><module>ModelProductType as CustomPoductType;

        /**
        * Class InstallData
        * @package <vendor><module>Setup
        */
        class InstallData implements InstallDataInterface
        {
        /**
        * EAV setup factory
        *
        * @var EavSetupFactory
        */
        private $eavSetupFactory;

        /**
        * Init
        *
        * @param EavSetupFactory $eavSetupFactory
        */
        public function __construct(EavSetupFactory $eavSetupFactory)
        {
        $this->eavSetupFactory = $eavSetupFactory;
        }

        public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
        {
        /** @var EavSetup $eavSetup */
        $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);

        $fieldList = [
        'price',
        'special_price',
        'special_from_date',
        'special_to_date',
        'minimal_price',
        'cost',
        'tier_price',
        'weight',
        'price_type',
        'sku_type',
        'weight_type',
        'price_view',
        'shipment_type',
        ];

        foreach ($fieldList as $field) {
        $applyTo = explode(',', $eavSetup->getAttribute(Product::ENTITY, $field, 'apply_to'));

        if (!in_array(CustomPoductType::TYPE_CODE, $applyTo)) {
        $applyTo = CustomPoductType::TYPE_CODE;
        $eavSetup->updateAttribute(
        Product::ENTITY,
        $field,
        'apply_to',
        implode(',', $applyTo)
        );
        }
        }
        }
        }


        From your question i think the main part you are missing is the EAV Attributes assignment. if you were to take a look at the Magento_Bundle module Setup/InstallData.php you will see that this has a list of existing attributes that it assigns plus creates some new ones, it is the new attributes that are required, specifically shipment_type for the highlighted area in the screenshot.






        share|improve this answer















        I hope you were both able to Figure out your issue, If not I believe the Following should be the fix.



        <vendor>/<module>/etc/product_types.xml:



        <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/product_types.xsd">
        <type name="custom_bundle" label="Custom Bundle Product" modelInstance="<vendor><module>ModelProductType" composite='true' indexPriority="40" sortOrder="50">
        <priceModel instance="MagentoBundleModelProductPrice" />
        <indexerModel instance="MagentoBundleModelResourceModelIndexerPrice" />
        <stockIndexerModel instance="MagentoBundleModelResourceModelIndexerStock" />
        <allowedSelectionTypes>
        <type name="simple" />
        <type name="virtual" />
        </allowedSelectionTypes>
        <customAttributes>
        <attribute name="refundable" value="true"/>
        </customAttributes>
        </type>
        </config>


        <vendor>/<module>/Model/Product/Type.php:



        <?php

        namespace <vendor><module>ModelProduct;

        /**
        * Class Type
        * @package <vendor><module>ModelProduct
        */
        class Type extends MagentoBundleModelProductType {

        const TYPE_CODE = 'custom_bundle';

        // Class Intentionally left blank
        }


        <vendor>/<module>/Setup/InstallData.php:



        namespace <vendor><module>Setup;

        use MagentoEavSetupEavSetup;
        use MagentoEavSetupEavSetupFactory;
        use MagentoFrameworkSetupInstallDataInterface;
        use MagentoFrameworkSetupModuleContextInterface;
        use MagentoFrameworkSetupModuleDataSetupInterface;
        use MagentoCatalogModelProduct;
        use <vendor><module>ModelProductType as CustomPoductType;

        /**
        * Class InstallData
        * @package <vendor><module>Setup
        */
        class InstallData implements InstallDataInterface
        {
        /**
        * EAV setup factory
        *
        * @var EavSetupFactory
        */
        private $eavSetupFactory;

        /**
        * Init
        *
        * @param EavSetupFactory $eavSetupFactory
        */
        public function __construct(EavSetupFactory $eavSetupFactory)
        {
        $this->eavSetupFactory = $eavSetupFactory;
        }

        public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
        {
        /** @var EavSetup $eavSetup */
        $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);

        $fieldList = [
        'price',
        'special_price',
        'special_from_date',
        'special_to_date',
        'minimal_price',
        'cost',
        'tier_price',
        'weight',
        'price_type',
        'sku_type',
        'weight_type',
        'price_view',
        'shipment_type',
        ];

        foreach ($fieldList as $field) {
        $applyTo = explode(',', $eavSetup->getAttribute(Product::ENTITY, $field, 'apply_to'));

        if (!in_array(CustomPoductType::TYPE_CODE, $applyTo)) {
        $applyTo = CustomPoductType::TYPE_CODE;
        $eavSetup->updateAttribute(
        Product::ENTITY,
        $field,
        'apply_to',
        implode(',', $applyTo)
        );
        }
        }
        }
        }


        From your question i think the main part you are missing is the EAV Attributes assignment. if you were to take a look at the Magento_Bundle module Setup/InstallData.php you will see that this has a list of existing attributes that it assigns plus creates some new ones, it is the new attributes that are required, specifically shipment_type for the highlighted area in the screenshot.







        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited 22 mins ago









        muhkuh2005

        133




        133










        answered Sep 12 '18 at 16:07









        Nathan DayNathan Day

        1




        1






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Magento Stack Exchange!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmagento.stackexchange.com%2fquestions%2f193965%2fhow-to-extend-bundle-product-type-in-magento-2%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Magento 2 controller redirect on button click in phtml file

            Polycentropodidae