Collections functions
Encryption functions
General functions
Theme permission functions
Resource functions

copy_resource()

Description

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.

Parameters

ColumnTypeDefaultDescription
$from int ID of resource
$resource_type mixed -1 ID of resource type

Return

void

Location

include/resource_functions.php lines 3022 to 3145

Definition

 
function copy_resource($from,$resource_type=-1)
    {
    
debug("copy_resource: copy_resource(\$from = {$from}, \$resource_type = {$resource_type})");
    global 
$userref;
    global 
$always_record_resource_creator$upload_then_edit;
    
    
# Check that the resource exists
    
if (sql_value("select count(*) value from resource where ref='"escape_check($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="";
    
$archive=sql_value("select archive value from resource where ref='"escape_check($from) . "'",0);
    
    if (
$archive == ""// Needed if user does not have a user template 
        
{
        
$archive =0;
        }
    
    
# Determine if the user has access to the source archive status
    
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='" escape_check($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.
    
if ((!checkperm("c")) || $archive<|| (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
    
copyResourceDataValues($from,$to);
    
    
# Copy nodes
    
copy_resource_nodes($from,$to);
    
    
# Copy relationships
    
copyRelatedResources($from$to);

    
# Copy access
    
sql_query("insert into resource_custom_access(resource,usergroup,access) select '$to',usergroup,access from resource_custom_access where resource='"escape_check($from) . "'");

    
// Set any resource defaults
    // Expected behaviour: set resource defaults only on upload and when
    // there is no edit access OR no existing value
    
if($from || $upload_then_edit)
        {
        
$fields_to_set_resource_defaults = array();
        
$fields_data                     get_resource_field_data($fromfalsefalse);

        
// Set resource defaults only to fields
        
foreach($fields_data as $field_data)
            {
            if(
'' != trim($field_data['value']) && !($upload_then_edit && $from 0))
                {
                continue;
                }

            
$fields_to_set_resource_defaults[] = $field_data['ref'];
            }

        if(
count($fields_to_set_resource_defaults))
            {
            
set_resource_defaults($to$fields_to_set_resource_defaults);
            }
        }

    
// Autocomplete any blank fields without overwriting any existing metadata
    
autocomplete_blank_fields($tofalse);

    
# 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==-&& !$send_collection_to_admin)
        {
        
notify_user_contributed_submitted(array($to));
        }
    
    
# Log this            
    
daily_stat("Create resource",$to);
    
resource_log($to,LOG_CODE_CREATED,0);

    
hook("afternewresource""", array($to));
    
    return 
$to;
    }

This article was last updated 15th July 2020 03:35 Europe/London time based on the source file dated 13th July 2020 14:40 Europe/London time.