function copy_resource($from,$resource_type=-1) { # Create a new resource, copying all data from the resource with reference $from. # Note this copies only the data and not any attached file. It's very unlikely the # same file would be in the system twice, however users may want to clone an existing resource # to avoid reentering data if the resource is very similar. # If $resource_type if specified then the resource type for the new resource will be set to $resource_type # rather than simply copied from the $from resource. # Check that the resource exists if (sql_value("select count(*) value from resource where ref='$from'",0)==0) {return false;} # copy joined fields to the resource column $joins=get_resource_table_joins(); $joins_sql=""; foreach ($joins as $join){ $joins_sql.=",field$join "; } $add=""; # Work out the archive status $archive=sql_value("select archive value from resource where ref='$from'",0); if (!checkperm("e" . $archive)) { # Find the right permission mode to use for ($n=-2;$n<3;$n++) { if (checkperm("e" . $n)) {$archive=$n;break;} } } # First copy the resources row sql_query("insert into resource($add resource_type,creation_date,rating,archive,access,created_by $joins_sql) select $add" . (($resource_type==-1)?"resource_type":("'" . $resource_type . "'")) . ",now(),rating,'" . $archive . "',access,created_by $joins_sql from resource where ref='$from';"); $to=sql_insert_id(); # Copying a resource of the 'pending review' state? Notify, if configured. $archive=sql_value("select archive value from resource where ref='$from'",0); if ($archive==-1) { notify_user_contributed_submitted(array($to)); } # Set that this resource was created by this user. # This needs to be done if either: # 1) The user does not have direct 'resource create' permissions and is therefore contributing using My Contributions directly into the active state # 2) The user is contributiting via My Contributions to the standard User Contributed pre-active states. global $userref; global $always_record_resource_creator; if ((!checkperm("c")) || $archive<0 || (isset($always_record_resource_creator) && $always_record_resource_creator)) { # Update the user record sql_query("update resource set created_by='$userref' where ref='$to'"); # Also add the user's username and full name to the keywords index so the resource is searchable using this name. global $username,$userfullname; add_keyword_mappings($to,$username . " " . $userfullname,-1); } # Now copy all data sql_query("insert into resource_data(resource,resource_type_field,value) select '$to',rd.resource_type_field,rd.value from resource_data rd join resource r on rd.resource=r.ref join resource_type_field rtf on rd.resource_type_field=rtf.ref and (rtf.resource_type=r.resource_type or rtf.resource_type=999 or rtf.resource_type=0) where rd.resource='$from'"); # Copy relationships sql_query("insert into resource_related(resource,related) select '$to',related from resource_related where resource='$from'"); # Copy access sql_query("insert into resource_custom_access(resource,usergroup,access) select '$to',usergroup,access from resource_custom_access where resource='$from'"); # Set any resource defaults set_resource_defaults($to); # Reindex the resource so the resource_keyword entries are created reindex_resource($to); # Log this daily_stat("Create resource",$to); resource_log($to,'c',0); hook("afternewresource", "", array($to)); return $to; }
function copy_resource($from, $resource_type = -1) { # Create a new resource, copying all data from the resource with reference $from. # Note this copies only the data and not any attached file. It's very unlikely the # same file would be in the system twice, however users may want to clone an existing resource # to avoid reentering data if the resource is very similar. # If $resource_type if specified then the resource type for the new resource will be set to $resource_type # rather than simply copied from the $from resource. # Check that the resource exists if (sql_value("select count(*) value from resource where ref='{$from}'", 0) == 0) { return false; } # copy joined fields to the resource column $joins = get_resource_table_joins(); // Filter the joined columns so we only have the ones relevant to this resource type $query = sprintf(' SELECT rtf.ref AS value FROM resource_type_field AS rtf INNER JOIN resource AS r ON (rtf.resource_type != r.resource_type AND rtf.resource_type != 0) WHERE r.ref = "%s"; ', $from); $irrelevant_rtype_fields = sql_array($query); $irrelevant_rtype_fields = array_values(array_intersect($joins, $irrelevant_rtype_fields)); $filtered_joins = array_values(array_diff($joins, $irrelevant_rtype_fields)); $joins_sql = ""; foreach ($filtered_joins as $join) { $joins_sql .= ",field{$join} "; } $add = ""; # Determine if the user has access to the template archive status $archive = sql_value("select archive value from resource where ref='{$from}'", 0); if (!checkperm("e" . $archive)) { # Find the right permission mode to use for ($n = -2; $n < 3; $n++) { if (checkperm("e" . $n)) { $archive = $n; break; } } } # First copy the resources row sql_query("insert into resource({$add} resource_type,creation_date,rating,archive,access,created_by {$joins_sql}) select {$add}" . ($resource_type == -1 ? "resource_type" : "'" . $resource_type . "'") . ",now(),rating,'" . $archive . "',access,created_by {$joins_sql} from resource where ref='{$from}';"); $to = sql_insert_id(); # Set that this resource was created by this user. # This needs to be done if either: # 1) The user does not have direct 'resource create' permissions and is therefore contributing using My Contributions directly into the active state # 2) The user is contributiting via My Contributions to the standard User Contributed pre-active states. global $userref; global $always_record_resource_creator; if (!checkperm("c") || $archive < 0 || isset($always_record_resource_creator) && $always_record_resource_creator) { # Update the user record sql_query("update resource set created_by='{$userref}' where ref='{$to}'"); # Also add the user's username and full name to the keywords index so the resource is searchable using this name. global $username, $userfullname; add_keyword_mappings($to, $username . " " . $userfullname, -1); } # Now copy all data sql_query("insert into resource_data(resource,resource_type_field,value) select '{$to}',rd.resource_type_field,rd.value from resource_data rd join resource r on rd.resource=r.ref join resource_type_field rtf on rd.resource_type_field=rtf.ref and (rtf.resource_type=r.resource_type or rtf.resource_type=999 or rtf.resource_type=0) where rd.resource='{$from}'"); # Copy relationships sql_query("insert into resource_related(resource,related) select '{$to}',related from resource_related where resource='{$from}'"); # Copy access sql_query("insert into resource_custom_access(resource,usergroup,access) select '{$to}',usergroup,access from resource_custom_access where resource='{$from}'"); # Set any resource defaults set_resource_defaults($to); # Autocomplete any blank fields. autocomplete_blank_fields($to); # Reindex the resource so the resource_keyword entries are created reindex_resource($to); # Copying a resource of the 'pending review' state? Notify, if configured. global $send_collection_to_admin; if ($archive == -1 && !$send_collection_to_admin) { notify_user_contributed_submitted(array($to)); } # Log this daily_stat("Create resource", $to); resource_log($to, 'c', 0); hook("afternewresource", "", array($to)); return $to; }