annotate sites/all/modules/rdfx/rdfx.admin.inc @ 4:ce11bbd8f642

added modules
author danieleb <danielebarchiesi@me.com>
date Thu, 19 Sep 2013 10:38:44 +0100
parents
children
rev   line source
danielebarchiesi@4 1 <?php
danielebarchiesi@4 2
danielebarchiesi@4 3 /**
danielebarchiesi@4 4 * Callback function for viewing all bundles' RDF mappings.
danielebarchiesi@4 5 */
danielebarchiesi@4 6 function rdfx_mapping_overview() {
danielebarchiesi@4 7 $render = array();
danielebarchiesi@4 8 $entities = entity_get_info();
danielebarchiesi@4 9 $fields = field_info_instances();
danielebarchiesi@4 10 $render['tabs'] = array(
danielebarchiesi@4 11 '#type' => 'vertical_tabs',
danielebarchiesi@4 12 );
danielebarchiesi@4 13
danielebarchiesi@4 14 // Create a tab for each entity.
danielebarchiesi@4 15 foreach ($entities as $entity_type => $entity) {
danielebarchiesi@4 16 $render['tabs'][$entity_type] = array(
danielebarchiesi@4 17 '#type' => 'fieldset',
danielebarchiesi@4 18 '#title' => $entity['label'],
danielebarchiesi@4 19 '#collapsible' => TRUE,
danielebarchiesi@4 20 '#collapsed' => TRUE,
danielebarchiesi@4 21 );
danielebarchiesi@4 22 // The bundle's RDF mapping array may contain mappings for entity attributes
danielebarchiesi@4 23 // that are not fields. The bundle's field array may contain fields that are
danielebarchiesi@4 24 // not in the RDF mapping array. In order to ensure we get all the available
danielebarchiesi@4 25 // fields and all the mapped entity attributes, we compare the arrays.
danielebarchiesi@4 26 foreach ($entity['bundles'] as $bundle_name => $bundle) {
danielebarchiesi@4 27 $rows = array();
danielebarchiesi@4 28 $real_fields = array();
danielebarchiesi@4 29 $fake_fields = array();
danielebarchiesi@4 30 $bundle_fields = $fields[$entity_type][$bundle_name];
danielebarchiesi@4 31 $bundle['edit_path'] = NULL;
danielebarchiesi@4 32 $rdf_mapping = $bundle['rdf_mapping'];
danielebarchiesi@4 33 if (isset($bundle['admin']['real path'])) {
danielebarchiesi@4 34 $bundle['edit_path'] = $bundle['admin']['real path'] . '/rdf';
danielebarchiesi@4 35 }
danielebarchiesi@4 36
danielebarchiesi@4 37 // Set RDF type.
danielebarchiesi@4 38 if (isset($rdf_mapping['rdftype'])) {
danielebarchiesi@4 39 $rdftype = implode(', ', $rdf_mapping['rdftype']);
danielebarchiesi@4 40 unset($rdf_mapping['rdftype']);
danielebarchiesi@4 41 }
danielebarchiesi@4 42 foreach ($rdf_mapping as $field_name => $mapping_info) {
danielebarchiesi@4 43 // Gather Field API fields.
danielebarchiesi@4 44 if (isset($bundle_fields[$field_name])) {
danielebarchiesi@4 45 $real_fields[$field_name]['rdf_mapping'] = $mapping_info;
danielebarchiesi@4 46 $real_fields[$field_name]['label'] = $fields[$entity_type][$bundle_name][$field_name]['label'];
danielebarchiesi@4 47 $real_fields[$field_name]['edit_path'] = $bundle['edit_path'];
danielebarchiesi@4 48 unset($bundle_fields[$field_name]);
danielebarchiesi@4 49 }
danielebarchiesi@4 50 // Gather non-field content variables.
danielebarchiesi@4 51 else {
danielebarchiesi@4 52 $fake_fields[$field_name]['rdf_mapping'] = $mapping_info;
danielebarchiesi@4 53 $fake_fields[$field_name]['label'] = $field_name;
danielebarchiesi@4 54 $fake_fields[$field_name]['edit_path'] = ($field_name == 'title') ? $bundle['edit_path'] : NULL;
danielebarchiesi@4 55 }
danielebarchiesi@4 56 }
danielebarchiesi@4 57 // Theme this bundle's table and add it to it's parent entity's tab.
danielebarchiesi@4 58 $variables = array(
danielebarchiesi@4 59 'bundle' => $bundle,
danielebarchiesi@4 60 'rdftype' => $rdftype,
danielebarchiesi@4 61 'real_fields' => $real_fields,
danielebarchiesi@4 62 'fake_fields' => $fake_fields,
danielebarchiesi@4 63 );
danielebarchiesi@4 64 $render['tabs'][$entity_type][$bundle_name] = theme('rdfx_mapping_admin_overview', $variables);
danielebarchiesi@4 65 }
danielebarchiesi@4 66 }
danielebarchiesi@4 67 return $render;
danielebarchiesi@4 68 }
danielebarchiesi@4 69
danielebarchiesi@4 70 /**
danielebarchiesi@4 71 * Theme function to output the table for a bundle's mappings.
danielebarchiesi@4 72 */
danielebarchiesi@4 73 function theme_rdfx_mapping_admin_overview($variables) {
danielebarchiesi@4 74 $bundle_label = $variables['bundle']['label'];
danielebarchiesi@4 75 $bundle = $variables['bundle'];
danielebarchiesi@4 76 $real_fields = $variables['real_fields'];
danielebarchiesi@4 77 $fake_fields = $variables['fake_fields'];
danielebarchiesi@4 78 $rows = array();
danielebarchiesi@4 79
danielebarchiesi@4 80 // Add the table header for this bundle.
danielebarchiesi@4 81 $header = array(t('Fields'), t('RDF predicates'), t('Mapping type'), t('Datatype'));
danielebarchiesi@4 82 if (module_exists('rdfui')) {
danielebarchiesi@4 83 $header[] = t('Operations');
danielebarchiesi@4 84 }
danielebarchiesi@4 85
danielebarchiesi@4 86 // Display a title for each bundle above the mappings table. If RDF UI is
danielebarchiesi@4 87 // enabled, also add an 'edit' link.
danielebarchiesi@4 88 $title = "<h3>$bundle_label</h3>";
danielebarchiesi@4 89 $edit_link = (module_exists('rdfui') && !empty($bundle['edit_path'])) ? ' (' . l(t('edit'), $bundle['edit_path']) . ')' : '';
danielebarchiesi@4 90 $title .= "<p>" . t('RDF Types:') . ' ' . $variables['rdftype'] . $edit_link . '</p>';
danielebarchiesi@4 91
danielebarchiesi@4 92 // List all of the Field API fields and their mappings.
danielebarchiesi@4 93 foreach ($real_fields as $name => $field) {
danielebarchiesi@4 94 $rows[] = array(
danielebarchiesi@4 95 'data' => theme('rdfx_mapping_admin_overview_row', array('field' => $field, 'field_name' => $name, 'edit_path' => $field['edit_path'])),
danielebarchiesi@4 96 );
danielebarchiesi@4 97 }
danielebarchiesi@4 98
danielebarchiesi@4 99 // Add any non-Field API entity attributes.
danielebarchiesi@4 100 foreach ($fake_fields as $name => $field) {
danielebarchiesi@4 101 $rows[] = array(
danielebarchiesi@4 102 'data' => theme('rdfx_mapping_admin_overview_row', array('field' => $field, 'field_name' => $name, 'edit_path' => $field['edit_path'])),
danielebarchiesi@4 103 );
danielebarchiesi@4 104 }
danielebarchiesi@4 105
danielebarchiesi@4 106 // If there are no mappings, display a message inside the table.
danielebarchiesi@4 107 if (!count($rows)) {
danielebarchiesi@4 108 $rows[] = array(
danielebarchiesi@4 109 'data' => array(array('data' => t('No mappings have been configured for this bundle.'), 'colspan' => 5))
danielebarchiesi@4 110 );
danielebarchiesi@4 111 }
danielebarchiesi@4 112
danielebarchiesi@4 113 // Return the table for this bundle.
danielebarchiesi@4 114 return array(
danielebarchiesi@4 115 '#prefix' => $title,
danielebarchiesi@4 116 '#theme' => 'table',
danielebarchiesi@4 117 '#rows' => $rows,
danielebarchiesi@4 118 '#header' => $header,
danielebarchiesi@4 119 );
danielebarchiesi@4 120 }
danielebarchiesi@4 121
danielebarchiesi@4 122 /**
danielebarchiesi@4 123 * Theme function to output a field's row in the bundle mapping table.
danielebarchiesi@4 124 */
danielebarchiesi@4 125 function theme_rdfx_mapping_admin_overview_row($variables) {
danielebarchiesi@4 126 $field = $variables['field'];
danielebarchiesi@4 127
danielebarchiesi@4 128 $field_label = '<strong>' . t($field['label']) . '</strong>';
danielebarchiesi@4 129 $predicates = isset($field['rdf_mapping']['predicates']) ? t(implode(', ', $field['rdf_mapping']['predicates'])) : '';
danielebarchiesi@4 130 $predicate_type = isset($field['rdf_mapping']['type']) ? check_plain($field['rdf_mapping']['type']) : 'property';
danielebarchiesi@4 131 $datatype = isset($field['rdf_mapping']['datatype']) ? $field['rdf_mapping']['datatype'] : '';
danielebarchiesi@4 132
danielebarchiesi@4 133 $row = array($field_label, $predicates, $predicate_type, $datatype);
danielebarchiesi@4 134
danielebarchiesi@4 135 // Add operations links only if RDF UI is enabled.
danielebarchiesi@4 136 if (module_exists('rdfui')) {
danielebarchiesi@4 137 $operations = '';
danielebarchiesi@4 138 if (isset($variables['edit_path'])) {
danielebarchiesi@4 139 // By adding the appropriate url fragment, we can open the corresponding
danielebarchiesi@4 140 // vertical tab on the RDF mapping UI page. The fragment should correspond
danielebarchiesi@4 141 // to the html id for each fieldset, which means certain characters need
danielebarchiesi@4 142 // to be replaced. These replacement patterns are from drupal_html_id().
danielebarchiesi@4 143 $id = ($variables['field_name'] == 'title') ? 'rdf-title' : $variables['field_name'];
danielebarchiesi@4 144 $id = strtr(drupal_strtolower($id), array(' ' => '-', '_' => '-', '[' => '-', ']' => ''));
danielebarchiesi@4 145 $id = preg_replace('/[^A-Za-z0-9\-_]/', '', $id);
danielebarchiesi@4 146 $id = preg_replace('/\-+/', '-', $id);
danielebarchiesi@4 147 $operations = l(t('edit'), $variables['edit_path'], array('fragment' => "edit-$id"));
danielebarchiesi@4 148 }
danielebarchiesi@4 149 $row[] = $operations;
danielebarchiesi@4 150 }
danielebarchiesi@4 151
danielebarchiesi@4 152 return $row;
danielebarchiesi@4 153 }
danielebarchiesi@4 154
danielebarchiesi@4 155 /**
danielebarchiesi@4 156 * Menu callback for viewing all declared namespaces (conflicting and non-conflicting)
danielebarchiesi@4 157 * and their prefixes.
danielebarchiesi@4 158 */
danielebarchiesi@4 159 function rdfx_admin_namespaces() {
danielebarchiesi@4 160 $output = '';
danielebarchiesi@4 161
danielebarchiesi@4 162 // List conflicting namespaces.
danielebarchiesi@4 163 $conflicting_namespaces = rdfx_get_conflicting_namespaces();
danielebarchiesi@4 164 if ($conflicting_namespaces) {
danielebarchiesi@4 165 $table_conflicting_namespaces = array();
danielebarchiesi@4 166 $table_conflicting_namespaces['header'] = array('Prefix', 'Conflicting Namespaces');
danielebarchiesi@4 167 foreach ($conflicting_namespaces as $prefix => $uris) {
danielebarchiesi@4 168 $table_conflicting_namespaces['rows'][] = array($prefix, implode(", ", $uris));
danielebarchiesi@4 169 }
danielebarchiesi@4 170 $output .= '<div class="messages warning">' . t("Warning: The following namespaces have conflicts") . '</div>';
danielebarchiesi@4 171 $output .= theme('table', $table_conflicting_namespaces);
danielebarchiesi@4 172 }
danielebarchiesi@4 173
danielebarchiesi@4 174 // List non-conflicting namespaces.
danielebarchiesi@4 175 $table_namespaces = array();
danielebarchiesi@4 176 $table_namespaces['header'] = array('Prefix', 'Namespace');
danielebarchiesi@4 177 foreach (rdf_get_namespaces() as $prefix => $namespace) {
danielebarchiesi@4 178 $table_namespaces['rows'][] = array($prefix, $namespace);
danielebarchiesi@4 179 }
danielebarchiesi@4 180 // Only show label if there were conflicting namespaces.
danielebarchiesi@4 181 if ($conflicting_namespaces) {
danielebarchiesi@4 182 $output .= '<div class="messages status">' . t("The following namespaces do not have conflicts") . '</div>';
danielebarchiesi@4 183 }
danielebarchiesi@4 184 $output .= theme('table', $table_namespaces);
danielebarchiesi@4 185
danielebarchiesi@4 186 // Form to add namespaces.
danielebarchiesi@4 187 $form = drupal_get_form('rdfx_admin_namespaces_form');
danielebarchiesi@4 188 $output .= drupal_render($form);
danielebarchiesi@4 189
danielebarchiesi@4 190 return $output;
danielebarchiesi@4 191 }
danielebarchiesi@4 192
danielebarchiesi@4 193 function rdfx_admin_namespaces_form($form, &$form_state) {
danielebarchiesi@4 194 $form['prefix'] = array(
danielebarchiesi@4 195 '#type' => 'textfield',
danielebarchiesi@4 196 '#title' => t('Prefix'),
danielebarchiesi@4 197 '#required' => TRUE,
danielebarchiesi@4 198 '#description' => t('Choose a prefix for this namespace, e.g. dc, foaf, sioc. This prefix will be used as an abbreviation for the namespace URI.'),
danielebarchiesi@4 199 );
danielebarchiesi@4 200 $form['ns_uri'] = array(
danielebarchiesi@4 201 '#type' => 'textfield',
danielebarchiesi@4 202 '#title' => t('Namespace URI'),
danielebarchiesi@4 203 '#required' => TRUE,
danielebarchiesi@4 204 '#default_value' => isset($form_state['values']['ns_uri']) ? $form_state['values']['ns_uri'] : NULL,
danielebarchiesi@4 205 '#description' => t("Enter the URI of the namespace. Make sure it ends with either / or #."),
danielebarchiesi@4 206 );
danielebarchiesi@4 207 $form['submit'] = array(
danielebarchiesi@4 208 '#type' => 'submit',
danielebarchiesi@4 209 '#value' => t('Save'),
danielebarchiesi@4 210 );
danielebarchiesi@4 211 return $form;
danielebarchiesi@4 212 }
danielebarchiesi@4 213
danielebarchiesi@4 214 function rdfx_admin_namespaces_form_validate($form, &$form_state) {
danielebarchiesi@4 215 // Loads the XML Namespace regular expression patterns.
danielebarchiesi@4 216 module_load_include('inc', 'rdfx');
danielebarchiesi@4 217
danielebarchiesi@4 218 $prefix = $form_state['values']['prefix'];
danielebarchiesi@4 219 $ns_uri = $form_state['values']['ns_uri'];
danielebarchiesi@4 220
danielebarchiesi@4 221 // Ensures that the namespace is a valid URI.
danielebarchiesi@4 222 if (!valid_url($ns_uri, $absolute = TRUE)) {
danielebarchiesi@4 223 form_set_error('ns_uri', t('The namespace URI must be a valid URI.'));
danielebarchiesi@4 224 }
danielebarchiesi@4 225 // Ensures the namespace URI ends in either / or #.
danielebarchiesi@4 226 if (!preg_match('/(\/|\#)$/', $ns_uri)) {
danielebarchiesi@4 227 form_set_error('ns_uri', t('The namespace URI must end in either a / or a #.'));
danielebarchiesi@4 228 }
danielebarchiesi@4 229 // Ensures the prefix is well formed according to the specification.
danielebarchiesi@4 230 if (!preg_match('/^' . PREFIX .'$/', $prefix)) {
danielebarchiesi@4 231 form_set_error('prefix', t('The prefix must follow the !link.', array('!link' => '<a href="http://www.w3.org/TR/xml-names11/#NT-NCName">XML Namespace Specification</a>')));
danielebarchiesi@4 232 }
danielebarchiesi@4 233 }
danielebarchiesi@4 234
danielebarchiesi@4 235 function rdfx_admin_namespaces_form_submit($form, &$form_state) {
danielebarchiesi@4 236 $prefix = $form_state['values']['prefix'];
danielebarchiesi@4 237 $ns_uri = $form_state['values']['ns_uri'];
danielebarchiesi@4 238 // Prepares a fake empty vocabulary for _rdfx_save_vocabulary() to save the
danielebarchiesi@4 239 // namespace and prefix.
danielebarchiesi@4 240 // @todo use API when http://drupal.org/node/1117646 is fixed.
danielebarchiesi@4 241 $vocabulary = array(
danielebarchiesi@4 242 'title' => array(),
danielebarchiesi@4 243 'description' => array(),
danielebarchiesi@4 244 'namespaces' => array(),
danielebarchiesi@4 245 );
danielebarchiesi@4 246 _rdfx_save_vocabulary($ns_uri, $prefix, $vocabulary);
danielebarchiesi@4 247 drupal_set_message(t('The namespace @namespace has been saved with the prefix @prefix.', array('@namespace' => $ns_uri, '@prefix' => $prefix)));
danielebarchiesi@4 248 }