Ürünün tam URL'sini şablonda alma


23

Dinamik ürünleri göstermek için statik bir blok oluşturmaya çalışıyorum. Bu, her alt kategoriyi almak ve her kategorideki her ürün için resmi yazdırmak için beklenen koddur.

<?php
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $category = $objectManager->get('Magento\Framework\Registry')->registry('current_category');
    ?><ol><?php
    foreach ($category->getChildrenCategories() as $child_category) {
        ?><li>
            <ul><?php
                foreach ($child_category->getProductCollection() as $product) {
                    ?><li><img src="<?php echo $product->getImage();?>"/><li><?php
                }
            ?></ul>
        </li><?php
    }
    ?></ol>

İmg srcs hariç sadece çalışıyor; örnek olarak sadece "/a/b/ab001.jpg" ve tam yol değil, örneğin "/ pub / media / catalog / product / cache / 1 / small_image / 240x300 / abc123def456 / a / b / 001.jpg "böylece görüntüler bulunamaz. Ürün resimlerini almanın doğru yolu nedir?


1
Do Şablonunuzdaki doğrudan Nesne Yöneticisi kullanmayı deneyin. Yeni bir blok oluşturmalı ya da var olan fonksiyonları tekrar kullanmalıyız.
Khoa TruongDinh

Yanıtlar:


28

Bloğunuz uzarsa Magento\Catalog\Block\Product\AbstractProduct, şunları kullanabilirsiniz:

$imageType = 'category_page_list'; // choose which image
$image = $block->getImage($product, $imageType);

Ardından resim URL’sini de alın

$image->getImageUrl();

veya bunu <img>eleman olarak vermek istiyorsanız :

echo $image->toHtml();

Bloğunuz soyut ürün bloğunu genişletemiyorsa / genişletemiyorsa, getImage()kendi başınıza bir yöntem oluşturabilirsiniz :

public function getImage($product, $imageId)
{
    return $this->imageBuilder->setProduct($product)
        ->setImageId($imageId)
        ->create();
}

$this->imageBuilder enjekte edilmek zorunda Magento\Catalog\Block\Product\ImageBuilder


$imageTypeYa da $imageIddeğişken örneğin teması tanımlanan görüntü türlerinden biri, olmalıdır category_page_list.

app/design/frontend/Magento/luma/etc/view.xmlÖrneğin, Luma temasındaki tüm resim türlerine bakın .

Magento 2'de bu görüntü türleri doğrudan şablonda genişlik ve yüksekliği tanımlamak yerine kullanılır.


Kodunuzu çalışıyorum ancak bu hatayı alıyorumUncaught Magento\Framework\View\Asset\File\NotFoundException: Unable to resolve the source file for 'adminhtml/_view/en_US/Magento_Catalog/images/product/placeholder/.jpg'
ND17

@ ND17 iki soru: 1) admin alanında blok kullanıyor musunuz? Bu kod yalnızca ön uç içindir 2) bir yer tutucu görüntü yapılandırdınız mı? Bir ürün resim yok Değilse ve her zaman hatalar alırsınız
Fabian Schmengler

1
@davideghz, örneğin temada tanımlanan resim türlerinden birini category_page_list. Bakınız: github.com/magento/magento2/blob/… Magento 2'de bunları doğrudan şablonda genişlik ve yüksekliği tanımlamak yerine kullanıyorsunuz
Fabian Schmengler

3
Neden atanan görüntü yerine yer tutucuyu geri getirdiği hakkında bir fikriniz var mı?
Laura,

2
@Lura ile aynı sorunu yaşıyorum. Atanan görüntü yerine her zaman yer tutucu görüntüsünü döndürür (atanan görüntü, ürün listesinde veya genel ürün ayrıntıları sayfasında aksi halde mükemmel şekilde görünür).
fritzmg

9

Ürün görüntüsünü yeniden boyutlandırmanız ve varsayılan Magento görüntü önbellek sistemini kullanmanız gerekiyorsa ve ön uç bölgesinde değilseniz, bu geçici çözümü kullanabilirsiniz.

Kullanım örneği: Harici bir uygulama için özel API'nizde yeniden boyutlandırılmış resim URL'lerine ihtiyacınız varsa, faydalı olabilir.

İşlev kodu:

/**
 * @var \Magento\Catalog\Model\ProductFactory
 */
protected $productFactory;

/**
 * @var \Magento\Catalog\Helper\ImageFactory
 */
protected $helperFactory;

/**
 * @var \Magento\Store\Model\App\Emulation
 */
protected $appEmulation;

/**
 * Constructor.
 *
 * @param \Magento\Catalog\Model\ProductFactory $productFactory
 * @param \Magento\Store\Model\App\Emulation $appEmulation
 * @param \Magento\Catalog\Helper\ImageFactory $helperFactory
 * @param \Magento\Store\Model\StoreManagerInterface $storeManager
 */
public function __construct(
    \Magento\Catalog\Model\ProductFactory $productFactory,
    \Magento\Store\Model\App\Emulation $appEmulation,
    \Magento\Catalog\Helper\ImageFactory $helperFactory,
    \Magento\Store\Model\StoreManagerInterface $storeManager,
) {
    $this->productFactory                   = $productFactory;
    $this->imageBuilder                     = $imageBuilder;
    $this->helperFactory                    = $helperFactory;
    $this->appEmulation                     = $appEmulation;
    $this->storeManager                     = $storeManager;
}

/**
 * Retrieve product image
 *
 * @param \Magento\Catalog\Model\Product $product
 * @param string $imageId
 * @param array $attributes
 * @return \Magento\Catalog\Block\Product\Image
 */
public function getImage($product, $imageId, $attributes = [])
{
    $image = $this->helperFactory->create()->init($product, $imageId)
        ->constrainOnly(true)
        ->keepAspectRatio(true)
        ->keepTransparency(true)
        ->keepFrame(false)
        ->resize(200, 300);

    return $image;
}

public function customFunction()
{
    // some stuff here

    $storeId = $this->storeManager->getStore()->getId();

    $this->appEmulation->startEnvironmentEmulation($storeId, \Magento\Framework\App\Area::AREA_FRONTEND, true);

    $product = $this->productFactory->create()->loadByAttribute('sku', 'productSKU');
    $imageUrl = $this->getImage($product, 'product_base_image')->getUrl();

    echo $imageUrl;

    $this->appEmulation->stopEnvironmentEmulation();

    // some stuff here
}

Çıktı örneği:

http://{domain}/media/catalog/product/cache/1/image/200x300/e9c3970ab036de70892d86c6d221abfe/s/r/{imageName}.jpg

Yorumlar:

StartEnvironmentEmulation işlevinin üçüncü parametresi , zaten aynı storeId üzerindeyseniz, frontend alanının kullanımını zorlamak için kullanılır. (API alanı için kullanışlıdır)

Bu geçici çözüm, bu tür hatalardan kaçınmanızı önler:

http://XXXX.com/pub/static/webapi_rest/_view/en_US/Magento_Catalog/images/product/placeholder/.jpg

Uncaught Magento\Framework\View\Asset\File\NotFoundException: Unable to resolve the source file for 'adminhtml/_view/en_US/Magento_Catalog/images/product/placeh‌​older/.jpg'

1
İhtiyacım olanı, çevre emülasyonuyla ilgili ipucu için teşekkürler.
thaddeusmt

2
Çevre öykünmesi günümü kurtardı. Çok teşekkürler!
medina

API kullanışlılığı için +1
tony

8

Dene

$store = $objectManager->get('Magento\Store\Model\StoreManagerInterface')->getStore();
$imageUrl = $store->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . 'catalog/product' . $product->getImage();

1
Bu iyidir çünkü mevcut talebe göre otomatik olarak güvenli / güvensiz URL’yi verecektir
Milan Simek

3

Bu kodu dene ..

$ProductImageUrl = $block->getUrl('pub/media/catalog').'product'.$_product->getImage();

Magento SE'ye hoş geldiniz. Yalnızca bir kod satırı içeren cevaplar çoğu zaman çok yardımcı olmaz. Bu durumda, bu hattın nasıl kullanılması gerektiği oldukça açıktır, ancak getUrl()yanlışlıkla çalışması olsa bile kullanımı doğru değildir. $route"Module / controller / action" şeklinde bir parametre alır . "pub / media / catalog" bir rotaya benziyor, ancak değil.
Fabian Schmengler,

Nesne yöneticisini kullanmaz, iyi cevap. Sadece bir satır olsa bile.
LM_Fielding

@LM_Fielding Nesne yöneticisini kullanmayan her cevap otomatik olarak iyi değildir.
Fabian Schmengler

Bu kodu deneyin ve yorumunuzu gönderin
Shihas Suliaman

1

Belki Magento\Catalog\Helper\Product::getImageUrl()yardım edebilir. Magento geliştiricilerinin neden bunu Magento\Catalog\Helper\Imagesınıfta uygulayamadıklarını anlamadım, çünkü getUrlresim yardımcıdaki yöntem ne beklediğini döndürmüyorsa ...


1

Lütfen şu kodu deneyin:

$prdId = 35;
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$hotPrd = $objectManager->get('Magento\Catalog\Model\Product')->load($prdId);
$store = $objectManager->get('Magento\Store\Model\StoreManagerInterface')->getStore();
echo $store->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . 'catalog/product' . $hotPrd->getThumbnail();

1

ObjectManager veya Block'u kullanabilirsiniz.

Nesne Yönetmeni:

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$store = $objectManager->get('Magento\Store\Model\StoreManagerInterface')->getStore();
$imageUrl = $store->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . 'catalog/product' . $product->getImage();

Blok:

protected $_storeManagerInterface;

public function __construct(
  ...
  \Magento\Store\Model\StoreManagerInterface $storeManagerInterface,
  ...
)
{
  ...
  $this->_storeManagerInterface = $storeManagerInterface;
  ...
}

...

public function getStoreInterface($imgUrl){
   $store = $this->_storeManagerInterface->getStore();
   $storeMedia = $store->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . 'catalog/product' . $imgUrl;
   return $storeMedia;
}
...

Fonksiyonu çağır:

<img src="<?php echo $block->getStoreInterface($imgUrl) ?>"/>


0

Modülünüzde:

public function getProducts()
{
    //... create collection code goes here...

    $result = [ ];

    foreach ( $collection as $product ) {
        $result[] = [
            'id'        => $product->getId(),
            '_sku'      => $product->getSku(),
            'permalink' => $product->getProductUrl($product),
            'title'     => $product->getName(),
            'raw_price' => $product->getPrice(),
            'image_url' => $this->getUrl().'pub/media/catalog/product'.$product->getImage()
        ];
    }

    return $result;
}

Sonra bloğunuzda bu sonucu alacaksınız:

print_r($block->getProducts());

Mükemmel değil, ama benim için çalışıyor.

Sonuca bir göz atın: görüntü tanımını buraya girin


0

Sınıfınızda, bağımlılık enjekte etmek StoreManagerInterface gibi:

use \Magento\Framework\View\Element\Template\Context;
use \Magento\Store\Model\StoreManagerInterface;

public function __construct(Context $context, StoreManagerInterfac $storeManager)
    {
        parent::__construct($context);
        $this->_storeManager = $storeManager;

    }

yönteminizde sonra, örneğin thumbail elde etmek için

public function getProductThumbnail(){

        return $this->_storeManager->getStore()->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . 'catalog/product' . $product->getImage();
    }

0

Bunu aşağıdaki kodu deneyebilirsiniz.

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$category = $objectManager->get('Magento\Framework\Registry')->registry('current_category');
$childcategories = $category->getChildrenCategories();

foreach($childcategories as $child)
    {
echo '<li class="sub-cat">';
        $cat = $objectManager->create('Magento\Catalog\Model\Category')->load($child->getId()); 
        ?>
        <a href="<?php echo $cat->getUrl(); ?>">
        <div class="sub-title">
            <h3><?php echo $cat->getName();?></h3>
        </div> 
    <?php
        if ($_imgUrl = $cat->getImageUrl())
        {
            $_imgHtml = '<div class="category-image"><img src="' . $_imgUrl . '" alt="' . $block->escapeHtml($cat->getName()) . '" title="' . $block->escapeHtml($cat->getName()) . '" class="image" /></div>';
            $_imgHtml = $_helper->categoryAttribute($cat, $_imgHtml, 'image');
            /* @escapeNotVerified */ echo $_imgHtml;
        }  

    ?>      
    <?php echo '</a></li>'; }
    echo '</ul>';
}

0

Bu başka bir çalışma yöntemidir:

/** @var \Magento\Framework\UrlInterface $urlManager */
$url = $urlManager->getDirectUrl('pub/media/catalog/product' . $product->getImage());

Veya mevcut talebe göre güvenli / güvensiz URL’ye saygı göstermek:

/** @var \Magento\Framework\UrlInterface $urlManager */
/** @var \Magento\Framework\App\RequestInterface $request */
$url = $urlManager->getDirectUrl(
    'pub/media/catalog/product' . $product->getImage(),
    ['_secure' => $request->isSecure()]
);

Nesne örneklemesini kendi hayal gücünüze bırakacağım.


0

Base Image URL'sini phtml dosyasında bulabiliriz.

$_objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$imageHelper  = $_objectManager->get('\Magento\Catalog\Helper\Image');
<?php $image_url = $imageHelper->init($product, 'product_base_image')->setImageFile($product->getFile())->resize($imagewidth, $imageheight)->getUrl(); ?>
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.