About
'; + $output .= '' . 'The link provides a standard custom content field for links. Links can be easily added to any content types and profiles and include advanced validating and different ways of storing internal or external links and URLs. It also supports additional link text title, site wide tokens for titles and title attributes, target attributes, css class attribution, static repeating values, input conversion, and many more.' . '
'; + $output .= '' . 'Requirements / Dependencies' . '
'; + $output .= '' . 'Fields API is provided already by core [no dependencies].' . '
'; + $output .= 'Configuration
'; + $output .= '' . 'Configuration is only slightly more complicated than a text field. Link text titles for URLs can be made required, set as instead of URL, optional (default), or left out entirely. If no link text title is provided, the trimmed version of the complete URL will be displayed. The target attribute should be set to "_blank", "top", or left out completely (checkboxes provide info). The rel=nofollow attribute prevents the link from being followed by certain search engines.' . '
'; + return $output; + } +} + /** * Implements hook_field_info(). */ @@ -98,6 +112,7 @@ function link_field_instance_settings_form($field, $instance) { 'optional' => t('Optional Title'), 'required' => t('Required Title'), 'value' => t('Static Title'), + 'select' => t('Selected Title'), 'none' => t('No Title'), ); @@ -111,9 +126,26 @@ function link_field_instance_settings_form($field, $instance) { $form['title_value'] = array( '#type' => 'textfield', - '#title' => t('Static title'), + '#title' => t('Static or default title'), '#default_value' => isset($instance['settings']['title_value']) ? $instance['settings']['title_value'] : '', - '#description' => t('This title will always be used if “Static Title” is selected above.'), + '#description' => t('This title will 1) always be used if "Static Title" is selected above, or 2) used if "Optional title" is selected above and no title is entered when creating content.'), + '#states' => array( + 'visible' => array( + ':input[name="instance[settings][title]"]' => array('value' => 'value'), + ), + ), + ); + + $form['title_allowed_values'] = array( + '#type' => 'textarea', + '#title' => t('Title allowed values'), + '#default_value' => isset($instance['settings']['title_allowed_values']) ? $instance['settings']['title_allowed_values'] : '', + '#description' => t('When using "Selected Title", you can allow users to select the title from a limited set of values (eg. Home, Office, Other). Enter here all possible values that title can take, one value per line.'), + '#states' => array( + 'visible' => array( + ':input[name="instance[settings][title]"]' => array('value' => 'select'), + ), + ), ); $form['title_label_use_field_label'] = array( @@ -181,7 +213,7 @@ function link_field_instance_settings_form($field, $instance) { $form['attributes']['rel'] = array( '#type' => 'textfield', '#title' => t('Rel Attribute'), - '#description' => t('When output, this link will have this rel attribute. The most common usage is rel="nofollow" which prevents some search engines from spidering entered links.'), + '#description' => t('When output, this link will have this rel attribute. The most common usage is rel="nofollow" which prevents some search engines from spidering entered links.'), '#default_value' => empty($instance['settings']['attributes']['rel']) ? '' : $instance['settings']['attributes']['rel'], '#field_prefix' => 'rel = "', '#field_suffix' => '"', @@ -218,7 +250,7 @@ function link_field_instance_settings_form($field, $instance) { $form['attributes']['title'] = array( '#title' => t("Default link 'title' Attribute"), '#type' => 'textfield', - '#description' => t('When output, links will use this "title" attribute if the user does not provide one and when different from the link text. Read WCAG 1.0 Guidelines for links comformances. Tokens values will be evaluated.'), + '#description' => t('When output, links will use this "title" attribute if the user does not provide one and when different from the link text. Read WCAG 1.0 Guidelines for links comformances. Tokens values will be evaluated.'), '#default_value' => empty($instance['settings']['attributes']['title']) ? '' : $instance['settings']['attributes']['title'], '#field_prefix' => 'title = "', '#field_suffix' => '"', @@ -228,11 +260,17 @@ function link_field_instance_settings_form($field, $instance) { } /** + * Form validate. + * * #element_validate handler for link_field_instance_settings_form(). */ function link_field_settings_form_validate($element, &$form_state, $complete_form) { if ($form_state['values']['instance']['settings']['title'] === 'value' && empty($form_state['values']['instance']['settings']['title_value'])) { - form_set_error('title_value', t('A default title must be provided if the title is a static value.')); + form_set_error('instance][settings][title_value', t('A default title must be provided if the title is a static value.')); + } + if ($form_state['values']['instance']['settings']['title'] === 'select' + && empty($form_state['values']['instance']['settings']['title_allowed_values'])) { + form_set_error('instance][settings][title_allowed_values', t('You must enter one or more allowed values for link Title, the title is a selected value.')); } if (!empty($form_state['values']['instance']['settings']['display']['url_cutoff']) && !is_numeric($form_state['values']['instance']['settings']['display']['url_cutoff'])) { form_set_error('display', t('URL Display Cutoff value must be numeric.')); @@ -277,6 +315,16 @@ function link_field_validate($entity_type, $entity, $field, $instance, $langcode } } + foreach ($items as $delta => $value) { + if (isset($value['attributes']) && is_string($value['attributes'])) { + $errors[$field['field_name']][$langcode][$delta][] = array( + 'error' => 'link_required', + 'message' => t('String values are not acceptable for attributes.'), + 'error_element' => array('url' => TRUE, 'title' => FALSE), + ); + } + } + if ($instance['settings']['url'] === 'optional' && $instance['settings']['title'] === 'optional' && $instance['required'] && !$optional_field_found) { $errors[$field['field_name']][$langcode][0][] = array( 'error' => 'link_required', @@ -343,10 +391,10 @@ function link_field_widget_form(&$form, &$form_state, $field, $instance, $langco * Implements hook_field_widget_error(). */ function link_field_widget_error($element, $error, $form, &$form_state) { - if ($error['error_element']['title']) { + if (!empty($error['error_element']['title'])) { form_error($element['title'], $error['message']); } - elseif ($error['error_element']['url']) { + elseif (!empty($error['error_element']['url'])) { form_error($element['url'], $error['message']); } } @@ -371,8 +419,20 @@ function _link_load($field, $item, $instance) { /** * Prepares the item attributes and url for storage. + * + * @param array $item + * Link field values. + * @param array $delta + * The sequence number for current values. + * @param array $field + * The field structure array. + * @param object $entity + * Entity object. + * + * @codingStandardsIgnoreStart */ function _link_process(&$item, $delta, $field, $entity) { + // @codingStandardsIgnoreEnd // Trim whitespace from URL. if (!empty($item['url'])) { $item['url'] = trim($item['url']); @@ -403,7 +463,7 @@ function _link_process(&$item, $delta, $field, $entity) { function _link_validate(&$item, $delta, $field, $entity, $instance, $langcode, &$optional_field_found, &$errors) { if ($item['url'] && !(isset($instance['default_value'][$delta]['url']) && $item['url'] === $instance['default_value'][$delta]['url'] && !$instance['required'])) { // Validate the link. - if (!link_validate_url(trim($item['url']), $langcode)) { + if (!link_validate_url(trim($item['url']))) { $errors[$field['field_name']][$langcode][$delta][] = array( 'error' => 'link_required', 'message' => t('The value %value provided for %field is not a valid URL.', array( @@ -430,9 +490,10 @@ function _link_validate(&$item, $delta, $field, $entity, $instance, $langcode, & 'error_element' => array('url' => TRUE, 'title' => FALSE), ); } - // In a totally bizzaro case, where URLs and titles are optional but the field is required, ensure there is at least one link. + // In a totally bizzaro case, where URLs and titles are optional but the field + // is required, ensure there is at least one link. if ($instance['settings']['url'] === 'optional' && $instance['settings']['title'] === 'optional' - && (strlen(trim($item['url'])) !== 0 || strlen(trim($item['title'])) !== 0)) { + && (strlen(trim($item['url'])) !== 0 || strlen(trim($item['title'])) !== 0)) { $optional_field_found = TRUE; } // Require entire field. @@ -456,8 +517,11 @@ function _link_validate(&$item, $delta, $field, $entity, $instance, $langcode, & * The CCK field definition. * @param object $entity * The entity containing this link. + * + * @codingStandardsIgnoreStart */ function _link_sanitize(&$item, $delta, &$field, $instance, &$entity) { + // @codingStandardsIgnoreEnd // Don't try to process empty links. if (empty($item['url']) && empty($item['title'])) { return; @@ -471,7 +535,7 @@ function _link_sanitize(&$item, $delta, &$field, $instance, &$entity) { $entity_info = entity_get_info($entity_type); $property_id = $entity_info['entity keys']['id']; $entity_token_type = isset($entity_info['token type']) ? $entity_info['token type'] : ( - $entity_type == 'taxonomy_term' || $entity_type == 'taxonomy_vocabulary' ? str_replace('taxonomy_', '', $entity_type) : $entity_type + $entity_type == 'taxonomy_term' || $entity_type == 'taxonomy_vocabulary' ? str_replace('taxonomy_', '', $entity_type) : $entity_type ); if (isset($instance['settings']['enable_tokens']) && $instance['settings']['enable_tokens']) { $text_tokens = token_scan($item['url']); @@ -499,10 +563,11 @@ function _link_sanitize(&$item, $delta, &$field, $instance, &$entity) { if (!empty($url_parts['url'])) { $item['url'] = url($url_parts['url'], - array('query' => isset($url_parts['query']) ? $url_parts['query'] : NULL, - 'fragment' => isset($url_parts['fragment']) ? $url_parts['fragment'] : NULL, - 'absolute' => !empty($instance['settings']['absolute_url']), - 'html' => TRUE, + array( + 'query' => isset($url_parts['query']) ? $url_parts['query'] : NULL, + 'fragment' => isset($url_parts['fragment']) ? $url_parts['fragment'] : NULL, + 'absolute' => !empty($instance['settings']['absolute_url']), + 'html' => TRUE, ) ); } @@ -534,15 +599,20 @@ function _link_sanitize(&$item, $delta, &$field, $instance, &$entity) { } } // Use the title defined by the user at the widget level. - elseif (isset($item['title'])) { + elseif (drupal_strlen(trim($item['title']))) { $title = $item['title']; } + // Use the static title if a user-defined title is optional and a static title + // has been defined. + elseif ($instance['settings']['title'] == 'optional' && drupal_strlen(trim($instance['settings']['title_value']))) { + $title = $instance['settings']['title_value']; + } else { $title = ''; } // Replace title tokens. - if ($title && ($instance['settings']['title'] == 'value' || $instance['settings']['enable_tokens'])) { + if ($title && $instance['settings']['enable_tokens']) { $text_tokens = token_scan($title); if (!empty($text_tokens)) { // Load the entity if necessary for entities in views. @@ -555,10 +625,25 @@ function _link_sanitize(&$item, $delta, &$field, $instance, &$entity) { } $title = token_replace($title, array($entity_token_type => $entity_loaded)); } - $title = filter_xss($title, array('b', 'br', 'code', 'em', 'i', 'img', 'span', 'strong', 'sub', 'sup', 'tt', 'u')); + } + if ($title && ($instance['settings']['title'] == 'value' || $instance['settings']['enable_tokens'])) { + $title = filter_xss($title, array( + 'b', + 'br', + 'code', + 'em', + 'i', + 'img', + 'span', + 'strong', + 'sub', + 'sup', + 'tt', + 'u', + )); $item['html'] = TRUE; } - $item['title'] = empty($title) ? $item['display_url'] : $title; + $item['title'] = empty($title) && $title !== '0' ? $item['display_url'] : $title; if (!isset($item['attributes'])) { $item['attributes'] = array(); @@ -605,7 +690,7 @@ function _link_sanitize(&$item, $delta, &$field, $instance, &$entity) { // Handle "title" link attribute. if (!empty($item['attributes']['title']) && module_exists('token')) { $text_tokens = token_scan($item['attributes']['title']); - if (!empty($text_tokens)) { + if (!empty($text_tokens)) { // Load the entity (necessary for entities in views). if (isset($entity->{$property_id})) { $entity_loaded = entity_load($entity_type, array($entity->{$property_id})); @@ -616,7 +701,20 @@ function _link_sanitize(&$item, $delta, &$field, $instance, &$entity) { } $item['attributes']['title'] = token_replace($item['attributes']['title'], array($entity_token_type => $entity_loaded)); } - $item['attributes']['title'] = filter_xss($item['attributes']['title'], array('b', 'br', 'code', 'em', 'i', 'img', 'span', 'strong', 'sub', 'sup', 'tt', 'u')); + $item['attributes']['title'] = filter_xss($item['attributes']['title'], array( + 'b', + 'br', + 'code', + 'em', + 'i', + 'img', + 'span', + 'strong', + 'sub', + 'sup', + 'tt', + 'u', + )); } // Handle attribute classes. if (!empty($item['attributes']['class'])) { @@ -668,7 +766,8 @@ function _link_parse_url($url) { * Replaces the PHP parse_str() function. * * Because parse_str replaces the following characters in query parameters name - * in order to maintain compatibility with deprecated register_globals directive: + * in order to maintain compatibility with deprecated register_globals + * directive: * * - chr(32) ( ) (space) * - chr(46) (.) (dot) @@ -715,7 +814,14 @@ function link_theme() { 'variables' => array('element' => NULL, 'field' => NULL), ), 'link_formatter_link_domain' => array( - 'variables' => array('element' => NULL, 'display' => NULL, 'field' => NULL), + 'variables' => array( + 'element' => NULL, + 'display' => NULL, + 'field' => NULL, + ), + ), + 'link_formatter_link_no_protocol' => array( + 'variables' => array('element' => NULL, 'field' => NULL), ), 'link_formatter_link_title_plain' => array( 'variables' => array('element' => NULL, 'field' => NULL), @@ -802,7 +908,8 @@ function _link_default_attributes() { * Build the form element. When creating a form using FAPI #process, * note that $element['#value'] is already set. * - * The $fields array is in $complete_form['#field_info'][$element['#field_name']]. + * The $fields array is in + * $complete_form['#field_info'][$element['#field_name']]. */ function link_field_process($element, $form_state, $complete_form) { $instance = field_widget_instance($element, $form_state); @@ -814,7 +921,7 @@ function link_field_process($element, $form_state, $complete_form) { '#required' => ($element['#delta'] == 0 && $settings['url'] !== 'optional') ? $element['#required'] : FALSE, '#default_value' => isset($element['#value']['url']) ? $element['#value']['url'] : NULL, ); - if ($settings['title'] !== 'none' && $settings['title'] !== 'value') { + if (in_array($settings['title'], array('optional', 'required'))) { // Figure out the label of the title field. if (!empty($settings['title_label_use_field_label'])) { // Use the element label as the title field label. @@ -826,15 +933,31 @@ function link_field_process($element, $form_state, $complete_form) { $title_label = t('Title'); } + // Default value. + $title_maxlength = 128; + if (!empty($settings['title_maxlength'])) { + $title_maxlength = $settings['title_maxlength']; + } + $element['title'] = array( '#type' => 'textfield', - '#maxlength' => $settings['title_maxlength'], + '#maxlength' => $title_maxlength, '#title' => $title_label, - '#description' => t('The link title is limited to @maxlength characters maximum.', array('@maxlength' => $settings['title_maxlength'])), + '#description' => t('The link title is limited to @maxlength characters maximum.', array('@maxlength' => $title_maxlength)), '#required' => ($settings['title'] == 'required' && (($element['#delta'] == 0 && $element['#required']) || !empty($element['#value']['url']))) ? TRUE : FALSE, '#default_value' => isset($element['#value']['title']) ? $element['#value']['title'] : NULL, ); } + elseif ($settings['title'] == 'select') { + $options = drupal_map_assoc(array_filter(explode("\n", str_replace("\r", "\n", trim($settings['title_allowed_values']))))); + $element['title'] = array( + '#type' => 'select', + '#title' => t('Title'), + '#description' => t('Select the a title for this link.'), + '#default_value' => isset($element['#value']['title']) ? $element['#value']['title'] : NULL, + '#options' => $options, + ); + } // Initialize field attributes as an array if it is not an array yet. if (!is_array($settings['attributes'])) { @@ -871,7 +994,8 @@ function link_field_process($element, $form_state, $complete_form) { } // If the title field is available or there are field accepts multiple values - // then allow the individual field items display the required asterisk if needed. + // then allow the individual field items display the required asterisk if + // needed. if (isset($element['title']) || isset($element['_weight'])) { // To prevent an extra required indicator, disable the required flag on the // base element since all the sub-fields are already required if desired. @@ -924,6 +1048,11 @@ function link_field_formatter_info() { 'strip_www' => FALSE, ), ), + 'link_no_protocol' => array( + 'label' => t('URL with the protocol removed'), + 'field types' => array('link_field'), + 'multiple values' => FIELD_BEHAVIOR_DEFAULT, + ), 'link_short' => array( 'label' => t('Short, as link with title "Link"'), 'field types' => array('link_field'), @@ -963,8 +1092,9 @@ function link_field_formatter_settings_form($field, $instance, $view_mode, $form * Implements hook_field_formatter_settings_summary(). */ function link_field_formatter_settings_summary($field, $instance, $view_mode) { + $display = $instance['display'][$view_mode]; - $settings = $display['settings']; + if ($display['type'] == 'link_domain') { if ($display['settings']['strip_www']) { return t('Strip www. from domain'); @@ -1009,7 +1139,7 @@ function theme_link_formatter_link_default($vars) { } // If only a title, display the title. elseif (!empty($vars['element']['title'])) { - return $link_options['html'] ? $vars['element']['title'] : check_plain($vars['element']['title']); + return !empty($link_options['html']) ? $vars['element']['title'] : check_plain($vars['element']['title']); } elseif (!empty($vars['element']['url'])) { return l($vars['element']['title'], $vars['element']['url'], $link_options); @@ -1061,11 +1191,27 @@ function theme_link_formatter_link_domain($vars) { return $vars['element']['url'] ? l($domain, $vars['element']['url'], $link_options) : ''; } +/** + * Formats a link without the http:// or https://. + */ +function theme_link_formatter_link_no_protocol($vars) { + $link_options = $vars['element']; + unset($link_options['title']); + unset($link_options['url']); + // We drop any scheme of the url. + $scheme = parse_url($vars['element']['url']); + $search = '/' . preg_quote($scheme['scheme'] . '://', '/') . '/'; + $replace = ''; + $display_url = preg_replace($search, $replace, $vars['element']['url'], 1); + + return $vars['element']['url'] ? l($display_url, $vars['element']['url'], $link_options) : ''; +} + /** * Formats a link's title as plain text. */ function theme_link_formatter_link_title_plain($vars) { - return empty($vars['element']['title']) ? '' : check_plain($vars['element']['title']); + return empty($vars['element']['title']) ? '' : check_plain(decode_entities($vars['element']['title'])); } /** @@ -1125,7 +1271,8 @@ function theme_link_formatter_link_separate($vars) { /** * Implements hook_token_list(). * - * @TODO: hook_token_list no longer exists - this should change to hook_token_info(). + * @TODO: hook_token_list no longer exists - this should change to + * hook_token_info(). */ function link_token_list($type = 'all') { if ($type === 'field' || $type === 'all') { @@ -1140,7 +1287,8 @@ function link_token_list($type = 'all') { /** * Implements hook_token_values(). * - * @TODO: hook_token_values no longer exists - this should change to hook_tokens(). + * @TODO: hook_token_values no longer exists - this should change to + * hook_tokens(). */ function link_token_values($type, $object = NULL) { if ($type === 'field') { @@ -1168,12 +1316,12 @@ function link_views_api() { * Forms a valid URL if possible from an entered address. * * Trims whitespace and automatically adds an http:// to addresses without a - * protocol specified + * protocol specified. * * @param string $url * The url entered by the user. * @param string $protocol - * The protocol to be prepended to the url if one is not specified + * The protocol to be prepended to the url if one is not specified. */ function link_cleanup_url($url, $protocol = 'http') { $url = trim($url); @@ -1183,9 +1331,10 @@ function link_cleanup_url($url, $protocol = 'http') { // Check if there is no protocol specified. $protocol_match = preg_match("/^([a-z0-9][a-z0-9\.\-_]*:\/\/)/i", $url); if (empty($protocol_match)) { - // But should there be? Add an automatic http:// if it starts with a domain name. - $LINK_DOMAINS = _link_domains(); - $domain_match = preg_match('/^(([a-z0-9]([a-z0-9\-_]*\.)+)(' . $LINK_DOMAINS . '|[a-z]{2}))/i', $url); + // But should there be? Add an automatic http:// if it starts with a + // domain name. + $link_domains = _link_domains(); + $domain_match = preg_match('/^(([a-z0-9]([a-z0-9\-_]*\.)+)(' . $link_domains . '|[a-z]{2}))/i', $url); if (!empty($domain_match)) { $url = $protocol . "://" . $url; } @@ -1195,6 +1344,31 @@ function link_cleanup_url($url, $protocol = 'http') { return $url; } +/** + * Cleaner of relatives urls. + * + * @param string $url + * The url to clean up the relative protocol. + */ +function _link_clean_relative($url) { + $check = substr($url, 0, 2); + if (isset($_SERVER['HTTPS']) && + ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) || + isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && + $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') { + $protocol = 'https://'; + } + else { + $protocol = 'http://'; + } + + if ($check == '//') { + $url = str_replace('//', $protocol, $url); + } + + return $url; +} + /** * Validates a URL. * @@ -1210,96 +1384,127 @@ function link_cleanup_url($url, $protocol = 'http') { */ function link_validate_url($text) { // @TODO Complete letters. - $LINK_ICHARS_DOMAIN = (string) html_entity_decode(implode("", array( - "æ", // æ - "Æ", // Æ + // @codingStandardsIgnoreStart + $link_ichars_domain = (string) html_entity_decode(implode("", array( + "¿", // ¿ "À", // À - "à", // à "Á", // Á - "á", // á "Â", //  - "â", // â - "å", // å - "Å", // Å - "ä", // ä + "Ã", // à "Ä", // Ä + "Å", // Å + "Æ", // Æ "Ç", // Ç - "ç", // ç - "Ð", // Ð - "ð", // ð "È", // È - "è", // è "É", // É - "é", // é "Ê", // Ê - "ê", // ê "Ë", // Ë - "ë", // ë + "Ì", // Ì + "Í", // Í "Î", // Î - "î", // î "Ï", // Ï - "ï", // ï - "ø", // ø - "Ø", // Ø - "ö", // ö - "Ö", // Ö + "Ð", // Ð + "Ñ", // Ñ + "Ò", // Ò + "Ó", // Ó "Ô", // Ô - "ô", // ô "Õ", // Õ - "õ", // õ - "Œ", // Œ - "œ", // œ - "ü", // ü - "Ü", // Ü + "Ö", // Ö + // × + "Ø", // Ø "Ù", // Ù - "ù", // ù + "Ú", // Ú "Û", // Û - "û", // û - "Ÿ", // Ÿ - "ÿ", // ÿ - "Ñ", // Ñ - "ñ", // ñ - "þ", // þ + "Ü", // Ü + "Ý", // Ý "Þ", // Þ + // ß (see LINK_ICHARS) + "à", // à + "á", // á + "â", // â + "ã", // ã + "ä", // ä + "å", // å + "æ", // æ + "ç", // ç + "è", // è + "é", // é + "ê", // ê + "ë", // ë + "ì", // ì + "í", // í + "î", // î + "ï", // ï + "ð", // ð + "ñ", // ñ + "ò", // ò + "ó", // ó + "ô", // ô + "õ", // õ + "ö", // ö + // ÷ + "ø", // ø + "ù", // ù + "ú", // ú + "û", // û + "ü", // ü "ý", // ý - "Ý", // Ý - "¿", // ¿ - )), ENT_QUOTES, 'UTF-8'); - - $LINK_ICHARS = $LINK_ICHARS_DOMAIN . (string) html_entity_decode(implode("", array( - "ß", // ß + "þ", // þ + "ÿ", // ÿ + "Œ", // Œ + "œ", // œ + "Ÿ", // Ÿ )), ENT_QUOTES, 'UTF-8'); - $allowed_protocols = variable_get('filter_allowed_protocols', array('http', 'https', 'ftp', 'news', 'nntp', 'telnet', 'mailto', 'irc', 'ssh', 'sftp', 'webcal')); - $LINK_DOMAINS = _link_domains(); - - // Starting a parenthesis group with (?: means that it is grouped, but is not captured. + // @codingStandardsIgnoreEnd + + $link_ichars = $link_ichars_domain . (string) html_entity_decode(implode("", array( + // ß. + "ß", + )), ENT_QUOTES, 'UTF-8'); + $allowed_protocols = variable_get('filter_allowed_protocols', array( + 'http', + 'https', + 'ftp', + 'news', + 'nntp', + 'telnet', + 'mailto', + 'irc', + 'ssh', + 'sftp', + 'webcal', + )); + $link_domains = _link_domains(); + + // Starting a parenthesis group with (?: means that it is grouped, but is not + // captured. $protocol = '((?:' . implode("|", $allowed_protocols) . '):\/\/)'; - $authentication = "(?:(?:(?:[\w\.\-\+!$&'\(\)*\+,;=" . $LINK_ICHARS . "]|%[0-9a-f]{2})+(?::(?:[\w" . $LINK_ICHARS . "\.\-\+%!$&'\(\)*\+,;=]|%[0-9a-f]{2})*)?)?@)"; - $domain = '(?:(?:[a-z0-9' . $LINK_ICHARS_DOMAIN . ']([a-z0-9' . $LINK_ICHARS_DOMAIN . '\-_\[\]])*)(\.(([a-z0-9' . $LINK_ICHARS_DOMAIN . '\-_\[\]])+\.)*(' . $LINK_DOMAINS . '|[a-z]{2}))?)'; + $authentication = "(?:(?:(?:[\w\.\-\+!$&'\(\)*\+,;=" . $link_ichars . "]|%[0-9a-f]{2})+(?::(?:[\w" . $link_ichars . "\.\-\+%!$&'\(\)*\+,;=]|%[0-9a-f]{2})*)?)?@)"; + $domain = '(?:(?:[a-z0-9' . $link_ichars_domain . ']([a-z0-9' . $link_ichars_domain . '\-_\[\]])*)(\.(([a-z0-9' . $link_ichars_domain . '\-_\[\]])+\.)*(' . $link_domains . '|[a-z]{2}))?)'; $ipv4 = '(?:[0-9]{1,3}(\.[0-9]{1,3}){3})'; $ipv6 = '(?:[0-9a-fA-F]{1,4}(\:[0-9a-fA-F]{1,4}){7})'; $port = '(?::([0-9]{1,5}))'; - // Pattern specific to external links. $external_pattern = '/^' . $protocol . '?' . $authentication . '?(' . $domain . '|' . $ipv4 . '|' . $ipv6 . ' |localhost)' . $port . '?'; // Pattern specific to internal links. - $internal_pattern = "/^(?:[a-z0-9" . $LINK_ICHARS . "_\-+\[\] ]+)"; - $internal_pattern_file = "/^(?:[a-z0-9" . $LINK_ICHARS . "_\-+\[\]\. \/\(\)][a-z0-9" . $LINK_ICHARS . "_\-+\[\]\. \(\)][a-z0-9" . $LINK_ICHARS . "_\-+\[\]\. \/\(\)]+)$/i"; + $internal_pattern = "/^(?:[a-z0-9" . $link_ichars . "_\-+\[\] ]+)"; + $internal_pattern_file = "/^(?:[a-z0-9" . $link_ichars . "_\-+\[\]\. \/\(\)][a-z0-9" . $link_ichars . "_\-+\[\]\. \(\)][a-z0-9" . $link_ichars . "_\-+\[\]\. \/\(\)]+)$/i"; - $directories = "(?:\/[a-z0-9" . $LINK_ICHARS . "_\-\.~+%=&,$'#!():;*@\[\]]*)*"; + $directories = "(?:\/[a-z0-9" . $link_ichars . "_\-\.~+%=&,$'#!():;*@\[\]]*)*"; // Yes, four backslashes == a single backslash. - $query = "(?:\/?\?([?a-z0-9" . $LINK_ICHARS . "+_|\-\.~\/\\\\%=&,$'!():;*@\[\]{} ]*))"; - $anchor = "(?:#[a-z0-9" . $LINK_ICHARS . "_\-\.~+%=&,$'():;*@\[\]\/\?]*)"; + $query = "(?:\/?\?([?a-z0-9" . $link_ichars . "+_|\-\.~\/\\\\%=&,$'!():;*@\[\]{} ]*))"; + $anchor = "(?:#[a-z0-9" . $link_ichars . "_\-\.~+%=&,$'():;*@\[\]\/\?]*)"; // The rest of the path for a standard URL. + // @codingStandardsIgnoreLine $end = $directories . '?' . $query . '?' . $anchor . '?' . '$/i'; $message_id = '[^@].*@' . $domain; $newsgroup_name = '(?:[0-9a-z+-]*\.)*[0-9a-z+-]*'; $news_pattern = '/^news:(' . $newsgroup_name . '|' . $message_id . ')$/i'; - $user = '[a-zA-Z0-9' . $LINK_ICHARS . '_\-\.\+\^!#\$%&*+\/\=\?\`\|\{\}~\'\[\]]+'; + $user = '[a-zA-Z0-9' . $link_ichars . '_\-\.\+\^!#\$%&*+\/\=\?\`\|\{\}~\'\[\]]+'; $email_pattern = '/^mailto:' . $user . '@' . '(?:' . $domain . '|' . $ipv4 . '|' . $ipv6 . '|localhost)' . $query . '?$/'; if (strpos($text, '' . print_r($token_url_tests, TRUE) . ''); - + // @codingStandardsIgnoreLine + // $this->assert('pass', '' . print_r($token_url_tests, TRUE) . '');. foreach ($token_url_tests as &$input) { $this->drupalGet('node/add/page'); - + $edit = array( 'title' => $input['label'], $field_name . '[und][0][title]' => $input['label'], @@ -73,34 +79,37 @@ class LinkEntityTokenTest extends LinkBaseTestClass { $input['url'] = $url; } - // change to anonymous user + // Change to anonymous user. $this->drupalLogout(); - + foreach ($token_url_tests as $index => $input2) { $node = node_load($index); $this->assertNotEqual(NULL, $node, "Do we have a node?"); $this->assertEqual($node->nid, $index, "Test that we have a node."); $token_name = '[node:' . str_replace('_', '-', $field_name) . ':url]'; $assert_data = token_replace($token_name, - array('node' => $node)); + array('node' => $node)); $this->assertEqual($input2['href'], $assert_data, "Test that the url token has been set to " . $input2['href'] . ' - ' . $assert_data); } } - + /** - * Creates a link field, fills it, then uses a loaded and node_view'd node to test tokens. + * Field Token Node Viewed. + * + * Creates a link field, fills it, then uses a loaded and node_view'd node to + * test tokens. */ - function testFieldTokenNodeViewed() { - // create field + public function testFieldTokenNodeViewed() { + // Create field. $settings = array( 'instance[settings][enable_tokens]' => 0, ); $field_name = $this->createLinkField('page', - $settings); + $settings); - // create page form + // Create page form. $this->drupalGet('node/add/page'); - //$field_name = 'field_' . $name; + // $field_name = 'field_' . $name;. $this->assertField($field_name . '[und][0][title]', 'Title found'); $this->assertField($field_name . '[und][0][url]', 'URL found'); @@ -122,11 +131,12 @@ class LinkEntityTokenTest extends LinkBaseTestClass { 'label' => $this->randomName(), ), ); - //$this->assert('pass', '' . print_r($token_url_tests, TRUE) . ''); + //@codingStandardsIgnoreLine + // $this->assert('pass', '' . print_r($token_url_tests, TRUE) . '');. foreach ($token_url_tests as &$input) { $this->drupalGet('node/add/page'); - + $edit = array( 'title' => $input['label'], $field_name . '[und][0][title]' => $input['label'], @@ -137,19 +147,18 @@ class LinkEntityTokenTest extends LinkBaseTestClass { $input['url'] = $url; } - // change to anonymous user + // Change to anonymous user. $this->drupalLogout(); - + foreach ($token_url_tests as $index => $input2) { $node = node_load($index); - $node_array = node_view($node, 'full'); $this->assertNotEqual(NULL, $node, "Do we have a node?"); $this->assertEqual($node->nid, $index, "Test that we have a node."); $token_name = '[node:' . str_replace('_', '-', $field_name) . ':url]'; $assert_data = token_replace($token_name, - array('node' => $node)); + array('node' => $node)); $this->assertEqual($input2['href'], $assert_data, "Test that the url token has been set to " . $input2['href'] . ' - ' . $assert_data); } } - -} \ No newline at end of file + +} diff --git a/profiles/openasu/modules/contrib/link/tests/link.test b/profiles/openasu/modules/contrib/link/tests/link.test index 962197f230..dd9adb497c 100644 --- a/profiles/openasu/modules/contrib/link/tests/link.test +++ b/profiles/openasu/modules/contrib/link/tests/link.test @@ -5,10 +5,15 @@ * Link base test file - contains common functions for testing links. */ +/** + * Base Test Class. + */ class LinkBaseTestClass extends DrupalWebTestCase { + protected $permissions = array( 'access content', 'administer content types', + 'administer fields', 'administer nodes', 'administer filters', 'access comments', @@ -17,17 +22,23 @@ class LinkBaseTestClass extends DrupalWebTestCase { 'create page content', ); - function setUp() { + /** + * Setup. + */ + public function setUp() { $modules = func_get_args(); $modules = (isset($modules[0]) && is_array($modules[0]) ? $modules[0] : $modules); $modules[] = 'field_ui'; $modules[] = 'link'; parent::setUp($modules); - + $this->web_user = $this->drupalCreateUser($this->permissions); $this->drupalLogin($this->web_user); } + /** + * Create Link Field. + */ protected function createLinkField($node_type = 'page', $settings = array()) { $name = strtolower($this->randomName()); $edit = array( @@ -48,4 +59,5 @@ class LinkBaseTestClass extends DrupalWebTestCase { return $field_name; } + } diff --git a/profiles/openasu/modules/contrib/link/tests/link.token.test b/profiles/openasu/modules/contrib/link/tests/link.token.test index 617260e602..edbb1df5f6 100644 --- a/profiles/openasu/modules/contrib/link/tests/link.token.test +++ b/profiles/openasu/modules/contrib/link/tests/link.token.test @@ -6,10 +6,13 @@ */ /** - * Testing that tokens can be used in link titles + * Testing that tokens can be used in link titles. */ class LinkTokenTest extends LinkBaseTestClass { + /** + * Get Info. + */ public static function getInfo() { return array( 'name' => 'Link tokens - browser test', @@ -19,34 +22,38 @@ class LinkTokenTest extends LinkBaseTestClass { ); } - function setUp($modules = array()) { + /** + * Setup. + */ + public function setUp($modules = array()) { parent::setUp(array('token')); } /** * Creates a link field with a required title enabled for user-entered tokens. + * * Creates a node with a token in the link title and checks the value. */ - function testUserTokenLinkCreate() { - // create field + public function testUserTokenLinkCreate() { + // Create field. $settings = array( 'instance[settings][enable_tokens]' => 1, ); $field_name = $this->createLinkField('page', - $settings); + $settings); - // create page form + // Create page form. $this->drupalGet('node/add/page'); - //$field_name = 'field_' . $name; + // $field_name = 'field_' . $name;. $this->assertField($field_name . '[und][0][title]', 'Title found'); $this->assertField($field_name . '[und][0][url]', 'URL found'); $input = array( - 'href' => 'http://example.com/' . $this->randomName(), - 'label' => $this->randomName(), + 'href' => 'http://example.com/' . $this->randomName(), + 'label' => $this->randomName(), ); - //$this->drupalLogin($this->web_user); + // $this->drupalLogin($this->web_user);. $this->drupalGet('node/add/page'); $edit = array( @@ -57,36 +64,37 @@ class LinkTokenTest extends LinkBaseTestClass { $this->drupalPost(NULL, $edit, t('Save')); $url = $this->getUrl(); - // change to anonymous user + // Change to anonymous user. $this->drupalLogout(); $this->drupalGet($url); $this->assertRaw(l($input['label'] . ' page', $input['href'])); } - /** * Creates a link field with a static title and an admin-entered token. + * * Creates a node with a link and checks the title value. */ - function testStaticTokenLinkCreate() { + public function testStaticTokenLinkCreate() { - // create field + // Create field. $name = $this->randomName(); $settings = array( 'instance[settings][title]' => 'value', - 'instance[settings][title_value]' => $name . ' [node:content-type:machine-name]'); + 'instance[settings][title_value]' => $name . ' [node:content-type:machine-name]', + ); $field_name = $this->createLinkField('page', $settings); - // create page form + // Create page form. $this->drupalGet('node/add/page'); $this->assertField($field_name . '[und][0][url]', 'URL found'); $input = array( - 'href' => 'http://example.com/' . $this->randomName() + 'href' => 'http://example.com/' . $this->randomName(), ); - //$this->drupalLogin($this->web_user); + // $this->drupalLogin($this->web_user);. $this->drupalGet('node/add/page'); $edit = array( @@ -97,7 +105,7 @@ class LinkTokenTest extends LinkBaseTestClass { $url = $this->getUrl(); - // change to anonymous user + // Change to anonymous user. $this->drupalLogout(); $this->drupalGet($url); @@ -106,30 +114,32 @@ class LinkTokenTest extends LinkBaseTestClass { /** * Creates a link field with a static title and an admin-entered token. + * * Creates a node with a link and checks the title value. * * Basically, I want to make sure the [title-raw] token works, because it's a * token that changes from node to node, where [type]'s always going to be the * same. */ - function testStaticTokenLinkCreate2() { + public function testStaticTokenLinkCreate2() { - // create field + // Create field. $name = $this->randomName(); $settings = array( 'instance[settings][title]' => 'value', - 'instance[settings][title_value]' => $name . ' [node:title]'); + 'instance[settings][title_value]' => $name . ' [node:title]', + ); $field_name = $this->createLinkField('page', $settings); - // create page form + // Create page form. $this->drupalGet('node/add/page'); $this->assertField($field_name . '[und][0][url]', 'URL found'); $input = array( - 'href' => 'http://example.com/' . $this->randomName() + 'href' => 'http://example.com/' . $this->randomName(), ); - //$this->drupalLogin($this->web_user); + // $this->drupalLogin($this->web_user);. $this->drupalGet('node/add/page'); $edit = array( @@ -140,27 +150,32 @@ class LinkTokenTest extends LinkBaseTestClass { $url = $this->getUrl(); - // change to anonymous user + // Change to anonymous user. $this->drupalLogout(); $this->drupalGet($url); $this->assertRaw(l($name . ' ' . $name, $input['href'])); } - // This test doesn't seem to actually work, due to lack of 'title' in url. - function _test_Link_With_Title_Attribute_token_url_form() { - /* $this->loginWithPermissions($this->permissions); + /** + * This test doesn't seem to actually work, due to lack of 'title' in url. + * + * @codingStandardsIgnoreStart + */ + public function _test_Link_With_Title_Attribute_token_url_form() { + // @codingStandardsIgnoreEnd + /* $this->loginWithPermissions($this->permissions); $this->acquireContentTypes(1); $field_settings = array( - 'type' => 'link', - 'widget_type' => 'link', - 'type_name' => $this->content_types[0]->name, - 'attributes' => array( - 'class' => '', - 'target' => 'default', - 'rel' => 'nofollow', - 'title' => '', - ), + 'type' => 'link', + 'widget_type' => 'link', + 'type_name' => $this->content_types[0]->name, + 'attributes' => array( + 'class' => '', + 'target' => 'default', + 'rel' => 'nofollow', + 'title' => '', + ), ); $field = $this->createField($field_settings, 0); @@ -170,10 +185,10 @@ class LinkTokenTest extends LinkBaseTestClass { $url_type = str_replace('_', '-', $this->content_types[0]->type); $edit = array('attributes[title]' => '['. $field_name .'-url]', - 'enable_tokens' => TRUE); - + 'enable_tokens' => TRUE); + // @codingStandardsIgnoreLine $this->drupalPost('admin/content/node-type/'. $url_type .'/fields/'. $field['field_name'], - $edit, t('Save field settings')); + $edit, t('Save field settings')); $this->assertText(t('Saved field @field_name', array('@field_name' => $field['field_name'])));*/ $name = $this->randomName(); $settings = array( @@ -183,12 +198,9 @@ class LinkTokenTest extends LinkBaseTestClass { $field_name = $this->createLinkField('page', $settings); // So, having saved this field_name, let's see if it works... - //$this->acquireNodes(1); - - //$node = node_load($this->nodes[0]->nid); - - //$this->drupalGet('node/'. $this->nodes[0]->nid); - + // $this->acquireNodes(1); + // $node = node_load($this->nodes[0]->nid); + // $this->drupalGet('node/'. $this->nodes[0]->nid);. $edit = array(); $test_link_url = 'http://www.example.com/test'; $edit[$field_name . '[und][0][url]'] = $test_link_url; @@ -200,23 +212,28 @@ class LinkTokenTest extends LinkBaseTestClass { $this->drupalPost(NULL, $edit, t('Save')); // Make sure we get a new version! - //$node = node_load($this->nodes[0]->nid, NULL, TRUE); + // $node = node_load($this->nodes[0]->nid, NULL, TRUE);. $this->assertText(t('Basic page @title has been updated.', - array('@title' => $name))); + array('@title' => $name))); - //$this->drupalGet('node/'. $node->nid); + // $this->drupalGet('node/'. $node->nid);. $this->assertText($title, 'Make sure the link title/text shows'); $this->assertRaw(' title="' . $test_link_url . '"', "Do we show the link url as the title attribute?"); $this->assertNoRaw(' title="[' . $field_name . '-url]"'); $this->assertTrue(module_exists('token'), t('Assure that Token Module is enabled.')); - //$this->fail($this->content); + // $this->fail($this->content);. } /** + * Link With Title Attribute token title form. + * * If the title of the link is set to the title attribute, then the title * attribute isn't supposed to show. + * + * @codingStandardsIgnoreStart */ - function _test_Link_With_Title_Attribute_token_title_form() { + public function _test_Link_With_Title_Attribute_token_title_form() { + // @codingStandardsIgnoreEnd $this->loginWithPermissions($this->permissions); $this->acquireContentTypes(1); $field_settings = array( @@ -233,21 +250,20 @@ class LinkTokenTest extends LinkBaseTestClass { $field = $this->createField($field_settings, 0); $field_name = $field['field_name']; - $field_db_info = content_database_info($field); $url_type = str_replace('_', '-', $this->content_types[0]->type); - $edit = array('attributes[title]' => '[' . $field_name . '-title]', - 'enable_tokens' => TRUE); + $edit = array( + 'attributes[title]' => '[' . $field_name . '-title]', + 'enable_tokens' => TRUE, + ); $this->drupalPost('admin/content/node-type/' . $url_type . '/fields/' . $field['field_name'], - $edit, t('Save field settings')); + $edit, t('Save field settings')); $this->assertText(t('Saved field @field_name', array('@field_name' => $field['field_name']))); // So, having saved this field_name, let's see if it works... $this->acquireNodes(1); - $node = node_load($this->nodes[0]->nid); - $this->drupalGet('node/' . $this->nodes[0]->nid); $edit = array(); @@ -260,24 +276,35 @@ class LinkTokenTest extends LinkBaseTestClass { // Make sure we get a new version! $node = node_load($this->nodes[0]->nid, NULL, TRUE); $this->assertText(t('@type @title has been updated.', - array('@title' => $node->title, - '@type' => $this->content_types[0]->name))); + array( + '@title' => $node->title, + '@type' => $this->content_types[0]->name, + ))); $this->drupalGet('node/' . $node->nid); $this->assertText($title, 'Make sure the link title/text shows'); $this->assertNoRaw(' title="' . $title . '"', "We should not show the link title as the title attribute?"); $this->assertNoRaw(' title="[' . $field_name . '-title]"'); - //$this->fail($this->content); + // $this->fail($this->content);. } /** - * Trying to set the url to contain a token. + * Trying to set the url to contain a token. + * + * @codingStandardsIgnoreStart */ - function _testUserTokenLinkCreateInURL() { - $this->web_user = $this->drupalCreateUser(array('administer content types', 'access content', 'create page content')); + public function _testUserTokenLinkCreateInURL() { + //@codingStandardsIgnoreEnd + + $this->web_user = $this->drupalCreateUser(array( + 'administer content types', + 'administer fields', + 'access content', + 'create page content', + )); $this->drupalLogin($this->web_user); - // create field + // Create field. $name = strtolower($this->randomName()); $edit = array( '_add_new_field[label]' => $name, @@ -288,20 +315,21 @@ class LinkTokenTest extends LinkBaseTestClass { $this->drupalPost('admin/content/node-type/page/fields', $edit, t('Save')); $this->drupalPost(NULL, array( 'title' => 'required', - 'enable_tokens' => 1), t('Save field settings')); + 'enable_tokens' => 1, + ), t('Save field settings')); // Is field created? $this->assertRaw(t('Added field %label.', array('%label' => $name)), 'Field added'); - // create page form + // Create page form. $this->drupalGet('node/add/page'); $field_name = 'field_' . $name; $this->assertField($field_name . '[0][title]', 'Title found'); $this->assertField($field_name . '[0][url]', 'URL found'); $input = array( - 'href' => 'http://example.com/' . $this->randomName(), - 'label' => $this->randomName(), + 'href' => 'http://example.com/' . $this->randomName(), + 'label' => $this->randomName(), ); $this->drupalLogin($this->web_user); @@ -315,22 +343,31 @@ class LinkTokenTest extends LinkBaseTestClass { $this->drupalPost(NULL, $edit, t('Save')); $url = $this->getUrl(); - // change to anonymous user + // Change to anonymous user. $this->drupalLogout(); $this->drupalGet($url); $this->assertRaw(l($input['label'], $input['href'] . '/page')); - //$this->fail($this->content); + // $this->fail($this->content);. } /** - * Trying to set the url to contain a token. + * Trying to set the url to contain a token. + * + * @codingStandardsIgnoreStart */ - function _testUserTokenLinkCreateInURL2() { - $this->web_user = $this->drupalCreateUser(array('administer content types', 'access content', 'create page content')); + public function _testUserTokenLinkCreateInURL2() { + // @codingStandardsIgnoreEnd + + $this->web_user = $this->drupalCreateUser(array( + 'administer content types', + 'administer fields', + 'access content', + 'create page content', + )); $this->drupalLogin($this->web_user); - // create field + // Create field. $name = strtolower($this->randomName()); $edit = array( '_add_new_field[label]' => $name, @@ -341,20 +378,21 @@ class LinkTokenTest extends LinkBaseTestClass { $this->drupalPost('admin/content/node-type/page/fields', $edit, t('Save')); $this->drupalPost(NULL, array( 'title' => 'required', - 'enable_tokens' => 1), t('Save field settings')); + 'enable_tokens' => 1, + ), t('Save field settings')); // Is field created? $this->assertRaw(t('Added field %label.', array('%label' => $name)), 'Field added'); - // create page form + // Create page form. $this->drupalGet('node/add/page'); $field_name = 'field_' . $name; $this->assertField($field_name . '[0][title]', 'Title found'); $this->assertField($field_name . '[0][url]', 'URL found'); $input = array( - 'href' => 'http://example.com/' . $this->randomName(), - 'label' => $this->randomName(), + 'href' => 'http://example.com/' . $this->randomName(), + 'label' => $this->randomName(), ); $this->drupalLogin($this->web_user); @@ -368,22 +406,34 @@ class LinkTokenTest extends LinkBaseTestClass { $this->drupalPost(NULL, $edit, t('Save')); $url = $this->getUrl(); - // change to anonymous user + // Change to anonymous user. $this->drupalLogout(); $this->drupalGet($url); $this->assertRaw(l($input['label'], $input['href'] . '/' . $this->web_user->uid)); } - + /** - * Test that if you have a title and no url on a field which does not have tokens enabled, - * that the title is sanitized once. + * CRUD Title Only Title No Link. + * + * Test that if you have a title and no url on a field which does not have + * tokens enabled, that the title is sanitized once. + * + * @codingStandardsIgnoreStart */ - function testCRUDTitleOnlyTitleNoLink2() { - $this->web_user = $this->drupalCreateUser(array('administer content types', 'access content', 'create page content')); + public function testCRUDTitleOnlyTitleNoLink2() { + //@codingStandardsIgnoreEnd + + $this->web_user = $this->drupalCreateUser(array( + 'administer content types', + 'administer fields', + 'access content', + 'create page content', + )); + $this->drupalLogin($this->web_user); - // create field + // Create field. $name = strtolower($this->randomName()); $field_name = 'field_' . $name; $edit = array( @@ -401,8 +451,8 @@ class LinkTokenTest extends LinkBaseTestClass { // Is field created? $this->assertRaw(t('Saved %label configuration', array('%label' => $name)), 'Field added'); - - // create page form + + // Create page form. $this->drupalGet('node/add/page'); $this->assertField($field_name . '[und][0][url]', 'URL found'); @@ -419,13 +469,12 @@ class LinkTokenTest extends LinkBaseTestClass { $this->drupalPost(NULL, $edit, t('Save')); $url = $this->getUrl(); - - // change to anonymous user + + // Change to anonymous user. $this->drupalLogout(); $this->drupalGet($url); $this->assertRaw('This & That'); } - - + } diff --git a/profiles/openasu/modules/contrib/link/tests/link.validate.test b/profiles/openasu/modules/contrib/link/tests/link.validate.test index f8ddcd618d..a8c177681d 100644 --- a/profiles/openasu/modules/contrib/link/tests/link.validate.test +++ b/profiles/openasu/modules/contrib/link/tests/link.validate.test @@ -5,8 +5,14 @@ * Tests that exercise the validation functions in the link module. */ +/** + * Validate Test Case. + */ class LinkValidateTestCase extends LinkBaseTestClass { + /** + * Create Link. + */ protected function createLink($url, $title, $attributes = array()) { return array( 'url' => $url, @@ -17,8 +23,11 @@ class LinkValidateTestCase extends LinkBaseTestClass { /** * Takes a url, and sees if it can validate that the url is valid. + * + * @codingStandardsIgnoreStart */ protected function link_test_validate_url($url) { + // @codingStandardsIgnoreEnd $field_name = $this->createLinkField(); @@ -29,23 +38,29 @@ class LinkValidateTestCase extends LinkBaseTestClass { $label = $this->randomName(); $edit = array( - 'title' => $label, $field_name . '[und][0][title]' => $label, $field_name . '[und][0][url]' => $url, ); $this->drupalPost(NULL, $edit, t('Save')); $this->assertRaw(' has been created.', 'Node created'); - $nid = 1; //$matches[1]; + $nid = 1; $node = node_load($nid); $this->assertEqual($url, $node->{$field_name}['und'][0]['url']); } + } +/** + * Class for Validate Test. + */ class LinkValidateTest extends LinkValidateTestCase { + /** + * Get Info. + */ public static function getInfo() { return array( 'name' => 'Link Validation Tests', @@ -54,23 +69,35 @@ class LinkValidateTest extends LinkValidateTestCase { ); } - function test_link_validate_basic_url() { + /** + * Validate basic URL. + * + * @codingStandardsIgnoreStart + */ + public function test_link_validate_basic_url() { + // @codingStandardsIgnoreEnd $this->link_test_validate_url('http://www.example.com'); } /** * Test if we're stopped from posting a bad url on default validation. + * + * @codingStandardsIgnoreStart */ - function test_link_validate_bad_url_validate_default() { - $this->web_user = $this->drupalCreateUser(array('administer content types', - 'administer nodes', - 'administer filters', - 'access content', - 'create page content', - 'access administration pages')); + public function test_link_validate_bad_url_validate_default() { + // @codingStandardsIgnoreEnd + $this->web_user = $this->drupalCreateUser(array( + 'administer content types', + 'administer fields', + 'administer nodes', + 'administer filters', + 'access content', + 'create page content', + 'access administration pages', + )); $this->drupalLogin($this->web_user); - // create field + // Create field. $name = strtolower($this->randomName()); $edit = array( 'fields[_add_new_field][label]' => $name, @@ -87,35 +114,43 @@ class LinkValidateTest extends LinkValidateTestCase { node_types_rebuild(); menu_rebuild(); - // create page form + // Create page form. $this->drupalGet('node/add/page'); $field_name = 'field_' . $name; $this->assertField('edit-field-' . $name . '-und-0-title', 'Title found'); $this->assertField('edit-field-' . $name . '-und-0-url', 'URL found'); - $edit = array( 'title' => 'Simple Title', $field_name . '[und][0][url]' => 'edik:naw', ); $this->drupalPost(NULL, $edit, t('Save')); - $this->assertText(t('The value @value provided for @field is not a valid URL.', array('@value' => 'edik:naw', '@field' => $name))); + $this->assertText(t('The value @value provided for @field is not a valid URL.', array( + '@value' => 'edik:naw', + '@field' => $name, + ))); } /** * Test if we're stopped from posting a bad url with validation on. + * + * @codingStandardsIgnoreStart */ - function test_link_validate_bad_url_validate_on() { - $this->web_user = $this->drupalCreateUser(array('administer content types', - 'administer nodes', - 'administer filters', - 'access content', - 'create page content', - 'access administration pages')); + public function test_link_validate_bad_url_validate_on() { + // @codingStandardsIgnoreEnd + $this->web_user = $this->drupalCreateUser(array( + 'administer content types', + 'administer fields', + 'administer nodes', + 'administer filters', + 'access content', + 'create page content', + 'access administration pages', + )); $this->drupalLogin($this->web_user); - // create field + // Create field. $name = strtolower($this->randomName()); $edit = array( 'fields[_add_new_field][label]' => $name, @@ -132,36 +167,44 @@ class LinkValidateTest extends LinkValidateTestCase { node_types_rebuild(); menu_rebuild(); - // create page form + // Create page form. $this->drupalGet('node/add/page'); $field_name = 'field_' . $name; $this->assertField('edit-field-' . $name . '-und-0-title', 'Title found'); $this->assertField('edit-field-' . $name . '-und-0-url', 'URL found'); - $edit = array( 'title' => 'Simple Title', $field_name . '[und][0][url]' => 'edik:naw', ); $this->drupalPost(NULL, $edit, t('Save')); - $this->assertText(t('The value @value provided for @field is not a valid URL.', array('@field' => $name, '@value' => 'edik:naw'))); + $this->assertText(t('The value @value provided for @field is not a valid URL.', array( + '@field' => $name, + '@value' => 'edik:naw', + ))); } /** * Test if we can post a bad url if the validation is expressly turned off. + * + * @codingStandardsIgnoreStart */ - function test_link_validate_bad_url_validate_off() { - $this->web_user = $this->drupalCreateUser(array('administer content types', - 'administer nodes', - 'administer filters', - 'access content', - 'create page content', - 'access administration pages')); + public function test_link_validate_bad_url_validate_off() { + // @codingStandardsIgnoreEnd + $this->web_user = $this->drupalCreateUser(array( + 'administer content types', + 'administer fields', + 'administer nodes', + 'administer filters', + 'access content', + 'create page content', + 'access administration pages', + )); $this->drupalLogin($this->web_user); - // create field + // Create field. $name = strtolower($this->randomName()); $edit = array( 'fields[_add_new_field][label]' => $name, @@ -173,6 +216,7 @@ class LinkValidateTest extends LinkValidateTestCase { $this->drupalPost(NULL, array(), t('Save field settings')); $this->drupalPost(NULL, array('instance[settings][validate_url]' => FALSE), t('Save settings')); + // @codingStandardsIgnoreLine /*$instance_details = db_query("SELECT * FROM {field_config_instance} WHERE field_name = :field_name AND bundle = 'page'", array(':field_name' => 'field_'. $name))->fetchObject(); $this->fail(''. print_r($instance_details, TRUE) .''); $this->fail(''. print_r(unserialize($instance_details->data), TRUE) .'');*/ @@ -182,51 +226,62 @@ class LinkValidateTest extends LinkValidateTestCase { node_types_rebuild(); menu_rebuild(); - // create page form + // Create page form. $this->drupalGet('node/add/page'); $field_name = 'field_' . $name; $this->assertField('edit-field-' . $name . '-und-0-title', 'Title found'); $this->assertField('edit-field-' . $name . '-und-0-url', 'URL found'); - $edit = array( 'title' => 'Simple Title', $field_name . '[und][0][url]' => 'edik:naw', ); $this->drupalPost(NULL, $edit, t('Save')); - $this->assertNoText(t('The value %value provided for %field is not a valid URL.', array('%field' => $name, '%value' => 'edik:naw'))); + $this->assertNoText(t('The value %value provided for %field is not a valid URL.', array( + '%field' => $name, + '%value' => 'edik:naw', + ))); } /** - * Test if a bad url can sneak through un-filtered if we play with the validation... + * Validate switching between validation status. + * + * Test if a bad url can sneak through un-filtered if we play with the + * validation... + * + * @codingStandardsIgnoreStart */ - function x_test_link_validate_switching_between_validation_status() { + public function x_test_link_validate_switching_between_validation_status() { + // @codingStandardsIgnoreEnd $this->acquireContentTypes(1); - $this->web_user = $this->drupalCreateUser(array('administer content types', - 'administer nodes', - 'access administration pages', - 'access content', - 'create ' . $this->content_types[0]->type . ' content', - 'edit any ' . $this->content_types[0]->type . ' content')); + $this->web_user = $this->drupalCreateUser(array( + 'administer content types', + 'administer fields', + 'administer nodes', + 'access administration pages', + 'access content', + 'create ' . $this->content_types[0]->type . ' content', + 'edit any ' . $this->content_types[0]->type . ' content', + )); $this->drupalLogin($this->web_user); - variable_set('node_options_' . $this->content_types[0]->name, array('status', 'promote')); + variable_set('node_options_' . $this->content_types[0]->name, array( + 'status', + 'promote', + )); $field_settings = array( 'type' => 'link', 'widget_type' => 'link', 'type_name' => $this->content_types[0]->name, - 'attributes' => array(), // <-- This is needed or we have an error + // <-- This is needed or we have an error. + 'attributes' => array(), 'validate_url' => 0, ); $field = $this->createField($field_settings, 0); - //$this->fail(''. print_r($field, TRUE) .''); - $field_db_info = content_database_info($field); $this->acquireNodes(2); - $node = node_load($this->nodes[0]->nid); - $this->drupalGet('node/' . $this->nodes[0]->nid); $edit = array(); @@ -236,8 +291,12 @@ class LinkValidateTest extends LinkValidateTestCase { $edit[$field['field_name'] . '[0][title]'] = $title; $this->drupalPost('node/' . $this->nodes[0]->nid . '/edit', $edit, t('Save')); - //$this->pass($this->content); - $this->assertNoText(t('The value %value provided for %field is not a valid URL.', array('%field' => $name, '%value' => trim($url)))); + // $this->pass($this->content);. + // @codingStandardsIgnoreLine + $this->assertNoText(t('The value %value provided for %field is not a valid URL.', array( + '%field' => $name, + '%value' => trim($url), + ))); // Make sure we get a new version! $node = node_load($this->nodes[0]->nid, NULL, TRUE); @@ -249,8 +308,9 @@ class LinkValidateTest extends LinkValidateTestCase { // Turn the array validation back _on_. $edit = array('validate_url' => TRUE); $node_type_link = str_replace('_', '-', $node->type); - //$this->drupalGet('admin/content/node-type/'. $node_type_link .'/fields'); ///'. $field['field_name']); - //$this->fail($this->content); + // @codingStandardsIgnoreLine + // $this->drupalGet('admin/content/node-type/'. $node_type_link .'/fields'); ///'. $field['field_name']); + // $this->fail($this->content);. $this->drupalPost('admin/content/node-type/' . $node_type_link . '/fields/' . $field['field_name'], $edit, t('Save field settings')); $this->drupalGet('node/' . $node->nid); @@ -258,36 +318,69 @@ class LinkValidateTest extends LinkValidateTestCase { // url() function. But we should have a test that makes sure it continues // to work. $this->assertNoRaw($url, 'Make sure Javascript does not display.'); - //$this->fail($this->content); - + // $this->fail($this->content);. } - // Validate that '' is a valid url. - function test_link_front_url() { + /** + * Validate that ' ' is a valid url. + * + * @codingStandardsIgnoreStart + */ + public function test_link_front_url() { + // @codingStandardsIgnoreEnd $this->link_test_validate_url(' '); } - // Validate that an internal url would be accepted. - function test_link_internal_url() { + /** + * Validate that an internal url would be accepted. + * + * @codingStandardsIgnoreStart + */ + public function test_link_internal_url() { + // @codingStandardsIgnoreEnd $this->link_test_validate_url('node/32'); } - // Validate a simple mailto. - function test_link_mailto() { + /** + * Validate a simple mailto. + * + * @codingStandardsIgnoreStart + */ + public function test_link_mailto() { + // @codingStandardsIgnoreEnd $this->link_test_validate_url('mailto:jcfiala@gmail.com'); } - function test_link_external_https() { + /** + * Check link external https. + * + * @codingStandardsIgnoreStart + */ + public function test_link_external_https() { + // @codingStandardsIgnoreEnd $this->link_test_validate_url('https://www.example.com/'); } - function test_link_ftp() { + /** + * Check link FTP. + * + * @codingStandardsIgnoreStart + */ + public function test_link_ftp() { + // @codingStandardsIgnoreEnd $this->link_test_validate_url('ftp://www.example.com/'); } + } +/** + * Validate Test News. + */ class LinkValidateTestNews extends LinkValidateTestCase { + /** + * Get Info. + */ public static function getInfo() { return array( 'name' => 'Link News Validation Tests', @@ -296,18 +389,36 @@ class LinkValidateTestNews extends LinkValidateTestCase { ); } - // Validate a news link to a message group - function test_link_news() { + /** + * Validate a news link to a message group. + * + * @codingStandardsIgnoreStart + */ + public function test_link_news() { + // @codingStandardsIgnoreEnd $this->link_test_validate_url('news:comp.infosystems.www.misc'); } - // Validate a news link to a message id. Said ID copied off of google groups. - function test_link_news_message() { + /** + * Validate a news link to a message id. Said ID copied off of google groups. + * + * @codingStandardsIgnoreStart + */ + public function test_link_news_message() { + // @codingStandardsIgnoreEnd $this->link_test_validate_url('news:hj0db8$vrm$1@news.eternal-september.org'); } + } +/** + * Validate Specific URL. + */ class LinkValidateSpecificURL extends LinkValidateTestCase { + + /** + * Get Info. + */ public static function getInfo() { return array( 'name' => 'Link Specific URL Validation Tests', @@ -316,24 +427,53 @@ class LinkValidateSpecificURL extends LinkValidateTestCase { ); } - // Lets throw in a lot of umlouts for testing! - function test_umlout_url() { + /** + * Lets throw in a lot of umlouts for testing! + * + * @codingStandardsIgnoreStart + */ + public function test_umlout_url() { + // @codingStandardsIgnoreEnd $this->link_test_validate_url('http://üÜü.exämple.com/nöde'); } - function test_umlout_mailto() { + /** + * Check umlout mailto. + * + * @codingStandardsIgnoreStart + */ + public function test_umlout_mailto() { + // @codingStandardsIgnoreEnd $this->link_test_validate_url('mailto:Üser@exÅmple.com'); } - function test_german_b_url() { + /** + * Check german b in url. + * + * @codingStandardsIgnoreStart + */ + public function test_german_b_url() { + // @codingStandardsIgnoreEnd $this->link_test_validate_url('http://www.test.com/ßstuff'); } - function test_special_n_url() { + /** + * Check Special in url. + * + * @codingStandardsIgnoreStart + */ + public function test_special_n_url() { + // @codingStandardsIgnoreEnd $this->link_test_validate_url('http://www.testÑñ.com/'); } - function test_curly_brackets_in_query() { + /** + * Curly Brackets in query. + * + * @codingStandardsIgnoreStart + */ + public function test_curly_brackets_in_query() { + // @codingStandardsIgnoreEnd $this->link_test_validate_url('http://www.healthyteennetwork.org/index.asp?Type=B_PR&SEC={2AE1D600-4FC6-4B4D-8822-F1D5F072ED7B}&DE={235FD1E7-208D-4363-9854-4E6775EB8A4C}'); } @@ -341,8 +481,11 @@ class LinkValidateSpecificURL extends LinkValidateTestCase { * Here, we're testing that a very long url is stored properly in the db. * * Basically, trying to test http://drupal.org/node/376818 + * + * @codingStandardsIgnoreStart */ - function testLinkURLFieldIsBig() { + public function testLinkURLFieldIsBig() { + // @codingStandardsIgnoreEnd $long_url = 'http://th.wikipedia.org/wiki/%E0%B9%82%E0%B8%A3%E0%B8%87%E0%B9%80%E0%B8%A3%E0%B8%B5%E0%B8%A2%E0%B8%99%E0%B9%80%E0%B8%9A%E0%B8%8D%E0%B8%88%E0%B8%A1%E0%B8%A3%E0%B8%B2%E0%B8%8A%E0%B8%B9%E0%B8%97%E0%B8%B4%E0%B8%A8_%E0%B8%99%E0%B8%84%E0%B8%A3%E0%B8%A8%E0%B8%A3%E0%B8%B5%E0%B8%98%E0%B8%A3%E0%B8%A3%E0%B8%A1%E0%B8%A3%E0%B8%B2%E0%B8%8A'; $this->link_test_validate_url($long_url); } @@ -350,12 +493,18 @@ class LinkValidateSpecificURL extends LinkValidateTestCase { } /** - * A series of tests of links, only going against the link_validate_url function in link.module. + * Validate Url Light. + * + * A series of tests of links, only going against the link_validate_url function + * in link.module. * * Validation is guided by the rules in http://tools.ietf.org/html/rfc1738 ! */ class LinkValidateUrlLight extends DrupalWebTestCase { + /** + * Get Info. + */ public static function getInfo() { return array( 'name' => 'Link Light Validation Tests', @@ -363,79 +512,117 @@ class LinkValidateUrlLight extends DrupalWebTestCase { 'group' => 'Link', ); } - - function setUp() { + + /** + * Setup. + */ + public function setUp() { parent::setUp('link'); } /** - * Translates the LINK type constants to english for display and debugging of tests + * Name Link Type. + * + * Translates the LINK type constants to english for display and debugging of + * tests. + * + * @codingStandardsIgnoreStart */ - function name_Link_Type($type) { + public function name_Link_Type($type) { + // @codingStandardsIgnoreEnd switch ($type) { case LINK_FRONT: return "Front"; + case LINK_EMAIL: return "Email"; + case LINK_NEWS: return "Newsgroup"; + case LINK_INTERNAL: return "Internal Link"; + case LINK_EXTERNAL: return "External Link"; + case FALSE: return "Invalid Link"; + default: return "Bad Value:" . $type; } } - // Make sure that a link labelled works. - function testValidateFrontLink() { + /** + * Make sure that a link labelled works. + */ + public function testValidateFrontLink() { $valid = link_validate_url(' '); - $this->assertEqual(LINK_FRONT, $valid, 'Make sure that front link is verfied and identified'); + $this->assertEqual(LINK_FRONT, $valid, 'Make sure that front link is verified and identified'); } - function testValidateEmailLink() { + /** + * Validate Email Link. + */ + public function testValidateEmailLink() { $valid = link_validate_url('mailto:bob@example.com'); $this->assertEqual(LINK_EMAIL, $valid, "Make sure a basic mailto is verified and identified"); } - function testValidateEmailLinkBad() { + /** + * Validate Email Link Bad. + */ + public function testValidateEmailLinkBad() { $valid = link_validate_url(':bob@example.com'); $this->assertEqual(FALSE, $valid, 'Make sure just a bad address is correctly failed'); } - function testValidateNewsgroupLink() { + /** + * Validate Newsgroup Link. + */ + public function testValidateNewsgroupLink() { $valid = link_validate_url('news:comp.infosystems.www.misc'); $this->assertEqual(LINK_NEWS, $valid, 'Make sure link to newsgroup validates as news.'); } - function testValidateNewsArticleLink() { + /** + * Validate News Article Link. + */ + public function testValidateNewsArticleLink() { $valid = link_validate_url('news:hj0db8$vrm$1@news.eternal-september.org'); - $this->assertEqual(LINK_NEWS, $valid, 'Make sure link to specific article valiates as news.'); + $this->assertEqual(LINK_NEWS, $valid, 'Make sure link to specific article validates as news.'); } - function testValidateBadNewsgroupLink() { + /** + * Validate Bad Newsgroup Link. + */ + public function testValidateBadNewsgroupLink() { $valid = link_validate_url('news:comp.bad_name.misc'); $this->assertEqual(FALSE, $valid, 'newsgroup names can\'t contain underscores, so it should come back as invalid.'); } - function testValidateInternalLinks() { + /** + * Validate Internal Links. + */ + public function testValidateInternalLinks() { $links = array( 'node/5', 'rss.xml', 'files/test.jpg', '/var/www/test', ); - + foreach ($links as $link) { $valid = link_validate_url($link); $this->assertEqual(LINK_INTERNAL, $valid, 'Test ' . $link . ' internal link.'); } } - function testValidateExternalLinks() { + /** + * Validate External Links. + */ + public function testValidateExternalLinks() { $links = array( 'http://localhost:8080/', 'www.example.com', @@ -452,7 +639,7 @@ class LinkValidateUrlLight extends DrupalWebTestCase { 'http://example.com/index.php?q=node/123', 'http://example.com/index.php?page=this\that', 'http://example.com/?first_name=Joe Bob&last_name=Smith', - // Anchors + // Anchors. 'http://www.example.com/index.php#test', 'http://www.example.com/index.php#this@that.', 'http://www.example.com/index.php#', @@ -460,8 +647,22 @@ class LinkValidateUrlLight extends DrupalWebTestCase { 'http://www.archive.org/stream/aesopsfables00aesorich#page/n7/mode/2up', 'http://www.example.com/blah/#this@that?', ); + // Test all of the protocols. - $allowed_protocols = variable_get('filter_allowed_protocols', array('http', 'https', 'ftp', 'news', 'nntp', 'telnet', 'mailto', 'irc', 'ssh', 'sftp', 'webcal')); + $allowed_protocols = variable_get('filter_allowed_protocols', array( + 'http', + 'https', + 'ftp', + 'news', + 'nntp', + 'telnet', + 'mailto', + 'irc', + 'ssh', + 'sftp', + 'webcal', + )); + foreach ($allowed_protocols as $protocol) { if ($protocol !== 'news' && $protocol !== 'mailto') { $links[] = $protocol . '://www.example.com'; @@ -470,29 +671,33 @@ class LinkValidateUrlLight extends DrupalWebTestCase { foreach ($links as $link) { $valid = link_validate_url($link); $this->assertEqual(LINK_EXTERNAL, $valid, 'Testing that ' . $link . ' is a valid external link.'); - // The following two lines are commented out and only used for comparisons. - //$valid2 = valid_url($link, TRUE); - //$this->assertEqual(TRUE, $valid2, "Using valid_url() on $link."); + // The following two lines are commented out and only used for + // comparisons. + // $valid2 = valid_url($link, TRUE); + // $this->assertEqual(TRUE, $valid2, "Using valid_url() on $link.");. } - // Test if we can make a tld valid: - variable_set('link_extra_domains', array('frog')); - $valid = link_validate_url('http://www.example.frog'); - $this->assertEqual(LINK_EXTERNAL, $valid, "Testing that http://www.example.frog is a valid external link if we've added 'frog' to the list of valid domains."); } - function testInvalidExternalLinks() { + /** + * Check Invalid External Links. + */ + public function testInvalidExternalLinks() { $links = array( 'http://www.ex ample.com/', - 'http://25.0.0/', // bad ip! + // Bad ip! + 'http://25.0.0/', 'http://4827.0.0.2/', - '//www.example.com/', - 'http://www.testß.com/', // ß not allowed in domain names! - 'http://www.example.frog/', // Bad TLD - //'http://www.-fudge.com/', // domains can't have sections starting with a dash. + // ß not allowed in domain names! + 'http://www.testß.com/', + // Bad TLD. + 'http://.www.foo.bar./', + // Domains can't have sections starting with a dash. + // 'http://www.-fudge.com/', ); foreach ($links as $link) { $valid = link_validate_url($link); $this->assertEqual(FALSE, $valid, 'Testing that ' . $link . ' is not a valid link.'); } } + } diff --git a/profiles/openasu/modules/contrib/link/views/link.views.inc b/profiles/openasu/modules/contrib/link/views/link.views.inc index 27d5182fa8..8c080ad111 100644 --- a/profiles/openasu/modules/contrib/link/views/link.views.inc +++ b/profiles/openasu/modules/contrib/link/views/link.views.inc @@ -1,4 +1,7 @@ default_actions(); $form['title'] = array( @@ -52,7 +58,7 @@ class link_views_handler_argument_target extends views_handler_argument { $form['wildcard'] = array( '#prefix' => ' ', - // prefix and no suffix means these two items will be grouped together. + // Prefix and no suffix means these two items will be grouped together. '#type' => 'textfield', '#title' => t('Wildcard'), '#size' => 20, @@ -125,8 +131,8 @@ class link_views_handler_argument_target extends views_handler_argument { asort($validate_types); $form['validate_type']['#options'] = $validate_types; - // Show this gadget if *anything* but 'none' is selected + // Show this gadget if *anything* but 'none' is selected. $form['validate_fail'] = array( '#type' => 'select', '#title' => t('Action to take if argument does not validate'), @@ -140,10 +146,11 @@ class link_views_handler_argument_target extends views_handler_argument { * * The argument sent may be found at $this->argument. */ - function query($group_by = FALSE) { + public function query($group_by = FALSE) { $this->ensure_my_table(); // Because attributes are stored serialized, our only option is to also // serialize the data we're searching for and use LIKE to find similar data. $this->query->add_where(0, $this->table_alias . ' . ' . $this->real_field . " LIKE '%%%s%'", serialize(array('target' => $this->argument))); } + } diff --git a/profiles/openasu/modules/contrib/link/views/link_views_handler_filter_protocol.inc b/profiles/openasu/modules/contrib/link/views/link_views_handler_filter_protocol.inc index a020b4e0e1..ae00c17e90 100644 --- a/profiles/openasu/modules/contrib/link/views/link_views_handler_filter_protocol.inc +++ b/profiles/openasu/modules/contrib/link/views/link_views_handler_filter_protocol.inc @@ -7,22 +7,30 @@ /** * Filter handler for limiting a view to URLs of a certain protocol. + * + * @codingStandardsIgnoreStart */ class link_views_handler_filter_protocol extends views_handler_filter_string { + /** * Set defaults for the filter options. + * + * @codingStandardsIgnoreEnd */ - function options(&$options) { - parent::options($options); + function option_definition() { + $options = parent::option_definition(); + $options['operator'] = 'OR'; $options['value'] = 'http'; $options['case'] = 0; + + return $options; } /** * Define the operators supported for protocols. */ - function operators() { + public function operators() { $operators = array( 'OR' => array( 'title' => t('Is one of'), @@ -35,7 +43,13 @@ class link_views_handler_filter_protocol extends views_handler_filter_string { return $operators; } - function options_form(&$form, &$form_state) { + /** + * Options form. + * + * @codingStandardsIgnoreStart + */ + public function options_form(&$form, &$form_state) { + //@codingStandardsIgnoreEnd parent::options_form($form, $form_state); $form['case'] = array( '#type' => 'value', @@ -45,8 +59,11 @@ class link_views_handler_filter_protocol extends views_handler_filter_string { /** * Provide a select list to choose the desired protocols. + * + * @codingStandardsIgnoreStart */ - function value_form(&$form, &$form_state) { + public function value_form(&$form, &$form_state) { + // @codingStandardsIgnoreEnd // We have to make some choices when creating this as an exposed // filter form. For example, if the operator is locked and thus // not rendered, we can't render dependencies; instead we only @@ -61,7 +78,19 @@ class link_views_handler_filter_protocol extends views_handler_filter_string { '#type' => 'select', '#title' => t('Protocol'), '#default_value' => $this->value, - '#options' => drupal_map_assoc(variable_get('filter_allowed_protocols', array('http', 'https', 'ftp', 'news', 'nntp', 'telnet', 'mailto', 'irc', 'ssh', 'sftp', 'webcal'))), + '#options' => drupal_map_assoc(variable_get('filter_allowed_protocols', array( + 'http', + 'https', + 'ftp', + 'news', + 'nntp', + 'telnet', + 'mailto', + 'irc', + 'ssh', + 'sftp', + 'webcal', + ))), '#multiple' => 1, '#size' => 4, '#description' => t('The protocols displayed here are those globally available. You may add more protocols by modifying the filter_allowed_protocols variable in your installation.'), @@ -71,8 +100,11 @@ class link_views_handler_filter_protocol extends views_handler_filter_string { /** * Filter down the query to include only the selected protocols. + * + * @codingStandardsIgnoreStart */ - function op_protocol($field, $upper) { + public function op_protocol($field, $upper) { + // @codingStandardsIgnoreEnd $db_type = db_driver(); $protocols = $this->value; @@ -82,20 +114,25 @@ class link_views_handler_filter_protocol extends views_handler_filter_string { // Simple case, the URL begins with the specified protocol. $condition = $field . ' LIKE \'' . $protocol . '%\''; - // More complex case, no protocol specified but is automatically cleaned up - // by link_cleanup_url(). RegEx is required for this search operation. + // More complex case, no protocol specified but is automatically cleaned + // up by link_cleanup_url(). RegEx is required for this search operation. if ($protocol == 'http') { - $LINK_DOMAINS = _link_domains(); + $link_domains = _link_domains(); if ($db_type == 'pgsql') { - // PostGreSQL code has NOT been tested. Please report any problems to the link issue queue. - // pgSQL requires all slashes to be double escaped in regular expressions. + // PostGreSQL code has NOT been tested. Please report any problems to + // the link issue queue. + // pgSQL requires all slashes to be double escaped in regular + // expressions. + // @codingStandardsIgnoreLine // See http://www.postgresql.org/docs/8.1/static/functions-matching.html#FUNCTIONS-POSIX-REGEXP - $condition .= ' OR ' . $field . ' ~* \'' . '^(([a-z0-9]([a-z0-9\\-_]*\\.)+)(' . $LINK_DOMAINS . '|[a-z][a-z]))' . '\''; + $condition .= ' OR ' . $field . ' ~* \'' . '^(([a-z0-9]([a-z0-9\\-_]*\\.)+)(' . $link_domains . '|[a-z][a-z]))' . '\''; } else { - // mySQL requires backslashes to be double (triple?) escaped within character classes. + // mySQL requires backslashes to be double (triple?) escaped within + // character classes. + // @codingStandardsIgnoreLine // See http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html#operator_regexp - $condition .= ' OR ' . $field . ' REGEXP \'' . '^(([a-z0-9]([a-z0-9\\\-_]*\.)+)(' . $LINK_DOMAINS . '|[a-z][a-z]))' . '\''; + $condition .= ' OR ' . $field . ' REGEXP \'' . '^(([a-z0-9]([a-z0-9\\\-_]*\.)+)(' . $link_domains . '|[a-z][a-z]))' . '\''; } } @@ -104,4 +141,5 @@ class link_views_handler_filter_protocol extends views_handler_filter_string { $this->query->add_where($this->options['group'], implode(' ' . $this->operator . ' ', $where_conditions)); } + } diff --git a/profiles/openasu/modules/contrib/menu_block/menu-block-background-display-options.png b/profiles/openasu/modules/contrib/menu_block/css/display-options-background.png similarity index 100% rename from profiles/openasu/modules/contrib/menu_block/menu-block-background-display-options.png rename to profiles/openasu/modules/contrib/menu_block/css/display-options-background.png diff --git a/profiles/openasu/modules/contrib/menu_block/menu-block.admin.css b/profiles/openasu/modules/contrib/menu_block/css/menu-block.admin.css similarity index 96% rename from profiles/openasu/modules/contrib/menu_block/menu-block.admin.css rename to profiles/openasu/modules/contrib/menu_block/css/menu-block.admin.css index 14c36615f7..d23c87715c 100644 --- a/profiles/openasu/modules/contrib/menu_block/menu-block.admin.css +++ b/profiles/openasu/modules/contrib/menu_block/css/menu-block.admin.css @@ -38,7 +38,7 @@ label#item-label { border: 1px solid #666; color: #666; font-weight: bold; - background-image: url(menu-block-background-display-options.png); + background-image: url(display-options-background.png); background-position: left top; background-repeat: no-repeat; } diff --git a/profiles/openasu/modules/contrib/menu_block/menu-block.js b/profiles/openasu/modules/contrib/menu_block/js/menu-block.js similarity index 95% rename from profiles/openasu/modules/contrib/menu_block/menu-block.js rename to profiles/openasu/modules/contrib/menu_block/js/menu-block.js index 73a99adbb9..2d7d85e628 100644 --- a/profiles/openasu/modules/contrib/menu_block/menu-block.js +++ b/profiles/openasu/modules/contrib/menu_block/js/menu-block.js @@ -22,7 +22,7 @@ Drupal.behaviors.menu_block = { } }); - // Syncronize the display of menu and parent item selects. + // Synchronize the display of menu and parent item selects. $('.menu-block-parent-mlid', context).change( function() { var menuItem = $(this).val().split(':'); $('.menu-block-menu-name').val(menuItem[0]); diff --git a/profiles/openasu/modules/contrib/menu_block/menu_block.admin.inc b/profiles/openasu/modules/contrib/menu_block/menu_block.admin.inc index eda4fd621b..04902624c2 100644 --- a/profiles/openasu/modules/contrib/menu_block/menu_block.admin.inc +++ b/profiles/openasu/modules/contrib/menu_block/menu_block.admin.inc @@ -241,8 +241,8 @@ function menu_block_configure_form($form, &$form_state) { } // Build the standard form. - $form['#attached']['js'][] = drupal_get_path('module', 'menu_block') . '/menu-block.js'; - $form['#attached']['css'][] = drupal_get_path('module', 'menu_block') . '/menu-block.admin.css'; + $form['#attached']['js'][] = drupal_get_path('module', 'menu_block') . '/js/menu-block.js'; + $form['#attached']['css'][] = drupal_get_path('module', 'menu_block') . '/css/menu-block.admin.css'; $form['#attached']['library'][] = array('system', 'ui.button'); $form['menu-block-wrapper-start'] = array( @@ -279,6 +279,12 @@ function menu_block_configure_form($form, &$form_state) { ), ); } + $form['display_empty'] = array( + '#type' => 'checkbox', + '#title' => t('Always display title'), + '#description' => t('Display the block with its title even if the block content is empty.'), + '#default_value' => $config['display_empty'], + ); $form['admin_title'] = array( '#type' => 'textfield', '#default_value' => $config['admin_title'], @@ -395,10 +401,12 @@ function menu_block_configure_form($form, &$form_state) { $form['menu-block-wrapper-close'] = array('#markup' => ''); // Set visibility of advanced options. - foreach (array('title_link', 'follow', 'depth_relative', 'follow_parent', 'expanded', 'sort', 'parent') as $key) { + foreach (array('title_link', 'display_empty', 'follow', 'depth_relative', 'follow_parent', 'expanded', 'sort', 'parent') as $key) { $form[$key]['#states']['visible'][':input[name=display_options]'] = array('value' => 'advanced'); } - if ($config['title_link'] || $follow || $config['expanded'] || $config['sort'] || $config['parent_mlid']) { + // depth_relative and follow_parent aren't listed below because they require + // $follow to be true. + if ($config['title_link'] || $config['display_empty'] || $follow || $config['expanded'] || $config['sort'] || $config['parent_mlid']) { $form['display_options']['#default_value'] = 'advanced'; } @@ -443,6 +451,7 @@ function _menu_block_block_save($delta = '', $edit = array()) { variable_set("menu_block_{$delta}_parent", $edit['parent']); variable_set("menu_block_{$delta}_level", $edit['level']); variable_set("menu_block_{$delta}_follow", $edit['follow']); + variable_set("menu_block_{$delta}_display_empty", $edit['display_empty']); variable_set("menu_block_{$delta}_depth", $edit['depth']); variable_set("menu_block_{$delta}_depth_relative", $edit['depth_relative']); variable_set("menu_block_{$delta}_expanded", $edit['expanded']); diff --git a/profiles/openasu/modules/contrib/menu_block/menu_block.info b/profiles/openasu/modules/contrib/menu_block/menu_block.info index f64bcf4da5..5a845ab34b 100644 --- a/profiles/openasu/modules/contrib/menu_block/menu_block.info +++ b/profiles/openasu/modules/contrib/menu_block/menu_block.info @@ -6,9 +6,8 @@ dependencies[] = menu (>7.11) configure = admin/config/user-interface/menu-block -; Information added by Drupal.org packaging script on 2015-06-30 -version = "7.x-2.7" +; Information added by Drupal.org packaging script on 2018-12-04 +version = "7.x-2.8" core = "7.x" project = "menu_block" -datestamp = "1435676232" - +datestamp = "1543950483" diff --git a/profiles/openasu/modules/contrib/menu_block/menu_block.module b/profiles/openasu/modules/contrib/menu_block/menu_block.module index a5bf3964f5..705fc85c0f 100644 --- a/profiles/openasu/modules/contrib/menu_block/menu_block.module +++ b/profiles/openasu/modules/contrib/menu_block/menu_block.module @@ -5,7 +5,7 @@ */ /** - * Denotes that the tree should use the menu picked by the curent page. + * Denotes that the tree should use the menu picked by the current page. */ define('MENU_TREE__CURRENT_PAGE_MENU', '_active'); @@ -241,6 +241,7 @@ function menu_block_default_config() { 'admin_title' => '', 'level' => 1, 'follow' => 0, + 'display_empty' => 0, 'depth' => 0, 'depth_relative' => 0, 'expanded' => 0, @@ -532,13 +533,18 @@ function menu_tree_build(array &$config) { $data['subject_array'] = $title; $data['subject'] = drupal_render($title); $data['content'] = array(); - if (!empty($tree) && $output = menu_block_tree_output($tree, $config)) { - $data['content']['#content'] = $output; - $data['content']['#theme'] = array( - 'menu_block_wrapper__' . str_replace('-', '_', $config['delta']), - 'menu_block_wrapper__' . str_replace('-', '_', $config['menu_name']), - 'menu_block_wrapper' - ); + if (!empty($tree) || !empty($config['display_empty'])) { + if ($output = menu_block_tree_output($tree, $config)) { + $data['content']['#content'] = $output; + $data['content']['#theme'] = array( + 'menu_block_wrapper__' . str_replace('-', '_', $config['delta']), + 'menu_block_wrapper__' . str_replace('-', '_', $config['menu_name']), + 'menu_block_wrapper' + ); + } + else { + $data['content']['#content'] = NULL; + } $data['content']['#config'] = $config; $data['content']['#delta'] = $config['delta']; } diff --git a/profiles/openasu/modules/contrib/menu_block/menu_block_export.info b/profiles/openasu/modules/contrib/menu_block/menu_block_export.info index 996c9ac54c..167a62c0fe 100644 --- a/profiles/openasu/modules/contrib/menu_block/menu_block_export.info +++ b/profiles/openasu/modules/contrib/menu_block/menu_block_export.info @@ -9,9 +9,8 @@ files[] = menu_block_export.admin.inc configure = admin/config/user-interface/menu-block/export -; Information added by Drupal.org packaging script on 2015-06-30 -version = "7.x-2.7" +; Information added by Drupal.org packaging script on 2018-12-04 +version = "7.x-2.8" core = "7.x" project = "menu_block" -datestamp = "1435676232" - +datestamp = "1543950483" diff --git a/profiles/openasu/modules/contrib/menu_block/plugins/content_types/menu_tree/menu_tree.inc b/profiles/openasu/modules/contrib/menu_block/plugins/content_types/menu_tree/menu_tree.inc index e57eded279..a31b41793b 100644 --- a/profiles/openasu/modules/contrib/menu_block/plugins/content_types/menu_tree/menu_tree.inc +++ b/profiles/openasu/modules/contrib/menu_block/plugins/content_types/menu_tree/menu_tree.inc @@ -33,8 +33,8 @@ function menu_block_menu_tree_content_type_content_types() { 'defaults' => menu_block_get_config(), // JavaScript and CSS for the config form. - 'js' => array(drupal_get_path('module', 'menu_block') . '/menu-block.js'), - 'css' => array(drupal_get_path('module', 'menu_block') . '/menu-block-admin.css'), + 'js' => array(drupal_get_path('module', 'menu_block') . '/js/menu-block.js'), + 'css' => array(drupal_get_path('module', 'menu_block') . '/css/menu-block.admin.css'), ); $menus = menu_block_get_all_menus(); diff --git a/profiles/openasu/modules/contrib/tablefield/README.txt b/profiles/openasu/modules/contrib/tablefield/README.txt index d9fcb2a090..7c1fd7a08d 100644 --- a/profiles/openasu/modules/contrib/tablefield/README.txt +++ b/profiles/openasu/modules/contrib/tablefield/README.txt @@ -86,11 +86,11 @@ stated otherwise. This format is intended to provide table data as a service: -- directly by enabling the submodule TableField Themeless. It provides - themeless output of a node's tablefield on the path 'node/%/themeless' (HTML, - JSON or XML). +- directly by enabling the Themeless module + (https://www.drupal.org/project/themeless). It provides themeless output of a + node's tablefield on the path 'node/%/themeless' (HTML, JSON or XML). - using a View (e.g. with https://www.drupal.org/project/views_datasource) that - outputs JSON or XML. The Views field settings includes 'Formatter'. + outputs JSON or XML. The Views field settings includes 'Formatter' - using a custom service (e.g. with https://www.drupal.org/project/services). @@ -125,24 +125,19 @@ service. ### Themeless output ### -Enabling the submodule TableField Themeless provides themeless output of a -node's tablefield on the path 'node/%/themeless' (HTML, JSON or XML). This is -useful to embed the table's HTML elsewhere (as an iFrame) or to provide the -table data as a service (JSON or XML) directly without the need of Views or a -Service. +Themeless module https://www.drupal.org/project/themeless provides themeless +output of a node's tablefield on the path 'node/%/themeless' (HTML, JSON or +XML). This is useful to embed the table's HTML elsewhere (as an iFrame) or to +provide the table data as a service (JSON or XML) directly without the need of +Views or a Service. -- Enable the submodule TableField Themeless. +- Enable the module Themeless. - Go to ../admin/structure/types/manage/[your-content-type]/display. - Uncollapse the CUSTOM DISPLAY SETTINGS and select 'Themeless'. - Save. - Now a new display mode appears besides Default and Teaser. Go and configure. - Save. -Install and enable https://www.drupal.org/project/subpathauto to have the -themeless output available under the alias path like 'some/alias/themeless' -besides 'node/%/themeless'. - - ## CREDITS ## - Original author: Kevin Hankens (http://www.kevinhankens.com) diff --git a/profiles/openasu/modules/contrib/tablefield/tablefield.info b/profiles/openasu/modules/contrib/tablefield/tablefield.info index 42bc3df664..f6d33a4187 100644 --- a/profiles/openasu/modules/contrib/tablefield/tablefield.info +++ b/profiles/openasu/modules/contrib/tablefield/tablefield.info @@ -7,9 +7,8 @@ package = Fields dependencies[] = field configure = admin/config/content/tablefield -; Information added by Drupal.org packaging script on 2017-06-13 -version = "7.x-3.1" +; Information added by Drupal.org packaging script on 2018-12-08 +version = "7.x-3.2" core = "7.x" project = "tablefield" -datestamp = "1497359647" - +datestamp = "1544293992" diff --git a/profiles/openasu/modules/contrib/tablefield/tablefield.install b/profiles/openasu/modules/contrib/tablefield/tablefield.install index 4eb31864d4..81de25839f 100644 --- a/profiles/openasu/modules/contrib/tablefield/tablefield.install +++ b/profiles/openasu/modules/contrib/tablefield/tablefield.install @@ -401,3 +401,16 @@ function tablefield_update_7006() { field_cache_clear(); drupal_set_message(t('All Table Field fields have their field settings converted to widget settings.'), 'warning'); } + +/** + * New Themeless module will subtitute submodule. + */ +function tablefield_update_7007() { + $themeless = l(t('Themeless'), 'https://www.drupal.org/project/themeless', array( + 'attributes' => array( + 'title' => t('Themeless module'), + 'target' => '_blank', + ), + )); + drupal_set_message(t('Module !themeless will substitute tablefield_themeless submodule. If you are using tablefield_themeless submodule then disable it and use !themeless', array('!themeless' => $themeless)), 'status'); +} diff --git a/profiles/openasu/modules/contrib/tablefield/tablefield.module b/profiles/openasu/modules/contrib/tablefield/tablefield.module index 8ae7491c86..75c42d7bdb 100644 --- a/profiles/openasu/modules/contrib/tablefield/tablefield.module +++ b/profiles/openasu/modules/contrib/tablefield/tablefield.module @@ -183,17 +183,57 @@ function tablefield_item_property_info() { 'getter callback' => 'tablefield_get_table_value', ); + $properties['value'] = array( + 'type' => 'text', + 'label' => t('The value column of the table.'), + 'computed' => TRUE, + 'getter callback' => 'tablefield_value_array_get', + // @todo: can we support setting via an array submitted from REST? + // 'setter callback' => 'tablefield_value_array_set', + ); + return $properties; } +/** + * + */ +function tablefield_tablefield_to_array($trat) { + // Translate tablefield to associative array. + $ttrans = array(); + $rowkey = 0; + foreach ($trat as $rowix => $rowvals) { + foreach ($rowvals as $ix => $val) { + $ttrans[$rowkey][] = $val; + } + $rowkey++; + } + return $ttrans; +} + +/** + * Get the value property in formatted array. + */ +function tablefield_value_array_get($data, array $options, $name, $type, $info) { + + if (isset($data['tabledata']['tabledata'])) { + $data['value'] = tablefield_tablefield_to_array($data['tabledata']['tabledata']); + } + elseif (isset($data['tablefield']['tabledata'])) { + $data['value'] = tablefield_tablefield_to_array($data['tablefield']['tabledata']); + } + return $data['value']; +} + /** * Get the property just as it is set in the data. Search API indexing addition. */ function tablefield_get_table_value($data, array $options, $name, $type, $info) { - if (isset($data['tabledata'])) { + + if (isset($data['tabledata']['tabledata'])) { $data['value'] = ''; - foreach ($data['tabledata'] as $rows) { + foreach ($data['tabledata']['tabledata'] as $rows) { $data['value'] .= implode(" ", $rows) . " "; } } @@ -601,7 +641,7 @@ function tablefield_field_formatter_settings_summary($field, $instance, $view_mo 'title' => t('Manage user permissions'), ), )); - $summary[] = t('Show link to export table data as CSV depending on !permission: %tr', array('%tr' => ($settings['hide_cols_skip_head']) ? t('Yes') : t('No'), '!permission' => $permission)); + $summary[] = t('Show link to export table data as CSV depending on !permission: %tr', array('%tr' => ($settings['export_csv']) ? t('Yes') : t('No'), '!permission' => $permission)); } return implode('
', $summary);; } @@ -756,6 +796,7 @@ function tablefield_field_formatter_settings_form($field, $instance, $view_mode, ); $element['hide_cols_skip_head'] = array( '#title' => t('Hide empty columns ignoring column header'), + '#description' => t('This will remove the table field completely if all columns are empty including the field label.'), '#type' => 'checkbox', '#default_value' => $settings['hide_cols_skip_head'], ); @@ -779,11 +820,6 @@ function tablefield_field_formatter_settings_form($field, $instance, $view_mode, '#type' => 'checkbox', '#default_value' => $settings['hide_empty_cols'], ); - $element['hide_cols_skip_head'] = array( - '#title' => t('Hide empty columns ignoring column header'), - '#type' => 'checkbox', - '#default_value' => $settings['hide_cols_skip_head'], - ); $permission = l(t('permission'), 'admin/people/permissions', array( 'fragment' => 'module-tablefield', 'attributes' => array( @@ -1121,30 +1157,35 @@ function tablefield_field_formatter_view($entity_type, $entity, $field, $instanc } } - $header = $noheader ? NULL : $header_data; + $header = $noheader ? [] : $header_data; $entity_info = entity_get_info($entity_type); $entity_id = !empty($entity_info['entity keys']['id']) ? $entity->{$entity_info['entity keys']['id']} : NULL; // Remove the first row from the tabledata. - array_shift($tabledata); - // Theme the table for display. - $element[$delta] = array( - '#theme' => 'tablefield_view', - '#caption' => $caption, - '#header_orientation' => isset($settings['header_orientation']) ? $settings['header_orientation'] : 'Horizontal', - '#sticky' => isset($settings['sticky_header']) ? $settings['sticky_header'] : NULL, - '#striping' => isset($settings['striping']) ? $settings['striping'] : NULL, - '#sortable' => isset($settings['sortable']) ? $settings['sortable'] : NULL, - '#header' => $header, - '#rows' => $tabledata, - '#delta' => $delta, - '#export' => isset($settings['export_csv']) ? $settings['export_csv'] : NULL, - '#entity_type' => $entity_type, - '#entity_id' => $entity_id, - '#field_name' => $field['field_name'], - '#langcode' => $langcode, - '#formatter' => $formatter, - ); + if ((empty($settings['hide_header']) && $header_data) || $settings['hide_header']) { + array_shift($tabledata); + } + // Theme the table for display, but only if we have printable + // table data. + if (!$settings['hide_cols_skip_head'] || $tabledata || $header) { + $element[$delta] = array( + '#theme' => 'tablefield_view', + '#caption' => $caption, + '#header_orientation' => isset($settings['header_orientation']) ? $settings['header_orientation'] : 'Horizontal', + '#sticky' => isset($settings['sticky_header']) ? $settings['sticky_header'] : NULL, + '#striping' => isset($settings['striping']) ? $settings['striping'] : NULL, + '#sortable' => isset($settings['sortable']) ? $settings['sortable'] : NULL, + '#header' => $header, + '#rows' => $tabledata, + '#delta' => $delta, + '#export' => isset($settings['export_csv']) ? $settings['export_csv'] : NULL, + '#entity_type' => $entity_type, + '#entity_id' => $entity_id, + '#field_name' => $field['field_name'], + '#langcode' => $langcode, + '#formatter' => $formatter, + ); + } } } } @@ -1438,13 +1479,22 @@ function tablefield_field_widget_form(&$form, &$form_state, $field, $instance, $ '#type' => 'textfield', '#title' => t('Table description'), '#default_value' => '', - '#description' => t('This brief caption will be associated with the table and will help Assitive Technology, like screen readers, better describe the content within.'), + '#description' => t('This brief caption will be associated with the table and will help Assistive Technology, like screen readers, better describe the content within.'), ); - if (isset($items[$delta]['value'])) { + + // Could be the Paragraphs module. + if (isset($items[$delta]['tablefield'])) { + $raw = $items[$delta]['tablefield']; + } + elseif (isset($items[$delta]['value'])) { $raw = unserialize($items[$delta]['value']); - if (isset($raw['caption'])) { - $element['tablefield']['caption']['#default_value'] = check_plain($raw['caption']); - } + } + // If still nothing then get the instance default, but only for delta 0. + elseif ($delta === 0 && isset($instance['default_value'][0]['tablefield'])) { + $raw = $instance['default_value'][0]['tablefield']; + } + if (isset($raw['caption'])) { + $element['tablefield']['caption']['#default_value'] = check_plain($raw['caption']); } // If the user doesn't have rebuild perms, we pass along the data as a value. @@ -1613,6 +1663,17 @@ function tablefield_field_widget_form(&$form, &$form_state, $field, $instance, $ return $element; } +/** + * Implements hook_custom_theme(). + */ +function tablefield_custom_theme() { + // Ensure that if this is a valid POST request that we use the same theme + // used by the referring form. + if (isset($_POST['form_build_id']) && path_is_admin($_GET['q'])) { + return variable_get('admin_theme'); + } +} + /** * Custom callback for a textarea to be processed for linebreaks. */ @@ -1857,9 +1918,10 @@ function tablefield_theme() { function theme_tablefield_view($variables) { $id = $variables['entity_type'] . '-' . $variables['entity_id'] . '-' . $variables['field_name'] . '-' . $variables['delta']; $sortable = $variables['sortable'] ? 'tablesorter' : NULL; + $cols_class = isset($variables['header']) ? 'tablefield-columns-' . count($variables['header']) : NULL; $attributes = array( 'id' => 'tablefield-' . $id, - 'class' => array('tablefield', $sortable), + 'class' => array('tablefield', $sortable, $cols_class), ); // Apply scope property to headers for accessibility. @@ -1985,7 +2047,7 @@ function tablefield_trim($tabledata, $ignore_head = FALSE) { * Whether ignoring header or not. */ function tablefield_rtrim_cols($tabledata, $ignore_head = FALSE) { - $row_num = count($tabledata); + $row_num = !empty($tabledata) ? count($tabledata) : 0; if (!$row_num) { return $tabledata; @@ -2064,7 +2126,7 @@ function tablefield_hide_rows($tabledata, $ignore_head = FALSE) { * Whether ignoring header or not. */ function tablefield_hide_cols($tabledata, $ignore_head = FALSE) { - $row_num = count($tabledata); + $row_num = !empty($tabledata) ? count($tabledata) : 0; if (!$row_num) { return $tabledata; @@ -2100,21 +2162,19 @@ function tablefield_multiple_field_remove_button_field_widgets_alter(&$fieldwidg * Avoid empty tables on multivalue fields with default header values. */ function tablefield_form_alter(&$form, &$form_state, $form_id) { - $instances = field_info_instances(); - $field_names = array(); - foreach ($instances as $entity_type => $entities) { - foreach ($entities as $bundle => $fields) { - foreach ($fields as $field_name => $instance) { - if ($instance['widget']['type'] === 'tablefield') { - $field_info = field_info_field($field_name); - if (empty($field_info['field_name'])) { - return; - } - if (isset($form[$field_info['field_name']]) && $field_info['cardinality'] != 1) { - $field_language = $form[$field_info['field_name']]['#language']; - $max_delta = $form[$field_info['field_name']][$field_language]['#max_delta']; - unset($form[$field_name][$field_language][$max_delta]); - } + if (empty($form_state['field'])) { + return; + } + + foreach (element_children($form_state['field']) as $field_name) { + foreach ($form_state['field'][$field_name] as $lang => $value) { + if (isset($value['instance']) && $value['instance']['widget']['type'] === 'tablefield' && $value['field']['cardinality'] != 1) { + $key_exists = FALSE; + $max_delta = $form[$field_name][$lang]['#max_delta']; + $parents = array_merge($value['array_parents'], array($field_name, $lang)); + $element = &drupal_array_get_nested_value($form, $parents, $key_exists); + if ($key_exists && isset($element[$max_delta])) { + unset($element[$max_delta]); } } } @@ -2227,7 +2287,7 @@ function theme_tablefield($variables) { $header = array(); } // Add sticky headers, if applicable. - if (count($header) && $sticky) { + if (!empty($header) && $sticky) { drupal_add_js('misc/tableheader.js'); // Add 'sticky-enabled' class to the table to identify it for JS. // This is needed to target tables constructed by this function. @@ -2241,7 +2301,7 @@ function theme_tablefield($variables) { } // Format the table columns: - if (count($colgroups)) { + if (!empty($colgroups)) { foreach ($colgroups as $number => $colgroup) { $attributes = array(); @@ -2261,7 +2321,7 @@ function theme_tablefield($variables) { } // Build colgroup. - if (is_array($cols) && count($cols)) { + if (is_array($cols) && !empty($cols)) { $output .= ''; $i = 0; foreach ($cols as $col) { @@ -2276,7 +2336,7 @@ function theme_tablefield($variables) { } // Add the 'empty' row message if available. - if (!count($rows) && $empty) { + if (empty($rows) && $empty) { $header_count = 0; foreach ($header as $header_cell) { if (is_array($header_cell)) { @@ -2296,25 +2356,25 @@ function theme_tablefield($variables) { } // Format the table header: - if (count($header)) { + if (!empty($header)) { $ts = tablesort_init($header); // HTML requires that the thead tag has tr tags in it followed by tbody // tags. Using ternary operator to check and see if we have any rows. - $output .= (count($rows) ? ' ' : ' '); + $output .= !empty($rows) ? ' \n"); + $output .= !empty($rows) ? " \n" : "\n"; } else { $ts = array(); } // Format the table rows: - if (count($rows)) { + if (!empty($rows)) { $output .= "\n"; $flip = array('even' => 'odd', 'odd' => 'even'); $class = 'even'; @@ -2333,7 +2393,7 @@ function theme_tablefield($variables) { $cells = $row; $attributes = array(); } - if (count($cells)) { + if (!empty($cells)) { // Add odd/even class. if (!$no_striping) { $class = $flip[$class]; diff --git a/profiles/openasu/modules/contrib/tablefield/themeless/README.txt b/profiles/openasu/modules/contrib/tablefield/themeless/README.txt deleted file mode 100644 index 4cd777056c..0000000000 --- a/profiles/openasu/modules/contrib/tablefield/themeless/README.txt +++ /dev/null @@ -1,26 +0,0 @@ -# TableField Themeless # - -Provides themeless output of a node's tablefield on the path 'node/%/themeless'. - - -## INSTALLATION ## - -- Enable the submodule at ../admin/modules. - - -## GET STARTED ## - -- Go to ../admin/structure/types/manage/[your-content-type]/display/themeless - and make sure it includes a TableField field. -- Choose the desired format and format settings. -- Update. -- Save. -- Visit a content page at ../node/%nid/themeless . - - -## TO KEEP IN MIND ## - -- Only the first found TableField field will be included in the output (also - multivalue). -- Enable https://www.drupal.org/project/subpathauto to have URLs with aliases - accessible for the themeless output, e.g. ../my/custom/alias/themeless. diff --git a/profiles/openasu/modules/contrib/tablefield/themeless/tablefield_themeless.info b/profiles/openasu/modules/contrib/tablefield/themeless/tablefield_themeless.info deleted file mode 100644 index 39d3661fb7..0000000000 --- a/profiles/openasu/modules/contrib/tablefield/themeless/tablefield_themeless.info +++ /dev/null @@ -1,12 +0,0 @@ -name = TableField Themeless -description = Provides themeless output of a node's tablefield on the path 'node/%/themeless'. -core = 7.x -package = Fields -dependencies[] = tablefield - -; Information added by Drupal.org packaging script on 2017-06-13 -version = "7.x-3.1" -core = "7.x" -project = "tablefield" -datestamp = "1497359647" - diff --git a/profiles/openasu/modules/contrib/tablefield/themeless/tablefield_themeless.module b/profiles/openasu/modules/contrib/tablefield/themeless/tablefield_themeless.module deleted file mode 100644 index 885dbd0f55..0000000000 --- a/profiles/openasu/modules/contrib/tablefield/themeless/tablefield_themeless.module +++ /dev/null @@ -1,108 +0,0 @@ - 'Themeless TableField', - 'page callback' => 'tablefield_themeless_view', - 'page arguments' => array(1), - 'access arguments' => array('access content'), - ); - - return $items; -} - -/** - * Implements hook_menu_local_tasks_alter(). - */ -function tablefield_themeless_menu_local_tasks_alter(&$data, $router_item, $root_path) { - $node = is_numeric(arg(1)) ? node_load(arg(1)) : NULL; - // Get all fields of entity type. - $fields = $node ? field_info_instances('node', $node->type) : array(); - // Get all table fields. - $tablefield = array(); - foreach ($fields as $key => $value) { - if ($value['widget']['type'] === 'tablefield') { - $tablefield[] = $key; - } - } - // Add a 'Themeless TableField' tab only if the content type has a TableField. - if ($node && $root_path == 'node/%' && isset($tablefield[0]) && !empty($tablefield[0])) { - $data['tabs'][0]['output'][] = array( - '#theme' => 'menu_local_task', - '#link' => array( - 'title' => t('Themeless TableField'), - 'href' => 'node/' . arg(1) . '/themeless', - 'localized_options' => array(), - ), - ); - } -} - -/** - * Get a node by a menucallback and return the first table field as JSON. - * - * @param object $node - * Fully loaded node object. - */ -function tablefield_themeless_view($node) { - // Get all fields of entity type. - $fields = field_info_instances('node', $node->type); - // Get all table fields. - $tablefield = array(); - foreach ($fields as $key => $value) { - if ($value['widget']['type'] === 'tablefield') { - $tablefield[] = $key; - } - } - // Populate $node->content with a render() array. - node_build_content($node, 'themeless'); - - $build = $node->content; - - // Get the field instance of the first found table field. - $instance = isset($tablefield[0]) ? field_info_instance('node', $tablefield[0], $node->type) : NULL; - $settings = isset($instance) ? field_get_display($instance, 'themeless', 'node') : NULL; - // XML. - if (isset($settings['settings']['xml']) && isset($build[$tablefield[0]][0]['#markup']) && $settings['settings']['xml']) { - // We are returning XML, so tell the browser. - drupal_add_http_header('Content-Type', 'application/xml'); - // Render the content of the first found table field. - print $build[$tablefield[0]][0]['#markup']; - } - // JSON. - elseif (isset($build[$tablefield[0]][0]['#markup'])) { - // We are returning JSON, so tell the browser. - drupal_add_http_header('Content-Type', 'application/json'); - // Render the content of the first found table field. - print $build[$tablefield[0]][0]['#markup']; - } - // HTML. - elseif ($tablefield[0] && $settings['type'] !== 'format_themeless') { - $output = field_view_field('node', $node, $tablefield[0], $settings); - print drupal_render($output); - } - else { - $nodata['code'] = $instance ? 204 : 404; - $nodata['message'] = $instance ? t('No Content: the tablefield is empty') : t('Not Found: no tablefield found'); - print drupal_json_output($nodata); - } -} - -/** - * Implements hook_entity_info_alter(). - */ -function tablefield_entity_info_alter(&$entity_info) { - $entity_info['node']['view modes']['themeless'] = array( - 'label' => t('Themeless'), - 'custom settings' => FALSE, - ); -} diff --git a/profiles/openasu/modules/contrib/tb_megamenu/templates/tb-megamenu-item.tpl.php b/profiles/openasu/modules/contrib/tb_megamenu/templates/tb-megamenu-item.tpl.php index 050c9f3457..2f61cc15b3 100644 --- a/profiles/openasu/modules/contrib/tb_megamenu/templates/tb-megamenu-item.tpl.php +++ b/profiles/openasu/modules/contrib/tb_megamenu/templates/tb-megamenu-item.tpl.php @@ -1,8 +1,8 @@ -' : ' '; foreach ($header as $cell) { $cell = tablesort_header($cell, $header, $ts); $output .= _theme_table_cell($cell, TRUE); } // Using ternary operator to close the tags based on whether or not there // are rows. - $output .= (count($rows) ? " \n" : "class="" role="listitem" aria-level=""> + class="" aria-level=""> " aria-haspopup="true"> - + diff --git a/profiles/openasu/modules/contrib/tb_megamenu/templates/tb-megamenu-nav.tpl.php b/profiles/openasu/modules/contrib/tb_megamenu/templates/tb-megamenu-nav.tpl.php index b4cb221ec2..b4a263ab40 100644 --- a/profiles/openasu/modules/contrib/tb_megamenu/templates/tb-megamenu-nav.tpl.php +++ b/profiles/openasu/modules/contrib/tb_megamenu/templates/tb-megamenu-nav.tpl.php @@ -1,3 +1,3 @@ - class="" role="list"> +
class="">
diff --git a/profiles/openasu/modules/contrib/tb_megamenu/templates/tb-megamenu-subnav.tpl.php b/profiles/openasu/modules/contrib/tb_megamenu/templates/tb-megamenu-subnav.tpl.php index b4cb221ec2..b4a263ab40 100644 --- a/profiles/openasu/modules/contrib/tb_megamenu/templates/tb-megamenu-subnav.tpl.php +++ b/profiles/openasu/modules/contrib/tb_megamenu/templates/tb-megamenu-subnav.tpl.php @@ -1,3 +1,3 @@ -class="" role="list"> +
class="">
diff --git a/profiles/openasu/modules/contrib/tb_megamenu/templates/tb-megamenu.tpl.php b/profiles/openasu/modules/contrib/tb_megamenu/templates/tb-megamenu.tpl.php index 5400fc87f5..c529cca24d 100644 --- a/profiles/openasu/modules/contrib/tb_megamenu/templates/tb-megamenu.tpl.php +++ b/profiles/openasu/modules/contrib/tb_megamenu/templates/tb-megamenu.tpl.php @@ -1,4 +1,4 @@ -class="" role="navigation"> +class="">