Toplu eylemde bir döngüde tasarruf etmekten kaçınma


13

CMS sayfaları
için olana benzer bir satır içi düzenleme eylemi içeren kendi CRUD modülümü oluşturdum Her şey yolunda, ancak EcgM2 standardı ile phpsniffer çalıştırırken bu uyarıyı alıyorum:

Döngüde model LSD yöntemi save () algılandı

Bundan nasıl kaçınabilirim?
Not: Yukarıda belirtilen çekirdek dosyayı "koklarsam" aynı uyarı görünür.
İşte executebirinin ihtiyacı olması durumunda benim yöntem. Ancak CMS sayfa denetleyicisininkine çok benzer

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
    ]);
}

Yanıtlar:


5

Bu durumda save()varlıklarınıza sahip olmanız gerekir , bu yüzden kesinlikle bu yöntemi çağırmanız gerekir.

Bağladığınız yerel çekirdek Magento dosyası, bunu yapan tek dosya değil, özellikle toplu eylemler eylem sınıfları.

Tek alternatif, saveAttributeCRUD kaynak modelinize aşağıdakilere uygulanan yöntemi temel alarak bir yöntem eklemektir 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;
}

Bu şekilde, aşağıdakileri çağırmak yerine:

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

Bunun gibi bir şey yapabilmelisiniz:

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

Yorumlarda belirtildiği gibi, AbstractAttributeörneği ihtiyaçlarınızı karşılayacak şekilde kontrol etmeniz gerekmiyorsa bu yöntemi biraz değiştirmeniz gerekir


Dikişler makul. Teşekkürler. Bir şans vereceğim ve sonuçlarla geri döneceğim.
Marius

@Marius saveAttribute, sadece bir öznitelik kodu yerine kaydetmek için bir dizi "öznitelik kodu" kabul ettiğinden , bu yöntemin EAV yönteminden biraz farklı olduğunu aklınızda bulundurun
Raphael, Dijital Piyanizm'de

1
Bunu fark ettim. Hatta biraz değiştirdim, böylece AbstractAttributeparametre olarak kabul etmeyecek ve örnekleyemeyeceğim , çünkü düz varlığımda buna ihtiyacım yok. Sorunsuz çalışır. Tekrar teşekkürler.
Marius
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.