danielebarchiesi@4
|
1 <?php
|
danielebarchiesi@4
|
2
|
danielebarchiesi@4
|
3 /**
|
danielebarchiesi@4
|
4 * @file
|
danielebarchiesi@4
|
5 * User interface for RDF.
|
danielebarchiesi@4
|
6 */
|
danielebarchiesi@4
|
7
|
danielebarchiesi@4
|
8 include_once(drupal_get_path('module', 'rdfx') . '/rdfx.inc');
|
danielebarchiesi@4
|
9
|
danielebarchiesi@4
|
10 /**
|
danielebarchiesi@4
|
11 * Implements hook_help().
|
danielebarchiesi@4
|
12 */
|
danielebarchiesi@4
|
13 function rdfui_help($path, $arg) {
|
danielebarchiesi@4
|
14 switch ($path) {
|
danielebarchiesi@4
|
15 case 'admin/structure/types/manage/%/rdf':
|
danielebarchiesi@4
|
16 return '<p>' . t('Manage the way this bundle and its fields are represented in RDF. The mappings defined here will be used to publish RDFa in the site\'s HTML pages.', array()) . '</p>';
|
danielebarchiesi@4
|
17 case 'admin/help#rdf':
|
danielebarchiesi@4
|
18 $output = '';
|
danielebarchiesi@4
|
19 $output .= '<h3>' . t('About') . '</h3>';
|
danielebarchiesi@4
|
20 $output .= '<p>' . t('The RDF UI module provides a user interface for altering a bundle\'s RDF mapping.') . '</p>';
|
danielebarchiesi@4
|
21 return $output;
|
danielebarchiesi@4
|
22 }
|
danielebarchiesi@4
|
23 }
|
danielebarchiesi@4
|
24
|
danielebarchiesi@4
|
25 /**
|
danielebarchiesi@4
|
26 * Implements hook_theme().
|
danielebarchiesi@4
|
27 */
|
danielebarchiesi@4
|
28 function rdfui_theme($path, $arg) {
|
danielebarchiesi@4
|
29 return array(
|
danielebarchiesi@4
|
30 'rdfui_term_autocomplete' => array(
|
danielebarchiesi@4
|
31 'render element' => 'term',
|
danielebarchiesi@4
|
32 ),
|
danielebarchiesi@4
|
33 );
|
danielebarchiesi@4
|
34 }
|
danielebarchiesi@4
|
35
|
danielebarchiesi@4
|
36 /**
|
danielebarchiesi@4
|
37 * Implements hook_permission().
|
danielebarchiesi@4
|
38 */
|
danielebarchiesi@4
|
39 function rdfui_permission() {
|
danielebarchiesi@4
|
40 return array(
|
danielebarchiesi@4
|
41 'administer RDF field mappings' => array(
|
danielebarchiesi@4
|
42 'title' => t('Change the RDF mappings for types and fields'),
|
danielebarchiesi@4
|
43 ),
|
danielebarchiesi@4
|
44 );
|
danielebarchiesi@4
|
45 }
|
danielebarchiesi@4
|
46
|
danielebarchiesi@4
|
47 /**
|
danielebarchiesi@4
|
48 * Implements hook_menu().
|
danielebarchiesi@4
|
49 */
|
danielebarchiesi@4
|
50 function rdfui_menu() {
|
danielebarchiesi@4
|
51 $items = array();
|
danielebarchiesi@4
|
52
|
danielebarchiesi@4
|
53 // Create tabs for all possible bundles.
|
danielebarchiesi@4
|
54 foreach (entity_get_info() as $entity_type => $info) {
|
danielebarchiesi@4
|
55 if ($info['fieldable']) {
|
danielebarchiesi@4
|
56 foreach ($info['bundles'] as $bundle_name => $bundle_info) {
|
danielebarchiesi@4
|
57 if (isset($bundle_info['admin'])) {
|
danielebarchiesi@4
|
58 // Extract informations from the bundle description.
|
danielebarchiesi@4
|
59 $path = $bundle_info['admin']['path'];
|
danielebarchiesi@4
|
60 $bundle_arg = isset($bundle_info['admin']['bundle argument']) ? $bundle_info['admin']['bundle argument'] : $bundle_name;
|
danielebarchiesi@4
|
61 $access = array_intersect_key($bundle_info['admin'], drupal_map_assoc(array('access callback', 'access arguments')));
|
danielebarchiesi@4
|
62 $instance_position = count(explode('/', $path)) + 1;
|
danielebarchiesi@4
|
63
|
danielebarchiesi@4
|
64 if ($entity_type == 'node') {
|
danielebarchiesi@4
|
65 $title = t('RDF Mappings');
|
danielebarchiesi@4
|
66 $weight = 2;
|
danielebarchiesi@4
|
67 }
|
danielebarchiesi@4
|
68 elseif ($entity_type == 'comment') {
|
danielebarchiesi@4
|
69 continue;
|
danielebarchiesi@4
|
70 $title = t('Comment RDF Mappings');
|
danielebarchiesi@4
|
71 $weight = 60;
|
danielebarchiesi@4
|
72 }
|
danielebarchiesi@4
|
73 else {
|
danielebarchiesi@4
|
74 $title = t('RDF Mappings');
|
danielebarchiesi@4
|
75 $weight = 50;
|
danielebarchiesi@4
|
76 }
|
danielebarchiesi@4
|
77
|
danielebarchiesi@4
|
78 $items["$path/rdf"] = array(
|
danielebarchiesi@4
|
79 'title' => $title,
|
danielebarchiesi@4
|
80 // @todo Load arguments are not necessary / are cruft, right?
|
danielebarchiesi@4
|
81 //'load arguments' => array($obj_type, $bundle_arg),
|
danielebarchiesi@4
|
82 'page callback' => 'drupal_get_form',
|
danielebarchiesi@4
|
83 'page arguments' => array('rdfui_admin_rdf_overview_form', $entity_type, $bundle_arg, $instance_position),
|
danielebarchiesi@4
|
84 'type' => MENU_LOCAL_TASK,
|
danielebarchiesi@4
|
85 'weight' => $weight,
|
danielebarchiesi@4
|
86 ) + $access;
|
danielebarchiesi@4
|
87 }
|
danielebarchiesi@4
|
88 }
|
danielebarchiesi@4
|
89 }
|
danielebarchiesi@4
|
90 }
|
danielebarchiesi@4
|
91
|
danielebarchiesi@4
|
92 $items['rdfui/classes/autocomplete'] = array(
|
danielebarchiesi@4
|
93 'title' => t('RDF classes autocomplete'),
|
danielebarchiesi@4
|
94 'page callback' => 'rdfui_classes_autocomplete',
|
danielebarchiesi@4
|
95 'access arguments' => array('administer RDF field mappings'),
|
danielebarchiesi@4
|
96 'type' => MENU_CALLBACK,
|
danielebarchiesi@4
|
97 );
|
danielebarchiesi@4
|
98
|
danielebarchiesi@4
|
99 $items['rdfui/datatype/autocomplete'] = array(
|
danielebarchiesi@4
|
100 'title' => t('RDF datatype autocomplete'),
|
danielebarchiesi@4
|
101 'page callback' => 'rdfui_datatype_autocomplete',
|
danielebarchiesi@4
|
102 'access arguments' => array('administer RDF field mappings'),
|
danielebarchiesi@4
|
103 'type' => MENU_CALLBACK,
|
danielebarchiesi@4
|
104 );
|
danielebarchiesi@4
|
105
|
danielebarchiesi@4
|
106 $items['rdfui/predicates/autocomplete'] = array(
|
danielebarchiesi@4
|
107 'title' => t('RDF predicates autocomplete'),
|
danielebarchiesi@4
|
108 'page callback' => 'rdfui_predicates_autocomplete',
|
danielebarchiesi@4
|
109 'access arguments' => array('administer RDF field mappings'),
|
danielebarchiesi@4
|
110 'type' => MENU_CALLBACK,
|
danielebarchiesi@4
|
111 );
|
danielebarchiesi@4
|
112
|
danielebarchiesi@4
|
113 return $items;
|
danielebarchiesi@4
|
114 }
|
danielebarchiesi@4
|
115
|
danielebarchiesi@4
|
116 /**
|
danielebarchiesi@4
|
117 * Menu callback; listing of field RDF mappings for a content type.
|
danielebarchiesi@4
|
118 *
|
danielebarchiesi@4
|
119 * Allows the content type to be mapped to a RDF class and
|
danielebarchiesi@4
|
120 * fields to be mapped to RDF properties.
|
danielebarchiesi@4
|
121 */
|
danielebarchiesi@4
|
122 function rdfui_admin_rdf_overview_form($form, &$form_state, $entity_type, $bundle, $instance) {
|
danielebarchiesi@4
|
123 $bundle = field_extract_bundle($entity_type, $bundle);
|
danielebarchiesi@4
|
124 $fields = field_info_instances($entity_type, $bundle);
|
danielebarchiesi@4
|
125 $mapping = rdf_mapping_load($entity_type, $bundle);
|
danielebarchiesi@4
|
126 // Don't make assumptions about entities and only get the type if dealing with a node entity
|
danielebarchiesi@4
|
127 $type = ($entity_type == 'node') ? node_type_get_type($bundle) : '';
|
danielebarchiesi@4
|
128 $form['rdf_mappings'] = array(
|
danielebarchiesi@4
|
129 '#type' => 'vertical_tabs',
|
danielebarchiesi@4
|
130 '#attached' => array(
|
danielebarchiesi@4
|
131 'js' => array(drupal_get_path('module', 'rdfui') . '/rdfui.js'),
|
danielebarchiesi@4
|
132 ),
|
danielebarchiesi@4
|
133 );
|
danielebarchiesi@4
|
134
|
danielebarchiesi@4
|
135 // Declare the fieldset and field for RDF type.
|
danielebarchiesi@4
|
136 $form['type'] = array(
|
danielebarchiesi@4
|
137 '#type' => 'fieldset',
|
danielebarchiesi@4
|
138 '#title' => t('Type'),
|
danielebarchiesi@4
|
139 '#group' => 'rdf_mappings',
|
danielebarchiesi@4
|
140 '#attributes' => array('class' => array('rdf-type')),
|
danielebarchiesi@4
|
141 );
|
danielebarchiesi@4
|
142 $form['type']['rdf_rdftype'] = array(
|
danielebarchiesi@4
|
143 '#type' => 'textarea',
|
danielebarchiesi@4
|
144 '#title' => t('RDF Type'),
|
danielebarchiesi@4
|
145 '#attached' => array(
|
danielebarchiesi@4
|
146 'js' => array(drupal_get_path('module', 'rdfui') . '/rdfui.js'),
|
danielebarchiesi@4
|
147 ),
|
danielebarchiesi@4
|
148 );
|
danielebarchiesi@4
|
149
|
danielebarchiesi@4
|
150 // Declare the fieldset and field for RDF type.
|
danielebarchiesi@4
|
151 $form['type'] = array(
|
danielebarchiesi@4
|
152 '#type' => 'fieldset',
|
danielebarchiesi@4
|
153 '#title' => t('Type'),
|
danielebarchiesi@4
|
154 '#group' => 'rdf_mappings',
|
danielebarchiesi@4
|
155 '#attributes' => array('class' => array('rdf-field')),
|
danielebarchiesi@4
|
156 );
|
danielebarchiesi@4
|
157 $form['type']['rdf_rdftype'] = array(
|
danielebarchiesi@4
|
158 '#type' => 'textarea',
|
danielebarchiesi@4
|
159 '#title' => t('RDF Type'),
|
danielebarchiesi@4
|
160 '#attributes' => array('class' => array('rdf-field')),
|
danielebarchiesi@4
|
161 );
|
danielebarchiesi@4
|
162
|
danielebarchiesi@4
|
163 // If this entity is a node and has a title display a fieldset for mapping.
|
danielebarchiesi@4
|
164 if (isset($type->has_title)) {
|
danielebarchiesi@4
|
165 $form['rdf_title'] = array(
|
danielebarchiesi@4
|
166 '#type' => 'fieldset',
|
danielebarchiesi@4
|
167 '#group' => 'rdf_mappings',
|
danielebarchiesi@4
|
168 '#title' => $type->title_label,
|
danielebarchiesi@4
|
169 '#attributes' => array('class' => array('rdf-field')),
|
danielebarchiesi@4
|
170 );
|
danielebarchiesi@4
|
171 // Add the options for this entity's title.
|
danielebarchiesi@4
|
172 rdfui_predicate_fieldset($form['rdf_title'], $mapping, 'title', 'title');
|
danielebarchiesi@4
|
173 }
|
danielebarchiesi@4
|
174
|
danielebarchiesi@4
|
175 // Add the field for RDF type.
|
danielebarchiesi@4
|
176 rdfui_rdftype_fieldset($form['type']['rdf_rdftype'], $mapping);
|
danielebarchiesi@4
|
177 // Add the options for all other fields.
|
danielebarchiesi@4
|
178 foreach ($fields as $field) {
|
danielebarchiesi@4
|
179 $label = $field['label'];
|
danielebarchiesi@4
|
180 $field_name = $field['field_name'];
|
danielebarchiesi@4
|
181 $form[$field_name] = array(
|
danielebarchiesi@4
|
182 '#type' => 'fieldset',
|
danielebarchiesi@4
|
183 '#group' => 'rdf_mappings',
|
danielebarchiesi@4
|
184 '#title' => t('@label', array('@label' => $label)),
|
danielebarchiesi@4
|
185 '#attributes' => array('class' => array('rdf-field')),
|
danielebarchiesi@4
|
186 );
|
danielebarchiesi@4
|
187 rdfui_predicate_fieldset($form[$field_name], $mapping, $field_name, $label);
|
danielebarchiesi@4
|
188 }
|
danielebarchiesi@4
|
189
|
danielebarchiesi@4
|
190 $form['field_names'] = array('#type' => 'value', '#value' => array_keys($fields));
|
danielebarchiesi@4
|
191 $form['submit'] = array('#type' => 'submit', '#value' => t('Save mappings'));
|
danielebarchiesi@4
|
192
|
danielebarchiesi@4
|
193 // @todo where is RDFUI_CURIE_REGEX declared?
|
danielebarchiesi@4
|
194 // drupal_add_js(array('rdfui' => array('termRegex' => RDFUI_CURIE_REGEX)), 'setting');
|
danielebarchiesi@4
|
195 return $form;
|
danielebarchiesi@4
|
196 }
|
danielebarchiesi@4
|
197
|
danielebarchiesi@4
|
198 /**
|
danielebarchiesi@4
|
199 * Implements hook_form_FORM_ID_alter().
|
danielebarchiesi@4
|
200 */
|
danielebarchiesi@4
|
201 function rdfui_form_field_ui_field_edit_form_alter(&$form, &$form_state) {
|
danielebarchiesi@4
|
202
|
danielebarchiesi@4
|
203 $field_name = $form['#field']['field_name'];
|
danielebarchiesi@4
|
204 $instance = $form['instance'];
|
danielebarchiesi@4
|
205 $label = isset($instance['label']) ? $instance['label']['#default_value'] : $instance['field_name'];
|
danielebarchiesi@4
|
206 $entity_type = $instance['entity_type']['#value'];
|
danielebarchiesi@4
|
207 $mapping = rdf_mapping_load($entity_type, $instance['bundle']['#value']);
|
danielebarchiesi@4
|
208
|
danielebarchiesi@4
|
209 $form['rdf'] = array(
|
danielebarchiesi@4
|
210 '#type' => 'fieldset',
|
danielebarchiesi@4
|
211 '#title' => t('@label RDF Mapping', array('@label' => $label)),
|
danielebarchiesi@4
|
212 );
|
danielebarchiesi@4
|
213
|
danielebarchiesi@4
|
214 // add the predicate, datatype, etc fields
|
danielebarchiesi@4
|
215 rdfui_predicate_fieldset($form['rdf'], $mapping, $field_name, $label);
|
danielebarchiesi@4
|
216
|
danielebarchiesi@4
|
217 $form['submit']['#weight'] = 1;
|
danielebarchiesi@4
|
218
|
danielebarchiesi@4
|
219 // add submit and validate handlers
|
danielebarchiesi@4
|
220 $form['#validate'] = array_merge($form['#validate'], array('rdfui_form_field_ui_field_edit_form_validate'));
|
danielebarchiesi@4
|
221 $form['#submit'] = array_merge($form['#submit'], array('rdfui_form_field_ui_field_edit_form_submit'));
|
danielebarchiesi@4
|
222
|
danielebarchiesi@4
|
223 // drupal_add_js(array('rdfui'=>array('termRegex'=>RDFUI_CURIE_REGEX)), 'setting');
|
danielebarchiesi@4
|
224 }
|
danielebarchiesi@4
|
225
|
danielebarchiesi@4
|
226 /**
|
danielebarchiesi@4
|
227 * Implements hook_form_FORM_ID_alter().
|
danielebarchiesi@4
|
228 */
|
danielebarchiesi@4
|
229 function rdfui_form_node_type_form_alter(&$form, &$form_state) {
|
danielebarchiesi@4
|
230 $mapping = array();
|
danielebarchiesi@4
|
231 // If we are editing an existing content type, the mapping will be available
|
danielebarchiesi@4
|
232 // via the bundles in entity info.
|
danielebarchiesi@4
|
233 if ($bundle = $form['type']['#default_value']) {
|
danielebarchiesi@4
|
234 $entity = entity_get_info('node');
|
danielebarchiesi@4
|
235 $mapping = $entity['bundles'][$bundle]['rdf_mapping'];
|
danielebarchiesi@4
|
236 }
|
danielebarchiesi@4
|
237
|
danielebarchiesi@4
|
238 $form['rdf_settings'] = array(
|
danielebarchiesi@4
|
239 '#type' => 'fieldset',
|
danielebarchiesi@4
|
240 '#title' => 'RDF Settings',
|
danielebarchiesi@4
|
241 '#collapsible' => TRUE,
|
danielebarchiesi@4
|
242 '#collapsed' => TRUE,
|
danielebarchiesi@4
|
243 '#group' => 'additional_settings'
|
danielebarchiesi@4
|
244 );
|
danielebarchiesi@4
|
245 $form['rdf_settings']['rdf_rdftype'] = array(
|
danielebarchiesi@4
|
246 '#type' => 'fieldset',
|
danielebarchiesi@4
|
247 '#title' => 'RDF Type',
|
danielebarchiesi@4
|
248 );
|
danielebarchiesi@4
|
249 $form['rdf_settings']['rdf_title'] = array(
|
danielebarchiesi@4
|
250 '#type' => 'fieldset',
|
danielebarchiesi@4
|
251 '#title' => 'RDF Title Predicate',
|
danielebarchiesi@4
|
252 );
|
danielebarchiesi@4
|
253
|
danielebarchiesi@4
|
254 // Add the RDF type field for the bundle.
|
danielebarchiesi@4
|
255 rdfui_rdftype_fieldset($form['rdf_settings']['rdf_rdftype'], $mapping);
|
danielebarchiesi@4
|
256 //Add the predicate, datatype, property fields for the bundle title.
|
danielebarchiesi@4
|
257 rdfui_predicate_fieldset($form['rdf_settings']['rdf_title'], $mapping, 'title', 'title');
|
danielebarchiesi@4
|
258
|
danielebarchiesi@4
|
259 // add submit and validate handlers
|
danielebarchiesi@4
|
260 $form['#validate'] = array_merge($form['#validate'], array('rdfui_form_node_type_form_validate'));
|
danielebarchiesi@4
|
261 $form['#submit'] = array_merge($form['#submit'], array('rdfui_form_node_type_form_submit'));
|
danielebarchiesi@4
|
262
|
danielebarchiesi@4
|
263 // drupal_add_js(array('rdfui'=>array('termRegex'=>RDFUI_CURIE_REGEX)), 'setting');
|
danielebarchiesi@4
|
264 }
|
danielebarchiesi@4
|
265
|
danielebarchiesi@4
|
266
|
danielebarchiesi@4
|
267 function rdfui_form_field_ui_field_edit_form_validate($form, &$form_state) {
|
danielebarchiesi@4
|
268 $field_name = $form['#field']['field_name'];
|
danielebarchiesi@4
|
269
|
danielebarchiesi@4
|
270 _rdfui_validate_terms($form_state, $field_name);
|
danielebarchiesi@4
|
271 _rdfui_validate_datatype($form_state, $field_name);
|
danielebarchiesi@4
|
272 }
|
danielebarchiesi@4
|
273
|
danielebarchiesi@4
|
274 function rdfui_admin_rdf_overview_form_validate($form, &$form_state) {
|
danielebarchiesi@4
|
275 // Validate bundle's RDF type(s).
|
danielebarchiesi@4
|
276 _rdfui_validate_terms($form_state);
|
danielebarchiesi@4
|
277
|
danielebarchiesi@4
|
278 // Validate title predicate(s).
|
danielebarchiesi@4
|
279 if ((isset($form_state['input']['rdf_title_type']))) {
|
danielebarchiesi@4
|
280 $field_name = 'title';
|
danielebarchiesi@4
|
281 _rdfui_validate_terms($form_state, $field_name);
|
danielebarchiesi@4
|
282 _rdfui_validate_datatype($form_state, $field_name);
|
danielebarchiesi@4
|
283 }
|
danielebarchiesi@4
|
284
|
danielebarchiesi@4
|
285 // Validate predicates for all fields.
|
danielebarchiesi@4
|
286 foreach ($form_state['values']['field_names'] as $field_name) {
|
danielebarchiesi@4
|
287 _rdfui_validate_terms($form_state, $field_name);
|
danielebarchiesi@4
|
288 _rdfui_validate_datatype($form_state, $field_name);
|
danielebarchiesi@4
|
289 }
|
danielebarchiesi@4
|
290 }
|
danielebarchiesi@4
|
291
|
danielebarchiesi@4
|
292 function rdfui_form_node_type_form_validate($form, &$form_state) {
|
danielebarchiesi@4
|
293 // Validate bundle's RDF type(s).
|
danielebarchiesi@4
|
294 _rdfui_validate_terms($form_state);
|
danielebarchiesi@4
|
295
|
danielebarchiesi@4
|
296 // Validate title predicate(s).
|
danielebarchiesi@4
|
297 if ((isset($form_state['input']['rdf_title_type']))) {
|
danielebarchiesi@4
|
298 $field_name = 'title';
|
danielebarchiesi@4
|
299 _rdfui_validate_terms($form_state, $field_name);
|
danielebarchiesi@4
|
300 _rdfui_validate_datatype($form_state, $field_name);
|
danielebarchiesi@4
|
301 }
|
danielebarchiesi@4
|
302 }
|
danielebarchiesi@4
|
303
|
danielebarchiesi@4
|
304 /**
|
danielebarchiesi@4
|
305 * Saves RDF mapping for all fields and node type.
|
danielebarchiesi@4
|
306 */
|
danielebarchiesi@4
|
307 function rdfui_admin_rdf_overview_form_submit($form, &$form_state) {
|
danielebarchiesi@4
|
308 $entity_type = $form_state['build_info']['args'][0];
|
danielebarchiesi@4
|
309 // @todo somehow $form_state['build_info']['args'][1] is an object for the
|
danielebarchiesi@4
|
310 // node RDF mapping but a string 'user' for the user RDF mapping.
|
danielebarchiesi@4
|
311 if (isset($form_state['build_info']['args'][1]->type)) {
|
danielebarchiesi@4
|
312 $bundle = $form_state['build_info']['args'][1]->type;
|
danielebarchiesi@4
|
313 }
|
danielebarchiesi@4
|
314 elseif ($form_state['build_info']['args'][0] == 'taxonomy_term') {
|
danielebarchiesi@4
|
315 $bundle = $form_state['build_info']['args'][1]->machine_name;
|
danielebarchiesi@4
|
316 }
|
danielebarchiesi@4
|
317 else {
|
danielebarchiesi@4
|
318 $bundle = $form_state['build_info']['args'][1];
|
danielebarchiesi@4
|
319 }
|
danielebarchiesi@4
|
320 _rdfui_mapping_save($form_state, $entity_type, $bundle, 'title');
|
danielebarchiesi@4
|
321
|
danielebarchiesi@4
|
322 foreach ($form_state['values']['field_names'] as $field_name) {
|
danielebarchiesi@4
|
323 _rdfui_mapping_save($form_state, $entity_type, $bundle, $field_name);
|
danielebarchiesi@4
|
324 }
|
danielebarchiesi@4
|
325 drupal_set_message(t('RDF mappings have been saved.'), 'status');
|
danielebarchiesi@4
|
326 }
|
danielebarchiesi@4
|
327
|
danielebarchiesi@4
|
328 /**
|
danielebarchiesi@4
|
329 * Saves RDF mapping for individual field.
|
danielebarchiesi@4
|
330 */
|
danielebarchiesi@4
|
331 function rdfui_form_field_ui_field_edit_form_submit($form, &$form_state) {
|
danielebarchiesi@4
|
332 $entity_type = $form['instance']['entity_type']['#value'];
|
danielebarchiesi@4
|
333 $bundle = $form['instance']['bundle']['#value'];
|
danielebarchiesi@4
|
334 $field_name = $form['#field']['field_name'];
|
danielebarchiesi@4
|
335
|
danielebarchiesi@4
|
336 _rdfui_mapping_save($form_state, $entity_type, $bundle, $field_name);
|
danielebarchiesi@4
|
337 }
|
danielebarchiesi@4
|
338
|
danielebarchiesi@4
|
339 /**
|
danielebarchiesi@4
|
340 * Saves RDF mapping for Title field.
|
danielebarchiesi@4
|
341 */
|
danielebarchiesi@4
|
342 function rdfui_form_node_type_form_submit($form, &$form_state) {
|
danielebarchiesi@4
|
343 $entity_type = 'node';
|
danielebarchiesi@4
|
344 $bundle = $form_state['input']['type'];
|
danielebarchiesi@4
|
345 // We only need to call _rdfui_mapping_save once because it checks whether
|
danielebarchiesi@4
|
346 // rdf_type is set in the form before saving the field value.
|
danielebarchiesi@4
|
347 _rdfui_mapping_save($form_state, $entity_type, $bundle, 'title');
|
danielebarchiesi@4
|
348 }
|
danielebarchiesi@4
|
349
|
danielebarchiesi@4
|
350 /**
|
danielebarchiesi@4
|
351 * Menu callback for classes autocomplete
|
danielebarchiesi@4
|
352 */
|
danielebarchiesi@4
|
353 function rdfui_classes_autocomplete($string) {
|
danielebarchiesi@4
|
354 // The user enters a comma-separated list of classes. We only autocomplete
|
danielebarchiesi@4
|
355 // the last class.
|
danielebarchiesi@4
|
356 $classes_typed = drupal_explode_tags($string);
|
danielebarchiesi@4
|
357 $class_last = drupal_strtolower(array_pop($classes_typed));
|
danielebarchiesi@4
|
358
|
danielebarchiesi@4
|
359 $matches = array();
|
danielebarchiesi@4
|
360 if ($class_last != '') {
|
danielebarchiesi@4
|
361 $classes = array();
|
danielebarchiesi@4
|
362 $classes_entered = count($classes_typed) ? implode(', ', $classes_typed) . ', ' : '';
|
danielebarchiesi@4
|
363 $class_tids = rdfx_get_classes();
|
danielebarchiesi@4
|
364 foreach ($class_tids as $class_tid) {
|
danielebarchiesi@4
|
365 $class = rdfx_curie($class_tid) . ', ';
|
danielebarchiesi@4
|
366 if (preg_match("/$class_last/", $class)) {
|
danielebarchiesi@4
|
367 $details = _rdfx_get_term_details($class_tid);
|
danielebarchiesi@4
|
368 $details->curie = $class;
|
danielebarchiesi@4
|
369 $matches[$classes_entered . $class] = theme('rdfui_term_autocomplete', array('term' => $details,));
|
danielebarchiesi@4
|
370 }
|
danielebarchiesi@4
|
371 }
|
danielebarchiesi@4
|
372 }
|
danielebarchiesi@4
|
373 drupal_json_output($matches);
|
danielebarchiesi@4
|
374 }
|
danielebarchiesi@4
|
375
|
danielebarchiesi@4
|
376 /**
|
danielebarchiesi@4
|
377 * Menu callback for datatype autocomplete
|
danielebarchiesi@4
|
378 */
|
danielebarchiesi@4
|
379 function rdfui_datatype_autocomplete($string) {
|
danielebarchiesi@4
|
380
|
danielebarchiesi@4
|
381 //@todo Make sure datatype is only active if property is the relationship.
|
danielebarchiesi@4
|
382
|
danielebarchiesi@4
|
383 $datatypes = 'xsd:string, xsd:boolean, xsd:decimal, xsd:float, xsd:double, xsd:dateTime, xsd:time, xsd:date, xsd:gYearMonth, xsd:gYear, xsd:gMonthDay, xsd:gDay, xsd:gMonth, xsd:hexBinary, xsd:base64Binary, xsd:anyURI, xsd:normalizedString, xsd:token, xsd:language, xsd:NMTOKEN, xsd:Name, xsd:NCName, xsd:integer, xsd:nonPositiveInteger, xsd:negativeInteger, xsd:long, xsd:int, xsd:short, xsd:byte, xsd:nonNegativeInteger, xsd:unsignedLong, xsd:unsignedInt, xsd:unsignedShort, xsd:unsignedByte, xsd:positiveInteger';
|
danielebarchiesi@4
|
384
|
danielebarchiesi@4
|
385 $datatypes = explode(', ', $datatypes);
|
danielebarchiesi@4
|
386 $matches = array();
|
danielebarchiesi@4
|
387
|
danielebarchiesi@4
|
388 foreach($datatypes as $datatype) {
|
danielebarchiesi@4
|
389 if (preg_match("/^$string/", $datatype))
|
danielebarchiesi@4
|
390 $matches[$datatype] = $datatype;
|
danielebarchiesi@4
|
391 }
|
danielebarchiesi@4
|
392
|
danielebarchiesi@4
|
393 drupal_json_output($matches);
|
danielebarchiesi@4
|
394 }
|
danielebarchiesi@4
|
395
|
danielebarchiesi@4
|
396 /**
|
danielebarchiesi@4
|
397 * Menu callback for predicates autocomplete
|
danielebarchiesi@4
|
398 */
|
danielebarchiesi@4
|
399 function rdfui_predicates_autocomplete($string) {
|
danielebarchiesi@4
|
400 // The user enters a comma-separated list of predicates. We only autocomplete
|
danielebarchiesi@4
|
401 // the last predicate.
|
danielebarchiesi@4
|
402 $predicates_typed = drupal_explode_tags($string);
|
danielebarchiesi@4
|
403 $predicate_last = drupal_strtolower(array_pop($predicates_typed));
|
danielebarchiesi@4
|
404
|
danielebarchiesi@4
|
405 $matches = array();
|
danielebarchiesi@4
|
406 if ($predicate_last != '') {
|
danielebarchiesi@4
|
407 $predicates = array();
|
danielebarchiesi@4
|
408 $predicates_entered = count($predicates_typed) ? implode(', ', $predicates_typed) . ', ' : '';
|
danielebarchiesi@4
|
409 $predicate_tids = rdfx_get_properties();
|
danielebarchiesi@4
|
410 foreach ($predicate_tids as $predicate_tid) {
|
danielebarchiesi@4
|
411 $predicate = rdfx_curie($predicate_tid) . ', ';
|
danielebarchiesi@4
|
412 if (preg_match("/$predicate_last/", $predicate)) {
|
danielebarchiesi@4
|
413 $details = _rdfx_get_term_details($predicate_tid);
|
danielebarchiesi@4
|
414 $details->curie = $predicate;
|
danielebarchiesi@4
|
415 $matches[$predicates_entered . $predicate] = theme('rdfui_term_autocomplete', array('term' => $details,));
|
danielebarchiesi@4
|
416 }
|
danielebarchiesi@4
|
417 }
|
danielebarchiesi@4
|
418 }
|
danielebarchiesi@4
|
419 drupal_json_output($matches);
|
danielebarchiesi@4
|
420 }
|
danielebarchiesi@4
|
421
|
danielebarchiesi@4
|
422
|
danielebarchiesi@4
|
423 /**
|
danielebarchiesi@4
|
424 * appends the rdf form fields to a fieldset dedicated to a fields.module field
|
danielebarchiesi@4
|
425 */
|
danielebarchiesi@4
|
426 function rdfui_predicate_fieldset(&$fieldset, $mapping, $field_name, $label) {
|
danielebarchiesi@4
|
427 $fieldset['rdf_'. $field_name .'_predicates'] = array(
|
danielebarchiesi@4
|
428 '#type' => 'textfield',
|
danielebarchiesi@4
|
429 '#autocomplete_path' => 'rdfui/predicates/autocomplete',
|
danielebarchiesi@4
|
430 '#title' => t('RDF Predicates'),
|
danielebarchiesi@4
|
431 '#default_value' => empty($mapping[$field_name]['predicates']) ? '' : implode(", ",$mapping[$field_name]['predicates']),
|
danielebarchiesi@4
|
432 '#description' => t('Enter a comma-separated list of predicates for %label using CURIE syntax. For example: %predicates',
|
danielebarchiesi@4
|
433 array(
|
danielebarchiesi@4
|
434 '%label' => $label,
|
danielebarchiesi@4
|
435 '%predicates' => 'foaf:familyName, foaf:lastName'
|
danielebarchiesi@4
|
436 )
|
danielebarchiesi@4
|
437 ),
|
danielebarchiesi@4
|
438 '#resizable' => FALSE,
|
danielebarchiesi@4
|
439 );
|
danielebarchiesi@4
|
440
|
danielebarchiesi@4
|
441 $fieldset['rdf_'. $field_name .'_type'] = array(
|
danielebarchiesi@4
|
442 '#type' => 'select',
|
danielebarchiesi@4
|
443 '#title' => t('Attribute Type'),
|
danielebarchiesi@4
|
444 '#default_value' => empty($mapping[$field_name]['type']) ? 'property' : $mapping[$field_name]['type'],
|
danielebarchiesi@4
|
445 '#description' => t('For fields containing literals—things such as plain text, html, numbers—use the !property attribute. For fields containing references to other things—urls and node references, for example—use the !rel or !rev attribute.',
|
danielebarchiesi@4
|
446 array(
|
danielebarchiesi@4
|
447 '%label' => $label,
|
danielebarchiesi@4
|
448 '!property' => l('property', 'http://www.w3.org/2006/07/SWD/RDFa/syntax/#id103203'),
|
danielebarchiesi@4
|
449 '!rel' => l('rel','http://www.w3.org/2006/07/SWD/RDFa/syntax/#id103235'),
|
danielebarchiesi@4
|
450 '!rev' => l('rev','http://www.w3.org/2006/07/SWD/RDFa/syntax/#id103282')
|
danielebarchiesi@4
|
451 )
|
danielebarchiesi@4
|
452 ),
|
danielebarchiesi@4
|
453 '#options' => array('property'=>'property', 'rel'=>'rel', 'rev'=>'rev'),
|
danielebarchiesi@4
|
454 '#attributes' => array('class' => array('rdf-attribute-type')),
|
danielebarchiesi@4
|
455 );
|
danielebarchiesi@4
|
456
|
danielebarchiesi@4
|
457 // @todo Possibly autocomplete the builtin xsd datatypes, but do not restrict to xsd datatypes.
|
danielebarchiesi@4
|
458 $fieldset['rdf_'. $field_name .'_datatype'] = array(
|
danielebarchiesi@4
|
459 '#type' => 'textfield',
|
danielebarchiesi@4
|
460 '#title' => t('Datatype'),
|
danielebarchiesi@4
|
461 '#autocomplete_path' => 'rdfui/datatype/autocomplete',
|
danielebarchiesi@4
|
462 '#default_value' => empty($mapping[$field_name]['datatype']) ? '' : $mapping[$field_name]['datatype'],
|
danielebarchiesi@4
|
463 '#description' => t('Enter the datatype for %label using CURIE syntax. For a list of common datatypes, see !link.',
|
danielebarchiesi@4
|
464 array(
|
danielebarchiesi@4
|
465 '%label' => $label,
|
danielebarchiesi@4
|
466 '!link' => l('XML Schema datatypes', 'http://www.w3.org/TR/2004/REC-rdf-mt-20040210/#dtype_interp', array('attributes' => array('target' => '_blank'))),
|
danielebarchiesi@4
|
467 )
|
danielebarchiesi@4
|
468 ),
|
danielebarchiesi@4
|
469 '#states' => array(
|
danielebarchiesi@4
|
470 'visible' => array(
|
danielebarchiesi@4
|
471 ':input[name="rdf_' . $field_name . '_type"]' => array('value' => 'property'),
|
danielebarchiesi@4
|
472 ),
|
danielebarchiesi@4
|
473 ),
|
danielebarchiesi@4
|
474 );
|
danielebarchiesi@4
|
475 drupal_add_css(drupal_get_path('module', 'rdfui') .'/css/rdfui.css', 'file');
|
danielebarchiesi@4
|
476 }
|
danielebarchiesi@4
|
477
|
danielebarchiesi@4
|
478 /**
|
danielebarchiesi@4
|
479 * Appends the RDF type fieldset. Because this fieldset is always on the same
|
danielebarchiesi@4
|
480 * page as fields created by rdfui_predicate_fieldset(), which add the css and
|
danielebarchiesi@4
|
481 * js files, we do not add the files again.
|
danielebarchiesi@4
|
482 *
|
danielebarchiesi@4
|
483 */
|
danielebarchiesi@4
|
484 function rdfui_rdftype_fieldset(&$fieldset, $mapping) {
|
danielebarchiesi@4
|
485 $fieldset = array(
|
danielebarchiesi@4
|
486 '#type' => 'textfield',
|
danielebarchiesi@4
|
487 '#autocomplete_path' => 'rdfui/classes/autocomplete',
|
danielebarchiesi@4
|
488 '#title' => t('RDF Type'),
|
danielebarchiesi@4
|
489 '#default_value' => empty($mapping['rdftype']) ? '' : implode(", ",$mapping['rdftype']),
|
danielebarchiesi@4
|
490 '#description' => t('Enter a comma-separated list of classes for this bundle using CURIE syntax. For example: %classes', array('%classes' => 'sioc:Item, foaf:Document')),
|
danielebarchiesi@4
|
491 );
|
danielebarchiesi@4
|
492 }
|
danielebarchiesi@4
|
493
|
danielebarchiesi@4
|
494 /**
|
danielebarchiesi@4
|
495 * Sets a form error if predicates don't validate.
|
danielebarchiesi@4
|
496 */
|
danielebarchiesi@4
|
497 function _rdfui_validate_terms($form_state, $field_name = '') {
|
danielebarchiesi@4
|
498 // If the field_name is NOT NULL, then this is a predicate. If it is NULL,
|
danielebarchiesi@4
|
499 // this is a type.
|
danielebarchiesi@4
|
500 $field_id = $field_name != NULL ? 'rdf_'. $field_name .'_predicates' : 'rdf_rdftype';
|
danielebarchiesi@4
|
501
|
danielebarchiesi@4
|
502 // Validate terms.
|
danielebarchiesi@4
|
503 if ($terms = trim($form_state['values'][$field_id])) {
|
danielebarchiesi@4
|
504 $terms = rdfui_extract_curies($terms);
|
danielebarchiesi@4
|
505 $rdf_namespaces = module_invoke_all('rdf_namespaces');
|
danielebarchiesi@4
|
506 $errors = array();
|
danielebarchiesi@4
|
507 $warnings = array();
|
danielebarchiesi@4
|
508
|
danielebarchiesi@4
|
509 foreach($terms as $term) {
|
danielebarchiesi@4
|
510 // Ensure this is a CURIE.
|
danielebarchiesi@4
|
511 if (!preg_match(QNAME, $term)){
|
danielebarchiesi@4
|
512 // @todo Add a page to the drupal docs about CURIE format and adding
|
danielebarchiesi@4
|
513 // namespaces. Then add a link to this error that says 'For more info'.
|
danielebarchiesi@4
|
514 $errors[] = t('Term %term must be in CURIE format.', array('%term'=>$term));
|
danielebarchiesi@4
|
515 }
|
danielebarchiesi@4
|
516 else {
|
danielebarchiesi@4
|
517 // Check the prefixes to ensure they are bound. If not, issue a warning.
|
danielebarchiesi@4
|
518 $term_parts = explode(':', $term);
|
danielebarchiesi@4
|
519 $prefix = $term_parts[0];
|
danielebarchiesi@4
|
520 if (!isset($rdf_namespaces[$prefix])) {
|
danielebarchiesi@4
|
521 $warnings[] = t('Term %term uses unmapped prefix %prefix. Please map the prefix in !rdf_publishing.',
|
danielebarchiesi@4
|
522 array(
|
danielebarchiesi@4
|
523 '%term' => $term,
|
danielebarchiesi@4
|
524 '%prefix' => $prefix,
|
danielebarchiesi@4
|
525 '!rdf_publishing' => l(t('RDF publishing settings'), 'admin/config/services/rdf/namespaces'),
|
danielebarchiesi@4
|
526 )
|
danielebarchiesi@4
|
527 );
|
danielebarchiesi@4
|
528 }
|
danielebarchiesi@4
|
529 }
|
danielebarchiesi@4
|
530 }
|
danielebarchiesi@4
|
531
|
danielebarchiesi@4
|
532 if (!empty($errors)) {
|
danielebarchiesi@4
|
533 foreach ($errors as $error) {
|
danielebarchiesi@4
|
534 form_set_error($field_id, $error);
|
danielebarchiesi@4
|
535 }
|
danielebarchiesi@4
|
536 }
|
danielebarchiesi@4
|
537 if (!empty($warnings)) {
|
danielebarchiesi@4
|
538 foreach ($warnings as $warning) {
|
danielebarchiesi@4
|
539 drupal_set_message($warning, $type='warning');
|
danielebarchiesi@4
|
540 }
|
danielebarchiesi@4
|
541 }
|
danielebarchiesi@4
|
542 }
|
danielebarchiesi@4
|
543 }
|
danielebarchiesi@4
|
544
|
danielebarchiesi@4
|
545 /**
|
danielebarchiesi@4
|
546 * Sets a form error if datatype don't validate.
|
danielebarchiesi@4
|
547 */
|
danielebarchiesi@4
|
548 function _rdfui_validate_datatype($form_state, $field_name) {
|
danielebarchiesi@4
|
549
|
danielebarchiesi@4
|
550 // validate datatype
|
danielebarchiesi@4
|
551 if ($datatype = trim($form_state['values']['rdf_'. $field_name .'_datatype'])) {
|
danielebarchiesi@4
|
552 if(!preg_match(QNAME, $datatype))
|
danielebarchiesi@4
|
553 form_set_error('rdf_'. $field_name .'_datatype', t('Datatype %datatype is an invalid format.', array('%datatype'=>$datatype)));
|
danielebarchiesi@4
|
554 }
|
danielebarchiesi@4
|
555
|
danielebarchiesi@4
|
556 }
|
danielebarchiesi@4
|
557
|
danielebarchiesi@4
|
558 /**
|
danielebarchiesi@4
|
559 * Saves the mapping
|
danielebarchiesi@4
|
560 */
|
danielebarchiesi@4
|
561
|
danielebarchiesi@4
|
562 function _rdfui_mapping_save($form_state, $entity_type, $bundle, $field_name) {
|
danielebarchiesi@4
|
563 $mapping = rdf_mapping_load($entity_type, $bundle);
|
danielebarchiesi@4
|
564 // Set the RDF type if it is in this form.
|
danielebarchiesi@4
|
565 if (!empty($form_state['values']['rdf_rdftype'])) {
|
danielebarchiesi@4
|
566 $mapping['rdftype'] = rdfui_extract_curies($form_state['values']['rdf_rdftype']);
|
danielebarchiesi@4
|
567 }
|
danielebarchiesi@4
|
568 // Turn the predicates string into an array.
|
danielebarchiesi@4
|
569 if (isset($form_state['input']['rdf_title_type']) || $field_name != 'title') {
|
danielebarchiesi@4
|
570 $form_state['values']['rdf_'. $field_name .'_predicates'] = rdfui_extract_curies($form_state['values']['rdf_'. $field_name .'_predicates']);
|
danielebarchiesi@4
|
571 }
|
danielebarchiesi@4
|
572
|
danielebarchiesi@4
|
573 foreach (array('type', 'datatype', 'predicates') as $key) {
|
danielebarchiesi@4
|
574 // If there is form input for this key, set it in the mapping.
|
danielebarchiesi@4
|
575 if (!empty($form_state['values']['rdf_'. $field_name .'_' . $key])) {
|
danielebarchiesi@4
|
576 $mapping[$field_name][$key] = $form_state['values']['rdf_'. $field_name .'_' . $key];
|
danielebarchiesi@4
|
577 }
|
danielebarchiesi@4
|
578 // If there is no form input for this key, we need to remove it from the
|
danielebarchiesi@4
|
579 // mapping.
|
danielebarchiesi@4
|
580 else {
|
danielebarchiesi@4
|
581 // If there are no predicates, there should be no mapping at all for the
|
danielebarchiesi@4
|
582 // field.
|
danielebarchiesi@4
|
583 if ($key == 'predicates') {
|
danielebarchiesi@4
|
584 unset($mapping[$field_name]);
|
danielebarchiesi@4
|
585 }
|
danielebarchiesi@4
|
586 else {
|
danielebarchiesi@4
|
587 unset($mapping[$field_name][$key]);
|
danielebarchiesi@4
|
588 }
|
danielebarchiesi@4
|
589 }
|
danielebarchiesi@4
|
590 }
|
danielebarchiesi@4
|
591
|
danielebarchiesi@4
|
592 $mapping_info = array(
|
danielebarchiesi@4
|
593 'mapping' => $mapping,
|
danielebarchiesi@4
|
594 'type' => $entity_type,
|
danielebarchiesi@4
|
595 'bundle' => $bundle
|
danielebarchiesi@4
|
596 );
|
danielebarchiesi@4
|
597 rdf_mapping_save($mapping_info);
|
danielebarchiesi@4
|
598 }
|
danielebarchiesi@4
|
599
|
danielebarchiesi@4
|
600 /**
|
danielebarchiesi@4
|
601 * Returns HTML for a term.
|
danielebarchiesi@4
|
602 *
|
danielebarchiesi@4
|
603 * @param $term
|
danielebarchiesi@4
|
604 * An associative array containing:
|
danielebarchiesi@4
|
605 * - term: A render element representing the term.
|
danielebarchiesi@4
|
606 * - curie: The term's compact URI.
|
danielebarchiesi@4
|
607 * - label: The term's human readable label.
|
danielebarchiesi@4
|
608 * - comment: A description of the term.
|
danielebarchiesi@4
|
609 *
|
danielebarchiesi@4
|
610 * @ingroup themeable
|
danielebarchiesi@4
|
611 */
|
danielebarchiesi@4
|
612 function theme_rdfui_term_autocomplete($variables) {
|
danielebarchiesi@4
|
613 $term = $variables['term'];
|
danielebarchiesi@4
|
614
|
danielebarchiesi@4
|
615 $output = '<div class="form-item rdf-term-autocomplete">';
|
danielebarchiesi@4
|
616 $output .= $term->curie . ' ';
|
danielebarchiesi@4
|
617 $output .= '<p class="rdf-comment-autocomplete">' . $term->comment . '</p>';
|
danielebarchiesi@4
|
618 $output .= '</div>';
|
danielebarchiesi@4
|
619
|
danielebarchiesi@4
|
620 return $output;
|
danielebarchiesi@4
|
621 }
|
danielebarchiesi@4
|
622
|
danielebarchiesi@4
|
623 /**
|
danielebarchiesi@4
|
624 * Generates an array of CURIE values from a string.
|
danielebarchiesi@4
|
625 *
|
danielebarchiesi@4
|
626 * Explodes a string with CURIES separated with , and with each a
|
danielebarchiesi@4
|
627 * value on its own line.
|
danielebarchiesi@4
|
628 */
|
danielebarchiesi@4
|
629 function rdfui_extract_curies($string_values) {
|
danielebarchiesi@4
|
630 $list = explode(", ", $string_values);
|
danielebarchiesi@4
|
631 $last = array_pop($list);
|
danielebarchiesi@4
|
632 $last = str_replace(',', '', $last);
|
danielebarchiesi@4
|
633 array_push($list, $last);
|
danielebarchiesi@4
|
634 $list = array_map('trim', $list);
|
danielebarchiesi@4
|
635 $list = array_filter($list, 'strlen');
|
danielebarchiesi@4
|
636 $list = array_unique($list);
|
danielebarchiesi@4
|
637 return $list;
|
danielebarchiesi@4
|
638 }
|