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 }
|