Symfony 1.4 sfThumbnail не создает эскизы

У меня есть форма загрузки, она работает хорошо, фото загружается, но проблема в том, что не работает плагин sfThumbnail. Миниатюра не создается. Вот мой код:

      // /lib/form/UploadForm.class.php

      public function configure()
      {
      $this->setWidget('photo', new sfWidgetFormInputFileEditable(
      array(
        'edit_mode' => !$this->isNew(),
        'with_delete' => false,
        'file_src' => '',
         )
      ));

      $this->widgetSchema->setNameFormat('image[%s]');

      $this->setValidator('photo', new sfValidatorFile(
        array(
        'max_size' => 5000000,
        'mime_types' => 'web_images', 
        'path' => '/images/',
        'required' => true,
        'validated_file_class' => 'sfMyValidatedFileCustom'
            )
       ));

А вот для класса валидатора

    class sfMyValidatedFileCustom extends sfValidatedFile{

    public function save($file = null, $fileMode = 0666, $create = true, $dirMode = 0777) 
    {
      $saved = parent::save($file, $fileMode, $create, $dirMode);
      $thumbnail = new sfThumbnail(150, 150, true, true, 75, '');
      $location = strpos($this->savedName,'/image/');
      $filename = substr($this->savedName, $location+15); 
      // Manually point to the file then load it to the sfThumbnail plugin
      $uploadDir = sfConfig::get('sf_root_dir').'/image/';
      $thumbnail->loadFile($uploadDir.$filename);
      $thumbnail->save($uploadDir.'thumb/'.$filename,'image/jpeg');
      return $saved;
    }

И мой код действий:

    public function executeUpload(sfWebRequest $request)
    {
    $this->form = new UploadForm();
    if ($request->isMethod('post'))
    {
      $this->form->bind(
        $request->getParameter($this->form->getName()),
        $request->getFiles($this->form->getName())
      );
      if ($this->form->isValid())
      {
           $this->form->save();
           return $this->redirect('photo/success');
      }
    }
     }

Я не уверен на 100%, правильно ли я это делаю, но это то, что я видел из документов и других примеров.


person kevin    schedule 20.05.2013    source источник


Ответы (1)


Вы не можете использовать $this->savedName, потому что это защищенное значение от sfValidatedFile. Вместо этого вы должны использовать $this->getSavedName().

Я не понимаю эту часть:

$location = strpos($this->savedName,'/image/');
$filename = substr($this->savedName, $location+15);

Почему вы извлекаете имя файла, когда, наконец, вы снова добавляете к нему /image/ при загрузке с loadFile?

В любом случае, я внес некоторые изменения в ваш класс. Я не проверял, но думаю должно работать.

class sfMyValidatedFileCustom extends sfValidatedFile
{
  public function save($file = null, $fileMode = 0666, $create = true, $dirMode = 0777) 
  {
    $saved    = parent::save($file, $fileMode, $create, $dirMode);
    $filename = str_replace($this->getPath().DIRECTORY_SEPARATOR, '', $saved);

    // Manually point to the file then load it to the sfThumbnail plugin
    $uploadDir = $this->getPath().DIRECTORY_SEPARATOR;

    $thumbnail = new sfThumbnail(150, 150, true, true, 75, '');
    $thumbnail->loadFile($uploadDir.$saved);
    $thumbnail->save($uploadDir.'thumb/'.$filename, 'image/jpeg');

    return $saved;
  }
person j0k    schedule 20.05.2013
comment
большое спасибо j0k! ты спасатель жизни! Спасибо и за подробное объяснение. Я обязательно буду иметь это в виду. - person kevin; 20.05.2013