public static function cascadeCreate($names, $separator = " > ")
 {
     $array = explode($separator, $names);
     foreach ($array as $index => $name) {
         $array[$index] = trim($name);
     }
     $producttypearray = array();
     //do first one (special treatment for root)
     $producttype = Fetcher::fetchOne("Producttype", array('name' => '"' . $array[0] . '"'));
     $parent_id = $producttype->getId();
     $producttypearray[] = $producttype;
     foreach ($array as $index => $name) {
         //skip first one
         if ($index == 0) {
             continue;
         }
         //fetch next producttype based on previous
         $producttype = Doctrine_Query::create()->from('Producttype p')->where('p.name="' . $name . '"')->andWhere('p.parent_id="' . $parent_id . '"')->fetchOne();
         //one of the nodes not found
         //if null, create
         if (!$producttype) {
             //create
             $producttype = ProducttypeTable::createOne(array('name' => $name, 'parent_id' => $parent_id, 'priority' => 2));
         }
         //prepare for next round
         $parent_id = $producttype->getId();
         //add to array, whether fetched object or null
         $producttypearray[] = $producttype;
     }
     return $producttypearray;
 }
 public function save()
 {
     foreach ($this->items as $index => $item) {
         //if exists, update
         if ($item["object"]) {
             $item["object"]->update($item);
             //$item is of type array['category1'=>...,]
         } else {
             //create new producttype plus parents
             $heirarchy = ProducttypeTable::cascadeCreate($item["name"]);
             //update details for last node
             $item["object"] = $heirarchy[count($producttypes) - 1];
             $item["object"]->update(array('description' => $item["description"], 'category1' => $item["category1"], 'category2' => $item["category2"], 'category3' => $item["category3"], 'category4' => $item["category4"], 'category5' => $item["category5"], 'category6' => $item["category6"], 'category7' => $item["category7"], 'category8' => $item["category8"], 'category9' => $item["category9"], 'category10' => $item["category10"]));
         }
     }
 }
 public function executeProductmassoper(sfWebRequest $request)
 {
     $producttype_id = $request->getParameter("producttype_id");
     $producttype = ProducttypeTable::fetch($producttype_id);
     $prefix = $request->getParameter("prefix");
     $suffix = $request->getParameter("suffix");
     $replace = $request->getParameter("replace");
     $with = $request->getParameter("with");
     $maxsellprices = $request->getParameter("maxsellprices");
     $maxbuyprices = $request->getParameter("maxbuyprices");
     $minsellprices = $request->getParameter("minsellprices");
     $minbuyprices = $request->getParameter("minbuyprices");
     $autocalcsellprices = $request->getParameter("autocalcsellprices");
     $autocalcbuyprices = $request->getParameter("autocalcbuyprices");
     $ids = $request->getParameter("product_ids");
     $products = $producttype->getProductsByIds($ids);
     //if no checked products, do nothing
     if (count($ids)) {
         if ($request->getParameter("submit") == "Merge") {
             $this->redirect("producttype/merge?producttype_id=" . $producttype_id . "&product_id=" . $request->getParameter("input") . "&duplicate_ids=" . implode(",", $ids));
             //$this->mainproduct=ProductTable::fetch($request->getParameter("input"));
             //$this->products=$products;
             //				$this->merge($mainproduct, $product);
             //
         } else {
             if ($request->getParameter("submit") == "Save") {
                 foreach ($products as $product) {
                     if ($maxsellprices[$product->getId()] != "") {
                         $product->setMaxsellprice($maxsellprices[$product->getId()]);
                         $product->setAutocalcsellprice(0);
                     }
                     if ($minsellprices[$product->getId()] != "") {
                         $product->setMinsellprice($minsellprices[$product->getId()]);
                         $product->setAutocalcsellprice(0);
                     }
                     if ($maxbuyprices[$product->getId()] != "") {
                         $product->setMaxbuyprice($maxbuyprices[$product->getId()]);
                         $product->setAutocalcbuyprice(0);
                     }
                     if ($minbuyprices[$product->getId()] != "") {
                         $product->setMinbuyprice($minbuyprices[$product->getId()]);
                         $product->setAutocalcbuyprice(0);
                     }
                     $product->save();
                 }
             } else {
                 if ($request->getParameter("submit") == "Monitor") {
                     foreach ($products as $product) {
                         $product->setMonitored(1);
                         $product->save();
                     }
                 } else {
                     if ($request->getParameter("submit") == "Unmonitor") {
                         foreach ($products as $product) {
                             $product->setMonitored(0);
                             $product->save();
                         }
                     } else {
                         foreach ($products as $product) {
                             $product->setName($prefix . str_replace($replace, $with, $product->getName()) . $suffix);
                             //$product->setDescription($product->getName());
                             $product->save();
                         }
                     }
                 }
             }
         }
     }
     //$parent->calc();
     $this->redirect($request->getReferer());
 }