1

やあみんな、Symfony admin generatorモジュールに を使用しました。

すべてが機能していますが、モデルのフォームがインスタンス化されるときに、独自のオプションを渡す必要があります。

(myModuleAutoActions を拡張する)の executeNew 関数と executeCreate 関数をオーバーライドすることで、これを自分で行うことができますmyModuleActions.class.php

しかし、私はよりきちんとした解決策を望んでいましたか?

おそらく、構成クラスの 1 つをオーバーライドするのがよいでしょう。での使用を避けるために、基本的に現在のsf_userオブジェクト ( $this->getUser) をsf_userフォームの " " オプションとして追加する必要があります。sfContextmyModuleForm

何か案は?

4

3 に答える 3

1

jolly18 さん、スタック オーバーフローへようこそ。

私は単にsfContextを使用します。たとえば、私のアプリには、新しい Note オブジェクトを作成してユーザーを割り当てるサブフォームがあります。私のフォームconfigure()には次のものがあります。

$new_note->setAuthor(sfContext::getInstance()->getUser()->getUsername());

この本では、これを「最速だが醜い方法」と呼んでいます。「フォームとコンテキストが大きく結びついて、テストと再利用がより困難になる」からです。しかし、実際には...これはうまく機能し、先に進むことができます。

于 2010-12-16T19:13:30.190 に答える
1

モジュールが admin-generator を使用して生成された場合:

apps/backend/modules/books/actions/actions.class.php

変更: で

executeEdit(){

//leave rest unchanged

$values=array('activity_id'=>$activity_id, 'book_id'=>$book_id, 'todo_id'=>$todo_id, 'user_id'=>$this->getUser()->getGuardUser()->getId());


    $this->form = new TabelBooksForm($TabelBooks, $values);
}

変更: で

executeNew(){

//leave rest unchanged

$values=array('activity_id'=>$activity_id, 'book_id'=>$book_id, 'todo_id'=>$todo_id, 'user_id'=>$this->getUser()->getGuardUser()->getId());

    $this->form = new TabelBooksForm(array(), $values);
}

TableBooksForm.class.php で

public function configure()
  {

   if ($this->isNew()) {
    $this->setWidget('book_id', new sfWidgetFormInputHidden());
    $this->setDefault('book_id', $this->getOption('book_id'));    

    $this->setWidget('activity_id', new sfWidgetFormInputHidden());
    $this->setDefault('activity_id', $this->getOption('activity_id'));    

    $this->setWidget('todo_id', new sfWidgetFormInputHidden());
    $this->setDefault('todo_id', $this->getOption('todo_id'));  
  }
}
于 2012-06-28T03:55:13.207 に答える
1

私はしばらくの間この問題に直面してきましたが、symfony はいつも私が知らなかったきちんとしたコードで私を驚かせます。

キャッシュで生成されたコードをチェックアウトする場合は、非常に標準的な sfPropelPlugin を使用していると思います (注: このコードは、ブラウザーからモジュールを開こうとすると利用可能になるため、最初はそれを調べようとするため、アクセスできません)トラブル :P) 次のようなものが表示される場合があります。

cache/{application_name}(generally frontend or backend)/dev(enviromnemt)/autoModule_name( look here for the module)/:

  • ライブラリ
  • アクション

action フォルダーには、ジェネレーターによって生成されたすべてのアクション (executeNew、Edit、Create、Update など) を定義する action.class.php ファイルが含まれています。executeNew と executeEdit の実装を見ると、表示する実際のフォームを構成インスタンスに要求していることがわかります。以下に例を示します。

  public function executeNew(sfWebRequest $request)
  {
    $this->form = $this->configuration->getForm();
    $this->PaymentOrder = $this->form->getObject();
  }

構成変数には、前述の lib フォルダーで定義された構成クラスのインスタンスが含まれています。そのクラスは、オブジェクトのニーズに合わせてフォームを微調整します (通常は、新しいオブジェクト インスタンスを設定します)。

モジュールに表示されるクラスはキャッシュ内のクラスから拡張されます。したがって、純粋なロジックによりgetForm()、メインのモジュール/lib フォルダーのメソッドをニーズに合わせて変更すると、ユーザーを取得してフォームをハックする必要がなくなります。あなたがすべきではない価値者。

お役に立てれば!

于 2010-12-17T04:15:02.163 に答える