2012-07-07 50 views
0

很抱歉,我是Symfony的新手。我制作了一张表格,并且它运行良好。我为图片的几个领域(图片1,图片2,图片3等)。我使用了te sfWidgetFormInputFile,并且所有工作都很好。它将文件上传到需要的地方,并给它一个唯一的名称。Symfony sfWidgetFormInputFile删除我的文件

我遇到的问题是,这些字段在mySQL中设置为默认值“no-pic.png”,以便如果用户不上传图片,它仍然会显示某些内容在文中。但是每次有人上传图片时,它都会删除我的no-pic.png文件和没有图片显示的帖子,并显示一个空白的方块。我想这是因为它在上传新图像之前设置为“删除上一张图像”,以减少服务器上多余的未使用图像。

我想知道是否有一种方法可以在将文件从文件夹中删除之前检查其值是否为“no-pic.png”。如果它有帮助,这是我在form.class文件中使用的代码。

 $this->widgetSchema['picture1'] = new sfWidgetFormInputFile(array('label' => 'Pictures',)); 
    $this->validatorSchema['picture1'] = new sfValidatorFile(array('required' => false, 'path' => sfConfig::get('sf_upload_dir').'/car', 'mime_types' => 'web_images',)); 
    $this->widgetSchema['picture1'] = new sfWidgetFormInputFileEditable(array(
    'label' => 'Pictures', 
    'file_src' => '/uploads/car/'.$this->getObject()->getPicture1(), 
    'is_image' => true, 
    'edit_mode' => !$this->isNew(), 
    'template' => '<div>%file%<br />%input%<br />%delete%%delete_label%</div>', 
    )); 
    $this->validatorSchema['picture_delete'] = new sfValidatorPass(); 
+0

如果允许他们编辑图片上传,则不需要第一行。 symfony会照顾你的上传和删除,但由于某种原因,它不会让你同时删除和上传一个新文件(至少从我的经验来说)。 – 2012-07-07 20:34:37

+0

很酷。我拿出第一行,它仍然有效,但我需要能够自己控制删除。我刚刚添加了一篇文章,上传了一张图片,并且no-pic.png消失了。我甚至试图让它只读。它仍然删除它。 – djcloud23 2012-07-07 20:55:12

+0

噢,好的。我更明白你想要做什么。防止这种情况的最简单方法是绑定控制器中的表单,检查它是否是删除,并且图片不是no-pic.png。如果两个条件均为false,则抓取对象并更新它。如果您希望它自动处理删除并为您节省,但无法像您想要的那样真正执行自定义逻辑,bindAndSave非常有用。 – 2012-07-07 21:01:20

回答

0

我找到了解决方法。我进行了页面检查,看它是否设置为no-pic.png,然后在另一个位置显示no-pic.png。这样当上传图片时,它不会删除它。 :)感谢您的帮助,但。

+0

很酷的交易。我找到了我使用的代码并将其发布以供参考。尽管这很简单,而symfony完成了所有的工作 – 2012-07-09 18:45:10

1

仅供参考,这里是我使用的代码。

$this->setWidget('logo_image', new sfWidgetFormInputFileEditable(array(
    'file_src' => 'uploads/logos/'.$this->getObject()->getFilename(), 
    'edit_mode' => !$this->isNew() 
))); 

$validatorOptions = array(
    'max_size'   => 1024*1024*10, 
    'path'    => sfConfig::get('sf_upload_dir').'/logos', 
    'mime_type_guessers' => array(), 
    'required'   => false 
); 

if ($this->isNew()) 
{ 
    $validatorOptions['required'] = true; 
} 

$this->setValidator('logo_image', new sfValidatorFile($validatorOptions)); 
$this->setValidator('logo_image_delete', new sfValidatorString(array('required' => false)));