2016-02-29 119 views

回答

3

要使用你需要重写奏鸣曲媒体ImageProvider类奏鸣曲媒体验证图像尺寸,索纳塔使用这个类来处理图像manipulation.If你已经有了奏鸣曲媒体捆绑的extended bundle然后services.yml文件你可以如下定义自己的供应商,请确保您的YML文件包含在主config.yml

parameters: 
    sonata.media.provider.file.class: Application\Sonata\MediaBundle\Provider\ImageProvider 

现在创建您的供应商,并与奏鸣曲媒体ImageProvider扩展它置换器validate()功能和定义自己的验证,或者可以覆盖buildCreateForm()/buildEditForm()并定义你的断言binaryContent字段

namespace Application \ Sonata \ MediaBundle \ Provider;

//... other uses classes 
use Sonata\MediaBundle\Provider\ImageProvider as BaseProvider; 

class ImageProvider extends BaseProvider 
{ 

    public function __construct($name, Filesystem $filesystem, CDNInterface $cdn, GeneratorInterface $pathGenerator, ThumbnailInterface $thumbnail, array $allowedExtensions = array(), array $allowedMimeTypes = array(), MetadataBuilderInterface $metadata = null) 
    { 
     parent::__construct($name, $filesystem, $cdn, $pathGenerator, $thumbnail); 

     $this->allowedExtensions = $allowedExtensions; 
     $this->allowedMimeTypes = $allowedMimeTypes; 
     $this->metadata = $metadata; 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function validate(ErrorElement $errorElement, MediaInterface $media) 
    { 
     if (!$media->getBinaryContent() instanceof \SplFileInfo) { 
      return; 
     } 

     if ($media->getBinaryContent() instanceof UploadedFile) { 
      $fileName = $media->getBinaryContent()->getClientOriginalName(); 
     } elseif ($media->getBinaryContent() instanceof File) { 
      $fileName = $media->getBinaryContent()->getFilename(); 
     } else { 
      throw new \RuntimeException(sprintf('Invalid binary content type: %s', get_class($media->getBinaryContent()))); 
     } 

     if (!in_array(strtolower(pathinfo($fileName, PATHINFO_EXTENSION)), $this->allowedExtensions)) { 
      $errorElement 
       ->with('binaryContent') 
       ->addViolation('Invalid extensions') 
       ->end(); 
     } 

     if (!in_array($media->getBinaryContent()->getMimeType(), $this->allowedMimeTypes)) { 
      $errorElement 
       ->with('binaryContent') 
       ->addViolation('Invalid mime type : ' . $media->getBinaryContent()->getMimeType()) 
       ->end(); 
     } 

     if ($media->getWidth() > '1280' || $media->getHeight() > 1280) { 
      $errorElement 
       ->with('binaryContent') 
       ->addViolation('Invalid File Dimension : Please upload 1280px * (1280px) image') 
       ->end(); 
     } 
    } 

} 
+0

我们不能使用这个。它改变了整个验证。使用多个实体(使用奏鸣曲媒体)。如何验证? –

+0

根据你的答案我用buildCreateForm()但我有问题,请检查链接。 http://stackoverflow.com/questions/38308774/how-to-remove-category-from-sonata-type-model-list-at-url-admin-sonata-media-me –

0

此代码适用于我。 仅在MyBundle中使用SonataMedia(此处为AppBundle)。我在SonataUserBundle(Application \ Sonata \ UserBundle \ Entity)中使用了相同的代码。但它失败了。

实体:

<?php 
// To reduce code i deleted many lines 
namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 
use Symfony\Component\Validator\Context\ExecutionContextInterface; 
use Gedmo\Mapping\Annotation as Gedmo; 

/** 

* FZHomeSlider 
* 
* @ORM\Table(name="fz__home_slider") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\FZHomeSliderRepository") 
* @ORM\HasLifecycleCallbacks() 
* @Assert\Callback(methods={ "isMediaSizeValid" }) 
*/ 
class FZHomeSlider { 

    const FILE_PATH = 'image'; 
    const FILE_SIZE = 200; # kb 
    const FILE_MIN_WIDTH = 1024; 
    const FILE_MAX_WIDTH = 1024; 
    const FILE_MIN_HEIGHT = 250; 
    const FILE_MAX_HEIGHT = 250; 

    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\OneToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media") 
    * @ORM\JoinColumns({ @ORM\JoinColumn(referencedColumnName="id", onDelete="CASCADE") }) 
    * @Assert\NotNull() 
    */ 
    private $image; 


    /** 
    * Set image 
    * 
    * @param \Application\Sonata\MediaBundle\Entity\Media $image 
    * 
    * @return FZHomeSlider 
    */ 
    public function setImage(\Application\Sonata\MediaBundle\Entity\Media $image = null) { 
     $this->image = $image; 

     return $this; 
    } 

    /** 
    * Get image 
    * 
    * @return \Application\Sonata\MediaBundle\Entity\Media 
    */ 
    public function getImage() { 
     return $this->image; 
    } 

    /** 
    * @param ExecutionContextInterface $context Description 
    */ 
    public function isMediaSizeValid(ExecutionContextInterface $context) { 
     $this->fzValidateImage($context, $this->getImage()); 
    } 

    private function fzValidateImage($context, $f) { 
     if ($f == NULL) { 
      $context->buildViolation('Please select an image.')->atPath(self::FILE_PATH)->addViolation(); 
     } else if ($f->getSize() > (self::FILE_SIZE * 1024)) { 
      $context->buildViolation('The file is too large (%a% kb). Allowed maximum size is %b% kb.')->atPath(self::FILE_PATH)->setParameters(['%a%' => intval($f->getSize()/1024), '%b%' => self::FILE_SIZE])->addViolation(); 
     } else if ($f->getWidth() < self::FILE_MIN_WIDTH) { 
      $context->buildViolation('The image width is too small (%a% px). Minimum width expected is %b% px.')->atPath(self::FILE_PATH)->setParameters(['%a%' => $f->getWidth(), '%b%' => self::FILE_MIN_WIDTH])->addViolation(); 
     } else if ($f->getWidth() > self::FILE_MAX_WIDTH) { 
      $context->buildViolation('The image width is too big (%a% px). Allowed maximum width is %b% px.')->atPath(self::FILE_PATH)->setParameters(['%a%' => $f->getWidth(), '%b%' => self::FILE_MAX_WIDTH])->addViolation(); 
     } else if ($f->getHeight() < self::FILE_MIN_HEIGHT) { 
      $context->buildViolation('The image height is too small (%a% px). Minimum height expected is %b% px.')->atPath(self::FILE_PATH)->setParameters(['%a%' => $f->getHeight(), '%b%' => self::FILE_MIN_HEIGHT])->addViolation(); 
     } else if ($f->getHeight() > self::FILE_MAX_HEIGHT) { 
      $context->buildViolation('The image height is too big (%a% px). Allowed maximum height is %b% px.')->atPath(self::FILE_PATH)->setParameters(['%a%' => $f->getHeight(), '%b%' => self::FILE_MAX_HEIGHT])->addViolation(); 
     } 
    } 

} 

在管理员:

$formMapper 
    ->with('Media') 
    ->add('image', 'sonata_type_model_list', ['btn_delete' => false, 'help' => self::$FORM_IMG_HELP, 'required' => false], ['link_parameters' => ['provider' => 'sonata.media.provider.image', 'context' => 'home_slider']])->end() 

终于解决&的解决方案:

Sonata Admin Doc

UserAdmin

public function getFormBuilder() { 
    $this->formOptions['data_class'] = $this->getClass(); 

    $options = $this->formOptions; 
    $options['validation_groups'] = ""; 

    $formBuilder = $this->getFormContractor()->getFormBuilder($this->getUniqid(), $options); 

    $this->defineFormBuilder($formBuilder); 

    return $formBuilder; 
} 
public function validate(ErrorElement $errorElement, $object) { 
    // throw new \Exception("bingo"); 
    $errorElement 
      ->with('phone') 
      ->assertLength(['min' => 10, 'max' => '14', 'minMessage' => "Phone number must be at least {{ limit }} characters long", 'maxMessage' => "Phone number cannot be longer than {{ limit }} characters"]) 
      ->end() 
    ; 
} 

这里验证电话仅供参考。您也可以使用validation.yml文件进行验证。

应用/索纳塔/ UserBundle /资源/配置/ validation.yml

Application\Sonata\UserBundle\Entity\User: 
properties: 
    phone: 
     - Length: 
      min:  10 
      minMessage: "Phone number must be at least {{ limit }} characters long" 
      max:  13 
      maxMessage: "Phone number cannot be longer than {{ limit }} characters" 
     - Regex: 
      pattern: "/^[\d]{10,13}$/" 
    biography: 
     - Length: 
      min:  5 
      minMessage: "Biography must be at least {{ limit }} characters long" 
      max:  7 
      maxMessage: "Biography cannot be longer than {{ limit }} characters" 
#  image: 
#   - Image validation is done in Entity 
+0

$ options ['validation_groups'] = “”;是主要的事情。 –

+0

你能否用最初的问题的一个实例来完成你的最终安泽?谢谢 –

+0

@jjgarcíaAppBundle \ Entity \ FZHomeSlider检查注释行* @Assert \ Callback(methods = {“isMediaSizeValid”})这指向函数/方法isMediaSizeValid。在ADMIN AppBundle \ Admin \ FZHomeSliderAdmin中,请参阅getFormBuilder(){$ options ['validation_groups'] =“”;}。我解决了这个问题,完成代码如上,如果有人需要更多的细节,请让我知道.. –