Проблемы с визуализацией изображения VichUploaderBundle с помощью ветки

У меня проблема с VichUploaderBundle, я следовал всем инструкциям, и я мог заставить его загрузить изображение, теперь я не знаю, как визуализировать изображения с помощью ветки.
У меня есть объект Product, который имеет отношение OneToOne с Photo (я использую Photo объекта с VichUploaderBundle).

Мой файл html.twig

{% for product in products %}

<img src="{{ vich_uploader_asset(product, 'image')   }}" alt="{{ product.nombre }}" />
{% endfor %}

Это дает мне следующую ошибку,

 An exception has been thrown during the rendering of a template ("Impossible to determine the class name. Either specify it explicitly or give an object") in products/list_all_products.html.twig at line 9.

Поэтому я добавил к тегу img следующее

  <img src="{{ vich_uploader_asset(product, 'image','AppBundle\Entity\Product') }}" alt="{{ product.nombre }}" />

и выкидывает мне эту ошибку

An exception has been thrown during the rendering of a template ("Class AppBundleEntityProduct does not exist") in products/list_all_products.html.twig at line 9.

Мои сущности хранятся в AppBundle \ Entity \ *, а также удаляет косые черты.

Я также пытался добавить это безуспешно.

<img src="{{ vich_uploader_asset(product.photo, 'image','AppBundle\Entity\Product') }}" alt="{{ product.nombre }}" />

Моя фотография лица (это копия & наклеить из инструкции по комплектации)

<?php
//src/AppBundle/Entity/Photo.php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collection\ArrayCollection;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\File;
use Vich\UploaderBundle\Mapping\Annotation as Vich;

/**
* @ORM\Entity
* @ORM\Table(name="photo")
* @Vich\Uploadable
*/

/*
This class represents the images
*/class Photo
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;

/**
* @Vich\UploadableField(mapping="product_image", fileNameProperty="imageName")
*
* @var File $imageFile
*/
protected $imageFile;

/**
* @ORM\Column(type="string", length=255, name="image_name")
*
* @var string $imageName
*/
protected $imageName;

/**
* @ORM\Column(type="datetime")
*
* @var \DateTime $updatedAt
*/
protected $updatedAt;

/**
* If manually uploading a file (i.e. not using Symfony Form) ensure an instance
* of 'UploadedFile' is injected into this setter to trigger the  update. If this
* bundle's configuration parameter 'inject_on_load' is set to 'true' this setter
* must be able to accept an instance of 'File' as the bundle will inject one here
* during Doctrine hydration.
*
* @param File|\Symfony\Component\HttpFoundation\File\UploadedFile $image
*/
public function setImageFile(File $image = null)
{
$this->imageFile = $image;

if ($image) {
// It is required that at least one field changes if you are using doctrine
// otherwise the event listeners won't be called and the file is lost
$this->updatedAt = new \DateTime('now');
}
}

/**
* @return File
*/
public function getImageFile()
{
return $this->imageFile;
}

/**
* @param string $imageName
*/
public function setImageName($imageName)
{
$this->imageName = $imageName;
}

/**
* @return string
*/
public function getImageName()
{
return $this->imageName;
}
}

И вот мой продукт сущности

<?php
//src/AppBundle/Entity/Product.php

/*
This class represents a product, for instance, we'll be using
only product.
*/

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
* @ORM\Entity
* @ORM\Table(name="product")
* ORM\Entity(repositoryClass="AppBundle\Repositories\ProductRepository")
*/

//extends objComercio has been removed for simplicity.
class Product
{

public function __construct()
{

$this->photos = new ArrayCollection();
}

/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;

/**
* @ORM\Column(type="string",length=255, nullable=false)
*/
protected $nombre;

/**
* @ORM\Column(type="string",length=255, nullable=false)
*/
protected $descripcion;

/**
* @ORM\Column(type="integer",nullable=false)
*/
protected $precio;

/**
* @ORM\Column(type="string",length=255, nullable=false)
*/
protected $empresa;

/**
* @ORM\OneToOne(targetEntity="Photo", cascade={"persist"})
*/
protected $photo;

/**
* @ORM\ManyToOne(targetEntity="Store",inversedBy="products")
*/
protected $store_product;public function getPhoto()
{
return $this->photo;
}
public function setPhoto(\AppBundle\Entity\Photo $photo)
{
$this->photo = $photo;
}
public function getPrecio()
{
return $this->precio;
}
public function setPrecio($aPrice)
{
$this->precio = $aPrice;
}
public function getEmpresa()
{
return $this->empresa;
}
public function setEmpresa($anEnterprise)
{
$this->empresa = $anEnterprise;
}/**
* Set store_product
*
* @param \AppBundle\Entity\Store $storeProduct
* @return Product
*/
public function setStoreProduct(\AppBundle\Entity\Store $storeProduct = null)
{
$this->store_product = $storeProduct;

return $this;
}

/**
* Get store_product
*
* @return \AppBundle\Entity\Store
*/
public function getStoreProduct()
{
return $this->store_product;
}

/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}

/**
* Set nombre
*
* @param string $nombre
* @return Product
*/
public function setNombre($nombre)
{
$this->nombre = $nombre;

return $this;
}

/**
* Get nombre
*
* @return string
*/
public function getNombre()
{
return $this->nombre;
}

/**
* Set descripcion
*
* @param string $descripcion
* @return Product
*/
public function setDescripcion($descripcion)
{
$this->descripcion = $descripcion;

return $this;
}

/**
* Get descripcion
*
* @return string
*/
public function getDescripcion()
{
return $this->descripcion;
}
}

Я напечатал все, используя {{}}, и все работает нормально.

Я не знаю, что еще делать.

Заранее спасибо!

4

Решение

Я знаю, что это действительно старый, но для Google все еще довольно актуально. Я думаю, что это должно работать:

  • поставить «imageFile» вместо «image»;
  • удвоить косую черту для className;

    {{vich_uploader_asset (product, ‘imageFile’, ‘AppBundle \\ Entity \\ Product’)}}

1

Другие решения

Я думаю, что вы должны отобразить свою фотографию в зависимости от конфигурации вашей фотографии:

<img src="{{ vich_uploader_asset(product.photo, 'image') }}" alt="{{ product.nombre }}" />

или же

<img src="{{ vich_uploader_asset(product.photo, 'file') }}" alt="{{ product.nombre }}" />
0

Мне наконец удалось заставить это работать.
Я написал код angularjs (я также использую его на своем сайте).
Вот что я сделал

Мой main.js

 $http.get('/get-products-by-user').success(function(data){
$scope.products = data;
})

routing.yml

get_products_by_user:
path: /get-products-by-user
defaults: { _controller: AppBundle:Product:getAllProductsByUser}

productController: getAllProductsByUser

 public function getAllProductsByUserAction()
{
$products = $this->getDoctrine()
->getRepository('AppBundle:Product')
->findAllProductsByUser($this->getUser()->getId());

return new Response(json_encode($products),200);
}

Моя строка list-all-products.html.twig, где я отображаю изображение

<div ng-repeat="product in products | filter: query" >
<img ng-src="/images/products/{[{product.photo.imageName }]}" class="img-responsive img-thumbnail size-img" alt="{[{ product.nombre }]}"/></div>

Мой config.yml, раздел Vich Uploader

 mappings:
product_image:
uri_prefix: /images/products
upload_destination: %kernel.root_dir%/../web/images/products

Я не знаю, если это хороший способ использования комплекта (он просто работает), я просто использую vichUploader для загрузки изображения, затем я делаю запрос, чтобы получить все мои продукты, включая имя файла, Однажды Я понял, что использую uri_prefix / {[{product.imageName}]} для рендеринга изображения.

({[{}]}, Я использую и angularjs, и шаблонный движок ветки, поэтому я использую этот синтаксис)

0

Это старый вопрос, но он смутил меня так же, как и новичка в Symfony, Doctrine и VichUploaderBundle, и этот вопрос наиболее актуален в Google. Распространенная ошибка Twig, если вы все неправильно поняли, это Mapping not found for field который я в том числе по причинам Google!

Doctrine возвращает массив объектов Product с одним объектом Photo в качестве подобъекта каждого продукта. Именно этот подобъект Photo необходим для визуализации изображения vich_uploader_asset. Так что используйте точка для доступа к подобъекту фотографий каждого объекта продукта: product.photo, не просто product

Вторым параметром vich_uploader_asset является имя поля, используемое в вашей сущности Photo, где вы добавили аннотацию / конфигурацию UploadableField. В вашем примере выше, это imageFileне image, в документация vich_uploader_asset, image это имя поля, так что это, вероятно, откуда вы только что скопировали этот код.

И третий параметр vich_uploader_asset — указать имя класса загружаемого объекта, который опять-таки не Product, а Photo. Но на самом деле вам это не нужно, так как vich будет разбираться, пока вы укажете product.photo, Но если вам это нужно, вам нужно включить 2 обратных слеша, как указывает @StefanNch.

Итак, вот строка, которая вам нужна:

<img src="{{ vich_uploader_asset(product.photo, 'imageFile') }}" alt="{{ product.nombre }}" />
0

попробуйте это, где дата является вашим объектом

<img src="{{ path ~ vich_uploader_asset(data, 'imageFile', 'App\\Entity\\Crente') }}" style="margin-top: -20px" />
0
По вопросам рекламы [email protected]