Перейти к содержанию
freakonaleash

механизм сохранения полей формы в opencart

Рекомендуемые сообщения

Добрый всем день, недавно столкнулся с этим замечательным фреймворком и возникла у меня проблема. При выборе товара мне на форме дополнительных опций о товаре нужно добавить одно поле, поле я добавил, поместил ее в форму, но не могу понять как 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 ко всем существующим продуктам, так как я его добавил в соответствующем пункте меню в админке, а в БД к продукту оно не привязалось. Буду признателен за любую помощь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за наводку. Принцип МВЦ я знаю, но хотелось бы прочитать оименно о принципе передачи информафии из формы в контроллер, как по мне это не очень прозрачно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

очень даже прозрачно.

Любая форма (почти любая), на любой странице, как правило, отправляет данные на саму себя, т.е. action="адрес страницы на которой находитесь"

в каждом контроллере где обрабатывается форма есть строчка вида

if (($this->request->server['REQUEST_METHOD'] == 'POST') && ($this->validate())) {
внутри которой и весь массив post, как правило передается в модель, например так

$post = $this->request->post;
$this->model_sale_sale_by_quantity->updateSetting($post);
ну дальше что происходит с данными смотрите в модели

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

freakonaleash, насчет "checkout/cart" - jQuery и AJAX. данные передаются через JavaScript.

...если бы кто-то мне наглядно рассказал о механизме передачи данных из формы на сервер...

Fix305 вроде нормально объяснил =)

При выборе товара мне на форме дополнительных опций о товаре нужно добавить одно поле, поле я добавил, поместил ее в форму, но не могу понять как opencart обрабатывает форму.

...

Или хотя бы рассказал как подключать еще одно product option ко всем существующим продуктам, так как я его добавил в соответствующем пункте меню в админке, а в БД к продукту оно не привязалось.

шо? каво?

версия движка;

хостинг/denwer/локальный-web-сервер;

установленные модули.

опишите подробно: что, где и как делаете, что ожидаете получить и что получаете в итоге.

желательно с описанием всех произведенных изменений по части "...поле я добавил, поместил ее в форму..."

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Большое спасибо за пояснение, на самом деле я это увидел, но массив пост почему-то пуст! :roll: А данные в корзину все таки попадают, ума не приложу как это происходит. Разве что как-то через объект сессии cart, который я нашел в проекте. Может будут какие-то идеи? Если надо, могу выложить код.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

freakonaleash, насчет "checkout/cart" - jQuery и AJAX. данные передаются через JavaScript.

...если бы кто-то мне наглядно рассказал о механизме передачи данных из формы на сервер...

Fix305 вроде нормально объяснил =)

При выборе товара мне на форме дополнительных опций о товаре нужно добавить одно поле, поле я добавил, поместил ее в форму, но не могу понять как opencart обрабатывает форму.

...

Или хотя бы рассказал как подключать еще одно product option ко всем существующим продуктам, так как я его добавил в соответствующем пункте меню в админке, а в БД к продукту оно не привязалось.

шо? каво?

версия движка;

хостинг/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;
  	}
Не уверен что он сильно поможет, но будем надеяться Вы сможете уловить идею. И вот собственно вопрос, каким образом такое возможно? Стандартная ли это фича фреймворка или предыдущие разработчики данного сайта что-то намудрили?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...Итак есть продукт, у которого есть дополнительные опции, эти опции можно задавать в пункте админки Catalog/Product Options (прошу прощения, но не знаю это дополнительная опция или стандартная, но в папке modules я подобного не увидел)...

в стандартной поставке такого пункта меню в админке нет.

есть только: Categories, Products, Manufacturers, Downloads, Reviews, Information.

...POST запрос оказался пустым, а вместо этого выполнялся такой код:

foreach ($this->cart->getProducts() as $result) {...
...После которого, как я понимаю, содержимое корзины отображалось на следующей странице (страница корзины)...
только были в админке и уже (оЧудо?! О_О ) копаемся в корзине :roll:

как?! зачем? почему?

ИМХО на данном этапе: либо вы что-то не договариваете, либо "...предыдущие разработчики данного сайта что-то намудрили..." :)

...Вот код метода getProducts() уже другого класса cart:...

это уже ближе, но здесь получение продуктов, и никаких (если не проглядел) намеков на обновление каких-либо параметров.

давайте еще раз с самого начала:

дайте код формы из админки, через которую вы добавляете "product options".

а лучше - весь исходный код страницы, на которой эта форма - вдруг данные уходят через AJAX (это в ЛС присылайте).

будем разбираться, куда там уходят данные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×