0

現在、Symfony 2 AdminGenerator に苦労しています。基本的な管理者ユーザー管理フォームを作成してみます。これには、ユーザー データの編集が含まれます。そこには、フィールドの電子メール、パスワード、および isActive があります。問題は、パスワードが空の場合でも保存されることです。これは、私がやりたいことではありません。

何かが入力された場合にのみパスワードを考慮する必要があります。それ以外の場合は無視し、このフィールドに値を入力しないでください。

この問題に関して、Symfony 2 の AG に関する情報は見つかりませんでした。Boyan さん。

4

2 に答える 2

0

これが 2 か月後の役に立てば幸いです :) これを行う最善の方法は、EventSubscriberInterface を実装するクラスをフォーム オブジェクトの pre-bind イベントにバインドすることです。このメソッドを使用すると、admin ジェネレーターのコントローラーを編集する必要はありません。

サブスクライバー リスナー Ignore Empty fields、リンクはスペイン語ですが、翻訳できます。基本的には、EventSubscriberInterface インターフェイスを実装するクラスを作成します。ブログ投稿でクラスが提供されます。

namespace Acme\TestBundle\Admin;

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class IgnoreBlankFieldListener implements EventSubscriberInterface
{
    private $factory;
    private $name;

    public function __construct(FormFactoryInterface $factory, $name)
    {
        $this->factory = $factory;
        $this->name = $name;
}

public static function isNotEmpty($var )
{
    if(is_array($var))
    {
        $notempty = false;

        foreach( $var as $v )
        {
            $notempty = $notempty || !IgnoreBlankFieldListener::isNotEmpty($v);
        }

        return $notempty;
    }
    else
        return !empty ($var);
}

public static function isEmpty( $var )
{

    return IgnoreBlankFieldListener::isNotEmpty($var);
}

public function preBind(FormEvent $event){
    $data = $event->getData();
    $data_name = $data[$this->name];

    if( IgnoreBlankFieldListener::isEmpty($data_name) )
    {
       $form = $event->getForm();
       unset( $data[$this->name] );
       $event->setData($data);
       $form->remove($this->name);
    }
}

public static function getSubscribedEvents() {

        return array(FormEvents::PRE_BIND => 'preBind');
    }
}

次に、このクラスをフォームにサブスクライブします。ClassType 定義の buildForm 部分でこれを行います。

public function buildForm(FormBuilder $builder, array $options)
{
 //initial code
 //
$subscriber = new IgnoreBlankFieldListener($builder->getFormFactory(), 'password');

$builder->addEventSubscriber($subscriber);

}

Symfony ドキュメントの詳細

于 2013-02-11T21:35:57.660 に答える
0

これが私が考えていたことです:

class UserController extends Controller
{
    public function editAction($id) {
        $em = $this->getDoctrine()->getManager();
        $user = $em->getRepository('AcmeDemoBundle:User')->find($id);
        if (!$user) {
            throw $this->createNotFoundException();
        }
        $request = $this->getRequest();

        if ('POST' === $request->getMethod()) {
            $oldPassword = $user->getPassword();
            $form->bindRequest($request);
            if ($form->isValid()) {
                if ($user->getPassword() === '' || $user->getPassword() === null) {
                    $user->setPassword($oldPassword);
                } else {
                    // Encode password
                }
                $em->flush();
            }
        }
    }
}

リクエストをフォームにバインドする前に、パスワードを一時変数に保存します。次に、新しいパスワードが null か '' かなどを確認し、古いパスワードに置き換えるか、エンコードします。管理ジェネレーターがどのように見えるかはわかりませんが、これはこれを解決する方法です。

FOSUserBundle を調べることもできます。FOSUserBundle:user はプロパティ plainPassword を使用します。これは、FOSUserBundle/UserManager を介してユーザーを更新するときにエンコードされ、空でない場合は実際のパスワードを置き換えます。

更新: 編集が成功した後のリダイレクトやフォームのレンダリングなど、アクションには明らかにいくつかの部分がありません...私が何を意味するかを示すための簡単なハックです。

于 2012-12-05T16:18:49.940 に答える