Всего: 2 1 2 >
 [хак] мультивыбор характеристик продукта
novoselov
Новичок
: 23
: 12-10-2011


20-01-2012 03:30
хотелось бы сделать мультывыбр характеристик продукта
сейчас можно добавить только одно значение к характеристики.

собственно...
в AdminProducts.php изменил тип SELECT'а на multiple и добавил '[]' в name
Код:
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">---&nbsp;</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 ? '...' : '').'&nbsp;</option>';
                        }

                        echo '</select>';


вопрос что дописывать в обработчик, пытался вставить еще один foreach но почему то в базу попадает только первое значение массива.
 
 
novoselov
Новичок
: 23
: 12-10-2011


22-01-2012 03:43
так изменил функцию 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).')';
            return Db::getInstance()->Execute(
            'INSERT INTO `'._DB_PREFIX_.'feature_product` (`id_feature`, `id_product`, `id_feature_value`)
            VALUES '.implode(',', $row));
                
                
                //$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');
        //if ($id_value)
        //    return ($id_value);
        }
        
    // Db::getInstance()->Execute('
    // INSERT INTO `'._DB_PREFIX_.'feature_product` (`id_feature`, `id_product`, `id_feature_value`)
    // VALUES ('.(int)($id_feature).', '.(int)($this->id).', '.(int)($id_value).')'
    // );
    }
 
 
e_v_medvedev
Профессионал
: 806
: Москва
: 25-03-2011


22-01-2012 16:11
Надо обеспечить не только передачу с клиента массива вместо единичного значения, но и разбор этого входного параметра на сервере как массива, а не единичного значения. И делать это да построения запроса к БД. Проверяйте всю цепочку обработки.


Сообщение отредактировано e_v_medvedev 22-01-2012 12:12 ...
 
  
novoselov
Новичок
: 23
: 12-10-2011


22-01-2012 17:54
дело в том что с массивом все в порядке по крайней мере до входа в функцию, перебирал его и выводил через echo все значения на месте.

вообще сделал все на подобии добавлении attachment[]
 
 
e_v_medvedev
Профессионал
: 806
: Москва
: 25-03-2011


23-01-2012 04:45
Тогда по такому описанию не понять в чем проблема. Это надо с отладчиком проверять.
 
  
novoselov
Новичок
: 23
: 12-10-2011


30-01-2012 23:09
если функция выглядит так
на входе массив, перебираем его заносим значения БД, и на выводим на экран переменную $row
Цитата:

  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{   
  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 '.$row);

    echo "<pre style=\"border: 1px solid #000; overflow: auto; margin: 0.5em;\">";
    echo $row;
    echo "</pre>\n";
}
  }
}


почему на экран выводятся все значения,а в бд попадает только каждое последнее из группы?

 
 
e_v_medvedev
Профессионал
: 806
: Москва
: 25-03-2011


31-01-2012 00:47
Если есть ощущение что SQL запросы не отрабатывают, выведите трассировку результатов инсертов. Возможно не добавляет так как сталкивается с нарушениями уникальности ключей. Надо попробовать погонять эти запросы в оболочке отладки SQL запросов.
 
  
novoselov
Новичок
: 23
: 12-10-2011


31-01-2012 01:29
e_v_medvedev, если можно поподробней.

не понятны следующие выражения "выведите трассировку результатов инсертов", "оболочке отладки SQL запросов".
 
 
Anton


Профессионал
: 462
: 24-02-2011


31-01-2012 01:43
В СУБД, например, в phpMyAdmin вкладка SQL и там пробуйте, что вам нужно.
 
  
e_v_medvedev
Профессионал
: 806
: Москва
: 25-03-2011


31-01-2012 14:59
Цитата:( novoselov @ 30-01-2012 21:29 Смотреть сообщение )
e_v_medvedev, если можно поподробней. 

не понятны следующие выражения "выведите трассировку результатов инсертов", "оболочке отладки SQL запросов".

Если запрос выполнен корректно, то возвращается информация о количестве добавленных записей. Если возврат пустой, то значит запись не добавлена.
Оболочки отладки это средства вроде "dbForge Studio for MySQL" или "MySQLWorkbench" для работы с базами данных и отладки SQL запросов. Ставите базу на локальной машине и через оболочку гоняете запросы, формируемые PHP скриптами. Ну или на худой конец тот же phpMyAdmin. Все просто.


Сообщение отредактировано e_v_medvedev 31-01-2012 11:06 ...
 
  
   
Всего: 2 1 2 >