Добавление нового поля ввода в форму вставки товара Opencart - PullRequest
2 голосов
/ 28 марта 2012

Мне нужно добавить поле ввода пользовательского файла на его собственную вкладку в форме вставки / добавления продукта Opencart в Opencart, чтобы загрузить CSV-файл в базу данных MySQL. Я добавил вкладку / поле в файл представления, обновил языковые файлы, но не уверен, что мне нужно делать именно в контроллере и модели для передачи данных из загруженного CSV в таблицу базы данных.

Таблица product_pins:

pin_id (AI) | pin_product_id | pin_pin_number

Данные файла csv (пример):

342353535345
345345346346
235434534634

Где я до сих пор:

Контроллер admin/controller/catalog/product.php (около строки 807):

if (isset($this->request->post['product_pins']) ) {
    $this->data['product_pins'] = is_uploaded_file($this->request->post['product_pins']);
} else {
    $this->data['product_pins'] = '';
}

Модель admin/model/catalog/product.php (вокруг строки 7):

if ( isset($this->data['product_pins']) ) {
    $handle = fopen($this->data['product_pins'], "r");
    while (($pins = fgetcsv($handle, 1000, ",")) !== false) {
        foreach ($pins as $pin) {
            $this->db->query("INSERT INTO " . DB_PREFIX . "product_pins SET pin_product_id = '" . (int)$product_id . "', pin_pin_number = '" . $this->db->escape($pin) . "'");
        }
    }
    fclose($handle);
}

Буду признателен за любую помощь.

1 Ответ

1 голос
/ 05 апреля 2013

Прежде всего - часть обработки CSV должна находиться внутри контроллера, а не в классе модели. Модели (когда речь идет о правильном MVC) должны только извлекать или устанавливать данные и передавать их или которые передаются из контроллера - это должно затем манипулировать ими и управлять ими, а затем пересылать или получать из представления внешнего интерфейса (шаблон).

Во-вторых: отправленные файлы в OpenCart присутствуют в массиве $this->request->files.

Наконец: метод is_uploaded_file() возвращает значение boolean, поэтому я не знаю, как вы могли бы проанализировать boolean и создать из него дескриптор файла.

Итак, давайте посмотрим на это ... Попробуйте код ниже.

Контроллер:

if (is_uploaded_file($this->request->files['product_pins']['tmp_name'])) {
    $handle = fopen($this->request->files['product_pins']['tmp_name'], "r");
    while (($pins = fgetcsv($handle, 50, ",")) !== false) { // If we know there is only a 10 chars PIN per line it is better to lower the expected line length to lower the memory consumption...
       $this->data['product_pins'][] = $pins; // there is only one PIN per line
    }
    fclose($handle);
} else {
   $this->data['product_pins'] = array();
}

Теперь вы (должны) добавить все ПИН-коды из CSV-файла в массив $this->data['product_pins'] - и, если вы передаете $this->data в модель, он должен содержать следующий код:

Модель:

if (!empty($this->data['product_pins'])) {
    foreach ($this->data['product_pins'] as $pin) {
        $this->db->query("INSERT INTO " . DB_PREFIX . "product_pins SET pin_product_id = '" . (int)$product_id . "', pin_pin_number = '" . $this->db->escape($pin) . "'");
    }
}

Надеюсь, это поможет ...

...