-
Notifications
You must be signed in to change notification settings - Fork 0
/
exhibit.admin.inc
150 lines (123 loc) · 7.99 KB
/
exhibit.admin.inc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
<?php
// $Id$
//////////////////////////////////////////////////////////////////////////////
// Exhibit API functions
function exhibit_admin_feed_types() {
return array(
'application/json' => t('Exhibit JSON'),
'application/rdf+xml' => t('RDF/XML'),
'application/n3' => t('N3'),
'application/vnd.ms-excel' => t('Excel'),
'text/plain' => t('Tab-separated values'),
'application/x-bibtex' => t('Bibtex'),
'application/vnd.google-spreadsheet' => t('Google Spreadsheet'),
'application/RDFa' => t('RDFa'),
);
}
//////////////////////////////////////////////////////////////////////////////
// Exhibit settings
/**
* Form builder: displays the module configuration screen.
*
* @ingroup forms
* @see system_settings_form()
*/
function exhibit_admin_settings() {
$form = array();
// Exhibit API
$form['api'] = array('#type' => 'fieldset', '#title' => t('Exhibit API'), '#collapsible' => TRUE, '#collapsed' => FALSE);
$form['api']['exhibit_js_url'] = array('#type' => 'textfield', '#title' => t('Exhibit JS API'), '#default_value' => EXHIBIT_JS_URL, '#description' => t('Specify the location from where the Exhibit 2.0 JavaScript <acronym title="Application Programming Interface">API</acronym> will be loaded. By default, it is loaded directly from <a href="http://simile.mit.edu/" target="_blank">SIMILE\'s</a> servers, ensuring the use of the very latest version. However, should you require it, there are instructions available on how to <a href="http://simile.mit.edu/wiki/Exhibit/2.0/Running_Exhibit_Yourself" target="_blank">run Exhibit locally</a>.'));
// View settings
$form['extensions'] = array('#type' => 'fieldset', '#title' => t('Exhibit extensions'), '#collapsible' => TRUE, '#collapsed' => TRUE, '#description' => 'Select the Exhibit extensions you wish to enable below. You can also specify an alternate API location for each extension.');
foreach (exhibit_exhibit_views() as $id => $view) {
if (isset($view->href)) {
$form['extensions']['exhibit_extensions_'. $id] = array('#type' => 'checkbox', '#title' => $view['title'], '#default_value' => variable_get('exhibit_extensions_'. $id, FALSE), '#description' => t(''));
$form['extensions']['exhibit_extensions_'. $id .'_api'] = array('#type' => 'textfield', '#title' => t($view['title'] . ' API'), '#default_value' => variable_get('exhibit_extensions_'. $id .'_api', constant('EXHIBIT_'. strtoupper($id) .'_JS_URL')));
if ($id == 'map') {
$form['extensions']['exhibit_gmap_key'] = array('#type' => 'textfield', '#title' => t('Google Maps API key'), '#default_value' => variable_get('exhibit_gmap_key', ''), '#description' => t('If you have the <a href="http://drupal.org/project/gmap">GMap</a> and/or <a href="http://drupal.org/project/keys">Keys API</a> modules installed and configured, you can leave this blank as Exhibit will pull the Google Maps API key used from <a href="/admin/settings/gmap">that configuration</a>.'));
}
}
}
return system_settings_form($form);
}
//////////////////////////////////////////////////////////////////////////////
// Exhibit feed administration
/**
* Menu callback: displays the data feeds management page.
*/
function exhibit_admin_feeds() {
$head = array(t('Title'), t('Type'), t('URL'), array('data' => t('Operations'), 'colspan' => 2));
$rows = array();
$types = exhibit_admin_feed_types();
foreach (exhibit_get_feeds() as $feed) {
$url_parts = (exhibit_is_link_internal($feed->url) ? parse_url($feed->url) : NULL);
$rows[] = array(
is_numeric($feed->fid) ? check_plain($feed->title) : $feed->title,
check_plain(isset($types[$feed->type]) ? $types[$feed->type] : $feed->type),
(!is_null($url_parts) ?
l(truncate_utf8($feed->url, 56, TRUE, TRUE), $url_parts['path'], array('query' => $url_parts['query'])) :
l(truncate_utf8($feed->url, 56, TRUE, TRUE), $feed->url)),
is_numeric($feed->fid) ? l(t('edit'), 'admin/content/exhibit/edit/' . $feed->fid) : '',
is_numeric($feed->fid) ? l(t('delete'), 'admin/content/exhibit/delete/' . $feed->fid) : '',
);
}
if (empty($rows)) {
$rows[] = array(array('data' => t('No data feeds defined.'), 'colspan' => '5'));
}
return theme('table', $head, $rows);
}
/**
* Form builder: generates a form for adding/editing data feeds.
*
* @ingroup forms
* @see exhibit_admin_feed_form_validate()
* @see exhibit_admin_feed_form_submit()
*/
function exhibit_admin_feed_form(&$form_state, $edit = array('title' => '', 'type' => 'application/json', 'url' => '')) {
$form = array();
$form['fid'] = array('#type' => 'hidden', '#value' => !empty($edit['fid']) ? $edit['fid'] : '');
$form['module'] = array('#type' => 'hidden', '#value' => '');
$form['title'] = array('#type' => 'textfield', '#title' => t('Title'), '#default_value' => $edit['title'], '#maxlength' => 64, '#description' => t('The human-readable name of this data feed. This text will be displayed as part of the list on the data feed management page. This name must begin with a capital letter and contain only letters, numbers, and spaces. This name must be unique.'), '#required' => TRUE);
$form['url'] = array('#type' => 'textfield', '#title' => t('URL'), '#default_value' => $edit['url'], '#maxlength' => 255, '#description' => t('The URL of this data feed, given either as a relative internal path or a full absolute URL.'), '#required' => TRUE);
$form['type'] = array('#type' => 'select', '#title' => t('Type'), '#default_value' => $edit['type'], '#options' => exhibit_admin_feed_types(), '#description' => t('The content type of this data feed. Only the JSON content type is natively supported; any other content types will be automatically converted when loaded.'), '#required' => TRUE);
$form['submit'] = array('#type' => 'submit', '#value' => empty($edit['fid']) ? t('Create new feed') : t('Update feed settings'));
return $form;
}
function exhibit_admin_feed_form_validate($form, &$form_state) {
extract($form_state['values'], EXTR_SKIP | EXTR_REFS);
if (!valid_url($url, FALSE) && !valid_url($url, TRUE)) {
form_set_error('url', t('%url is not a valid URL.', array('%url' => $url)));
}
// TODO: check for duplicate titles and URLs.
}
function exhibit_admin_feed_form_submit($form, &$form_state) {
extract($form_state['values'], EXTR_SKIP | EXTR_REFS);
if (empty($fid)) {
db_query("INSERT INTO {exhibit_feeds} (fid, module, title, type, url) VALUES (NULL, '%s', '%s', '%s', '%s')", $module, $title, $type, $url);
watchdog('exhibit', 'Data feed %title created.', array('%title' => $title), WATCHDOG_NOTICE, l(t('view'), 'admin/content/exhibit'));
drupal_set_message(t('The data feed %title has been created.', array('%title' => $title)));
}
else {
db_query("UPDATE {exhibit_feeds} SET title = '%s', type = '%s', url = '%s' WHERE fid = %d", $title, $type, $url, $fid);
watchdog('exhibit', 'Data feed %title updated.', array('%title' => $title), WATCHDOG_NOTICE, l(t('view'), 'admin/content/exhibit'));
drupal_set_message(t('The data feed %title has been updated.', array('%title' => $title)));
}
$form_state['redirect'] = 'admin/content/exhibit';
}
function exhibit_admin_feed_delete($form_state, $feed) {
$form['fid'] = array('#type' => 'value', '#value' => $feed['fid']);
$form['title'] = array('#type' => 'value', '#value' => $feed['title']);
return confirm_form($form,
t('Are you sure you want to delete the data feed %title?', array('%title' => $feed['title'])),
isset($_GET['destination']) ? $_GET['destination'] : 'admin/content/exhibit',
t('This action cannot be undone.'));
}
function exhibit_admin_feed_delete_submit($form, &$form_state) {
extract($form_state['values'], EXTR_SKIP | EXTR_REFS);
if ($form_state['values']['confirm']) {
db_query("DELETE FROM {exhibit_feeds} WHERE fid = %d", $fid);
watchdog('exhibit', 'Data feed %title deleted.', array('%title' => $title));
drupal_set_message(t('The data feed %title has been deleted.', array('%title' => $title)));
}
$form_state['redirect'] = 'admin/content/exhibit';
}