سؤال

أقوم بإنشاء برنامج إعداد في Magento 1.7 CE لنقل بعض بيانات الفئة من سمة إلى أخرى.يعمل البرنامج النصي، ولكنه بطريقة ما يحفظ فقط في نطاق عرض المتجر (فقط معرف عرض المتجر 1)، على الرغم من أنني أخبره صراحةً بالحفظ في نطاق المسؤول.

الكود الحالي الخاص بي:

<?php

$installer = $this;

$installer->startSetup();

$categories = Mage::getResourceModel('catalog/category_collection')
    ->addAttributeToSelect('description')
    ->addAttributeToSelect('text_onder')
    ->addAttributeToFilter('description_position', 0)
    ->setStoreId(0)
    ->addFieldToFilter('entity_id', 93)
    ;

$resource = Mage::getModel('catalog/category')->getResource();

foreach ($categories as $category) {
    $object = new Varien_Object(array(
        'entity_id'     => $category->getId(),
        'description'   => '',
        'text_onder'    => $category->getDescription(),
        'store_id'      => 0
    ));

    $resource->saveAttribute($object, 'text_onder');
    $resource->saveAttribute($object, 'description');
}

$installer->endSetup();

عامل التصفية الموجود على معرف الكيان مخصص للاختبار فقط بالطبع.

تم إنشاء السمة text_onder على النحو التالي:

$installer->addAttribute('catalog_category', "text_onder", array(
    'group'             => 'General Information',
    'type'              => 'text',
    'input'             => 'textarea',
    'label'             => 'Tekst onder',
    'visible'           => 1, 
    'required'          => 0,
    'user_defined'      => 0,
    'searchable'        => 0,
    'filterable'        => 0,
    'comparable'        => 0,
    'visible_on_front'  => 1,
    'visible_in_advanced_search'    => 1,
    'is_html_allowed_on_front'      => 1,
    'is_configurable'   => 0,
    'global'            => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE,
    'wysiwyg_enabled'   => true,

));
هل كانت مفيدة؟

المحلول

أولا وقبل كل شيء، قمت بتغيير البرنامج النصي الخاص بك قليلا (بينما كنت أبحث عن سبب فشله). هنا هي النتيجة:

giveacodicetagpre.

ومع ذلك، كانت المشكلة الحقيقية في مكان آخر. لا يعمل الكود الخاص بك ولا لي ضمن برنامج نصي تثبيت / ترقية. تحتاج إلى وضع هذا الرمز في البرنامج النصي للبيانات!

من أجل القيام بذلك، حرك ملفك من SQL / Module_name / Upgrade-X.x.x-y.y.y.php إلى البيانات / module_name / data-upgrade-x.x.x-y.y.y.php وسيعمل مثل سحر.

اسمحوا لي أن أعرف إذا فعلت :).

تحديث لقد أحرجت في Magento Core قليلا ووجدت إجابة حول سبب حدوث ذلك.

دعونا نلقي نظرة كيف تقوم Magento بتثبيت / ترقية / البرامج النصية للبيانات.

كل شيء يبدأ في طريقة mage_core_model_app :: تشغيل التشغيل. هذه الطريقة تستدعي اثنين من طرق mage_core_model_resource_setup:

  1. mage_core_model_resource_setup :: applyallupdates () - يتم استدعاء هذا في الواقع داخل الأسلوب _initmodules () التي يتم استدعاؤها في طريقة التشغيل ()، ولكن سردها هنا للحصول على البساطة [السطر 343]
  2. mage_core_model_resource_setup :: applyalldataupdates () [سطر 351]
  3. عندما تنظر إلى تلك الأساليب في mage_core_model_resource_setup (وهو فئة تمتد mage_eav_model_entity_setity_setup من وكذلك أي فئات إعداد موارد أخرى)، يمكنك ملاحظة أن applyallupdates () يبدأ مع

    giveacodicetagpre.

    و spectalldataupdates () لا يسميه هذه الوظيفة على الإطلاق.

    الآن، دعنا نعود إلى فئة Mage_core_Model_App وطريقة GetStore (ID $):

    giveacodicetagpre.

    لذلك عندما لم يتم تثبيت Magento أو ... في وضع التحديث، تم تعيينه إلى True - إنه يتجاهل معرف $ المعطى كمعلمة واسترداد مثيل المتجر الافتراضي دائما.

    المضي قدما من هناك، عند استخدام حفظ () على mage_catalog_model_category، يذهب الطلب مثل هذا:

    1. المكالمات حفظ () على mage_core_model_abstract
    2. MAGE_CORE_MODEL_ABSTRACT SIالمات حفظ () على فئة الموارد على السطر 318 (وهذا هو المكان الذي يحصل فيه على فئة الموارد وأين يقع الكود الخاص بك في ذلك). في هذه الحالة، تسميها حفظ () على mage_eav_model_entity_abstract
    3. كجزء من وحدة حفظ ()، mage_eav_model_entity_abstract calls _processsavedata () طريقة على السطر 1123
    4. تلك الطريقة تتصل _updattribute () طريقة mage_catalog_model_resource_abstract
    5. _updattrebute () يستدعي _saveattributevalue () من نفس الفئة
    6. وهذه الوظيفة لديها الخط الذي يسبب كل هذا هنا (انظر الكود أدناه)
    7. mage_catalog_model_resource_abstract، Line 219

      giveacodicetagpre.

نصائح أخرى

توجد بعض المشكلات في التعليمات البرمجية. لا يتم تحديد وضع الموارد في المنطقة المناسبة.

من فضلك حاول هذا

$categories = Mage::getResourceModel('catalog/category_collection')
    ->addAttributeToSelect('description')
    ->addAttributeToSelect('text_onder')
    ->addAttributeToFilter('description_position', 0)
    ->setStoreId(0)
    ->addFieldToFilter('entity_id', 4)
    ;



foreach ($categories as $category) {

        echo $category->getId();
        $object =$category->getDescription().'aaaa';
        $category->setStoreId(0);
        $category->setData('description',$object );
        $category->getResource()->saveAttribute($category, 'description');

}

ملحوظة: $category->setStoreId(0) يستخدم 0 for global/admin ويمكنك أن change 0 to your store according to your code in which store you want to set data

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى magento.stackexchange
scroll top