• Объявления

    • dinox

      Закрытый раздел разработчиков   21.08.2017

      У нас на форуме существует закрытый раздел для разработчиков в котором мы обсуждаем нюансы работы на нашем форуме, в каталоге дополнений и другие моменты которые интересны в большинстве случаев только разработчикам. На данный момент существует лишь 2 условия для попадания:
      1. Наличие промодерированного дополнения в нашем каталоге  2. Отсуствие варезной деятельности 
      Если эти правила выполнены, пишите запрос @ArtemPitov на попадание в раздел разработчиков

freakonaleash

Новичок
  • Публикаций

    4
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о freakonaleash

  • Звание
    Новичок
  1. Fix305 вроде нормально объяснил =) шо? каво?версия движка; хостинг/denwer/локальный-web-сервер; установленные модули. опишите подробно: что, где и как делаете, что ожидаете получить и что получаете в итоге. желательно с описанием всех произведенных изменений по части "...поле я добавил, поместил ее в форму..." Попробую еще раз объяснить. Дело в том, что этим проектом я занимаюсь недавно, и на g[g не программировал уже больше 3 лет, на основной работе я программирую на java. Итак есть продукт, у которого есть дополнительные опции, эти опции можно задавать в пункте админки Catalog/Product Options (прошу прощения, но не знаю это дополнительная опция или стандартная, но в папке modules я подобного не увидел). В этом разделе я создал новый product option, добавил его к продуктам по умолчание, но эта опция не активировалась для уже существующих продуктов (увидел по состоянию таблицы в БД). Не разобравшись с этим я решил сделать напрямую и столкнулся со следующей проблемой. POST запрос оказался пустым, а вместо этого выполнялся такой код: foreach ($this->cart->getProducts() as $result) { $option_data = array(); print_r($result); foreach ($result['option'] as $option) { $option_data[] = array( 'name' => $option['name'], 'value' => $option['value'] ); } if ($result['image']) { $image = $result['image']; } else { $image = 'no_image.jpg'; } $this->data['products'][] = array( 'key' => $result['key'], 'product_id' => $result['product_id'], 'name' => $result['name'], 'model' => $result['model'], 'thumb' => image_resize($image, $this->config->get('config_image_related_width'), $this->config->get('config_image_related_height')), 'option' => $option_data, 'quantity' => $result['quantity'], 'stock' => $result['stock'], 'price' => $this->currency->format($this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax'))), 'total' => $this->currency->format($this->tax->calculate($result['total'], $result['tax_class_id'], $this->config->get('config_tax'))), 'href' => $this->model_tool_seo_url->rewrite($this->url->http('product/product&product_id=' . $result['product_id'])) ); } После которого, как я понимаю, содержимое корзины отображалось на следующей странице (страница корзины). Вот код метода getProducts() уже другого класса cart: public function getProducts() { $product_data = array(); foreach ($this->session->data['cart'] as $key => $value) { $array = explode(':', $key); $product_id = $array[0]; $quantity = $value; if (isset($array[1])) { $options = explode('.', $array[1]); } else { $options = array(); } $product_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) WHERE p.product_id = '" . (int)$product_id . "' AND pd.language_id = '" . (int)$this->language->getId() . "' AND p.date_available <= NOW() AND p.status = '1'"); if ($product_query->num_rows) { // CYL SPH add by webaccent if (isset($this->session->data["prescription"][$product_id]["total_cyl_sph_add"])){ $total_add = $this->session->data["prescription"][$product_id]["total_cyl_sph_add"]; } else { $total_add = 0; } // END CYL SPH add by webaccent $option_price = 0; $option_data = array(); foreach ($options as $product_option_value_id) { $option_value_query = $this->db->query("SELECT pov.product_option_id, povd.name, pov.price, pov.prefix FROM " . DB_PREFIX . "product_option_value pov LEFT JOIN " . DB_PREFIX . "product_option_value_description povd ON (pov.product_option_value_id = povd.product_option_value_id) WHERE pov.product_option_value_id = '" . (int)$product_option_value_id . "' AND pov.product_id = '" . (int)$product_id . "' AND povd.language_id = '" . (int)$this->language->getId() . "' ORDER BY pov.sort_order"); if ($option_value_query->num_rows) { $option_query = $this->db->query("SELECT pod.name FROM " . DB_PREFIX . "product_option po LEFT JOIN " . DB_PREFIX . "product_option_description pod ON (po.product_option_id = pod.product_option_id) WHERE po.product_option_id = '" . (int)$option_value_query->row['product_option_id'] . "' AND po.product_id = '" . (int)$product_id . "' AND pod.language_id = '" . (int)$this->language->getId() . "' ORDER BY po.sort_order"); if ($option_value_query->row['prefix'] == '+') { $option_price = $option_price + $option_value_query->row['price']; } elseif ($option_value_query->row['prefix'] == '-') { $option_price = $option_price - $option_value_query->row['price']; } $option_data[] = array( 'product_option_value_id' => $product_option_value_id, 'name' => $option_query->row['name'], 'value' => $option_value_query->row['name'], 'prefix' => $option_value_query->row['prefix'], 'price' => $option_value_query->row['price'] ); // global options by webaccent } else { //echo($product_option_value_id." "); $option_value_query = $this->db->query("SELECT gpov.global_option_id, gpovd.name, gpov.price, gpov.prefix FROM " . DB_PREFIX . "global_product_option_value gpov LEFT JOIN " . DB_PREFIX . "global_product_option_value_description gpovd ON (gpov.global_option_value_id = gpovd.global_option_value_id) WHERE gpov.global_option_value_id = '" . (int)$product_option_value_id . "' AND gpovd.language_id = '" . (int)$this->language->getId() . "' ORDER BY gpov.sort_order"); if ($option_value_query->num_rows) { $option_query = $this->db->query("SELECT gpod.name FROM " . DB_PREFIX . "global_product_option gpo LEFT JOIN " . DB_PREFIX . "global_product_option_description gpod ON (gpo.global_option_id = gpod.global_option_id) WHERE gpo.global_option_id = '" . (int)$option_value_query->row['global_option_id'] . "' AND gpod.language_id = '" . (int)$this->language->getId() . "' ORDER BY gpo.sort_order"); // !!!!! доделать на случай checkbox - множественные значения if ($option_value_query->row['prefix'] == '+') { $option_price = $option_price + $option_value_query->row['price'] + ((int)$product_option_value_id!==77?$total_add:0); } elseif ($option_value_query->row['prefix'] == '-') { $option_price = $option_price - $option_value_query->row['price'] + ((int)$product_option_value_id!==77?$total_add:0); } $option_data[] = array( 'product_option_value_id' => $product_option_value_id, 'name' => $option_query->row['name'], 'value' => $option_value_query->row['name'], 'prefix' => $option_value_query->row['prefix'], 'price' => $option_value_query->row['price'] ); } } // END global options by webaccent } if ($this->customer->isLogged()) { $customer_group_id = $this->customer->getCustomerGroupId(); } else { $customer_group_id = $this->config->get('config_customer_group_id'); } $product_discount_query = $this->db->query("SELECT price FROM " . DB_PREFIX . "product_discount WHERE product_id = '" . (int)$product_id . "' AND customer_group_id = '" . (int)$customer_group_id . "' AND quantity <= '" . (int)$quantity . "' AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY quantity DESC, priority ASC, price ASC LIMIT 1"); if ($product_discount_query->num_rows) { $price = $product_discount_query->row['price']; } else { $product_special_query = $this->db->query("SELECT price FROM " . DB_PREFIX . "product_special WHERE product_id = '" . (int)$product_id . "' AND customer_group_id = '" . (int)$customer_group_id . "' AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY priority ASC, price ASC LIMIT 1"); if ($product_special_query->num_rows) { $price = $product_special_query->row['price']; } else { $price = $product_query->row['price']; } } $download_data = array(); $download_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_to_download p2d LEFT JOIN " . DB_PREFIX . "download d ON (p2d.download_id = d.download_id) LEFT JOIN " . DB_PREFIX . "download_description dd ON (d.download_id = dd.download_id) WHERE p2d.product_id = '" . (int)$product_id . "' AND dd.language_id = '" . (int)$this->language->getId() . "'"); foreach ($download_query->rows as $download) { $download_data[] = array( 'download_id' => $download['download_id'], 'name' => $download['name'], 'filename' => $download['filename'], 'mask' => $download['mask'], 'remaining' => $download['remaining'] ); } $product_data[$key] = array( 'key' => $key, 'product_id' => $product_query->row['product_id'], 'name' => $product_query->row['name'], 'model' => $product_query->row['model'], 'shipping' => $product_query->row['shipping'], 'image' => $product_query->row['image'], 'option' => $option_data, 'download' => $download_data, 'quantity' => $quantity, 'stock' => ($quantity <= $product_query->row['quantity']), 'price' => ($price + $option_price), 'total' => ($price + $option_price) * $quantity, 'tax_class_id' => $product_query->row['tax_class_id'], 'weight' => $product_query->row['weight'], 'weight_class_id' => $product_query->row['weight_class_id'], 'length' => $product_query->row['length'], 'width' => $product_query->row['width'], 'height' => $product_query->row['height'], 'measurement_id' => $product_query->row['measurement_class_id'] ); } else { $this->remove($key); } } return $product_data; } Не уверен что он сильно поможет, но будем надеяться Вы сможете уловить идею. И вот собственно вопрос, каким образом такое возможно? Стандартная ли это фича фреймворка или предыдущие разработчики данного сайта что-то намудрили?
  2. Большое спасибо за пояснение, на самом деле я это увидел, но массив пост почему-то пуст! :roll: А данные в корзину все таки попадают, ума не приложу как это происходит. Разве что как-то через объект сессии cart, который я нашел в проекте. Может будут какие-то идеи? Если надо, могу выложить код.
  3. Спасибо за наводку. Принцип МВЦ я знаю, но хотелось бы прочитать оименно о принципе передачи информафии из формы в контроллер, как по мне это не очень прозрачно.
  4. Добрый всем день, недавно столкнулся с этим замечательным фреймворком и возникла у меня проблема. При выборе товара мне на форме дополнительных опций о товаре нужно добавить одно поле, поле я добавил, поместил ее в форму, но не могу понять как opencart обрабатывает форму. На хорме в поле action написано checkout/cart, я нашел такой файл, посмотрел в него и увидел такой код class ControllerCheckoutCart extends Controller { public function index() { if ($this->request->server['REQUEST_METHOD'] == 'POST') { if (isset($this->request->post['quantity'])) { .... НО похоже эти строки не выполняются, а продукт в корзину все таки попадает! Нашел еще один файл с именем cart, который судя по всему представляет объект cart в сессии, но метод add в нем похоже тоже не вызывается. Был бы Вам очень признателен если бы кто-то мне наглядно рассказал о механизме передачи данных из формы на сервер. Или хотя бы рассказал как подключать еще одно product option ко всем существующим продуктам, так как я его добавил в соответствующем пункте меню в админке, а в БД к продукту оно не привязалось. Буду признателен за любую помощь.