2017-06-08 16 views
0

サーバー側のすべてを処理するSilverStripeサイトのサインアップフォームがあります。もともと、それはホームページにしかないので、私がうまく働いていたセットアップです。しかし、要件が変更され、フォームがサブページにも表示される必要がありました。フォーム以外のものは、actionパラメータに設定した内容に関係なく、常にホームページに送信されます。提出時に現在のページにリダイレクトするフォームを設定する(SilverStripe/PHP)

元、パラメータは "/ home/submit"でした。現在のページURLを返す変数を受け入れるように変更し、Linkという関数(以下のコードを参照)を作成して、 "/ submit"を追加します。それはうまくいくと思われ、正しいURLをactionパラメータに入れます。

しかし、あなたが送信ボタンを押したときにフォームは依然としてユーザーをホームページに戻しますが、これは私が望むものではありません。私は彼らがフォームが存在する現在のページ(ホームページかサブページか)にとどまるようにします。

$current = $this->get_current_page()->Link(); 
return $this->redirect("$current/?redirected=1#signupform");; 

しかし、それは間違ったURLにユーザーを送信します:

は、私は現在のURLを取得し、そのような送信関数の最後の行のためにそれを使用してみましたhttp://my-site.org/sub-page-title /submit(これは有効ではありません)

ここ

はPage.phpに格納されたフォームのコードです:

public function Link($action='') { 
    $req = Controller::curr()->getRequest(); 
    $req->setURL(parent::Link($action)); 
    $url = $req->getURL(TRUE); // get the url back but with querystr intact. 
    return $url ; 
} 

public function getFirstName() { 
    return Session::get('first_name'); 
} 

public function getLastName() { 
    return Session::get('last_name'); 
} 

public function getCompanyName() { 
    return Session::get('company_name'); 
} 

public function getEmail() { 
    return Session::get('email'); 
} 

public function submit(SS_HTTPRequest $request) { 
    $firstName = $request->postVar('first_name'); 
    $lastName = $request->postVar('last_name'); 
    $c = $request->postVar('company_name'); 
    $email  = $request->postVar('email'); 

    Session::clear('FORM_ERRORS'); 
    $errors = []; 

    if (empty($email)) { 
     array_push($errors, "Email is required"); 
    } 

    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { 
     array_push($errors, "Email must be in a valid format. Example: [email protected]"); 
    } 
    if(empty($firstName)){ 
     array_push($errors, "Please enter a first name"); 
    } 
    if(empty($lastName)){ 
     array_push($errors, "Please enter a last name"); 
    } 

    if (empty($errors)) { 
     Session::clear('first_name'); 
     Session::clear('last_name'); 
     Session::clear('email'); 
     Session::clear('company_name'); 

     $comment = new EmailSignUpSubmission(); 
     $comment->FirstName = $firstName; 
     $comment->LastName = $lastName; 
     $comment->CompanyName = $c; 
     $comment->Email  = $email; 

     $comment->write(); 
    } else { 
     Session::set($this->formErrorsKey, $errors); 
     Session::set('first_name', $firstName); 
     Session::set('last_name', $lastName); 
     Session::set('company_name', $c); 
     Session::set('email', $email); 
    } 

    return $this->redirect("/?redirected=1#signupform"); 

} 

public function getFormErrors() { 
    $errors = Session::get($this->formErrorsKey); 
    if ($errors == null || $errors == "") { 
     return null; 
    } else { 
     $errorList = new ArrayList(); 
     foreach ($errors as $error) { 
      $e = new ArrayData(['Text' => $error]); 
      $errorList->add($e); 
     } 
     return $errorList; 
    } 
} 

public function isRedirect() { 
    $request = $this->getRequest(); 
    return $request->getVar('redirected') == "1"; 
} 

そしてここでは、HTMLフォームそのものです:

あなたにリダイレクトする方法を提出することを使用すると

<input type="hidden" value="{$AbsoluteLink}" name="redirectURL" /> 

:あなたは常に隠しフィールドを使用することができます

<div class="sign-up" id="signupform"> 
    <div class="form-container"> 
     <% if $isRedirect && not $getFormErrors %> 
      <div class="row"> 
       <p class="success"> 
        Thank you for your submission. You will hear back from us shortly. 
       </p> 

      </div> 
     <% else %> 
     <form method="post" action="/$Link/submit"> 
      <h2 class="text-center white subscribe-hdr">Sign up</h2> 
      <% if $getFormErrors %> 
       <% loop $getFormErrors %> 
        <p class="error">$Text</p> 
       <% end_loop %> 
      <% end_if %> 
      <p class="white subscribe-body" style="text-align:center;">Sign up for the latest newsletter.</p> 

      <div class="form-group"> 
       <input class="form-control" type="text" name="first_name" value="$getFirstName" placeholder="First Name"> 
      </div> 
      <div class="form-group"> 
       <input class="form-control" type="text" name="last_name" value="$getLastName" placeholder="Last Name"> 
      </div> 
      <div class="form-group"> 
       <input class="form-control" type="text" name="company_name" value="$getCompanyName" placeholder="Company"> 
      </div> 
      <div class="form-group"> 
       <input class="form-control" type="email" name="email" value="$getEmail" placeholder="Email"> 
      </div> 
      <div class="form-group"> 
       <button class="btn btn-primary btn-block" type="submit" 
         style="width:140px;margin-left:auto;margin-right:auto; float: none; text-align: center">Submit 
       </button> 
      </div> 
     </form> 
    <% end_if %> 
    </div> 
</div> 

答えて

1

これは、現在のControllerオブジェクトをフォームに渡すので、Formクラスを拡張することで、もっと簡単になります。 https://docs.silverstripe.org/en/3/developer_guides/forms/introduction/

+0

私は隠されたフィールドのアプローチを行った。私は、SSフォームのAPIがより簡単になることに同意しますが、これは急いで行われたプロジェクトでした。今後は、フォームAPIをさらに活用する予定です。 –

関連する問題