Magento 2.2 - 将属性名称附加到产品名称 (H1)
Magento 2.2 - Append Attribute Name To Product Name (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 没有按照我希望的那样进行。
有人有什么想法吗?
所以,尝试了多种变体来实现我想要的,但最后,我在 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" />
这让我抓狂,我用助手创建了一个模块:
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 没有按照我希望的那样进行。
有人有什么想法吗?
所以,尝试了多种变体来实现我想要的,但最后,我在 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" />