Magento2'de alışveriş sepetindeki ürün özelliğini alın


21

Sepet şablonunda bir ürün özelliği almaya çalışıyorum. Ama ben sadece çalışmıyor! Özellik, Storefront = yes'teki Katalog Sayfalarında Görünür olarak ayarlanmış ve Ürün Listelemesinde Kullanılan = evet

Aşağıdaki şablonu geçersiz kılmak için özel bir modül kullanın:

/vendor/magento/module-checkout/view/frontend/templates/cart/item/default.phtml

Ürünüm var:

$_item = $block->getItem();
$product = $_item->getProduct();

Normalde 'sample_attr' öznitelik koduna sahip bir özel öznitelik (bu durumda metin alanı türü) bunlardan biri ile kullanılabilir olmasını beklenir:

$product->getData('sample_attr');

veya

$product->getSampleAttr();

Bazı özellikler bu (sku, ağırlık, fiyat ..) kullanılarak kullanılabilir, ancak özel bir özellik için ikisi de çalışmaz. Dahil edilen yardımcıda (\ Magento \ Msrp \ Helper \ Data) da hiçbir öznitelik yöntemi yoktur.

Tüm özellik kodlarını kullanarak alabilirsiniz:

   $attributes = $product->getAttributes();
   foreach($attributes as $a)
   {
     var_dump($a->getName());
   }

Ayrıca denedim:

    $attribute = $product->getResource()->getAttribute('sample_attr');
    var_dump($attribute->getFrontend()->getValue($product));

ancak bu null değerini döndürür.

Peki, özelliğin değerini nasıl alabilirim?

Bunları denedim: Katalog sayfasındaki her ürün için belirli bir özellik alın

Katalog listesinde özel metin özelliği çıktısı.phtml (Magento 2)

Yanıtlar:


52

Bunu yapmak için herhangi bir PHP kodunu değiştirmeye gerek yoktur.

Sadece {MODULE_NAME}/etc/catalog_attributes.xmlbu tür içerikle oluşturmanız gerekir :

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/catalog_attributes.xsd">
    <group name="quote_item">
        <attribute name="sample_attr"/>
    </group>
</config>

İlginç. Bunu düşünmemiştim. Daha sonra tekrar deneyeceğim.
tecjam


2
Fantastik! Benim için çalışıyor. Bunu magento setup:di:compileişe almak için koşmam gerekiyormuş gibi görünüyordu , ama bu mantıklı. Burada bağımlılık ağacını değiştiriyorsunuz.
psyklopz

Bu kabul edilen cevap IMHO olmalıdır. Diğer cevaplar, her kullanıcı sepeti için ürün modelinin, özellikle kullanıcı arabaları büyük olduğunda performans nedenleriyle iyi bir fikir olmadığını yüklemeyi önermektedir.
Andrew Kett

Ben bir modül tenx / checkoutex vb altında kod yukarıda var ama onun çalışmıyor bana yardımcı olabilir
Sarvesh Tiwari

8

Bu yüzden peşimden bilgi almanın bir yolunu buldum. Ürünün tamamını ProductRepository'den yüklemem gerekiyor! Eğer dener ve \Magento\Catalog\Model\Productyüklerseniz, tek birton gibi davranır, her döngü için her zaman aynı ürünü verirsiniz.

Modüller yardımcı sınıfımı, ürünü productId'den yüklemek için aşağıdaki yöntemi tanımladığı için kullandım:

public function __construct(
  \Magento\Framework\App\Helper\Context $context,
  \Magento\Catalog\Model\ProductRepository $productRepo
) {
  $this->_productRepo = $productRepo;
  parent::__construct($context);
  }


/**
 * Load product from productId
 *
 * @param $id
 * @return $this
 */
public function getProductById($id)
{
    return $this->_productRepo
        ->getById($id);
}

Yardımcıyı şablona dahil ettim:

$customHelper = $this->helper('MyCompany\MyModule\Helper\Data');

Tam ürünü yüklüyorum:

$custProd = $customHelper->getProductById($product->getId());

Ve şimdi kullanabilirim:

$custProd->getSampleAttr();

ve

$custProd->getData('sample_attr');

veri almak için.


2

Buraya basit bir çözüm arayanlar için benim için böyle çalıştı

Ben default.phtml(in module-checkout/view/frontend/templates/cart/item) bu ekledi :

<?php
    $product_id = $product->getId();
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $customProduct = $objectManager->get('Magento\Catalog\Model\Product')->load($product_id);
 ?>

o $customProduct->getData('your_attribute');zaman her zamanki gibi arayabilirsiniz


2
Şablonda Magento, ObjectManager'ı doğrudan kullanmamızı öneriyor. Bloğa eklemeliyiz.
Khoa TruongDinh

2
Doğrudan şablonda veya blokta değil, ObjectManager'ı kullanmamalısınız.
ocornu

Nasıl olduğunu umursamıyorsanız,% 100 çalışır.
A. Lal

1

Doğru yönetici ayarlarıyla, eav_attributesql tablosundaki kaynak model olarak ayarlanmışsa , Checkout sayfasındaki ürün nesnesine özel özellikler yüklenir NULL. Böylece doğrudan $product->getSampleAttr()Checkout Sayfasından erişebilirsiniz .

Ancak, özniteliğin bir kaynak modeli Magento\Eav\Model\Entity\Attribute\Source\Tablevarsa, ürünü depodan yüklemelisiniz.

Yeni bir yardımcı oluşturun ve ürün deposunu yapıcıya ekleyin 2.2.6 üzerinde hala çalışıyor (tecjam'ın çözümü olarak)

Öğe oluşturucuyu (Checkout Sayfasında çağrılır) geçersiz kılmaya ve ürün deposunu buraya eklemeye çalışırsanız, sorunun aynı olduğunu unutmayın.

resim açıklamasını buraya girin


0

Özel öznitelikler, Alıntı / Sepet içinde bulunan ürün nesnesine dahil edilmediğinden, getData ('custom_attribute') işlevi aracılığıyla bunu alamazsınız. yapmanız gereken, Alıntı ürün nesnesinden iade edilen ürünün kimliğini almak ve ürün deposunu kullanarak ürünü yüklemek, ürünü depo aracılığıyla yükledikten sonra, kendisine atanan özel özellikler de dahil olmak üzere tüm verileri alabilirsiniz, daha sonra almak için getData ('custom_attribute') fonksiyonunu kullanabilirsiniz.

Umarım mantıklıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.