function noderelationships_cck_backref_sync_fields in Node Relationships 6
Synchronize back reference settings with back reference fields.
4 calls to noderelationships_cck_backref_sync_fields()
- noderelationships_settings_delete_nodereference in ./
noderelationships.inc - Delete relationship settings when a nodereference field has been deleted.
- noderelationships_settings_rename_type in ./
noderelationships.inc - Update relationship settings when a content type has been renamed.
- noderelationships_settings_save in ./
noderelationships.inc - Set relationship settings for the given content type.
- _noderelationships_nodereference_settings_form_submit in ./
noderelationships.admin.inc - Submit handler for nodereference field settings form.
File
- ./
noderelationships.inc, line 536 - Common functions for the noderelationships module.
Code
function noderelationships_cck_backref_sync_fields($types_to_sync) {
if (!is_array($types_to_sync)) {
$types_to_sync = array(
$types_to_sync,
);
}
$rebuild = FALSE;
foreach ($types_to_sync as $nodetype) {
// Load back reference settings for fields region.
$backref_settings = noderelationships_settings_load($nodetype, 'backref');
$region_backrefs = !empty($backref_settings['regions'][NODERELATIONSHIPS_BACKREF_REGION_FIELD]) ? $backref_settings['regions'][NODERELATIONSHIPS_BACKREF_REGION_FIELD] : array();
// Get the list of back reference fields already defined for this content type.
$backref_fields = noderelationships_get_backreferences($nodetype, TRUE);
// Walk through all back reference settings to create new back reference fields.
foreach ($region_backrefs as $relation_key => $relation_info) {
list($referrer_type, $field_name) = explode(':', $relation_key);
// Find backref to $nodetype from $field_name in $referrer_type.
$backref_name = noderelationships_cck_backref_build_name($nodetype, $referrer_type, $field_name);
if (isset($backref_fields[$backref_name])) {
// So far so good, this back reference field already exists.
unset($backref_fields[$backref_name]);
}
else {
// This back reference field does not exist, so we should create one.
$referrer_field = content_fields($field_name, $referrer_type);
$field_label = t('Back references from @referrer-label in @referrer-type', array(
'@referrer-label' => $referrer_field['widget']['label'],
'@referrer-type' => noderelationships_get_localized_content_type_name($referrer_type),
));
noderelationships_cck_backref_create(array(
'type_name' => $nodetype,
'field_name' => $backref_name,
'label' => $field_label,
'referrer_type' => $referrer_type,
'referrer_field' => $field_name,
));
$rebuild = TRUE;
drupal_set_message(t('Back reference field created: %field', array(
'%field' => $field_label,
)));
}
}
// Remove any back reference field that is not enabled in back reference settings.
foreach ($backref_fields as $field_name => $field_info) {
noderelationships_cck_backref_delete($nodetype, $field_name);
$rebuild = TRUE;
drupal_set_message(t('Back reference field removed: %field', array(
'%field' => $field_info['widget_label'],
)));
}
}
// Clear caches and rebuild menu only if any field has been created or removed.
if ($rebuild) {
content_clear_type_cache(TRUE);
menu_rebuild();
}
}