как получить значение полей ввода формы в массиве в cakephp

Я новичок в cakephp. Спасибо всем заранее. Я использую Cakephp2.8.5 версию. У меня есть форма с полями ввода и кнопкой отправки. Когда я отправляю форму, поля ввода должны проходить через массив и храниться в переменной с именем $totalData, и я хочу сохранить переменную массива $totalData в переменной сеанса в cakephp. Я написал код в функции Userscontroller cartData. Пожалуйста, помогите мне узнать, как объявить массив и сохранить его в переменной сеанса в cakephp. Моя index.ctp страница:

    <form  method="post" action="<?php echo $this->webroot ?>users/cartData?>""> 
   <table><thead>
          <th>Exam Name</th>
          <th>Venue Name</th>
          <th>Date of Exam</th>

          <th>Price / Course</th>  
          <th>Number of Exams</th>            
          <th>Add to Cart</th> 
         </thead>
         <tbody>
          <tr>      
             <td>
                <select name="course">   
                  <option value="">--Select--</option>            
                  <option value="ITIL Foundation">ITIL Foundation</option>
                  <option value="PMP">PMP</option>
                  <option value="Prince 2 Foundation">Prince 2 Foundation</option>
                </select>           
             </td>    
              <td><input type="text" name="venue" id="venue"></td>        
              <td><input type="text" name="Userdate" id="Userdate" ></td>   

              <td><input type="text" name="txtprice" id="Userdate" ></td>
              <td>
                <select name="num_exams">   
                  <option value="">--Select--</option>            
                  <option value="1">1</option>
                  <option value="2">2</option>
                  <option value="3">3</option>
                </select>           
             </td>
             <td><input type="submit" name="btnSubmit" value="Submit"></td>

         </tr></tbody>

      </table>

My `UsersController.php` page :

<?php
App::uses('CakeEmail', 'Network/Email');
class UsersController extends AppController
{   

  public function cartData()
  {

    if($this->request->is('post')|| $this->request->is('put'))
    { 
       $totalData = array(

        'exam' => $this->Form->input('course'),
        'venue' => $this->Form->input('venue'),
        'date' => $this->Form->input('Userdate'),
        'price' => $this->Form->input('txtprice'),
        'orders' => $this->Form->input('num_exams')

    );

// I have a confusion how to store array values in session variable

     $_SESSION['total_data'][] = $totalData; 



    }


  }
}

person Ragith Thomas    schedule 05.12.2016    source источник


Ответы (4)


Всегда прилагайте все усилия, чтобы использовать фреймворк во всем, что возможно. В некоторых очень специфических случаях использование Помощников является проблемой, но в остальном всегда старайтесь их использовать.

<?php
$courseOptions = array(
    'ITIL Foundation' => 'ITIL Foundation', 
    'PMP' => 'PMP',
    'Prince 2 Foundation' => 'Prince 2 Foundation'
); 
$examOptions = array(1,2,3); 
?>
<?=$this->Form->create('User', array('action' => 'cartData'))?>
<table>
    <thead>
        <tr>
            <th>Exam Name</th>
            <th>Venue Name</th>
            <th>Date of Exam</th>
            <th>Price / Course</th>  
            <th>Number of Exams</th>            
            <th>Add to Cart</th> 
        </tr>
    </thead>
    <tbody>
        <tr>      
            <td>
                <?=$this->Form->input('course', array('options' => $courseOptions)?>
            </td>
            <td><?=$this->Form->input('venue')?></td>
            <td><?=$this->Form->input('userdate')?></td>
            <td><?=$this->Form->input('txtprice')?></td>
            <td><?=$this->Form->input('num_exams', array('options' => $examOptions)); ?></td>
            <td><?=$this->Form->submit('Submit')?></td>
        </tr>
    </tbody>
</table>
<?=$this->Form->end()?>

Все помощники ввода формы создают массив на основе созданной формы. В этом случае он генерирует data[User][course] для имени для каждого и UserCourse для id (используя первый ввод в качестве примера).

На стороне контроллера вы получаете доступ к массиву данных на $this->request->data, который будет иметь ту самую структуру (т.е. $this->request->data['User']['course'] для доступа к первому входному значению).

person SrQ    schedule 23.01.2017

Используйте компонент Session и запишите свой массив в сеанс, используя:

$this->Session->write('cart', $totalData);

Компонент Session, вероятно, уже включен в ваш AppController.php, если не добавить его туда (или в ваш UsersController.php, если вы будете использовать его только там):

    var $components = array('Session');

(добавьте «Сеанс» к любым другим уже перечисленным компонентам)

person Steven van Loef    schedule 05.12.2016
comment
Я должен передать эти значения массива сеансов в цикле foreach для отображения на странице просмотра. Как я могу это сделать? - person Ragith Thomas; 05.12.2016
comment
Почему значит? Я хочу отображать данные полей ввода в строке ниже в отдельной таблице всякий раз, когда я отправляю форму - person Ragith Thomas; 05.12.2016
comment
как передать эту переменную сеанса в foreach для перехода на страницу просмотра. Я использовал $this-›set('cartDatas',$totalData); Когда я обращался к странице просмотра, используя print_r($cartDatas); это показывает, что неопределенная переменная cartDatas - person Ragith Thomas; 06.12.2016
comment
Я использовал $this-›set('cartDatas',$totalData); в контроллере - person Ragith Thomas; 06.12.2016

$totalData = array(

    'exam' => $this->Form->input('course'),
    'venue' => $this->Form->input('venue'),
    'date' => $this->Form->input('Userdate'),
    'price' => $this->Form->input('txtprice'),
    'orders' => $this->Form->input('num_exams')

);

Эта часть вашего кода работает? Можете ли вы показать отладку $ totalData, пожалуйста?

person Aarrbee    schedule 05.12.2016
comment
Я не уверена . Я использовал var_dump(totalData); умри(); но он не работает. На самом деле я хочу отображать данные полей ввода в строке ниже в отдельной таблице всякий раз, когда я отправляю форму, например, добавляя в корзину - person Ragith Thomas; 05.12.2016
comment
Я думаю, вам следует использовать '$totalData = array('exam' => $this->Form-›input('course'), 'место проведения' => $this->Form-›input('место'), ' date' =› $this-›Form-›input('Userdate'), 'price' =› $this-›Form-›input('txtprice'), 'orders' =› $this-›Form-›input ('количество_экзаменов') );' - person Aarrbee; 05.12.2016
comment
Я думаю, вы должны использовать :' - person Aarrbee; 05.12.2016
comment
Я думаю, вам следует использовать: '$totalData = array('exam' =› $this-›request-›data['course'], 'место проведения' =› $this-›request-›data['место проведения'], 'date' =› $this-›request-›data['Userdate'], 'price' =› $this-›request-›data['txtprice'], 'orders' =› $this-›request-› данные['количество_экзаменов'] );' затем отлаживайте массив. - person Aarrbee; 05.12.2016
comment
Как отлаживать этот массив. На самом деле я использовал var_dump($totalData); умереть(), но безрезультатно - person Ragith Thomas; 05.12.2016
comment
попробуйте использовать отладку ($ totalData); умри(); - person Aarrbee; 06.12.2016

$this->Form->input() — это метод FormHelper, он предназначен для использования в представлении, а не в контроллере, для создания входных данных формы наряду с $this->Form->create() и $this->Form->end().

Доступ к входным данным формы контроллера осуществляется с помощью $this->request->data['Model']['fieldname']

Вы можете сделать что-то подобное в своем представлении

<?php 
$courseOptions = array(
    'ITIL Foundation' => 'ITIL Foundation', 
    'PMP' => 'PMP',
    'Prince 2 Foundation' => 'Prince 2 Foundation'
); 

$examOptions = array('1' => '1', '2' => '2', '3' => '3'); 
echo $this->Form->create('User', array('action' => 'cartData')); 
?>
<table>
    <thead>
        <tr>
            <th>Exam Name</th>
            <th>Venue Name</th>
            <th>Date of Exam</th>
            <th>Price / Course</th>  
            <th>Number of Exams</th>            
            <th>Add to Cart</th> 
        </tr>
    </thead>
    <tbody>
        <tr>      
            <td>
                <?php echo $this->Form->input('course', array('options' => $courseOptions)); ?>
            </td>
            <td><?php echo $this->Form->input('venue'); ?></td>
            <td><?php echo $this->Form->input('userdate'); ?></td>
            <td><?php echo $this->Form->input('txtprice'); ?></td>
            <td><?php echo $this->Form->input('num_exams', array('options' => $examOptions)); ?></td>
            <td><?php echo $this->Form->submit('Submit'); ?></td>
        </tr>
    </tbody>
</table>
<?php echo $this->Form->end(); ?>

Затем вы можете сделать что-то подобное в своем контроллере

<?php
App::uses('CakeEmail', 'Network/Email');
class UsersController extends AppController
{   
    public function cartData()
    {
        if($this->request->is('post')|| $this->request->is('put'))
        { 
            $totalData = array(
                'exam' => $this->request->data['User']['course'],
                'venue' => $this->request->data['User']['venue'],
                'date' => $this->request->data['User']['userdate'],
                'price' => $this->request->data['User']['txtprice'],
                'orders' => $this->request->data['User']['num_exams']
            );

            $this->Session->write('total_data', $totalData);

            // Alternatively you can do something like this
            $this->Session->write('total_data', $this->request->data['User']);
        }
    }
}

Возможно, вам потребуется включить компонент Session, я настоятельно рекомендую чтение учебника блога в поваренной книге, чтобы получить представление об этих общих компонентах/помощниках и о том, как осуществляется доступ к данным записи.

person HelloSpeakman    schedule 12.12.2016