কীভাবে Magento2 প্রোগ্রামটিমে অ্যাট্রিবিউট বিকল্প যুক্ত করে (সেটআপে নেই)


15

আমি আমার আমদানিকারক মডুলের আকার এবং রঙের বৈশিষ্ট্যের জন্য বিকল্পগুলি যুক্ত করার চেষ্টা করি তবে কীভাবে হয় না ...:

private function addOption($attributeCode, $value)
{
    $ob = $this->_objectManager;      
    /* @var $m \Magento\Eav\Model\Entity\Attribute\OptionManagement */
    $m = $this->optionManagement;
    /* @var $option \Magento\Eav\Model\Entity\Attribute\Option */
    $option = $this->attributeOption;

    $option->setLabel($value);      
    $option->setValue($value);

    $m->add(\Magento\Catalog\Api\Data\ProductAttributeInterface::ENTITY_TYPE_CODE,
            $attributeCode,
            $option);

এই প্রতিবেদনটি একটি ত্রুটি (আমি প্রতিবেদনের ব্যতিক্রম পরিবর্তিত OptionMaganger.phpকরতে Exception-> বার্তা )

গুণমানের আকার সংরক্ষণ করতে পারে না বিজ্ঞপ্তি: অপরিবর্তিত সূচক: /var/www/html/magento2/vendor/magento/module-swatches/odel/Plugin/EavAttribute.php 177 এ মুছুন

  • অপশনম্যানেজমেন্ট এবং অপশনটি এসেছে _contstructor
  • অপশনম্যানেজমেন্টের সাহায্যে আমি বিদ্যমান আইটেমগুলি পুনরুদ্ধার করতে পারি, তাই ঠিক আছে ..

setLabel()এবং setValue()ডিফল্ট, তবে আমি সেটডাটা চেষ্টা করেছি , বিকল্প উদাহরণ লোড করব এবং OptionManagement->getItems(...) "আবার" যুক্ত করতে পেরেছি , তবে ত্রুটি এখনও বিদ্যমান ...

কোন ধারণা, আমদানি প্রক্রিয়া চলাকালীন আমি কীভাবে EAV বিকল্পগুলি (স্বাচ?) যুক্ত করতে পারি? (মডুল সেটআপে নেই)


হালনাগাদ :

অন্য উপায়ে আমি বিকল্প যুক্ত করতে পারি:

$attributeCode = 137; /* on size, 90 on color ... */

$languageValues[0]='Admin Label'; 

$languageValues[1]='Default Store Label - XXXXL';
$ob = $this->_objectManager;

private function addOption($attributeCode,$languageValues){
$ob = $this->_objectManager;
/* @var $attr \Magento\Eav\Model\Entity\Attribute */
$attr = $ob->create('\Magento\Eav\Model\Entity\Attribute'); 
$attr->load($attributeCode); 
$option = []; 
$option['value'][$languageValues[0]] = $languageValues; 
$attr->addData(array('option' => $option));
$attr->save();
}

এইভাবে ম্যাজেন্টো 2 গুনের বিকল্পটি সংরক্ষণ করতে পারে তবে "অফিসিয়াল" উপায়টি কী তা আমি জানি না :)


পূর্ণসংখ্যার জন্য স্ট্রিং সমর্থিত নয় বলে বিকল্প কোনও মান যোগ করেছে
অজয় প্যাটেল

উত্তর:


2
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Store\Model\StoreManagerInterface;

ঘোষণা:

protected $_eavSetupFactory;

নির্মাতা:

public function __construct(
    \Magento\Eav\Setup\EavSetupFactory $eavSetupFactory,
    \Magento\Store\Model\StoreManagerInterface $storeManager,
    \Magento\Catalog\Model\ResourceModel\Eav\Attribute $attributeFactory,
    \Magento\Framework\ObjectManagerInterface $objectmanager,
    ModuleDataSetupInterface $setup,
    \Magento\Catalog\Model\ProductFactory $productloader
) {
    $this->_eavSetupFactory = $eavSetupFactory;
    $this->_storeManager = $storeManager;
    $this->_attributeFactory = $attributeFactory;
    $this->_objectManager = $objectmanager;
    $this->setup = $setup;
    $this->_productloader = $productloader;
}

মিথোড এক্সিকিউট:

public function execute(EventObserver $observer)
{
    /** @var $brand \Ktpl\Brand\Model\Brand */
    $brand = $observer->getEvent()->getBrand();
    $option_id = "";

    $data = [];
    $attribute_arr = [$brand['brand_id'] => $brand['brand_title']];
    $optionTable = $this->setup->getTable('eav_attribute_option');
    $attributeInfo=$this->_attributeFactory->getCollection()
           ->addFieldToFilter('attribute_code',['eq'=>"shop_by_brand"])
           ->getFirstItem();

    $attribute_id = $attributeInfo->getAttributeId();

    $eavAttribute = $this->_objectManager->create('Magento\Eav\Model\Config');

    $option=array();
    $option['attribute_id'] = $attributeInfo->getAttributeId();
    $option['value'] = array(0=>array()); // 0 means "new option_id", other values like "14" means "update option_id=14" - this array index is casted to integer

    $storeManager = $this->_objectManager->get('Magento\Store\Model\StoreManagerInterface');
    $stores = $storeManager->getStores();
    $storeArray[0] = "All Store Views";       

    foreach ($stores  as $store) {
        $storeArray[$store->getId()] = $store->getName();
    }


    if (empty($brand['optionId'])) {
        foreach($attribute_arr as $key => $value){
            $option['value'][0][0]=$value;
                foreach($storeArray as $storeKey => $store){
                    $option['value'][0][$storeKey] = $value;
                }                
        }
    }
    else
    {
        foreach($attribute_arr as $key => $value){
                foreach($storeArray as $storeKey => $store){
                    $option['value'][$brand['optionId']][$storeKey] = $value;
                }                
        }
    }

    $eavSetup = $this->_eavSetupFactory->create();
    $eavSetup->addAttributeOption($option)

}

আপনার কোডে আপনার গুরুতর ত্রুটি রয়েছে: one বিকল্প ['মান'] [$ মান] [0] - নতুন একটি বিকল্প সেট 0 এর জন্য এটি $ মান নয় "" বিকল্প_ইড "- পূর্ণসংখ্যার হওয়া উচিত This এটি একটি পূর্ণসংখ্যার সাথে কাস্ট করা হয়, সুতরাং আপনার যদি কোনও সংখ্যার স্ট্রিং থাকে, যেমন "কালো" এটি সঠিকভাবে 0 হবে। তবে যদি আপনার $ মানটি "10 কালো" এর মতো কিছু হয় তবে এটি 10 ​​এ প্রেরণ করা হবে এবং নতুন_এর পরিবর্তে বিকল্প_id = 10 দিয়ে ডাটাবেস সত্তা আপডেট করবে। এটি আপনার দোকানের ডেটাবেজে গুরুতর গোলযোগ সৃষ্টি করতে পারে।
ম্যাকসিমিউক 21

ভাইকে জানাতে ধন্যবাদ আপনি যদি আমার উত্তর @ এ। ম্যাক্সিমিউক
রোনাক চৌহান

করেছি. অনুগ্রহ করে গ্রহণ করুন, তারপরে আমি আমার ডাউনটোটটি ফিরিয়ে দেব।
ম্যাকসিমিউক

অনুমোদিত, তবে ডাউন-ভোটের কোনও উত্তর হ'ল সঠিক উপায় নয় ভাই, আপনি যদি মনে করেন যে উত্তরটির সাথে সম্পর্কিত না হয় বা জিজ্ঞাসা করা হয়নি তবে আপনি অন্য কারও উত্তর নিচে ভোট দিতে পারবেন না। @ এ। ম্যাকসিমিউক
রোনাক চৌহান

আমি এই কোডটি ব্যবহার করার জন্য কাউকে সতর্ক করার জন্য এটি করেছি, কারণ এটি ডেটা অখণ্ডতায় মারাত্মক ক্ষতি ঘটাবে। যেমন পরিবর্তে "42" (আকার) নামের নতুন বিকল্প যুক্ত করা আপনার স্ক্রিপ্ট আপডেট করেছে বিকল্প_id = 42 (যা সম্পূর্ণ ভিন্ন বৈশিষ্ট্যের বিদ্যমান বিকল্প ছিল)। ভাগ্যক্রমে এটি আমার কাছে টেস্ট সার্ভার এবং নতুন নতুন ডাটাবেসে সুখী।
ম্যাকসিমিউক

2

অন্য উপায়ে আমি বিকল্প যুক্ত করতে পারি:

$attributeCode = 137; /* on size, 90 on color ... */

$languageValues[0]='Admin Label'; 

$languageValues[1]='Default Store Label - XXXXL';
$ob = $this->_objectManager;



private function addOption($attributeCode,$languageValues){
$ob = $this->_objectManager;
/* @var $attr \Magento\Eav\Model\Entity\Attribute */
$attr = $ob->create('\Magento\Eav\Model\Entity\Attribute'); 
$attr->load($attributeCode); 
$option = []; 
$option['value'][$languageValues[0]] = $languageValues; 
$attr->addData(array('option' => $option));
$attr->save();
}

এইভাবে ম্যাজেন্টো 2 গুনের বিকল্পটি সংরক্ষণ করতে পারে তবে "অফিসিয়াল" উপায়টি কী তা আমি জানি না।


আমার উপায় দেখুন। আমি এটি 'অফিসিয়াল' বলে বিশ্বাস করি
কারকম্প

আপনার সমাধানটি কাজ তবে কেবল যখন বিকল্পগুলি পূর্ণসংখ্যার জন্য কাজ না করে
অজয় প্যাটেল

এটি পূর্ণসংখ্যার মানগুলির জন্য কেন কাজ করবে না?
ভিনসেন্ট টায়সিয়ের

0

একটি বৈধতা সমস্যা বলে মনে হচ্ছে। ডেটাতে মুছুন কীটি ব্যাকএন্ডে ফর্ম থেকে আসে, সুতরাং খালি মোছার কীটি সেইভাবে যুক্ত করার চেষ্টা করুন:

$option->setData('delete','');

এটা কাজ করতে পারে।


দুঃখজনকভাবে না। অপশন ম্যানেজার অ্যাড (..) $ বিকল্পের প্যারামিটারটি পুনরায় বিভাজক করে 'মুছুন' কীটি খালি ছেড়ে দিন, আমি তা করি না কেন ... তবে আমি অন্য উপায় খুঁজে পেয়েছি ....
ইন্টারপিজিয়ন

দুর্দান্ত, দয়া করে প্রশ্নের সমাধানের উত্তর হিসাবে আপনার সমাধান যুক্ত করুন।
মাউরোনিগ্রিল

আমি আমার নিজের প্রশ্নের উত্তর দিতে পারি না, তবে আমি প্রশ্নটি আপডেট করেছি। আমি মনে করি যে আমার সমাধানটি
একান্ত কর্মক্ষেত্র

আরে, আপনি আপনার প্রশ্নের উত্তর দিতে পারেন বেশ সাধারণ।
মাউরোনিগ্রিল

0

রায়ান এইচ দ্বারা প্রস্তাবিত অবজেক্টফ্যাক্টরি পদ্ধতিগুলি ব্যবহার করে আমি এই পুরো উত্তরটি পুনরায় লেখা শুরু করেছি

এটি হেল্পার ক্লাস হিসাবে শেষ হয়েছিল যা আমি গ্রাহক অবজেক্টে তৈরি কিছু বৈশিষ্ট্যকে ব্যবহার করেছি, তবে বৈশিষ্ট্য বিকল্পগুলি হস্তান্তর করতে কীভাবে EAV + অবজেক্টফ্যাক্টরিগুলি ব্যবহার করতে হবে সে সম্পর্কে ধারণাটি এখানে রয়েছে

<?php


namespace Stti\Healthday\Helper {
    use Magento\Eav\Model\Entity\AttributeFactory;
    use Magento\Eav\Model\Entity\Attribute\OptionFactory;
    use Magento\Eav\Model\Entity\Attribute\OptionManagementFactory;
    use Magento\Framework\App\Helper\AbstractHelper;
    use Magento\Framework\App\Helper\Context;
    use Magento\Eav\Model\Entity\Attribute;
    use Stti\Healthday\Model\RelationFactory;


    /**
     * Eav data helper
     */
    class Data extends AbstractHelper {

        protected $optionFactory;

        protected $attributeFactory;

        protected $relationFactory;

        protected $optionManagementFactory;

        public function __construct(Context $context, AttributeFactory $attributeFactory, OptionFactory $optionFactory,
            RelationFactory $relationFactory,
            OptionManagementFactory $optionManagementFactory) {
            $this->optionFactory = $optionFactory;
            $this->attributeFactory = $attributeFactory;
            $this->optionFactory = $optionFactory;
            $this->relationFactory = $relationFactory;
            $this->optionManagementFactory = $optionManagementFactory;
            parent::__construct($context);
        }

        public function addRelationsHelper($answerJson, $attributeCode) {
            // IMPORTANT: READ THIS OR THE CODE BELOW WONT MAKE SENSE!!!!
            // Since magento's attribute option model was never meant to
            // hold guids, we'll be saving the guid as the label. An option_id will
            // get created, which can then be saved to the relationship table.  Then
            // the label in the attribute_option table can be changed to the actual 'word'
            // by looking up all of the options, matching on the guid, and doing a replace.
            // At that point, there will be a 1:1 relation between guid, option_id, and the 'word'



            // Get the attribute requested
            $attribute = $this->attributeFactory->create();
            $attribute  = $attribute->loadByCode("customer", $attributeCode);

            $answers = json_decode($answerJson, true);

            // Prepare vars
            //$setup = new Mage_Eav_Model_Entity_Setup('core_setup');
            $prekeys = array();
            $prevalues = array();

            foreach ($answers as $answer) {
                $prekeys[] = $answer['Key'];
                $prevalues[] = $answer['Value'];
            }

            // load up all relations
            // generate an array of matching indexes so we can remove
            // them from the array to process
            $collection = $this->relationFactory->create()->getCollection();

            $removalIds = array();
            foreach ($collection as $relation) {
                // if the item is already in the magento relations,
                // don't attempt to add it to the attribute options
                for($cnt = 0; $cnt < sizeof($answers); $cnt++) {
                    if ($relation['stti_guid'] == $prekeys[$cnt]) {
                        $removalIds[] = $cnt;
                    }
                }
            }

            // Remove the values from the arrays we are going to process
            foreach($removalIds as $removalId) {
                unset($prekeys[$removalId]);
                unset($prevalues[$removalId]);
            }

            // "reindex" the arrays
            $keys = array_values($prekeys);
            $values = array_values($prevalues);

            // prepare the array that will be sent into the attribute model to
            // update its option values
            $updates = array();
            $updates['attribute_id'] = $attribute->getId();

            // This section utilizes the DI generated OptionFactory and OptionManagementFactory
            // to add the options to the customer attribute specified in the parameters.
            for($cnt = 0; $cnt < sizeof($keys); $cnt++) {
                $option = $this->optionFactory->create();
                $option->setLabel($keys[$cnt]);
                $this->optionManagementFactory->create()->add("customer", $attributeCode, $option);
            }

            // After save, pull all attribute options, compare to the 'keys' array
            // and create healthday/relation models if needed
            $relationIds = $attribute->getOptions();
            $updatedAttributeCount = 0;
            $options = array();
            $options['value'] = array();

            for($cnt = 0; $cnt < sizeof($keys); $cnt++) {

                $option_id = 0;
                foreach($relationIds as $relationId) {
                    if ($relationId->getLabel() == $keys[$cnt]) {
                        $option_id = $relationId['value'];
                        break;
                    }
                }
                if ($option_id > 0) {
                    // Create the healthday relation utilizing our custom models DI generated ObjectFactories
                    $relation = $this->relationFactory->create();
                    $relation->setAttributeId($attribute->getId());
                    $relation->setOptionId($option_id);
                    $relation->setSttiGuid($keys[$cnt]);
                    $relation->save();

                    // Rename the attribute option value to the 'word'
                    $options['value'][$option_id][] = $values[$cnt];
                    $updatedAttributeCount++;
                }
            }

            if ($updatedAttributeCount > 0) {
                $attribute->setData('option', $options);
                $attribute->save();
            }

            // Save the relationship to the guid
            return $updatedAttributeCount;
        }
    }
}

1
আপনি অবজেক্টফ্যাক্টরি ইনজেকশন করা উচিত এবং এটি থেকে অবজেক্টের উদাহরণ তৈরি করা উচিত, অবজেক্টটি নিজেই ইনজেকশন করা উচিত নয়। ORM অবজেক্টগুলি সরাসরি ইনজেকশনের প্রয়োজন হয় না।
রায়ান হোয়ের 17

কোন অবজেক্টফ্যাক্টরী? 50 এর মত থেরেস। আমি \ ম্যাজেন্টো \ ফ্রেমওয়ার্ক \ এপি \ অবজেক্টফ্যাক্টির দিকে দেখছি তবে এটি কেবল অবজেক্টম্যানেজারের জন্য একটি মোড়কের মতো দেখাচ্ছে। আমি নিশ্চিত না কেন আমি কেবল বস্তুবাদককেই বাস্তবায়ন করব না। এই নতুন সংস্করণে জিনিসপত্রের মোড়কের জন্য প্রচুর পরিমাণে র‍্যাপার রয়েছে।
কারকম্প

1
আমি বিমূর্তে কথা বলছিলাম। আক্ষরিক 'অবজেক্টফ্যাক্টরি' নয়, আপনার প্রদত্ত বস্তুর জন্য কারখানাটি ইনজেক্ট করুন। আপনার ব্যবহৃত প্রতিটি নির্দিষ্ট ধরণের জন্য আপনাকে কারখানাটি ইনজেক্ট করা উচিত এবং প্রয়োজন অনুযায়ী সেগুলি তৈরি করা উচিত। হ্যাঁ, এটি প্রথমে অগোছালো মনে হচ্ছে ... তবে এর খুব ভাল কারণ রয়েছে। পাশেই, ইসিজি কোড মানকগুলি তবে অবজেক্টম্যানেজারের সরাসরি ব্যবহার নিষিদ্ধ। দেখুন অ্যালান ঝড় এর নিবন্ধ পুরো বিষয় ব্যাখ্যা করে: alanstorm.com/magento_2_object_manager_instance_objects
রায়ান Hoerr

আমি যে জিনিসগুলি ব্যবহার করতে চাই তার কোনও কারখানা না থাকলে আমি কী করব? উদাহরণস্বরূপ, বিকল্পগুলির পরিচালনার স্টাফকে 'ফ্যাক্টরি' করার কোনও উপায় আমি খুঁজে পাচ্ছি না। ম্যাজেন্টো \ ইভ \ মডেল \ অ্যাট্রিবিউট ফ্যাক্টরিও কেবল -> তৈরি () তৈরির পরিবর্তে একটি অদ্ভুত -> ক্রিয়েট অ্যাট্রিবিউট (ভার্স) ব্যবহার করে। আমি কেবল বলছি, আপনি যখন কোনও পণ্য, বা স্টাফ দিয়ে তৈরি কোনও বিভাগ নিয়ে কাজ করবেন না তখন জিনিসগুলি কিছুটা অদ্ভুত হয়।
কারকম্প 13

1
সমস্ত বস্তুর জন্য কারখানার প্রয়োজন হবে না। যেগুলি করে তাদের জন্য, কারখানার বাইরে বাক্সের অস্তিত্ব থাকতে পারে - যা বিদ্যমান নেই তা রানটাইম (ডিআই জেনারেশন সহ), বা সংকলনের সময় তৈরি করা হবে। আমি সংযুক্ত নিবন্ধটি পড়ুন। এটি সম্পর্কে যে কোনও উপায়ে, আপনাকে ম্যাজেন্টো 2 এর সাথে কাজ করা শিখতে হবে, এর বিপরীতে নয়। হ্যাঁ, একটি শেখার বক্ররেখা আছে। আপনি যদি ইতিমধ্যে না করেন তবে আমি পিএইচপিস্টোরম বা অনুরূপ আইডিই বাছাই করার জন্য দৃ strongly়ভাবে পরামর্শ দিচ্ছি।
রায়ান হোয়ের 14

0

আপডেট ২০১-0-০৯-১১: কুইকশিফ্টিন উল্লেখ করেছেন, এই সমাধান এম 2.1 + এর জন্য কাজ করে না। CategorySetupসেটআপের বাইরে শ্রেণি নির্ভরতা-ইনজেকশনের চেষ্টা আপনাকে মারাত্মক ত্রুটি দেবে। আরও দৃ solution় সমাধানের জন্য এখানে দেখুন: /magento//a/103951/1905


ব্যবহার করুন \Magento\Catalog\Setup\CategorySetupএই জন্য ক্লাস। এটিতে একটি addAttributeOption()পদ্ধতি রয়েছে যা ঠিক একইভাবে কাজ করে wayeav/entity_setup::addAttributeOption()এটিতে 1.xসেখানে আরও কয়েকটি বৈশিষ্ট্যযুক্ত পদ্ধতি রয়েছে যা সহায়কও হতে পারে।

আপনি কোনও সেটআপ প্রক্রিয়ার বাইরেও এই ক্লাসটি পেতে যে কোনও সময় নির্ভরতা ইনজেকশন ব্যবহার করতে পারেন।

বিশেষ করে:

/**
 * Constructor.
 *
 * @param \Magento\Catalog\Api\ProductAttributeRepositoryInterface $attributeRepository
 * @param \Magento\Catalog\Setup\CategorySetupFactory $categorySetupFactory
 */
public function __construct(
    \Magento\Catalog\Api\ProductAttributeRepositoryInterface $attributeRepository,
    \Magento\Catalog\Setup\CategorySetupFactory $categorySetupFactory
) {
    $this->attributeRepository = $attributeRepository;
    $this->categorySetupFactory = $categorySetupFactory;
}

/**
 * Create a matching attribute option
 *
 * @param string $attributeCode Attribute the option should exist in
 * @param string $label Label to add
 * @return void
 */
public function addOption($attributeCode, $label) {
    $attribute = $this->attributeRepository->get($attributeCode);

    $categorySetup = $this->categorySetupFactory->create();
    $categorySetup->addAttributeOption(
        [
            'attribute_id'  => $attribute->getAttributeId(),
            'order'         => [0],
            'value'         => [
                [
                    0 => $label, // store_id => label
                ],
            ],
        ]
    );
}

যদি ইচ্ছা হয়, আপনি attributeRepositoryক্লাসটি মুছে ফেলতে এবং getAttribute()সরাসরি ব্যবহার করতে পারেন categorySetup। আপনাকে প্রতিবার সত্তার টাইপ আইডি অন্তর্ভুক্ত করতে হবে।


হাই রায়ান, আমি CategorySetupFactoryCategorySetupConsole\Command$factory->setup()PHP Fatal error: Uncaught TypeError: Argument 1 passed to Magento\Setup\Module\DataSetup::__construct() must be an instance of Magento\Framework\Module\Setup\Context, instance of Magento\Framework\ObjectManager\ObjectManager given
এটিকে

আহ্, আমি এখন এই থ্রেডে হোঁচট খেয়েছি যেখানে আপনি জানিয়েছেন যে এটি ম্যাজেন্টো ২.১ এ কাজ করা বন্ধ করে দিয়েছে (যা আমি ব্যবহার করছি)। আমার কোডটি এখনই সংশোধন করা হচ্ছে, তবে সেই উত্তরের
উত্তরটিও

0

ম্যাজেন্টো 2 প্রোগ্রামযুক্তভাবে বিশিষ্ট বৈশিষ্ট্য বিকল্পের মান যুক্ত করুন add

Url এর পরে ম্যাজেন্টোর মূল ডিরেক্টরিতে এই স্ক্রিপ্টটি চালান।

$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); // instance of object manager
try{
      $entityType = 'catalog_product';
      $attributeCode = 'manufacturer';
      $attributeInfo = $objectManager->get(\Magento\Eav\Model\Entity\Attribute::class)
                                 ->loadByCode($entityType, $attributeCode);


      $attributeFactory = $objectManager->get('\Magento\Catalog\Model\ResourceModel\Eav\Attribute');

      $attributeId = $attributeInfo->getAttributeId();
      //$manufacturer = $item->{'Manufacturer'};
      $attribute_arr = ['aaa','bbb','ccc','ddd'];

      $option = array();
      $option['attribute_id'] = $attributeId;
      foreach($attribute_arr as $key=>$value){
          $option['value'][$value][0]=$value;
          foreach($storeManager as $store){
              $option['value'][$value][$store->getId()] = $value;
          }
      }
      if ($option) {
        $eavSetupFactory = $objectManager->create('\Magento\Eav\Setup\EavSetup');
        print_r($eavSetupFactory->getAttributeOption());
        die();
        $eavSetupFactory->addAttributeOption($option);
      }
    }catch(Exception $e){
      echo $e->getMessage();
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.