/** * Admin action. * Create or edit selected product * * @var int $id Product */ public function editAction() { if (!Zend_Auth::getInstance()->hasIdentity()) { throw new Zend_Exception("Access Forbidden", 403); } $parent_id = $this->getRequest()->getParam("parent_id"); if ($parent_id) { // отдельный action для подтоваров $this->forward("subedit"); return; } $product_id = $this->getRequest()->getParam("id"); $productsModel = new Model_DbTable_Products(); // признаки вида операции и вида товара $newRecord = $product_id == null; $this->view->newRecord = $newRecord; if ($product_id) { $product = $productsModel->find($product_id)->current(); } // новый продукт if ($newRecord) { $product = $productsModel->createRow(); } $editForm = Model_Static_Loader::loadForm("product"); if ($this->getRequest()->isPost()) { // отправка формы if ($editForm->isValid($_POST)) { $file = $editForm->image->getFileInfo(); $ext = pathinfo($file['image']['name'], PATHINFO_EXTENSION); $name = pathinfo($file['image']['name'], PATHINFO_FILENAME); $newName = time() . '_' . $name . '.' . $ext; $editForm->image->addFilter('Rename', APPLICATION_ROOT . "/files/images/product/" . $newName); $editForm->image->receive(); // here save data // product first $values = $editForm->getValues(); $newImages = isset($_FILES["images"]) ? $_FILES["images"] : array(); $images = $this->getRequest()->getParam("images", array()); if (count($newImages) > 0) { foreach ($newImages['name'] as $i => $image) { if ($image) { $name = date("ymd-") . $image; $images[] = $name; move_uploaded_file($_FILES["images"]["tmp_name"][$i], APPLICATION_ROOT . "/files/images/product/{$name}"); } } } $product->a_images = $images; if (!$values["image"]) { unset($values["image"]); } foreach ($values as $name => $value) { if (isset($product->{$name})) { $product->{$name} = $value; } } $product->mod_date = date("Y-m-d H:i:s"); if (!$product->add_date) { $product->add_date = $product->mod_date; } $product->save(); } // перезаписываем отношения категорий $categories = $this->getRequest()->getParam("categories"); $xrefModel = new Model_DbTable_CategoryXref(); $xrefModel->delete("product_id = " . $product->id); if ($categories) { foreach ($categories as $category) { try { $xref = $xrefModel->createRow(array("product_id" => $product->id, "category_id" => $category)); $xref->save(); } catch (Exception $e) { continue; } } } // save productParams $newParams = $this->getRequest()->getParam("productparams"); if ($newParams) { $newParams = array_values($newParams); } else { $newParams = array(); } $productParams = new Model_DbTable_ProductParams(); $oldParams = $product->getParams(); $pCount = count($newParams) > count($oldParams) ? count($newParams) : count($oldParams); for ($i = 0; $i < $pCount; $i++) { if (isset($newParams[$i])) { $newParam = (object) $newParams[$i]; try { $oldParam = $oldParams->getRow($i); } catch (Zend_Exception $e) { $oldParam = $productParams->createRow(array('product_id' => $product->id)); } $oldParam->name = $newParam->name; $oldParam->value = $newParam->value; $oldParam->order = $newParam->order; $oldParam->save(); } else { $oldParam = $oldParams->getRow($i); $oldParam->delete(); } } $this->redirect("/catalog/products/view/category/" . $this->getRequest()->getParam("category") . "/id/" . $product->id); } $editForm->setDefaults($product->toArray()); $this->view->newproduct = $editForm; $this->view->category = $this->getRequest()->getParam("category"); if (!$newRecord) { // редактируем основной продукт $this->view->row = $product; $this->view->productParams = $product->getParams(); $select = $productsModel->select()->order('order ASC'); $this->view->subProducts = $product->findDependentRowset("Model_DbTable_Subproducts", 'SubproductsRel', $select); } else { // Новый продукт $this->view->row = $productsModel->createRow(); $this->view->productParams = array(); $this->view->subProducts = array(); } }
public function saveNewParams($newParams) { $oldParams = $this->getParamsValues(); $db = $this->getTable()->getAdapter(); // проходим по массиву новых параметров, апдейтим существующие, с нулевым param_id - добавляем. for ($i = 0; $i < count($newParams); $i++) { if ($newParams[$i]["param_id"] != "") { // апдейт значения параметра // для начала надо проверить существование значения параметра (может быть это новый подпродукт) // если можно, заменить это на более зендовое $result = $db->fetchRow("SELECT * FROM subproduct_params_values WHERE param_id = " . $newParams[$i]["param_id"] . " AND subproduct_id = " . $this->id); if ($result) { $data = array('value' => $newParams[$i]["value"]); $where = array(); $where[] = "param_id = " . $newParams[$i]["param_id"]; $where[] = "subproduct_id = " . $this->id; $db->update("subproduct_params_values", $data, $where); } else { // параметр для нового подпродукта $data = array('subproduct_id' => $this->id, 'param_id' => $newParams[$i]["param_id"], 'value' => $newParams[$i]["value"]); $db->insert("subproduct_params_values", $data); } // апдейт параметра (наименование и порядок) $data = array('name' => $newParams[$i]["name"], 'order' => $newParams[$i]["order"]); $where = array(); $where[] = "id = " . $newParams[$i]["param_id"]; $db->update("subproduct_params", $data, $where); } else { if ($this->parent_id) { // новый параметр $data = array('product_id' => $this->parent_id, 'name' => $newParams[$i]["name"], 'order' => $newParams[$i]["order"]); $db->insert("subproduct_params", $data); $newid = $db->lastInsertId(); if ($newid) { // запилить этот параметр для всех подпродуктов товара $productsModel = new Model_DbTable_Products(); $parentProduct = $productsModel->find($this->parent_id)->current(); if ($parentProduct) { $select = $productsModel->select()->order('order ASC'); $allSubproducts = $parentProduct->findDependentRowset("Model_DbTable_Subproducts", 'SubproductsRel', $select); foreach ($allSubproducts as $currentSubproduct) { $data = array('subproduct_id' => $currentSubproduct->id, 'param_id' => $newid, 'value' => $this->id == $currentSubproduct->id ? $newParams[$i]["value"] : 0); $db->insert("subproduct_params_values", $data); } } } } } } // теперь проходим по массиву старых параметров и смотрим какие надо удалить for ($i = 0; $i < count($oldParams); $i++) { $found = false; for ($j = 0; $j < count($newParams); $j++) { if ($oldParams[$i]->param_id == $newParams[$j]["param_id"]) { $found = true; } } if (!$found) { // удалить параметр с индексом $i $where = array(); $where[] = "param_id = " . $oldParams[$i]->param_id; $db->delete("subproduct_params_values", $where); $where = array(); $where[] = "id = " . $oldParams[$i]->param_id; $db->delete("subproduct_params", $where); } } }