/** * Mark asset(s) for copy or paste (ccp = cut-copy-paste) * - exit on failure * * @param int|string $folder Source folder ID or string (/Workspace/.../) * @param string $view Source view name (e.g. display, details) * @param array $items Array of items (e.g. [101,102,103]) * @param string $target Target folder ID or string (/Workspace/.../) * @param string $operation cut or copy * @return int Source folder ID */ static function asset_ccp($folder, $view, $items, $target, $operation) { if ($operation == "cut") { self::_require_access($folder, "write"); } else { // copy self::_require_access($folder, "read"); } self::_require_access($target, "write"); $ccp_data = asset_ccp::cutcopy_items($folder, $view, $items, $operation); if ($ccp_data) { $result = asset_ccp::paste_items($target, $ccp_data); if ($result != "") { exit($result); } } return $folder; }
public static function copy($source, $folder) { if (empty($source) or empty($folder)) { return false; } if (!is_numeric($folder) and $pos = strpos($folder, ":")) { $handler = "lib_" . substr($folder, 0, $pos); if (method_exists($handler, "copy_folder")) { return call_user_func(array($handler, "copy_folder"), $folder); } return false; } db_lock_tree(true); $source = db_select_first("simple_sys_tree", array("id", "lft", "rgt", "ftitle", "parent"), "id=@id@", "", array("id" => $source)); $target = db_select_first("simple_sys_tree", array("id", "lft", "rgt"), "id=@id@", "", array("id" => $folder)); $success = false; if (!empty($source["lft"]) and !empty($target["lft"]) and !($source["lft"] <= $target["lft"] and $source["rgt"] >= $target["rgt"])) { $source_folders = db_select("simple_sys_tree", "*", "lft between @left@ and @right@", "lft asc", "", array("left" => $source["lft"], "right" => $source["rgt"])); $parent_mapping = array($source["parent"] => $target["id"]); foreach ($source_folders as $source_folder) { $data = array("noduplicate" => true, "nolock" => true, "mountpoint" => $source_folder["fmountpoint"], "rights" => array_intersect_key($source_folder, self::$rights)); if (!isset($parent_mapping[$source_folder["parent"]])) { continue; } $step = 1; $parent = ""; $val = $source_folder["ftitle"]; while ($step < 100 and empty($parent)) { $step++; if ($parent_mapping[$source_folder["parent"]] == $folder) { $first = true; } else { $first = false; } $parent = self::create($val, $source_folder["ftype"], $source_folder["fdescription"], $parent_mapping[$source_folder["parent"]], $first, $data); $val = $source_folder["ftitle"] . "_" . $step; } if (!empty($parent)) { $parent_mapping[$source_folder["id"]] = $parent; } } foreach ($source_folders as $source_folder) { if (!isset($parent_mapping[$source_folder["id"]])) { continue; } $ccp_data = asset_ccp::cutcopy_items($source_folder["id"], "display", array(), "copy"); if ($ccp_data) { asset_ccp::paste_items($parent_mapping[$source_folder["id"]], $ccp_data); } } db_update_subfolder_count($target["id"]); $success = true; } db_lock_tree(false); return $success; }