annotate sites/all/modules/entityreference/plugins/behavior/EntityReferenceBehavior_TaxonomyIndex.class.php @ 9:830c812b520f

added smtp module
author root <root@paio.local>
date Mon, 28 Oct 2013 15:34:27 +0000
parents ce11bbd8f642
children
rev   line source
danielebarchiesi@4 1 <?php
danielebarchiesi@4 2
danielebarchiesi@4 3 /**
danielebarchiesi@4 4 * @file
danielebarchiesi@4 5 * CTools plugin class for the taxonomy-index behavior.
danielebarchiesi@4 6 */
danielebarchiesi@4 7
danielebarchiesi@4 8 /**
danielebarchiesi@4 9 * Extends an entityreference field to maintain its references to taxonomy terms
danielebarchiesi@4 10 * in the {taxonomy_index} table.
danielebarchiesi@4 11 *
danielebarchiesi@4 12 * Note, unlike entityPostInsert() and entityPostUpdate(), entityDelete()
danielebarchiesi@4 13 * is not needed as cleanup is performed by taxonomy module in
danielebarchiesi@4 14 * taxonomy_delete_node_index().
danielebarchiesi@4 15 */
danielebarchiesi@4 16 class EntityReferenceBehavior_TaxonomyIndex extends EntityReference_BehaviorHandler_Abstract {
danielebarchiesi@4 17
danielebarchiesi@4 18 /**
danielebarchiesi@4 19 * Overrides EntityReference_BehaviorHandler_Abstract::access().
danielebarchiesi@4 20 *
danielebarchiesi@4 21 * Ensure that it is only enabled for ER instances on nodes targeting
danielebarchiesi@4 22 * terms, and the core variable to maintain index is enabled.
danielebarchiesi@4 23 */
danielebarchiesi@4 24 public function access($field, $instance) {
danielebarchiesi@4 25 if ($instance['entity_type'] != 'node' || $field['settings']['target_type'] != 'taxonomy_term') {
danielebarchiesi@4 26 return;
danielebarchiesi@4 27 }
danielebarchiesi@4 28
danielebarchiesi@4 29 if ($field['storage']['type'] !== 'field_sql_storage') {
danielebarchiesi@4 30 // Field doesn't use SQL storage.
danielebarchiesi@4 31 return;
danielebarchiesi@4 32 }
danielebarchiesi@4 33
danielebarchiesi@4 34 return variable_get('taxonomy_maintain_index_table', TRUE);
danielebarchiesi@4 35 }
danielebarchiesi@4 36
danielebarchiesi@4 37 /**
danielebarchiesi@4 38 * Overrides EntityReference_BehaviorHandler_Abstract::entityPostInsert().
danielebarchiesi@4 39 *
danielebarchiesi@4 40 * Runs after hook_node_insert() used by taxonomy module.
danielebarchiesi@4 41 */
danielebarchiesi@4 42 public function entityPostInsert($entity_type, $entity, $field, $instance) {
danielebarchiesi@4 43 if ($entity_type != 'node') {
danielebarchiesi@4 44 return;
danielebarchiesi@4 45 }
danielebarchiesi@4 46
danielebarchiesi@4 47 $this->buildNodeIndex($entity);
danielebarchiesi@4 48 }
danielebarchiesi@4 49
danielebarchiesi@4 50 /**
danielebarchiesi@4 51 * Overrides EntityReference_BehaviorHandler_Abstract::entityPostUpdate().
danielebarchiesi@4 52 *
danielebarchiesi@4 53 * Runs after hook_node_update() used by taxonomy module.
danielebarchiesi@4 54 */
danielebarchiesi@4 55 public function entityPostUpdate($entity_type, $entity, $field, $instance) {
danielebarchiesi@4 56 if ($entity_type != 'node') {
danielebarchiesi@4 57 return;
danielebarchiesi@4 58 }
danielebarchiesi@4 59
danielebarchiesi@4 60 $this->buildNodeIndex($entity);
danielebarchiesi@4 61 }
danielebarchiesi@4 62
danielebarchiesi@4 63 /**
danielebarchiesi@4 64 * Builds and inserts taxonomy index entries for a given node.
danielebarchiesi@4 65 *
danielebarchiesi@4 66 * The index lists all terms that are related to a given node entity, and is
danielebarchiesi@4 67 * therefore maintained at the entity level.
danielebarchiesi@4 68 *
danielebarchiesi@4 69 * @param $node
danielebarchiesi@4 70 * The node object.
danielebarchiesi@4 71 *
danielebarchiesi@4 72 * @see taxonomy_build_node_index()
danielebarchiesi@4 73 */
danielebarchiesi@4 74 protected function buildNodeIndex($node) {
danielebarchiesi@4 75 // We maintain a denormalized table of term/node relationships, containing
danielebarchiesi@4 76 // only data for current, published nodes.
danielebarchiesi@4 77 $status = NULL;
danielebarchiesi@4 78 if (variable_get('taxonomy_maintain_index_table', TRUE)) {
danielebarchiesi@4 79 // If a node property is not set in the node object when node_save() is
danielebarchiesi@4 80 // called, the old value from $node->original is used.
danielebarchiesi@4 81 if (!empty($node->original)) {
danielebarchiesi@4 82 $status = (int)(!empty($node->status) || (!isset($node->status) && !empty($node->original->status)));
danielebarchiesi@4 83 $sticky = (int)(!empty($node->sticky) || (!isset($node->sticky) && !empty($node->original->sticky)));
danielebarchiesi@4 84 }
danielebarchiesi@4 85 else {
danielebarchiesi@4 86 $status = (int)(!empty($node->status));
danielebarchiesi@4 87 $sticky = (int)(!empty($node->sticky));
danielebarchiesi@4 88 }
danielebarchiesi@4 89 }
danielebarchiesi@4 90 // We only maintain the taxonomy index for published nodes.
danielebarchiesi@4 91 if ($status) {
danielebarchiesi@4 92 // Collect a unique list of all the term IDs from all node fields.
danielebarchiesi@4 93 $tid_all = array();
danielebarchiesi@4 94 foreach (field_info_instances('node', $node->type) as $instance) {
danielebarchiesi@4 95 $field_name = $instance['field_name'];
danielebarchiesi@4 96 $field = field_info_field($field_name);
danielebarchiesi@4 97 if (!empty($field['settings']['target_type']) && $field['settings']['target_type'] == 'taxonomy_term' && $field['storage']['type'] == 'field_sql_storage') {
danielebarchiesi@4 98 // If a field value is not set in the node object when node_save() is
danielebarchiesi@4 99 // called, the old value from $node->original is used.
danielebarchiesi@4 100 if (isset($node->{$field_name})) {
danielebarchiesi@4 101 $items = $node->{$field_name};
danielebarchiesi@4 102 }
danielebarchiesi@4 103 elseif (isset($node->original->{$field_name})) {
danielebarchiesi@4 104 $items = $node->original->{$field_name};
danielebarchiesi@4 105 }
danielebarchiesi@4 106 else {
danielebarchiesi@4 107 continue;
danielebarchiesi@4 108 }
danielebarchiesi@4 109 foreach (field_available_languages('node', $field) as $langcode) {
danielebarchiesi@4 110 if (!empty($items[$langcode])) {
danielebarchiesi@4 111 foreach ($items[$langcode] as $item) {
danielebarchiesi@4 112 $tid_all[$item['target_id']] = $item['target_id'];
danielebarchiesi@4 113 }
danielebarchiesi@4 114 }
danielebarchiesi@4 115 }
danielebarchiesi@4 116 }
danielebarchiesi@4 117
danielebarchiesi@4 118 // Re-calculate the terms added in taxonomy_build_node_index() so
danielebarchiesi@4 119 // we can optimize database queries.
danielebarchiesi@4 120 $original_tid_all = array();
danielebarchiesi@4 121 if ($field['module'] == 'taxonomy' && $field['storage']['type'] == 'field_sql_storage') {
danielebarchiesi@4 122 // If a field value is not set in the node object when node_save() is
danielebarchiesi@4 123 // called, the old value from $node->original is used.
danielebarchiesi@4 124 if (isset($node->{$field_name})) {
danielebarchiesi@4 125 $items = $node->{$field_name};
danielebarchiesi@4 126 }
danielebarchiesi@4 127 elseif (isset($node->original->{$field_name})) {
danielebarchiesi@4 128 $items = $node->original->{$field_name};
danielebarchiesi@4 129 }
danielebarchiesi@4 130 else {
danielebarchiesi@4 131 continue;
danielebarchiesi@4 132 }
danielebarchiesi@4 133 foreach (field_available_languages('node', $field) as $langcode) {
danielebarchiesi@4 134 if (!empty($items[$langcode])) {
danielebarchiesi@4 135 foreach ($items[$langcode] as $item) {
danielebarchiesi@4 136 $original_tid_all[$item['tid']] = $item['tid'];
danielebarchiesi@4 137 }
danielebarchiesi@4 138 }
danielebarchiesi@4 139 }
danielebarchiesi@4 140 }
danielebarchiesi@4 141 }
danielebarchiesi@4 142
danielebarchiesi@4 143 // Insert index entries for all the node's terms, that were not
danielebarchiesi@4 144 // already inserted in taxonomy_build_node_index().
danielebarchiesi@4 145 $tid_all = array_diff($tid_all, $original_tid_all);
danielebarchiesi@4 146
danielebarchiesi@4 147 // Insert index entries for all the node's terms.
danielebarchiesi@4 148 if (!empty($tid_all)) {
danielebarchiesi@4 149 $query = db_insert('taxonomy_index')->fields(array('nid', 'tid', 'sticky', 'created'));
danielebarchiesi@4 150 foreach ($tid_all as $tid) {
danielebarchiesi@4 151 $query->values(array(
danielebarchiesi@4 152 'nid' => $node->nid,
danielebarchiesi@4 153 'tid' => $tid,
danielebarchiesi@4 154 'sticky' => $sticky,
danielebarchiesi@4 155 'created' => $node->created,
danielebarchiesi@4 156 ));
danielebarchiesi@4 157 }
danielebarchiesi@4 158 $query->execute();
danielebarchiesi@4 159 }
danielebarchiesi@4 160 }
danielebarchiesi@4 161 }
danielebarchiesi@4 162
danielebarchiesi@4 163 /**
danielebarchiesi@4 164 * Overrides EntityReference_BehaviorHandler_Abstract::settingsForm().
danielebarchiesi@4 165 */
danielebarchiesi@4 166 public function settingsForm($field, $instance) {
danielebarchiesi@4 167 $form = array();
danielebarchiesi@4 168 $target = $field['settings']['target_type'];
danielebarchiesi@4 169 if ($target != 'taxonomy_term') {
danielebarchiesi@4 170 $form['ti-on-terms'] = array(
danielebarchiesi@4 171 '#markup' => t('This behavior can only be set when the target type is taxonomy_term, but the target of this field is %target.', array('%target' => $target)),
danielebarchiesi@4 172 );
danielebarchiesi@4 173 }
danielebarchiesi@4 174
danielebarchiesi@4 175 $entity_type = $instance['entity_type'];
danielebarchiesi@4 176 if ($entity_type != 'node') {
danielebarchiesi@4 177 $form['ti-on-nodes'] = array(
danielebarchiesi@4 178 '#markup' => t('This behavior can only be set when the entity type is node, but the entity type of this instance is %type.', array('%type' => $entity_type)),
danielebarchiesi@4 179 );
danielebarchiesi@4 180 }
danielebarchiesi@4 181
danielebarchiesi@4 182 if (!variable_get('taxonomy_maintain_index_table', TRUE)) {
danielebarchiesi@4 183 $form['ti-disabled'] = array(
danielebarchiesi@4 184 '#markup' => t('This core variable "taxonomy_maintain_index_table" is disabled.'),
danielebarchiesi@4 185 );
danielebarchiesi@4 186 }
danielebarchiesi@4 187 return $form;
danielebarchiesi@4 188 }
danielebarchiesi@4 189 }