You are here

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();
  }
}