Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: выделить нужный checkbox (PHP, JavaScript)
 
 автор: Terry   (10.07.2008 в 22:33)   письмо автору
 
 

Помогите, пожалуйста, новичку. Сайт – интернет-магазин. Каждый товар может относиться к различному количеству групп. Данные берутся из базы данных(динамически). Для внесения\редактирования информации о товаре – 2 страницы. На первой – динамически формируемый список товаров, при клике на товар – открывается вторая страница - форма, среди полей которой – checkbox, и флагом должны быть отмечены те группы, к которым относится данный товар. Если товар относится только к одной группе – проблем нет, она отмечена, а вот если товар относится к разным группам – отмечается только последний из массива, содержащего id нужных групп. Что только не пытался сделать – не работает… До этого дошёл:
$group_arr[$c]['group_id'] – здесь id нужной группы,
if(sizeof($group_arr) == 1 )
        {
            $group_id_check = $group_arr[0]['group_id'];
            print "parent.SelectParent($group_id_check);";
        }
        else
        {
            for($i = 0; $i < sizeof($group_arr); $i++)
            {
                $group_id_check = $group_arr[$i]['group_id'];
                //$tpl->set_var('group_id_check', $group_id_check);
                print "parent.Select_Parent($group_id_check);";
            }        
        }
В отдельно подключаемом файле со скриптами на JavaScript:
function SelectParent(group_id)
    {
        document.getElementById('parent_id').value = group_id;
        var oForm = document.getElementById('frm_Edit');

        
        
        for (var i=0; i < oForm['to_copy[]'].length; i++) 
        {
            if ( oForm['to_copy[]'][i].value == group_id )
            {
                oForm['to_copy[]'][i].checked = true;
            }
            else
            {
                oForm['to_copy[]'][i].checked = false;    
            }
        }

    }
    
    function Select_Parent(group_id)
    {
        
        var oForm = document.getElementById('frm_Edit');

        
        
        for (var i=0; i < oForm['to_copy[]'].length; i++) 
        {
            if ( oForm['to_copy[]'][i].value == group_id )
            {
                oForm['to_copy[]'][i].checked = true;
            }
            else
            {
                oForm['to_copy[]'][i].checked = false;    
            }
        }

    }

Форма:
<input type="checkbox"  name="to_copy[]" value="{groups.group_id}" />

Срочно необходимо решить, а у меня уже просто ступор…

И параллельно – не получается «считать» отмеченные checkbox-ы(для сохранения в БД\редактирования ). Данные из формы пересылаются на обработку в файл «form_save.php» :
<form id="frm " name="frm " method="post" enctype="multipart/form-data" action="form_save.php ">….<input type="checkbox"  name="to_copy[]" value="{groups.group_id}" multiple />

({groups.group_id} – работает – подключен файл на php, в котором считываются данные с БД )
В form_save.php:
if(isset ($_REQUEST["to_copy"]))
    {
        $group_id = array();
        for($i=0; $i<sizeof($_REQUEST['to_copy']); $i++)
        {
            $group_id[$i]['gr_id'] = (int)$_REQUEST['to_copy'][$i];
        }
    }

И перед редактированием\внесением в БД:
if(isset($group_id))
{
    for($i=0; $i<siseof($group_id); $i++)
    {
        $id_group = $group_id[$i]['gr_id'];
                    $sql =  "UPDATE ….";
        ($result = $db->sql_query($sql))
    }
}

Всю ночь бьюсь над этими checkbox-ами… Воспользовался опцией «поиск» по сайту, но разрешить проблему не получилось. Надеюсь на вашу помощь. Заранее огромное спасибо.

   
 
 автор: sim5   (11.07.2008 в 05:01)   письмо автору
 
   для: Terry   (10.07.2008 в 22:33)
 

Товары для детей -> Гигиенические -> Памперсы //а можно приспособить и для других целей
Товары для женщин -> Гигиенические -> Прокладки //отличные стельки
Что в этом случае означает "товар принадлежит разному количеству групп"? Из примера, это группа "Гигиенические" или то, что их можно использовать не по прямому назначению?
Может надо разобраться сперва в структуре товаров магазина? Ведь для меня (как покупателя) гораздо удобнее знать, что товар, который я купил, я всегда смогу найти на "третей полочке слева вверху".

   
 
 автор: Terry   (11.07.2008 в 11:04)   письмо автору
 
   для: sim5   (11.07.2008 в 05:01)
 

sim5, "товар принадлежит разному количеству групп" - точнее, "товар МОЖЕТ принадлежит разному количеству групп" - то, что требуют от меня, а у меня не получаеся это реализовать. Если бы было можно этого требования избежать, то, как я уже писал, всё работает.

   
 
 автор: sim5   (11.07.2008 в 11:12)   письмо автору
 
   для: Terry   (11.07.2008 в 11:04)
 

Ну вы может объяснить, что это означает? Ну представьте себе, что в магазине есть товары категории, например, "Товары для дома". При этом товар "Гвозди", например, я могу обнаружить как в категории "Строительные принадлежности", так и в "Фурнитура". Само по себе это просто глупо, да и затрудняет обработку товара. В данном случае это лишнее и не нужное, а главное совсем не удобно для покупателя. Если я буду покупать в вашем магазине, то я в праве ожидать найти помидор, выбрав его только в категории "Овощи", и мне никак не придет в голову искать его среди "Фрукты".
В вашем случае "принадлежность ко многим", это "принадлежность помидора к овощам и фруктам" одновременно или это нечто другое?

   
 
 автор: Terry   (11.07.2008 в 12:19)   письмо автору
 
   для: sim5   (11.07.2008 в 11:12)
 

Структура, которую мне нужно реализовать. разрабатывалась не мной. То, что требуется,- если взять в качестве примера товара "помидоры ", как вы предложили, то его родительской группой могут быть и овощи, и "нечто другое" - это требование. Мне нужна помощь не в организации структуры, а в работе с checkbox-ами. Магазин по продаже электротоваров, аудио, видео. некоторых комплектующих для компьютера. И, например, "колонки" - могут быть в каталоге "Переферия для компа", и в то же время - в "Аудио и видео". Общая структура:каталог -> группа -> подгруппа... Один товар может принадлежать разным группам, одна группа - только одному каталогу. Правда, я не совсем понимаю, насколько здесь важна структура - для заполнения checkbox (при редактировании информации о товаре должны быть отмечены флажками выбранные ранее группы, к которым товар относится), и если изменили группы - нужно записать все выбранные группы. Можете мне в этом помочь?

   
 
 автор: sim5   (11.07.2008 в 12:39)   письмо автору
 
   для: Terry   (11.07.2008 в 12:19)
 

Тут уж более запутанно получается, что-то типа "кто главнее - курица или яйцо". Ну бог с ним, что там у вас главнее - группы или категории, но в таком случае, уж лучше список с мультивыбором, а не куча чекбоксов, как мне кажется. Не знаю, как у вас устроена база, но если вы представляете - кто кому является "родителем", то вывести и отметить чекбоксы (или иное), труда не составит. Возможно, что "запутанность" именно структуры базы (товаров), как раз и является причиной ваших трудностей.
Все-таки, колонки для компьютера, я буду искать именно в "Перефирии для компьютера", а вот колонки, которые для аудио центра, в "Видео и аудио". Если колонки из "Видео и аудио" могут работать и с аудио картой компьютера (совместимый "джек", например), то это уже просто характеристика товара, а не принадлежность группе.

   
 
 автор: sms-send   (11.07.2008 в 13:17)   письмо автору
 
   для: Terry   (10.07.2008 в 22:33)
 

Т.е. данные неверно обновляются в БД? Или на странице с формой неверно отображаются текущие выбранные группы?

   
 
 автор: Terry   (11.07.2008 в 15:23)   письмо автору
 
   для: sms-send   (11.07.2008 в 13:17)
 

и то, и то.... я делаю запрос к базе данных, получаю id групп, которые должны быть отмечены на странице с формой, но на форме отмечается флагом только последняя из выбранных ранее групп.
при внесении в базу данных - все остальные поля (они не связаны с группами, к которым принадлежит данный товар) - всё записывается правильно, а вот группы - ни в какую((

   
 
 автор: sim5   (11.07.2008 в 15:43)   письмо автору
 
   для: Terry   (11.07.2008 в 15:23)
 

По здравому смыслу - группа товаров, это верхний уровень тогда, иначе путаница. Группы должны иметь категории товаров - собственно выражение "Группа товаров" это просто верхняя категория с id_parent равная 0. Ну а далее (подгруппа) субкатегории с id_parent равные id родителей. Товар в свою очередь, кроме id_parent (принадлежность родителю), должен иметь еще и id_group, то есть в какие группы товаров он может входить (ктегории самого верхнего уровня). Тогда получить этот список и согласно ему отметить чекбоксы, это уже не сложно. Вот только менять (переносить из группы в группу) не очень удобно будет. Все-таки (мне так кажется) лучше списками - компактней и удобней.

   
 
 автор: Roma   (11.07.2008 в 16:00)   письмо автору
 
   для: sim5   (11.07.2008 в 15:43)
 

Если я правильно понял суть проблемы.
может как-то так:

<?php
//$group_arr - массив id-групп, к которым относится данный товар
$query=mysql_Query("select group_id,group_name from groups");
while(
$res=mysql_fetch_array($query)){
   if(
in_array($res['group_id']),$group_arr)$checked="checked";else $checked="";
   echo
"<input name=group[] type=checkbox $cheched value='".$res['group_id']."'>".$res['group_name'];
}
?>


ps ой, сообщение адресовалось Terry

   
 
 автор: Terry   (11.07.2008 в 16:18)   письмо автору
 
   для: Roma   (11.07.2008 в 16:00)
 

Если я правильно тебя понял - 2 цикла, во внешнем перебираем все чекбоксы на форме, во внутреннем - для каждого чекбокса - ищем в массиве с id нужных группу, при совпадении - отмечаем чекбокс. А раз у меня форма и обработчик в разных файлах - поставить на форме в инпуте переменную.... Спасибо! Надеюсь, заработает.

   
 
 автор: Terry   (11.07.2008 в 16:20)   письмо автору
 
   для: sim5   (11.07.2008 в 15:43)
 

Сорри, не туда отправил

   
 
 автор: Terry   (11.07.2008 в 16:23)   письмо автору
 
   для: sim5   (11.07.2008 в 15:43)
 

To: Автор: sim5 (11.07.2008 в 15:43)

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

   
 
 автор: sms-send   (11.07.2008 в 22:41)   письмо автору
 
   для: Terry   (11.07.2008 в 15:23)
 

Я про то, где именно происходит ошибка.
2 вопроса:

1. Если в checkbox'ах выставить нужные группы, они сохраняются в БД?
2. Если в БД вручную выставить нужные группы, они отмечаются в checkbox'ах?

   
 
 автор: Terry   (11.07.2008 в 23:31)   письмо автору
 
   для: sms-send   (11.07.2008 в 22:41)
 

Если в БД вручную выставить нужные группы, то они отмечаются в checkbox'ах.
Если в checkbox'ах выставить нужные группы - происходит что-то мне непонятное: передаётся то количество значений, сколько выбрано, но все они равны первому выбранному значению. Попытаюсь объяснить:
В форме:
<input type="checkbox"  name="to_copy[]" value="{groups.group_id}" />

В обработчике:
if(isset ($_REQUEST["to_copy"]))
    {    
        $group_id = array();
        for($i=0; $i<sizeof($_REQUEST['to_copy']); $i++)
        {
            $group_id[$i]['gr_id'] = (int)$_REQUEST['to_copy'][$i];
            $id_group = $group_id[$i]['gr_id'];
            
                   ?>
                   <script language="javascript">alert('<?php print $id_group;?>');</script>
                  <?php
            
        
}
    }

Т.е., при попытке распечатать передаваемые значения я каждый раз получаю alert только с id первой отмеченной группы, соответственно и в БД при дальнейшей обработке заносится только одна из выбранных групп.

   
 
 автор: sms-send   (11.07.2008 в 23:39)   письмо автору
 
   для: Terry   (11.07.2008 в 23:31)
 

>В форме:
>
<input type="checkbox"  name="to_copy[]" value="{groups.group_id}" />



Лучше показать не шаблон, а реальную html форму, которую генерирует скрипт.

***
ICQ есть?

   
 
 автор: Terry   (12.07.2008 в 00:05)   письмо автору
 
   для: sms-send   (11.07.2008 в 23:39)
 

ICQ 299350272
Не моя аська, стоит на компе, которым я пользуюсь сегодня-завтра. С разрешения хозяйки.

   
 
 автор: Terry   (12.07.2008 в 01:15)   письмо автору
 
   для: Terry   (12.07.2008 в 00:05)
 

Наконец-таки разобрался, исправил все баги и всё заработало. Спасибо всем, кто помог - и за наводящие вопросы, заставившие ещё раз пересмотреть структуру базы данных, и за советы, и за участие.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования