Điều gì gây ra lỗi sau: Cảnh báo: offset chuỗi bất hợp pháp 'is_in_stock' đầy Advanced AdvancedInventory.php trên dòng 87


8

Trong quá trình phát triển mô-đun, tôi đã viết một plugin sửa đổi bộ sưu tập tùy chọn sản phẩm trước khi được tải (thêm trường mô tả). Nó đây rồi:

vv / di.xml

<type name="Magento\Catalog\Model\ResourceModel\Product\Option\Collection">
    <plugin name="addOptionDescription" type="Vendor\Module\Plugin\Product\Option\Collection" sortOrder="10" disabled="false"/>
</type>

Mã số:

<?php
namespace Vendor\Module\Plugin\Product\Option;

use Vendor\Module\Model\OptionDescription;
use Magento\Catalog\Model\ResourceModel\Product\Option\Collection as OptionCollection;

class Collection
{
    /**
     * @var \Vendor\Module\Helper\Data
     */
    protected $helper;

    public function __construct(
        \Vendor\Module\Helper\Data $helper
    ) {
        $this->helper = $helper;
    }

    /**
     * @param OptionCollection $subject
     * @param bool $printQuery
     * @param bool $logQuery
     * @return array
     */
    public function beforeLoad($subject, $printQuery = false, $logQuery = false)
    {
        if (!$subject->isLoaded()) {
            $this->addDescriptionToResult($subject);
        }

        return [$printQuery, $logQuery];
    }

    /**
     * Add description to result
     *
     * If yo get error message "Warning: Illegal string offset 'is_in_stock' ... "
     * @see http://devdocs.magento.com/guides/v2.0/install-gde/trouble/php/tshoot_opcache.html
     *
     * @param OptionCollection $collection
     * @return OptionCollection $collection
     */
    private function addDescriptionToResult($collection)
    {
        $tableName = OptionDescription::TABLE_NAME;
        $joinDescriptionExpr = 'main_table.unique_option_id = option_description.unique_option_id AND option_description.store_id = 0';

        $collection->getSelect()->joinLeft(
            ['option_description' => $tableName],
            $joinDescriptionExpr,
            ['description' => 'description']
        );

        return $collection;
    }

    /**
     * Resolve current store id
     *
     * @return int
     */
    protected function getStoreId()
    {
        return $this->helper->resolveCurrentStoreId();
    }
}

Mọi thứ dường như đều ổn, nhưng ... Khi tôi cố tải trang chỉnh sửa sản phẩm hiện có (trên phụ trợ) tôi thấy lỗi sau:

Cảnh báo: offset chuỗi bất hợp pháp 'is_in_stock' trong [...] / nhà cung cấp / magento / mô-đun-catalog-tồn kho / Ui / DataProvider / Sản phẩm / Biểu mẫu / Công cụ sửa đổi / AdvancedInventory.php trên dòng 87

Trong trường hợp tôi thực hiện các thay đổi vì nó được chỉ định trong tài liệu (được đặt opcache.save_comments = 1bên trong cấu hình php-fpm của tôi), mọi thứ đều hoạt động tốt. Nhưng tôi không thể hiểu, mã nào gây ra lỗi ở trên và làm cách nào tôi có thể ngăn chặn nó mà không cần sửa đổi cấu hình?

Câu trả lời:


2

Các ExtensionAttributesFactory(và không chỉ ) sử dụng dockblocks để xác định "công cụ". (chưa chắc chính xác là gì).
Nếu bạn sử dụng bộ đệm OP, điều này có nghĩa là các tệp php của bạn sẽ được lưu vào bộ nhớ cache, được thu nhỏ và có thể sẽ chịu các sửa đổi khác.
Theo mặc định, opcache không lưu các bình luận trong phiên bản rút gọn nên $methodDocBlock = $methodReflection->getDocComment();sẽ trả về nullvà không có cách nào để tìm ra dữ liệu meta về các phương thức trong một giao diện nhất định.

Tôi biết đó không phải là một câu trả lời đầy đủ, nhưng ý tưởng là ở đây. Magento sử dụng các dockblocks để tìm ra dữ liệu meta về các phương thức, do đó bạn cần phải giữ chúng.


Cảm ơn bạn vì câu trả lời. Tôi nghĩ rằng điều này có nghĩa là tôi không thể ngăn chặn lỗi này mà không sửa đổi cấu hình.
Siarhey Uchukhlebau
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.