novoselov Posted January 21, 2012 Share Posted January 21, 2012 Хочется сделать мультивыбор характеристик продуктов. реализовываю через select multiple, но почему то записывается в бд первое значение характеристики, прошу взглянуть на листинги и ткнуть в ошибку. добавляем select multiple: if (sizeof($featureValues)) { echo ' <select multiple id="feature_'.$tab_features['id_feature'].'_value" name="feature_'.$tab_features['id_feature'].'_value[]" onchange="$(\'.custom_'.$tab_features['id_feature'].'_\').val(\'\');"> <option value="0">--- </option>'; foreach ($featureValues AS $value) { if ($current_item == $value['id_feature_value']) $custom = false; echo '<option value="'.$value['id_feature_value'].'"'.(($current_item == $value['id_feature_value']) ? ' selected="selected"' : '').'>'.substr($value['value'], 0, 40).(Tools::strlen($value['value']) > 40 ? '...' : '').' </option>'; } echo '</select>'; } далее я передаю массив в функцию addFeaturesToDB и обрабатываю его циклом foreach: public function addFeaturesToDB($id_feature, $id_value, $cust = 0) { if ($cust) { $row = array('id_feature' => (int)($id_feature), 'custom' => 1); Db::getInstance()->autoExecute(_DB_PREFIX_.'feature_value', $row, 'INSERT'); $id_value = Db::getInstance()->Insert_ID(); $row = array('id_feature' => (int)($id_feature), 'id_product' => (int)($this->id), 'id_feature_value' => (int)($id_value)); Db::getInstance()->autoExecute(_DB_PREFIX_.'feature_product', $row, 'INSERT'); return ($id_value); }else{ $row = array(); foreach ($id_value AS $val){ $row[] = '('.(int)($id_feature).', '.(int)($this->id).', '.(int)($val).')'; Db::getInstance()->Execute( 'INSERT INTO `'._DB_PREFIX_.'feature_product` (`id_feature`, `id_product`, `id_feature_value`) VALUES '.implode(',', $row));} } } Link to comment Share on other sites More sharing options...
wagood Posted January 23, 2012 Share Posted January 23, 2012 Навскидку: ты id_value перебираешь циклом, а id_feature нет. Link to comment Share on other sites More sharing options...
novoselov Posted January 23, 2012 Author Share Posted January 23, 2012 id_feature перебирается вне функции addFeaturesToDB, в функцию я отправляю id характеристики, и массив значений этой характеристики, который и перебираю в функции. прикрепил листинг из AdminProducts.php /* Product features management */ elseif (Tools::isSubmit('submitProductFeature')) { if ($this->tabAccess['edit'] === '1') { if (Validate::isLoadedObject($product = new Product((int)(Tools::getValue('id_product'))))) { // delete all objects $product->deleteFeatures();[/color][/size][/font] // add new objects $languages = Language::getLanguages(false); foreach ($_POST AS $key => $val) { if (preg_match('/^feature_([0-9]+)_value/i', $key, $match)) { if (is_array($val)) $product->addFeaturesToDB($match[1], $val); else { if ($default_value = $this->checkFeatures($languages, $match[1])) { $id_value = $product->addFeaturesToDB($match[1], 0, 1, (int)$language['id_lang']); foreach ($languages AS $language) { if ($cust = Tools::getValue('custom_'.$match[1].'_'.(int)$language['id_lang'])) $product->addFeaturesCustomToDB($id_value, (int)$language['id_lang'], $cust); else $product->addFeaturesCustomToDB($id_value, (int)$language['id_lang'], $default_value); } } } } } if (!sizeof($this->_errors)) Tools::redirectAdmin($currentIndex.'&id_product='.(int)$product->id.'&id_category='.(!empty($_REQUEST['id_category'])?$_REQUEST['id_category']:'1').'&add'.$this->table.'&tabs=4&conf=4&token='.($token ? $token : $this->token)); } else $this->_errors[] = Tools::displayError('Product must be created before adding features.'); } $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); } уже трое суток бьюсь, никак не могу сделать! скорее всего гдето чтото я не так обрабатываю поскольку в PHP не так уж силен. да и на престу перешли относительно недавно, но по анализу остальных функций запись при цикле осуществляется везде примерно так: foreach ($id_value AS $val){ $row[] = '('.(int)($id_feature).', '.(int)($this->id).', '.(int)($val).')'; Db::getInstance()->Execute( 'INSERT INTO `'._DB_PREFIX_.'feature_product` (`id_feature`, `id_product`, `id_feature_value`) VALUES '.implode(',', $row));} к тому же очень сильно удивлен что данный вопрос не поднимался, и то что это не реализовано изначально. ведь при таком подходе снижается вероятность ошибки менеджера при добавлении продукта. Link to comment Share on other sites More sharing options...
Ronaldo Perez Posted January 24, 2012 Share Posted January 24, 2012 что содержит массив? перед циклом var_dump($id_value); Link to comment Share on other sites More sharing options...
novoselov Posted January 24, 2012 Author Share Posted January 24, 2012 вот что у меня вылезло array(2) { [0]=> string(2) "29" [1]=> string(2) "30" } array(2) { [0]=> string(2) "31" [1]=> string(2) "32" } array(2) { [0]=> string(2) "28" [1]=> string(2) "27" } array(3) { [0]=> string(2) "35" [1]=> string(2) "33" [2]=> string(2) "34" } перебрал до входа в функцию addFeaturesToDB Link to comment Share on other sites More sharing options...
novoselov Posted January 29, 2012 Author Share Posted January 29, 2012 up Link to comment Share on other sites More sharing options...
Recommended Posts