danielebarchiesi@0
|
1 <?php
|
danielebarchiesi@0
|
2
|
danielebarchiesi@0
|
3 /**
|
danielebarchiesi@0
|
4 * @file
|
danielebarchiesi@0
|
5 *
|
danielebarchiesi@0
|
6 * Plugin to provide a node context. A node context is a node wrapped in a
|
danielebarchiesi@0
|
7 * context object that can be utilized by anything that accepts contexts.
|
danielebarchiesi@0
|
8 */
|
danielebarchiesi@0
|
9
|
danielebarchiesi@0
|
10 /**
|
danielebarchiesi@0
|
11 * Plugins are described by creating a $plugin array which will be used
|
danielebarchiesi@0
|
12 * by the system that includes this file.
|
danielebarchiesi@0
|
13 */
|
danielebarchiesi@0
|
14 $plugin = array(
|
danielebarchiesi@0
|
15 'title' => t("Node"),
|
danielebarchiesi@0
|
16 'description' => t('A node object.'),
|
danielebarchiesi@0
|
17 'context' => 'ctools_context_create_node',
|
danielebarchiesi@0
|
18 'edit form' => 'ctools_context_node_settings_form',
|
danielebarchiesi@0
|
19 'defaults' => array('nid' => ''),
|
danielebarchiesi@0
|
20 'keyword' => 'node',
|
danielebarchiesi@0
|
21 'context name' => 'node',
|
danielebarchiesi@0
|
22 'convert list' => 'ctools_context_node_convert_list',
|
danielebarchiesi@0
|
23 'convert' => 'ctools_context_node_convert',
|
danielebarchiesi@0
|
24 'placeholder form' => array(
|
danielebarchiesi@0
|
25 '#type' => 'textfield',
|
danielebarchiesi@0
|
26 '#description' => t('Enter the node ID of a node for this context.'),
|
danielebarchiesi@0
|
27 ),
|
danielebarchiesi@0
|
28 // This context is deprecated and should not be usable in the UI.
|
danielebarchiesi@0
|
29 'no ui' => TRUE,
|
danielebarchiesi@0
|
30 'no required context ui' => TRUE,
|
danielebarchiesi@0
|
31 'superceded by' => 'entity:node',
|
danielebarchiesi@0
|
32 );
|
danielebarchiesi@0
|
33
|
danielebarchiesi@0
|
34 /**
|
danielebarchiesi@0
|
35 * It's important to remember that $conf is optional here, because contexts
|
danielebarchiesi@0
|
36 * are not always created from the UI.
|
danielebarchiesi@0
|
37 */
|
danielebarchiesi@0
|
38 function ctools_context_create_node($empty, $data = NULL, $conf = FALSE) {
|
danielebarchiesi@0
|
39 $context = new ctools_context('node');
|
danielebarchiesi@0
|
40 $context->plugin = 'node';
|
danielebarchiesi@0
|
41
|
danielebarchiesi@0
|
42 if ($empty) {
|
danielebarchiesi@0
|
43 return $context;
|
danielebarchiesi@0
|
44 }
|
danielebarchiesi@0
|
45
|
danielebarchiesi@0
|
46 if ($conf) {
|
danielebarchiesi@0
|
47 $nid = is_array($data) && isset($data['nid']) ? $data['nid'] : (is_object($data) ? $data->nid : 0);
|
danielebarchiesi@0
|
48
|
danielebarchiesi@0
|
49 if (module_exists('translation')) {
|
danielebarchiesi@0
|
50 if ($translation = module_invoke('translation', 'node_nid', $nid, $GLOBALS['language']->language)) {
|
danielebarchiesi@0
|
51 $nid = $translation;
|
danielebarchiesi@0
|
52 $reload = TRUE;
|
danielebarchiesi@0
|
53 }
|
danielebarchiesi@0
|
54 }
|
danielebarchiesi@0
|
55
|
danielebarchiesi@0
|
56 if (is_array($data) || !empty($reload)) {
|
danielebarchiesi@0
|
57 $data = node_load($nid);
|
danielebarchiesi@0
|
58 }
|
danielebarchiesi@0
|
59 }
|
danielebarchiesi@0
|
60
|
danielebarchiesi@0
|
61 if (!empty($data)) {
|
danielebarchiesi@0
|
62 $context->data = $data;
|
danielebarchiesi@0
|
63 $context->title = $data->title;
|
danielebarchiesi@0
|
64 $context->argument = $data->nid;
|
danielebarchiesi@0
|
65
|
danielebarchiesi@0
|
66 $context->restrictions['type'] = array($data->type);
|
danielebarchiesi@0
|
67 return $context;
|
danielebarchiesi@0
|
68 }
|
danielebarchiesi@0
|
69 }
|
danielebarchiesi@0
|
70
|
danielebarchiesi@0
|
71 function ctools_context_node_settings_form($form, &$form_state) {
|
danielebarchiesi@0
|
72 $conf = &$form_state['conf'];
|
danielebarchiesi@0
|
73
|
danielebarchiesi@0
|
74 $form['node'] = array(
|
danielebarchiesi@0
|
75 '#title' => t('Enter the title or NID of a node'),
|
danielebarchiesi@0
|
76 '#type' => 'textfield',
|
danielebarchiesi@0
|
77 '#maxlength' => 512,
|
danielebarchiesi@0
|
78 '#autocomplete_path' => 'ctools/autocomplete/node',
|
danielebarchiesi@0
|
79 '#weight' => -10,
|
danielebarchiesi@0
|
80 );
|
danielebarchiesi@0
|
81
|
danielebarchiesi@0
|
82 if (!empty($conf['nid'])) {
|
danielebarchiesi@0
|
83 $info = db_query('SELECT * FROM {node} WHERE nid = :nid', array(':nid' => $conf['nid']))->fetchObject();
|
danielebarchiesi@0
|
84 if ($info) {
|
danielebarchiesi@0
|
85 $link = l(t("'%title' [node id %nid]", array('%title' => $info->title, '%nid' => $info->nid)), "node/$info->nid", array('attributes' => array('target' => '_blank', 'title' => t('Open in new window')), 'html' => TRUE));
|
danielebarchiesi@0
|
86 $form['node']['#description'] = t('Currently set to !link', array('!link' => $link));
|
danielebarchiesi@0
|
87 }
|
danielebarchiesi@0
|
88 }
|
danielebarchiesi@0
|
89
|
danielebarchiesi@0
|
90 $form['nid'] = array(
|
danielebarchiesi@0
|
91 '#type' => 'value',
|
danielebarchiesi@0
|
92 '#value' => $conf['nid'],
|
danielebarchiesi@0
|
93 );
|
danielebarchiesi@0
|
94
|
danielebarchiesi@0
|
95 $form['set_identifier'] = array(
|
danielebarchiesi@0
|
96 '#type' => 'checkbox',
|
danielebarchiesi@0
|
97 '#default_value' => FALSE,
|
danielebarchiesi@0
|
98 '#title' => t('Reset identifier to node title'),
|
danielebarchiesi@0
|
99 '#description' => t('If checked, the identifier will be reset to the node title of the selected node.'),
|
danielebarchiesi@0
|
100 );
|
danielebarchiesi@0
|
101
|
danielebarchiesi@0
|
102 return $form;
|
danielebarchiesi@0
|
103 }
|
danielebarchiesi@0
|
104
|
danielebarchiesi@0
|
105 /**
|
danielebarchiesi@0
|
106 * Validate a node.
|
danielebarchiesi@0
|
107 */
|
danielebarchiesi@0
|
108 function ctools_context_node_settings_form_validate($form, &$form_state) {
|
danielebarchiesi@0
|
109 // Validate the autocomplete
|
danielebarchiesi@0
|
110 if (empty($form_state['values']['nid']) && empty($form_state['values']['node'])) {
|
danielebarchiesi@0
|
111 form_error($form['node'], t('You must select a node.'));
|
danielebarchiesi@0
|
112 return;
|
danielebarchiesi@0
|
113 }
|
danielebarchiesi@0
|
114
|
danielebarchiesi@0
|
115 if (empty($form_state['values']['node'])) {
|
danielebarchiesi@0
|
116 return;
|
danielebarchiesi@0
|
117 }
|
danielebarchiesi@0
|
118
|
danielebarchiesi@0
|
119 $nid = $form_state['values']['node'];
|
danielebarchiesi@0
|
120 $preg_matches = array();
|
danielebarchiesi@0
|
121 $match = preg_match('/\[id: (\d+)\]/', $nid, $preg_matches);
|
danielebarchiesi@0
|
122 if (!$match) {
|
danielebarchiesi@0
|
123 $match = preg_match('/^id: (\d+)/', $nid, $preg_matches);
|
danielebarchiesi@0
|
124 }
|
danielebarchiesi@0
|
125
|
danielebarchiesi@0
|
126 if ($match) {
|
danielebarchiesi@0
|
127 $nid = $preg_matches[1];
|
danielebarchiesi@0
|
128 }
|
danielebarchiesi@0
|
129 if (is_numeric($nid)) {
|
danielebarchiesi@0
|
130 $node = db_query('SELECT nid, status FROM {node} WHERE nid = :nid', array(':nid' => $nid))->fetchObject();
|
danielebarchiesi@0
|
131 }
|
danielebarchiesi@0
|
132 else {
|
danielebarchiesi@0
|
133 $node = db_query('SELECT nid, status FROM {node} WHERE LOWER(title) = LOWER(:title)', array(':title' => $nid))->fetchObject();
|
danielebarchiesi@0
|
134 }
|
danielebarchiesi@0
|
135
|
danielebarchiesi@0
|
136 // Do not allow unpublished nodes to be selected by unprivileged users
|
danielebarchiesi@0
|
137 if (!$node || (empty($node->status) && !(user_access('administer nodes')))) {
|
danielebarchiesi@0
|
138 form_error($form['node'], t('Invalid node selected.'));
|
danielebarchiesi@0
|
139 }
|
danielebarchiesi@0
|
140 else {
|
danielebarchiesi@0
|
141 form_set_value($form['nid'], $node->nid, $form_state);
|
danielebarchiesi@0
|
142 }
|
danielebarchiesi@0
|
143 }
|
danielebarchiesi@0
|
144
|
danielebarchiesi@0
|
145 function ctools_context_node_settings_form_submit($form, &$form_state) {
|
danielebarchiesi@0
|
146 if ($form_state['values']['set_identifier']) {
|
danielebarchiesi@0
|
147 $node = node_load($form_state['values']['nid']);
|
danielebarchiesi@0
|
148 $form_state['values']['identifier'] = $node->title;
|
danielebarchiesi@0
|
149 }
|
danielebarchiesi@0
|
150
|
danielebarchiesi@0
|
151 // This will either be the value set previously or a value set by the
|
danielebarchiesi@0
|
152 // validator.
|
danielebarchiesi@0
|
153 $form_state['conf']['nid'] = $form_state['values']['nid'];
|
danielebarchiesi@0
|
154 }
|
danielebarchiesi@0
|
155
|
danielebarchiesi@0
|
156 /**
|
danielebarchiesi@0
|
157 * Provide a list of ways that this context can be converted to a string.
|
danielebarchiesi@0
|
158 */
|
danielebarchiesi@0
|
159 function ctools_context_node_convert_list() {
|
danielebarchiesi@0
|
160 $tokens = token_info();
|
danielebarchiesi@0
|
161 foreach ($tokens['tokens']['node'] as $id => $info) {
|
danielebarchiesi@0
|
162 if (!isset($list[$id])) {
|
danielebarchiesi@0
|
163 $list[$id] = $info['name'];
|
danielebarchiesi@0
|
164 }
|
danielebarchiesi@0
|
165 }
|
danielebarchiesi@0
|
166
|
danielebarchiesi@0
|
167 return $list;
|
danielebarchiesi@0
|
168 }
|
danielebarchiesi@0
|
169
|
danielebarchiesi@0
|
170 /**
|
danielebarchiesi@0
|
171 * Convert a context into a string.
|
danielebarchiesi@0
|
172 */
|
danielebarchiesi@0
|
173 function ctools_context_node_convert($context, $type) {
|
danielebarchiesi@0
|
174 $tokens = token_info();
|
danielebarchiesi@0
|
175 if (isset($tokens['tokens']['node'][$type])) {
|
danielebarchiesi@0
|
176 $values = token_generate('node', array($type => $type), array('node' => $context->data));
|
danielebarchiesi@0
|
177 if (isset($values[$type])) {
|
danielebarchiesi@0
|
178 return $values[$type];
|
danielebarchiesi@0
|
179 }
|
danielebarchiesi@0
|
180 }
|
danielebarchiesi@0
|
181 }
|