Jump to content

select multiple для характеристик продуктов


Recommended Posts

Хочется сделать мультивыбор характеристик продуктов.

 

реализовываю через 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

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

вот что у меня вылезло

 

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

×
×
  • Create New...