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