function removeChilds($elements, $id, $head = true){ foreach($elements as $key => $element){ if($element['id'] == $id && $head) { unset($elements[$key]); $head = false; } if($element['parent_id'] == $id){ $newId = $element['id']; unset($elements[$key]); $elements = removeChilds($elements, $newId, $head); } } return $elements; }
protected function menu() { switch($this->method){ case 'GET': if(empty($this->verb) && empty($this->args)){ $result = $this->db->query("select id, name, main_title, expand_level from menus"); // all menus return array("success" => 1, "items" => $result->rows); } else if (empty($this->verb) && count($this->args) == 1) { $id = htmlspecialchars(strip_tags($this->args[0])); $result = $this->db->query("select id, name, main_title, expand_level, from menus where id = '".$id."'"); // menu by id return array("success" => 1, "items" => $result->rows); } else if($this->verb == 'item' && count($this->args) == 1){ $id = htmlspecialchars(strip_tags($this->args[0])); $result = $this->db->query("select id, menu_id, item_id, item_type, title, parent_id, position, add_data, hidden from menus_data where id = '".$id."'"); // menu item by id $newResult = $result->rows; foreach($newResult as $key => $value){ $add_data = unserialize($value['add_data']); $url = isset($add_data['url']) ? str_ireplace("\\/", "/", $add_data['url']) : ''; unset($newResult[$key]['add_data']); $newResult[$key]['url'] = $url; } $newResult = array_values($newResult); return array("success" => 1, "items" => $newResult); } else if($this->verb == 'branch' && count($this->args) == 1){ $id = htmlspecialchars(strip_tags($this->args[0])); $result = $this->db->query("select id, menu_id, item_id, item_type, title, parent_id, position, add_data, hidden from menus_data where menu_id = '".$id."'"); // menu items by branch id $newResult = $result->rows; foreach($newResult as $key => $value){ $add_data = unserialize($value['add_data']); $url = isset($add_data['url']) ? $add_data['url'] : ''; unset($newResult[$key]['add_data']); $newResult[$key]['url'] = $url; } $newResult = array_values($newResult); return array("success" => 1, "items" => $newResult); } else if($this->verb == 'filter' && count($this->args) == 2){ $menuId = htmlspecialchars(strip_tags($this->args[0])); $itemId = htmlspecialchars(strip_tags($this->args[1])); $result = $this->db->query("select id, menu_id, item_id, item_type, title, parent_id, position, add_data, hidden from menus_data where menu_id = '".$menuId."'"); // menu items by branch id $newResult = $result->rows; foreach($newResult as $key => $value){ $add_data = unserialize($value['add_data']); $url = isset($add_data['url']) ? $add_data['url'] : ''; unset($newResult[$key]['add_data']); $newResult[$key]['url'] = $url; } $newResult = removeChilds($newResult, $itemId); $newResult = array_values($newResult); return array("success" => 1, "items" => $newResult); } else { return array("success" => 0, "error_message" => "BAD REQUEST"); } break; case 'POST': if(empty($this->args) && empty($this->verb)){ $data = $this->request; $result = $this->db->query("insert into menus (name, main_title, expand_level, created) VALUES ( '".$data['name']."', '".$data['main_title']."', '".$data['expand_level']."', NOW() )"); if($result->errno) return array("success" => 0, "error_message" => "INCORRECT DATA"); else { $lastId = $this->db->getLastId(); $this->log("Создано меню. Id: ".$lastId, $data['username'], $data['device']); return array("success" => 1, "insert_id" => $lastId); } } else if ($this->verb == 'item' && empty($this->args)) { $data = $this->request; $add_data_serialized = null; if($data['item_type'] === 'url'){ $add_data = array(); $add_data['url'] = $data['url']; $add_data['newpage'] = ''; $add_data_serialized = serialize($add_data); } $query = "insert into menus_data (menu_id, item_id, item_type, title, parent_id, position, add_data, hidden) VALUES ( '".$data['menu_id']."', '".$data['item_id']."', '".$data['item_type']."', '".$data['title']."', '".$data['parent_id']."', '".$data['position']."', '".$add_data_serialized."', '".$data['hidden']."' )"; $result = $this->db->query($query); if($result->errno) return array("success" => 0, "error_message" => "INCORRECT DATA"); else { $lastId = $this->db->getLastId(); $this->log("Создан пункт меню. Id: ".$lastId, $data['username'], $data['device']); return array("success" => 1, "insert_id" => $lastId); } } else { return array("success" => 0, "error_message" => "BAD REQUEST"); } break; case 'PUT': if(count($this->args) == 1 && empty($this->verb)){ $id = htmlspecialchars(strip_tags($this->args[0])); $data = $this->request; $result = $this->db->query("update menus set name='".$data['name']."', main_title='".$data['main_title']."', expand_level='".$data['expand_level']."' where id = '".$id."'"); if($result->errno) return array("success" => 0, "error_message" => "INCORRECT DATA"); else{ $this->log("Изменено меню. Id: ".$id, $data['username'], $data['device']); return array("success" => 1); } } else if ($this->verb == 'item' && count($this->args) == 1) { $id = htmlspecialchars(strip_tags($this->args[0])); $data = $this->request; $add_data_serialized = null; if($data['item_type'] === 'url'){ $add_data = array(); $add_data['url'] = $data['url']; $add_data['newpage'] = ''; $add_data_serialized = serialize($add_data); } $query = "update menus_data set menu_id='".$data['menu_id']."', item_id='".$data['item_id']."', item_type='".$data['item_type']."', title='".$data['title']."', parent_id='".$data['parent_id']."', position='".$data['position']."', add_data='".$add_data_serialized."', hidden='".$data['hidden']."' where id='".$id."'"; $result = $this->db->query($query); if($result->errno) return array("success" => 0, "error_message" => "INCORRECT DATA"); else { $this->log("Изменен пункт меню. Id: ".$id, $data['username'], $data['device']); return array("success" => 1); } } else { return array("success" => 0, "error_message" => "BAD REQUEST"); } break; case 'DELETE': if (empty($this->verb) && count($this->args) == 1) { $id = htmlspecialchars(strip_tags($this->args[0])); $result = $this->db->query("delete from menus where id = '".$id."'"); // menu by id $data = $this->request; if($this->db->countAffected() > 0){ $this->log("Удалено меню. Id: ".$id, $data['username'], $data['device']); $result = $this->db->query("delete from menus_data where menu_id = '".$id."'"); return array("success" => 1); } else { return array("success" => 0, "error_message" => "MENU NOT FOUND"); } } else if($this->verb == 'item' && count($this->args) == 1) { $id = htmlspecialchars(strip_tags($this->args[0])); $result = $this->db->query("delete from menus_data where id = '".$id."'"); // menu item by id if(!$result->errno){ $data = $this->request; $this->log("Удален пункт меню. Id: ".$id, $data['username'], $data['device']); return array("success" => 1); } else { return array("success" => 0, "error_message" => "MENU ITEM NOT FOUND"); } } else { return array("success" => 0, "error_message" => "BAD REQUEST"); } break; default: break; } }