অ-ফ্ল্যাট অ্যাট্রিবিউট দ্বারা ফিল্টার পণ্য সংগ্রহ


14

আমি নিম্নলিখিতগুলি করছি:

$productCollection = Mage::getModel('catalog/product')
    ->getCollection();

$productCollection
    ->addAttributeToFilter('my_attribute', 1);

my_attribute ফ্ল্যাট টেবিলগুলিতে নেই তবে ফ্ল্যাট টেবিলগুলি সক্ষম করা আছে।

আমি সম্পূর্ণ সংগ্রহ পেতে রাখা।

কারণটি মনে হয় \Mage_Catalog_Model_Resource_Product_Collection::addAttributeToSelect:

$columns = $this->getEntity()->getAttributeForSelect($attributeCode);

কোন $this->getEntity()একটি দৃষ্টান্ত হল Mage_Catalog_Model_Resource_Product_Flatযা ফ্ল্যাট ক্ষেত্র নিয়ে আসে - এবং যদি কেউ খুঁজে পাওয়া যায়, শুধু নাল ফেরৎ।

সংগ্রহ ফিল্টারটিতে একটি ফ্ল্যাটবিহীন বৈশিষ্ট্য যুক্ত করার একটি পরিষ্কার উপায় কী?

আমার ক্ষেত্রে এটি বোঝা যাচ্ছে না, ফ্ল্যাট টেবিলের জন্য গুণটি যুক্ত করা।


হাই স্যার আপনি কি বিভ্রান্তি সমাধানের কথা ভেবেছেন ?? ওয়াট বলতে কী বোঝায় non-flat attribute? ধন্যবাদ .আর ম্যাজেন্টোকে গুলিয়ে ফেলবেন না। এটি ইতিমধ্যে বিভ্রান্তিকর
প্রতীক

আমি এমন বৈশিষ্ট্যগুলি নিয়ে কথা বলছি যা ফ্ল্যাট সূচীতে নেই। এগুলি হ'ল "প্রোডাক্ট তালিকা ব্যবহারের সাথে" যা "না" তে সেট করা আছে।
অ্যালেক্স

উত্তর:


18

আপনি নিজে প্রয়োজনীয় টেবিলে যোগ দিতে পারেন।

$productCollection = Mage::getModel('catalog/product')
->getCollection();

$table = Mage::getSingleton('eav/config')->getAttribute('catalog_product', 'my_attribute')->getBackend()->getTable();
$attributeId = Mage::getSingleton('eav/config')->getAttribute('catalog_product', 'my_attribute')->getAttributeId();

$productCollection->getSelect()->join(array('attributeTable' => $table), 'e.entity_id = attributeTable.entity_id', array('my_attribute' => 'attributeTable.value'))
                            ->where("attributeTable.attribute_id = ?", $attributeId)
                            ->where("attributeTable.value = ?", 1);

আপনি স্টোর_আইডি দ্বারাও যোগ দিতে চাইতে পারেন।


আমি মনে করি আমার এখনও সমস্যা হবে যে আমি সমস্ত স্টোরের পণ্যগুলি পাই না। (যখনই আমি আমার প্রশ্নে মূলত এই সমস্যাটি দেখিনি)। দেখে মনে হচ্ছে আমি ফ্ল্যাট সূচকগুলি সম্পূর্ণরূপে অক্ষম করতে চাই।
অ্যালেক্স

আপনার যদি সমস্ত পণ্যগুলির প্রয়োজন হয় তবে ফ্ল্যাট টেবিলগুলি আপনার বন্ধু হবে না, হ্যাঁ।
ম্যাথিয়াস জেইস

আমার ধারণা আপনি তখনই আপনার প্রশ্নটি পরিবর্তন করতে বা আমার উত্তর (যা মূল প্রশ্নের জন্য কাজ করে) গ্রহণ করতে চাইতে পারেন।
ম্যাথিয়াস জেইস

অসাধারণ .. ধারণা
অমিত বেরা

15

একটি হ্যাক (সিই ১..0.২.০++) শর্তটি একটি অ্যারে হিসাবে পাস করতে হবে এবং বিশ্বাস করতে হবে বা এটি উদ্দেশ্য হিসাবে কাজ করে না:

$collection->addFieldToFilter(array(array('attribute' => 'my_attribute', 'eq' => 1)));

কোন সূত্র কেন কাজ করে?
অ্যালেক্স

3
এটি কাজ করে কারণ ইভা সংগ্রহের addFieldToFilerজন্য একটি মোড়ক addAttributeToFilterএবং এতে অ্যারে হিসাবে গুণটি পাস করার বিকল্প রয়েছে:if (is_array($attribute)) { $sqlArr = array(); foreach ($attribute as $condition) { $sqlArr[] = $this->_getAttributeConditionSql($condition['attribute'], $condition, $joinType); } $conditionSql = '('.implode(') OR (', $sqlArr).')'; }
মারিয়াস

@ মারিয়াস, তার মানে কি এটি হ্যাক নয়? : পি এটি ব্যবহার করে ভাল লাগতে পারে?
এরফান

3
@Erfan। এটা হ্যাক না। এটি একটি বৈশিষ্ট্য।
মারিয়াস

মিষ্টি। সংগ্রহে ফিল্টার করার মতো সাধারণ জিনিসের জন্য পণ্য সারণী বাস্তবায়ন (ইভ / ফ্ল্যাট) বিমূর্ত নয় এটি এখনও বেআইনী। এর অর্থ কি আমার সর্বদা আমার কোডে অ্যাডট্রিবিউটটোফিল্টারের পরিবর্তে অ্যাডফিল্ডটোফিল্টার ব্যবহার করা দরকার, কারণ আমি জানি না এটি ইভা বা ফ্ল্যাট ব্যবহার করছে কিনা? যাইহোক অ্যাডট্রিবিউটটোফিল্টারটির বিন্দু কী?
এরফান

6

কারণ ColinM এর উত্তর কাজ করে কোড কারণে app/code/core/Mage/Catalog/Model/Resource/Product/Collection.phpএর addAttributeToFilterপদ্ধতি। আপনি যদি এই অ্যারে বিন্যাসটি ব্যবহার করেন তবে এটি কল করবে না addAttributeToSelect। ফ্ল্যাট মোডে, addAttributeToSelectঅ্যাট্রিবিউট ফ্ল্যাট টেবিলটিতে না থাকলে নিঃশব্দে ব্যর্থ হয়।

(নীচে আমার উত্তরটির পুনরায় হ্যাশ দেওয়া আছে /programming/6271284/can-i-add-other-attributes-to-magentos-flat- product-catolog-table/ 17021620 - আমি শিষ্টাচারটি এর জন্য কী তা নিশ্চিত নন তবে জানেন যে আমি এটি সহায়ক হয়েছি)

আমি ফ্ল্যাট-মোড সংগ্রহের জন্য ফ্ল্যাটবিহীন বৈশিষ্ট্যগুলি নির্বাচন এবং ফিল্টারিংয়ের জন্য একটি "পরিষ্কার" সমাধান চাইছিলাম, যা:

  • অ্যাডমিনে নির্দিষ্ট সেটিংস রাখতে অ্যাট্রিবিউটটির প্রয়োজন হয় না (এটি কোনও ব্যবহারকারীর দ্বারা যুক্ত করা যেতে পারে, বা সামনের প্রান্তে লুকানো থাকে)
  • উভয় ফ্ল্যাট এবং নন-ফ্ল্যাট মোডের জন্য কাজ করে

আমি সম্পর্কিত পণ্য সংগ্রহ ব্যবহার করেছি, তবে এটি কোনও EAV সংগ্রহে প্রযোজ্য।

ব্যর্থ কোড:

$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
    ->addAttributeToSelect( 'my_custom_attribute' )
    ->addAttributeToFilter( 'my_custom_attribute', 3 )
;

ফ্ল্যাট মোডে, উপরের কোডটি নিঃশব্দে নির্বাচন বা ফিল্টার টেবিলের মধ্যে না ঘটলে অ্যাট্রিবিউটে ফিল্টার করতে ব্যর্থ হয়।

নির্বাচন যোগ করা হচ্ছে:

$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
    ->joinAttribute( 'my_custom_attribute', 'catalog_product/my_custom_attribute', 'entity_id', null, 'left' )
    ->addAttributeToSelect( 'my_custom_attribute' )
;

joinAttributeপদ্ধতি একটি নির্দিষ্ট বৈশিষ্ট্য অনুরোধ জন্য আপনার জিজ্ঞাসিত প্রশ্নের যোগদান যোগ করা হয়েছে। বৈশিষ্ট্যটি ইতিমধ্যে ফ্ল্যাট টেবিলটিতে থাকলে এটি এখনও কার্যকর হয় তবে ফ্ল্যাট টেবিলটি বিশুদ্ধভাবে ব্যবহার করার চেয়ে কিছুটা কম দক্ষ হবে।

আমি leftসেখানে একটি জয়েন ব্যবহার করেছি , এটি নিশ্চিত করতে যে এটি যদি my_custom_attributeসেই পণ্যগুলিতে সেট না করা থাকে তবে তারা পণ্যগুলি নিয়ে আসে। innerআপনি কেবল যেখানে সারি সারণিতে আগ্রহী সেটির জন্য এটি পরিবর্তন করুন my_custom_attribute

ফিল্টারে যুক্ত করা হচ্ছে (উপরের কলিনএম অনুসারে):

$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
    ->addAttributeToFilter( array( array( 'attribute' => 'my_custom_attribute', 'eq' => 3 ) ) )
;

উপরের কোডটি এটি আপনার ফিল্টারকে মেনে চলার পাশাপাশি নির্বাচনের সাথে যুক্ত করবে।

(সিই 1.6.2.0 এ পরীক্ষিত)


4

ইন Mage_Rssমডিউল তারা একটি হল hacky-পদ্ধতি ব্যবহার ফ্ল্যাট টেবিল নিষ্ক্রিয় করতে। তারা এই সত্যটি ব্যবহার করে যে ফ্ল্যাট টেবিলগুলি সর্বদা অ্যাডমিন স্টোরের বাইরে থাকে এবং তাই কেবল অ্যাডমিন স্টোরটি অনুকরণ করে।

class Mage_Rss_Helper_Data {

[...]

/**
 * Disable using of flat catalog and/or product model to prevent limiting results to single store. Probably won't
 * work inside a controller.
 *
 * @return null
 */
public function disableFlat()
{
    /* @var $flatHelper Mage_Catalog_Helper_Product_Flat */
    $flatHelper = Mage::helper('catalog/product_flat');
    if ($flatHelper->isEnabled()) {
        /* @var $emulationModel Mage_Core_Model_App_Emulation */
        $emulationModel = Mage::getModel('core/app_emulation');
        // Emulate admin environment to disable using flat model - otherwise we won't get global stats
        // for all stores
        $emulationModel->startEnvironmentEmulation(0, Mage_Core_Model_App_Area::AREA_ADMINHTML);
    }
}

অনুকরণ শুরুর পরে আপনার এটি পুনরায় সেট করা উচিত emulationModel->stopEnvironmentEmulation()


3 দিন আগে এই উত্তরটি কোথায় ছিল? ;: _;
এসজি

এখানেই? 20 মার্চ থেকে
অ্যালেক্স

1

আপনি যখন বৈশিষ্ট্যটি তৈরি করেন এটি বিশ্বব্যাপী স্তরে এবং ফিল্টারযোগ্য হতে হবে। এই স্তরযুক্ত নেভিগেশনে এটি ব্যবহারযোগ্য হবে। এছাড়াও এটির জন্য ড্রপডাউন বা মাল্টিসিলেট বৈশিষ্ট্যটির প্রয়োজন হবে। এক্ষেত্রে আপনার প্রয়োজন অনুসারে মূল ফাইলগুলি পরিবর্তন করার বিরুদ্ধে আমি ব্যক্তিগতভাবে পরামর্শ দেব


আমি ফ্রন্টএন্ড ফিল্টারে অ্যাট্রিবিউটটি চাই না - আমি কেবল অভ্যন্তরীণ ব্যবহারের জন্য সংগ্রহ ফিল্টারিং করতে চাই।
অ্যালেক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.