diff --git a/README.txt b/README.txt index 97de674..54db81c 100644 --- a/README.txt +++ b/README.txt @@ -18,6 +18,7 @@ To submit bug reports and feature suggestions, or to track changes: * BrowsCap (optional, record user agents) * Unfuddle Feedback (optional, Unfuddle ticketing integration) * Mollom (optional, spam prevention) +* Views (optional) -- INSTALLATION -- diff --git a/feedback.info b/feedback.info index db396bb..514be49 100644 --- a/feedback.info +++ b/feedback.info @@ -5,3 +5,4 @@ core = 7.x configure = admin/config/user-interface/feedback files[] = feedback.controller.inc files[] = tests/feedback.test +files[] = feedback_handler_field_feedback_link.inc diff --git a/feedback.module b/feedback.module index 8e47120..bc91bfe 100644 --- a/feedback.module +++ b/feedback.module @@ -572,3 +572,10 @@ function feedback_mollom_form_info($form_id) { ); } } + +/** + * Implements hook_views_api(); + */ +function feedback_views_api() { + return array('api' => 3.0); +} diff --git a/feedback.views.inc b/feedback.views.inc new file mode 100644 index 0000000..85583b1 --- /dev/null +++ b/feedback.views.inc @@ -0,0 +1,170 @@ + 'fid', + 'title' => t('Feedback'), + 'help' => t('Feedback messages submitted to the site.'), + ); + $data['feedback']['table']['join']['users'] = array( + 'left_field' => 'uid', + 'field' => 'uid', + ); + $data['feedback']['fid'] = array( + 'title' => t('Feedback ID'), + 'help' => t('The primary identifier for a feedback message.'), + 'field' => array( + 'handler' => 'views_handler_field_numeric', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_numeric', + ), + 'sort' => array( + 'handler' => 'views_handler_sort_numeric', + ), + ); + $data['feedback']['view_entry'] = array( + 'field' => array( + 'title' => t('Link'), + 'help' => t('Provide a simple link to the feedback entry.'), + 'handler' => 'feedback_handler_field_feedback_link', + ), + ); + $data['feedback']['uid'] = array( + 'title' => t('User Id'), + 'help' => t('The user id of the author of a feedback message.'), + 'relationship' => array( + 'base' => 'users', + 'base field' => 'uid', + 'handler' => 'views_handler_relationship', + 'label' => t('User'), + ), + ); + $data['feedback']['status'] = array( + 'title' => t('Status'), + 'help' => t('The status of a feedback message.'), + 'field' => array( + 'handler' => 'views_handler_field_boolean', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_boolean_operator', + 'label' => t('Feedback status is processed'), + 'type' => 'yes-no', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_boolean', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + $data['feedback']['message'] = array( + 'title' => t('Message'), + 'help' => t('The actual feedback message.'), + 'field' => array( + 'handler' => 'views_handler_field', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + $data['feedback']['location'] = array( + 'title' => t('Location'), + 'help' => t('The internal Drupal path of the page the feedback message was submitted on.'), + 'field' => array( + 'handler' => 'views_handler_field_url', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + $data['feedback']['location_masked'] = array( + 'title' => t('Location Masked'), + 'help' => t('The masked Drupal path of the page the feedback message was submitted on.'), + 'field' => array( + 'handler' => 'views_handler_field_url', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + $data['feedback']['url'] = array( + 'title' => t('URL'), + 'help' => t('The absolute URL of the page the feedback message was submitted on.'), + 'field' => array( + 'handler' => 'views_handler_field_url', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + $data['feedback']['useragent'] = array( + 'title' => t('User agent'), + 'help' => t('The user agent of the feedback message author.'), + 'field' => array( + 'handler' => 'views_handler_field', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + $data['feedback']['timestamp'] = array( + 'title' => t('Timestamp'), + 'help' => t('The UNIX timestamp when the feedback message was created.'), + 'field' => array( + 'click sortable' => TRUE, + 'handler' => 'views_handler_field_date', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_date', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_date', + ), + 'sort' => array( + 'handler' => 'views_handler_sort_date', + ), + ); + return $data; +} diff --git a/feedback.views_default.inc b/feedback.views_default.inc new file mode 100644 index 0000000..079d502 --- /dev/null +++ b/feedback.views_default.inc @@ -0,0 +1,312 @@ +name = 'feedback_messages'; + $view->description = 'Override the default feedback messages report.'; + $view->tag = 'feedback'; + $view->base_table = 'feedback'; + $view->human_name = ''; + $view->core = 0; + $view->api_version = '3.0-alpha1'; + $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ + + /* Display: Defaults */ + $handler = $view->new_display('default', 'Defaults', 'default'); + $handler->display->display_options['title'] = 'Feedback Messages'; + $handler->display->display_options['access']['type'] = 'perm'; + $handler->display->display_options['access']['perm'] = 'view feedback messages'; + $handler->display->display_options['cache']['type'] = 'none'; + $handler->display->display_options['query']['type'] = 'views_query'; + $handler->display->display_options['exposed_form']['type'] = 'basic'; + $handler->display->display_options['pager']['type'] = 'full'; + $handler->display->display_options['pager']['options']['items_per_page'] = 50; + $handler->display->display_options['style_plugin'] = 'table'; + $handler->display->display_options['style_options']['columns'] = array( + 'location' => 'location', + 'timestamp' => 'timestamp', + 'name' => 'name', + 'message' => 'message', + 'useragent' => 'message', + 'view_entry' => 'message', + 'fid' => 'message', + ); + $handler->display->display_options['style_options']['default'] = '-1'; + $handler->display->display_options['style_options']['info'] = array( + 'location' => array( + 'sortable' => 1, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + ), + 'timestamp' => array( + 'sortable' => 1, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + ), + 'name' => array( + 'sortable' => 1, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + ), + 'message' => array( + 'align' => '', + 'separator' => '', + ), + 'useragent' => array( + 'sortable' => 0, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + ), + 'view_entry' => array( + 'align' => '', + 'separator' => '', + ), + 'fid' => array( + 'align' => '', + 'separator' => '', + ), + ); + $handler->display->display_options['style_options']['override'] = 1; + $handler->display->display_options['style_options']['sticky'] = 0; + $handler->display->display_options['style_options']['empty_table'] = 0; + /* Header: Global: Text area */ + $handler->display->display_options['header']['text']['id'] = 'text'; + $handler->display->display_options['header']['text']['table'] = 'views'; + $handler->display->display_options['header']['text']['field'] = 'area'; + $handler->display->display_options['header']['text']['empty'] = FALSE; + $handler->display->display_options['header']['text']['content'] = 'Open Feedback Messages'; + $handler->display->display_options['header']['text']['format'] = 'full_html'; + /* No results behavior: Global: Text area */ + $handler->display->display_options['empty']['area']['id'] = 'area'; + $handler->display->display_options['empty']['area']['table'] = 'views'; + $handler->display->display_options['empty']['area']['field'] = 'area'; + $handler->display->display_options['empty']['area']['empty'] = FALSE; + $handler->display->display_options['empty']['area']['content'] = 'There are no feedback entries.'; + /* Relationship: Feedback: User Id */ + $handler->display->display_options['relationships']['uid']['id'] = 'uid'; + $handler->display->display_options['relationships']['uid']['table'] = 'feedback'; + $handler->display->display_options['relationships']['uid']['field'] = 'uid'; + $handler->display->display_options['relationships']['uid']['required'] = 0; + /* Field: Feedback: Location */ + $handler->display->display_options['fields']['location']['id'] = 'location'; + $handler->display->display_options['fields']['location']['table'] = 'feedback'; + $handler->display->display_options['fields']['location']['field'] = 'location'; + $handler->display->display_options['fields']['location']['alter']['alter_text'] = 0; + $handler->display->display_options['fields']['location']['alter']['make_link'] = 0; + $handler->display->display_options['fields']['location']['alter']['trim'] = 0; + $handler->display->display_options['fields']['location']['alter']['word_boundary'] = 1; + $handler->display->display_options['fields']['location']['alter']['ellipsis'] = 1; + $handler->display->display_options['fields']['location']['alter']['strip_tags'] = 0; + $handler->display->display_options['fields']['location']['alter']['html'] = 0; + $handler->display->display_options['fields']['location']['hide_empty'] = 0; + $handler->display->display_options['fields']['location']['empty_zero'] = 0; + $handler->display->display_options['fields']['location']['display_as_link'] = 1; + /* Field: Feedback: Timestamp */ + $handler->display->display_options['fields']['timestamp']['id'] = 'timestamp'; + $handler->display->display_options['fields']['timestamp']['table'] = 'feedback'; + $handler->display->display_options['fields']['timestamp']['field'] = 'timestamp'; + $handler->display->display_options['fields']['timestamp']['label'] = 'Date'; + $handler->display->display_options['fields']['timestamp']['alter']['alter_text'] = 0; + $handler->display->display_options['fields']['timestamp']['alter']['make_link'] = 0; + $handler->display->display_options['fields']['timestamp']['alter']['absolute'] = 0; + $handler->display->display_options['fields']['timestamp']['alter']['external'] = 0; + $handler->display->display_options['fields']['timestamp']['alter']['replace_spaces'] = 0; + $handler->display->display_options['fields']['timestamp']['alter']['trim'] = 0; + $handler->display->display_options['fields']['timestamp']['alter']['nl2br'] = 0; + $handler->display->display_options['fields']['timestamp']['alter']['word_boundary'] = 1; + $handler->display->display_options['fields']['timestamp']['alter']['ellipsis'] = 1; + $handler->display->display_options['fields']['timestamp']['alter']['strip_tags'] = 0; + $handler->display->display_options['fields']['timestamp']['alter']['html'] = 0; + $handler->display->display_options['fields']['timestamp']['element_label_colon'] = 1; + $handler->display->display_options['fields']['timestamp']['element_default_classes'] = 1; + $handler->display->display_options['fields']['timestamp']['hide_empty'] = 0; + $handler->display->display_options['fields']['timestamp']['empty_zero'] = 0; + $handler->display->display_options['fields']['timestamp']['date_format'] = 'short'; + /* Field: User: Name */ + $handler->display->display_options['fields']['name']['id'] = 'name'; + $handler->display->display_options['fields']['name']['table'] = 'users'; + $handler->display->display_options['fields']['name']['field'] = 'name'; + $handler->display->display_options['fields']['name']['relationship'] = 'uid'; + $handler->display->display_options['fields']['name']['label'] = 'User'; + $handler->display->display_options['fields']['name']['alter']['alter_text'] = 0; + $handler->display->display_options['fields']['name']['alter']['make_link'] = 0; + $handler->display->display_options['fields']['name']['alter']['trim'] = 0; + $handler->display->display_options['fields']['name']['alter']['word_boundary'] = 1; + $handler->display->display_options['fields']['name']['alter']['ellipsis'] = 1; + $handler->display->display_options['fields']['name']['alter']['strip_tags'] = 0; + $handler->display->display_options['fields']['name']['alter']['html'] = 0; + $handler->display->display_options['fields']['name']['hide_empty'] = 0; + $handler->display->display_options['fields']['name']['empty_zero'] = 0; + $handler->display->display_options['fields']['name']['link_to_user'] = 1; + $handler->display->display_options['fields']['name']['overwrite_anonymous'] = 0; + /* Field: Feedback: Message */ + $handler->display->display_options['fields']['message']['id'] = 'message'; + $handler->display->display_options['fields']['message']['table'] = 'feedback'; + $handler->display->display_options['fields']['message']['field'] = 'message'; + $handler->display->display_options['fields']['message']['alter']['alter_text'] = 0; + $handler->display->display_options['fields']['message']['alter']['make_link'] = 0; + $handler->display->display_options['fields']['message']['alter']['absolute'] = 0; + $handler->display->display_options['fields']['message']['alter']['external'] = 0; + $handler->display->display_options['fields']['message']['alter']['replace_spaces'] = 0; + $handler->display->display_options['fields']['message']['alter']['trim'] = 0; + $handler->display->display_options['fields']['message']['alter']['nl2br'] = 0; + $handler->display->display_options['fields']['message']['alter']['word_boundary'] = 1; + $handler->display->display_options['fields']['message']['alter']['ellipsis'] = 1; + $handler->display->display_options['fields']['message']['alter']['strip_tags'] = 0; + $handler->display->display_options['fields']['message']['alter']['html'] = 0; + $handler->display->display_options['fields']['message']['element_type'] = 'div'; + $handler->display->display_options['fields']['message']['element_label_colon'] = 1; + $handler->display->display_options['fields']['message']['element_default_classes'] = 1; + $handler->display->display_options['fields']['message']['hide_empty'] = 0; + $handler->display->display_options['fields']['message']['empty_zero'] = 0; + /* Field: Feedback: User agent */ + $handler->display->display_options['fields']['useragent']['id'] = 'useragent'; + $handler->display->display_options['fields']['useragent']['table'] = 'feedback'; + $handler->display->display_options['fields']['useragent']['field'] = 'useragent'; + $handler->display->display_options['fields']['useragent']['label'] = ''; + $handler->display->display_options['fields']['useragent']['alter']['alter_text'] = 0; + $handler->display->display_options['fields']['useragent']['alter']['make_link'] = 0; + $handler->display->display_options['fields']['useragent']['alter']['absolute'] = 0; + $handler->display->display_options['fields']['useragent']['alter']['external'] = 0; + $handler->display->display_options['fields']['useragent']['alter']['replace_spaces'] = 0; + $handler->display->display_options['fields']['useragent']['alter']['trim'] = 0; + $handler->display->display_options['fields']['useragent']['alter']['nl2br'] = 0; + $handler->display->display_options['fields']['useragent']['alter']['word_boundary'] = 1; + $handler->display->display_options['fields']['useragent']['alter']['ellipsis'] = 1; + $handler->display->display_options['fields']['useragent']['alter']['strip_tags'] = 0; + $handler->display->display_options['fields']['useragent']['alter']['html'] = 0; + $handler->display->display_options['fields']['useragent']['element_type'] = 'div'; + $handler->display->display_options['fields']['useragent']['element_label_colon'] = 1; + $handler->display->display_options['fields']['useragent']['element_default_classes'] = 1; + $handler->display->display_options['fields']['useragent']['hide_empty'] = 0; + $handler->display->display_options['fields']['useragent']['empty_zero'] = 0; + /* Field: Feedback: Link */ + $handler->display->display_options['fields']['view_entry']['id'] = 'view_entry'; + $handler->display->display_options['fields']['view_entry']['table'] = 'feedback'; + $handler->display->display_options['fields']['view_entry']['field'] = 'view_entry'; + $handler->display->display_options['fields']['view_entry']['label'] = ''; + $handler->display->display_options['fields']['view_entry']['alter']['alter_text'] = 0; + $handler->display->display_options['fields']['view_entry']['alter']['make_link'] = 0; + $handler->display->display_options['fields']['view_entry']['alter']['absolute'] = 0; + $handler->display->display_options['fields']['view_entry']['alter']['external'] = 0; + $handler->display->display_options['fields']['view_entry']['alter']['replace_spaces'] = 0; + $handler->display->display_options['fields']['view_entry']['alter']['trim'] = 0; + $handler->display->display_options['fields']['view_entry']['alter']['nl2br'] = 0; + $handler->display->display_options['fields']['view_entry']['alter']['word_boundary'] = 1; + $handler->display->display_options['fields']['view_entry']['alter']['ellipsis'] = 1; + $handler->display->display_options['fields']['view_entry']['alter']['strip_tags'] = 0; + $handler->display->display_options['fields']['view_entry']['alter']['html'] = 0; + $handler->display->display_options['fields']['view_entry']['element_label_colon'] = 0; + $handler->display->display_options['fields']['view_entry']['element_default_classes'] = 1; + $handler->display->display_options['fields']['view_entry']['hide_empty'] = 0; + $handler->display->display_options['fields']['view_entry']['empty_zero'] = 0; + /* Field: Feedback: Delete link */ + $handler->display->display_options['fields']['fid']['id'] = 'fid'; + $handler->display->display_options['fields']['fid']['table'] = 'feedback'; + $handler->display->display_options['fields']['fid']['field'] = 'fid'; + $handler->display->display_options['fields']['fid']['ui_name'] = 'Feedback: Delete link'; + $handler->display->display_options['fields']['fid']['label'] = ''; + $handler->display->display_options['fields']['fid']['alter']['alter_text'] = 1; + $handler->display->display_options['fields']['fid']['alter']['text'] = ' delete'; + $handler->display->display_options['fields']['fid']['alter']['make_link'] = 1; + $handler->display->display_options['fields']['fid']['alter']['path'] = 'admin/reports/feedback/[fid]/delete'; + $handler->display->display_options['fields']['fid']['alter']['absolute'] = 0; + $handler->display->display_options['fields']['fid']['alter']['external'] = 0; + $handler->display->display_options['fields']['fid']['alter']['replace_spaces'] = 0; + $handler->display->display_options['fields']['fid']['alter']['trim'] = 0; + $handler->display->display_options['fields']['fid']['alter']['nl2br'] = 0; + $handler->display->display_options['fields']['fid']['alter']['word_boundary'] = 1; + $handler->display->display_options['fields']['fid']['alter']['ellipsis'] = 1; + $handler->display->display_options['fields']['fid']['alter']['strip_tags'] = 0; + $handler->display->display_options['fields']['fid']['alter']['html'] = 0; + $handler->display->display_options['fields']['fid']['element_label_colon'] = 0; + $handler->display->display_options['fields']['fid']['element_wrapper_type'] = 'span'; + $handler->display->display_options['fields']['fid']['element_default_classes'] = 1; + $handler->display->display_options['fields']['fid']['hide_empty'] = 0; + $handler->display->display_options['fields']['fid']['empty_zero'] = 0; + $handler->display->display_options['fields']['fid']['separator'] = ''; + $handler->display->display_options['fields']['fid']['format_plural'] = 0; + /* Sort criterion: Feedback: Timestamp */ + $handler->display->display_options['sorts']['timestamp']['id'] = 'timestamp'; + $handler->display->display_options['sorts']['timestamp']['table'] = 'feedback'; + $handler->display->display_options['sorts']['timestamp']['field'] = 'timestamp'; + /* Filter criterion: Feedback: Status */ + $handler->display->display_options['filters']['status']['id'] = 'status'; + $handler->display->display_options['filters']['status']['table'] = 'feedback'; + $handler->display->display_options['filters']['status']['field'] = 'status'; + $handler->display->display_options['filters']['status']['value'] = '0'; + $handler->display->display_options['filters']['status']['expose']['operator'] = FALSE; + + /* Display: Page */ + $handler = $view->new_display('page', 'Page', 'page_1'); + $handler->display->display_options['path'] = 'admin/reports/feedback'; + $handler->display->display_options['menu']['type'] = 'normal'; + $handler->display->display_options['menu']['title'] = 'Feedback messages'; + $handler->display->display_options['menu']['description'] = 'View feedback messages.'; + $handler->display->display_options['menu']['weight'] = '0'; + $handler->display->display_options['menu']['name'] = 'management'; + + /* Display: Attachment */ + $handler = $view->new_display('attachment', 'Attachment', 'attachment_1'); + $handler->display->display_options['defaults']['title'] = FALSE; + $handler->display->display_options['pager']['type'] = 'some'; + $handler->display->display_options['defaults']['header'] = FALSE; + /* Header: Global: Text area */ + $handler->display->display_options['header']['text']['id'] = 'area'; + $handler->display->display_options['header']['text']['table'] = 'views'; + $handler->display->display_options['header']['text']['field'] = 'area'; + $handler->display->display_options['header']['text']['empty'] = FALSE; + $handler->display->display_options['header']['text']['content'] = 'Processed Feedback Messages'; + $handler->display->display_options['defaults']['filters'] = FALSE; + /* Filter criterion: Feedback: Status */ + $handler->display->display_options['filters']['status']['id'] = 'status'; + $handler->display->display_options['filters']['status']['table'] = 'feedback'; + $handler->display->display_options['filters']['status']['field'] = 'status'; + $handler->display->display_options['filters']['status']['value'] = '1'; + $handler->display->display_options['filters']['status']['expose']['operator'] = FALSE; + $handler->display->display_options['displays'] = array( + 'page_1' => 'page_1', + 'default' => 0, + ); + $handler->display->display_options['attachment_position'] = 'after'; + $handler->display->display_options['render_pager'] = TRUE; + $translatables['feedback_messages'] = array( + t('Defaults'), + t('Feedback Messages'), + t('more'), + t('Apply'), + t('Reset'), + t('Sort by'), + t('Asc'), + t('Desc'), + t('Items per page'), + t('- All -'), + t('Offset'), + t('Open Feedback Messages'), + t('There are no feedback entries.'), + t('User'), + t('Location'), + t('Date'), + t('Message'), + t(' delete'), + t('admin/reports/feedback/[fid]/delete'), + t('.'), + t('Page'), + t('Attachment'), + t('Processed Feedback Messages'), + ); + $views[$view->name] = $view; + return $views; +} diff --git a/feedback_handler_field_feedback_link.inc b/feedback_handler_field_feedback_link.inc new file mode 100644 index 0000000..bd8e685 --- /dev/null +++ b/feedback_handler_field_feedback_link.inc @@ -0,0 +1,44 @@ +additional_fields['fid'] = 'fid'; + } + + function option_definition() { + $options = parent::option_definition(); + + $options['text'] = array('default' => '', 'translatable' => TRUE); + + return $options; + } + + function options_form(&$form, &$form_state) { + $form['text'] = array( + '#type' => 'textfield', + '#title' => t('Text to display'), + '#default_value' => $this->options['text'], + ); + parent::options_form($form, $form_state); + } + + function query() { + $this->ensure_my_table(); + $this->add_additional_fields(); + } + + function render($values) { + $value = $this->get_value($values, 'fid'); + return $this->render_link($this->sanitize_value($value), $values); + } + + function render_link($data, $values) { + $this->options['alter']['make_link'] = TRUE; + $this->options['alter']['path'] = "admin/reports/feedback/$data"; + $text = !empty($this->options['text']) ? $this->options['text'] : t('view'); + return $text; + } +}