<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* Picture
*
* @ORM\Table(name="pictures")
* @ORM\Entity(repositoryClass="App\Repository\PictureRepository")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap(
* {
* "product" = "PictureProduct",
* "category" = "PictureCategory"
* }
* )
* @ORM\HasLifecycleCallbacks
*/
abstract class Picture extends TranslatedEntity {
protected $tranlatedEntity = 'PictureDescription';
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="url", type="string", length=255, nullable=true)
*/
private $url;
/**
* @var string
*
* @ORM\Column(name="source_name", type="string", length=255, nullable=true)
*/
private $sourceName;
/**
* @var integer
*
* @ORM\Column(name="`rank`", type="integer", nullable=true)
*/
private $rank;
public $file;
private $temp;
/**
* @ORM\OneToMany(targetEntity="App\Entity\PictureDescription", mappedBy="picture", cascade={"persist", "remove"})
*/
private $descriptions = [];
public function __construct() {
$this->descriptions = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Get id
*
* @return integer
*/
public function getId() {
return $this->id;
}
public function getUrl(): ?string {
if(!empty($this->languageId)){
$description = null;
foreach($this->descriptions as $d){
if($d->getLanguage()->getId()==$this->languageId){
$description = $d;
break;
}
}
}
if(empty($description) && count($this->descriptions)){
$description = $this->descriptions[0];
}
return empty($description)?'':$description->getUrl();
}
public function getSourceName(): ?string {
// return $this->generateFilename()
return $this->sourceName;
}
public function getRank(): ?int {
return $this->rank;
}
public function getDescriptions() {
return $this->descriptions;
}
public function getDescription($lang = 'fr') {
foreach($this->getDescriptions() as $desc){
if($desc->getLanguage()->getCode() == $lang)
return $desc;
}
return null;
}
public function getPictureDescription($lang='fr') {
foreach($this->getDescriptions() as $desc){
if($desc->getLanguage()->getCode() == $lang)
return $desc;
}
return null;
}
public function getTitle() {
return $this->descriptions->first()->getTitle();
}
public function setUrl(?string $url): void {
$this->url = $url;
}
public function setSourceName(?string $sourceName): void {
$this->sourceName = $sourceName;
}
public function setRank(int $rank): void {
$this->rank = $rank;
}
public function setDescriptions($descriptions): void {
$this->descriptions = $descriptions;
}
public function addDescription(PictureDescription $description) {
$this->descriptions->add($description);
}
/**
* @return the $file
*/
public function getFile() {
return $this->file;
}
/**
* @param field_type $file
*/
public function setFile(UploadedFile $file) {
$this->file = $file;
// check if we have an old image path
if (is_file($this->getAbsolutePath())) {
// store the old name to delete after the update
$this->temp = $this->getAbsolutePath();
$this->url = null;
} else {
$this->url = 'initial';
}
}
public function getAbsolutePath($lang = 'fr') {
$desc = $this->getDescription('fr');
if($desc)
return $this->getUploadRootDir() . '/' . $desc->getUrl();
return null === $this->url ? null : $this->getUploadRootDir() . '/' . $this->url;
}
public function getWebPath() {
if (empty($this->url))
return $this->url;
if (substr($this->url, 0, 1) != '/')
return '/' . trim($this->url);
return trim($this->url);
}
public function getThumbnailPath() {
return null === $this->thumbnailUrl ? null : $this->getUploadDir() . $this->thumbnailUrl;
}
public function getUploadRootDir() {
// le chemin absolu du répertoire où les documents uploadés doivent être sauvegardés
return __DIR__ . '/../../public/' . $this->getUploadDir();
}
public function getUploadDir() {
return 'assets/products/';
}
public function generateFilename($url = '', $ext = '') {
// $ext = \App\Helpers\Encoder::getExtension($this->getSourceName());
if($url == ''){
$title = $this->formatUrl($this->descriptions->first()->getUrl());
}else{
$title = \App\Helpers\Encoder::formatUrl($url);
}
if (!empty($title)) {
$tmp = $title;
} else {
$tmp = sha1(uniqid(mt_rand(), true));
}
$cpt = 0;
$f_name = $tmp . '.' . $ext;
while (file_exists($this->getUploadRootDir() . $this->getUploadDir() . $f_name . '.' . $ext)) {
$cpt++;
$f_name = $tmp . ($cpt ? ('-' . $cpt) : '');
}
return $f_name;
}
private function formatUrl($str, $replace = array(), $delimiter = '-') {
if (!empty($replace)) {
$str = str_replace((array) $replace, ' ', $str);
}
$clean = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
$clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $clean);
$clean = strtolower(trim($clean, '-'));
$clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean);
return $clean;
}
/**
* @ORM\PrePersist()
* @ORM\PreUpdate()
*/
public function preUpload() {
if (null !== $this->file) {
$this->url = $this->generateFilename();
}
}
/**
* @ORM\PostPersist()
* @ORM\PostUpdate()
*/
public function upload() {
if (null === $this->file) {
return;
}
if (isset($this->temp)) {
//unlink($this->temp);
$this->temp = null;
}
}
}