danielebarchiesi@4: buildNodeIndex($entity); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Overrides EntityReference_BehaviorHandler_Abstract::entityPostUpdate(). danielebarchiesi@4: * danielebarchiesi@4: * Runs after hook_node_update() used by taxonomy module. danielebarchiesi@4: */ danielebarchiesi@4: public function entityPostUpdate($entity_type, $entity, $field, $instance) { danielebarchiesi@4: if ($entity_type != 'node') { danielebarchiesi@4: return; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: $this->buildNodeIndex($entity); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Builds and inserts taxonomy index entries for a given node. danielebarchiesi@4: * danielebarchiesi@4: * The index lists all terms that are related to a given node entity, and is danielebarchiesi@4: * therefore maintained at the entity level. danielebarchiesi@4: * danielebarchiesi@4: * @param $node danielebarchiesi@4: * The node object. danielebarchiesi@4: * danielebarchiesi@4: * @see taxonomy_build_node_index() danielebarchiesi@4: */ danielebarchiesi@4: protected function buildNodeIndex($node) { danielebarchiesi@4: // We maintain a denormalized table of term/node relationships, containing danielebarchiesi@4: // only data for current, published nodes. danielebarchiesi@4: $status = NULL; danielebarchiesi@4: if (variable_get('taxonomy_maintain_index_table', TRUE)) { danielebarchiesi@4: // If a node property is not set in the node object when node_save() is danielebarchiesi@4: // called, the old value from $node->original is used. danielebarchiesi@4: if (!empty($node->original)) { danielebarchiesi@4: $status = (int)(!empty($node->status) || (!isset($node->status) && !empty($node->original->status))); danielebarchiesi@4: $sticky = (int)(!empty($node->sticky) || (!isset($node->sticky) && !empty($node->original->sticky))); danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: $status = (int)(!empty($node->status)); danielebarchiesi@4: $sticky = (int)(!empty($node->sticky)); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: // We only maintain the taxonomy index for published nodes. danielebarchiesi@4: if ($status) { danielebarchiesi@4: // Collect a unique list of all the term IDs from all node fields. danielebarchiesi@4: $tid_all = array(); danielebarchiesi@4: foreach (field_info_instances('node', $node->type) as $instance) { danielebarchiesi@4: $field_name = $instance['field_name']; danielebarchiesi@4: $field = field_info_field($field_name); danielebarchiesi@4: if (!empty($field['settings']['target_type']) && $field['settings']['target_type'] == 'taxonomy_term' && $field['storage']['type'] == 'field_sql_storage') { danielebarchiesi@4: // If a field value is not set in the node object when node_save() is danielebarchiesi@4: // called, the old value from $node->original is used. danielebarchiesi@4: if (isset($node->{$field_name})) { danielebarchiesi@4: $items = $node->{$field_name}; danielebarchiesi@4: } danielebarchiesi@4: elseif (isset($node->original->{$field_name})) { danielebarchiesi@4: $items = $node->original->{$field_name}; danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: continue; danielebarchiesi@4: } danielebarchiesi@4: foreach (field_available_languages('node', $field) as $langcode) { danielebarchiesi@4: if (!empty($items[$langcode])) { danielebarchiesi@4: foreach ($items[$langcode] as $item) { danielebarchiesi@4: $tid_all[$item['target_id']] = $item['target_id']; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: // Re-calculate the terms added in taxonomy_build_node_index() so danielebarchiesi@4: // we can optimize database queries. danielebarchiesi@4: $original_tid_all = array(); danielebarchiesi@4: if ($field['module'] == 'taxonomy' && $field['storage']['type'] == 'field_sql_storage') { danielebarchiesi@4: // If a field value is not set in the node object when node_save() is danielebarchiesi@4: // called, the old value from $node->original is used. danielebarchiesi@4: if (isset($node->{$field_name})) { danielebarchiesi@4: $items = $node->{$field_name}; danielebarchiesi@4: } danielebarchiesi@4: elseif (isset($node->original->{$field_name})) { danielebarchiesi@4: $items = $node->original->{$field_name}; danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: continue; danielebarchiesi@4: } danielebarchiesi@4: foreach (field_available_languages('node', $field) as $langcode) { danielebarchiesi@4: if (!empty($items[$langcode])) { danielebarchiesi@4: foreach ($items[$langcode] as $item) { danielebarchiesi@4: $original_tid_all[$item['tid']] = $item['tid']; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: // Insert index entries for all the node's terms, that were not danielebarchiesi@4: // already inserted in taxonomy_build_node_index(). danielebarchiesi@4: $tid_all = array_diff($tid_all, $original_tid_all); danielebarchiesi@4: danielebarchiesi@4: // Insert index entries for all the node's terms. danielebarchiesi@4: if (!empty($tid_all)) { danielebarchiesi@4: $query = db_insert('taxonomy_index')->fields(array('nid', 'tid', 'sticky', 'created')); danielebarchiesi@4: foreach ($tid_all as $tid) { danielebarchiesi@4: $query->values(array( danielebarchiesi@4: 'nid' => $node->nid, danielebarchiesi@4: 'tid' => $tid, danielebarchiesi@4: 'sticky' => $sticky, danielebarchiesi@4: 'created' => $node->created, danielebarchiesi@4: )); danielebarchiesi@4: } danielebarchiesi@4: $query->execute(); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Overrides EntityReference_BehaviorHandler_Abstract::settingsForm(). danielebarchiesi@4: */ danielebarchiesi@4: public function settingsForm($field, $instance) { danielebarchiesi@4: $form = array(); danielebarchiesi@4: $target = $field['settings']['target_type']; danielebarchiesi@4: if ($target != 'taxonomy_term') { danielebarchiesi@4: $form['ti-on-terms'] = array( danielebarchiesi@4: '#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: ); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: $entity_type = $instance['entity_type']; danielebarchiesi@4: if ($entity_type != 'node') { danielebarchiesi@4: $form['ti-on-nodes'] = array( danielebarchiesi@4: '#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: ); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: if (!variable_get('taxonomy_maintain_index_table', TRUE)) { danielebarchiesi@4: $form['ti-disabled'] = array( danielebarchiesi@4: '#markup' => t('This core variable "taxonomy_maintain_index_table" is disabled.'), danielebarchiesi@4: ); danielebarchiesi@4: } danielebarchiesi@4: return $form; danielebarchiesi@4: } danielebarchiesi@4: }