autocomplete_blank_fields()

Description

Fill in any blank fields for the resource.

IMPORTANT: Auto completing blank fields with inactive options should be allowed (possibly a system misconfiguration).
This function will NOT exclude inactive nodes because, for required fields, you might end up having no value
after processing the field.

For example:
- when creating a resource, autocomplete_blank_fields() should always be triggered regardless if user has data in its user template.
- when copying resource/ extracting embedded metadata, autocomplete_blank_fields() should not overwrite if there is data
for that field as at this point you probably have the expected data for your field.

Parameters

ColumnTypeDefaultDescription
$resource integer Resource ID
$force_run boolean Allow code to force running this function and update the fields even if there is data.
$return_changes boolean false When true an array of fields changed by autocomplete is returned.
$field_ref integer 0 Optional parameter to specify which metadata field should be processed. Left blank, all fields will be processed (default behaviour).

Return

boolean|array Success/fail or array of changes made

Location

include/resource_functions.php lines 5617 to 5694

Definition

 
function autocomplete_blank_fields($resource$force_run$return_changes falseint $field_ref 0)
{
    global 
$FIXED_LIST_FIELD_TYPES$lang;

    if ((string)(int)
$resource != (string)$resource) {
        return 
false;
    }

    
$resource_type ps_value("SELECT resource_type AS `value` FROM resource WHERE ref = ?", ["i",$resource], 0);

    
$sql_set_field '';
    
$sql_set_field_params = array();
    if (
$field_ref 0) {
        
$sql_set_field ' AND rtf.ref = ?';
        
$sql_set_field_params = array('i'$field_ref);
    }

    
$fields ps_query(
        
"SELECT rtf.ref, rtf.type, rtf.autocomplete_macro
            FROM resource_type_field rtf
            LEFT JOIN resource_type rt ON rt.ref = ?
            WHERE length(rtf.autocomplete_macro) > 0
                AND (((rtf.global=0 OR rtf.global IS NULL) 
                        AND rt.ref IN (
                            SELECT resource_type 
                                FROM resource_type_field_resource_type rtjoin 
                                WHERE rtjoin.resource_type_field=rtf.ref
                                ))
                    OR (rtf.global=1)
                    ) 
$sql_set_field",
        
array_merge(array("i"$resource_type), $sql_set_field_params),
        
"schema"
    
);

    
$fields_updated = array();

    foreach (
$fields as $field) {
        
$run_autocomplete_macro $force_run || hook('run_autocomplete_macro');
        
# The autocomplete macro will run if the existing value is blank, or if forced to always run
        
if (count(get_resource_nodes($resource$field['ref'], true)) == || $run_autocomplete_macro) {
            
# Autocomplete and update using the returned value
            
$value = eval(eval_check_signed($field['autocomplete_macro']));
            if (
in_array($field['type'], $FIXED_LIST_FIELD_TYPES)) {
                
# Multiple values are comma separated
                
$autovals str_getcsv((string) $value);
                
$autonodes = array();
                
# Establish an array of nodes from the values
                
foreach ($autovals as $autoval) {
                    
$nodeid get_node_id($autoval$field['ref']);
                    if (
$nodeid !== false) {
                        
$autonodes[] = $nodeid;
                    }
                }
                
# Add nodes if any were established
                
if (count($autonodes) > 0) {
                    
natsort($autonodes);
                    
add_resource_nodes($resource$autonodesfalsefalse);
                    
log_node_changes($resource$autonodes, array(), $lang["autocomplete_log_note"]);
                    
$fields_updated[$field['ref']] = implode(","$autonodes);

                    
# If this is a 'joined' field we need to add it to the resource column
                    
$joins get_resource_table_joins();
                    if (
in_array($field['ref'], $joins)) {
                        
update_resource_field_column($resource$field['ref'], $value);
                    }
                }
            } else {
                
update_field($resource$field['ref'], $value);
                
$fields_updated[$field['ref']] = $value;
            }
        }
    }

    if (
$return_changes) {
        return 
$fields_updated;
    }
    return 
true;
}

This article was last updated 2nd June 2025 12:05 Europe/London time based on the source file dated 28th May 2025 12:00 Europe/London time.