ভর কর্মে একটি লুপ সংরক্ষণ এড়ানো


13

আমি আমার নিজস্ব সিআরইউডি মডিউল তৈরি করেছি যা সিএমএস পৃষ্ঠাগুলির জন্য অনুরূপ একটি ইনলাইন সম্পাদনা ক্রিয়া ধারণ করে
সবকিছু ঠিকঠাক কাজ করে, তবে যখন ইকিজএম 2 স্ট্যান্ডার্ডের সাথে পিএইচপিএসফিন্ফার চালনা করি তখন আমি এই সতর্কতাটি পাই:

লুপে মডেল এলএসডি পদ্ধতি সংরক্ষণ () সনাক্ত হয়েছে

আমি কীভাবে এড়াতে পারি?
দ্রষ্টব্য: আমি উপরে লিঙ্কিত মূল ফাইলটি "শুঁক" দিলে একই সতর্কতা উপস্থিত হয়।
কারওর প্রয়োজনে আমার executeপদ্ধতিটি এখানে । তবে এটি সিএমএস পৃষ্ঠা নিয়ন্ত্রকের মতো একটির মতো

public function execute()
{
    /** @var \Magento\Framework\Controller\Result\Json $resultJson */
    $resultJson = $this->jsonFactory->create();
    $error = false;
    $messages = [];

    $postItems = $this->getRequest()->getParam('items', []);
    if (!($this->getRequest()->getParam('isAjax') && count($postItems))) {
        return $resultJson->setData([
            'messages' => [__('Please correct the data sent.')],
            'error' => true,
        ]);
    }

    foreach (array_keys($postItems) as $authorId) {
        /** @var \Sample\News\Model\Author $author */
        $author = $this->authorRepository->getById((int)$authorId);
        try {
            $authorData = $this->filterData($postItems[$authorId]);
            $this->dataObjectHelper->populateWithArray($author, $authorData , AuthorInterface::class);
            $this->authorRepository->save($author);
        } catch (LocalizedException $e) {
            $messages[] = $this->getErrorWithAuthorId($author, $e->getMessage());
            $error = true;
        } catch (\RuntimeException $e) {
            $messages[] = $this->getErrorWithAuthorId($author, $e->getMessage());
            $error = true;
        } catch (\Exception $e) {
            $messages[] = $this->getErrorWithAuthorId(
                $author,
                __('Something went wrong while saving the author.')
            );
            $error = true;
        }
    }

    return $resultJson->setData([
        'messages' => $messages,
        'error' => $error
    ]);
}

উত্তর:


5

যে ক্ষেত্রে আপনি করতে হবে সালে save()আপনার সত্ত্বা, তাই আপনি স্পষ্টভাবে যে পদ্ধতি কল করতে হবে।

আপনার লিঙ্ক করা নেটিভ কোর ম্যাজেন্টো ফাইলটি কেবল এটিই নয়, বিশেষত গণ ক্রিয়া কর্মের ক্লাস।

একমাত্র বিকল্প হ'ল saveAttributeবাস্তবায়িত একটির ভিত্তিতে আপনার সিআরইউডি সংস্থান মডেলটিতে একটি পদ্ধতি যুক্ত করা app/code/Magento/Sales/Model/ResourceModel/Attribute.php:

public function saveAttribute(AbstractModel $object, $attribute)
{
    if ($attribute instanceof AbstractAttribute) {
        $attributes = $attribute->getAttributeCode();
    } elseif (is_string($attribute)) {
        $attributes = [$attribute];
    } else {
        $attributes = $attribute;
    }
    if (is_array($attributes) && !empty($attributes)) {
        $this->getConnection()->beginTransaction();
        $data = array_intersect_key($object->getData(), array_flip($attributes));
        try {
            $this->_beforeSaveAttribute($object, $attributes);
            if ($object->getId() && !empty($data)) {
                $this->getConnection()->update(
                    $object->getResource()->getMainTable(),
                    $data,
                    [$object->getResource()->getIdFieldName() . '= ?' => (int)$object->getId()]
                );
                $object->addData($data);
            }
            $this->_afterSaveAttribute($object, $attributes);
            $this->getConnection()->commit();
        } catch (\Exception $e) {
            $this->getConnection()->rollBack();
            throw $e;
        }
    }
    return $this;
}

এইভাবে, নিম্নলিখিতগুলিকে কল করার পরিবর্তে:

$this->authorRepository->save($author);

আপনার এমন কিছু করতে সক্ষম হওয়া উচিত:

$author->getResource()->saveAttribute($author, array_keys($authorData));

মন্তব্যে যেমন বলা হয়েছে, আপনার প্রয়োজনের AbstractAttributeসাথে মেলে ধরতে আপনার যদি প্রয়োজনের পরীক্ষা করতে না হয় তবে আপনাকে সেই পদ্ধতিটি কিছুটা সংশোধন করতে হবে


যুক্তিসঙ্গত। ধন্যবাদ। আমি এটিকে একটি শট দেব এবং ফলাফলগুলি নিয়ে ফিরে আসব।
মারিয়াস

@ মারিয়াস কেবল মনে রাখবেন যে এই পদ্ধতিটি EAV পদ্ধতির চেয়ে কিছুটা আলাদা saveAttributeকারণ এটি কেবল একটি বৈশিষ্ট্য কোডের পরিবর্তে সংরক্ষণ করার জন্য "অ্যাট্রিবিউট কোডগুলি" এর অ্যারে গ্রহণ করে
ডিজিটাল পিয়ানোজমে

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