Magento 2 add new bundle custom option text field

Magento 2 add new bundle custom option text field

To create custom field in Bundle custom options , you need to complete the following steps:


Step 1: Create the etc/adminhtml/di.xml file
Step 2: Create app/code/Tridhyatech/CustomOptions/Plugin/Catalog/Ui/DataProvider/Product/Form/Modifier/BundlePanel.php
step :3 app/code/Tridhyatech/CustomOptions/Ui/DataProvider/Product/Form/Modifier/Composite.php
Step 4: Create InstallSchema file
Step 5: Run command

1.) create di.xml file in Tridhyatech/CustomOptions/etc/adminhtml/di.xml

<‍?xml version="1.0"?>
<‍config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
   <‍type name="Magento\Bundle\Ui\DataProvider\Product\Form\Modifier\BundlePanel">
      <‍plugin name="bundle_addtional_options" type="Tridhyatech\CustomOption\Plugin\Catalog\Ui\DataProvider\Product\Form\Modifier\BundlePanel" sortOrder="1000"/>
   <‍/type>
   <‍preference for="Magento\Bundle\Ui\DataProvider\Product\Form\Modifier\Composite"  type="Tridhyatech\CustomOption\Ui\DataProvider\Product\Form\Modifier\Composite"/>
<‍/config>


2.) create plugin Tridhyatech/CustomOptions/Plugin/Catalog/Ui/DataProvider/Product/Form/Modifier/BundlePanel.php

namespace Tridhyatech\CustomOption\Plugin\Catalog\Ui\DataProvider\Product\Form\Modifier;
class BundlePanel {
public function afterModifyMeta(
        \Magento\Bundle\Ui\DataProvider\Product\Form\Modifier\BundlePanel $subject,
        $meta
    ){
	$fieldSet = [
            'option_info' => [
                'dataType' => \Magento\Ui\Component\Form\Element\DataType\Text::NAME,
                'formElement'   => \Magento\Ui\Component\Form\Element\Input::NAME,
                'label' => 'Option Message',
                'dataScope' => 'option_info',
                'sortOrder' => 11
            ]
        ];
	foreach ($fieldSet as $filed => $fieldOptions)
        {
            $meta['bundle-items']['children']['bundle_options']['children']
            ['record']['children']['product_bundle_container']['children']['option_info']['children'][$filed] = $this->getSelectionCustomText($fieldOptions);
        }
	return $meta;
}
protected function getSelectionCustomText($fieldOptions)
    {
        return [
            'arguments' => [
                'data' => [
                    'config' => [
                        'componentType' => \Magento\Ui\Component\Form\Field::NAME,
                        'dataType'      => $fieldOptions['dataType'],
                        'formElement'   => $fieldOptions['formElement'],
                        'label'         => __($fieldOptions['label']),
                        'dataScope'     => $fieldOptions['dataScope'],
                        'sortOrder'     => $fieldOptions['sortOrder'],
                        'options'       => array_key_exists('options', $fieldOptions) ? $fieldOptions['options']: "",
                    ]
                ]
            ]
        ];
    }
protected function getSkuFieldConfig($sortOrder, array $options = []){

        return array_replace_recursive(
            [
                'arguments' => [
                    'data' => [
                        'config' => [
                            'label' => __('Option Message'),
                            'componentType' => \Magento\Ui\Component\Form\Field::NAME,
                            'formElement' => \Magento\Ui\Component\Form\Element\Input::NAME,
                            'dataScope' => 'option_info',
                            'dataType' => \Magento\Ui\Component\Form\Element\DataType\Text::NAME,
                            'sortOrder' => $sortOrder,
                            'validation' => [
                                'required-entry' => true,
                                'validate-alphanum-with-spaces' => true
                            ]
                        ]
                    ]
                ]
            ],
            $options
        );
    }
}

3.)
create preference
Tridhyatech\CustomOption\Ui\DataProvider\Product\Form\Modifier\Composite.php


namespace Tridhyatech\CustomOption\Ui\DataProvider\Product\Form\Modifier; use Magento\Bundle\Model\Product\Type; use Magento\Bundle\Ui\DataProvider\Product\Form\Modifier\BundlePanel; class Composite extends \Magento\Bundle\Ui\DataProvider\Product\Form\Modifier\Composite { public function modifyData(array $data) { /** @var \Magento\Catalog\Api\Data\ProductInterface $product */ $product = $this->locator->getProduct(); $modelId = $product->getId(); $isBundleProduct = $product->getTypeId() === Type::TYPE_CODE; if ($isBundleProduct && $modelId) { $data[$modelId][BundlePanel::CODE_BUNDLE_OPTIONS] [BundlePanel::CODE_BUNDLE_OPTIONS] = []; $extra_options = $this->getAdditionalAttributes($product); /** @var \Magento\Bundle\Api\Data\OptionInterface $option */ foreach ($this->optionsRepository->getList($product->getSku()) as $option) { $selections = []; foreach ($option->getProductLinks() as $productLink) { $linkedProduct = $this->productRepository->get($productLink->getSku()); $integerQty = 1; if ($linkedProduct->getExtensionAttributes()->getStockItem()) { if ($linkedProduct->getExtensionAttributes()->getStockItem()->getIsQtyDecimal()) { $integerQty = 0; } } $selections[] = [ 'selection_id' => $productLink->getId(), 'option_id' => $productLink->getOptionId(), 'product_id' => $linkedProduct->getId(), 'name' => $linkedProduct->getName(), 'sku' => $linkedProduct->getSku(), 'is_default' => ($productLink->getIsDefault()) ? '1' : '0', 'selection_price_value' => $productLink->getPrice(), 'selection_price_type' => $productLink->getPriceType(), 'selection_qty' => (bool)$integerQty ? (int)$productLink->getQty() : $productLink->getQty(), 'selection_can_change_qty' => $productLink->getCanChangeQuantity(), 'selection_qty_is_integer' => (bool)$integerQty, 'position' => $productLink->getPosition(), 'delete' => '', ]; } $data[$modelId][BundlePanel::CODE_BUNDLE_OPTIONS][BundlePanel::CODE_BUNDLE_OPTIONS][] = [ 'position' => $option->getPosition(), 'option_id' => $option->getOptionId(), 'title' => $option->getTitle(), 'option_info' => $extra_options[$option->getOptionId()]['option_info'], 'default_title' => $option->getDefaultTitle(), 'type' => $option->getType(), 'required' => ($option->getRequired()) ? '1' : '0', 'bundle_selections' => $selections, ]; } } return $data; } public function getAdditionalAttributes($product) { $optionArray = array(); $_objectManager = \Magento\Framework\App\ObjectManager::getInstance(); $product = $_objectManager->get('\Magento\Catalog\Model\Product')->load($product->getId()); $optionsCollection = $product->getTypeInstance(true) ->getOptionsCollection($product); foreach ($optionsCollection as $options) { $optionArray[$options->getOptionId()]['option_info'] = $options->getOptionInfo(); } return $optionArray; } }

4.) Create InstallSchema.php File

namespace Tridhyatech\CustomOption\Setup;
use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Framework\DB\Ddl\Table;
class InstallSchema implements InstallSchemaInterface
{
   public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
   {
       $setup->startSetup();
    $setup->getConnection()->addColumn(
                $setup->getTable('catalog_product_bundle_option'),
                'option_info',
                [
                    'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
                    'size' => 255,
                    'comment' => 'Option Info',
                ]
            );
        $setup->endSetup();
}
}

5.) Run below command :
php bin/magento s:up
php bin/magento s:s:d -f
php bin/magento c:f


Copyright © 2024 Tridhya Tech Limited, Inc. All rights reserved.