/**
  * 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);
         }
     }
 }