| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479 | <?php/** * @file * Install file providing corresponding entity reference schema. *//** * Implements hook_schema(). */function cer_schema() {  $schema = array();  // @see entity_exportable_schema_fields()  $schema['cer_preset'] = array(    'fields' => array(      'pid' => array(        'type' => 'serial',        'not null' => TRUE,      ),      'identifier' => array(        'type' => 'text',        'size' => 'tiny',        'not null' => TRUE,        'description' => "The preset's machine-readable export identifier.",      ),      'status' => array(        'type' => 'int',        'size' => 'tiny',        'not null' => TRUE,        'default' => 0x01,  // ENTITY_CUSTOM        'description' => "The preset's exportable status.",      ),      'module' => array(        'type' => 'varchar',        'length' => 255,        'not null' => FALSE,        'default' => 'cer',        'description' => 'The module, if any, which exports this preset.',      ),    ),    'primary key' => array('pid'),  );  return $schema;}/** * Implements hook_install(). */function cer_install() {  field_info_cache_clear();  $fields = _cer_field_definitions();  array_walk($fields, 'field_create_field');  $instances = _cer_field_instance_definitions();  array_walk($instances, 'field_create_instance');  if (module_exists('corresponding_node_references')) {    _cer_hijack_cnr();  }}/** * Contains the default field definitions for presets. */function _cer_field_definitions() {  $field_bases = array();  $field_bases[] = array(    'active' => 1,    'cardinality' => 1,    'deleted' => 0,    'entity_types' => array(),    'field_name' => 'cer_bidirectional',    'foreign keys' => array(),    'indexes' => array(      'value' => array(        0 => 'value',      ),    ),    'locked' => 0,    'module' => 'list',    'settings' => array(      'allowed_values' => array(        0 => 0,        1 => 1,      ),      'allowed_values_function' => '',    ),    'translatable' => 0,    'type' => 'list_boolean',  );  $field_bases[] = array(    'active' => 1,    'cardinality' => 1,    'deleted' => 0,    'entity_types' => array(),    'field_name' => 'cer_enabled',    'foreign keys' => array(),    'indexes' => array(      'value' => array(        0 => 'value',      ),    ),    'locked' => 1,    'module' => 'list',    'settings' => array(      'allowed_values' => array(        0 => 0,        1 => 1,      ),      'allowed_values_function' => '',    ),    'translatable' => 0,    'type' => 'list_boolean',  );  $field_bases[] = array(    'active' => 1,    'cardinality' => 1,    'deleted' => 0,    'entity_types' => array(),    'field_name' => 'cer_weight',    'foreign keys' => array(),    'indexes' => array(      'value' => array(        0 => 'value',      ),    ),    'locked' => 0,    'module' => 'list',    'settings' => array(      'allowed_values' => array(),      'allowed_values_function' => 'cer_weight_options',    ),    'translatable' => 0,    'type' => 'list_integer',  );  $field_bases[] = array(    'active' => 1,    'cardinality' => 1,    'deleted' => 0,    'entity_types' => array(),    'field_name' => 'cer_left',    'foreign keys' => array(      'field_instance' => array(        'columns' => array(          'fiid' => 'id',        ),        'table' => 'field_config_instance',      ),    ),    'indexes' => array(),    'locked' => 1,    'module' => 'field_object',    'settings' => array(),    'translatable' => 0,    'type' => 'field_object',  );  $field_bases[] = array(    'active' => 1,    'cardinality' => 1,    'deleted' => 0,    'entity_types' => array(),    'field_name' => 'cer_right',    'foreign keys' => array(      'field_instance' => array(        'columns' => array(          'fiid' => 'id',        ),        'table' => 'field_config_instance',      ),    ),    'indexes' => array(),    'locked' => 1,    'module' => 'field_object',    'settings' => array(),    'translatable' => 0,    'type' => 'field_object',  );  return $field_bases;}/** * Contains the default field instance definitions for presets. */function _cer_field_instance_definitions() {  $field_instances = array();  $field_instances[] = array(    'bundle' => 'cer',    'default_value' => array(      0 => array(        'value' => 1,      ),    ),    'deleted' => 0,    'description' => '',    'display' => array(      'default' => array(        'label' => 'above',        'module' => 'list',        'settings' => array(),        'type' => 'list_default',        'weight' => 1,      ),    ),    'entity_type' => 'cer',    'field_name' => 'cer_bidirectional',    'label' => 'Bidirectional',    'required' => 0,    'settings' => array(),    'widget' => array(      'active' => 1,      'module' => 'options',      'settings' => array(        'display_label' => 1,      ),      'type' => 'options_onoff',      'weight' => 3,    ),  );  $field_instances[] = array(    'bundle' => 'cer',    'default_value' => array(      0 => array(        'value' => 1,      ),    ),    'deleted' => 0,    'description' => '',    'display' => array(      'default' => array(        'label' => 'above',        'module' => 'list',        'settings' => array(),        'type' => 'list_default',        'weight' => 0,      ),    ),    'entity_type' => 'cer',    'field_name' => 'cer_enabled',    'label' => 'Enabled',    'required' => 0,    'settings' => array(),    'widget' => array(      'active' => 1,      'module' => 'options',      'settings' => array(        'display_label' => 1,      ),      'type' => 'options_onoff',      'weight' => 2,    ),  );  $field_instances[] = array(    'bundle' => 'cer',    'default_value' => array(      0 => array(        'value' => 0,      ),    ),    'deleted' => 0,    'description' => '',    'display' => array(      'default' => array(        'label' => 'above',        'module' => 'list',        'settings' => array(),        'type' => 'list_default',        'weight' => 4,      ),    ),    'entity_type' => 'cer',    'field_name' => 'cer_weight',    'label' => 'Weight',    'required' => 1,    'settings' => array(),    'widget' => array(      'active' => 1,      'module' => 'options',      'settings' => array(),      'type' => 'options_select',      'weight' => 4,    ),  );  $field_instances[] = array(    'bundle' => 'cer',    'default_value' => NULL,    'deleted' => 0,    'description' => '',    'display' => array(      'default' => array(        'label' => 'hidden',        'module' => NULL,        'settings' => array(),        'type' => 'field_object_default',        'weight' => 5,      ),    ),    'entity_type' => 'cer',    'field_name' => 'cer_left',    'label' => 'Left Field',    'required' => 1,    'settings' => array(      'function' => 'CerFieldChain::collectAll',    ),    'widget' => array(      'active' => 1,      'module' => 'options',      'settings' => array(),      'type' => 'options_select',      'weight' => 0,    ),  );  $field_instances[] = array(    'bundle' => 'cer',    'default_value' => NULL,    'deleted' => 0,    'description' => '',    'display' => array(      'default' => array(        'label' => 'hidden',        'module' => NULL,        'settings' => array(),        'type' => 'field_object_default',        'weight' => 6,      ),    ),    'entity_type' => 'cer',    'field_name' => 'cer_right',    'label' => 'Right Field',    'required' => 1,    'settings' => array(      'function' => 'CerFieldChain::collectAll',    ),    'widget' => array(      'active' => 1,      'module' => 'options',      'settings' => array(),      'type' => 'options_select',      'weight' => 1,    ),  );  return $field_instances;}/** * Implements hook_uninstall(). */function cer_uninstall() {  variable_del('cer_debug');  // Delete fields created by cer_install()  field_delete_field('cer_left');  field_delete_field('cer_right');  field_delete_field('cer_bidirectional');  field_delete_field('cer_enabled');  field_delete_field('cer_weight');}/** * Converts all CNR presets to CER presets, then disables CNR. */function _cer_hijack_cnr() {  $cnr = db_query('SELECT * FROM {corresponding_node_references} WHERE 1')->fetchAll();  foreach ($cnr as $index => $preset) {    // Prepend 'node*' to each side of the preset. CNR, sensibly enough, assumes everything    // is on a node, but CER needs this specified explicitly.    $key = explode('*', $preset->node_types_content_fields);    $cnr[$index]->entity_types_content_fields = "node*{$key[0]}*{$key[1]}*node*{$key[2]}*{$key[3]}";  }  array_walk($cnr, '_cer_rebuild_preset');  module_disable(array('corresponding_node_references'));  drupal_set_message(t('Rebuilt CNR presets.'));}/** * Rename table to shorten module name. */function cer_update_7001() {  if (db_table_exists('corresponding_entity_references')) {    db_rename_table('corresponding_entity_references', 'cer');  }}/** * Creates the {cer_preset} table to store CerPreset entities, and rebuilds * legacy presets. */function cer_update_7005() {  // Register new classes with the autoloader.  registry_rebuild();  // Create the table for preset entities.  $tables = cer_schema();  db_create_table('cer_preset', $tables['cer_preset']);  // Install Field Reference, which powers the cer_left and cer_right fields.  if (! module_exists('field_object')) {    module_enable(array('field_object'));  }  // Create preset entities' fields.  cer_install();  // Convert legacy presets to entities, including 1.x, 2.x and the older  // 3.x schemas.  $old = db_select('cer')->fields('cer')->execute()->fetchAll();  $old = array_merge($old, module_invoke_all('cer_default_presets'));  array_walk($old, '_cer_rebuild_preset');  // So long, legacy table...  db_drop_table('cer');  // Delete defunct status variable maintained by CTools.  variable_del('default_cer');  if (module_exists('corresponding_node_references')) {    _cer_hijack_cnr();  }}/** * Rebuilds a legacy CER or CNR preset as a CerPreset entity. */function _cer_rebuild_preset($old) {  if (isset($old->entity_types_content_fields)) {    $keys = explode('*', $old->entity_types_content_fields);    $old->a = implode(':', array_slice($keys, 0, 3));    $old->b = implode(':', array_slice($keys, 3));  }  if (! isset($old->bidirectional)) {    $old->bidirectional = TRUE;  }  if (! isset($old->weight)) {    $old->weight = 0;  }  // If the 'enabled' flag doesn't exist, we can presume that this preset  // was exported in code generated by CTools, which means that it should  // have a 'disabled' flag, which we can invert to get the status.  if (! isset($old->enabled)) {    $old->enabled = (! $old->disabled);  }  // Validate both field chains by trying to unpack them. If any field in  // either chain isn't exposed by hook_cer_fields(), an exception will be  // thrown and we can bail out with an error message.  try {    CerFieldChain::unpack($old->a);    CerFieldChain::unpack($old->b);  }  catch (Exception $e) {    $variables = array(      '%key' => "{$old->a}*{$old->b}",    );    return drupal_set_message(t('Could not rebuild preset %key because it refers to invalid fields.', $variables), 'error');  }  $preset = new CerPreset();  $preset->wrapper->cer_left->set($old->a);  $preset->wrapper->cer_right->set($old->b);  $preset->wrapper->cer_enabled->set($old->enabled);  $preset->wrapper->cer_bidirectional->set($old->bidirectional);  $preset->wrapper->cer_weight->set($old->weight);  $preset->save();}
 |