Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2014, 00:03   #1
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию Kohana 3 ORM: почему контроллер не видит checkbox с формы?

Дорогие форумчане, у меня возникла такая проблема: в виде (view) есть форма для редактирования данных о детях в детском садике. Данные о конкретной записи (по ид) собираются из базы данных через модель ORM::factory в переменную $kidsData. В форме для редактирования есть поле с чекбоксом - посещает ли ребенок "продленку" (isLongDay).
Вот фрагмент кода формы из вида (в разметке используется Bootstrap 3.2)
Код:
<div class="row">
                   <div class="col-md-5 labelTitle">Имя ребенка</div>
                   <div class="col-md-7"><input class="form-control" type="text" name="firstnameUpdate" id="fnameExtraUpdate" value="<?php  echo $kidsData->firstname ?>"></div>
                  </div>
                   <div class="row">
                    <div class="col-md-5 labelTitle">Фамилия ребенка</div>
                     <div class="col-md-7"> <input class="form-control" type="text" name="lastnameUpdate" id="lnameUpdate" value="<?php  echo $kidsData->lastname ?>" ></div>
                   </div>  

 <div class="row">
                    <?php // определяем значение чекбокса - работает корректно
                    $checked=NULL;
                    if($kidsData->longDay == "t"){
                     $checked="checked";   
                    }
                        else {
                         if($kidsData->longDay == "f"){
                         $checked="unchecked";  
                         }
                    }
                     ?>
<!-- Вот он - проблемный чекбокс isLongDay -->
                    <div class="col-md-1" id="isLongDay"><input class="checkbox" type="checkbox" name="isLongDay"  <?php echo $checked  ?> value="<?php  $checked  ?>" ></div>        
                    <div class="col-md-11" id="checkboxLongDay">
                    <label class="control-label"> Группа продленного дня </label></div>                           
                </div>
Данные о конкретной записи считываются корректно. Изначальное значение чекбокса отображается тоже корректно.

И когда передаются измененные данные конкретной записи передаются в контроллер, с обычными строковыми данными проблем не возникает, но когда дело касается логической переменной и чекбокса приложение выдает ошибку - мол, Undefined index islongDay (типа нету такой переменной). Вот почему контроллер видит имена input -ов с именем и фамилией, а имя чекбокса и его значение не видит?

Код контроллера связанный с изменением данных
Код:
//Если нажато на кнопку Обновить данные
 if(isset($_REQUEST['updateData'])) { 
          
            try{
            
//Не видит имя этого чекбокса isLongDay - говорит нет такого - выдает ошибку, а в форме же такое же имя!
                if($_REQUEST['isLongDay']=="checked"){//Если чекбокс отмечен(value==checked)
                          $kidsData->longDay = 'TRUE';// в базе значение поля "продленка" присвоить значение   'TRUE'
                                         
                        }
                    else {
                          $kidsData->longDay = 'FALSE';
                       
                    }

//Передаем в модель остальные измененные данные и сохраняем их в базу
$kidsData->values(array(
                    'firstname' => $_REQUEST['firstnameUpdate'], //имя ребенка считывается с поля формы
                    'lastname' => $_REQUEST['lastnameUpdate'], //фамилия ребенка считывается с поля формы
  ));
                $kidsData->save(); // сохраняются данные модели в базе данных
                
                  
                  
                 $this->redirect('http://children/edit'); //возвращаемся к списку редактирования всей группы детей
                }
             catch (ORM_Validation_Exception $e){
                 
             }
        }
В результате происходит полная ерунда -при нажатии кнопки "Сохранить" приложение вдобавок к сообщению об ошибке сбрасывает у записи чекбокс, и в базе данных значение TRUE превращается в FALSE. И потом оно так и отображается как FALSE - приходится вручную менять.
Без использования данных с чекбокса в контроллере - то есть мы передаем только измененные имя/фамилия ребенка - приложение работает, как часы.

Как граммотно можно реализовать подобный функционал обновления с логическим чекбоксом в модели, используя Kohana ORM? Извитите за возможно наивный вопрос, просто я не очень дружу с PHP
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan

Последний раз редактировалось Blondy; 14.05.2014 в 00:08.
Blondy вне форума Ответить с цитированием
Старый 14.05.2014, 09:29   #2
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

а посмотрите - print_r($_REQUEST) что вам покажет .. .есть ли там такое поле ваще
ADSoft вне форума Ответить с цитированием
Старый 15.05.2014, 00:25   #3
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию

Извините, я не очень хорошо понимаю, вот это print_r надо прописать в виде или в контроллере?

И как правильно прописать? Я прописала пока в виде print_r($_REQUEST['islongDay']), но приложение также выдает Undefined index islongDay.

Надеюсь на Ваш добрый совет!
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Старый 15.05.2014, 10:11   #4
ATL
Форумчанин
 
Аватар для ATL
 
Регистрация: 26.01.2007
Сообщений: 278
По умолчанию

Не работает потому, что если checkbox (любой) не checked (и речь не о value="checked"), то при отправке формы он в $_REQUEST просто не попадает.

PHP код:
$checked NULL;
if (
$kidsData->longDay == "t") {
    
$checked "checked";
} else {
    if (
$kidsData->longDay == "f") {
        
$checked "unchecked";
    }

Не знаю что тут происходит, явно какое-то безумие. В случае $checked = "unchecked"; Вы получите HTML:
Код HTML:
<input class="checkbox" type="checkbox" name="isLongDay" unchecked value="unchecked">
Толку от этого кода нет, в $_REQUEST он не попадёт.

PHP код:
$checked "";
if (
$kidsData->longDay == "t") {
    
$checked "checked";

Вот это всё, что нужно.


Далее код
Код HTML:
<div class="col-md-1" id="isLongDay"><input class="checkbox" type="checkbox" name="isLongDay"  <?php echo $checked  ?> value="<?php  $checked  ?>" ></div>
меняем на:
Код HTML:
<div class="col-md-1" id="isLongDay"><input class="checkbox" type="checkbox" name="isLongDay"  <?php echo $checked;  ?> value="1" ></div>
После чего, в контроллере код:
PHP код:
if ($_REQUEST['isLongDay'] == "checked") { //Если чекбокс отмечен(value==checked)
    
$kidsData->longDay 'TRUE'// в базе значение поля "продленка" присвоить значение   'TRUE'
} else {
    
$kidsData->longDay 'FALSE';

Меняем на:
PHP код:
if (isset($_REQUEST['isLongDay']) {
    
$kidsData->longDay TRUE;
} else {
    
$kidsData->longDay FALSE;


Совет: не надо присваивать "булевые" значения 'FALSE', 'TRUE'. Это не булевые значения, это строки 'FALSE' и 'TRUE'.
Если Вы будете делать проверку типа:
PHP код:
$x 'FALSE';
if (
$x) {
    echo 
'$x = TRUE';
} else {
    echo 
'$x = FALSE';

Угадайте, какую строку выведет скрипт?
Булевые значения - TRUE и FALSE.

Последний раз редактировалось ATL; 15.05.2014 в 10:25.
ATL вне форума Ответить с цитированием
Старый 15.05.2014, 10:28   #5
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Blondy Посмотреть сообщение
Код:
<input class="checkbox" type="checkbox" name="isLongDay"  <?php echo $checked  ?> value="<?php  $checked  ?>" >
В вашем коде ошибка в самом выводе значения для чекбокса – отсутствует команда echo.
Должно быть так:
PHP код:
 value="<?php echo $checked?>"
Andkorol вне форума Ответить с цитированием
Старый 15.05.2014, 22:32   #6
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию

Всем огромное спасибо за консультацию и разъяснение. Буду следовать Вашим советам!
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Телевизор видит диск, а компьютер нет - почему? grenles Свободное общение 5 17.11.2015 22:40
Kohana 3.0: почему данные в приложении после обновления отображаются не по возрастанию id Blondy PHP 4 13.05.2014 17:16
JavaEE, Spring: передача в контроллер большого кол-ва данных с формы Neon-z Java для Web (EE, Servlet, JSP, Tomcat, Spring MVC) 0 04.02.2014 21:20
Почему обработчик нажатия клавиши не видит PrintScreen? (C#) NithrouS Общие вопросы .NET 6 29.07.2012 21:55
Почему не видит сессию маГГ85 PHP 8 10.01.2012 01:41