Hi,
I've got quite a few attributes for every of my products on my website. Hence, I want to sort these attributes by the attribute groups that I put them in, in the admin panel. So is there a way that I can show the attribute groups on my product page?
Thank you in advance.
Solved! Go to Solution.
Hello emil_faurholdt
Magebull/MultiSlider/Block/Test.php
<?php
namespace Magebull\MultiSlider\Block;
class Test extends \Magento\Framework\View\Element\Template
{
protected $_productloader;
protected $request;
protected $_groupCollection;
protected $_registry;
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Magento\Catalog\Model\ProductFactory $_productloader,
\Magento\Framework\Registry $_registry,
\Magento\Eav\Model\ResourceModel\Entity\Attribute\Group\CollectionFactory $_groupCollection,
\Magento\Framework\App\Request\Http $request
) {
$this->_productloader = $_productloader;
$this->request = $request;
$this->_registry = $_registry;
$this->_groupCollection = $_groupCollection;
parent::__construct($context);
}
//get the product
public function getLoadProduct()
{
$product = $this->_registry->registry('current_product');
return $this->_productloader->create()->load($product->getId());
}
//Get attribute group id
public function getAttributeGroupId($attributeSetId)
{
$groupCollection = $this->_groupCollection->create();
$groupCollection->addFieldToFilter('attribute_set_id',$attributeSetId);
$groupCollection->addFieldToFilter('attribute_group_name','Grid Attributes');
return $groupCollection->getFirstItem();
}
//Get all attribute groups
public function getAttributeGroups($attributeSetId)
{
$groupCollection = $this->_groupCollection->create();
$groupCollection->addFieldToFilter('attribute_set_id',$attributeSetId);
$groupCollection->setOrder('sort_order','ASC');
return $groupCollection;
}
//get attribute by groups
public function getGroupAttributes($pro,$groupId, $productAttributes){
$data=[];
$no =__('No');
foreach ($productAttributes as $attribute){
if ($attribute->isInGroup($pro->getAttributeSetId(), $groupId) && $attribute->getIsVisibleOnFront() ){
if($attribute->getFrontend()->getValue($pro) && $attribute->getFrontend()->getValue($pro)!='' && $attribute->getFrontend()->getValue($pro)!=$no){
$data[]=$attribute;
}
}
}
return $data;
}
}Magebull/MultiSlider/etc/module.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Magebull_MultiSlider" setup_version="0.0.1"/>
</config>/Magebull/MultiSlider/view/frontend/layout/catalog_product_view.xml
<?xml version="1.0"?>
<!--
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<page layout="1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="product.info.details">
<block class="Magebull\MultiSlider\Block\Test" name="example.tabs" template="Magebull_MultiSlider::test1.phtml" group="detailed_info">
<arguments>
<argument translate="true" name="title" xsi:type="string">Your Title</argument>
</arguments>
</block>
</referenceBlock>
</body>
</page>
/Magebull/MultiSlider/view/frontend/templates/test1.phtml
<?php
$_product = $block->getLoadProduct();
$groupid = $block->getAttributeGroupId($_product->getAttributeSetId());
$attributesgroups = $block->getAttributeGroups($_product->getAttributeSetId());
$productAttributes = $_product->getAttributes();
?>
<?php
foreach ($attributesgroups as $attributesgroup):
$attributes = $block->getGroupAttributes($_product,$attributesgroup->getAttributeGroupId(),$productAttributes);
if($attributes){ ?>
<h3 class="col label" scope="row"><?php echo $attributesgroup->getAttributeGroupName() ?></h3>
<div class="additional-attributes-wrapper table-wrapper block">
<table class="data table additional-attributes" id="product-attribute-specs-table">
<tbody>
<?php
foreach ($attributes as $attribute): ?>
<tr>
<td class="col label" scope="row"><?php echo $attribute->getFrontendLabel() ?></td>
<td class="col data feature" data-th="<?php echo $attribute->getFrontendLabel() ?>"><?php /* @escapeNotVerified */ echo $attribute->getFrontend()->getValue($_product) ?></td>
</tr>
<?php
endforeach; ?>
</tbody>
</table>
</div>
<?php }
endforeach;
?>Magebull/MultiSlider/registration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Magebull_MultiSlider',
__DIR__
);
Kindlt find below link to download extension.
Url: https://we.tl/bxUdgFcTyz
If you've found my answer useful, please give "Kudos" or "Accept as Solution"
Hello emil_faurholdt
if you want display attribute group name in product tab.
Create a block with following code
protected $_groupCollection;
public function __construct(
...............
\Magento\Eav\Model\ResourceModel\Entity\Attribute\Group\CollectionFactory $_groupCollection
.............
) {
$this->_groupCollection = $_groupCollection;
parent::__construct($context);
}
public function getAttributeGroupId($attributeSetId)
{
$groupCollection = $this->_groupCollection->create();
$groupCollection->addFieldToFilter('attribute_set_id',$attributeSetId);
$groupCollection->addFieldToFilter('attribute_group_name','Grid Attributes');
return $groupCollection->getFirstItem();
}
public function getAttributeGroups($attributeSetId)
{
$groupCollection = $this->_groupCollection->create();
$groupCollection->addFieldToFilter('attribute_set_id',$attributeSetId);
$groupCollection->setOrder('sort_order','ASC');
return $groupCollection;
}
public function getGroupAttributes($pro,$groupId, $productAttributes){
$data=[];
$no =__('No');
foreach ($productAttributes as $attribute){
if ($attribute->isInGroup($pro->getAttributeSetId(), $groupId) && $attribute->getIsVisibleOnFront() ){
if($attribute->getFrontend()->getValue($pro) && $attribute->getFrontend()->getValue($pro)!='' && $attribute->getFrontend()->getValue($pro)!=$no){
$data[]=$attribute;
}
}
}
return $data;
}
Now call that in your phtml file
$groupid=$block->getAttributeGroupId($_product->getAttributeSetId());
$attributesgroups=$block->getAttributeGroups($_product->getAttributeSetId());
$productAttributes=$product->getAttributes();
$i=0;
$countAttributes=$block->getCountAttributes($product,$attributesgroups,$productAttributes);
?>
<?php
foreach ($attributesgroups as $attributesgroup):
$attributes=$block->getGroupAttributes($product,$attributesgroup->getAttributeGroupId(),$productAttributes);
if($attributes){ ?>
<h3 class="col label" scope="row"><?php echo $attributesgroup->getAttributeGroupName() ?></h3>
<div class="additional-attributes-wrapper table-wrapper block">
<table class="data table additional-attributes" id="product-attribute-specs-table">
<tbody>
<?php
foreach ($attributes as $attribute): ?>
<tr>
<td class="col label" scope="row"><?php echo $attribute->getFrontendLabel() ?></td>
<td class="col data feature" data-th="<?php echo $attribute->getFrontendLabel() ?>"><?php /* @escapeNotVerified */ echo $attribute->getFrontend()->getValue($product) ?></td>
</tr>
<?php
endforeach; ?>
</tbody>
</table>
</div>
<?php }
endforeach;
?>
URL: https://blog.qaisarsatti.com/magento_2/magento-2-get-product-attributes-attribute-groups/
Find helpful ? Consider Giving Kudos to this post.
Problem solved? Click Accept as Solution!"
Hi, thank you very much.
I'm am new to this, so I have just one more question, which phtml file exactly are we talking about?
Hello emil_faurholdt
Magebull/MultiSlider/Block/Test.php
<?php
namespace Magebull\MultiSlider\Block;
class Test extends \Magento\Framework\View\Element\Template
{
protected $_productloader;
protected $request;
protected $_groupCollection;
protected $_registry;
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Magento\Catalog\Model\ProductFactory $_productloader,
\Magento\Framework\Registry $_registry,
\Magento\Eav\Model\ResourceModel\Entity\Attribute\Group\CollectionFactory $_groupCollection,
\Magento\Framework\App\Request\Http $request
) {
$this->_productloader = $_productloader;
$this->request = $request;
$this->_registry = $_registry;
$this->_groupCollection = $_groupCollection;
parent::__construct($context);
}
//get the product
public function getLoadProduct()
{
$product = $this->_registry->registry('current_product');
return $this->_productloader->create()->load($product->getId());
}
//Get attribute group id
public function getAttributeGroupId($attributeSetId)
{
$groupCollection = $this->_groupCollection->create();
$groupCollection->addFieldToFilter('attribute_set_id',$attributeSetId);
$groupCollection->addFieldToFilter('attribute_group_name','Grid Attributes');
return $groupCollection->getFirstItem();
}
//Get all attribute groups
public function getAttributeGroups($attributeSetId)
{
$groupCollection = $this->_groupCollection->create();
$groupCollection->addFieldToFilter('attribute_set_id',$attributeSetId);
$groupCollection->setOrder('sort_order','ASC');
return $groupCollection;
}
//get attribute by groups
public function getGroupAttributes($pro,$groupId, $productAttributes){
$data=[];
$no =__('No');
foreach ($productAttributes as $attribute){
if ($attribute->isInGroup($pro->getAttributeSetId(), $groupId) && $attribute->getIsVisibleOnFront() ){
if($attribute->getFrontend()->getValue($pro) && $attribute->getFrontend()->getValue($pro)!='' && $attribute->getFrontend()->getValue($pro)!=$no){
$data[]=$attribute;
}
}
}
return $data;
}
}Magebull/MultiSlider/etc/module.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Magebull_MultiSlider" setup_version="0.0.1"/>
</config>/Magebull/MultiSlider/view/frontend/layout/catalog_product_view.xml
<?xml version="1.0"?>
<!--
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<page layout="1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="product.info.details">
<block class="Magebull\MultiSlider\Block\Test" name="example.tabs" template="Magebull_MultiSlider::test1.phtml" group="detailed_info">
<arguments>
<argument translate="true" name="title" xsi:type="string">Your Title</argument>
</arguments>
</block>
</referenceBlock>
</body>
</page>
/Magebull/MultiSlider/view/frontend/templates/test1.phtml
<?php
$_product = $block->getLoadProduct();
$groupid = $block->getAttributeGroupId($_product->getAttributeSetId());
$attributesgroups = $block->getAttributeGroups($_product->getAttributeSetId());
$productAttributes = $_product->getAttributes();
?>
<?php
foreach ($attributesgroups as $attributesgroup):
$attributes = $block->getGroupAttributes($_product,$attributesgroup->getAttributeGroupId(),$productAttributes);
if($attributes){ ?>
<h3 class="col label" scope="row"><?php echo $attributesgroup->getAttributeGroupName() ?></h3>
<div class="additional-attributes-wrapper table-wrapper block">
<table class="data table additional-attributes" id="product-attribute-specs-table">
<tbody>
<?php
foreach ($attributes as $attribute): ?>
<tr>
<td class="col label" scope="row"><?php echo $attribute->getFrontendLabel() ?></td>
<td class="col data feature" data-th="<?php echo $attribute->getFrontendLabel() ?>"><?php /* @escapeNotVerified */ echo $attribute->getFrontend()->getValue($_product) ?></td>
</tr>
<?php
endforeach; ?>
</tbody>
</table>
</div>
<?php }
endforeach;
?>Magebull/MultiSlider/registration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Magebull_MultiSlider',
__DIR__
);
Kindlt find below link to download extension.
Url: https://we.tl/bxUdgFcTyz
If you've found my answer useful, please give "Kudos" or "Accept as Solution"
Saved my day right there! Thank you very much.
*solved