6

現在、私はフォームを持っています

class Project extends AbstractType {
    public function buildForm(FormBuilder $builder, array $options) {
        $builder->add('name');
        $builder->add('description', 'textarea');
        $builder->add('iconFile', 'file', array('label' => 'Icon', 'required' => false));
    }
    // ...
}

これまでのところ、編集と削除に使用しています。iconしかし今、編集「モード」で、ユーザーがプロジェクトの をクリアできるようにしたいと考えています。ラジオボタンを追加できると思いますが、追加モードで「非アクティブ」にする必要があります。今のところ、私は自分のモデルで画像のアップロードを処理していますが、そこにアップロードしたいと思っています (より良い場所がない限り)。

/**
 * If isDirty && iconFile is null: deletes old icon (if any). 
 * Else, replace/upload icon
 * 
 * @ORM\PrePersist 
 * @ORM\PreUpdate
 */
public function updateIcon() {

    $oldIcon = $this->iconUrl;

    if ($this->isDirty && $this->iconFile == null) {

        if (!empty($oldIcon) && file_exists(APP_ROOT . '/uploads/' . $oldIcon)) 
            unlink($oldIcon);

    } else {

        // exit if not dirty | not valid
        if (!$this->isDirty || !$this->iconFile->isValid())
            return;

        // guess the extension
        $ext = $this->iconFile->guessExtension();
        if (!$ext) 
            $ext = 'png';

        // upload the icon (new name will be "proj_{id}_{time}.{ext}")
        $newIcon = sprintf('proj_%d_%d.%s', $this->id, time(), $ext);
        $this->iconFile->move(APP_ROOT . '/uploads/', $newIcon);

        // set icon with path to icon (relative to app root)
        $this->iconUrl = $newIcon;

        // delete the old file if any
        if (file_exists(APP_ROOT . '/uploads/' . $oldIcon) 
            && is_file(APP_ROOT . '/uploads/' . $oldIcon)) 
            unlink($oldIcon);

        // cleanup
        unset($this->iconFile);
        $this->isDirty = false;
    }

}
4

2 に答える 2

12

データを使用してフォーム作成中に条件を設定できます。

class Project extends AbstractType {
    public function buildForm(FormBuilder $builder, array $options) {
        $builder->add('name');
        $builder->add('description', 'textarea');
        $builder->add('iconFile', 'file', array('label' => 'Icon', 'required' => false));

        if ($builder->getData()->isNew()) { // or !getId()
            $builder->add('delete', 'checkbox'); // or whatever
        }
    }
    // ...
}
于 2012-05-21T12:02:10.907 に答える
4

フォームイベントを使用できます。そのようなもののためのレシピがあります。

http://symfony.com/doc/current/cookbook/form/dynamic_form_generation.html

于 2012-05-23T23:15:31.900 に答える