Cosa causa il seguente errore: Avviso: Offset stringa illegale 'is_in_stock'… AdvancedInventory.php sulla riga 87


8

Durante lo sviluppo del modulo ho scritto un plugin che modifica la raccolta di opzioni del prodotto prima che fosse caricata (aggiunge un campo di descrizione). Eccolo:

etc / 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>

Codice:

<?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();
    }
}

Tutto sembra andare bene, ma ... Quando provo a caricare la pagina di modifica del prodotto esistente (sul backend) vedo il seguente errore:

Avvertenza: offset di stringa illegale 'is_in_stock' in [...] / vendor / magento / module-catalog-inventario / Ui / DataProvider / Prodotto / Modulo / Modificatore / AdvancedInventory.php on line 87

Nel caso in cui apporti delle modifiche come indicato nei documenti (impostato opcache.save_comments = 1nella mia configurazione php-fpm) tutto funziona bene. Ma non riesco a capire, quale codice causa l'errore sopra e come posso prevenirlo senza modifiche di configurazione?

Risposte:


2

Il ExtensionAttributesFactory(e non solo ) usa i dockblock per determinare "roba". (non sono ancora sicuro di cosa esattamente).
Se usi la cache OP, questo significa che i tuoi file php verranno memorizzati nella cache, minimizzati e probabilmente subiranno altre modifiche.
Per impostazione predefinita, opcache non salva i commenti nella versione minimizzata, quindi $methodDocBlock = $methodReflection->getDocComment();tornerà nulle non c'è modo di scoprire i metadati sui metodi in una determinata interfaccia.

So che non è una risposta completa, ma l'idea è qui. Magento utilizza i dockblock per scoprire i metadati sui metodi, quindi è necessario conservarli.


La ringrazio per la risposta. Penso che ciò significhi che non posso prevenire questo errore senza modifiche alla configurazione.
Siarhey Uchukhlebau,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.