0

我正在使用 symfony2.3 和管理生成器包。我有一个带有文件字段的实体。我想根据需要标记该字段。我尝试了几种方法,但没有按预期工作。

这是我在实体中的文件字段:

/**
 * @Assert\NotNull()
 * @Assert\Image(
 *     maxSize="50k",
 *     maxSizeMessage = "El tamaño maximo de la imagen es de {{ limit }}kb",
 *     minWidth = 237,
 *     maxWidth = 237,
 *     minHeight = 170,
 *     maxHeight = 170,
 *     minWidthMessage = "La imagen debe tener {{ min_width }}px de ancho.",
 *     minHeightMessage = "La imagen debe tener {{ min_height }}px de alto.",
 *     maxWidthMessage = "La imagen debe tener {{ max_width }}px de ancho.",
 *     maxHeightMessage = "La imagen debe tener {{ max_height }}px de alto."
 * )
 * @Vich\UploadableField(mapping="product_mapping", fileNameProperty="fileName")
 *
 * @var File $file
 */
protected $file; 

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

注意 @Assert\NotNull() 和 nullable = false。

使用此配置,我可以验证新实体的创建(如果我让文件字段为空,则管理员生成器捆绑显示一条消息:该字段不能为空...),但是当我编辑时(更新) 创建的实体,引发对 NotNull 的验证(使用先前使用有效文件创建的实体)。我不得不再次上传一个文件才能更新实体。

这是管理员生成器的配置 (entity-generator.yml)

file:
    label:            Imagen
    formType:         single_upload
    dbType:           string        
    addFormOptions:
        #required:  true               ## this launch a exception
        previewFilter:  150x150_outbound_thumnail
        help:     "La imagen del producto debe tener 237px de ancho y 170px de alto, y no debe exceder los 50kb."   

提前致谢

4

2 回答 2

0

不支持 single_upload,你会遇到麻烦。几个月前,该项目将其表单类型更改为AvocodeFormExtension - 但仅在更改日志中提及。为什么要费心编辑文档?

如果您仍想使用 single_upload,请尝试验证控制器中的文件是否存在。如果您将此字段标记为必填,则每次都必须上传它,甚至编辑带有附件的对象。必需意味着从浏览器发送到服务器的表单必须包含文件,而不是对象!(我使用 FormType 或模板来传递 newActions 所需的,而 editActions 不需要)

祝你好运!

于 2014-03-05T20:34:45.770 回答
0

我想分享我自己对这个问题的解决方案:

当我为实体中的文件属性设置文件(或图像,如最大宽度、最大高度等)约束以及 NotNull 约束时,问题就出现了。换句话说,我想检查一个文件是否像我想要的那样,并且还要使该文件成为必需的。我正在使用 Vich Uploadable Bundle。

问题是当任何文件约束失败时,该文件未加载到实体中,并且当重新显示表单时,Admin Generator Bundle 崩溃再次显示该文件。

我做什么:不要使用 NotNull 约束。

在我的文件实体中,我创建了一个新属性: requiredFile 作为私有的,而不是持久的 DB。我还创建了一个回调约束:validateRequiredFile。在构造函数中设置 requiredFile = true ,瞧!

最终实体如下所示:

/** * @Vich\Uploadable * @ORM\Table(name="table_name") * @Assert\Callback(methods={"validateRequiredFile"}) * @ORM\Entity(repositoryClass="repo/path") */类产品{ ...

/**
 * Non persistent, just to determinate if file is required
 * @var string 
 */
private $requiredFile;

...

/**
 * Constructor
 */
public function __construct()
{        
    $this->requiredFile = true;      
}   

...

/**
 * This function is to validate the requires files
 * 
 * How to use:
 *    In the contructor of the entity who inherit from BaseFile, set requiredFile property as true, Ex:
 *          public function __construct()
 *              {   
 *                  ...     
 *                  $this->requiredFile = true;
 *                  parent::__construct();        
 *              }
 * 
 * @param \Symfony\Component\Validator\ExecutionContextInterface $context
 */
public function validateRequiredFile(ExecutionContextInterface $context){
    //get the validated object
    $object = $context->getValue();

    //to know if is a creation or a update
    $newObject = $object->getId() == null;

    //validation
    if ($newObject && empty($this->file) && $this->requiredFile === true ) {
        $context->addViolationAt('file', "The file is required", array(), null);
        $this->fileName = Constants::RELATIVE_NOT_VALID_IMAGE_PATH;
    }

    //in case we dont want to validate file as required, and no file was updated, clean property "fileName" who was setted in constructor 
    if ($newObject && empty($this->file) && empty($this->requiredFile)) {
        $this->fileName = null;
    }

}  

PS:我创建了一个自定义图像用于显示以防验证失败。我把它放在 web 文件夹中,以便所有站点都可以访问。该图像的路径保存在 Constants::RELATIVE_NOT_VALID_IMAGE_PATH;

PS1:函数 validateRequiredFile 面向位于 BaseFile 实体(@ORM\MappedSuperclass)中,我在其中放置了带有文件的实体的所有公共属性。这样一来,这个功能就更容易使用了。

我希望这可以帮助某人,这花了我一些时间:(

于 2014-03-10T21:44:18.433 回答