annotate sites/all/modules/rdfx/rdfui/rdfui.module @ 13:134d4b2e75f6

updated quicktabs and google analytics modules
author danieleb <danielebarchiesi@me.com>
date Tue, 29 Oct 2013 13:48:59 +0000
parents ce11bbd8f642
children
rev   line source
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 }