2

サインアップフォームがあります:

function SignupForm() { 

      $fields = new FieldSet( 
         new TextField("FirstName", "First name"), 
         new TextField("Surname"), 
         new EmailField("Email", "Email address") 
      );    
   $submitAction = new FieldSet(new FormAction("SignupAction", "Sign up")); 
   $required = new RequiredFields("Email"); 

      $SignupForm = new Form($this, "SignupForm", $fields, $submitAction, $required);



      return $SignupForm; 
   }

   function SignupAction($data, $form) {

      $member = new Member(); 
      $form->saveInto($member);

      $member->write(); 

      if($group = DataObject::get_one('Group', "ID = $this->defaultGroupID")){ 
         $member->Groups()->add($group); 
         Director::redirect('thanks-for-registering/'); 
      }else{ 
         Director::redirect('registration-failed/'); 
      }

   }

これはホームページからは問題なく実行されますが、サイトのすべてのページとサブページに表示されるため、フォームアクションを設定する必要があります。

私はこれを追加しようとしました:

$SignupForm->setFormAction(Director::baseURL().'home/SignupAction');

$ SignupFormを返す前に、(どこからでも)フォームを送信すると次のエラーが発生します

Missing argument 2 for Page_Controller::SignupAction()

function SignupAction($data, $form) { 
68 
69        
70       $member = new Member(); 
71       $form->saveInto($member); 
.....

ここで何が起こっているのですか?

ありがとう

4

1 に答える 1

1

このエラーは、silverstripeがフォームを処理する方法が原因で発生します

silverstripeはフォームアクションにリダイレクトされることはなく、常に自分自身のフォームにリダイレクトされるため、フォームが

function SignupForm() {
   ...
   return new Form(...);
}

その後、silverstripeは常にこの関数にリダイレクトされるため、mysite.com / foobar /にいる場合、フォームはmysite.com/foobar/SignupFormに移動し、-> SignupAction()を呼び出すため、SignupActionは決してiではありません。 URL。

これは私がそれをする方法です:

<?php

class Page extends SiteTree {
}

class Page_Controller extends ContentController {
    public static $allowed_actions = array(
        'SignupForm',
        'registeringThanks',
        'registrationFailed',
    );
    public function SignupForm() {
        $fields = new FieldSet(
            new TextField("FirstName", "First name"),
            new TextField("Surname"),
            new EmailField("Email", "Email address")
        );
        $actions = new FieldSet(
            new FormAction("SignupAction", "Sign up")
        );
        $validator = new RequiredFields("Email");
        // use __FUNCTION__ here so we don't have to type SignupForm again
        return new Form($this, __FUNCTION__, $fields, $actions, $validator);
    }
    public function SignupAction($data, Form $form, SS_HTTPRequest $request) {
        $member = new Member();
        $form->saveInto($member);
        $member->write();
        $home = SiteTree::get_by_link(null);
        // instead of using $group = DataObject::get_one('Group', "ID = {$home->defaultGroupID}");
        // we can just use $group = $home->defaultGroup(); if defaultGroup is a has_one relation
        if ($home && $home->defaultGroup()) {
            $member->Groups()->add($home->defaultGroup());
            $this->redirect('registeringThanks/');
        } else {
            $this->redirect('registrationFailed/');
        }
    }
    public function registeringThanks(SS_HTTPRequest $request) {
        // display the same page again, but overwrite the Title and Content
        return $this->customise(array(
            'Title' => 'Thank you!',
            'Content' => 'All sorts of spam mails are on there way to you',
        ));
    }
    public function registrationFailed(SS_HTTPRequest $request) {
        // display the same page again, but overwrite the Title and Content
        return $this->customise(array(
            'Title' => 'Great, ... you broke it!',
            'Content' => 'Sorry, we can\'t send you any spam because something went wrong',
        ));
    }
}

注:私はこのコードをテストしていません。頭の上に書いたばかりです。スペルミスやその他の小さなミスが見つかる可能性があります)(この場合、家にリダイレクトする必要はありません、グループのもの、ありがとうページとすべてがこのようにすべてのページで機能します)

ご不明な点がございましたら、こちらまたはhttp://irc.silverstripe.org/でお気軽にお問い合わせください。

于 2012-08-20T18:19:24.700 に答える