2013-03-06 7 views
0

У меня есть проект в symfony, который я бы хотел, чтобы мои пользователи загружали изображение для своего поля «аватара». Я нашел много сообщений о том, как «расширить» таблицы, которые я с приведенной ниже схемой:Symfony add Avatar field to sfGuardUser model

Member: 
    inheritance: 
    type:    column_aggregation 
    extends:   sfGuardUser 
columns: 
    idmember: { type: integer } 
    birthday: { type: date } 
    avatar:  { type: string(255) } 
    bio:   { type: string(255) } 

Столбцы добавляются в таблицу просто отлично, но когда я иду, чтобы изменить виджет на sfWidgetFormInputFileEditable это брейки. Вот файл Form.class:

$file_src = $this->getObject()->getAvatar(); 
    if ($file_src == '') 
    { 
    $file_src = 'default_image.png'; 
    } 

    $this->widgetSchema['avatar'] = new sfWidgetFormInputFileEditable(array(
    'label'  => ' ', 
    'file_src' => '/uploads/avatar/'.$file_src, 
    'is_image' => true, 
    'edit_mode' => true, 
    'template' => '<div>%file%<br />%input%</div>', 
)); 

и "сохранить" функцию вида:

if($this->isModified()) 
    { 
     $uploadDir = sfConfig::get('sf_upload_dir'); 
     $thumbnail = new sfThumbnail(150, 150); 
     $thumbnail2 = new sfThumbnail(800, 800); 
     if($this->getAvatar()) 
     { 
     $thumbnail->loadFile($uploadDir.'/avatar/'.$this->getAvatar()); 
     $thumbnail->save($uploadDir.'/avatar/thumbnail/'. $this->getAvatar()); 
     $thumbnail2->loadFile($uploadDir.'/avatar/'.$this->getAvatar()); 
     $thumbnail2->save($uploadDir.'/avatar/big/'. $this->getAvatar()); 
     } 
    } 

Когда я отправить форму, я получаю сообщение об ошибке:

This form is multipart, which means you need to supply a files array as the bind() method second argument.

+0

Можем ли мы увидеть место, где вы «привязываете» свою форму? Кстати, я думаю, что 'extends' не лучший способ повысить ценность sfGuardUser, вы заглянули в встроенную возможность добавления профиля в sfGuardUser? (см. [this] (http://jmather.com/2010/10/09/customize-sfguarduser-sfdocrineguard/) или [это] (http://trac.symfony-project.org/browser/plugins/sfGuardPlugin/ ветки/1.3/README # L225)) – j0k

+0

j0k Спасибо за ваш ответ. Я попытался добавить «Профиль» в sfGuardUser, и мне удалось настроить таблицу, но как добавить дополнительные поля в форму «Зарегистрировать», чтобы она была легко доступна пользователю, и все это появляется на одном и том же форме? Я попытался выполнить этот учебник [ЗДЕСЬ] (http://symfony.com/blog/call-the-expert-customizing-sfdoctrineguardplugin), но он работает только с бэкэнд. Не внешняя страница «Регистрация». Я попытался добавить виджет «аватара» в sfGuardUserForm.class.php, но он не сохраняет значение нигде при отправке формы. – djcloud23

+0

Если вы используете 'sfGuardRegisterForm', он расширяет' BasesfGuardRegisterForm', который расширяет 'sfGuardUserAdminForm'. И ваш профиль определяется внутри 'sfGuardUserAdminForm'. Так что это может сработать. – j0k

ответ

1

В действии, где вы привязываете форму, вы должны использовать примерно следующее:

$form->bind($request->getParamater($form->getName()), $request->getFiles($form->getName())); 

Поэтому вам необходимо передать загруженные файлы в качестве второго параметра в метод bind.