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 }
|