প্রোগ্রাম ভিউ আপগ্রেড স্ক্রিপ্টে মুছুন


12

আমি প্রোগ্রামের মতো কোনও স্টোর ভিউ মুছতে চাই । তাকানো Mage_Adminhtml_System_StoreController::deleteStorePostAction(), এটি বেশ সহজ (সামান্য কোডটি সংক্ষিপ্ত করে):

$model = Mage::getModel('core/store')->load($id);

if ($model->getId() && $model->isCanDelete()) {
    $model->delete();
    Mage::dispatchEvent('store_delete', array('store' => $model));
}

আমি এই কোডটি একটি ডেটা আপগ্রেড স্ক্রিপ্টে রাখতে চাই যাতে মুছাটি স্বয়ংক্রিয়ভাবে কার্যকর হবে।

সমস্যাটি হ'ল data/ম্যাজেন্টোতে আপগ্রেড স্ক্রিপ্টগুলি সম্পাদন করার সময় কেবলমাত্র অঞ্চলে কনফিগার করা ইভেন্ট পর্যবেক্ষককে কল করুন ( ম্যাজেন্টো স্ট্রাকচার আপডেটগুলি বনাম ডেটা আপডেট দেখুন )। ইভেন্টটির মতো এবং এর জন্য কিছু নির্দিষ্ট পর্যবেক্ষকরা অঞ্চলে সংজ্ঞায়িত হন যাতে তারা কার্যকর করা যায় না। স্টোর ভিউ মুছে ফেলা ব্যাকএন্ডে চালিত মুছে ফেলার মতো হ্যান্ডেল করা হবে না।globalenterprise_cmsenterprise_searchstore_delete_afteradminhtml

আপনি কীভাবে এভাবে পরিচালনা করছেন? আপগ্রেড স্ক্রিপ্টগুলিতে অতিরিক্ত ইভেন্টের ক্ষেত্রগুলি নিজেকে লোড করুন (আমি সে সম্পর্কে ভয় পাচ্ছি)? আপগ্রেড স্ক্রিপ্টের মতো ডেটা পরিবর্তনগুলি করবেন না তবে আপনার যাদুকরী স্ক্রিপ্টগুলিকে কোনও পবিত্র লুকানো জায়গায় রেখে ম্যানুয়ালি এটিকে কার্যকর করবেন?


1
সমস্যাজনকভাবে আপনার কেন স্টোর ভিউ মুছতে হবে?
oleksii.svarychevskyi

কারণ আমাদের বেশ কয়েকটি পরিবেশ রয়েছে এবং সমস্ত কনফিগারেশন পরিবর্তন প্রোগ্রামিয়ালি পরিবর্তন করা এটি দ্রুত এবং আরও নির্ভরযোগ্য।
ম্যাথিয়াস জেইস

এর সমাধান কি কখনও খুঁজে পেয়েছেন? আপনি কতবার এটি করবেন? ব্যক্তিগতভাবে, আমি দ্বিতীয় বিকল্পটির জন্য যাব "আপগ্রেড স্ক্রিপ্টে এর মতো ডেটা পরিবর্তন করা যাবেন না তবে আপনার যাদুবিদ্যাগত স্ক্রিপ্টগুলিকে কোনও পবিত্র লুকানো স্থানে রাখুন এবং ম্যানুয়ালি এটি কার্যকর করবেন?"
প্রক্সি ব্লু

আরও গুরুত্বপূর্ণ কাজ করার কারণে আমি এই বিষয়টি স্থগিত করেছি। ম্যাজেন্টো এসই এর নিজস্ব @ ফিলওয়িংকল টুইটারে জবাব দিয়েছিল: "আমি এগুলি একটি কাতারে করি; অথবা একটি ট্যান্ডেম অ্যাডমিনটিচটিএমএল প্রেরণের ইভেন্টটি শুনি এবং গুলি চালাই (ওরফে ভুয়া এটি)" ( টুইটার . com/ ফিল্ম উইঙ্কল / স্ট্যাটাস/428183845985210369 )। আমি বিশ্বাস করি এটি আমার পক্ষে খুব ঝুঁকিপূর্ণ এবং যদিও আমি এই পদ্ধতিকে পছন্দ করি না তবে আমি নিজেই এটি করব।
ম্যাথিয়াস জেইস

@ মাথিয়াসজেস আপনি কি উত্তর হিসাবে যুক্ত করতে পারেন এবং উত্তরহীন প্রশ্নগুলি গণনা রাখতে এটি গ্রহণ করতে পারেন?
স্যান্ডার ছিন্নভিন্ন করা

উত্তর:


6

সুতরাং আমি ম্যাথিয়াসে এটি টুইট করার পরে খুব শীঘ্রই আমি রেডিও নীরবতায় চলে গেলাম। আমি আশা করি আপনি কয়েক সপ্তাহ ধরে এই উত্তরটির অপেক্ষায় থাকায় আপনি এই সাসপেন্সটি অনুভব করেছেন।

"আমি এইগুলিকে একটি সারিতে করি" বলতে আমি যা বোঝাতে চাইছি তার প্রত্যক্ষ প্রতিক্রিয়াতে:

ইভেন্ট স্টোর_ডিলিট_এফটারের জন্য এন্টারপ্রাইজ_সিএমএস এবং এন্টারপ্রাইজ_সার্চের মতো কিছু নির্দিষ্ট পর্যবেক্ষক অ্যাডমিনটিচটিএমএল অঞ্চলে সংজ্ঞায়িত করা হয় যাতে তারা কার্যকর হয় না get স্টোর ভিউ মুছে ফেলা ব্যাকএন্ডে চালিত মুছে ফেলার মতো হ্যান্ডেল করা হবে না।

সারি পদ্ধতি:

যখন আমি জানি যে এমন কিছু ইভেন্ট রয়েছে যা সঠিক প্রসঙ্গে আগুন নেবে না (বেশিরভাগ EE এর জন্য, তবে অন্যান্য প্রসঙ্গে প্রযোজ্য হতে পারে) আমি সাধারণত মুছে ফেলাটি একটি কাতারে সরিয়ে রাখি যাতে এটি প্রসঙ্গে চলে যেত এটির প্রয়োজন ।

অন্য কথায়, একটি সারি টেবিল তৈরি করুন (বা রেবিটএমকিউতে সারি / বিষয় ইত্যাদি) যাতে লেনদেনের বিবরণ এবং ইভেন্ট হুকগুলি যা শোনা উচিত তা ধারণ করে। এটি আপনি যেমনটি চান তেমন মার্জিত বা সরল হতে পারে। এখানে একটি বেসিক

$queue = Mage::getModel('yourcompany/queue_job')
         ->setJobType('delete')
         ->setEntityType('core/store')
         ->setEntityId(12)
         ->setDispatchEvent('store_delete')
         ->setDispatchEventDataKey('store')
         ->save();

এবং তারপরে ক্রোনকে পরে একটি ক্রোনটিতে কাজ করুন, এখন কোন স্টোরটি "চলমান" চলছে তার উপর এখন আপনার নিয়ন্ত্রণ রয়েছে (ওরফে আপনি কেবল এটি চালাচ্ছেন যেন এটি প্রশাসক, স্টোর 0):

foreach(Mage::getModel('yourcompany/queue_job')->getCollection() as $job){
    if($job->getJobType()=='delete'){

        $model = Mage::getModel($this->getEntityType())->load($this->getEntityId());

        if ($model->getId() && $model->isCanDelete()) {
            $model->delete();
            Mage::dispatchEvent($job->getDispatchEvent(), array($job->setDispatchEventDataKey() => $model));
        }
    }
}

স্পষ্টতই যদি আপনি অভিনব হয়ে থাকেন তবে আপনি চেষ্টা / ক্যাপচারে আবদ্ধ হন এবং কোনও লেনদেনে মোড়কে রাখেন। আমার মনে হয় আপনি সারাংশ পাবেন

ঘটনাটি প্রাসঙ্গিকভাবে প্রসঙ্গ নিয়ন্ত্রণ করার পক্ষে এটি সম্ভবত একমাত্র উপায়।

ট্যান্ডেম ইভেন্টের পদ্ধতি:

আপনি নিজেই "অ্যাডমিনটিএমটিএল" পদ্ধতিটি ফায়ার করতে পারেন - অ্যালান আপনাকে এটির প্রভাবিত করতে কী করবে তার একটি সুন্দর শালীন ব্যাখ্যা দেয় তবে মূলত এটি এর মতোই:

#File: app/code/core/Mage/Adminhtml/controllers/CustomerController.php
public function saveAction()
{
    //...
    $customer->save();
    //...
    Mage::dispatchEvent('adminhtml_customer_prepare_save', array(
        'customer'  => $customer,
        'request'   => $this->getRequest()
    ));        
    //..
}

গ্রাহক সেভের অ্যাডমিন সংস্করণ নিয়মিত মডেলটিকে সেভ কল করে এবং প্রশাসনিক ইভেন্টটি পরে প্রেরণ করে। আপনি যদি ইচ্ছা করেন তবে আপনি নিজের পর্যবেক্ষকের মধ্যে এর বিপরীতটি করতে পারেন do


5

শালা, আমি আমাকে কিছু philwinkle ভালবাসেন, কিন্তু আমি কাজের পরামিতি পরিবহনের জটিলতা / ভঙ্গুরতা সঙ্গে মতানৈক্য আছে এবং এলাকা ( adminhtml | নিম্নলিখিতরূপে crontab পরিবর্তন | ফ্রন্টএন্ড | বিশ্বব্যাপী | ইনস্টল ) একটি সারিতে, বিশেষ করে যদি যে কিউ নির্বাহ হতে যাচ্ছে একটি ম্যাজেন্টো প্রসঙ্গ। যদি এমন কোনও মিশ্র প্রসঙ্গ থাকে যার পরিচালনা করা দরকার তবে কিউ সমাধানটি বর্তমান "ইস্যু" এর একটি পুনরায় বাস্তবায়ন!

আমি মনে করি কিউ পদ্ধতির ভঙ্গুর। আমার যুক্তি হ'ল অকাল সময়ত ইভেন্ট অঞ্চল লোড করা আসলেই মোটেই সমস্যা নয়। এটি ব্যাখ্যা করতে, আসুন ব্যাক আপ করুন এবং সমস্যাটি দেখুন:

মৃত্যুর ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফেলার সময় আগে কোনও ইভেন্টের ক্ষেত্রটি লোড করার বিপদ কী?

এটি বুঝতে আমাদের অবশ্যই সম্পাদনের প্রসঙ্গে ইভেন্টের ক্ষেত্রগুলি পরীক্ষা করতে হবে। ম্যাথিয়াস, আমি কল্পনা করেছি যে আপনি এটি ইতিমধ্যে জানেন তবে অন্যের প্রশংসার জন্য:

Mage_Core_Model_App::run()ফ্রন্ট কন্ট্রোলারের কাছে অনুরোধ প্রেরণের আগে ডেটা সেটআপ স্ক্রিপ্টগুলি কার্যকর করা হয় :

public function run($params)
{
    $options = isset($params['options']) ? $params['options'] : array();
    $this->baseInit($options);
    Mage::register('application_params', $params);

    if ($this->_cache->processRequest()) {
        $this->getResponse()->sendResponse();
    } else {
        $this->_initModules();
//Global event area is loaded here
        $this->loadAreaPart(Mage_Core_Model_App_Area::AREA_GLOBAL, Mage_Core_Model_App_Area::PART_EVENTS);

        if ($this->_config->isLocalConfigLoaded()) {
            $scopeCode = isset($params['scope_code']) ? $params['scope_code'] : '';
            $scopeType = isset($params['scope_type']) ? $params['scope_type'] : 'store';
            $this->_initCurrentStore($scopeCode, $scopeType);
            $this->_initRequest();
//Data setup scripts are executed here: 
            Mage_Core_Model_Resource_Setup::applyAllDataUpdates();
        }

        $this->getFrontController()->dispatch();
    }
    return $this;
}

ডেটা সেটআপ স্ক্রিপ্টগুলি কার্যকর করার সময় গ্লোবাল ইভেন্টের অঞ্চলটি লোড হয়ে যায়। রাউটিং-প্রাসঙ্গিক ঘটনা এলাকাসমূহ ( ফ্রন্টএন্ড বা adminhtml ) তার পরে সময় লোড থাকা Mage_Core_Controller_Varien_Action::preDispatch()একটি নিয়ামক কর্ম (মিলে রাউটার ফলে areaনাম উত্তরাধিকার মাধ্যমে সেট করা হয়):

public function preDispatch()
{
    //...
    Mage::app()->loadArea($this->getLayout()->getArea());
    //...
}

সুতরাং সাধারণত অ্যাপ্লিকেশন সূচনা করার সময় কেবলমাত্র বৈশ্বিক ইভেন্টের ক্ষেত্রের অধীনে কনফিগার করা পর্যবেক্ষকরা কার্যকর করা হবে। যদি সেটআপ স্ক্রিপ্ট যেমন কিছু করে

$this->loadAreaPart(Mage_Core_Model_App_Area::AREA_ADMINHTML, Mage_Core_Model_App_Area::PART_EVENTS);

তবে কেবল দুটি বিপদ রয়েছে:

  1. একটি পর্যবেক্ষক অধীনে ত্রুটিপূর্ণভাবে হয়েছে adminhtml প্রসঙ্গ-কম ঘটনা পালন করা যেমন controller_front_init_beforeবাcontroller_front_init_routers
  2. অনুরোধটি একটি সম্মুখভাগের অনুরোধ।

# 1 এর জন্য গ্রেপ করা সহজ হওয়া উচিত। # 2 আসল উদ্বেগ, এবং আমি মনে করি যে প্রতিবিম্বই সমস্যাটি সমাধান করতে পারে (নোট করুন যে আমি প্রতিফলন ব্যবহার করে ভীতিকরভাবে অনভিজ্ঞ):

<?php

//Start setup script as normal
$installer = $this;
$installer->startSetup()

//Load adminhtml event area
Mage::app()->loadAreaPart(
    Mage_Core_Model_App_Area::AREA_ADMINHTML,
    Mage_Core_Model_App_Area::PART_EVENTS
);

// your setup script logic here

//I hope this isn't a bad idea.
$reflectedApp = new ReflectionClass('Mage_Core_Model_App');
$_areas = $reflectedApp->getProperty('_areas');
$_areas->setAccessible(true);
$areas = $_areas->getValue(Mage::app());
unset($areas['adminhtml']);
$_areas->setValue(Mage::app(),$areas); //reset areas

//End setup script as normal
$installer->endSetup()

আমি এটি পরীক্ষা করে দেখিনি, তবে এটি অ্যাডমিনটিচটিএমএল ইভেন্ট সূচক এবং সংশ্লিষ্ট Mage_Core_Model_App_Areaঅবজেক্টটিকে সরিয়ে দেয়।


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