0

フッターと個々のページで一度フォームを使用する必要がありますindex.ctp。そのために、 という名前のデータベース テーブルがありますcontactforms。モデルを作成しましたContactform.php

<?php
App::uses('AppModel', 'Model');
/**
 * Contactform Model
 *
 */
class Contactform extends AppModel {
/**
 * Validation rules
 *
 * @var array
 */
      var $useTable = false;

    public $validate = array(
        'firstname' => array(
            'notempty' => array(
                'rule' => array('notempty')             
            )
        ),
        'contactno' => array(
            'notempty' => array(
                'rule' => array('notempty')             
            )
        ),
        'email' => array(
            'notempty' => array(
                'rule' => array('notempty')         
            )
        )
    );
}
?>

メールを送信しようとしているコントローラーがあります

<?php
App::uses('AppController', 'Controller');
App::uses('CakeEmail', 'Network/Email');

class ContactformsController extends AppController {


    public function index() {
        $this->Contactform->recursive = 0;
        $this->set('contactforms', $this->paginate());
    }


        public function contact() {

        $email = new CakeEmail();
            if(isset($this->params['requested']) && $this->params['requested']==true)
    {
         if ($this->request->is('post')) 
            {
             $this->Contactform->set($this->request->data);
                if($this->Contactform->save($this->request->data)) 
                {
                 $name=$this->request->data['Contactform']['firstname'];
                 $lastname=$this->request->data['Contactform']['lastname'];
                 $contact=$this->request->data['Contactform']['contactno'];
                 $mail= $this->request->data['Contactform']['email'];
                 $email->from(array($mail => $name));
                     $email->to('abc@gmail.com');                      
                     $message= $this->request->data['Contactform']['message'];
                     $email->subject('Wombats contact form information');        
                 if($email->send($message))
                 {
                    $this->Session->setFlash('Quote Processed..Thank You For Visiting Our Website!!!');
                                     $this->redirect($this->referer());
                    }   
                    }
                 }

               }
        }
}
?>

次に、フッターで呼び出してからインデックスファイルで呼び出す要素を作成しました。 contact.ctpのように見える

<?php echo $this->Html->css('contactfooter.css');?>

<?php $contactforms = $this->requestAction('Contactforms/contact') ?>
<div class="frm">
<?php echo $this->Form->create('Contactform'); ?> 
<div class="firstrow">
    <div class="first">
        <?php echo $this->Form->input('firstname',array('label'=>false,'placeholder'=>'firstname','div'=>'firstname','style'=>'width:130px; height:20px;' ));?>
        <?php // echo $this->Form->input('firstname',array('label'=>false,'placeholder'=>'firstname','style'=>'width:130px; height:20px; float:left; margin-right:5px;','error'=>array('attributes'=>array('wrap'=>'div','class'=>'errorfirst'))));?>
    </div>
    <div class="second">
        <?php echo $this->Form->input('lastname',array('label'=>false,'placeholder'=>'lastname','div'=>'lastname','style'=>'width:140px; height:20px; '));?>
    </div>   
</div>
<!--<div class="secondrow">-->
<?php echo $this->Form->input('contactno',array('label'=>false,'placeholder'=>'contactno','div'=>'contactno','style'=>'width:270px; height:20px; margin-bottom:10px;'));?>
<!--</div>-->

<?php echo $this->Form->input('email',array('label'=>false,'placeholder'=>'email','div'=>'email','style'=>'width:270px; height:20px; '));?>
<?php echo $this->Form->input('message',array('label'=>false,'placeholder'=>'message','div'=>'message','style'=>'width:270px; height:25px;margin-top:10px; '));?>
</div>
<!--<br>-->
<div class="sub">
<?php echo $this->Form->end('SUBMIT'); ?> 
    </div>

あるフォームの送信をクリックすると、他のフォームも検証されます。いろいろ試したのですが、直し方がわかりません どなたか教えてください。

編集:- @Nunser 申し訳ありませんが、これらの名前と非常に混同しています。あなたが言ったことに従ってコードを変更しましたが、それでも1つのフォームのみを検証しています。あなたによると、ビューと要素も変更する必要がありますが、要素しかありません。編集したコードを投稿するのを手伝ってください

インデックスページから要素を次のように呼び出しました

<?php echo $this->element('Contactform/contact',array('source'=>'index')); ?>\

そしてデフォルトページから

<?php echo $this->element('Contactform/contact'); ?>

私のコントローラーアクションは

public function contact() {

        $email = new CakeEmail();

        if(isset($this->params['requested']) && $this->params['requested']==true){

        if ($this->request->is('post')) 

        {
            $index = 'Contactform';
            if (isset($this->request->data['Contactformindex']))
                $index = 'Contactformindex';

        $this->Contactform->set($this->request->data[$index]);

        if($this->Contactform->save($this->request->data[$index])) 

        {

        $name=$this->request->data[$index]['firstname'];

        $lastname=$this->request->data[$index]['lastname'];

        $contact=$this->request->data[$index]['contactno'];

        $mail= $this->request->data[$index]['email'];

        $email->from(array($mail => $name));



        $email->to('skyhi13@gmail.com');               

                $message= $this->request->data[$index]['message'];

                $email->subject('Wombats contact form information');

        //$email->send($message);

        if($email->send($message))

        {
        $this->Session->setFlash('Quote Processed..Thank You For Visiting Our Website!!!');

        //$this->render('/view/elements/quotes/quoteform.ctp');

//        $this->autoRender=FALSE;

        $this->redirect($this->referer());

        }    


        }
        else {
            $this->set('formName',$index);
        }

      }

          }

        }

要素のctpファイルで、次のように変更しました

<?php if (!empty($this->validationErrors['Contactform'])) {
     $this->validationErrors[$formName] = $this->validationErrors['Contactform'];
}?>
<div class="frm">
<?php
    if(isset($source)&& $source == 'index')
        echo $this->Form->create('Contactformindex'); 
    else
        echo $this->Form->create('Contactform'); 
 ?>   
<div class="firstrow">
    <div class="first">
        <?php echo $this->Form->input('firstname',array('label'=>false,'placeholder'=>'firstname','div'=>'firstname','style'=>'width:130px; height:20px;' ));?>
        <?php // echo $this->Form->input('firstname',array('label'=>false,'placeholder'=>'firstname','style'=>'width:130px; height:20px; float:left; margin-right:5px;','error'=>array('attributes'=>array('wrap'=>'div','class'=>'errorfirst'))));?>
    </div>
    <div class="second">
        <?php echo $this->Form->input('lastname',array('label'=>false,'placeholder'=>'lastname','div'=>'lastname','style'=>'width:140px; height:20px; '));?>
    </div>   
</div>
<!--<div class="secondrow">-->
<?php echo $this->Form->input('contactno',array('label'=>false,'placeholder'=>'contactno','div'=>'contactno','style'=>'width:270px; height:20px; margin-bottom:10px;'));?>
<!--</div>-->

<?php echo $this->Form->input('email',array('label'=>false,'placeholder'=>'email','div'=>'email','style'=>'width:270px; height:20px; '));?>
<?php echo $this->Form->input('message',array('label'=>false,'placeholder'=>'message','div'=>'message','style'=>'width:270px; height:25px;margin-top:10px; '));?>
</div>
<!--<br>-->
<div class="sub">
<?php echo $this->Form->end('SUBMIT'); ?> 
    </div>

このコードを使用しても、1つのフォームのみが検証され、フォームは私が呼び出したsourceものindexであり、クリックするindex submit buttonと他のフォームが検証されます。あなたが指定したのと同じFromindex名前を使用する必要があるかどうかはわかりませんが、それは問題ですか. どこが間違っているのかを見つけることができません。助けてください。事前に感謝します。

4

1 に答える 1

0

そもそもなんでこんなことしてんの

<?php $contactforms = $this->requestAction('Contactforms/contact') ?>

あなたの要素で?処理が遅くなることを除いて、その requestAction の使用は見られません...

わかりましたが、問題は...
要素を呼び出しているため、両方のフォームの検証を回避する簡単な方法はありません。通常、同じモデルに対応するフォームが 2 つある場合、両方を検証しない方法は、フォームの「名前」を次のように変更することです。

<!--in the first form-->
<?php echo $this->Form->create('Contactform1'); ?> 
<!--in the second form-->
<?php echo $this->Form->create('Contactform2'); ?> 

ただし、要素を使用してそのフォームを作成しているため、ある場所でフォームの名前を変更し、他の場所では変更しない簡単な方法はありません...

したがって、これがあなたがすべきことです(あなたが望むことを行う他の方法があるかもしれませんが、これは私が考えることができるものです). contact.ctp 要素を呼び出すときに、変数を渡します

echo $this->element('contact', array(
   "source" => "index"
));

これで、たとえば index.ctp から要素を呼び出していることがわかります。次に、要素で、変数に応じてフォーム宣言を変更します

//the beginning of your element
<?php
    if (isset($source) && $source == 'index')
      echo $this->Form->create('FromIndex');
    else
      echo $this->Form->create('FromContact');
?>

また、アクションを変更して、データの取得元に応じてFromIndexまたは でデータを読み取る必要があります。FromContact

public function contact() {

   $email = new CakeEmail();
   if(isset($this->params['requested']) && $this->params['requested']==true)  {
     if ($this->request->is('post'))  {

        //change the index of the array depending on where it came form
        $index = 'FromContact';
        if (isset($this->request->data['FromIndex']))
           $index = 'FromIndex';

         $this->Contactform->set($this->request->data[$index]);
            if($this->Contactform->save($this->request->data[$index])) 
            {
             $name=$this->request->data[$index]['firstname'];
             $lastname=$this->request->data[$index]['lastname'];
             $contact=$this->request->data[$index]['contactno'];
             $mail= $this->request->data[$index]['email'];
             $email->from(array($mail => $name));
                 $email->to('abc@gmail.com');                      
                 $message= $this->request->data[$index]['message'];
                 $email->subject('Wombats contact form information');        
             if($email->send($message))
             {
                $this->Session->setFlash('Quote Processed..Thank You For Visiting Our Website!!!');
                                 $this->redirect($this->referer());
                }   
                }
             }

           }
    }
}

何かを保存または設定するとき (複数のモデルを保存するときに is やそのような関数を使用しない限り)、保存する配列にモデルを指定する必要はありませんsaveAssociatedsaveAll

$saveMe = array('User'=>array('name'=>'John'));
$saveMeToo = array('name'=>'John');
$this->User->save($saveMe); //will work
$this->User->save($saveMeToo); //will work too

そのため、$this->request->dataインデックスの変更はどちらの方法でも機能します。ただし、検証は特定のインデックス (FromContactまたはFromIndex) に対して行われます。

注:コードをテストしていないので、かっこの欠落、閉じられていないことなどを必ず確認してください'

EDiT
@winnie は、検証が 1 つのフォームに対してのみ行われたことを指摘しました。これは、私が何かを見落としたためです。ビューのこの変数$this->validationErrors['ModelName']に何かが設定されている場合、検証エラーがビューに表示されます。そして、それは私が逃したものです。$indexしたがって、モデルの をビューに渡すようにアクションを再変更して、ビューがどのフォームがアクションを呼び出したかを認識できるようにします。

public function contact() {

   $email = new CakeEmail();
   if(isset($this->params['requested']) && $this->params['requested']==true)  {
     if ($this->request->is('post'))  {

        //change the index of the array depending on where it came form
        $index = 'FromContact';
        if (isset($this->request->data['FromIndex']))
           $index = 'FromIndex';

         $this->Contactform->set($this->request->data[$index]);
            if($this->Contactform->save($this->request->data[$index])) 
            {
                //this if is exactly the same as the other one
            } else {
                //now, if there's no save, there's some validation errors
                //tell the view which form called this save
                $this->set('formName', $index);

            }
    }
}

ビューで、モデルで取得したエラーを、フォームに指定した「偽のモデル名」にコピーする必要があります。ビューの最初の行でこれを行います(そして要素でも)

if (!empty($this->validationErrors['Contactform'])) {
     $this->validationErrors[$formName] = $this->validationErrors['Contactform'];
}
于 2013-07-01T17:28:48.817 に答える