回答
要使用你需要重写奏鸣曲媒体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();
}
}
}
* @Assert\Image(
* minWidth = 200,
* maxWidth = 400,
* minHeight = 200,
* maxHeight = 400
*)
您可以为Entity添加Assert注解。请看:http://symfony.com/doc/current/reference/constraints/Image.html
注释验证在SonataMedia领域不工作。 –
此代码适用于我。 仅在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()
终于解决&的解决方案:
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
$ options ['validation_groups'] = “”;是主要的事情。 –
你能否用最初的问题的一个实例来完成你的最终安泽?谢谢 –
@jjgarcíaAppBundle \ Entity \ FZHomeSlider检查注释行* @Assert \ Callback(methods = {“isMediaSizeValid”})这指向函数/方法isMediaSizeValid。在ADMIN AppBundle \ Admin \ FZHomeSliderAdmin中,请参阅getFormBuilder(){$ options ['validation_groups'] =“”;}。我解决了这个问题,完成代码如上,如果有人需要更多的细节,请让我知道.. –
- 1. 索纳塔媒体库
- 2. 索纳塔管理员,自定义flashBag
- 3. 索纳塔管理员捆绑翻译
- 4. 根据管理员(索纳塔管理员)的角色
- 5. 索纳塔管理员,编辑实体内嵌
- 6. 索纳塔媒体包安装错误
- 7. 索纳塔管理员:在创建项目
- 8. 标签在索纳塔管理员捆绑
- 9. 索纳塔管理员,重写在模板中选择?
- 10. 索纳塔管理MongoDB的sonata_type_model_autocomplete
- 11. 索纳塔管理重定向preremove
- 12. 索纳塔管理prepersist编码密码
- 13. 索纳塔管理的Symfony2与生产
- 14. 索纳塔管理员,过滤器中的自定义查询
- 15. 索纳塔管理员集中删除routeCollection角色
- 16. 索纳塔管理员,可选字段与选择
- 17. 索纳塔管理员导出带收集字段的字段
- 18. 索纳塔管理员对Symfony2的性能
- 19. Symfony 2 - 索纳塔管理员基于角色的安全
- 20. 显示不同的实体索纳塔管理员列表视图
- 21. 将属性添加到/扩展索纳塔媒体实体
- 22. 空的索纳塔管理实体列表视图
- 23. 索纳塔媒体包中的图像路径
- 24. Symfony的3 - 索纳塔Aplication媒体捆绑错误
- 25. 的Symfony:索纳塔媒体文件预览
- 26. 索纳塔媒体 - 没有调整大小
- 27. 验证与Active管理员
- 28. 管理员身份验证
- 29. Sonata管理员验证
- 30. 索纳塔管理员:获取所有页面的下拉列表
我们不能使用这个。它改变了整个验证。使用多个实体(使用奏鸣曲媒体)。如何验证? –
根据你的答案我用buildCreateForm()但我有问题,请检查链接。 http://stackoverflow.com/questions/38308774/how-to-remove-category-from-sonata-type-model-list-at-url-admin-sonata-media-me –