|
|
|
| Помогите, пожалуйста, новичку. Сайт – интернет-магазин. Каждый товар может относиться к различному количеству групп. Данные берутся из базы данных(динамически). Для внесения\редактирования информации о товаре – 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-ами… Воспользовался опцией «поиск» по сайту, но разрешить проблему не получилось. Надеюсь на вашу помощь. Заранее огромное спасибо. | |
|
|
|
|
|
|
|
для: Terry
(10.07.2008 в 22:33)
| | Товары для детей -> Гигиенические -> Памперсы //а можно приспособить и для других целей
Товары для женщин -> Гигиенические -> Прокладки //отличные стельки
Что в этом случае означает "товар принадлежит разному количеству групп"? Из примера, это группа "Гигиенические" или то, что их можно использовать не по прямому назначению?
Может надо разобраться сперва в структуре товаров магазина? Ведь для меня (как покупателя) гораздо удобнее знать, что товар, который я купил, я всегда смогу найти на "третей полочке слева вверху". | |
|
|
|
|
|
|
|
для: sim5
(11.07.2008 в 05:01)
| | sim5, "товар принадлежит разному количеству групп" - точнее, "товар МОЖЕТ принадлежит разному количеству групп" - то, что требуют от меня, а у меня не получаеся это реализовать. Если бы было можно этого требования избежать, то, как я уже писал, всё работает. | |
|
|
|
|
|
|
|
для: Terry
(11.07.2008 в 11:04)
| | Ну вы может объяснить, что это означает? Ну представьте себе, что в магазине есть товары категории, например, "Товары для дома". При этом товар "Гвозди", например, я могу обнаружить как в категории "Строительные принадлежности", так и в "Фурнитура". Само по себе это просто глупо, да и затрудняет обработку товара. В данном случае это лишнее и не нужное, а главное совсем не удобно для покупателя. Если я буду покупать в вашем магазине, то я в праве ожидать найти помидор, выбрав его только в категории "Овощи", и мне никак не придет в голову искать его среди "Фрукты".
В вашем случае "принадлежность ко многим", это "принадлежность помидора к овощам и фруктам" одновременно или это нечто другое? | |
|
|
|
|
|
|
|
для: sim5
(11.07.2008 в 11:12)
| | Структура, которую мне нужно реализовать. разрабатывалась не мной. То, что требуется,- если взять в качестве примера товара "помидоры ", как вы предложили, то его родительской группой могут быть и овощи, и "нечто другое" - это требование. Мне нужна помощь не в организации структуры, а в работе с checkbox-ами. Магазин по продаже электротоваров, аудио, видео. некоторых комплектующих для компьютера. И, например, "колонки" - могут быть в каталоге "Переферия для компа", и в то же время - в "Аудио и видео". Общая структура:каталог -> группа -> подгруппа... Один товар может принадлежать разным группам, одна группа - только одному каталогу. Правда, я не совсем понимаю, насколько здесь важна структура - для заполнения checkbox (при редактировании информации о товаре должны быть отмечены флажками выбранные ранее группы, к которым товар относится), и если изменили группы - нужно записать все выбранные группы. Можете мне в этом помочь? | |
|
|
|
|
|
|
|
для: Terry
(11.07.2008 в 12:19)
| | Тут уж более запутанно получается, что-то типа "кто главнее - курица или яйцо". Ну бог с ним, что там у вас главнее - группы или категории, но в таком случае, уж лучше список с мультивыбором, а не куча чекбоксов, как мне кажется. Не знаю, как у вас устроена база, но если вы представляете - кто кому является "родителем", то вывести и отметить чекбоксы (или иное), труда не составит. Возможно, что "запутанность" именно структуры базы (товаров), как раз и является причиной ваших трудностей.
Все-таки, колонки для компьютера, я буду искать именно в "Перефирии для компьютера", а вот колонки, которые для аудио центра, в "Видео и аудио". Если колонки из "Видео и аудио" могут работать и с аудио картой компьютера (совместимый "джек", например), то это уже просто характеристика товара, а не принадлежность группе. | |
|
|
|
|
|
|
|
для: Terry
(10.07.2008 в 22:33)
| | Т.е. данные неверно обновляются в БД? Или на странице с формой неверно отображаются текущие выбранные группы? | |
|
|
|
|
|
|
|
для: sms-send
(11.07.2008 в 13:17)
| | и то, и то.... я делаю запрос к базе данных, получаю id групп, которые должны быть отмечены на странице с формой, но на форме отмечается флагом только последняя из выбранных ранее групп.
при внесении в базу данных - все остальные поля (они не связаны с группами, к которым принадлежит данный товар) - всё записывается правильно, а вот группы - ни в какую(( | |
|
|
|
|
|
|
|
для: Terry
(11.07.2008 в 15:23)
| | По здравому смыслу - группа товаров, это верхний уровень тогда, иначе путаница. Группы должны иметь категории товаров - собственно выражение "Группа товаров" это просто верхняя категория с id_parent равная 0. Ну а далее (подгруппа) субкатегории с id_parent равные id родителей. Товар в свою очередь, кроме id_parent (принадлежность родителю), должен иметь еще и id_group, то есть в какие группы товаров он может входить (ктегории самого верхнего уровня). Тогда получить этот список и согласно ему отметить чекбоксы, это уже не сложно. Вот только менять (переносить из группы в группу) не очень удобно будет. Все-таки (мне так кажется) лучше списками - компактней и удобней. | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: Roma
(11.07.2008 в 16:00)
| | Если я правильно тебя понял - 2 цикла, во внешнем перебираем все чекбоксы на форме, во внутреннем - для каждого чекбокса - ищем в массиве с id нужных группу, при совпадении - отмечаем чекбокс. А раз у меня форма и обработчик в разных файлах - поставить на форме в инпуте переменную.... Спасибо! Надеюсь, заработает. | |
|
|
|
|
|
|
|
для: sim5
(11.07.2008 в 15:43)
| | Сорри, не туда отправил | |
|
|
|
|
|
|
|
для: sim5
(11.07.2008 в 15:43)
| | To: Автор: sim5 (11.07.2008 в 15:43)
Список я получаю, а вот группы не выделяются.
Списками, возможно, удобней - в будущем учту) Только и в этом хочется разобраться - мало ли пригодится) | |
|
|
|
|
|
|
|
для: Terry
(11.07.2008 в 15:23)
| | Я про то, где именно происходит ошибка.
2 вопроса:
1. Если в checkbox'ах выставить нужные группы, они сохраняются в БД?
2. Если в БД вручную выставить нужные группы, они отмечаются в checkbox'ах? | |
|
|
|
|
|
|
|
для: 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 первой отмеченной группы, соответственно и в БД при дальнейшей обработке заносится только одна из выбранных групп. | |
|
|
|
|
|
|
|
для: Terry
(11.07.2008 в 23:31)
| | >В форме:
>
<input type="checkbox" name="to_copy[]" value="{groups.group_id}" />
|
Лучше показать не шаблон, а реальную html форму, которую генерирует скрипт.
***
ICQ есть? | |
|
|
|
|
|
|
|
для: sms-send
(11.07.2008 в 23:39)
| | ICQ 299350272
Не моя аська, стоит на компе, которым я пользуюсь сегодня-завтра. С разрешения хозяйки. | |
|
|
|
|
|
|
|
для: Terry
(12.07.2008 в 00:05)
| | Наконец-таки разобрался, исправил все баги и всё заработало. Спасибо всем, кто помог - и за наводящие вопросы, заставившие ещё раз пересмотреть структуру базы данных, и за советы, и за участие. | |
|
|
|