danielebarchiesi@4: ' . 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()) . '
'; danielebarchiesi@4: case 'admin/help#rdf': danielebarchiesi@4: $output = ''; danielebarchiesi@4: $output .= '' . t('The RDF UI module provides a user interface for altering a bundle\'s RDF mapping.') . '
'; danielebarchiesi@4: return $output; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_theme(). danielebarchiesi@4: */ danielebarchiesi@4: function rdfui_theme($path, $arg) { danielebarchiesi@4: return array( danielebarchiesi@4: 'rdfui_term_autocomplete' => array( danielebarchiesi@4: 'render element' => 'term', danielebarchiesi@4: ), danielebarchiesi@4: ); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_permission(). danielebarchiesi@4: */ danielebarchiesi@4: function rdfui_permission() { danielebarchiesi@4: return array( danielebarchiesi@4: 'administer RDF field mappings' => array( danielebarchiesi@4: 'title' => t('Change the RDF mappings for types and fields'), danielebarchiesi@4: ), danielebarchiesi@4: ); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_menu(). danielebarchiesi@4: */ danielebarchiesi@4: function rdfui_menu() { danielebarchiesi@4: $items = array(); danielebarchiesi@4: danielebarchiesi@4: // Create tabs for all possible bundles. danielebarchiesi@4: foreach (entity_get_info() as $entity_type => $info) { danielebarchiesi@4: if ($info['fieldable']) { danielebarchiesi@4: foreach ($info['bundles'] as $bundle_name => $bundle_info) { danielebarchiesi@4: if (isset($bundle_info['admin'])) { danielebarchiesi@4: // Extract informations from the bundle description. danielebarchiesi@4: $path = $bundle_info['admin']['path']; danielebarchiesi@4: $bundle_arg = isset($bundle_info['admin']['bundle argument']) ? $bundle_info['admin']['bundle argument'] : $bundle_name; danielebarchiesi@4: $access = array_intersect_key($bundle_info['admin'], drupal_map_assoc(array('access callback', 'access arguments'))); danielebarchiesi@4: $instance_position = count(explode('/', $path)) + 1; danielebarchiesi@4: danielebarchiesi@4: if ($entity_type == 'node') { danielebarchiesi@4: $title = t('RDF Mappings'); danielebarchiesi@4: $weight = 2; danielebarchiesi@4: } danielebarchiesi@4: elseif ($entity_type == 'comment') { danielebarchiesi@4: continue; danielebarchiesi@4: $title = t('Comment RDF Mappings'); danielebarchiesi@4: $weight = 60; danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: $title = t('RDF Mappings'); danielebarchiesi@4: $weight = 50; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: $items["$path/rdf"] = array( danielebarchiesi@4: 'title' => $title, danielebarchiesi@4: // @todo Load arguments are not necessary / are cruft, right? danielebarchiesi@4: //'load arguments' => array($obj_type, $bundle_arg), danielebarchiesi@4: 'page callback' => 'drupal_get_form', danielebarchiesi@4: 'page arguments' => array('rdfui_admin_rdf_overview_form', $entity_type, $bundle_arg, $instance_position), danielebarchiesi@4: 'type' => MENU_LOCAL_TASK, danielebarchiesi@4: 'weight' => $weight, danielebarchiesi@4: ) + $access; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: $items['rdfui/classes/autocomplete'] = array( danielebarchiesi@4: 'title' => t('RDF classes autocomplete'), danielebarchiesi@4: 'page callback' => 'rdfui_classes_autocomplete', danielebarchiesi@4: 'access arguments' => array('administer RDF field mappings'), danielebarchiesi@4: 'type' => MENU_CALLBACK, danielebarchiesi@4: ); danielebarchiesi@4: danielebarchiesi@4: $items['rdfui/datatype/autocomplete'] = array( danielebarchiesi@4: 'title' => t('RDF datatype autocomplete'), danielebarchiesi@4: 'page callback' => 'rdfui_datatype_autocomplete', danielebarchiesi@4: 'access arguments' => array('administer RDF field mappings'), danielebarchiesi@4: 'type' => MENU_CALLBACK, danielebarchiesi@4: ); danielebarchiesi@4: danielebarchiesi@4: $items['rdfui/predicates/autocomplete'] = array( danielebarchiesi@4: 'title' => t('RDF predicates autocomplete'), danielebarchiesi@4: 'page callback' => 'rdfui_predicates_autocomplete', danielebarchiesi@4: 'access arguments' => array('administer RDF field mappings'), danielebarchiesi@4: 'type' => MENU_CALLBACK, danielebarchiesi@4: ); danielebarchiesi@4: danielebarchiesi@4: return $items; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Menu callback; listing of field RDF mappings for a content type. danielebarchiesi@4: * danielebarchiesi@4: * Allows the content type to be mapped to a RDF class and danielebarchiesi@4: * fields to be mapped to RDF properties. danielebarchiesi@4: */ danielebarchiesi@4: function rdfui_admin_rdf_overview_form($form, &$form_state, $entity_type, $bundle, $instance) { danielebarchiesi@4: $bundle = field_extract_bundle($entity_type, $bundle); danielebarchiesi@4: $fields = field_info_instances($entity_type, $bundle); danielebarchiesi@4: $mapping = rdf_mapping_load($entity_type, $bundle); danielebarchiesi@4: // Don't make assumptions about entities and only get the type if dealing with a node entity danielebarchiesi@4: $type = ($entity_type == 'node') ? node_type_get_type($bundle) : ''; danielebarchiesi@4: $form['rdf_mappings'] = array( danielebarchiesi@4: '#type' => 'vertical_tabs', danielebarchiesi@4: '#attached' => array( danielebarchiesi@4: 'js' => array(drupal_get_path('module', 'rdfui') . '/rdfui.js'), danielebarchiesi@4: ), danielebarchiesi@4: ); danielebarchiesi@4: danielebarchiesi@4: // Declare the fieldset and field for RDF type. danielebarchiesi@4: $form['type'] = array( danielebarchiesi@4: '#type' => 'fieldset', danielebarchiesi@4: '#title' => t('Type'), danielebarchiesi@4: '#group' => 'rdf_mappings', danielebarchiesi@4: '#attributes' => array('class' => array('rdf-type')), danielebarchiesi@4: ); danielebarchiesi@4: $form['type']['rdf_rdftype'] = array( danielebarchiesi@4: '#type' => 'textarea', danielebarchiesi@4: '#title' => t('RDF Type'), danielebarchiesi@4: '#attached' => array( danielebarchiesi@4: 'js' => array(drupal_get_path('module', 'rdfui') . '/rdfui.js'), danielebarchiesi@4: ), danielebarchiesi@4: ); danielebarchiesi@4: danielebarchiesi@4: // Declare the fieldset and field for RDF type. danielebarchiesi@4: $form['type'] = array( danielebarchiesi@4: '#type' => 'fieldset', danielebarchiesi@4: '#title' => t('Type'), danielebarchiesi@4: '#group' => 'rdf_mappings', danielebarchiesi@4: '#attributes' => array('class' => array('rdf-field')), danielebarchiesi@4: ); danielebarchiesi@4: $form['type']['rdf_rdftype'] = array( danielebarchiesi@4: '#type' => 'textarea', danielebarchiesi@4: '#title' => t('RDF Type'), danielebarchiesi@4: '#attributes' => array('class' => array('rdf-field')), danielebarchiesi@4: ); danielebarchiesi@4: danielebarchiesi@4: // If this entity is a node and has a title display a fieldset for mapping. danielebarchiesi@4: if (isset($type->has_title)) { danielebarchiesi@4: $form['rdf_title'] = array( danielebarchiesi@4: '#type' => 'fieldset', danielebarchiesi@4: '#group' => 'rdf_mappings', danielebarchiesi@4: '#title' => $type->title_label, danielebarchiesi@4: '#attributes' => array('class' => array('rdf-field')), danielebarchiesi@4: ); danielebarchiesi@4: // Add the options for this entity's title. danielebarchiesi@4: rdfui_predicate_fieldset($form['rdf_title'], $mapping, 'title', 'title'); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: // Add the field for RDF type. danielebarchiesi@4: rdfui_rdftype_fieldset($form['type']['rdf_rdftype'], $mapping); danielebarchiesi@4: // Add the options for all other fields. danielebarchiesi@4: foreach ($fields as $field) { danielebarchiesi@4: $label = $field['label']; danielebarchiesi@4: $field_name = $field['field_name']; danielebarchiesi@4: $form[$field_name] = array( danielebarchiesi@4: '#type' => 'fieldset', danielebarchiesi@4: '#group' => 'rdf_mappings', danielebarchiesi@4: '#title' => t('@label', array('@label' => $label)), danielebarchiesi@4: '#attributes' => array('class' => array('rdf-field')), danielebarchiesi@4: ); danielebarchiesi@4: rdfui_predicate_fieldset($form[$field_name], $mapping, $field_name, $label); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: $form['field_names'] = array('#type' => 'value', '#value' => array_keys($fields)); danielebarchiesi@4: $form['submit'] = array('#type' => 'submit', '#value' => t('Save mappings')); danielebarchiesi@4: danielebarchiesi@4: // @todo where is RDFUI_CURIE_REGEX declared? danielebarchiesi@4: // drupal_add_js(array('rdfui' => array('termRegex' => RDFUI_CURIE_REGEX)), 'setting'); danielebarchiesi@4: return $form; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_form_FORM_ID_alter(). danielebarchiesi@4: */ danielebarchiesi@4: function rdfui_form_field_ui_field_edit_form_alter(&$form, &$form_state) { danielebarchiesi@4: danielebarchiesi@4: $field_name = $form['#field']['field_name']; danielebarchiesi@4: $instance = $form['instance']; danielebarchiesi@4: $label = isset($instance['label']) ? $instance['label']['#default_value'] : $instance['field_name']; danielebarchiesi@4: $entity_type = $instance['entity_type']['#value']; danielebarchiesi@4: $mapping = rdf_mapping_load($entity_type, $instance['bundle']['#value']); danielebarchiesi@4: danielebarchiesi@4: $form['rdf'] = array( danielebarchiesi@4: '#type' => 'fieldset', danielebarchiesi@4: '#title' => t('@label RDF Mapping', array('@label' => $label)), danielebarchiesi@4: ); danielebarchiesi@4: danielebarchiesi@4: // add the predicate, datatype, etc fields danielebarchiesi@4: rdfui_predicate_fieldset($form['rdf'], $mapping, $field_name, $label); danielebarchiesi@4: danielebarchiesi@4: $form['submit']['#weight'] = 1; danielebarchiesi@4: danielebarchiesi@4: // add submit and validate handlers danielebarchiesi@4: $form['#validate'] = array_merge($form['#validate'], array('rdfui_form_field_ui_field_edit_form_validate')); danielebarchiesi@4: $form['#submit'] = array_merge($form['#submit'], array('rdfui_form_field_ui_field_edit_form_submit')); danielebarchiesi@4: danielebarchiesi@4: // drupal_add_js(array('rdfui'=>array('termRegex'=>RDFUI_CURIE_REGEX)), 'setting'); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_form_FORM_ID_alter(). danielebarchiesi@4: */ danielebarchiesi@4: function rdfui_form_node_type_form_alter(&$form, &$form_state) { danielebarchiesi@4: $mapping = array(); danielebarchiesi@4: // If we are editing an existing content type, the mapping will be available danielebarchiesi@4: // via the bundles in entity info. danielebarchiesi@4: if ($bundle = $form['type']['#default_value']) { danielebarchiesi@4: $entity = entity_get_info('node'); danielebarchiesi@4: $mapping = $entity['bundles'][$bundle]['rdf_mapping']; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: $form['rdf_settings'] = array( danielebarchiesi@4: '#type' => 'fieldset', danielebarchiesi@4: '#title' => 'RDF Settings', danielebarchiesi@4: '#collapsible' => TRUE, danielebarchiesi@4: '#collapsed' => TRUE, danielebarchiesi@4: '#group' => 'additional_settings' danielebarchiesi@4: ); danielebarchiesi@4: $form['rdf_settings']['rdf_rdftype'] = array( danielebarchiesi@4: '#type' => 'fieldset', danielebarchiesi@4: '#title' => 'RDF Type', danielebarchiesi@4: ); danielebarchiesi@4: $form['rdf_settings']['rdf_title'] = array( danielebarchiesi@4: '#type' => 'fieldset', danielebarchiesi@4: '#title' => 'RDF Title Predicate', danielebarchiesi@4: ); danielebarchiesi@4: danielebarchiesi@4: // Add the RDF type field for the bundle. danielebarchiesi@4: rdfui_rdftype_fieldset($form['rdf_settings']['rdf_rdftype'], $mapping); danielebarchiesi@4: //Add the predicate, datatype, property fields for the bundle title. danielebarchiesi@4: rdfui_predicate_fieldset($form['rdf_settings']['rdf_title'], $mapping, 'title', 'title'); danielebarchiesi@4: danielebarchiesi@4: // add submit and validate handlers danielebarchiesi@4: $form['#validate'] = array_merge($form['#validate'], array('rdfui_form_node_type_form_validate')); danielebarchiesi@4: $form['#submit'] = array_merge($form['#submit'], array('rdfui_form_node_type_form_submit')); danielebarchiesi@4: danielebarchiesi@4: // drupal_add_js(array('rdfui'=>array('termRegex'=>RDFUI_CURIE_REGEX)), 'setting'); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: danielebarchiesi@4: function rdfui_form_field_ui_field_edit_form_validate($form, &$form_state) { danielebarchiesi@4: $field_name = $form['#field']['field_name']; danielebarchiesi@4: danielebarchiesi@4: _rdfui_validate_terms($form_state, $field_name); danielebarchiesi@4: _rdfui_validate_datatype($form_state, $field_name); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function rdfui_admin_rdf_overview_form_validate($form, &$form_state) { danielebarchiesi@4: // Validate bundle's RDF type(s). danielebarchiesi@4: _rdfui_validate_terms($form_state); danielebarchiesi@4: danielebarchiesi@4: // Validate title predicate(s). danielebarchiesi@4: if ((isset($form_state['input']['rdf_title_type']))) { danielebarchiesi@4: $field_name = 'title'; danielebarchiesi@4: _rdfui_validate_terms($form_state, $field_name); danielebarchiesi@4: _rdfui_validate_datatype($form_state, $field_name); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: // Validate predicates for all fields. danielebarchiesi@4: foreach ($form_state['values']['field_names'] as $field_name) { danielebarchiesi@4: _rdfui_validate_terms($form_state, $field_name); danielebarchiesi@4: _rdfui_validate_datatype($form_state, $field_name); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function rdfui_form_node_type_form_validate($form, &$form_state) { danielebarchiesi@4: // Validate bundle's RDF type(s). danielebarchiesi@4: _rdfui_validate_terms($form_state); danielebarchiesi@4: danielebarchiesi@4: // Validate title predicate(s). danielebarchiesi@4: if ((isset($form_state['input']['rdf_title_type']))) { danielebarchiesi@4: $field_name = 'title'; danielebarchiesi@4: _rdfui_validate_terms($form_state, $field_name); danielebarchiesi@4: _rdfui_validate_datatype($form_state, $field_name); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Saves RDF mapping for all fields and node type. danielebarchiesi@4: */ danielebarchiesi@4: function rdfui_admin_rdf_overview_form_submit($form, &$form_state) { danielebarchiesi@4: $entity_type = $form_state['build_info']['args'][0]; danielebarchiesi@4: // @todo somehow $form_state['build_info']['args'][1] is an object for the danielebarchiesi@4: // node RDF mapping but a string 'user' for the user RDF mapping. danielebarchiesi@4: if (isset($form_state['build_info']['args'][1]->type)) { danielebarchiesi@4: $bundle = $form_state['build_info']['args'][1]->type; danielebarchiesi@4: } danielebarchiesi@4: elseif ($form_state['build_info']['args'][0] == 'taxonomy_term') { danielebarchiesi@4: $bundle = $form_state['build_info']['args'][1]->machine_name; danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: $bundle = $form_state['build_info']['args'][1]; danielebarchiesi@4: } danielebarchiesi@4: _rdfui_mapping_save($form_state, $entity_type, $bundle, 'title'); danielebarchiesi@4: danielebarchiesi@4: foreach ($form_state['values']['field_names'] as $field_name) { danielebarchiesi@4: _rdfui_mapping_save($form_state, $entity_type, $bundle, $field_name); danielebarchiesi@4: } danielebarchiesi@4: drupal_set_message(t('RDF mappings have been saved.'), 'status'); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Saves RDF mapping for individual field. danielebarchiesi@4: */ danielebarchiesi@4: function rdfui_form_field_ui_field_edit_form_submit($form, &$form_state) { danielebarchiesi@4: $entity_type = $form['instance']['entity_type']['#value']; danielebarchiesi@4: $bundle = $form['instance']['bundle']['#value']; danielebarchiesi@4: $field_name = $form['#field']['field_name']; danielebarchiesi@4: danielebarchiesi@4: _rdfui_mapping_save($form_state, $entity_type, $bundle, $field_name); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Saves RDF mapping for Title field. danielebarchiesi@4: */ danielebarchiesi@4: function rdfui_form_node_type_form_submit($form, &$form_state) { danielebarchiesi@4: $entity_type = 'node'; danielebarchiesi@4: $bundle = $form_state['input']['type']; danielebarchiesi@4: // We only need to call _rdfui_mapping_save once because it checks whether danielebarchiesi@4: // rdf_type is set in the form before saving the field value. danielebarchiesi@4: _rdfui_mapping_save($form_state, $entity_type, $bundle, 'title'); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Menu callback for classes autocomplete danielebarchiesi@4: */ danielebarchiesi@4: function rdfui_classes_autocomplete($string) { danielebarchiesi@4: // The user enters a comma-separated list of classes. We only autocomplete danielebarchiesi@4: // the last class. danielebarchiesi@4: $classes_typed = drupal_explode_tags($string); danielebarchiesi@4: $class_last = drupal_strtolower(array_pop($classes_typed)); danielebarchiesi@4: danielebarchiesi@4: $matches = array(); danielebarchiesi@4: if ($class_last != '') { danielebarchiesi@4: $classes = array(); danielebarchiesi@4: $classes_entered = count($classes_typed) ? implode(', ', $classes_typed) . ', ' : ''; danielebarchiesi@4: $class_tids = rdfx_get_classes(); danielebarchiesi@4: foreach ($class_tids as $class_tid) { danielebarchiesi@4: $class = rdfx_curie($class_tid) . ', '; danielebarchiesi@4: if (preg_match("/$class_last/", $class)) { danielebarchiesi@4: $details = _rdfx_get_term_details($class_tid); danielebarchiesi@4: $details->curie = $class; danielebarchiesi@4: $matches[$classes_entered . $class] = theme('rdfui_term_autocomplete', array('term' => $details,)); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: drupal_json_output($matches); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Menu callback for datatype autocomplete danielebarchiesi@4: */ danielebarchiesi@4: function rdfui_datatype_autocomplete($string) { danielebarchiesi@4: danielebarchiesi@4: //@todo Make sure datatype is only active if property is the relationship. danielebarchiesi@4: danielebarchiesi@4: $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: danielebarchiesi@4: $datatypes = explode(', ', $datatypes); danielebarchiesi@4: $matches = array(); danielebarchiesi@4: danielebarchiesi@4: foreach($datatypes as $datatype) { danielebarchiesi@4: if (preg_match("/^$string/", $datatype)) danielebarchiesi@4: $matches[$datatype] = $datatype; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: drupal_json_output($matches); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Menu callback for predicates autocomplete danielebarchiesi@4: */ danielebarchiesi@4: function rdfui_predicates_autocomplete($string) { danielebarchiesi@4: // The user enters a comma-separated list of predicates. We only autocomplete danielebarchiesi@4: // the last predicate. danielebarchiesi@4: $predicates_typed = drupal_explode_tags($string); danielebarchiesi@4: $predicate_last = drupal_strtolower(array_pop($predicates_typed)); danielebarchiesi@4: danielebarchiesi@4: $matches = array(); danielebarchiesi@4: if ($predicate_last != '') { danielebarchiesi@4: $predicates = array(); danielebarchiesi@4: $predicates_entered = count($predicates_typed) ? implode(', ', $predicates_typed) . ', ' : ''; danielebarchiesi@4: $predicate_tids = rdfx_get_properties(); danielebarchiesi@4: foreach ($predicate_tids as $predicate_tid) { danielebarchiesi@4: $predicate = rdfx_curie($predicate_tid) . ', '; danielebarchiesi@4: if (preg_match("/$predicate_last/", $predicate)) { danielebarchiesi@4: $details = _rdfx_get_term_details($predicate_tid); danielebarchiesi@4: $details->curie = $predicate; danielebarchiesi@4: $matches[$predicates_entered . $predicate] = theme('rdfui_term_autocomplete', array('term' => $details,)); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: drupal_json_output($matches); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * appends the rdf form fields to a fieldset dedicated to a fields.module field danielebarchiesi@4: */ danielebarchiesi@4: function rdfui_predicate_fieldset(&$fieldset, $mapping, $field_name, $label) { danielebarchiesi@4: $fieldset['rdf_'. $field_name .'_predicates'] = array( danielebarchiesi@4: '#type' => 'textfield', danielebarchiesi@4: '#autocomplete_path' => 'rdfui/predicates/autocomplete', danielebarchiesi@4: '#title' => t('RDF Predicates'), danielebarchiesi@4: '#default_value' => empty($mapping[$field_name]['predicates']) ? '' : implode(", ",$mapping[$field_name]['predicates']), danielebarchiesi@4: '#description' => t('Enter a comma-separated list of predicates for %label using CURIE syntax. For example: %predicates', danielebarchiesi@4: array( danielebarchiesi@4: '%label' => $label, danielebarchiesi@4: '%predicates' => 'foaf:familyName, foaf:lastName' danielebarchiesi@4: ) danielebarchiesi@4: ), danielebarchiesi@4: '#resizable' => FALSE, danielebarchiesi@4: ); danielebarchiesi@4: danielebarchiesi@4: $fieldset['rdf_'. $field_name .'_type'] = array( danielebarchiesi@4: '#type' => 'select', danielebarchiesi@4: '#title' => t('Attribute Type'), danielebarchiesi@4: '#default_value' => empty($mapping[$field_name]['type']) ? 'property' : $mapping[$field_name]['type'], danielebarchiesi@4: '#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: array( danielebarchiesi@4: '%label' => $label, danielebarchiesi@4: '!property' => l('property', 'http://www.w3.org/2006/07/SWD/RDFa/syntax/#id103203'), danielebarchiesi@4: '!rel' => l('rel','http://www.w3.org/2006/07/SWD/RDFa/syntax/#id103235'), danielebarchiesi@4: '!rev' => l('rev','http://www.w3.org/2006/07/SWD/RDFa/syntax/#id103282') danielebarchiesi@4: ) danielebarchiesi@4: ), danielebarchiesi@4: '#options' => array('property'=>'property', 'rel'=>'rel', 'rev'=>'rev'), danielebarchiesi@4: '#attributes' => array('class' => array('rdf-attribute-type')), danielebarchiesi@4: ); danielebarchiesi@4: danielebarchiesi@4: // @todo Possibly autocomplete the builtin xsd datatypes, but do not restrict to xsd datatypes. danielebarchiesi@4: $fieldset['rdf_'. $field_name .'_datatype'] = array( danielebarchiesi@4: '#type' => 'textfield', danielebarchiesi@4: '#title' => t('Datatype'), danielebarchiesi@4: '#autocomplete_path' => 'rdfui/datatype/autocomplete', danielebarchiesi@4: '#default_value' => empty($mapping[$field_name]['datatype']) ? '' : $mapping[$field_name]['datatype'], danielebarchiesi@4: '#description' => t('Enter the datatype for %label using CURIE syntax. For a list of common datatypes, see !link.', danielebarchiesi@4: array( danielebarchiesi@4: '%label' => $label, danielebarchiesi@4: '!link' => l('XML Schema datatypes', 'http://www.w3.org/TR/2004/REC-rdf-mt-20040210/#dtype_interp', array('attributes' => array('target' => '_blank'))), danielebarchiesi@4: ) danielebarchiesi@4: ), danielebarchiesi@4: '#states' => array( danielebarchiesi@4: 'visible' => array( danielebarchiesi@4: ':input[name="rdf_' . $field_name . '_type"]' => array('value' => 'property'), danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: ); danielebarchiesi@4: drupal_add_css(drupal_get_path('module', 'rdfui') .'/css/rdfui.css', 'file'); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Appends the RDF type fieldset. Because this fieldset is always on the same danielebarchiesi@4: * page as fields created by rdfui_predicate_fieldset(), which add the css and danielebarchiesi@4: * js files, we do not add the files again. danielebarchiesi@4: * danielebarchiesi@4: */ danielebarchiesi@4: function rdfui_rdftype_fieldset(&$fieldset, $mapping) { danielebarchiesi@4: $fieldset = array( danielebarchiesi@4: '#type' => 'textfield', danielebarchiesi@4: '#autocomplete_path' => 'rdfui/classes/autocomplete', danielebarchiesi@4: '#title' => t('RDF Type'), danielebarchiesi@4: '#default_value' => empty($mapping['rdftype']) ? '' : implode(", ",$mapping['rdftype']), danielebarchiesi@4: '#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: ); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Sets a form error if predicates don't validate. danielebarchiesi@4: */ danielebarchiesi@4: function _rdfui_validate_terms($form_state, $field_name = '') { danielebarchiesi@4: // If the field_name is NOT NULL, then this is a predicate. If it is NULL, danielebarchiesi@4: // this is a type. danielebarchiesi@4: $field_id = $field_name != NULL ? 'rdf_'. $field_name .'_predicates' : 'rdf_rdftype'; danielebarchiesi@4: danielebarchiesi@4: // Validate terms. danielebarchiesi@4: if ($terms = trim($form_state['values'][$field_id])) { danielebarchiesi@4: $terms = rdfui_extract_curies($terms); danielebarchiesi@4: $rdf_namespaces = module_invoke_all('rdf_namespaces'); danielebarchiesi@4: $errors = array(); danielebarchiesi@4: $warnings = array(); danielebarchiesi@4: danielebarchiesi@4: foreach($terms as $term) { danielebarchiesi@4: // Ensure this is a CURIE. danielebarchiesi@4: if (!preg_match(QNAME, $term)){ danielebarchiesi@4: // @todo Add a page to the drupal docs about CURIE format and adding danielebarchiesi@4: // namespaces. Then add a link to this error that says 'For more info'. danielebarchiesi@4: $errors[] = t('Term %term must be in CURIE format.', array('%term'=>$term)); danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: // Check the prefixes to ensure they are bound. If not, issue a warning. danielebarchiesi@4: $term_parts = explode(':', $term); danielebarchiesi@4: $prefix = $term_parts[0]; danielebarchiesi@4: if (!isset($rdf_namespaces[$prefix])) { danielebarchiesi@4: $warnings[] = t('Term %term uses unmapped prefix %prefix. Please map the prefix in !rdf_publishing.', danielebarchiesi@4: array( danielebarchiesi@4: '%term' => $term, danielebarchiesi@4: '%prefix' => $prefix, danielebarchiesi@4: '!rdf_publishing' => l(t('RDF publishing settings'), 'admin/config/services/rdf/namespaces'), danielebarchiesi@4: ) danielebarchiesi@4: ); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: if (!empty($errors)) { danielebarchiesi@4: foreach ($errors as $error) { danielebarchiesi@4: form_set_error($field_id, $error); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: if (!empty($warnings)) { danielebarchiesi@4: foreach ($warnings as $warning) { danielebarchiesi@4: drupal_set_message($warning, $type='warning'); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Sets a form error if datatype don't validate. danielebarchiesi@4: */ danielebarchiesi@4: function _rdfui_validate_datatype($form_state, $field_name) { danielebarchiesi@4: danielebarchiesi@4: // validate datatype danielebarchiesi@4: if ($datatype = trim($form_state['values']['rdf_'. $field_name .'_datatype'])) { danielebarchiesi@4: if(!preg_match(QNAME, $datatype)) danielebarchiesi@4: form_set_error('rdf_'. $field_name .'_datatype', t('Datatype %datatype is an invalid format.', array('%datatype'=>$datatype))); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Saves the mapping danielebarchiesi@4: */ danielebarchiesi@4: danielebarchiesi@4: function _rdfui_mapping_save($form_state, $entity_type, $bundle, $field_name) { danielebarchiesi@4: $mapping = rdf_mapping_load($entity_type, $bundle); danielebarchiesi@4: // Set the RDF type if it is in this form. danielebarchiesi@4: if (!empty($form_state['values']['rdf_rdftype'])) { danielebarchiesi@4: $mapping['rdftype'] = rdfui_extract_curies($form_state['values']['rdf_rdftype']); danielebarchiesi@4: } danielebarchiesi@4: // Turn the predicates string into an array. danielebarchiesi@4: if (isset($form_state['input']['rdf_title_type']) || $field_name != 'title') { danielebarchiesi@4: $form_state['values']['rdf_'. $field_name .'_predicates'] = rdfui_extract_curies($form_state['values']['rdf_'. $field_name .'_predicates']); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: foreach (array('type', 'datatype', 'predicates') as $key) { danielebarchiesi@4: // If there is form input for this key, set it in the mapping. danielebarchiesi@4: if (!empty($form_state['values']['rdf_'. $field_name .'_' . $key])) { danielebarchiesi@4: $mapping[$field_name][$key] = $form_state['values']['rdf_'. $field_name .'_' . $key]; danielebarchiesi@4: } danielebarchiesi@4: // If there is no form input for this key, we need to remove it from the danielebarchiesi@4: // mapping. danielebarchiesi@4: else { danielebarchiesi@4: // If there are no predicates, there should be no mapping at all for the danielebarchiesi@4: // field. danielebarchiesi@4: if ($key == 'predicates') { danielebarchiesi@4: unset($mapping[$field_name]); danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: unset($mapping[$field_name][$key]); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: $mapping_info = array( danielebarchiesi@4: 'mapping' => $mapping, danielebarchiesi@4: 'type' => $entity_type, danielebarchiesi@4: 'bundle' => $bundle danielebarchiesi@4: ); danielebarchiesi@4: rdf_mapping_save($mapping_info); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Returns HTML for a term. danielebarchiesi@4: * danielebarchiesi@4: * @param $term danielebarchiesi@4: * An associative array containing: danielebarchiesi@4: * - term: A render element representing the term. danielebarchiesi@4: * - curie: The term's compact URI. danielebarchiesi@4: * - label: The term's human readable label. danielebarchiesi@4: * - comment: A description of the term. danielebarchiesi@4: * danielebarchiesi@4: * @ingroup themeable danielebarchiesi@4: */ danielebarchiesi@4: function theme_rdfui_term_autocomplete($variables) { danielebarchiesi@4: $term = $variables['term']; danielebarchiesi@4: danielebarchiesi@4: $output = '' . $term->comment . '
'; danielebarchiesi@4: $output .= '