Magento 2 CMS পৃষ্ঠা getList () সংগ্রহের পদ্ধতিগুলি প্রত্যাশিত অবজেক্টটি ফেরায় না


10

আমার সমস্ত সিএমএস পৃষ্ঠা মুছতে হবে।

কোডটি এখানে:

নেমস্পেস শীঘ্রই ore কোর \ সেটআপ;

Magento \ Cms; Api \ PageRepositoryInterface ব্যবহার করুন;
ম্যাজেন্টো \ ফ্রেমওয়ার্ক \ এপি \ অনুসন্ধান ক্রিটরিয়া ইন্টারফেস ব্যবহার করুন;

বর্গ সেন্টিমিটার
{
    / **
     * @vvvar অনুসন্ধান ক্রিটরিয়া ইন্টারফেস
     * /
    ব্যক্তিগত $ অনুসন্ধান ক্রিটরিয়া;
    / **
     * @var পেজরেপোসিটোরি ইন্টারফেস
     * /
    বেসরকারী $ সেমিপেইজরেপসিটরি;

    / **
     * সেমি নির্মাণকারী।
     * @ পরিমাপ অনুসন্ধান ক্রিটেরিয়া ইন্টারফেস - অনুসন্ধান ক্রিটরিয়া
     * @ পেপার পেজরেপোসিটোরি ইন্টারফেস $ সেমিপেজেরপোজিটরি
     * /
    পাবলিক ফাংশন __ কনস্ট্রাক্ট (
        অনুসন্ধান ক্রিটেরিয়া ইন্টারফেস $ অনুসন্ধান ক্রিটরিয়া,
        পেজরেপোসিটোরি ইন্টারফেস $ সেমিপেজেরোপোসিটোরি
    )
    {
        $ এটি-> অনুসন্ধান ক্রিটরিয়া = $ অনুসন্ধান ক্রিটরিয়া;
        $ এটি-> cmsPageRepository = $ cmsPageRepository;
    }

    / **
     * বিদ্যমান সমস্ত সিএমএস পৃষ্ঠা মুছুন
     * /
    পাবলিক ফাংশন ক্লিনক্যাম্পেজ ()
    {
        $ সেমিপেজ সংগ্রহশালা = $ এটি-> সেমিপেজরেপোসিটোরি
            -> getList ($ this-> searchCriteria)
            -> getItems ();

        ফোরচ ($ সেমিপেজ সংগ্রহ হিসাবে $ সেমিপেজ) {
            $ This-> cmsPageRepository-> মুছুন ($ cmsPage);
        }
    }
}

সুতরাং, কলিংয়ের \Soon\Core\Setup\Cms::cleanCmsPagesসমস্ত সিএমএস পৃষ্ঠা মুছে ফেলা উচিত।

তবে এটি করার সময় আমি এই ত্রুটিটি পেয়েছি:

Argument 1 passed to Magento\Cms\Model\PageRepository::delete() must implement interface Magento\Cms\Api\Data\PageInterface, array given

তাই আমি ব্যবহৃতটি $cmsPageআমার মধ্যে ফেলে দিয়েছিলাম foreach ($cmsPageCollection as $cmsPage)এবং এটি প্রদর্শিত হয় যে প্রকৃতপক্ষে $cmsPageএকটি অ্যারে।

আমি কোডটি খনন করেছি:

\Magento\Cms\Api\PageRepositoryInterface::getListদ্বারা প্রয়োগ করা হয় \Magento\Cms\Model\PageRepository::getList

তারপরে \Magento\Cms\Model\PageRepository::getList, আমরা এই বিট কোডটি দেখতে পারি:

            $ পৃষ্ঠাগুলি [] = $ এটি-> ডেটাঅবজেক্টপ্রসেসর-> বিল্ডআউটপুট ডেটাআর্রে (
                $ PageData,
                'Magento \ সেমি \ Api, \ ডেটা \ PageInterface'
            );
        }
        $ SearchResults-> setItems ($ পৃষ্ঠাগুলি);

আমি যদি সঠিক হয় তবে এই কোডটি একটি অ্যারে তৈরি করে যা অ্যারেকে জনপ্রিয় করে $pagesতোলে। সুতরাং এই কোড ব্যাখ্যা করতে পারে কেন $cmsPageএকটি অ্যারে হয়!

কিন্তু ...

পড়ার মাধ্যমে @returnবিবৃতি \Magento\Cms\Api\PageRepositoryInterface::getList, আমরা দেখতে পারি @return \Magento\Cms\Api\Data\PageSearchResultsInterface

এবং, এরপরে @returnবিবৃতিটি পড়ে \Magento\Cms\Api\Data\PageSearchResultsInterface::getItemsআমরা দেখতে পারি \Magento\Cms\Api\Data\PageInterface[]!

সুতরাং $cmsPageআমার foreachলুপটি এমন একটি বাস্তবায়ন হওয়া উচিত \Magento\Cms\Api\Data\PageInterfaceযা তারপরে যথাযথভাবে পাস করা যেতে পারে \Magento\Cms\Api\PageRepositoryInterface::delete

কে ভুল?

  1. আমি যারা @api মন্তব্য এবং কোড সঠিকভাবে পড়তে / বুঝতে পারি না
  2. ম্যাজেন্টো যারা তাদের @ এপিআই ক্লাসগুলিতে সঠিক মন্তব্য না দেয় ... বা ইন্টারফেসটি যেমনটি করা উচিত তেমন প্রয়োগ করে না।

এই বিশ্লেষণটি সিএমএস পৃষ্ঠা API এর জন্য তবে এটি সিএমএস ব্লক এপিআইতে প্রযোজ্য ।


1
ত্রুটির যেমন দেখায়, সম্প্রতি কেউ রিপোর্ট: github.com/magento/magento2/issues/7140
Wojtek Naruniec

উত্তর:


2

আপনি চাইলে গিথুবে বাগ ইস্যু তৈরি করতে পারেন। তবে আপনার জন্য আরও দ্রুততর উপায় হ'ল সংস্থান মডেল ব্যবহার করা বা আপনি যদি এই সন্ধানের পদ্ধতিটি ডিলিটবাইআইডি () ব্যবহার করতে চান যেখানে আপনি সত্তার আইডি পাস করতে পারেন।

বিক্রেতা / Magento / মডিউল-CMS / মডেল / PageRepository.php

public function deleteById($pageId)
{
    return $this->delete($this->getById($pageId));
}

ভান্ডারগুলি বাল্ক অপারেশনের জন্য নয়, এটি কার্য সম্পাদনকে প্রভাবিত করে।

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