Ce qui provoque l'erreur suivante: Avertissement: décalage de chaîne illégal 'is_in_stock'… AdvancedInventory.php sur la ligne 87

8

Pendant le développement du module, j'ai écrit un plugin qui modifie la collection d'options du produit avant son chargement (ajoute un champ de description). Le voici:

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>

Code:

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

Tout semble aller bien, mais ... Lorsque j'essaie de charger la page d'édition de produit existante (sur le backend), je vois l'erreur suivante:

Avertissement: l'offset de chaîne illégal 'is_in_stock' dans [...] / vendor / magento / module-catalog-inventory / Ui / DataProvider / Product / Form / Modifier / AdvancedInventory.php on line 87

Au cas où je ferais des changements comme il est indiqué dans les documents (définis opcache.save_comments = 1dans la configuration php-fpm), tout fonctionne bien. Mais je ne comprends pas, quel code provoque l'erreur ci-dessus et comment puis-je l'empêcher sans modifications de configuration?

Siarhey Uchukhlebau
la source

Réponses:

2

Le ExtensionAttributesFactory(et pas seulement ) utilise les dockblocks pour déterminer les "trucs". (je ne sais pas encore quoi exactement).
Si vous utilisez le cache OP, cela signifie que vos fichiers php seront mis en cache, minifiés et subiront probablement d'autres modifications.
Par défaut, l'opcache n'enregistre pas les commentaires dans la version réduite, donc $methodDocBlock = $methodReflection->getDocComment();il reviendra nullet il n'y a aucun moyen de trouver des métadonnées sur les méthodes dans une certaine interface.

Je sais que ce n'est pas une réponse complète, mais l'idée est là. Magento utilise les dockblocks pour trouver des métadonnées sur les méthodes, vous devez donc les conserver.

Marius
la source
Merci pour votre réponse. Je pense que cela signifie que je ne peux pas empêcher cette erreur sans modifications de configuration.
Siarhey Uchukhlebau