Magento 2.2 - Добавить имя атрибута к названию продукта (H1)

Это сводит меня с ума, я создал модуль с помощником:

    namespace MyNamespace\MyModule\Helper;

    class Data extends \Magento\Framework\App\Helper\AbstractHelper
    {
        protected $registry;

        public function __construct
        (
            \Magento\Framework\Registry $registry,
        \Magento\Eav\Api\AttributeSetRepositoryInterface $attributeSet
        ) {
            $this->registry = $registry;
        $this->attributeSet = $attributeSet;
        }

        public function getTitle()
        {
            $this->product = $this->registry->registry('product');
        $product_name = $this->product->getName();
            $attributeSetRepository = $this->attributeSet->get($this->product->getAttributeSetId());
        if ($attributeSetRepository->getAttributeSetName() == "Default Engine Component"){
        $engine = $this->product->getAttributeText('engine_select');
        if (!is_array($engine)){
            return "$engine $product_name";
        }
        }
            return $product_name;
        }
    } 

... и это работает как надо. Затем я добавил следующее:

/app/design/frontend/vendor/theme/Magento_Catalog/layout/catalog_product_view.xml

<referenceBlock name="page.main.title">
    <action method="setPageTitle">
        <argument name="title" xsi:type="helper" helper="MyNamespace\MyModule\Helper\Data::getTitle"></argument>
    </action>
</referenceBlock>

...но это ничего не меняет на странице товара. Я знаю, что он вызывается, так как я могу повторить переменные, и они отображаются вверху страницы, но кажется, что XML не делает то, на что я надеялся.

У кого-нибудь есть идеи?


person nedge2k    schedule 18.05.2018    source источник


Ответы (1)


Итак, я попробовал несколько вариантов достижения того, что хотел, но в конце концов я создал шаблон под Magento_Catalog/templates/product (в моей теме), который был основан на magento-theme title.phtml, а затем изменил блок page.main.title в файле макета catalog_product_view.

Код шаблона может выглядеть немного странно (getAttribute, а затем getAttributeText), но для getAttributeText нет обработки ошибок, а с getAttribute, если атрибут имеет несколько значений, он возвращается в виде строки, а не массива, такого как getAttributeText. Было бы лучше, если бы я мог убедиться, что значение всегда присутствует, проверяя, какой набор атрибутов используется, но, хотя getAttributeSetId является частью модели продукта, он недоступен в перехватчике product/view, и я отказался от этого. пытаясь понять, как все это работает!

В любом случае, это заняло гораздо больше часов, чем я хотел бы признать, чтобы понять, так что вот код, надеюсь, он кому-то поможет!

Шаблон:

<?php
$product = $block->getProduct();
$product_name = $product->getName();
$attr_exists = $product->getResource()->getAttribute('attr_code');
$title = $product_name;
$cssClass = $block->getCssClass() ? ' ' . $block->getCssClass() : '';

if ($attr_exists){
  $attr_name = $product->getAttributeText('attr_code');
  if (!is_array($attr_name)){
    $title = "$attr_name $product_name";
  }
}

?>
<?php if ($title): ?>
<div class="page-title-wrapper<?= /* @escapeNotVerified */ $cssClass ?>">
<h1 class="page-title"
    <?php if ($block->getId()): ?> id="<?= /* @escapeNotVerified */ $block->getId() ?>" <?php endif; ?>
    <?php if ($block->getAddBaseAttributeAria()): ?>
        aria-labelledby="<?= /* @escapeNotVerified */ $block->getAddBaseAttributeAria() ?>"
    <?php endif; ?>>
    <?= /* @escapeNotVerified */ $title ?>
</h1>
<?= $block->getChildHtml() ?>
</div>
<?php endif; ?>

Макет:

<block name="page.main.title" class="Magento\Catalog\Block\Product\View" template="Magento_Catalog::product/product-h1.phtml" />
person nedge2k    schedule 18.05.2018