From 7c85261e562a327295c8eff5184496dc695f75a6 Mon Sep 17 00:00:00 2001 From: Bachir Soussi Chiadmi Date: Mon, 20 Apr 2015 18:02:17 +0200 Subject: [PATCH] more module updates --- .../modules/contrib/admin/admin/admin.info | 6 +- .../contrib/admin/admin_menu/README.txt | 2 +- .../admin_menu/admin_devel/admin_devel.info | 6 +- .../admin/admin_menu/admin_menu.color.css | 3 +- .../contrib/admin/admin_menu/admin_menu.css | 27 +- .../contrib/admin/admin_menu/admin_menu.inc | 123 -- .../contrib/admin/admin_menu/admin_menu.info | 6 +- .../admin/admin_menu/admin_menu.install | 7 +- .../contrib/admin/admin_menu/admin_menu.js | 12 - .../admin/admin_menu/admin_menu.map.inc | 87 +- .../admin/admin_menu/admin_menu.module | 6 - .../admin_menu_toolbar.info | 6 +- .../admin_menu_toolbar.module | 2 +- .../fix_errors_on_update-2090511-214_2.patch | 27 + .../admin/rules/includes/rules.event.inc | 411 +++++++ .../contrib/admin/rules/rules.drush.inc | 134 +++ .../includes/rules_scheduler.handler.inc | 99 ++ .../rules_scheduler/rules_scheduler.drush.inc | 81 ++ .../tests/rules_scheduler_test.inc | 24 + .../tests/rules_scheduler_test.info | 13 + .../tests/rules_scheduler_test.module | 6 + .../rules/tests/rules_test_invocation.info | 12 + .../rules/tests/rules_test_invocation.module | 13 + .../admin/token/tests/token_test.tokens.inc | 13 + .../uuid_services/uuid_services.admin.inc | 14 + .../dev/prod_check/js/prod-check-database.js | 31 + .../ecommerce/uc_restrict_qty/README.txt | 12 + .../fields/addressfield/addressfield-rtl.css | 4 +- .../addressfield.address_formats.inc | 442 +++++++ .../addressfield.administrative_areas.inc | 1037 +++++++++++++++++ .../fields/addressfield/addressfield.api.php | 66 ++ .../addressfield.devel_generate.inc | 3 +- .../fields/addressfield/addressfield.info | 8 +- .../fields/addressfield/addressfield.install | 30 + .../addressfield/addressfield.migrate.inc | 172 +++ .../fields/addressfield/addressfield.module | 283 +++-- .../addressfield/addressfield.tokens.inc | 233 ++++ .../example/addressfield_example.info | 6 +- ...eld-example.inc => address-ch-example.inc} | 0 .../plugins/format/address-hide-country.inc | 7 +- .../format/address-hide-postal-code.inc | 24 + .../plugins/format/address-hide-street.inc | 24 + .../plugins/format/address-optional.inc | 36 + .../addressfield/plugins/format/address.inc | 530 +++------ .../addressfield/plugins/format/name-full.inc | 19 +- .../plugins/format/name-oneline.inc | 9 +- .../plugins/format/organisation.inc | 9 +- .../addressfield/views/addressfield.views.inc | 73 +- ...dressfield_views_handler_field_country.inc | 40 + .../autocomplete_deluxe-rtl.css | 36 + .../autocomplete_deluxe.css | 2 +- .../autocomplete_deluxe.info | 6 +- .../autocomplete_deluxe.js | 32 +- .../autocomplete_deluxe.module | 12 +- .../contrib/fields/cck_phone/cck_phone.css | 2 +- .../fields/cck_phone/cck_phone.feeds.inc | 67 ++ .../contrib/fields/cck_phone/cck_phone.info | 4 +- .../contrib/fields/cck_phone/cck_phone.js | 2 +- .../contrib/fields/cck_phone/cck_phone.module | 94 +- .../cck_phone/cck_phone_countrycodes.inc | 2 +- .../fields/computed_field/computed_field.info | 6 +- .../computed_field/computed_field.module | 93 +- .../modules/contrib/fields/serial/serial.inc | 55 +- .../modules/contrib/fields/serial/serial.info | 6 +- .../contrib/fields/serial/serial.install | 37 +- .../contrib/fields/serial/serial.module | 63 +- .../contrib/fields/title/CHANGELOG.txt | 11 + .../contrib/fields/title/MAINTAINERS.txt | 13 + .../fields/title/tests/title_test.info | 6 +- .../contrib/fields/title/title.admin.inc | 6 +- .../contrib/fields/title/title.field.inc | 52 +- .../modules/contrib/fields/title/title.info | 6 +- .../modules/contrib/fields/title/title.module | 51 +- .../fields/title/views/title.views.inc | 10 +- .../fields/video_embed_field/img/vimeo.jpg | Bin 0 -> 14783 bytes .../fields/video_embed_field/img/youtube.jpg | Bin 0 -> 21571 bytes .../video_embed_brightcove/README.txt | 5 + .../video_embed_brightcove/img/brightcove.jpg | Bin 0 -> 77996 bytes .../video_embed_brightcove.info | 14 + .../video_embed_brightcove.module | 159 +++ .../video_embed_facebook/img/facebook.jpg | Bin 0 -> 145254 bytes .../video_embed_field.devel_generate.inc | 94 ++ .../video_embed_field.feeds.inc | 73 ++ .../video_embed_field.migrate.inc | 57 + ...eld_views_handler_field_thumbnail_path.inc | 22 + .../views/video_embed_field.views.inc | 72 ++ .../transliteration/transliteration.api.php | 22 + .../taxonomy/synonyms/synonyms.pages.inc | 289 +++++ .../synonyms/views/synonyms.views.inc | 17 + ...plugin_argument_validate_taxonomy_term.inc | 163 +++ .../contrib/theming/colorbox/colorbox.make | 8 + .../actions/book.action.inc | 77 ++ .../actions/user_cancel.action.inc | 81 ++ .../views/views_data_export/.gitignore | 1 + .../views/views_data_export/tests/base.test | 508 ++++++++ .../views_data_export/tests/csv_export.test | 211 ++++ .../views_data_export/tests/doc_export.test | 48 + .../views_data_export/tests/txt_export.test | 164 +++ .../views_data_export/tests/xls_export.test | 48 + .../views_data_export/tests/xml_export.test | 386 ++++++ 100 files changed, 6518 insertions(+), 913 deletions(-) create mode 100644 sites/all/modules/contrib/admin/rules/fix_errors_on_update-2090511-214_2.patch create mode 100644 sites/all/modules/contrib/admin/rules/includes/rules.event.inc create mode 100644 sites/all/modules/contrib/admin/rules/rules.drush.inc create mode 100644 sites/all/modules/contrib/admin/rules/rules_scheduler/includes/rules_scheduler.handler.inc create mode 100644 sites/all/modules/contrib/admin/rules/rules_scheduler/rules_scheduler.drush.inc create mode 100644 sites/all/modules/contrib/admin/rules/rules_scheduler/tests/rules_scheduler_test.inc create mode 100644 sites/all/modules/contrib/admin/rules/rules_scheduler/tests/rules_scheduler_test.info create mode 100644 sites/all/modules/contrib/admin/rules/rules_scheduler/tests/rules_scheduler_test.module create mode 100644 sites/all/modules/contrib/admin/rules/tests/rules_test_invocation.info create mode 100644 sites/all/modules/contrib/admin/rules/tests/rules_test_invocation.module create mode 100644 sites/all/modules/contrib/admin/token/tests/token_test.tokens.inc create mode 100644 sites/all/modules/contrib/admin/uuid/uuid_services/uuid_services.admin.inc create mode 100644 sites/all/modules/contrib/dev/prod_check/js/prod-check-database.js create mode 100644 sites/all/modules/contrib/ecommerce/uc_restrict_qty/README.txt create mode 100644 sites/all/modules/contrib/fields/addressfield/addressfield.address_formats.inc create mode 100644 sites/all/modules/contrib/fields/addressfield/addressfield.administrative_areas.inc create mode 100644 sites/all/modules/contrib/fields/addressfield/addressfield.migrate.inc create mode 100644 sites/all/modules/contrib/fields/addressfield/addressfield.tokens.inc rename sites/all/modules/contrib/fields/addressfield/example/plugins/format/{addressfield-example.inc => address-ch-example.inc} (100%) create mode 100644 sites/all/modules/contrib/fields/addressfield/plugins/format/address-hide-postal-code.inc create mode 100644 sites/all/modules/contrib/fields/addressfield/plugins/format/address-hide-street.inc create mode 100644 sites/all/modules/contrib/fields/addressfield/plugins/format/address-optional.inc create mode 100644 sites/all/modules/contrib/fields/addressfield/views/addressfield_views_handler_field_country.inc create mode 100644 sites/all/modules/contrib/fields/autocomplete_deluxe/autocomplete_deluxe-rtl.css create mode 100644 sites/all/modules/contrib/fields/cck_phone/cck_phone.feeds.inc create mode 100644 sites/all/modules/contrib/fields/title/MAINTAINERS.txt create mode 100644 sites/all/modules/contrib/fields/video_embed_field/img/vimeo.jpg create mode 100644 sites/all/modules/contrib/fields/video_embed_field/img/youtube.jpg create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/README.txt create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/img/brightcove.jpg create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.info create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.module create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/img/facebook.jpg create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_field.devel_generate.inc create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_field.feeds.inc create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_field.migrate.inc create mode 100644 sites/all/modules/contrib/fields/video_embed_field/views/handlers/views_embed_field_views_handler_field_thumbnail_path.inc create mode 100644 sites/all/modules/contrib/fields/video_embed_field/views/video_embed_field.views.inc create mode 100644 sites/all/modules/contrib/files/transliteration/transliteration.api.php create mode 100644 sites/all/modules/contrib/taxonomy/synonyms/synonyms.pages.inc create mode 100644 sites/all/modules/contrib/taxonomy/synonyms/views/synonyms.views.inc create mode 100644 sites/all/modules/contrib/taxonomy/synonyms/views/synonyms_views_plugin_argument_validate_taxonomy_term.inc create mode 100644 sites/all/modules/contrib/theming/colorbox/colorbox.make create mode 100644 sites/all/modules/contrib/views/views_bulk_operations/actions/book.action.inc create mode 100644 sites/all/modules/contrib/views/views_bulk_operations/actions/user_cancel.action.inc create mode 100644 sites/all/modules/contrib/views/views_data_export/.gitignore create mode 100644 sites/all/modules/contrib/views/views_data_export/tests/base.test create mode 100644 sites/all/modules/contrib/views/views_data_export/tests/csv_export.test create mode 100644 sites/all/modules/contrib/views/views_data_export/tests/doc_export.test create mode 100644 sites/all/modules/contrib/views/views_data_export/tests/txt_export.test create mode 100644 sites/all/modules/contrib/views/views_data_export/tests/xls_export.test create mode 100644 sites/all/modules/contrib/views/views_data_export/tests/xml_export.test diff --git a/sites/all/modules/contrib/admin/admin/admin.info b/sites/all/modules/contrib/admin/admin/admin.info index 33c5b7eb..9ec8015b 100644 --- a/sites/all/modules/contrib/admin/admin/admin.info +++ b/sites/all/modules/contrib/admin/admin/admin.info @@ -13,9 +13,9 @@ files[] = theme/admin-panes.tpl.php files[] = theme/admin-toolbar.tpl.php files[] = theme/theme.inc -; Information added by drupal.org packaging script on 2011-09-30 -version = "7.x-2.x-dev" +; Information added by drupal.org packaging script on 2013-09-30 +version = "7.x-2.0-beta3+8-dev" core = "7.x" project = "admin" -datestamp = "1317340920" +datestamp = "1380552733" diff --git a/sites/all/modules/contrib/admin/admin_menu/README.txt b/sites/all/modules/contrib/admin/admin_menu/README.txt index f66a61e3..136db709 100644 --- a/sites/all/modules/contrib/admin/admin_menu/README.txt +++ b/sites/all/modules/contrib/admin/admin_menu/README.txt @@ -20,7 +20,7 @@ None. -- INSTALLATION -- -* Install as usual, see http://drupal.org/node/70151 for further information. +* Install as usual, see http://drupal.org/node/895232 for further information. * You likely want to disable Toolbar module, since its output clashes with Administration menu. diff --git a/sites/all/modules/contrib/admin/admin_menu/admin_devel/admin_devel.info b/sites/all/modules/contrib/admin/admin_menu/admin_devel/admin_devel.info index 6408a1bb..ab3d641f 100644 --- a/sites/all/modules/contrib/admin/admin_menu/admin_devel/admin_devel.info +++ b/sites/all/modules/contrib/admin/admin_menu/admin_devel/admin_devel.info @@ -4,9 +4,9 @@ package = Administration core = 7.x scripts[] = admin_devel.js -; Information added by drupal.org packaging script on 2013-01-31 -version = "7.x-3.0-rc4" +; Information added by Drupal.org packaging script on 2014-12-19 +version = "7.x-3.0-rc5" core = "7.x" project = "admin_menu" -datestamp = "1359651687" +datestamp = "1419029284" diff --git a/sites/all/modules/contrib/admin/admin_menu/admin_menu.color.css b/sites/all/modules/contrib/admin/admin_menu/admin_menu.color.css index f2491cd5..ea3ef491 100644 --- a/sites/all/modules/contrib/admin/admin_menu/admin_menu.color.css +++ b/sites/all/modules/contrib/admin/admin_menu/admin_menu.color.css @@ -32,8 +32,7 @@ #admin-menu li li.expandable { background-color: #b93f3f; } -#admin-menu li li:hover, -#admin-menu li li.iehover { +#admin-menu li li:hover { background-color: #690f0f; } #admin-menu li li.expandable:hover a, diff --git a/sites/all/modules/contrib/admin/admin_menu/admin_menu.css b/sites/all/modules/contrib/admin/admin_menu/admin_menu.css index fd86dd79..52ae3ff5 100644 --- a/sites/all/modules/contrib/admin/admin_menu/admin_menu.css +++ b/sites/all/modules/contrib/admin/admin_menu/admin_menu.css @@ -98,6 +98,7 @@ body.admin-menu { #admin-menu .dropdown li li { background: #202020; filter: Alpha(opacity=88); + float: none; opacity: 0.88; width: 160px; /* Required for Opera */ } @@ -126,11 +127,7 @@ body.admin-menu { #admin-menu .dropdown li:hover ul ul, #admin-menu .dropdown li:hover ul ul ul, #admin-menu .dropdown li:hover ul ul ul ul, -#admin-menu .dropdown li:hover ul ul ul ul ul, -#admin-menu .dropdown li.iehover ul ul, -#admin-menu .dropdown li.iehover ul ul ul, -#admin-menu .dropdown li.iehover ul ul ul ul, -#admin-menu .dropdown li.iehover ul ul ul ul ul { +#admin-menu .dropdown li:hover ul ul ul ul ul { display: none; left: -999em; /* LTR */ } @@ -140,12 +137,7 @@ body.admin-menu { #admin-menu .dropdown li li:hover ul, #admin-menu .dropdown li li li:hover ul, #admin-menu .dropdown li li li li:hover ul, -#admin-menu .dropdown li li li li li:hover ul, -#admin-menu .dropdown li.iehover ul, -#admin-menu .dropdown li li.iehover ul, -#admin-menu .dropdown li li li.iehover ul, -#admin-menu .dropdown li li li li.iehover ul, -#admin-menu .dropdown li li li li li.iehover ul { +#admin-menu .dropdown li li li li li:hover ul { display: block; left: auto; /* LTR */ } @@ -157,8 +149,7 @@ body.admin-menu { #admin-menu .dropdown li li.expandable { background: #45454A url(images/arrow.png) no-repeat 145px 6px; } -#admin-menu .dropdown li li:hover, -#admin-menu .dropdown li li.iehover { +#admin-menu .dropdown li li:hover { background-color: #111; } #admin-menu .dropdown li li:hover a, @@ -175,17 +166,9 @@ body.admin-menu { #admin-menu .dropdown li li.expandable:hover li.expandable:hover li a { border-color: #323232; } -#admin-menu .dropdown li li:hover li a, -#admin-menu .dropdown li li.iehover li a, -#admin-menu .dropdown li li.iehover li.iehover li a { +#admin-menu .dropdown li li:hover li a { color: #EEE; } -#admin-menu .dropdown li li.iehover a, -#admin-menu .dropdown li li.iehover li.iehover a, -#admin-menu .dropdown li li.iehover li.iehover li.iehover a { - color: #FFF; - width: 90%; /* IE */ -} /* Search form */ #admin-menu .admin-menu-search .form-item { diff --git a/sites/all/modules/contrib/admin/admin_menu/admin_menu.inc b/sites/all/modules/contrib/admin/admin_menu/admin_menu.inc index e212970c..2eab789b 100644 --- a/sites/all/modules/contrib/admin/admin_menu/admin_menu.inc +++ b/sites/all/modules/contrib/admin/admin_menu/admin_menu.inc @@ -497,18 +497,6 @@ function admin_menu_links_icon() { ); } - // Add link to toggle developer modules (performance). - $saved_state = variable_get('admin_menu_devel_modules_enabled', NULL); - $links['icon']['toggle-modules'] = array( - '#title' => isset($saved_state) ? t('Enable developer modules') : t('Disable developer modules'), - '#weight' => 88, - '#access' => user_access('administer modules'), - '#href' => 'admin_menu/toggle-modules', - '#options' => array( - 'query' => $destination + array('token' => drupal_get_token('admin_menu/toggle-modules')), - ), - ); - // Add Devel module menu links. if (module_exists('devel')) { $devel_tree = menu_build_tree('devel'); @@ -697,29 +685,6 @@ function admin_menu_theme_settings() { '#title' => t('Cache menu in client-side browser'), '#default_value' => variable_get('admin_menu_cache_client', 1), ); - // Fetch all available modules manually, since module_list() only returns - // currently enabled modules, which makes this setting pointless if developer - // modules are currently disabled. - $all_modules = array(); - $result = db_query("SELECT name, filename, info FROM {system} WHERE type = 'module' ORDER BY name ASC"); - foreach ($result as $module) { - if (file_exists($module->filename)) { - $info = unserialize($module->info); - $all_modules[$module->name] = $info['name']; - } - } - $devel_modules = variable_get('admin_menu_devel_modules', _admin_menu_developer_modules()); - $devel_modules = array_intersect_key($all_modules, array_flip($devel_modules)); - $form['performance']['admin_menu_devel_modules_skip'] = array( - '#type' => 'checkboxes', - '#title' => t('Developer modules to keep enabled'), - '#default_value' => variable_get('admin_menu_devel_modules_skip', array()), - '#options' => $devel_modules, - '#access' => !empty($devel_modules), - '#description' => t('The selected modules will not be disabled when the link %disable-developer-modules below the icon in the menu is invoked.', array( - '%disable-developer-modules' => t('Disable developer modules'), - )), - ); return system_settings_form($form); } @@ -783,94 +748,6 @@ function _admin_menu_form_devel_admin_settings_alter(&$form, $form_state) { ); } -/** - * Menu callback; Enable/disable developer modules. - * - * This can save up to 150ms on each uncached page request. - */ -function admin_menu_toggle_modules() { - if (!isset($_GET['token']) || !drupal_valid_token($_GET['token'], current_path())) { - return MENU_ACCESS_DENIED; - } - - $rebuild = FALSE; - $saved_state = variable_get('admin_menu_devel_modules_enabled', NULL); - if (isset($saved_state)) { - // Re-enable modules that were enabled before. - module_enable($saved_state); - variable_del('admin_menu_devel_modules_enabled'); - drupal_set_message(t('Enabled these modules: !module-list.', array('!module-list' => implode(', ', $saved_state)))); - $rebuild = TRUE; - } - else { - // Allow site admins to override this variable via settings.php. - $devel_modules = variable_get('admin_menu_devel_modules', _admin_menu_developer_modules()); - // Store currently enabled modules in a variable. - $devel_modules = array_intersect(module_list(FALSE, FALSE), $devel_modules); - $devel_modules = array_diff($devel_modules, variable_get('admin_menu_devel_modules_skip', array())); - if (!empty($devel_modules)) { - variable_set('admin_menu_devel_modules_enabled', $devel_modules); - // Disable developer modules. - module_disable($devel_modules); - drupal_set_message(t('Disabled these modules: !module-list.', array('!module-list' => implode(', ', $devel_modules)))); - $rebuild = TRUE; - } - else { - drupal_set_message(t('No developer modules are enabled.')); - } - } - if ($rebuild) { - // Make sure everything is rebuilt, basically a combination of the calls - // from system_modules() and system_modules_submit(). - drupal_theme_rebuild(); - menu_rebuild(); - cache_clear_all('schema', 'cache'); - cache_clear_all(); - drupal_clear_css_cache(); - drupal_clear_js_cache(); - // Synchronize to catch any actions that were added or removed. - actions_synchronize(); - // Finally, flush admin_menu's cache. - admin_menu_flush_caches(); - } - drupal_goto(); -} - -/** - * Helper function to return a default list of developer modules. - */ -function _admin_menu_developer_modules() { - return array( - 'admin_devel', - 'cache_disable', - 'coder', - 'content_copy', - 'context_ui', - 'debug', - 'delete_all', - 'demo', - 'devel', - 'devel_node_access', - 'devel_themer', - 'field_ui', - 'fontyourface_ui', - 'form_controller', - 'imagecache_ui', - 'journal', - 'l10n_client', - 'l10n_update', - 'macro', - 'rules_admin', - 'stringoverrides', - 'trace', - 'upgrade_status', - 'user_display_ui', - 'util', - 'views_ui', - 'views_theme_wizard', - ); -} - /** * Flush all caches or a specific one. * diff --git a/sites/all/modules/contrib/admin/admin_menu/admin_menu.info b/sites/all/modules/contrib/admin/admin_menu/admin_menu.info index ee58c66c..c6dbd892 100644 --- a/sites/all/modules/contrib/admin/admin_menu/admin_menu.info +++ b/sites/all/modules/contrib/admin/admin_menu/admin_menu.info @@ -8,9 +8,9 @@ configure = admin/config/administration/admin_menu dependencies[] = system (>7.10) files[] = tests/admin_menu.test -; Information added by drupal.org packaging script on 2013-01-31 -version = "7.x-3.0-rc4" +; Information added by Drupal.org packaging script on 2014-12-19 +version = "7.x-3.0-rc5" core = "7.x" project = "admin_menu" -datestamp = "1359651687" +datestamp = "1419029284" diff --git a/sites/all/modules/contrib/admin/admin_menu/admin_menu.install b/sites/all/modules/contrib/admin/admin_menu/admin_menu.install index 70e31c6c..4e5443d3 100644 --- a/sites/all/modules/contrib/admin/admin_menu/admin_menu.install +++ b/sites/all/modules/contrib/admin/admin_menu/admin_menu.install @@ -33,9 +33,6 @@ function admin_menu_install() { function admin_menu_uninstall() { // Delete variables. variable_del('admin_menu_components'); - variable_del('admin_menu_devel_modules'); - variable_del('admin_menu_devel_modules_enabled'); - variable_del('admin_menu_devel_modules_skip'); variable_del('admin_menu_margin_top'); variable_del('admin_menu_position_fixed'); variable_del('admin_menu_tweak_modules'); @@ -44,6 +41,10 @@ function admin_menu_uninstall() { variable_del('admin_menu_display'); variable_del('admin_menu_cache_server'); variable_del('admin_menu_cache_client'); + // Unused variables still should be deleted. + variable_del('admin_menu_devel_modules'); + variable_del('admin_menu_devel_modules_enabled'); + variable_del('admin_menu_devel_modules_skip'); } /** diff --git a/sites/all/modules/contrib/admin/admin_menu/admin_menu.js b/sites/all/modules/contrib/admin/admin_menu/admin_menu.js index de0bb906..2e28b554 100644 --- a/sites/all/modules/contrib/admin/admin_menu/admin_menu.js +++ b/sites/all/modules/contrib/admin/admin_menu/admin_menu.js @@ -219,18 +219,6 @@ Drupal.admin.behaviors.destination = function (context, settings, $adminMenu) { * it will not run last. */ Drupal.admin.behaviors.hover = function (context, settings, $adminMenu) { - // Hover emulation for IE 6. - if ($.browser.msie && parseInt(jQuery.browser.version) == 6) { - $('li', $adminMenu).hover( - function () { - $(this).addClass('iehover'); - }, - function () { - $(this).removeClass('iehover'); - } - ); - } - // Delayed mouseout. $('li.expandable', $adminMenu).hover( function () { diff --git a/sites/all/modules/contrib/admin/admin_menu/admin_menu.map.inc b/sites/all/modules/contrib/admin/admin_menu/admin_menu.map.inc index 72a89602..f86e80cd 100644 --- a/sites/all/modules/contrib/admin/admin_menu/admin_menu.map.inc +++ b/sites/all/modules/contrib/admin/admin_menu/admin_menu.map.inc @@ -58,68 +58,52 @@ function node_admin_menu_map() { /** * Implements hook_admin_menu_map() on behalf of Field UI module. + * + * @todo Figure out how to fix the comment entity bundle mappings. */ function field_ui_admin_menu_map() { $map = array(); - foreach (entity_get_info() as $obj_type => $info) { - foreach ($info['bundles'] as $bundle_name => $bundle_info) { - if (isset($bundle_info['admin'])) { - $arguments = array(); - switch ($obj_type) { - case 'comment': - $fields = array(); - foreach (field_info_instances($obj_type, $bundle_name) as $field) { - $fields[] = $field['field_name']; - } - // @todo Make Comment module expose the original node type bundle, - // pretty please. - if (drupal_substr($bundle_name, 0, 13) == 'comment_node_') { - $bundle_name = drupal_substr($bundle_name, 13); - } - // @todo Doesn't work yet. Why? - $arguments = array( - '%comment_node_type' => array($bundle_name), - '%field_ui_menu' => $fields, - ); - break; - case 'node': - $fields = array(); - foreach (field_info_instances($obj_type, $bundle_name) as $field) { - $fields[] = $field['field_name']; - } - $arguments = array( - '%node_type' => array($bundle_name), - '%field_ui_menu' => $fields, - ); - break; + foreach (entity_get_info() as $entity_type => $entity_info) { + if (!$entity_info['fieldable']) { + continue; + } - case 'taxonomy_term': - $fields = array(); - foreach (field_info_instances($obj_type, $bundle_name) as $field) { - $fields[] = $field['field_name']; - } - // Map machine_name to vid. - $arguments = array( - '%taxonomy_vocabulary_machine_name' => array($bundle_name), - '%field_ui_menu' => $fields, - ); - break; + foreach ($entity_info['bundles'] as $bundle => $bundle_info) { + // @see field_ui_menu() + if (!isset($bundle_info['admin'])) { + continue; + } - case 'user': - $arguments = array( - '%field_ui_menu' => array_keys(field_info_fields('user')), - ); - break; + // Check access to this bundle. + $bundle_info['admin'] += array( + 'access callback' => 'user_access', + 'access arguments' => array('administer site configuration'), + ); + if (!call_user_func_array($bundle_info['admin']['access callback'], $bundle_info['admin']['access arguments'])) { + continue; + } + + if ($fields = field_info_instances($entity_type, $bundle)) { + $path = $bundle_info['admin']['path']; + $argument = array(); + if (isset($bundle_info['admin']['bundle argument'])) { + $bundle_arg = arg($bundle_info['admin']['bundle argument'], $path); + $argument[$bundle_arg] = array($bundle); } - if (!empty($arguments)) { - $path = $bundle_info['admin']['path']; - $map["$path/fields/%field_ui_menu"]['parent'] = "$path/fields"; - $map["$path/fields/%field_ui_menu"]['arguments'][] = $arguments; + $argument['%field_ui_menu'] = array_keys($fields); + + if (!isset($map["$path/fields/%field_ui_menu"])) { + $map["$path/fields/%field_ui_menu"] = array( + 'parent' => "$path/fields", + 'arguments' => array(), + ); } + $map["$path/fields/%field_ui_menu"]['arguments'][] = $argument; } } } + return $map; } @@ -161,4 +145,3 @@ function views_ui_admin_menu_map() { ); return $map; } - diff --git a/sites/all/modules/contrib/admin/admin_menu/admin_menu.module b/sites/all/modules/contrib/admin/admin_menu/admin_menu.module index 8a8dee14..795ad211 100644 --- a/sites/all/modules/contrib/admin/admin_menu/admin_menu.module +++ b/sites/all/modules/contrib/admin/admin_menu/admin_menu.module @@ -87,12 +87,6 @@ function admin_menu_menu() { 'file' => 'admin_menu.inc', ); // Menu link callbacks. - $items['admin_menu/toggle-modules'] = array( - 'page callback' => 'admin_menu_toggle_modules', - 'access arguments' => array('administer modules'), - 'type' => MENU_CALLBACK, - 'file' => 'admin_menu.inc', - ); $items['admin_menu/flush-cache'] = array( 'page callback' => 'admin_menu_flush_cache', 'access arguments' => array('flush caches'), diff --git a/sites/all/modules/contrib/admin/admin_menu/admin_menu_toolbar/admin_menu_toolbar.info b/sites/all/modules/contrib/admin/admin_menu/admin_menu_toolbar/admin_menu_toolbar.info index 2514776c..fa4ca095 100644 --- a/sites/all/modules/contrib/admin/admin_menu/admin_menu_toolbar/admin_menu_toolbar.info +++ b/sites/all/modules/contrib/admin/admin_menu/admin_menu_toolbar/admin_menu_toolbar.info @@ -4,9 +4,9 @@ package = Administration core = 7.x dependencies[] = admin_menu -; Information added by drupal.org packaging script on 2013-01-31 -version = "7.x-3.0-rc4" +; Information added by Drupal.org packaging script on 2014-12-19 +version = "7.x-3.0-rc5" core = "7.x" project = "admin_menu" -datestamp = "1359651687" +datestamp = "1419029284" diff --git a/sites/all/modules/contrib/admin/admin_menu/admin_menu_toolbar/admin_menu_toolbar.module b/sites/all/modules/contrib/admin/admin_menu/admin_menu_toolbar/admin_menu_toolbar.module index 74a9ee1f..c6111bdc 100644 --- a/sites/all/modules/contrib/admin/admin_menu/admin_menu_toolbar/admin_menu_toolbar.module +++ b/sites/all/modules/contrib/admin/admin_menu/admin_menu_toolbar/admin_menu_toolbar.module @@ -70,7 +70,7 @@ function admin_menu_toolbar_admin_menu_output_build(&$content) { '#title' => t('Show shortcuts'), '#href' => '', '#options' => array( - 'attributes' => array('class' => 'shortcut-toggle'), + 'attributes' => array('class' => array('shortcut-toggle')), ), ); diff --git a/sites/all/modules/contrib/admin/rules/fix_errors_on_update-2090511-214_2.patch b/sites/all/modules/contrib/admin/rules/fix_errors_on_update-2090511-214_2.patch new file mode 100644 index 00000000..c1fe32ba --- /dev/null +++ b/sites/all/modules/contrib/admin/rules/fix_errors_on_update-2090511-214_2.patch @@ -0,0 +1,27 @@ +diff --git a/rules.module b/rules.module +index 719852c..9e4ec8f 100644 +--- a/rules.module ++++ b/rules.module +@@ -8,6 +8,22 @@ + // hook_init(). + require_once dirname(__FILE__) . '/modules/events.inc'; + ++/** Rules >=2.4 introduces a class called 'RulesEventHandlerEntityBundle' found in ++ * 'includes/rules.event.inc', so we include this file for versions older than 2.4 ++ * in order to prevent a bug at node/2090511. ++ */ ++$result = db_query("SELECT schema_version FROM {system} WHERE name = :name", array( ++ ':name' => 'rules', ++)); ++ ++if ($result) { ++ while ($row = $result->fetchAssoc()) { ++ if ($row['schema_version'] <7210) { ++ require_once dirname(__FILE__) . '/includes/rules.event.inc'; ++ } ++ } ++} ++ + /** + * Implements hook_module_implements_alter(). + */ diff --git a/sites/all/modules/contrib/admin/rules/includes/rules.event.inc b/sites/all/modules/contrib/admin/rules/includes/rules.event.inc new file mode 100644 index 00000000..27f6a336 --- /dev/null +++ b/sites/all/modules/contrib/admin/rules/includes/rules.event.inc @@ -0,0 +1,411 @@ +type, $node, $view_mode); + * @endcode + * If the event settings are optional, both events have to be invoked whereas + * usually the more general event is invoked last. E.g.: + * @code + * rules_invoke_event('node_view--' . $node->type, $node, $view_mode); + * rules_invoke_event('node_view', $node, $view_mode); + * @endcode + * + * Rules event handlers have to be declared using the 'class' key in + * hook_rules_event_info(), or may be discovered automatically, see + * rules_discover_plugins() for details. + * + * @see RulesEventHandlerBase + * @see RulesEventDefaultHandler + */ +interface RulesEventHandlerInterface { + + /** + * Constructs the event handler. + * + * @param string $event_name + * The base event string. + * @param array $info + * The event info of the given event. + */ + public function __construct($event_name, $info); + + /** + * Sets the event settings. + * + * @param array $settings + * An array of settings to set. + * + * @return RulesEventHandlerInterface + * The handler itself for chaining. + */ + public function setSettings(array $settings); + + /** + * Gets the event settings. + * + * @return array + * The array of settings. + */ + public function getSettings(); + + /** + * Returns an array of default settings. + * + * @return array + */ + public function getDefaults(); + + /** + * Returns a user-facing summary of the settings. + * + * @return string + * The summary in HTML, i.e. properly escaped or filtered. + */ + public function summary(); + + /** + * Builds the event settings form. + * + * @param array $form_state + * An associative array containing the current state of the form. + * + * @return array + * The form structure. + */ + public function buildForm(array &$form_state); + + /** + * Validate the event settings independent from a form submission. + * + * @throws RulesIntegrityException + * In case of validation errors, RulesIntegrityExceptions are thrown. + */ + public function validate(); + + /** + * Extract the form values and update the event settings. + * + * @param array $form + * An associative array containing the structure of the form. + * @param array $form_state + * An associative array containing the current state of the form. + */ + public function extractFormValues(array &$form, array &$form_state); + + /** + * Returns the suffix to be added to the base event named based upon settings. + * + * If event settings are used, the event name Rules uses for the configured + * event is {EVENT_NAME}--{SUFFIX}. + * + * @return string + * The suffix string. Return an empty string for not appending a suffix. + */ + public function getEventNameSuffix(); + + /** + * Returns info about the variables provided by this event. + * + * @return array + * An array of provided variables, keyed by variable names and with the + * variable info array as value. + */ + public function availableVariables(); + + /** + * Returns the base name of the event the event handler belongs to. + * + * @return string + * The name of the event the event handler belongs to. + */ + public function getEventName(); + + /** + * Returns the info array of the event the event handler belongs to. + * + * @return string + * The info array of the event the event handler belongs to. + */ + public function getEventInfo(); +} + +/** + * Interface for event dispatchers. + */ +interface RulesEventDispatcherInterface extends RulesEventHandlerInterface { + + /** + * Starts the event watcher. + */ + public function startWatching(); + + /** + * Stops the event watcher. + */ + public function stopWatching(); + + /** + * Returns whether the event dispatcher is currently active. + * + * @return bool + * TRUE if the event dispatcher is currently active, FALSE otherwise. + */ + public function isWatching(); +} + +/** + * Base class for event handler. + */ +abstract class RulesEventHandlerBase implements RulesEventHandlerInterface { + + /** + * The event name. + * + * @var string + */ + protected $eventName; + + /** + * The event info. + * + * @var array + */ + protected $eventInfo; + + /** + * The event settings. + * + * @var array + */ + protected $settings = array(); + + /** + * Implements RulesEventHandlerInterface::__construct() + */ + public function __construct($event_name, $info) { + $this->eventName = $event_name; + $this->eventInfo = $info; + $this->settings = $this->getDefaults(); + } + + /** + * Implements RulesEventHandlerInterface::getSettings() + */ + public function getSettings() { + return $this->settings; + } + + /** + * Implements RulesEventHandlerInterface::setSettings() + */ + public function setSettings(array $settings) { + $this->settings = $settings + $this->getDefaults(); + return $this; + } + + /** + * Implements RulesEventHandlerInterface::validate() + */ + public function validate() { + // Nothing to check by default. + } + + /** + * Implements RulesEventHandlerInterface::extractFormValues() + */ + public function extractFormValues(array &$form, array &$form_state) { + foreach ($this->getDefaults() as $key => $setting) { + $this->settings[$key] = isset($form_state['values'][$key]) ? $form_state['values'][$key] : $setting; + } + } + + /** + * Implements RulesEventHandlerInterface::availableVariables() + */ + public function availableVariables() { + return isset($this->eventInfo['variables']) ? $this->eventInfo['variables'] : array(); + } + + /** + * Implements RulesEventHandlerInterface::getEventName() + */ + public function getEventName() { + return $this->eventName; + } + + /** + * Implements RulesEventHandlerInterface::getEventInfo() + */ + public function getEventInfo() { + return $this->eventInfo; + } +} + +/** + * A handler for events having no settings. This is the default handler. + */ +class RulesEventDefaultHandler extends RulesEventHandlerBase { + + /** + * Implements RulesEventHandlerInterface::buildForm() + */ + public function buildForm(array &$form_state) { + return array(); + } + + /** + * Implements RulesEventHandlerInterface::getConfiguredEventName() + */ + public function getEventNameSuffix() { + return ''; + } + + /** + * Implements RulesEventHandlerInterface::summary() + */ + public function summary() { + return check_plain($this->eventInfo['label']); + } + + /** + * Implements RulesEventHandlerInterface::getDefaults() + */ + public function getDefaults() { + return array(); + } + + /** + * Implements RulesEventHandlerInterface::getSettings() + */ + public function getSettings() { + return NULL; + } +} + +/** + * Exposes the bundle of an entity as event setting. + */ +class RulesEventHandlerEntityBundle extends RulesEventHandlerBase { + + protected $entityType, $entityInfo, $bundleKey; + + /** + * Implements RulesEventHandlerInterface::__construct() + */ + public function __construct($event_name, $info) { + parent::__construct($event_name, $info); + // Cut off the suffix, e.g. remove 'view' from node_view. + $this->entityType = implode('_', explode('_', $event_name, -1)); + $this->entityInfo = entity_get_info($this->entityType); + if (!$this->entityInfo) { + throw new InvalidArgumentException('Unsupported event name passed.'); + } + } + + /** + * Implements RulesEventHandlerInterface::summary() + */ + public function summary() { + $bundle = &$this->settings['bundle']; + $bundle_label = isset($this->entityInfo['bundles'][$bundle]['label']) ? $this->entityInfo['bundles'][$bundle]['label'] : $bundle; + $suffix = isset($bundle) ? ' ' . t('of @bundle-key %name', array('@bundle-key' => $this->getBundlePropertyLabel(), '%name' => $bundle_label)) : ''; + return check_plain($this->eventInfo['label']) . $suffix; + } + + /** + * Implements RulesEventHandlerInterface::buildForm() + */ + public function buildForm(array &$form_state) { + $form['bundle'] = array( + '#type' => 'select', + '#title' => t('Restrict by @bundle', array('@bundle' => $this->getBundlePropertyLabel())), + '#description' => t('If you need to filter for multiple values, either add multiple events or use the "Entity is of bundle" condition instead.'), + '#default_value' => $this->settings['bundle'], + '#empty_value' => '', + ); + foreach ($this->entityInfo['bundles'] as $name => $bundle_info) { + $form['bundle']['#options'][$name] = $bundle_info['label']; + } + return $form; + } + + /** + * Returns the label to use for the bundle property. + * + * @return string + */ + protected function getBundlePropertyLabel() { + return $this->entityInfo['entity keys']['bundle']; + } + + /** + * Implements RulesEventHandlerInterface::extractFormValues() + */ + public function extractFormValues(array &$form, array &$form_state) { + $this->settings['bundle'] = !empty($form_state['values']['bundle']) ? $form_state['values']['bundle'] : NULL; + } + + /** + * Implements RulesEventHandlerInterface::validate() + */ + public function validate() { + if ($this->settings['bundle'] && empty($this->entityInfo['bundles'][$this->settings['bundle']])) { + throw new RulesIntegrityException(t('The @bundle %bundle of %entity_type is not known.', + array( + '%bundle' => $this->settings['bundle'], + '%entity_type' => $this->entityInfo['label'], + '@bundle' => $this->getBundlePropertyLabel(), + )), array(NULL, 'bundle')); + } + } + + /** + * Implements RulesEventHandlerInterface::getConfiguredEventName() + */ + public function getEventNameSuffix() { + return $this->settings['bundle']; + } + + /** + * Implements RulesEventHandlerInterface::getDefaults() + */ + public function getDefaults() { + return array( + 'bundle' => NULL, + ); + } + + /** + * Implements RulesEventHandlerInterface::availableVariables() + */ + public function availableVariables() { + $variables = $this->eventInfo['variables']; + if ($this->settings['bundle']) { + // Add the bundle to all variables of the entity type. + foreach ($variables as $name => $variable_info) { + if ($variable_info['type'] == $this->entityType) { + $variables[$name]['bundle'] = $this->settings['bundle']; + } + } + } + return $variables; + } +} diff --git a/sites/all/modules/contrib/admin/rules/rules.drush.inc b/sites/all/modules/contrib/admin/rules/rules.drush.inc new file mode 100644 index 00000000..dc30de4c --- /dev/null +++ b/sites/all/modules/contrib/admin/rules/rules.drush.inc @@ -0,0 +1,134 @@ + "List all the active and inactive rules for your site.", + 'drupal dependencies' => array('rules'), + 'aliases' => array('rules'), + ); + $items['rules-enable'] = array( + 'description' => "Enable a rule on your site.", + 'arguments' => array( + 'rule' => 'Rule name to enable.', + ), + 'drupal dependencies' => array('rules'), + 'aliases' => array('re'), + ); + $items['rules-disable'] = array( + 'description' => "Disable a rule on your site.", + 'arguments' => array( + 'rule' => 'Rule name to export.', + ), + 'drupal dependencies' => array('rules'), + 'aliases' => array('rd'), + ); + + return $items; +} + +/** + * Implements hook_drush_help(). + */ +function rules_drush_help($section) { + switch ($section) { + case 'drush:rules': + return dt("List all the rules on your site."); + case 'drush:rules-enable': + return dt("Enable/activate a rule on your site."); + case 'drush:rules-disable': + return dt("Disable/deactivate a rule on your site."); + } +} + +/** + * Get a list of all rules. + */ +function drush_rules_list() { + $rules = rules_config_load_multiple(FALSE); + $rows = array(array(dt('Rule'), dt('Label'), dt('Event'), dt('Active'), dt('Status'))); + foreach ($rules as $rule) { + if (!empty($rule->name) && !empty($rule->label)) { + $events = array(); + $event_info = rules_fetch_data('event_info'); + if ($rule instanceof RulesTriggerableInterface) { + foreach ($rule->events() as $event_name) { + $event_info += array($event_name => array('label' => dt('Unknown event "!event_name"', array('!event_name' => $event_name)))); + $events[] = check_plain($event_info[$event_name]['label']); + } + } + $rows[] = array( + $rule->name, + $rule->label, + implode(', ', $events), + $rule->active ? dt('Enabled') : dt('Disabled'), + $rule->status ? theme('entity_status', array('status' => $rule->status, 'html' => FALSE)) : '', + ); + } + } + drush_print_table($rows, TRUE); +} + +/** + * Enable a rule on the site. + */ +function drush_rules_enable() { + $args = func_get_args(); + $rule_name = (!empty($args) && is_array($args)) ? array_shift($args) : ''; + if (empty($rule_name)) { + return drush_set_error('', 'No rule name given.'); + } + + $rule = rules_config_load($rule_name); + if (empty($rule)) { + return drush_set_error('', dt('Could not load rule named "!rule-name".', array('!rule-name' => $rule_name))); + } + + if (empty($rule->active)) { + $rule->active = TRUE; + $rule->save(); + drush_log(dt('The rule "!name" has been enabled.', array('!name' => $rule_name)), 'success'); + } + else { + drush_log(dt('The rule "!name" is already enabled.', array('!name' => $rule_name)), 'warning'); + } +} + +/** + * Disable a rule on the site. + */ +function drush_rules_disable() { + $args = func_get_args(); + $rule_name = (!empty($args) && is_array($args)) ? array_shift($args) : ''; + if (empty($rule_name)) { + return drush_set_error('', 'No rule name given.'); + } + + $rule = rules_config_load($rule_name); + if (empty($rule)) { + return drush_set_error('', dt('Could not load rule named "!rule-name".', array('!rule-name' => $rule_name))); + } + + if (!empty($rule->active)) { + $rule->active = FALSE; + $rule->save(); + drush_log(dt('The rule "!name" has been disabled.', array('!name' => $rule_name)), 'success'); + } + else { + drush_log(dt('The rule "!name" is already disabled.', array('!name' => $rule_name)), 'warning'); + } +} diff --git a/sites/all/modules/contrib/admin/rules/rules_scheduler/includes/rules_scheduler.handler.inc b/sites/all/modules/contrib/admin/rules/rules_scheduler/includes/rules_scheduler.handler.inc new file mode 100644 index 00000000..07e36521 --- /dev/null +++ b/sites/all/modules/contrib/admin/rules/rules_scheduler/includes/rules_scheduler.handler.inc @@ -0,0 +1,99 @@ +task = $task; + } + + /** + * Implements RulesSchedulerTaskHandlerInterface::runTask(). + */ + public function runTask() { + if ($component = rules_get_cache('comp_' . $this->task['config'])) { + $replacements = array('%label' => $component->label(), '%plugin' => $component->plugin()); + $replacements['%identifier'] = $this->task['identifier'] ? $this->task['identifier'] : t('without identifier'); + rules_log('Scheduled evaluation of %plugin %label, task %identifier.', $replacements, RulesLog::INFO, $component, TRUE); + $state = unserialize($this->task['data']); + $state->restoreBlocks(); + // Block the config to prevent any future recursion. + $state->block($component); + // Finally evaluate the component with the given state. + $component->evaluate($state); + $state->unblock($component); + rules_log('Finished evaluation of %plugin %label, task %identifier.', $replacements, RulesLog::INFO, $component, FALSE); + $state->cleanUp(); + } + } + + /** + * Implements RulesSchedulerTaskHandlerInterface::afterTaskQueued(). + */ + public function afterTaskQueued() { + // Delete the task from the task list. + db_delete('rules_scheduler') + ->condition('tid', $this->task['tid']) + ->execute(); + } + + /** + * Implements RulesSchedulerTaskHandlerInterface::getTask(). + */ + public function getTask() { + return $this->task; + } + +} + +/** + * Interface for scheduled task handlers. + * + * Task handlers control the behavior of a task when it's queued or executed. + * Unless specified otherwise, the RulesSchedulerDefaultTaskHandler task handler + * is used. + * + * @see rules_scheduler_run_task() + * @see rules_scheduler_cron() + * @see RulesSchedulerDefaultTaskHandler + */ +interface RulesSchedulerTaskHandlerInterface { + + /** + * Processes a queue item. + * + * @throws RulesEvaluationException + * If there are any problems executing the task. + * + * @see rules_scheduler_run_task() + */ + public function runTask(); + + /** + * Processes a task after it has been queued. + * + * @see rules_scheduler_cron() + */ + public function afterTaskQueued(); + + /** + * Returns the task associated with the task handler. + * + * @return array + * The task (queue item) array. + */ + public function getTask(); + +} diff --git a/sites/all/modules/contrib/admin/rules/rules_scheduler/rules_scheduler.drush.inc b/sites/all/modules/contrib/admin/rules/rules_scheduler/rules_scheduler.drush.inc new file mode 100644 index 00000000..24405b2a --- /dev/null +++ b/sites/all/modules/contrib/admin/rules/rules_scheduler/rules_scheduler.drush.inc @@ -0,0 +1,81 @@ + 'Checks for scheduled tasks to be added to the queue.', + 'options' => array( + 'claim' => 'Optionally claim tasks from the queue to work on. Any value set will override the default time spent on this queue.', + ), + 'drupal dependencies' => array('rules', 'rules_scheduler'), + 'aliases' => array('rusch'), + 'examples' => array( + 'drush rusch' => 'Add scheduled tasks to the queue.', + 'drush rusch --claim' => 'Add scheduled tasks to the queue and claim items for the default amount of time.', + 'drush rusch --claim=30' => 'Add schedules tasks to the queue and claim items for 30 seconds.', + ), + ); + + return $items; +} + +/** + * Implements hook_drush_help(). + */ +function rules_scheduler_drush_help($section) { + switch ($section) { + case 'drush:rules-scheduler-tasks': + return dt('Checks for scheduled tasks to be added the queue. Can optionally claim tasks from the queue to work on.'); + } +} + +/** + * Command callback for processing the rules_scheduler_tasks queue. + * + * @see rules_scheduler_cron_queue_info(). + * @see rules_scheduler_cron(). + */ +function drush_rules_scheduler_tasks() { + if (rules_scheduler_queue_tasks()) { + // hook_exit() is not invoked for drush runs, so register it as shutdown + // callback for logging the rules log to the watchdog. + drupal_register_shutdown_function('rules_exit'); + // Clear the log before running tasks via the queue to avoid logging + // unrelated logs from previous operations. + RulesLog::logger()->clear(); + drush_log(dt('Added scheduled tasks to the queue.'), 'success'); + } + + $claim = drush_get_option('claim', FALSE); + if ($claim) { + // Fetch the queue information and let other modules alter it. + $queue_name = 'rules_scheduler_tasks'; + $info = module_invoke('rules_scheduler', 'cron_queue_info'); + drupal_alter('cron_queue_info', $info); + + $function = $info[$queue_name]['worker callback']; + // The drush option can override the default process time. + $time = is_numeric($claim) ? (int) $claim : $info[$queue_name]['time']; + $end = time() + $time; + // Claim items and process the queue. + $queue = DrupalQueue::get($queue_name); + $claimed = 0; + while (time() < $end && ($item = $queue->claimItem())) { + $function($item->data); + $queue->deleteItem($item); + $claimed++; + } + if ($claimed) { + drush_log(dt('Claimed and worked on !claimed scheduled tasks for up to !time seconds.', array('!claimed' => $claimed, '!time' => $time)), 'success'); + } + } +} diff --git a/sites/all/modules/contrib/admin/rules/rules_scheduler/tests/rules_scheduler_test.inc b/sites/all/modules/contrib/admin/rules/rules_scheduler/tests/rules_scheduler_test.inc new file mode 100644 index 00000000..39b378e4 --- /dev/null +++ b/sites/all/modules/contrib/admin/rules/rules_scheduler/tests/rules_scheduler_test.inc @@ -0,0 +1,24 @@ +getTask(); + $data = unserialize($task['data']); + + // Set the variable defined in the test to TRUE. + variable_set($data['variable'], TRUE); + } + +} diff --git a/sites/all/modules/contrib/admin/rules/rules_scheduler/tests/rules_scheduler_test.info b/sites/all/modules/contrib/admin/rules/rules_scheduler/tests/rules_scheduler_test.info new file mode 100644 index 00000000..3ce5f836 --- /dev/null +++ b/sites/all/modules/contrib/admin/rules/rules_scheduler/tests/rules_scheduler_test.info @@ -0,0 +1,13 @@ +name = "Rules Scheduler Tests" +description = "Support module for the Rules Scheduler tests." +package = Testing +core = 7.x +files[] = rules_scheduler_test.inc +hidden = TRUE + +; Information added by Drupal.org packaging script on 2015-03-16 +version = "7.x-2.9" +core = "7.x" +project = "rules" +datestamp = "1426527210" + diff --git a/sites/all/modules/contrib/admin/rules/rules_scheduler/tests/rules_scheduler_test.module b/sites/all/modules/contrib/admin/rules/rules_scheduler/tests/rules_scheduler_test.module new file mode 100644 index 00000000..11e48755 --- /dev/null +++ b/sites/all/modules/contrib/admin/rules/rules_scheduler/tests/rules_scheduler_test.module @@ -0,0 +1,6 @@ + t('A test token with colons in the name'), + 'description' => NULL, + ); + + return $info; +} diff --git a/sites/all/modules/contrib/admin/uuid/uuid_services/uuid_services.admin.inc b/sites/all/modules/contrib/admin/uuid/uuid_services/uuid_services.admin.inc new file mode 100644 index 00000000..b57d296e --- /dev/null +++ b/sites/all/modules/contrib/admin/uuid/uuid_services/uuid_services.admin.inc @@ -0,0 +1,14 @@ + 'checkbox', + '#title' => t('Support all UUID entity types'), + '#description' => t('Check this box to automatically provide Services integration for all entity types with UUID support.'), + '#default_value' => variable_get('uuid_services_support_all_entity_types', FALSE), + ); + return system_settings_form($form); +} diff --git a/sites/all/modules/contrib/dev/prod_check/js/prod-check-database.js b/sites/all/modules/contrib/dev/prod_check/js/prod-check-database.js new file mode 100644 index 00000000..8fc6395b --- /dev/null +++ b/sites/all/modules/contrib/dev/prod_check/js/prod-check-database.js @@ -0,0 +1,31 @@ +(function ($) { + + // Show / hide detailed db info. + + Drupal.behaviors.prod_check = { + attach: function(context, settings) { + $('#content').find('a.show-more').unbind('click').bind('click', function(e) { + e.preventDefault(); + + var $this = $(this), + details = $this.attr('data-details'), + hide = Drupal.t('Hide details'), + show = Drupal.t('Show details'), + active = 'expanded'; + + if ($this.hasClass(active)) { + $('#content').find('pre.' + details).hide(); + $this.text(show); + $this.removeClass(active); + } + else { + $('#content').find('pre.' + details).show(); + $this.text(hide); + $this.addClass(active); + } + }); + } + }; + +})(jQuery); + diff --git a/sites/all/modules/contrib/ecommerce/uc_restrict_qty/README.txt b/sites/all/modules/contrib/ecommerce/uc_restrict_qty/README.txt new file mode 100644 index 00000000..144fcd02 --- /dev/null +++ b/sites/all/modules/contrib/ecommerce/uc_restrict_qty/README.txt @@ -0,0 +1,12 @@ +Ubercart Restrict Qty lets you add a very basic Restrict Qty. to a product in your Ubercart store to limit the quantity of that product in the shopping cart to 1. This is useful for single purchase products or for instances where it just doesn't make sense for a customer to purchase more than one and you want to prevent it from happening. + +Due to the way products are added to the cart, customers can add multiple variations of the same product to their carts (i.e. different attribute/option combinations) but never more than one of any given variation. + +Instructions: + +Upload the module to your ubercart/contrib directory and enable it on your Drupal site. +Browse to the product you want to have a quantity restriction as an administrator. +Click on the product's Edit tab and then its Features secondary task tab. +Choose Restrict Qty. from the select box and click Add. +Test it out by adding the product to your cart! +If you already had a copy of that product in your shopping cart, you should empty your cart and add it again. Due to the way the module works, it won't restrict quantities on products already in customers' shopping carts. diff --git a/sites/all/modules/contrib/fields/addressfield/addressfield-rtl.css b/sites/all/modules/contrib/fields/addressfield/addressfield-rtl.css index e0e1832c..d979946d 100644 --- a/sites/all/modules/contrib/fields/addressfield/addressfield-rtl.css +++ b/sites/all/modules/contrib/fields/addressfield/addressfield-rtl.css @@ -1,10 +1,10 @@ -.addressfield-container-inline > div.form-item { +div.addressfield-container-inline > div.form-item { float: right; margin-right: 0; margin-left: 1em; } -.addressfield-container-inline.country-GB > div.form-item { +div.addressfield-container-inline.country-GB > div.form-item { margin-left: auto; margin-right: 0; } diff --git a/sites/all/modules/contrib/fields/addressfield/addressfield.address_formats.inc b/sites/all/modules/contrib/fields/addressfield/addressfield.address_formats.inc new file mode 100644 index 00000000..5ab59954 --- /dev/null +++ b/sites/all/modules/contrib/fields/addressfield/addressfield.address_formats.inc @@ -0,0 +1,442 @@ + array('locality'), + 'required_fields' => array('locality'), + 'dependent_locality_label' => t('Suburb'), + 'locality_label' => t('City'), + 'administrative_area_label' => t('Province'), + 'postal_code_label' => t('Postal code'), + 'render_administrative_area_value' => FALSE, + ); + + $address_formats = array(); + // These formats differ from the default only by the presence of the + // postal code in 'used_fields'. + $countries_with_optional_postal_code = array( + 'AC', 'AD', 'AL', 'AZ', 'BA', 'BB', 'BD', 'BG', 'BH', 'BM', 'BN', 'BT', + 'CR', 'CY', 'CZ', 'DO', 'DZ', 'EC', 'EH', 'ET', 'FO', 'GE', 'GN', 'GT', + 'GW', 'HR', 'HT', 'HU', 'IL', 'IS', 'JO', 'KE', 'KG', 'KH', 'KW', 'LA', + 'LA', 'LB', 'LK', 'LR', 'LS', 'MA', 'MC', 'MD', 'ME', 'MG', 'MK', 'MM', + 'MT', 'MU', 'MV', 'NE', 'NP', 'OM', 'PK', 'PY', 'RO', 'RS', 'SA', 'SI', + 'SK', 'SN', 'SZ', 'TA', 'TJ', 'TM', 'TN', 'VA', 'VC', 'VG', 'XK', 'ZM', + ); + foreach ($countries_with_optional_postal_code as $code) { + $address_formats[$code] = array( + 'used_fields' => array('locality', 'postal_code'), + ); + } + + // These formats differ from the default only by the presence of the + // postal code in 'used_fields' and 'required_fields'. + $countries_with_required_postal_code = array( + 'AT', 'AX', 'BE', 'BL', 'CH', 'DE', 'DK', 'FI', 'FK', 'FR', 'GF', 'GG', + 'GL', 'GP', 'GR', 'GS', 'IM', 'IO', 'JE', 'LI', 'LU', 'MF', 'MQ', 'NC', + 'NL', 'NO', 'PL', 'PM', 'PN', 'PT', 'RE', 'SE', 'SH', 'SJ', 'TC', 'WF', + 'YT', + ); + foreach ($countries_with_required_postal_code as $code) { + $address_formats[$code] = array( + 'used_fields' => array('locality', 'postal_code'), + 'required_fields' => array('locality', 'postal_code'), + ); + } + + $address_formats['AE'] = array( + 'used_fields' => array('administrative_area'), + 'administrative_area_label' => t('Emirate'), + ); + $address_formats['AM'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + ); + $address_formats['AR'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'administrative_area_label' => t('State', array(), array('context' => 'Territory of a country')), + 'render_administrative_area_value' => TRUE, + ); + $address_formats['AS'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area', 'postal_code'), + 'administrative_area_label' => t('State', array(), array('context' => 'Territory of a country')), + 'postal_code_label' => t('ZIP code'), + ); + $address_formats['AU'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area', 'postal_code'), + 'locality_label' => t('City/Suburb'), + 'administrative_area_label' => t('State', array(), array('context' => 'Territory of a country')), + 'postal_code_label' => t('Postcode'), + ); + $address_formats['BR'] = array( + 'used_fields' => array('dependent_locality', 'locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area', 'postal_code'), + 'dependent_locality_label' => t('Neighborhood'), + 'administrative_area_label' => t('State', array(), array('context' => 'Territory of a country')), + ); + $address_formats['BS'] = array( + 'used_fields' => array('locality', 'administrative_area'), + 'administrative_area_label' => t('Island'), + ); + $address_formats['BY'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + ); + $address_formats['CA'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area', 'postal_code'), + ); + $address_formats['CC'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + ); + $address_formats['CL'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'administrative_area_label' => t('State', array(), array('context' => 'Territory of a country')), + 'render_administrative_area_value' => TRUE, + ); + $address_formats['CN'] = array( + 'used_fields' => array('dependent_locality', 'locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area'), + 'dependent_locality_label' => t('District'), + ); + $address_formats['CO'] = array( + 'used_fields' => array('locality', 'administrative_area'), + 'administrative_area_label' => t('Department', array(), array('context' => 'Territory of a country')), + ); + $address_formats['CV'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'administrative_area_label' => t('Island'), + ); + $address_formats['CX'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + ); + $address_formats['EG'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'administrative_area_label' => t('Governorate'), + ); + $address_formats['EE'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'postal_code'), + 'administrative_area_label' => t('County'), + ); + $address_formats['ES'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area', 'postal_code'), + 'render_administrative_area_value' => TRUE, + ); + $address_formats['FM'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area', 'postal_code'), + 'administrative_area_label' => t('State', array(), array('context' => 'Territory of a country')), + 'postal_code_label' => t('ZIP code'), + ); + $address_formats['GB'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'postal_code'), + 'locality_label' => t('Town/City'), + 'administrative_area_label' => t('County'), + 'postal_code_label' => t('Postcode'), + ); + $address_formats['GI'] = array( + 'used_fields' => array('postal_code'), + ); + $address_formats['GU'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area', 'postal_code'), + 'administrative_area_label' => t('State', array(), array('context' => 'Territory of a country')), + 'postal_code_label' => t('ZIP code'), + ); + $address_formats['HK'] = array( + 'used_fields' => array('locality', 'administrative_area'), + 'required_fields' => array('administrative_area'), + 'locality_label' => t('District'), + 'administrative_area_label' => t('Area', array(), array('context' => 'Territory of a country')), + ); + $address_formats['HN'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area'), + ); + $address_formats['ID'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'locality_label' => t('City/Regency'), + 'render_administrative_area_value' => TRUE, + ); + $address_formats['IE'] = array( + 'used_fields' => array('locality', 'administrative_area'), + 'locality_label' => t('Town/City'), + 'administrative_area_label' => t('County'), + 'render_administrative_area_value' => TRUE, + ); + $address_formats['IN'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area', 'postal_code'), + 'administrative_area_label' => t('State', array(), array('context' => 'Territory of a country')), + 'postal_code_label' => t('PIN code'), + 'render_administrative_area_value' => TRUE, + ); + $address_formats['IQ'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area'), + ); + $address_formats['IR'] = array( + 'used_fields' => array('dependent_locality', 'locality', 'administrative_area', 'postal_code'), + 'dependent_locality_label' => t('Neighborhood'), + ); + $address_formats['IT'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area', 'postal_code'), + ); + $address_formats['JM'] = array( + 'used_fields' => array('locality', 'administrative_area'), + 'required_fields' => array('locality', 'administrative_area'), + 'administrative_area_label' => t('Parish', array(), array('context' => 'Territory of a country')), + 'render_administrative_area_value' => TRUE, + ); + $address_formats['JP'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area', 'postal_code'), + 'administrative_area_label' => t('Prefecture'), + 'render_administrative_area_value' => TRUE, + ); + $address_formats['KI'] = array( + 'used_fields' => array('locality', 'administrative_area'), + 'administrative_area_label' => t('Island'), + ); + $address_formats['KN'] = array( + 'used_fields' => array('locality', 'administrative_area'), + 'required_fields' => array('locality', 'administrative_area'), + 'administrative_area_label' => t('Island'), + ); + $address_formats['KR'] = array( + 'used_fields' => array('dependent_locality', 'locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area', 'postal_code'), + 'dependent_locality_label' => t('District'), + ); + $address_formats['KY'] = array( + 'used_fields' => array('administrative_area', 'postal_code'), + 'required_fields' => array('administrative_area'), + 'administrative_area_label' => t('Island'), + ); + $address_formats['KZ'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area', 'postal_code'), + 'administrative_area_label' => t('Region', array(), array('context' => 'Territory of a country')), + ); + $address_formats['LT'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'postal_code'), + 'administrative_area_label' => t('County'), + ); + $address_formats['LV'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'postal_code'), + 'administrative_area_label' => t('Municipality'), + ); + $address_formats['MH'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area', 'postal_code'), + 'administrative_area_label' => t('State', array(), array('context' => 'Territory of a country')), + 'postal_code_label' => t('ZIP code'), + ); + $address_formats['MN'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + ); + $address_formats['MP'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area', 'postal_code'), + 'administrative_area_label' => t('State', array(), array('context' => 'Territory of a country')), + 'postal_code_label' => t('ZIP code'), + ); + $address_formats['MX'] = array( + 'used_fields' => array('dependent_locality', 'locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'postal_code'), + 'dependent_locality_label' => t('Neighborhood'), + 'administrative_area_label' => t('State', array(), array('context' => 'Territory of a country')), + ); + $address_formats['MY'] = array( + 'used_fields' => array('dependent_locality', 'locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'postal_code'), + 'dependent_locality_label' => t('Village / Township'), + 'administrative_area_label' => t('State', array(), array('context' => 'Territory of a country')), + 'render_administrative_area_value' => TRUE, + ); + $address_formats['MZ'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + ); + $address_formats['NF'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + ); + $address_formats['NG'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'administrative_area_label' => t('State', array(), array('context' => 'Territory of a country')), + ); + $address_formats['NI'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'administrative_area_label' => t('Department', array(), array('context' => 'Territory of a country')), + ); + $address_formats['NR'] = array( + 'used_fields' => array('administrative_area'), + 'required_fields' => array('administrative_area'), + 'administrative_area_label' => t('District'), + ); + $address_formats['NZ'] = array( + 'used_fields' => array('dependent_locality', 'locality', 'postal_code'), + 'required_fields' => array('locality', 'postal_code'), + 'locality_label' => t('Town/City'), + 'postal_code_label' => t('Postcode'), + ); + $address_formats['PA'] = array( + 'used_fields' => array('locality', 'administrative_area'), + ); + $address_formats['PE'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'locality_label' => t('District'), + 'administrative_area_label' => t('Department', array(), array('context' => 'Territory of a country')), + ); + $address_formats['PF'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area', 'postal_code'), + 'administrative_area_label' => t('Island'), + ); + $address_formats['PG'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area'), + ); + $address_formats['PH'] = array( + 'used_fields' => array('dependent_locality', 'locality', 'administrative_area', 'postal_code'), + ); + $address_formats['PR'] = array( + 'used_fields' => array('locality', 'postal_code'), + 'required_fields' => array('locality', 'postal_code'), + 'postal_code_label' => t('ZIP code'), + ); + $address_formats['PW'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area', 'postal_code'), + 'administrative_area_label' => t('State', array(), array('context' => 'Territory of a country')), + 'postal_code_label' => t('ZIP code'), + ); + $address_formats['RU'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'postal_code'), + ); + $address_formats['SC'] = array( + 'used_fields' => array('locality', 'administrative_area'), + 'administrative_area_label' => t('Island'), + ); + $address_formats['SG'] = array( + 'used_fields' => array('postal_code'), + 'required_fields' => array('postal_code'), + ); + $address_formats['SM'] = array( + 'used_fields' => array('locality', 'postal_code'), + 'required_fields' => array('postal_code'), + ); + $address_formats['SO'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area'), + ); + $address_formats['SR'] = array( + 'used_fields' => array('locality', 'administrative_area'), + ); + $address_formats['SV'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area'), + ); + $address_formats['TH'] = array( + 'used_fields' => array('dependent_locality', 'locality', 'administrative_area', 'postal_code'), + ); + $address_formats['TR'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'postal_code'), + 'locality_label' => t('District'), + 'render_administrative_area_value' => TRUE, + ); + $address_formats['TV'] = array( + 'used_fields' => array('locality', 'administrative_area'), + 'administrative_area_label' => t('Island'), + ); + $address_formats['TW'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area', 'postal_code'), + ); + $address_formats['UA'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'postal_code'), + 'administrative_area_label' => t('Region', array(), array('context' => 'Territory of a country')), + ); + $address_formats['UM'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area'), + 'administrative_area_label' => t('State', array(), array('context' => 'Territory of a country')), + 'postal_code_label' => t('ZIP code'), + ); + $address_formats['US'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area', 'postal_code'), + 'administrative_area_label' => t('State', array(), array('context' => 'Territory of a country')), + 'postal_code_label' => t('ZIP code'), + ); + $address_formats['UY'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + ); + $address_formats['UZ'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + ); + $address_formats['VE'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area'), + 'render_administrative_area_value' => TRUE, + ); + $address_formats['VI'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + 'required_fields' => array('locality', 'administrative_area', 'postal_code'), + 'administrative_area_label' => t('State', array(), array('context' => 'Territory of a country')), + 'postal_code_label' => t('ZIP code'), + ); + $address_formats['VN'] = array( + 'used_fields' => array('locality', 'administrative_area', 'postal_code'), + ); + $address_formats['ZA'] = array( + 'used_fields' => array('dependent_locality', 'locality', 'postal_code'), + 'required_fields' => array('locality', 'postal_code'), + ); + + // Allow other modules to alter the formats. + drupal_alter('addressfield_address_formats', $address_formats); + + if (isset($address_formats[$country_code])) { + $format = $address_formats[$country_code] + $default_values; + } + else { + // There is no predefined address format for the requested country, + // but the defaults should work fine. + $format = $default_values; + } + + return $format; +} diff --git a/sites/all/modules/contrib/fields/addressfield/addressfield.administrative_areas.inc b/sites/all/modules/contrib/fields/addressfield/addressfield.administrative_areas.inc new file mode 100644 index 00000000..88343de9 --- /dev/null +++ b/sites/all/modules/contrib/fields/addressfield/addressfield.administrative_areas.inc @@ -0,0 +1,1037 @@ + t('Abu Dhabi'), + 'FU' => t('Fujairah'), + 'UQ' => t('Umm al-Quwain'), + 'SH' => t('Sharjah'), + 'DU' => t('Dubai'), + 'RK' => t('Ras al-Khaimah'), + 'AJ' => t('Ajmān'), + ); + $administrative_areas['AR'] = array( + 'B' => t('Buenos Aires'), + 'K' => t('Catamarca'), + 'H' => t('Chaco'), + 'U' => t('Chubut'), + 'C' => t('Ciudad de Buenos Aires'), + 'X' => t('Córdoba'), + 'W' => t('Corrientes'), + 'E' => t('Entre Ríos'), + 'P' => t('Formosa'), + 'Y' => t('Jujuy'), + 'L' => t('La Pampa'), + 'F' => t('La Rioja'), + 'M' => t('Mendoza'), + 'N' => t('Misiones'), + 'Q' => t('Neuquén'), + 'R' => t('Río Negro'), + 'A' => t('Salta'), + 'J' => t('San Juan'), + 'D' => t('San Luis'), + 'Z' => t('Santa Cruz'), + 'S' => t('Santa Fe'), + 'G' => t('Santiago del Estero'), + 'V' => t('Tierra del Fuego'), + 'T' => t('Tucumán'), + ); + $administrative_areas['AU'] = array( + 'ACT' => t('Australian Capital Territory'), + 'NSW' => t('New South Wales'), + 'NT' => t('Northern Territory'), + 'QLD' => t('Queensland'), + 'SA' => t('South Australia'), + 'TAS' => t('Tasmania'), + 'VIC' => t('Victoria'), + 'WA' => t('Western Australia'), + ); + $administrative_areas['BR'] = array( + 'AC' => t('Acre'), + 'AL' => t('Alagoas'), + 'AM' => t('Amazonas'), + 'AP' => t('Amapá'), + 'BA' => t('Bahia'), + 'CE' => t('Ceará'), + 'DF' => t('Distrito Federal'), + 'ES' => t('Espírito Santo'), + 'GO' => t('Goiás'), + 'MA' => t('Maranhão'), + 'MG' => t('Minas Gerais'), + 'MS' => t('Mato Grosso do Sul'), + 'MT' => t('Mato Grosso'), + 'PA' => t('Pará'), + 'PB' => t('Paraíba'), + 'PE' => t('Pernambuco'), + 'PI' => t('Piauí'), + 'PR' => t('Paraná'), + 'RJ' => t('Rio de Janeiro'), + 'RN' => t('Rio Grande do Norte'), + 'RO' => t('Rondônia'), + 'RR' => t('Roraima'), + 'RS' => t('Rio Grande do Sul'), + 'SC' => t('Santa Catarina'), + 'SE' => t('Sergipe'), + 'SP' => t('São Paulo'), + 'TO' => t('Tocantins'), + ); + $administrative_areas['CA'] = array( + 'AB' => t('Alberta'), + 'BC' => t('British Columbia'), + 'MB' => t('Manitoba'), + 'NB' => t('New Brunswick'), + 'NL' => t('Newfoundland and Labrador'), + 'NT' => t('Northwest Territories'), + 'NS' => t('Nova Scotia'), + 'NU' => t('Nunavut'), + 'ON' => t('Ontario'), + 'PE' => t('Prince Edward Island'), + 'QC' => t('Quebec'), + 'SK' => t('Saskatchewan'), + 'YT' => t('Yukon Territory'), + ); + $administrative_areas['CL'] = array( + 'AI' => t('Aysén del General Carlos Ibáñez del Campo'), + 'AN' => t('Antofagasta'), + 'AR' => t('Araucanía'), + 'AP' => t('Arica y Parinacota'), + 'AT' => t('Atacama'), + 'BI' => t('Biobío'), + 'CO' => t('Coquimbo'), + 'LI' => t('Libertador General Bernardo O\'Higgins'), + 'LL' => t('Los Lagos'), + 'LR' => t('Los Ríos'), + 'MA' => t('Magallanes y de la Antártica Chilena'), + 'ML' => t('Maule'), + 'RM' => t('Metropolitana de Santiago'), + 'TA' => t('Tarapacá'), + 'VS' => t('Valparaíso'), + ); + $administrative_areas['CN'] = array( + '34' => t('Anhui Sheng'), + '92' => t('Macau'), + '11' => t('Beijing Shi'), + '50' => t('Chongqing Shi'), + '35' => t('Fujian Sheng'), + '62' => t('Gansu Sheng'), + '44' => t('Guangdong Sheng'), + '45' => t('Guangxi Zhuangzuzizhiqu'), + '52' => t('Guizhou Sheng'), + '46' => t('Hainan Sheng'), + '13' => t('Hebei Sheng'), + '41' => t('Henan Sheng'), + '23' => t('Heilongjiang Sheng'), + '42' => t('Hubei Sheng'), + '43' => t('Hunan Sheng'), + '22' => t('Jilin Sheng'), + '32' => t('Jiangsu Sheng'), + '36' => t('Jiangxi Sheng'), + '21' => t('Liaoning Sheng'), + '15' => t('Neimenggu Zizhiqu'), + '64' => t('Ningxia Huizuzizhiqu'), + '63' => t('Qinghai Sheng'), + '37' => t('Shandong Sheng'), + '14' => t('Shanxi Sheng'), + '61' => t('Shaanxi Sheng'), + '31' => t('Shanghai Shi'), + '51' => t('Sichuan Sheng'), + '71' => t('Taiwan'), + '12' => t('Tianjin Shi'), + '54' => t('Xizang Zizhiqu'), + '91' => t('Hong Kong'), + '65' => t('Xinjiang Weiwuerzizhiqu'), + '53' => t('Yunnan Sheng'), + '33' => t('Zhejiang Sheng'), + ); + $administrative_areas['CO'] = array( + 'AMA' => t('Amazonas'), + 'ANT' => t('Antioquia'), + 'ARA' => t('Arauca'), + 'ATL' => t('Atlántico'), + 'BOL' => t('Bolívar'), + 'BOY' => t('Boyacá'), + 'CAL' => t('Caldas'), + 'CAQ' => t('Caquetá'), + 'CAS' => t('Casanare'), + 'CAU' => t('Cauca'), + 'CES' => t('Cesar'), + 'COR' => t('Córdoba'), + 'CUN' => t('Cundinamarca'), + 'CHO' => t('Chocó'), + 'GUA' => t('Guainía'), + 'GUV' => t('Guaviare'), + 'HUI' => t('Huila'), + 'LAG' => t('La Guajira'), + 'MAG' => t('Magdalena'), + 'MET' => t('Meta'), + 'NAR' => t('Nariño'), + 'NSA' => t('Norte de Santander'), + 'PUT' => t('Putumayo'), + 'QUI' => t('Quindío'), + 'RIS' => t('Risaralda'), + 'SAP' => t('San Andrés, Providencia y Santa Catalina'), + 'SAN' => t('Santander'), + 'SUC' => t('Sucre'), + 'TOL' => t('Tolima'), + 'VAC' => t('Valle del Cauca'), + 'VAU' => t('Vaupés'), + 'VID' => t('Vichada'), + ); + $administrative_areas['EE'] = array( + '37' => t('Harjumaa'), + '39' => t('Hiiumaa'), + '44' => t('Ida-Virumaa'), + '49' => t('Jõgevamaa'), + '51' => t('Järvamaa'), + '57' => t('Läänemaa'), + '59' => t('Lääne-Virumaa'), + '65' => t('Põlvamaa'), + '67' => t('Pärnumaa'), + '70' => t('Raplamaa'), + '74' => t('Saaremaa'), + '78' => t('Tartumaa'), + '82' => t('Valgamaa'), + '84' => t('Viljandimaa'), + '86' => t('Võrumaa'), + ); + $administrative_areas['EG'] = array( + 'ALX' => t('Alexandria'), + 'ASN' => t('Aswan'), + 'AST' => t('Asyut'), + 'BH' => t('Beheira'), + 'BNS' => t('Beni Suef'), + 'C' => t('Cairo'), + 'DK' => t('Dakahlia'), + 'DT' => t('Damietta'), + 'FYM' => t('Faiyum'), + 'GH' => t('Gharbia'), + 'GZ' => t('Giza'), + 'IS' => t('Ismailia'), + 'KFS' => t('Kafr el-Sheikh'), + 'MT' => t('Matruh'), + 'MN' => t('Minya'), + 'MNF' => t('Monufia'), + 'WAD' => t('New Valley'), + 'SIN' => t('North Sinai'), + 'PTS' => t('Port Said'), + 'KB' => t('Qalyubia'), + 'KN' => t('Qena'), + 'BA' => t('Red Sea'), + 'SHR' => t('Sharqia'), + 'SHG' => t('Sohag'), + 'JS' => t('South Sinai'), + 'SUZ' => t('Suez'), + 'LX' => t('Luxor'), + ); + $administrative_areas['ES'] = array( + 'C' => t("A Coruña"), + 'VI' => t('Alava'), + 'AB' => t('Albacete'), + 'A' => t('Alicante'), + 'AL' => t("Almería"), + 'O' => t('Asturias'), + 'AV' => t("Ávila"), + 'BA' => t('Badajoz'), + 'PM' => t('Baleares'), + 'B' => t('Barcelona'), + 'BU' => t('Burgos'), + 'CC' => t("Cáceres"), + 'CA' => t("Cádiz"), + 'S' => t('Cantabria'), + 'CS' => t("Castellón"), + 'CE' => t('Ceuta'), + 'CR' => t('Ciudad Real'), + 'CO' => t("Córdoba"), + 'CU' => t('Cuenca'), + 'GI' => t('Gerona'), + 'GR' => t('Granada'), + 'GU' => t('Guadalajara'), + 'SS' => t("Guipúzcoa"), + 'H' => t('Huelva'), + 'HU' => t('Huesca'), + 'J' => t("Jaén"), + 'LO' => t('La Rioja'), + 'GC' => t('Las Palmas'), + 'LE' => t("León"), + 'L' => t("Lérida"), + 'LU' => t('Lugo'), + 'M' => t('Madrid'), + 'MA' => t("Málaga"), + 'ML' => t('Melilla'), + 'MU' => t('Murcia'), + 'NA' => t('Navarra'), + 'OR' => t('Ourense'), + 'P' => t('Palencia'), + 'PO' => t('Pontevedra'), + 'SA' => t('Salamanca'), + 'TF' => t('Santa Cruz de Tenerife'), + 'SG' => t('Segovia'), + 'SE' => t('Sevilla'), + 'SO' => t('Soria'), + 'T' => t('Tarragona'), + 'TE' => t('Teruel'), + 'TO' => t('Toledo'), + 'V' => t('Valencia'), + 'VA' => t('Valladolid'), + 'BI' => t('Vizcaya'), + 'ZA' => t('Zamora'), + 'Z' => t('Zaragoza'), + ); + $administrative_areas['HK'] = array( + // HK subdivisions have no ISO codes assigned. + 'Kowloon' => t('Kowloon'), + 'Hong Kong Island' => t('Hong Kong Island'), + 'New Territories' => t('New Territories'), + ); + $administrative_areas['ID'] = array( + 'AC' => t('Aceh'), + 'BA' => t('Bali'), + 'BB' => t('Bangka Belitung'), + 'BT' => t('Banten'), + 'BE' => t('Bengkulu'), + 'JK' => t('DKI Jakarta'), + 'YO' => t('D.I. Yogyakarta'), + 'GO' => t('Gorontalo'), + 'JA' => t('Jambi'), + 'JB' => t('Jawa Barat'), + 'JT' => t('Jawa Tengah'), + 'JI' => t('Jawa Timur'), + 'KB' => t('Kalimantan Barat'), + 'KS' => t('Kalimantan Selatan'), + 'KT' => t('Kalimantan Tengah'), + 'KI' => t('Kalimantan Timur'), + 'KR' => t('Kepulauan Riau'), + 'LA' => t('Lampung'), + 'MA' => t('Maluku'), + 'MU' => t('Maluku Utara'), + 'NB' => t('Nusa Tenggara Barat'), + 'NT' => t('Nusa Tenggara Timur'), + 'PA' => t('Papua'), + 'PB' => t('Papua Barat'), + 'RI' => t('Riau'), + 'SR' => t('Sulawesi Barat'), + 'SN' => t('Sulawesi Selatan'), + 'ST' => t('Sulawesi Tengah'), + 'SG' => t('Sulawesi Tenggara'), + 'SA' => t('Sulawesi Utara'), + 'SB' => t('Sumatera Barat'), + 'SS' => t('Sumatera Selatan'), + 'SU' => t('Sumatera Utara'), + ); + $administrative_areas['IE'] = array( + 'CW' => t('Co Carlow'), + 'CN' => t('Co Cavan'), + 'CE' => t('Co Clare'), + 'CO' => t('Co Cork'), + 'DL' => t('Co Donegal'), + 'D' => t('Co Dublin'), + 'D1' => t('Dublin 1'), + 'D2' => t('Dublin 2'), + 'D3' => t('Dublin 3'), + 'D4' => t('Dublin 4'), + 'D5' => t('Dublin 5'), + 'D6' => t('Dublin 6'), + 'D6W' => t('Dublin 6w'), + 'D7' => t('Dublin 7'), + 'D8' => t('Dublin 8'), + 'D9' => t('Dublin 9'), + 'D10' => t('Dublin 10'), + 'D11' => t('Dublin 11'), + 'D12' => t('Dublin 12'), + 'D13' => t('Dublin 13'), + 'D14' => t('Dublin 14'), + 'D15' => t('Dublin 15'), + 'D16' => t('Dublin 16'), + 'D17' => t('Dublin 17'), + 'D18' => t('Dublin 18'), + 'D19' => t('Dublin 19'), + 'D20' => t('Dublin 20'), + 'D21' => t('Dublin 21'), + 'D22' => t('Dublin 22'), + 'D23' => t('Dublin 23'), + 'D24' => t('Dublin 24'), + 'G' => t('Co Galway'), + 'KY' => t('Co Kerry'), + 'KE' => t('Co Kildare'), + 'KK' => t('Co Kilkenny'), + 'LS' => t('Co Laois'), + 'LM' => t('Co Leitrim'), + 'LK' => t('Co Limerick'), + 'LD' => t('Co Longford'), + 'LH' => t('Co Louth'), + 'MO' => t('Co Mayo'), + 'MH' => t('Co Meath'), + 'MN' => t('Co Monaghan'), + 'OY' => t('Co Offaly'), + 'RN' => t('Co Roscommon'), + 'SO' => t('Co Sligo'), + 'TA' => t('Co Tipperary'), + 'WD' => t('Co Waterford'), + 'WH' => t('Co Westmeath'), + 'WX' => t('Co Wexford'), + 'WW' => t('Co Wicklow'), + ); + $administrative_areas['IN'] = array( + 'AP' => t('Andhra Pradesh'), + 'AR' => t('Arunachal Pradesh'), + 'AS' => t('Assam'), + 'BR' => t('Bihar'), + 'CT' => t('Chhattisgarh'), + 'DD' => t('Daman & Diu'), + 'DN' => t('Dadra & Nagar Haveli'), + 'GA' => t('Goa'), + 'GJ' => t('Gujarat'), + 'HP' => t('Himachal Pradesh'), + 'HR' => t('Haryana'), + 'JH' => t('Jharkhand'), + 'JK' => t('Jammu & Kashmir'), + 'KA' => t('Karnataka'), + 'KL' => t('Kerala'), + 'MH' => t('Maharashtra'), + 'MN' => t('Manipur'), + 'ML' => t('Meghalaya'), + 'MP' => t('Madhya Pradesh'), + 'MZ' => t('Mizoram'), + 'NL' => t('Nagaland'), + 'OR' => t('Odisha'), + 'PB' => t('Punjab'), + 'RJ' => t('Rajasthan'), + 'SK' => t('Sikkim'), + 'TN' => t('Tamil Nadu'), + 'TG' => t('Telangana'), + 'TR' => t('Tripura'), + 'UP' => t('Uttar Pradesh'), + 'UT' => t('Uttarakhand'), + 'WB' => t('West Bengal'), + ' ' => t('--'), + 'AN' => t('Andaman & Nicobar'), + 'CH' => t('Chandigarh'), + 'DN' => t('Dadra & Nagar Haveli'), + 'DD' => t('Daman & Diu'), + 'DL' => t('Delhi'), + 'LD' => t('Lakshadweep'), + 'PY' => t('Puducherry'), + ); + $administrative_areas['IT'] = array( + 'AG' => t('Agrigento'), + 'AL' => t('Alessandria'), + 'AN' => t('Ancona'), + 'AO' => t('Aosta'), + 'AP' => t('Ascoli Piceno'), + 'AQ' => t("L'Aquila"), + 'AR' => t('Arezzo'), + 'AT' => t('Asti'), + 'AV' => t('Avellino'), + 'BA' => t('Bari'), + 'BG' => t('Bergamo'), + 'BI' => t('Biella'), + 'BL' => t('Belluno'), + 'BN' => t('Benevento'), + 'BO' => t('Bologna'), + 'BR' => t('Brindisi'), + 'BS' => t('Brescia'), + 'BT' => t('Barletta-Andria-Trani'), + 'BZ' => t('Bolzano/Bozen'), + 'CA' => t('Cagliari'), + 'CB' => t('Campobasso'), + 'CE' => t('Caserta'), + 'CH' => t('Chieti'), + 'CI' => t('Carbonia-Iglesias'), + 'CL' => t('Caltanissetta'), + 'CN' => t('Cuneo'), + 'CO' => t('Como'), + 'CR' => t('Cremona'), + 'CS' => t('Cosenza'), + 'CT' => t('Catania'), + 'CZ' => t('Catanzaro'), + 'EN' => t('Enna'), + 'FC' => t('Forlì-Cesena'), + 'FE' => t('Ferrara'), + 'FG' => t('Foggia'), + 'FI' => t('Firenze'), + 'FM' => t('Fermo'), + 'FR' => t('Frosinone'), + 'GE' => t('Genova'), + 'GO' => t('Gorizia'), + 'GR' => t('Grosseto'), + 'IM' => t('Imperia'), + 'IS' => t('Isernia'), + 'KR' => t('Crotone'), + 'LC' => t('Lecco'), + 'LE' => t('Lecce'), + 'LI' => t('Livorno'), + 'LO' => t('Lodi'), + 'LT' => t('Latina'), + 'LU' => t('Lucca'), + 'MB' => t('Monza e Brianza'), + 'MC' => t('Macerata'), + 'ME' => t('Messina'), + 'MI' => t('Milano'), + 'MN' => t('Mantova'), + 'MO' => t('Modena'), + 'MS' => t('Massa-Carrara'), + 'MT' => t('Matera'), + 'NA' => t('Napoli'), + 'NO' => t('Novara'), + 'NU' => t('Nuoro'), + 'OG' => t('Ogliastra'), + 'OR' => t('Oristano'), + 'OT' => t('Olbia-Tempio'), + 'PA' => t('Palermo'), + 'PC' => t('Piacenza'), + 'PD' => t('Padova'), + 'PE' => t('Pescara'), + 'PG' => t('Perugia'), + 'PI' => t('Pisa'), + 'PN' => t('Pordenone'), + 'PO' => t('Prato'), + 'PR' => t('Parma'), + 'PT' => t('Pistoia'), + 'PU' => t('Pesaro e Urbino'), + 'PV' => t('Pavia'), + 'PZ' => t('Potenza'), + 'RA' => t('Ravenna'), + 'RC' => t('Reggio Calabria'), + 'RE' => t('Reggio Emilia'), + 'RG' => t('Ragusa'), + 'RI' => t('Rieti'), + 'RM' => t('Roma'), + 'RN' => t('Rimini'), + 'RO' => t('Rovigo'), + 'SA' => t('Salerno'), + 'SI' => t('Siena'), + 'SO' => t('Sondrio'), + 'SP' => t('La Spezia'), + 'SR' => t('Siracusa'), + 'SS' => t('Sassari'), + 'SV' => t('Savona'), + 'TA' => t('Taranto'), + 'TE' => t('Teramo'), + 'TN' => t('Trento'), + 'TO' => t('Torino'), + 'TP' => t('Trapani'), + 'TR' => t('Terni'), + 'TS' => t('Trieste'), + 'TV' => t('Treviso'), + 'UD' => t('Udine'), + 'VA' => t('Varese'), + 'VB' => t('Verbano-Cusio-Ossola'), + 'VC' => t('Vercelli'), + 'VE' => t('Venezia'), + 'VI' => t('Vicenza'), + 'VR' => t('Verona'), + 'VS' => t('Medio Campidano'), + 'VT' => t('Viterbo'), + 'VV' => t('Vibo Valentia'), + ); + $administrative_areas['JM'] = array( + '13' => 'Clarendon', + '09' => 'Hanover', + '01' => 'Kingston', + '12' => 'Manchester', + '04' => 'Portland', + '02' => 'St. Andrew', + '06' => 'St. Ann', + '14' => 'St. Catherine', + '11' => 'St. Elizabeth', + '08' => 'St. James', + '05' => 'St. Mary', + '03' => 'St. Thomas', + '07' => 'Trelawny', + '10' => 'Westmoreland', + ); + $administrative_areas['JP'] = array( + '01' => t('Hokkaido'), + '02' => t('Aomori'), + '03' => t('Iwate'), + '04' => t('Miyagi'), + '05' => t('Akita'), + '06' => t('Yamagata'), + '07' => t('Fukushima'), + '08' => t('Ibaraki'), + '09' => t('Tochigi'), + '10' => t('Gunma'), + '11' => t('Saitama'), + '12' => t('Chiba'), + '13' => t('Tokyo'), + '14' => t('Kanagawa'), + '15' => t('Niigata'), + '16' => t('Toyama'), + '17' => t('Ishikawa'), + '18' => t('Fukui'), + '19' => t('Yamanashi'), + '20' => t('Nagano'), + '21' => t('Gifu'), + '22' => t('Shizuoka'), + '23' => t('Aichi'), + '24' => t('Mie'), + '25' => t('Shiga'), + '26' => t('Kyoto'), + '27' => t('Osaka'), + '28' => t('Hyogo'), + '29' => t('Nara'), + '30' => t('Wakayama'), + '31' => t('Tottori'), + '32' => t('Shimane'), + '33' => t('Okayama'), + '34' => t('Hiroshima'), + '35' => t('Yamaguchi'), + '36' => t('Tokushima'), + '37' => t('Kagawa'), + '38' => t('Ehime'), + '39' => t('Kochi'), + '40' => t('Fukuoka'), + '41' => t('Saga'), + '42' => t('Nagasaki'), + '43' => t('Kumamoto'), + '44' => t('Oita'), + '45' => t('Miyazaki'), + '46' => t('Kagoshima'), + '47' => t('Okinawa'), + ); + $administrative_areas['KR'] = array( + '11' => t('Seoul'), + '26' => t('Busan'), + '27' => t('Daegu'), + '30' => t('Daejeon'), + '29' => t('Gwangju'), + '28' => t('Incheon'), + '31' => t('Ulsan'), + '43' => t('Chungcheongbuk-do'), + '44' => t('Chungcheongnam-do'), + '42' => t('Gangwon-do'), + '41' => t('Gyeonggi-do'), + '47' => t('Gyeongsangbuk-do'), + '48' => t('Gyeongsangnam-do'), + '49' => t('Jeju-do'), + '45' => t('Jeollabuk-do'), + '46' => t('Jeollanam-do'), + '50' => t('Sejong'), + ); + $administrative_areas['KZ'] = array( + 'AST' => t('Astana'), + 'ALA' => t('Almaty'), + 'ALM' => t('Almaty region'), + 'AKM' => t('Aqmola region'), + 'AKT' => t('Aqtöbe region'), + 'ATY' => t('Atyraū region'), + 'ZAP' => t('Batys Qazaqstan region'), + 'MAN' => t('Mangghystaū region'), + 'YUZ' => t('Ongtüstik Qazaqstan region'), + 'PAV' => t('Pavlodar region'), + 'KAR' => t('Qaraghandy region'), + 'KUS' => t('Qostanay region'), + 'KZY' => t('Qyzylorda region'), + 'VOS' => t('Shyghys Qazaqstan region'), + 'SEV' => t('Soltüstik Qazaqstan region'), + 'ZHA' => t('Zhambyl region'), + ); + $administrative_areas['MX'] = array( + 'AGU' => t('Aguascalientes'), + 'BCN' => t('Baja California'), + 'BCS' => t('Baja California Sur'), + 'CAM' => t('Campeche'), + 'COA' => t('Coahuila'), + 'COL' => t('Colima'), + 'CHP' => t('Chiapas'), + 'CHH' => t('Chihuahua'), + 'DIF' => t('Distrito Federal'), + 'DUG' => t('Durango'), + 'MEX' => t('Estado de México'), + 'GUA' => t('Guanajuato'), + 'GRO' => t('Guerrero'), + 'HID' => t('Hidalgo'), + 'JAL' => t('Jalisco'), + 'MIC' => t('Michoacán'), + 'MOR' => t('Morelos'), + 'NAY' => t('Nayarit'), + 'NLE' => t('Nuevo León'), + 'OAX' => t('Oaxaca'), + 'PUE' => t('Puebla'), + 'QUE' => t('Queretaro'), + 'ROO' => t('Quintana Roo'), + 'SLP' => t('San Luis Potosí'), + 'SIN' => t('Sinaloa'), + 'SON' => t('Sonora'), + 'TAB' => t('Tabasco'), + 'TAM' => t('Tamaulipas'), + 'TLA' => t('Tlaxcala'), + 'VER' => t('Veracruz'), + 'YUC' => t('Yucatán'), + 'ZAC' => t('Zacatecas'), + ); + $administrative_areas['MY'] = array( + '01' => t('Johor'), + '02' => t('Kedah'), + '03' => t('Kelantan'), + '14' => t('Kuala Lumpur'), + '15' => t('Labuan'), + '04' => t('Melaka'), + '05' => t('Negeri Sembilan'), + '06' => t('Pahang'), + '08' => t('Perak'), + '09' => t('Perlis'), + '07' => t('Pulau Pinang'), + '16' => t('Putrajaya'), + '12' => t('Sabah'), + '13' => t('Sarawak'), + '10' => t('Selangor'), + '11' => t('Terengganu'), + ); + $administrative_areas['PE'] = array( + 'AMA' => t('Amazonas'), + 'ANC' => t('Ancash'), + 'APU' => t('Apurimac'), + 'ARE' => t('Arequipa'), + 'AYA' => t('Ayacucho'), + 'CAJ' => t('Cajamarca'), + 'CAL' => t('Callao'), + 'CUS' => t('Cusco'), + 'HUV' => t('Huancavelica'), + 'HUC' => t('Huanuco'), + 'ICA' => t('Ica'), + 'JUN' => t('Junin'), + 'LAL' => t('La Libertad'), + 'LAM' => t('Lambayeque'), + 'LIM' => t('Lima'), + 'LOR' => t('Loreto'), + 'MDD' => t('Madre de Dios'), + 'MOQ' => t('Moquegua'), + 'PAS' => t('Pasco'), + 'PIU' => t('Piura'), + 'PUN' => t('Puno'), + 'SAM' => t('San Martin'), + 'TAC' => t('Tacna'), + 'TUM' => t('Tumbes'), + 'UCA' => t('Ucayali'), + ); + $administrative_areas['RU'] = array( + 'MOW' => t('Moskva'), + 'SPE' => t('Sankt-Peterburg'), + 'AD' => t('Adygeya, Respublika'), + 'AL' => t('Altay, Respublika'), + 'BA' => t('Bashkortostan, Respublika'), + 'BU' => t('Buryatiya, Respublika'), + 'CE' => t('Chechenskaya Respublika'), + 'CU' => t('Chuvashskaya Respublika'), + 'DA' => t('Dagestan, Respublika'), + 'IN' => t('Ingushetiya, Respublika'), + 'KB' => t('Kabardino-Balkarskaya Respublika'), + 'KL' => t('Kalmykiya, Respublika'), + 'KC' => t('Karachayevo-Cherkesskaya Respublika'), + 'KR' => t('Kareliya, Respublika'), + 'KK' => t('Khakasiya, Respublika'), + 'KO' => t('Komi, Respublika'), + 'ME' => t('Mariy El, Respublika'), + 'MO' => t('Mordoviya, Respublika'), + 'SA' => t('Sakha, Respublika [Yakutiya]'), + 'SE' => t('Severnaya Osetiya-Alaniya, Respublika'), + 'TA' => t('Tatarstan, Respublika'), + 'TY' => t('Tyva, Respublika [Tuva]'), + 'UD' => t('Udmurtskaya Respublika'), + 'ALT' => t('Altayskiy kray'), + 'KAM' => t('Kamchatskiy kray'), + 'KHA' => t('Khabarovskiy kray'), + 'KDA' => t('Krasnodarskiy kray'), + 'KYA' => t('Krasnoyarskiy kray'), + 'PER' => t('Permskiy kray'), + 'PRI' => t('Primorskiy kray'), + 'STA' => t('Stavropolskiy kray'), + 'ZAB' => t('Zabaykalskiy kray'), + 'AMU' => t('Amurskaya oblast'), + 'ARK' => t('Arkhangelskaya oblast'), + 'AST' => t('Astrakhanskaya oblast'), + 'BEL' => t('Belgorodskaya oblast'), + 'BRY' => t('Bryanskaya oblast'), + 'CHE' => t('Chelyabinskaya oblast'), + 'IRK' => t('Irkutskaya oblast'), + 'IVA' => t('Ivanovskaya oblast'), + 'KGD' => t('Kaliningradskaya oblast'), + 'KLU' => t('Kaluzhskaya oblast'), + 'KEM' => t('Kemerovskaya oblast'), + 'KIR' => t('Kirovskaya oblast'), + 'KOS' => t('Kostromskaya oblast'), + 'KGN' => t('Kurganskaya oblast'), + 'KRS' => t('Kurskaya oblast'), + 'LEN' => t('Leningradskaya oblast'), + 'LIP' => t('Lipetskaya oblast'), + 'MAG' => t('Magadanskaya oblast'), + 'MOS' => t('Moskovskaya oblast'), + 'MUR' => t('Murmanskaya oblast'), + 'NIZ' => t('Nizhegorodskaya oblast'), + 'NGR' => t('Novgorodskaya oblast'), + 'NVS' => t('Novosibirskaya oblast'), + 'OMS' => t('Omskaya oblast'), + 'ORE' => t('Orenburgskaya oblast'), + 'ORL' => t('Orlovskaya oblast'), + 'PNZ' => t('Penzenskaya oblast'), + 'PSK' => t('Pskovskaya oblast'), + 'ROS' => t('Rostovskaya oblast'), + 'RYA' => t('Ryazanskaya oblast'), + 'SAK' => t('Sakhalinskaya oblast'), + 'SAM' => t('Samarskaya oblast'), + 'SAR' => t('Saratovskaya oblast'), + 'SMO' => t('Smolenskaya oblast'), + 'SVE' => t('Sverdlovskaya oblast'), + 'TAM' => t('Tambovskaya oblast'), + 'TOM' => t('Tomskaya oblast'), + 'TUL' => t('Tulskaya oblast'), + 'TVE' => t('Tverskaya oblast'), + 'TYU' => t('Tyumenskaya oblast'), + 'ULY' => t('Ulyanovskaya oblast'), + 'VLA' => t('Vladimirskaya oblast'), + 'VGG' => t('Volgogradskaya oblast'), + 'VLG' => t('Vologodskaya oblast'), + 'VOR' => t('Voronezhskaya oblast'), + 'YAR' => t('Yaroslavskaya oblast'), + 'YEV' => t('Yevreyskaya avtonomnaya oblast'), + 'CHU' => t('Chukotskiy avtonomnyy okrug'), + 'KHM' => t('Khanty-Mansiyskiy avtonomnyy okrug-Yugra'), + 'NEN' => t('Nenetskiy avtonomnyy okrug'), + 'YAN' => t('Yamalo-Nenetskiy avtonomnyy okrug'), + ); + $administrative_areas['TR'] = array( + '01' => t('Adana'), + '02' => t('Adıyaman'), + '03' => t('Afyon'), + '04' => t('Ağrı'), + '68' => t('Aksaray'), + '05' => t('Amasya'), + '06' => t('Ankara'), + '07' => t('Antalya'), + '75' => t('Ardahan'), + '08' => t('Artvin'), + '09' => t('Aydın'), + '10' => t('Balıkesir'), + '74' => t('Bartın'), + '72' => t('Batman'), + '69' => t('Bayburt'), + '11' => t('Bilecik'), + '12' => t('Bingöl'), + '13' => t('Bitlis'), + '14' => t('Bolu'), + '15' => t('Burdur'), + '16' => t('Bursa'), + '17' => t('Çanakkale'), + '18' => t('Çankırı'), + '19' => t('Çorum'), + '20' => t('Denizli'), + '21' => t('Diyarbakır'), + '81' => t('Düzce'), + '22' => t('Edirne'), + '23' => t('Elazığ'), + '24' => t('Erzincan'), + '25' => t('Erzurum'), + '26' => t('Eskişehir'), + '27' => t('Gaziantep'), + '28' => t('Giresun'), + '29' => t('Gümüşhane'), + '30' => t('Hakkari'), + '31' => t('Hatay'), + '76' => t('Iğdır'), + '32' => t('Isparta'), + '34' => t('İstanbul'), + '35' => t('İzmir'), + '46' => t('Kahramanmaraş'), + '78' => t('Karabük'), + '70' => t('Karaman'), + '36' => t('Kars'), + '37' => t('Kastamonu'), + '38' => t('Kayseri'), + '71' => t('Kırıkkale'), + '39' => t('Kırklareli'), + '40' => t('Kırşehir'), + '79' => t('Kilis'), + '41' => t('Kocaeli'), + '42' => t('Konya'), + '43' => t('Kütahya'), + '44' => t('Malatya'), + '45' => t('Manisa'), + '47' => t('Mardin'), + '33' => t('Mersin'), + '48' => t('Muğla'), + '49' => t('Muş'), + '50' => t('Nevşehir'), + '51' => t('Niğde'), + '52' => t('Ordu'), + '80' => t('Osmaniye'), + '53' => t('Rize'), + '54' => t('Sakarya'), + '55' => t('Samsun'), + '56' => t('Siirt'), + '57' => t('Sinop'), + '58' => t('Sivas'), + '63' => t('Şanlıurfa'), + '73' => t('Şırnak'), + '59' => t('Tekirdağ'), + '60' => t('Tokat'), + '61' => t('Trabzon'), + '62' => t('Tunceli'), + '64' => t('Uşak'), + '65' => t('Van'), + '77' => t('Yalova'), + '66' => t('Yozgat'), + '67' => t('Zonguldak'), + ); + $administrative_areas['TW'] = array( + 'TXG' => t('Taichung City'), + 'TPE' => t('Taipei City'), + 'TTT' => t('Taitung County'), + 'TNN' => t('Tainan City'), + 'ILA' => t('Yilan County'), + 'HUA' => t('Hualien County'), + 'Kinmen County' => t('Kinmen County'), + 'NAN' => t('Nantou County'), + 'PIF' => t('Pingtung County'), + 'MIA' => t('Miaoli County'), + 'TAO' => t('Taoyuan County'), + 'KHH' => t('Kaohsiung City'), + 'KEE' => t('Keelung City'), + 'Lienchiang County' => t('Lienchiang County'), + 'YUN' => t('Yunlin County'), + 'TPQ' => t('New Taipei City'), + 'HSZ' => t('Hsinchu City'), + 'HSQ' => t('Hsinchu County'), + 'CYI' => t('Chiayi City'), + 'CYQ' => t('Chiayi County'), + 'CHA' => t('Changhua County'), + 'PEN' => t('Penghu County'), + ); + $administrative_areas['UA'] = array( + '43' => t('Crimea'), + '05' => t('Vinnyts\'ka oblast'), + '07' => t('Volyns\'ka oblast'), + '12' => t('Dnipropetrovsk Oblast'), + '14' => t('Donetsk Oblast'), + '18' => t('Zhytomyrs\'ka oblast'), + '21' => t('Zakarpats\'ka oblast'), + '23' => t('Zaporiz\'ka oblast'), + '26' => t('Ivano-Frankivs\'ka oblast'), + '30' => t('Kyiv city'), + '30' => t('Kiev Oblast'), + '35' => t('Kirovohrads\'ka oblast'), + '09' => t('Luhans\'ka oblast'), + '46' => t('Lviv Oblast'), + '48' => t('Mykolaivs\'ka oblast'), + '51' => t('Odessa Oblast'), + '53' => t('Poltavs\'ka oblast'), + '56' => t('Rivnens\'ka oblast'), + '40' => t('Sevastopol\' city'), + '59' => t('Sums\'ka oblast'), + '61' => t('Ternopil\'s\'ka oblast'), + '63' => t('Kharkiv Oblast'), + '65' => t('Khersons\'ka oblast'), + '68' => t('Khmel\'nyts\'ka oblast'), + '71' => t('Cherkas\'ka oblast'), + '77' => t('Chernivets\'ka oblast'), + '74' => t('Chernihivs\'ka oblast'), + ); + $administrative_areas['US'] = array( + 'AL' => t('Alabama'), + 'AK' => t('Alaska'), + 'AZ' => t('Arizona'), + 'AR' => t('Arkansas'), + 'CA' => t('California'), + 'CO' => t('Colorado'), + 'CT' => t('Connecticut'), + 'DE' => t('Delaware'), + 'DC' => t('District of Columbia'), + 'FL' => t('Florida'), + 'GA' => t('Georgia'), + 'HI' => t('Hawaii'), + 'ID' => t('Idaho'), + 'IL' => t('Illinois'), + 'IN' => t('Indiana'), + 'IA' => t('Iowa'), + 'KS' => t('Kansas'), + 'KY' => t('Kentucky'), + 'LA' => t('Louisiana'), + 'ME' => t('Maine'), + 'MD' => t('Maryland'), + 'MA' => t('Massachusetts'), + 'MI' => t('Michigan'), + 'MN' => t('Minnesota'), + 'MS' => t('Mississippi'), + 'MO' => t('Missouri'), + 'MT' => t('Montana'), + 'NE' => t('Nebraska'), + 'NV' => t('Nevada'), + 'NH' => t('New Hampshire'), + 'NJ' => t('New Jersey'), + 'NM' => t('New Mexico'), + 'NY' => t('New York'), + 'NC' => t('North Carolina'), + 'ND' => t('North Dakota'), + 'OH' => t('Ohio'), + 'OK' => t('Oklahoma'), + 'OR' => t('Oregon'), + 'PA' => t('Pennsylvania'), + 'RI' => t('Rhode Island'), + 'SC' => t('South Carolina'), + 'SD' => t('South Dakota'), + 'TN' => t('Tennessee'), + 'TX' => t('Texas'), + 'UT' => t('Utah'), + 'VT' => t('Vermont'), + 'VA' => t('Virginia'), + 'WA' => t('Washington'), + 'WV' => t('West Virginia'), + 'WI' => t('Wisconsin'), + 'WY' => t('Wyoming'), + ' ' => t('--'), + 'AA' => t('Armed Forces (Americas)'), + 'AE' => t('Armed Forces (Europe, Canada, Middle East, Africa)'), + 'AP' => t('Armed Forces (Pacific)'), + 'AS' => t('American Samoa'), + 'FM' => t('Federated States of Micronesia'), + 'GU' => t('Guam'), + 'MH' => t('Marshall Islands'), + 'MP' => t('Northern Mariana Islands'), + 'PW' => t('Palau'), + 'PR' => t('Puerto Rico'), + 'VI' => t('Virgin Islands'), + ); + $administrative_areas['VE'] = array( + 'Z' => t('Amazonas'), + 'B' => t('Anzoátegui'), + 'C' => t('Apure'), + 'D' => t('Aragua'), + 'E' => t('Barinas'), + 'F' => t('Bolívar'), + 'G' => t('Carabobo'), + 'H' => t('Cojedes'), + 'Y' => t('Delta Amacuro'), + 'W' => t('Dependencias Federales'), + 'A' => t('Distrito Federal'), + 'I' => t('Falcón'), + 'J' => t('Guárico'), + 'K' => t('Lara'), + 'L' => t('Mérida'), + 'M' => t('Miranda'), + 'N' => t('Monagas'), + 'O' => t('Nueva Esparta'), + 'P' => t('Portuguesa'), + 'R' => t('Sucre'), + 'S' => t('Táchira'), + 'T' => t('Trujillo'), + 'X' => t('Vargas'), + 'U' => t('Yaracuy'), + 'V' => t('Zulia'), + ); + + // Allow other modules to alter the administrative areas. + drupal_alter('addressfield_administrative_areas', $administrative_areas); + + return isset($administrative_areas[$country_code]) ? $administrative_areas[$country_code] : null; +} diff --git a/sites/all/modules/contrib/fields/addressfield/addressfield.api.php b/sites/all/modules/contrib/fields/addressfield/addressfield.api.php index 0d0d964b..b52b9503 100644 --- a/sites/all/modules/contrib/fields/addressfield/addressfield.api.php +++ b/sites/all/modules/contrib/fields/addressfield/addressfield.api.php @@ -29,6 +29,72 @@ function CALLBACK_addressfield_format_callback(&$format, $address, $context = ar // No example. } +/** + * Allows modules to alter the default values for an address field. + * + * @param $default_values + * The array of default values. The country is populated from the + * 'default_country' widget setting. + * @param $context + * An array with the following keys: + * - field: The field array. + * - instance: The instance array. + * - address: The current address values. Allows for per-country defaults. + */ +function hook_addressfield_default_values_alter(&$default_values, $context) { + // If no other default country was provided, set it to France. + // Note: you might want to check $context['instance']['required'] and + // skip setting the default country if the field is optional. + if (empty($default_values['country'])) { + $default_values['country'] = 'FR'; + } + + // Determine the country for which other defaults should be provided. + $selected_country = $default_values['country']; + if (isset($context['address']['country'])) { + $selected_country = $context['address']['country']; + } + + // Add defaults for the US. + if ($selected_country == 'US') { + $default_values['locality'] = 'New York'; + $default_values['administrative_area'] = 'NY'; + } +} + +/** + * Allows modules to alter the predefined address formats. + * + * @param $address_formats + * The array of all predefined address formats. + * + * @see addressfield_get_address_format() + */ +function hook_addressfield_address_formats_alter(&$address_formats) { + // Remove the postal_code from the list of required fields for China. + $address_formats['CN']['required_fields'] = array('locality', 'administrative_area'); +} + +/** + * Allows modules to alter the predefined administrative areas. + * + * @param $administrative_areas + * The array of all predefined administrative areas. + * + * @see addressfield_get_administrative_areas() + */ +function hook_addressfield_administrative_areas_alter(&$administrative_areas) { + // Alter the label of the Spanish administrative area with the iso code PM. + $administrative_areas['ES']['PM'] = t('Balears / Baleares'); + + // Add administrative areas for imaginary country XT, keyed by their + // imaginary ISO codes. + $administrative_areas['XT'] = array( + 'A' => t('Aland'), + 'B' => t('Bland'), + ); +} + /** * Allows modules to add arbitrary AJAX commands to the array returned from the * standard address field widget refresh. diff --git a/sites/all/modules/contrib/fields/addressfield/addressfield.devel_generate.inc b/sites/all/modules/contrib/fields/addressfield/addressfield.devel_generate.inc index 36810703..d3b0a1e9 100644 --- a/sites/all/modules/contrib/fields/addressfield/addressfield.devel_generate.inc +++ b/sites/all/modules/contrib/fields/addressfield/addressfield.devel_generate.inc @@ -45,7 +45,7 @@ function _addressfield_sample_addresses() { if (is_resource($handle)) { $addresses = array(); while (($buffer = fgets($handle)) !== false) { - list($country, $administrative_area, $sub_administrative_area, $locality, $dependent_locality, $postal_code, $thoroughfare, $premise) = explode("\t", $buffer); + list($country, $administrative_area, $sub_administrative_area, $locality, $dependent_locality, $postal_code, $thoroughfare, $premise, $sub_premise) = explode("\t", $buffer); $fields[] = array( 'country' => ($country == 'NULL') ? NULL : trim($country), 'administrative_area' => ($administrative_area == 'NULL') ? NULL : trim($administrative_area), @@ -55,6 +55,7 @@ function _addressfield_sample_addresses() { 'postal_code' => ($postal_code == 'NULL') ? NULL : trim($postal_code), 'thoroughfare' => ($thoroughfare == 'NULL') ? NULL : trim($thoroughfare), 'premise' => ($premise == 'NULL') ? NULL : trim($premise), + 'sub_premise' => ($sub_premise == 'NULL') ? NULL : trim($sub_premise), ); } } diff --git a/sites/all/modules/contrib/fields/addressfield/addressfield.info b/sites/all/modules/contrib/fields/addressfield/addressfield.info index 6559d83c..26d4d238 100644 --- a/sites/all/modules/contrib/fields/addressfield/addressfield.info +++ b/sites/all/modules/contrib/fields/addressfield/addressfield.info @@ -5,11 +5,13 @@ package = Fields dependencies[] = ctools +files[] = addressfield.migrate.inc +files[] = views/addressfield_views_handler_field_country.inc files[] = views/addressfield_views_handler_filter_country.inc -; Information added by drupal.org packaging script on 2013-05-07 -version = "7.x-1.0-beta4" +; Information added by Drupal.org packaging script on 2015-01-16 +version = "7.x-1.0" core = "7.x" project = "addressfield" -datestamp = "1367945112" +datestamp = "1421426885" diff --git a/sites/all/modules/contrib/fields/addressfield/addressfield.install b/sites/all/modules/contrib/fields/addressfield/addressfield.install index ada59129..5e74bc14 100644 --- a/sites/all/modules/contrib/fields/addressfield/addressfield.install +++ b/sites/all/modules/contrib/fields/addressfield/addressfield.install @@ -184,3 +184,33 @@ function addressfield_update_7000() { } } } + +/** + * Sets the value of the new "Default country" setting. + */ +function addressfield_update_7001() { + $address_fields = array(); + foreach (field_info_fields() as $field_name => $field_info) { + if ($field_info['type'] == 'addressfield') { + $address_fields[$field_name] = $field_name; + } + } + + foreach (field_info_instances() as $entity_type => $bundles) { + foreach ($bundles as $bundle_name => $instances) { + foreach (array_intersect_key($instances, $address_fields) as $field_name => $instance) { + // Optional fields get the None default. Required fields get the + // previously selected default country. + $default_country = ''; + if (!empty($instance['required']) && !empty($instance['default_value'])) { + $default_country = $instance['default_value']['country']; + } + + $instance['widget']['settings']['default_country'] = $default_country; + unset($instance['default_value']); + + field_update_instance($instance); + } + } + } +} diff --git a/sites/all/modules/contrib/fields/addressfield/addressfield.migrate.inc b/sites/all/modules/contrib/fields/addressfield/addressfield.migrate.inc new file mode 100644 index 00000000..6e74d63f --- /dev/null +++ b/sites/all/modules/contrib/fields/addressfield/addressfield.migrate.inc @@ -0,0 +1,172 @@ + 2, + 'field handlers' => array('MigrateAddressFieldHandler'), + ); + return $api; +} + +/** + * Primary value passed to this field must be the two letter ISO country code of + * the address. + * + * Arguments are used to specify all the other values: + * 'administrative_area' - The administrative area of this address. (i.e. State/Province) + * 'sub_administrative_area' - The sub administrative area of this address. + * 'locality' - The locality of this address. (i.e. City) + * 'dependent_locality' - The dependent locality of this address. + * 'postal_code' - The postal code of this address. + * 'thoroughfare' - The thoroughfare of this address. (i.e. Street address) + * 'premise' - The premise of this address. (i.e. Apartment / Suite number) + * 'sub_premise' - The sub_premise of this address. + * 'organisation_name' - Contents of a primary OrganisationName element in the xNL XML. + * 'name_line' - Contents of a primary NameLine element in the xNL XML. + * 'first_name' - Contents of the FirstName element of a primary PersonName element in the xNL XML. + * 'last_name' - Contents of the LastName element of a primary PersonName element in the xNL XML. + * 'data' - Additional data for this address. + * + * Add the source field mappings to the argument array then add null mappings to + * avoid having fields flagged as as unmapped: + * @code + * // The country should be passed in as the primary value. + * $this->addFieldMapping('field_address', 'profile_country'); + * $this->addFieldMapping('field_address:thoroughfare', 'profile_address'); + * $this->addFieldMapping('field_address:locality', 'profile_city'); + * $this->addFieldMapping('field_address:administrative_area', 'profile_state'); + * @endcode + */ +class MigrateAddressFieldHandler extends MigrateFieldHandler { + public function __construct() { + $this->registerTypes(array('addressfield')); + } + + /** + * Provide subfields for the addressfield columns. + */ + public function fields() { + // Declare our arguments to also be available as subfields. + $fields = array( + 'administrative_area' => t('The administrative area of ' . + 'this address (i.e. State/Province)', + array('@doc' => 'http://drupal.org/node/1996546#administrative_area')), + 'sub_administrative_area' => t('The sub administrative ' . + 'area of this address', + array('@doc' => 'http://drupal.org/node/1996546#sub_administrative_area')), + 'locality' => t('The locality of this address (i.e. ' . + 'City)', + array('@doc' => 'http://drupal.org/node/1996546#locality')), + 'dependent_locality' => t('The dependent locality of ' . + 'this address', + array('@doc' => 'http://drupal.org/node/1996546#dependent_locality')), + 'postal_code' => t('The postal code of this address', + array('@doc' => 'http://drupal.org/node/1996546#postal_code')), + 'thoroughfare' => t('The thoroughfare of this address ' . + '(i.e. Street address)', + array('@doc' => 'http://drupal.org/node/1996546#thoroughfare')), + 'premise' => t('The premise of this address (i.e. Apartment / Suite number)', + array('@doc' => 'http://drupal.org/node/1996546#premise')), + 'sub_premise' => t('The sub_premise of this address', + array('@doc' => 'http://drupal.org/node/1996546#sub_premise')), + 'organisation_name' => t('Contents of a primary ' . + 'OrganisationName element in the xNL XML', + array('@doc' => 'http://drupal.org/node/1996546#organisation_name')), + 'name_line' => t('Contents of a primary NameLine element ' . + 'in the xNL XML', + array('@doc' => 'http://drupal.org/node/1996546#name_line')), + 'first_name' => t('Contents of the FirstName element of ' . + 'a primary PersonName element in the xNL XML', + array('@doc' => 'http://drupal.org/node/1996546#first_name')), + 'last_name' => t('Contents of the LastName element of a ' . + 'primary PersonName element in the xNL XML', + array('@doc' => 'http://drupal.org/node/1996546#last_name')), + 'data' => t('Additional data for this address', + array('@doc' => 'http://drupal.org/node/1996546#data')), + ); + return $fields; + } + + /** + * Implements MigrateFieldHandler::prepare(). + * + * @param $entity + * @param array $field_info + * @param array $instance + * @param array $values + * + * @return null + */ + public function prepare($entity, array $field_info, array $instance, + array $values) { + $arguments = array(); + if (isset($values['arguments'])) { + $arguments = array_filter($values['arguments']); + unset($values['arguments']); + } + $language = $this->getFieldLanguage($entity, $field_info, $arguments); + + // Setup the standard Field API array for saving. + $delta = 0; + foreach ($values as $value) { + $return[$language][$delta] = array('country' => $value) + + $this->prepareArguments($arguments, $field_info, $delta); + $delta++; + } + + return isset($return) ? $return : NULL; + } + + /** + * Builds an array with additional data for the current $delta. + * + * @param array $arguments + * @param array $field_info + * @param $delta + * + * @return array + */ + protected function prepareArguments(array $arguments, array $field_info, $delta) { + $result = array(); + $data = array(); + + foreach ($arguments as $column_key => $column_value) { + $value = NULL; + + if (is_array($arguments[$column_key])) { + if (!empty($arguments[$column_key][$delta])) { + $value = $arguments[$column_key][$delta]; + } + } + else { + $value = $arguments[$column_key]; + } + + if ($value) { + if (isset($field_info['columns'][$column_key])) { + // Store the data in a seperate column. + $result[$column_key] = $value; + } + else { + // Add the data to the 'data' column. + $data[$column_key] = $value; + } + } + } + + // Store all the other data as a serialized array in the data field. + if (!empty($data)) { + $result['data'] = serialize($data); + } + + return $result; + } +} diff --git a/sites/all/modules/contrib/fields/addressfield/addressfield.module b/sites/all/modules/contrib/fields/addressfield/addressfield.module index 1f2ff879..81082c2e 100644 --- a/sites/all/modules/contrib/fields/addressfield/addressfield.module +++ b/sites/all/modules/contrib/fields/addressfield/addressfield.module @@ -34,6 +34,33 @@ function addressfield_views_api() { ); } +/** + * Implements hook_module_implements_alter(). + * + * Moves the hook_token_info_alter() implementation to the bottom so it is + * invoked after all modules implementing the same hook. + */ +function addressfield_module_implements_alter(&$implementations, $hook) { + if ($hook == 'token_info_alter') { + // Make sure that the $implementations list is populated before altering it, + // to work around a crash experienced by some people (#2181001). + if (isset($implementations['addressfield'])) { + $group = $implementations['addressfield']; + unset($implementations['addressfield']); + $implementations['addressfield'] = $group; + } + } +} + +/** + * Returns TRUE if a field map array value represents an addressfield. + * + * Provided for use as a callback by array_filter(). + */ +function addressfield_field_map_filter($field) { + return !empty($field['type']) && $field['type'] == 'addressfield'; +} + /** * Get the list of format plugins. */ @@ -119,7 +146,10 @@ function addressfield_generate($address, array $handlers, array $context = array ctools_include('plugins'); $format = array(); - $format['#handlers'] = $handlers; + // Add the handlers, ordered by weight. + $plugins = addressfield_format_plugins(); + $format['#handlers'] = array_intersect(array_keys($plugins), $handlers); + foreach ($format['#handlers'] as $handler) { if ($callback = ctools_plugin_load_function('addressfield', 'format', $handler, 'format callback')) { $callback($format, $address, $context); @@ -133,7 +163,6 @@ function addressfield_generate($address, array $handlers, array $context = array if ($context['mode'] == 'form') { $format['#addressfield'] = TRUE; $format['#process'][] = 'addressfield_process_format_form'; - $format['#required'] = FALSE; } elseif ($context['mode'] == 'render') { $format['#pre_render'][] = 'addressfield_render_address'; @@ -152,39 +181,43 @@ function addressfield_process_format_form($format, &$form_state, $complete_form) ctools_plugin_load_function('addressfield', 'format', $handler, 'format callback'); } - _addressfield_process_format_form($format, $format['#address'], $format['#required']); + _addressfield_process_format_form($format, $format['#address']); return $format; } -function _addressfield_process_format_form(&$format, $address, $required) { +function _addressfield_process_format_form(&$format, $address) { foreach (element_children($format) as $key) { $child = &$format[$key]; - // Automatically expand elements that matches one of the field of the - // address structure. + // Automatically convert any element in the format array to an appropriate + // form element that matches one of the address component names. if (in_array($key, array('name_line', 'first_name', 'last_name', 'organisation_name', 'country', 'administrative_area', 'sub_administrative_area', 'locality', 'dependent_locality', 'postal_code', 'thoroughfare', 'premise', 'sub_premise'))) { - // Set the type. + // Set the form element type for the address component to whatever the + // address format specified in its #widget_type property. if (isset($child['#widget_type'])) { $child['#type'] = $child['#widget_type']; } else { + // If the element didn't specify a #widget_type and has options, turn it + // into a select list and unset its #size value, which is typically used + // to provide the width of a textfield. if (isset($child['#options'])) { $child['#type'] = 'select'; - $child['#size'] = 0; + unset($child['#size']); } else { + // Otherwise go ahead and make it a textfield. $child['#type'] = 'textfield'; } } - if (!$required) { - unset($child['#required']); - } - $child['#default_value'] = $address[$key]; + if (isset($address[$key])) { + $child['#default_value'] = $address[$key]; + } } - // Recurse through the child. - _addressfield_process_format_form($child, $address, $required); + // Recurse through the element's children if it has any. + _addressfield_process_format_form($child, $address); } } @@ -200,8 +233,8 @@ function _addressfield_render_address(&$format, $address) { foreach (element_children($format) as $key) { $child = &$format[$key]; - // Automatically expand elements that matches one of the field of the - // address structure. + // Automatically expand elements that match one of the fields of the address + // structure. if (in_array($key, array('name_line', 'first_name', 'last_name', 'organisation_name', 'country', 'administrative_area', 'sub_administrative_area', 'locality', 'dependent_locality', 'postal_code', 'thoroughfare', 'premise', 'sub_premise'), TRUE)) { if (isset($child['#render_type'])) { $child['#type'] = $child['#render_type']; @@ -216,12 +249,15 @@ function _addressfield_render_address(&$format, $address) { // If the element instructs us to render the option value instead of the // raw address element value and its #options array has a matching key, // swap it out for the option value now. - if (!empty($child['#render_option_value']) && isset($child['#options'][$address[$key]])) { + if (!empty($child['#render_option_value']) && isset($address[$key]) && isset($child['#options'][$address[$key]])) { $child['#children'] = check_plain($child['#options'][$address[$key]]); } - else { + elseif (isset($address[$key])) { $child['#children'] = check_plain($address[$key]); } + else { + $child['#children'] = ''; + } // Skip empty elements. if ((string) $child['#children'] === '') { @@ -261,8 +297,12 @@ function addressfield_theme() { */ function theme_addressfield_container($variables) { $element = $variables['element']; - $element['#children'] = trim($element['#children']); + // Remove the autocomplete attributes because the W3C validator complains. + // They are only used on forms anyway. + unset($element['#attributes']['autocomplete']); + unset($element['#attributes']['x-autocompletetype']); + if (strlen($element['#children']) > 0) { $output = '<' . $element['#tag'] . drupal_attributes($element['#attributes']) . '>'; $output .= $element['#children']; @@ -321,22 +361,27 @@ function addressfield_field_info() { /** * Returns an array of default values for the addressfield form elements. + * + * @param $field + * The field array. + * @param $instance + * The instance array. + * @param $address + * The current address values, if known. Allows for per-country defaults. + * + * @return + * An array of default values. */ -function addressfield_default_values($available_countries = NULL) { - if (!isset($available_countries)) { - $available_countries = _addressfield_country_options_list(); - } - - // Use the default country of the site if possible. - $default_country = variable_get('site_default_country', NULL); - - // If the default country is undefined or not in the list of available countries, - // just fallback to the first country in the list. - if (!$default_country || !isset($available_countries[$default_country])) { +function addressfield_default_values($field, $instance, array $address = array()) { + $available_countries = _addressfield_country_options_list($field, $instance); + $default_country = $instance['widget']['settings']['default_country']; + // If the default country is not in the list of available countries, + // fallback to the first country in the list. + if ($default_country && !isset($available_countries[$default_country])) { $default_country = key($available_countries); } - return array( + $default_values = array( 'country' => $default_country, 'name_line' => '', 'first_name' => '', @@ -352,6 +397,16 @@ function addressfield_default_values($available_countries = NULL) { 'sub_premise' => '', 'data' => '', ); + + // Allow other modules to alter the default values. + $context = array( + 'field' => $field, + 'instance' => $instance, + 'address' => $address, + ); + drupal_alter('addressfield_default_values', $default_values, $context); + + return $default_values; } /** @@ -363,6 +418,35 @@ function addressfield_field_is_empty($item, $field) { return empty($item['country']); } +/** + * Implements hook_field_presave(). + */ +function addressfield_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) { + foreach ($items as $delta => &$item) { + // If the first name and last name are set but the name line isn't... + if (isset($item['first_name']) && isset($item['last_name']) && !isset($item['name_line'])) { + // Combine the first and last name to be the name line. + $items[$delta]['name_line'] = $items[$delta]['first_name'] . ' ' . $items[$delta]['last_name']; + } + elseif (isset($item['name_line'])) { + // Otherwise if the name line is set, separate it out into a best guess at + // the first and last name. + $names = explode(' ', $item['name_line']); + + $item['first_name'] = array_shift($names); + $item['last_name'] = implode(' ', $names); + } + + // Trim whitespace from all of the address components and convert any double + // spaces to single spaces. + foreach ($item as $key => &$value) { + if (!in_array($key, array('data')) && is_string($value)) { + $value = trim(str_replace(' ', ' ', $value)); + } + } + } +} + /** * Implements hook_field_widget_info() */ @@ -374,6 +458,7 @@ function addressfield_field_widget_info() { 'field types' => array('addressfield'), 'settings' => array( 'available_countries' => array(), + 'default_country' => '', 'format_handlers' => array('address'), ), ); @@ -399,7 +484,13 @@ function addressfield_field_widget_settings_form($field, $instance) { '#options' => _addressfield_country_options_list(), '#default_value' => $settings['available_countries'], ); - + $form['default_country'] = array( + '#type' => 'select', + '#title' => t('Default country'), + '#options' => _addressfield_country_options_list(), + '#default_value' => $settings['default_country'], + '#empty_value' => '', + ); $form['format_handlers'] = array( '#type' => 'checkboxes', '#title' => t('Format handlers'), @@ -411,41 +502,38 @@ function addressfield_field_widget_settings_form($field, $instance) { return $form; } +/** + * Implements hook_form_BASE_FORM_ID_alter(). + * + * Removes the default values form from the field settings page. + * Allows the module to implement its own, more predictable default value + * handling, getting around #1253820 and other bugs. + */ +function addressfield_form_field_ui_field_edit_form_alter(&$form, $form_state) { + if ($form['#field']['type'] == 'addressfield') { + $form['instance']['default_value_widget']['#access'] = FALSE; + } +} + /** * Implements hook_field_widget_form() */ function addressfield_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) { $settings = $instance['widget']['settings']; - // Generate a specific key used to identify this element to restore a default - // value upon AJAX submission regardless of where this element is in the - // $form array. - $element_key = implode('|', array($element['#entity_type'], $element['#bundle'], $element['#field_name'], $element['#language'], $element['#delta'])); - - // Store the key in the element array as a value so it can be easily retrieved - // in context in the $form_state['values'] array in the element validator. - $element['element_key'] = array( - '#type' => 'value', - '#value' => $element_key, - ); - - // Get the default address used to build the widget form elements, looking - // first in the form state, then in the stored value for the field, and then - // in the default values of the instance. $address = array(); - - if (!empty($form_state['addressfield'][$element_key])) { - // Use the value from the form_state if available. - $address = $form_state['addressfield'][$element_key]; + // If the form has been rebuilt via AJAX, use the form state values. + // $form_state['values'] is empty because of #limit_validation_errors, so + // $form_state['input'] needs to be used instead. + $parents = array_merge($element['#field_parents'], array($element['#field_name'], $langcode, $delta)); + $input_address = drupal_array_get_nested_value($form_state['input'], $parents); + if (!empty($input_address)) { + $address = $input_address; } elseif (!empty($items[$delta]['country'])) { // Else use the saved value for the field. $address = $items[$delta]; } - else { - // Otherwise use the instance default. - $address = (array) $instance['default_value'][0]; - } // Determine the list of available countries, and if the currently selected // country is not in it, unset it so it can be reset to the default country. @@ -454,8 +542,8 @@ function addressfield_field_widget_form(&$form, &$form_state, $field, $instance, unset($address['country']); } - // Merge in default values to provide a value for every expected array key. - $address += addressfield_default_values($countries); + // Merge in default values. + $address += addressfield_default_values($field, $instance, $address); // Add the form elements for the standard widget, which includes a country // select list at the top that reloads the available address elements when the @@ -466,6 +554,19 @@ function addressfield_field_widget_form(&$form, &$form_state, $field, $instance, // in that context, and it is overridable if necessary. $element['#type'] = 'fieldset'; + if (!empty($instance['description'])) { + // Checkout panes convert the fieldset into a container, causing + // #description to not be rendered. Hence, a real element is added and + // the old #description is removed. + $element['#description'] = ''; + $element['element_description'] = array( + '#markup' => $instance['description'], + '#prefix' => '
', + '#suffix' => '
', + '#weight' => -999, + ); + } + // Generate the address form. $context = array( 'mode' => 'form', @@ -476,32 +577,39 @@ function addressfield_field_widget_form(&$form, &$form_state, $field, $instance, ); $element += addressfield_generate($address, $settings['format_handlers'], $context); - // Mark the form element as required if necessary. - $element['#required'] = $delta == 0 && $instance['required']; + // Remove any already saved default value. + // See addressfield_form_field_ui_field_edit_form_alter() for the reasoning. + if ($form_state['build_info']['form_id'] == 'field_ui_field_edit_form') { + $element['#address'] = array('country' => ''); + } } return $element; } /** - * Element validate callback: rebuilds the form on country change and stores the - * current address value in the $form_state for retrieval on rebuild. + * Element validate callback: rebuilds the form on country change. */ function addressfield_standard_country_validate($element, &$form_state) { - // If the country was changed, rebuild the form. if ($element['#default_value'] != $element['#value']) { + $parents = $element['#parents']; + array_pop($parents); + $address = drupal_array_get_nested_value($form_state['values'], $parents); + + // Clear the country-specific field values. + $country_specific_data = array( + 'dependent_locality' => '', + 'locality' => '', + 'administrative_area' => '', + 'postal_code' => '', + ); + $address = array_diff_key($address, $country_specific_data); + + drupal_array_set_nested_value($form_state['values'], $parents, $address); + drupal_array_set_nested_value($form_state['input'], $parents, $address); + $form_state['rebuild'] = TRUE; } - - $parents = $element['#parents']; - array_pop($parents); - - // Search through the form values to find the current address. - $address = drupal_array_get_nested_value($form_state['values'], $parents); - - // Store the present address values in the form state for retrieval by the - // widget form regardless of where the widget sits in the $form array. - $form_state['addressfield'][$address['element_key']] = array_diff_key($address, array('element_key' => '')); } /** @@ -531,6 +639,9 @@ function addressfield_standard_widget_refresh($form, $form_state) { // new country select list. $commands[] = ajax_command_replace(NULL, render($element)); $commands[] = ajax_command_invoke('#' . $element['country']['#id'], 'focus'); + // Add the status messages inside the new addressfield's wrapper element, + // just like core does. + $commands[] = ajax_command_prepend(NULL, theme('status_messages')); // Allow other modules to add arbitrary AJAX commands on the refresh. drupal_alter('addressfield_standard_widget_refresh', $commands, $form, $form_state); @@ -679,12 +790,8 @@ function addressfield_property_info_callback(&$info, $entity_type, $field, $inst * * @see addressfield_property_info_callback() */ -function addressfield_auto_creation() { - // We can't call addressfield_default_values() directly, because it has an - // optional array argument that will receive an invalid value when Entity API - // tries to call it directly with its usual $property_name and $context - // arguments. - return addressfield_default_values(); +function addressfield_auto_creation($property_name, $context) { + return addressfield_default_values($context['field'], $context['instance']); } /** @@ -730,6 +837,9 @@ function addressfield_data_property_info($name = NULL) { 'premise' => array( 'label' => t('Premise (i.e. Apartment / Suite number)'), ), + 'sub_premise' => array( + 'label' => t('Sub Premise (i.e. Suite, Apartment, Floor, Unknown.'), + ), ); // Add the default values for each of the address field properties. @@ -746,13 +856,16 @@ function addressfield_data_property_info($name = NULL) { } /** - * Wraps country_get_list() for use as an Entity API options list. + * Returns the country list in a format suitable for use as an options list. */ function _addressfield_country_options_list($field = NULL, $instance = NULL) { - // Necessary for country_get_list(). - require_once DRUPAL_ROOT . '/includes/locale.inc'; - - $countries = country_get_list(); + if (module_exists('countries')) { + $countries = countries_get_countries('name', array('enabled' => COUNTRIES_ENABLED)); + } + else { + require_once DRUPAL_ROOT . '/includes/locale.inc'; + $countries = country_get_list(); + } if (isset($field)) { // If the instance is not specified, loop against all the instances of the field. @@ -771,10 +884,6 @@ function _addressfield_country_options_list($field = NULL, $instance = NULL) { foreach ($instances as $instance) { if (!empty($instance['widget']['settings']['available_countries'])) { $countries = array_intersect_key($countries, $instance['widget']['settings']['available_countries']); - } - else { - // This instance allow all the countries. - $countries = country_get_list(); break; } } diff --git a/sites/all/modules/contrib/fields/addressfield/addressfield.tokens.inc b/sites/all/modules/contrib/fields/addressfield/addressfield.tokens.inc new file mode 100644 index 00000000..1c91e531 --- /dev/null +++ b/sites/all/modules/contrib/fields/addressfield/addressfield.tokens.inc @@ -0,0 +1,233 @@ + t('Address field'), + 'description' => t('Tokens related to address field values and their components.'), + 'needs-data' => 'address-field', + 'field' => TRUE, + ); + + // Define tokens for the various components of addresses supported through the + // user interface along with two helper tokens for country and administrative + // area to distinguish between names and abbreviations. + $info['country'] = array( + 'name' => t('Country name'), + 'description' => t('The full name of the country.'), + ); + $info['country-code'] = array( + 'name' => t('Country code'), + 'description' => t('The two letter ISO country code.'), + ); + $info['administrative-area'] = array( + 'name' => t('Administrative area (i.e. State/Province)'), + 'description' => t('The administrative area value, expanded to the full name if applicable.'), + ); + $info['administrative-area-raw'] = array( + 'name' => t('Administrative area (raw value)'), + 'description' => t('The raw administrative area value.'), + ); + $info['locality'] = array( + 'name' => t('Locality (i.e. City)'), + 'description' => t('The locality value.'), + ); + $info['postal-code'] = array( + 'name' => t('Postal code'), + 'description' => t('The postal code value.'), + ); + $info['thoroughfare'] = array( + 'name' => t('Thoroughfare (i.e. Street address)'), + 'description' => t('The thoroughfare value.'), + ); + $info['premise'] = array( + 'name' => t('Premise (i.e. Street address)'), + 'description' => t('The premise value.'), + ); + $info['sub_premise'] = array( + 'name' => t('Sub Premise (i.e. Suite, Apartment, Floor, Unknown.)'), + 'description' => t('The sub premise value.'), + ); + $info['organisation'] = array( + 'name' => t('Organisation'), + 'description' => t('The organisation name value.'), + ); + $info['name-line'] = array( + 'name' => t('Full name'), + 'description' => t('The name line value of the address.'), + ); + $info['first-name'] = array( + 'name' => t('First name'), + 'description' => t('The first name value.'), + ); + $info['last-name'] = array( + 'name' => t('Last name'), + 'description' => t('The last name value.'), + ); + + // Add a helper token to format addresses as expected by MailChimp. + $info['format-mailchimp'] = array( + 'name' => t('Address formatted for MailChimp'), + 'description' => t('The full address formatted for import into MailChimp.'), + ); + + return array( + 'types' => array('address-field' => $type), + 'tokens' => array('address-field' => $info), + ); +} + +/** + * Implements hook_token_info_alter(). + */ +function addressfield_token_info_alter(&$data) { + // Loop over every address field on the site. + foreach (array_filter(field_info_field_map(), 'addressfield_field_map_filter') as $field_name => $field) { + foreach ($data['tokens'] as $group => $token){ + if (isset($data['tokens'][$group][$field_name]) && is_array($data['tokens'][$group][$field_name])) { + // Set the token type for the field to use the addressfield child tokens. + $data['tokens'][$group][$field_name]['type'] = 'address-field'; + } + } + } +} + +/** + * Implements hook_tokens(). + */ +function addressfield_tokens($type, $tokens, array $data = array(), array $options = array()) { + if (isset($options['language'])) { + $language_code = $options['language']->language; + } + else { + $language_code = LANGUAGE_NONE; + } + + $sanitize = !empty($options['sanitize']); + + $replacements = array(); + + // If we're generating tokens for an address field, extract the address data + // from the field value array and generate the necessary replacements. + if ($type == 'address-field' && !empty($data['address-field'][$language_code]) && is_array($data['address-field'][$language_code])) { + $address = reset($data['address-field'][$language_code]); + + foreach ($tokens as $name => $original) { + switch ($name) { + case 'country': + $countries = _addressfield_country_options_list(); + $replacements[$original] = $sanitize ? check_plain($countries[$address['country']]) : $countries[$address['country']]; + break; + + case 'country-code': + $replacements[$original] = $sanitize ? check_plain($address['country']) : $address['country']; + break; + + case 'administrative-area': + // If we received format handlers in the data array, generate the form + // for the address field to see if the administrative area should be + // expanded from an abbreviation to a related name. + $administrative_area = $address['administrative_area']; + + if (!empty($data['format_handlers'])) { + $form = addressfield_generate($address, $data['format_handlers'], array('mode' => 'form')); + + if (!empty($form['locality_block']['administrative_area']['#options'][$administrative_area])) { + $administrative_area = $form['locality_block']['administrative_area']['#options'][$administrative_area]; + } + } + + $replacements[$original] = $sanitize ? check_plain($administrative_area) : $administrative_area; + break; + + case 'administrative-area-raw': + $replacements[$original] = $sanitize ? check_plain($address['administrative_area']) : $address['administrative_area']; + break; + + case 'locality': + $replacements[$original] = $sanitize ? check_plain($address['locality']) : $address['locality']; + break; + + case 'postal-code': + $replacements[$original] = $sanitize ? check_plain($address['postal_code']) : $address['postal_code']; + break; + + case 'thoroughfare': + $replacements[$original] = $sanitize ? check_plain($address['thoroughfare']) : $address['thoroughfare']; + break; + + case 'premise': + $replacements[$original] = $sanitize ? check_plain($address['premise']) : $address['premise']; + break; + + case 'sub_premise': + $replacements[$original] = $sanitize ? check_plain($address['sub_premise']) : $address['sub_premise']; + break; + + case 'organisation': + $replacements[$original] = $sanitize ? check_plain($address['organisation_name']) : $address['organisation_name']; + break; + + case 'name-line': + $replacements[$original] = $sanitize ? check_plain($address['name_line']) : $address['name_line']; + break; + + case 'first-name': + $replacements[$original] = $sanitize ? check_plain($address['first_name']) : $address['first_name']; + break; + + case 'last-name': + $replacements[$original] = $sanitize ? check_plain($address['last_name']) : $address['last_name']; + break; + + // See: http://kb.mailchimp.com/article/how-do-i-format-my-list-fields-to-import-them + case 'format-mailchimp': + $components = array(); + + foreach (array('thoroughfare', 'premise', 'locality', 'administrative_area', 'postal_code', 'country') as $component) { + if (!empty($address[$component])) { + $components[] = $address[$component]; + } + } + + $format_mailchimp = implode(' ', $components); + $replacements[$original] = $sanitize ? check_plain($format_mailchimp) : $format_mailchimp; + break; + } + } + } + + // The Token module extends direct token generation by using a generic entity + // token generation process. Since we intend to overwrite the default Token + // module implementation of address field tokens, we use this generic token + // generation process to find and replace address field tokens on relevant + // entities. This ensures our tokens aren't overwritten by the Token module + // and helps us avoid having to do the entity detection ourselves. + if ($type == 'entity') { + // Loop over the address fields defined on the site. + foreach (array_filter(field_info_field_map(), 'addressfield_field_map_filter') as $field_name => $field) { + // If there are any address field tokens in the token list... + if ($addressfield_tokens = token_find_with_prefix($tokens, $field_name)) { + // If the current field is on the matching entity type... + if (!empty($field['bundles'][$data['entity_type']])) { + // Extract the format handlers selected in a representative instance + // settings form for use in formatting tokens. + $instance = field_info_instance($data['entity_type'], $field_name, reset($field['bundles'][$data['entity_type']])); + $format_handlers = $instance['widget']['settings']['format_handlers']; + } + + // Generate the necessary address field tokens for the entity. + $replacements += token_generate('address-field', $addressfield_tokens, array('address-field' => $data['entity']->$field_name, 'format_handlers' => $format_handlers), $options); + } + } + } + + return $replacements; +} diff --git a/sites/all/modules/contrib/fields/addressfield/example/addressfield_example.info b/sites/all/modules/contrib/fields/addressfield/example/addressfield_example.info index 2c4b2eaa..2e68b51f 100644 --- a/sites/all/modules/contrib/fields/addressfield/example/addressfield_example.info +++ b/sites/all/modules/contrib/fields/addressfield/example/addressfield_example.info @@ -7,9 +7,9 @@ hidden = TRUE dependencies[] = ctools dependencies[] = addressfield -; Information added by drupal.org packaging script on 2013-05-07 -version = "7.x-1.0-beta4" +; Information added by Drupal.org packaging script on 2015-01-16 +version = "7.x-1.0" core = "7.x" project = "addressfield" -datestamp = "1367945112" +datestamp = "1421426885" diff --git a/sites/all/modules/contrib/fields/addressfield/example/plugins/format/addressfield-example.inc b/sites/all/modules/contrib/fields/addressfield/example/plugins/format/address-ch-example.inc similarity index 100% rename from sites/all/modules/contrib/fields/addressfield/example/plugins/format/addressfield-example.inc rename to sites/all/modules/contrib/fields/addressfield/example/plugins/format/address-ch-example.inc diff --git a/sites/all/modules/contrib/fields/addressfield/plugins/format/address-hide-country.inc b/sites/all/modules/contrib/fields/addressfield/plugins/format/address-hide-country.inc index c826b000..13ebd1cb 100644 --- a/sites/all/modules/contrib/fields/addressfield/plugins/format/address-hide-country.inc +++ b/sites/all/modules/contrib/fields/addressfield/plugins/format/address-hide-country.inc @@ -18,10 +18,9 @@ $plugin = array( * @see CALLBACK_addressfield_format_callback() */ function addressfield_format_address_hide_country(&$format, $address, $context = array()) { - // When building the format for a form, we expect the country element to have - // an #options list. If it does, and there is only one option, hide the field - // by setting #access to FALSE. - if ($context['mode'] == 'form') { + // Hide the country element only if the whole field is required, otherwise + // there will always be an additional None option. + if ($context['mode'] == 'form' && $context['instance']['required']) { if (!empty($format['country']['#options']) && count($format['country']['#options']) == 1) { $format['country']['#access'] = FALSE; } diff --git a/sites/all/modules/contrib/fields/addressfield/plugins/format/address-hide-postal-code.inc b/sites/all/modules/contrib/fields/addressfield/plugins/format/address-hide-postal-code.inc new file mode 100644 index 00000000..4f058d34 --- /dev/null +++ b/sites/all/modules/contrib/fields/addressfield/plugins/format/address-hide-postal-code.inc @@ -0,0 +1,24 @@ + t('Hide the postal code'), + 'format callback' => 'addressfield_format_address_hide_postal_code', + 'type' => 'address', + 'weight' => -85, +); + +/** + * Format callback. + * + * @see CALLBACK_addressfield_format_callback() + */ +function addressfield_format_address_hide_postal_code(&$format, $address, $context = array()) { + if (isset($format['locality_block']['postal_code'])) { + $format['locality_block']['postal_code']['#access'] = FALSE; + } +} diff --git a/sites/all/modules/contrib/fields/addressfield/plugins/format/address-hide-street.inc b/sites/all/modules/contrib/fields/addressfield/plugins/format/address-hide-street.inc new file mode 100644 index 00000000..a5912dce --- /dev/null +++ b/sites/all/modules/contrib/fields/addressfield/plugins/format/address-hide-street.inc @@ -0,0 +1,24 @@ + t('Hide the street address'), + 'format callback' => 'addressfield_format_address_hide_street', + 'type' => 'address', + 'weight' => -85, +); + +/** + * Format callback. + * + * @see CALLBACK_addressfield_format_callback() + */ +function addressfield_format_address_hide_street(&$format, $address, $context = array()) { + if (isset($format['street_block'])) { + $format['street_block']['#access'] = FALSE; + } +} diff --git a/sites/all/modules/contrib/fields/addressfield/plugins/format/address-optional.inc b/sites/all/modules/contrib/fields/addressfield/plugins/format/address-optional.inc new file mode 100644 index 00000000..201e40ea --- /dev/null +++ b/sites/all/modules/contrib/fields/addressfield/plugins/format/address-optional.inc @@ -0,0 +1,36 @@ + t('Make all fields optional (Not recommended)'), + 'format callback' => 'addressfield_format_address_optional', + 'type' => 'address', + 'weight' => 100, +); + +/** + * Format callback. + * + * @see CALLBACK_addressfield_format_callback() + */ +function addressfield_format_address_optional(&$format, $address, $context = array()) { + if (isset($format['name_block'])) { + if (isset($format['name_block']['name_line'])) { + $format['name_block']['name_line']['#required'] = FALSE; + } + elseif (isset($format['name_block']['first_name'])) { + $format['name_block']['first_name']['#required'] = FALSE; + $format['name_block']['last_name']['#required'] = FALSE; + } + } + $format['street_block']['thoroughfare']['#required'] = FALSE; + $format['locality_block']['postal_code']['#required'] = FALSE; + $format['locality_block']['dependent_locality']['#required'] = FALSE; + $format['locality_block']['locality']['#required'] = FALSE; + $format['locality_block']['administrative_area']['#required'] = FALSE; +} diff --git a/sites/all/modules/contrib/fields/addressfield/plugins/format/address.inc b/sites/all/modules/contrib/fields/addressfield/plugins/format/address.inc index 33c6e254..d99b7f99 100644 --- a/sites/all/modules/contrib/fields/addressfield/plugins/format/address.inc +++ b/sites/all/modules/contrib/fields/addressfield/plugins/format/address.inc @@ -18,370 +18,222 @@ $plugin = array( * @see CALLBACK_addressfield_format_callback() */ function addressfield_format_address_generate(&$format, $address, $context = array()) { - // We start with a reasonable default: a simple block format suitable - // for international shipping. We extend it with country-specific heuristics - // below. + // Load the predefined address format for the selected country. + module_load_include('inc', 'addressfield', 'addressfield.address_formats'); + $address_format = addressfield_get_address_format($address['country']); + + // Used to move certain fields to their own row. + $clearfix = '
'; // The street block. $format['street_block'] = array( '#type' => 'addressfield_container', - '#attributes' => array('class' => array('street-block')), + '#attributes' => array( + 'class' => array('street-block'), + ), '#weight' => 0, ); $format['street_block']['thoroughfare'] = array( '#title' => t('Address 1'), '#tag' => 'div', - '#attributes' => array('class' => array('thoroughfare')), + '#attributes' => array( + 'class' => array('thoroughfare'), + 'x-autocompletetype' => 'address-line1', + 'autocomplete' => 'address-line1', + ), '#size' => 30, - // The #required will be automatically set to FALSE when processing. '#required' => TRUE, ); $format['street_block']['premise'] = array( '#title' => t('Address 2'), '#tag' => 'div', - '#attributes' => array('class' => array('premise')), + '#attributes' => array( + 'class' => array('premise'), + 'x-autocompletetype' => 'address-line2', + 'autocomplete' => 'address-line2', + ), '#size' => 30, ); $format['locality_block'] = array( '#type' => 'addressfield_container', - '#attributes' => array('class' => array('addressfield-container-inline', 'locality-block', 'country-' . $address['country'])), + '#attributes' => array( + 'class' => array('addressfield-container-inline', 'locality-block', 'country-' . $address['country']), + ), '#weight' => 50, ); $format['locality_block']['#attached']['css'][] = drupal_get_path('module', 'addressfield') . '/addressfield.css'; $format['locality_block']['postal_code'] = array( - '#title' => t('Postal code'), + '#title' => $address_format['postal_code_label'], + '#required' => in_array('postal_code', $address_format['required_fields']), + '#access' => in_array('postal_code', $address_format['used_fields']), '#size' => 10, - '#required' => TRUE, - '#attributes' => array('class' => array('postal-code')), + '#attributes' => array( + 'class' => array('postal-code'), + 'x-autocompletetype' => 'postal-code', + 'autocomplete' => 'postal-code', + ), + ); + $format['locality_block']['dependent_locality'] = array( + '#title' => $address_format['dependent_locality_label'], + '#required' => in_array('dependent_locality', $address_format['required_fields']), + '#access' => in_array('dependent_locality', $address_format['used_fields']), + '#size' => 25, + '#tag' => 'div', + '#attributes' => array( + 'class' => array('dependent-locality') + ), + // Most formats place this field in its own row. + '#suffix' => $clearfix, ); $format['locality_block']['locality'] = array( - '#title' => t('City'), + '#title' => $address_format['locality_label'], + '#required' => in_array('locality', $address_format['required_fields']), + '#access' => in_array('locality', $address_format['used_fields']), '#size' => 30, - '#required' => TRUE, '#prefix' => ' ', - '#attributes' => array('class' => array('locality')), + '#attributes' => array( + 'class' => array('locality'), + 'x-autocompletetype' => 'locality', + 'autocomplete' => 'locality', + ), + ); + $format['locality_block']['administrative_area'] = array( + '#title' => $address_format['administrative_area_label'], + '#required' => in_array('administrative_area', $address_format['required_fields']), + '#access' => in_array('administrative_area', $address_format['used_fields']), + '#empty_value' => '', + '#size' => 10, + '#prefix' => ' ', + '#render_option_value' => $address_format['render_administrative_area_value'], + '#attributes' => array( + 'class' => array('state'), + 'x-autocompletetype' => 'region', + 'autocomplete' => 'region', + ), ); $format['country'] = array( '#title' => t('Country'), '#options' => _addressfield_country_options_list(), '#render_option_value' => TRUE, '#required' => TRUE, - '#attributes' => array('class' => array('country')), + '#attributes' => array( + 'class' => array('country'), + 'x-autocompletetype' => 'country', + 'autocomplete' => 'country', + ), '#weight' => 100, ); - // Those countries do not seem to have a relevant postal code. - static $countries_no_postal_code = array('AF', 'AG', 'AL', 'AO', 'BB', 'BI', 'BJ', 'BO', 'BS', 'BW', 'BZ', 'CF', 'CG', 'CM', 'CO', 'DJ', 'DM', 'EG', 'ER', 'FJ', 'GD', 'GH', 'GM', 'GQ', 'GY', 'HK', 'IE', 'KI', 'KM', 'KP', 'KY', 'LC', 'LY', 'ML', 'MR', 'NA', 'NR', 'RW', 'SB', 'SC', 'SL', 'SR', 'ST', 'TD', 'TG', 'TL', 'TO', 'TT', 'TV', 'TZ', 'UG', 'VC', 'VU', 'WS', 'ZW'); - if (in_array($address['country'], $countries_no_postal_code)) { - unset($format['locality_block']['postal_code']); - + if (empty($format['locality_block']['postal_code']['#access'])) { // Remove the prefix from the first widget of the block. $element_children = element_children($format['locality_block']); $first_child = reset($element_children); unset($format['locality_block'][$first_child]['#prefix']); } - // Those countries generally use the administrative area in postal addresses. - static $countries_administrative_area = array('AR', 'AU', 'BR', 'BS', 'BY', 'BZ', 'CA', 'CN', 'DO', 'EG', 'ES', 'FJ', 'FM', 'GB', 'HN', 'ID', 'IE', 'IN', 'IT', 'JO', 'JP', 'KI', 'KN', 'KR', 'KW', 'KY', 'KZ', 'MX', 'MY', 'MZ', 'NG', 'NI', 'NR', 'NZ', 'OM', 'PA', 'PF', 'PG', 'PH', 'PR', 'PW', 'RU', 'SM', 'SO', 'SR', 'SV', 'TH', 'TW', 'UA', 'US', 'UY', 'VE', 'VI', 'VN', 'YU', 'ZA'); - if (in_array($address['country'], $countries_administrative_area)) { - $format['locality_block']['administrative_area'] = array( - '#title' => t('State', array(), array('context' => 'addressfield')), - '#size' => 10, - '#required' => TRUE, - '#prefix' => ' ', - '#attributes' => array('class' => array('state')), - ); + if (!empty($format['locality_block']['administrative_area']['#access'])) { + // Set the predefined administrative areas, if found. + module_load_include('inc', 'addressfield', 'addressfield.administrative_areas'); + $administrative_areas = addressfield_get_administrative_areas($address['country']); + $format['locality_block']['administrative_area']['#options'] = $administrative_areas; } - // A few countries have a well-known list of administrative divisions. - if ($address['country'] == 'US') { - $format['locality_block']['administrative_area']['#options'] = array( - '' => t('--'), - 'AL' => t('Alabama'), - 'AK' => t('Alaska'), - 'AZ' => t('Arizona'), - 'AR' => t('Arkansas'), - 'CA' => t('California'), - 'CO' => t('Colorado'), - 'CT' => t('Connecticut'), - 'DE' => t('Delaware'), - 'DC' => t('District Of Columbia'), - 'FL' => t('Florida'), - 'GA' => t('Georgia'), - 'HI' => t('Hawaii'), - 'ID' => t('Idaho'), - 'IL' => t('Illinois'), - 'IN' => t('Indiana'), - 'IA' => t('Iowa'), - 'KS' => t('Kansas'), - 'KY' => t('Kentucky'), - 'LA' => t('Louisiana'), - 'ME' => t('Maine'), - 'MD' => t('Maryland'), - 'MA' => t('Massachusetts'), - 'MI' => t('Michigan'), - 'MN' => t('Minnesota'), - 'MS' => t('Mississippi'), - 'MO' => t('Missouri'), - 'MT' => t('Montana'), - 'NE' => t('Nebraska'), - 'NV' => t('Nevada'), - 'NH' => t('New Hampshire'), - 'NJ' => t('New Jersey'), - 'NM' => t('New Mexico'), - 'NY' => t('New York'), - 'NC' => t('North Carolina'), - 'ND' => t('North Dakota'), - 'OH' => t('Ohio'), - 'OK' => t('Oklahoma'), - 'OR' => t('Oregon'), - 'PA' => t('Pennsylvania'), - 'RI' => t('Rhode Island'), - 'SC' => t('South Carolina'), - 'SD' => t('South Dakota'), - 'TN' => t('Tennessee'), - 'TX' => t('Texas'), - 'UT' => t('Utah'), - 'VT' => t('Vermont'), - 'VA' => t('Virginia'), - 'WA' => t('Washington'), - 'WV' => t('West Virginia'), - 'WI' => t('Wisconsin'), - 'WY' => t('Wyoming'), - ' ' => t('--'), - 'AA' => t('Armed Forces (Americas)'), - 'AE' => t('Armed Forces (Europe, Canada, Middle East, Africa)'), - 'AP' => t('Armed Forces (Pacific)'), - 'AS' => t('American Samoa'), - 'FM' => t('Federated States of Micronesia'), - 'GU' => t('Guam'), - 'MH' => t('Marshall Islands'), - 'MP' => t('Northern Mariana Islands'), - 'PW' => t('Palau'), - 'PR' => t('Puerto Rico'), - 'VI' => t('Virgin Islands'), - ); - $format['locality_block']['postal_code']['#title'] = t('ZIP Code'); - + // Country-specific customizations. + if (in_array($address['country'], array('AU', 'EE', 'LT', 'LV', 'NZ', 'RU'))) { + // These countries don't use the "Address 2" line. + // Leave it as a precaution, but hide the label to avoid confusing users. + $format['street_block']['thoroughfare']['#title'] = t('Address'); + $format['street_block']['premise']['#title_display'] = 'invisible'; + } + elseif ($address['country'] == 'US') { if ($context['mode'] == 'render') { $format['locality_block']['locality']['#suffix'] = ','; } } - else if ($address['country'] == 'IT') { - $format['locality_block']['administrative_area']['#options'] = array( - '' => t('--'), - 'AG' => t('Agrigento'), - 'AL' => t('Alessandria'), - 'AN' => t('Ancona'), - 'AO' => t("Valle d'Aosta/Vallée d'Aoste"), - 'AP' => t('Ascoli Piceno'), - 'AQ' => t("L'Aquila"), - 'AR' => t('Arezzo'), - 'AT' => t('Asti'), - 'AV' => t('Avellino'), - 'BA' => t('Bari'), - 'BG' => t('Bergamo'), - 'BI' => t('Biella'), - 'BL' => t('Belluno'), - 'BN' => t('Benevento'), - 'BO' => t('Bologna'), - 'BR' => t('Brindisi'), - 'BS' => t('Brescia'), - 'BT' => t('Barletta-Andria-Trani'), - 'BZ' => t('Bolzano/Bozen'), - 'CA' => t('Cagliari'), - 'CB' => t('Campobasso'), - 'CE' => t('Caserta'), - 'CH' => t('Chieti'), - 'CI' => t('Carbonia-Iglesias'), - 'CL' => t('Caltanissetta'), - 'CN' => t('Cuneo'), - 'CO' => t('Como'), - 'CR' => t('Cremona'), - 'CS' => t('Cosenza'), - 'CT' => t('Catania'), - 'CZ' => t('Catanzaro'), - 'EN' => t('Enna'), - 'FC' => t('Forlì-Cesena'), - 'FE' => t('Ferrara'), - 'FG' => t('Foggia'), - 'FI' => t('Firenze'), - 'FM' => t('Fermo'), - 'FR' => t('Frosinone'), - 'GE' => t('Genova'), - 'GO' => t('Gorizia'), - 'GR' => t('Grosseto'), - 'IM' => t('Imperia'), - 'IS' => t('Isernia'), - 'KR' => t('Crotone'), - 'LC' => t('Lecco'), - 'LE' => t('Lecce'), - 'LI' => t('Livorno'), - 'LO' => t('Lodi'), - 'LT' => t('Latina'), - 'LU' => t('Lucca'), - 'MB' => t('Monza e Brianza'), - 'MC' => t('Macerata'), - 'ME' => t('Messina'), - 'MI' => t('Milano'), - 'MN' => t('Mantova'), - 'MO' => t('Modena'), - 'MS' => t('Massa-Carrara'), - 'MT' => t('Matera'), - 'NA' => t('Napoli'), - 'NO' => t('Novara'), - 'NU' => t('Nuoro'), - 'OG' => t('Ogliastra'), - 'OR' => t('Oristano'), - 'OT' => t('Olbia-Tempio'), - 'PA' => t('Palermo'), - 'PC' => t('Piacenza'), - 'PD' => t('Padova'), - 'PE' => t('Pescara'), - 'PG' => t('Perugia'), - 'PI' => t('Pisa'), - 'PN' => t('Pordenone'), - 'PO' => t('Prato'), - 'PR' => t('Parma'), - 'PT' => t('Pistoia'), - 'PU' => t('Pesaro e Urbino'), - 'PV' => t('Pavia'), - 'PZ' => t('Potenza'), - 'RA' => t('Ravenna'), - 'RC' => t('Reggio di Calabria'), - 'RE' => t("Reggio nell'Emilia"), - 'RG' => t('Ragusa'), - 'RI' => t('Rieti'), - 'RM' => t('Roma'), - 'RN' => t('Rimini'), - 'RO' => t('Rovigo'), - 'SA' => t('Salerno'), - 'SI' => t('Siena'), - 'SO' => t('Sondrio'), - 'SP' => t('La Spezia'), - 'SR' => t('Siracusa'), - 'SS' => t('Sassari'), - 'SV' => t('Savona'), - 'TA' => t('Taranto'), - 'TE' => t('Teramo'), - 'TN' => t('Trento'), - 'TO' => t('Torino'), - 'TP' => t('Trapani'), - 'TR' => t('Terni'), - 'TS' => t('Trieste'), - 'TV' => t('Treviso'), - 'UD' => t('Udine'), - 'VA' => t('Varese'), - 'VB' => t('Verbano-Cusio-Ossola'), - 'VC' => t('Vercelli'), - 'VE' => t('Venezia'), - 'VI' => t('Vicenza'), - 'VR' => t('Verona'), - 'VS' => t('Medio Campidano'), - 'VT' => t('Viterbo'), - 'VV' => t('Vibo Valentia'), + elseif ($address['country'] == 'BR') { + $format['locality_block']['dependent_locality']['#suffix'] = $clearfix; + $format['locality_block']['dependent_locality']['#tag'] = 'div'; + $format['locality_block']['administrative_area']['#suffix'] = $clearfix; + $format['locality_block']['postal_code']['#tag'] = 'div'; + // Change some titles to make translation easier. + $format['street_block']['#attributes'] = array( + 'class' => array('addressfield-container-inline'), ); - $format['locality_block']['administrative_area']['#title'] = t('Province'); + $format['street_block']['thoroughfare']['#title'] = t('Thoroughfare'); + $format['street_block']['thoroughfare']['#tag'] = NULL; + $format['street_block']['premise'] = array( + '#title' => t('Complement'), + '#tag' => NULL, + '#attributes' => array('class' => array('premise')), + '#size' => 20, + '#prefix' => ', ', + ); + $format['locality_block']['locality']['#suffix'] = ' - '; + // Hide suffixes and prefixes while in form. + if ($context['mode'] == 'form') { + $format['street_block']['premise']['#prefix'] = NULL; + $format['street_block']['premise']['#suffix'] = NULL; + $format['locality_block']['locality']['#suffix'] = NULL; + } } - else if ($address['country'] == 'BR') { - $format['locality_block']['administrative_area']['#render_option_value'] = TRUE; - $format['locality_block']['administrative_area']['#options'] = array( - '' => t('--'), - 'AC' => t('Acre'), - 'AL' => t('Alagoas'), - 'AM' => t('Amazonas'), - 'AP' => t('Amapá'), - 'BA' => t('Bahia'), - 'CE' => t('Ceará'), - 'DF' => t('Distrito Federal'), - 'ES' => t('Espírito Santo'), - 'GO' => t('Goiás'), - 'MA' => t('Maranhão'), - 'MG' => t('Minas Gerais'), - 'MS' => t('Mato Grosso do Sul'), - 'MT' => t('Mato Grosso'), - 'PA' => t('Pará'), - 'PB' => t('Paraíba'), - 'PE' => t('Pernambuco'), - 'PI' => t('Piauí'), - 'PR' => t('Paraná'), - 'RJ' => t('Rio de Janeiro'), - 'RN' => t('Rio Grande do Norte'), - 'RO' => t('Rondônia'), - 'RR' => t('Roraima'), - 'RS' => t('Rio Grande do Sul'), - 'SC' => t('Santa Catarina'), - 'SE' => t('Sergipe'), - 'SP' => t('São Paulo'), - 'TO' => t('Tocantins'), - ); + elseif ($address['country'] == 'CN') { + $format['locality_block']['locality']['#suffix'] = $clearfix; } - else if ($address['country'] == 'CA') { - $format['locality_block']['administrative_area']['#options'] = array( - '' => t('--'), - 'AB' => t('Alberta'), - 'BC' => t('British Columbia'), - 'MB' => t('Manitoba'), - 'NB' => t('New Brunswick'), - 'NL' => t('Newfoundland and Labrador'), - 'NT' => t('Northwest Territories'), - 'NS' => t('Nova Scotia'), - 'NU' => t('Nunavut'), - 'ON' => t('Ontario'), - 'PE' => t('Prince Edward Island'), - 'QC' => t('Quebec'), - 'SK' => t('Saskatchewan'), - 'YT' => t('Yukon Territory'), - ); - $format['locality_block']['administrative_area']['#title'] = t('Province'); - + elseif ($address['country'] == 'CA') { if ($context['mode'] == 'render') { $format['locality_block']['locality']['#suffix'] = ','; } } - else if ($address['country'] == 'AU') { - $format['locality_block']['administrative_area']['#options'] = array( - '' => t('--'), - 'ACT' => t('Australian Capital Territory'), - 'NSW' => t('New South Wales'), - 'NT' => t('Northern Territory'), - 'QLD' => t('Queensland'), - 'SA' => t('South Australia'), - 'TAS' => t('Tasmania'), - 'VIC' => t('Victoria'), - 'WA' => t('Western Australia'), - ); + elseif ($address['country'] == 'GB') { + $format['locality_block']['administrative_area']['#size'] = '30'; } - else if ($address['country'] == 'NZ') { - $format['locality_block']['locality']['#title'] = ('Town/City'); - $format['locality_block']['postal_code']['#title'] = t('Postcode'); - $format['locality_block']['administrative_area']['#render_option_value'] = TRUE; - $format['locality_block']['administrative_area']['#title'] = t('Region'); - $format['locality_block']['administrative_area']['#required'] = FALSE; - $format['locality_block']['administrative_area']['#options'] = array( - '' => t('--'), - 'AUK' => t('Auckland'), - 'BOP' => t('Bay of Plenty'), - 'CAN' => t('Canterbury'), - 'HKB' => t("Hawke's Bay"), - 'MWT' => t('Manawatu-Wanganui'), - 'NTL' => t('Northland'), - 'OTA' => t('Otago'), - 'STL' => t('Southland'), - 'TKI' => t('Taranaki'), - 'WKO' => t('Waikato'), - 'WGN' => t('Wellington'), - 'WTC' => t('West Coast'), - 'GIS' => t('Gisborne District'), - 'MBH' => t('Marlborough District'), - 'NSN' => t('Nelson City'), - 'TAS' => t('Tasman District'), - 'CIT' => t('Chatham Islands Territory'), - ); + elseif ($address['country'] == 'ID') { + $format['locality_block']['administrative_area']['#weight'] = 1; + } + elseif ($address['country'] == 'JP') { + $format['locality_block']['#weight'] = 10; + $format['locality_block']['postal_code']['#weight'] = 10; + $format['locality_block']['postal_code']['#tag'] = 'div'; + $format['locality_block']['postal_code']['#size'] = 30; + $format['locality_block']['administrative_area']['#weight'] = 20; + $format['locality_block']['administrative_area']['#size'] = 30; + $format['locality_block']['locality']['#weight'] = 30; + $format['street_block']['#weight'] = 20; + } + elseif ($address['country'] == 'PE') { + $format['locality_block']['administrative_area']['#weight'] = 1; + $format['locality_block']['locality']['#weight'] = 2; + } + elseif ($address['country'] == 'PH' || $address['country'] == 'TH') { + $format['locality_block']['dependent_locality']['#suffix'] = ''; + $format['locality_block']['locality']['#suffix'] = $clearfix; } - // Those countries tend to put the postal code after the locality. - static $countries_postal_code_after_locality = array('AU', 'BD', 'BF', 'BH', 'BM', 'BN', 'BT', 'CA', 'FM', 'GB', 'ID', 'IN', 'JM', 'JO', 'KH', 'LB', 'LS', 'LV', 'MM', 'MN', 'MV', 'MW', 'NG', 'NP', 'NZ', 'PE', 'PK', 'PR', 'PW', 'SA', 'SG', 'SO', 'TH', 'US', 'VI', 'VG', 'VN'); + // These countries show every field in its own row. + $countries_field_per_row = array( + 'AM', 'EG', 'FK', 'GB', 'GG', 'GS', 'HK', 'HU', 'IE', 'IM', 'IO', 'JE', 'JM', + 'JP', 'KE', 'KR', 'KZ', 'LK', 'PA', 'PN', 'RU', 'SC', 'SH', 'SZ', 'TC', 'UA', + 'VG', 'ZA', + ); + if (in_array($address['country'], $countries_field_per_row)) { + $format['locality_block']['#attributes']['class'][0] = 'addressfield-container'; + $format['locality_block']['postal_code']['#prefix'] = ''; + $format['locality_block']['postal_code']['#tag'] = 'div'; + $format['locality_block']['locality']['#prefix'] = ''; + $format['locality_block']['locality']['#tag'] = 'div'; + $format['locality_block']['administrative_area']['#prefix'] = ''; + $format['locality_block']['administrative_area']['#tag'] = 'div'; + } + + // These countries tend to put the postal code after the locality. + $countries_postal_code_after_locality = array( + 'AS', 'AU', 'BD', 'BF', 'BH', 'BM', 'BN', 'BR', 'BT', 'CA', 'CC', 'CN', 'CX', + 'EG', 'FK', 'FM', 'GB', 'GG', 'GS', 'GU', 'HN', 'HU', 'ID', 'IL', 'IM', 'IN', + 'IO', 'IQ', 'IR', 'JE', 'JO', 'JP', 'KE', 'KH', 'KR', 'LB', 'LK', 'LS', 'LV', + 'MH', 'MM', 'MN', 'MP', 'MT', 'MV', 'MX', 'MY', 'NF', 'NG', 'NP', 'NZ', 'PG', + 'PH', 'PK', 'PN', 'PR', 'PW', 'RU', 'SA', 'SH', 'SO', 'SZ', 'TC', 'TH', 'TW', + 'UA', 'UM', 'US', 'VE', 'VI', 'VG', 'VN', 'ZA', + ); if (in_array($address['country'], $countries_postal_code_after_locality)) { // Take the widget out of the array. $postal_code_widget = $format['locality_block']['postal_code']; @@ -397,44 +249,6 @@ function addressfield_format_address_generate(&$format, $address, $context = arr unset($format['locality_block'][$first_child]['#prefix']); } - // GB-specific tweaks - if ($address['country'] == 'GB') { - // Locality - $format['locality_block']['locality'] = array_merge( - $format['locality_block']['locality'], - array( - '#title' => t('Town/City'), - '#weight' => 40, - '#prefix' => '', - '#tag' => 'div', - ) - ); - - // Administrative - $format['locality_block']['administrative_area'] = array_merge( - $format['locality_block']['administrative_area'], - array( - '#title' => t('County'), - '#required' => FALSE, - '#weight' => 50, - '#size' => 30, - '#prefix' => '', - '#tag' => 'div', - ) - ); - - // Postal code - $format['locality_block']['postal_code'] = array_merge( - $format['locality_block']['postal_code'], - array( - '#title' => t('Postcode'), - '#weight' => 60, - '#prefix' => '', - '#tag' => 'div', - ) - ); - } - if ($context['mode'] == 'form') { // Provide a wrapper ID for AJAX replacement based on country selection. if (!isset($format['#wrapper_id'])) { @@ -442,15 +256,6 @@ function addressfield_format_address_generate(&$format, $address, $context = arr $format['#prefix'] = '
'; $format['#suffix'] = '
'; } - - // Form mode, move the country selector to the top of the form. - $format['country']['#weight'] = -10; - - // Limit it to the countries supported by the widget. - if (isset($context['field'])) { - $format['country']['#options'] = _addressfield_country_options_list($context['field'], $context['instance']); - } - // AJAX enable it. $format['country']['#ajax'] = array( 'callback' => 'addressfield_standard_widget_refresh', @@ -460,12 +265,25 @@ function addressfield_format_address_generate(&$format, $address, $context = arr // Don't validate any element when the country is changed. $format['country']['#limit_validation_errors'] = array(); - if (isset($context['delta']) && $context['delta'] > 0) { - // On subsequent elements of a field, we make the country field non - // required and add a ' - None - ' option to it, so as to allow the - // user to remove the address by clearing the country field. + // Move the country selector to the top of the form. + $format['country']['#weight'] = -500; + // Limit it to the countries supported by the widget. + if (isset($context['field'])) { + $format['country']['#options'] = _addressfield_country_options_list($context['field'], $context['instance']); + } + + // The whole field is considered empty if the country column is empty. + // Therefore, if the field is optional, allow the country to be optional. + // The same logic applies if the field allows multiple values, in which case + // only the first delta needs to have a value. + if (empty($context['instance']['required']) || (isset($context['delta']) && $context['delta'] > 0)) { $format['country']['#required'] = FALSE; $format['country']['#empty_value'] = ''; + // Hide all other fields until the country is selected. + if (empty($address['country'])) { + $format['street_block']['#access'] = FALSE; + $format['locality_block']['#access'] = FALSE; + } } } } diff --git a/sites/all/modules/contrib/fields/addressfield/plugins/format/name-full.inc b/sites/all/modules/contrib/fields/addressfield/plugins/format/name-full.inc index ed4c7688..02a67b93 100644 --- a/sites/all/modules/contrib/fields/addressfield/plugins/format/name-full.inc +++ b/sites/all/modules/contrib/fields/addressfield/plugins/format/name-full.inc @@ -20,20 +20,33 @@ $plugin = array( function addressfield_format_name_full_generate(&$format, $address) { $format['name_block'] = array( '#type' => 'addressfield_container', - '#attributes' => array('class' => array('addressfield-container-inline', 'name-block')), + '#attributes' => array( + 'class' => array('addressfield-container-inline', 'name-block'), + ), '#weight' => -100, + // The addressfield is considered empty without a country, hide all fields + // until one is selected. + '#access' => !empty($address['country']), ); $format['name_block']['first_name'] = array( '#title' => t('First name'), '#size' => 30, '#required' => TRUE, - '#attributes' => array('class' => array('first-name')), + '#attributes' => array( + 'class' => array('first-name'), + 'x-autocompletetype' => 'given-name', + 'autocomplete' => 'given-name', + ), ); $format['name_block']['last_name'] = array( '#title' => t('Last name'), '#size' => 30, '#required' => TRUE, '#prefix' => ' ', - '#attributes' => array('class' => array('last-name')), + '#attributes' => array( + 'class' => array('last-name'), + 'x-autocompletetype' => 'family-name', + 'autocomplete' => 'family-name', + ), ); } diff --git a/sites/all/modules/contrib/fields/addressfield/plugins/format/name-oneline.inc b/sites/all/modules/contrib/fields/addressfield/plugins/format/name-oneline.inc index c1c5a29f..0f7de045 100644 --- a/sites/all/modules/contrib/fields/addressfield/plugins/format/name-oneline.inc +++ b/sites/all/modules/contrib/fields/addressfield/plugins/format/name-oneline.inc @@ -22,11 +22,18 @@ function addressfield_format_name_oneline_generate(&$format, $address) { '#type' => 'addressfield_container', '#attributes' => array('class' => array('addressfield-container-inline', 'name-block')), '#weight' => -100, + // The addressfield is considered empty without a country, hide all fields + // until one is selected. + '#access' => !empty($address['country']), ); $format['name_block']['name_line'] = array( '#title' => t('Full name'), '#tag' => 'div', - '#attributes' => array('class' => array('name-block')), + '#attributes' => array( + 'class' => array('name-block'), + 'x-autocompletetype' => 'name', + 'autocomplete' => 'name', + ), '#size' => 30, '#required' => TRUE, ); diff --git a/sites/all/modules/contrib/fields/addressfield/plugins/format/organisation.inc b/sites/all/modules/contrib/fields/addressfield/plugins/format/organisation.inc index c069a4c8..d658f83f 100644 --- a/sites/all/modules/contrib/fields/addressfield/plugins/format/organisation.inc +++ b/sites/all/modules/contrib/fields/addressfield/plugins/format/organisation.inc @@ -22,10 +22,17 @@ function addressfield_format_organisation_generate(&$format, $address) { '#type' => 'addressfield_container', '#attributes' => array('class' => array('addressfield-container-inline', 'name-block')), '#weight' => -50, + // The addressfield is considered empty without a country, hide all fields + // until one is selected. + '#access' => !empty($address['country']), ); $format['organisation_block']['organisation_name'] = array( '#title' => t('Company'), '#size' => 30, - '#attributes' => array('class' => array('organisation-name')), + '#attributes' => array( + 'class' => array('organisation-name'), + 'x-autocompletetype' => 'organization', + 'autocomplete' => 'organization', + ), ); } diff --git a/sites/all/modules/contrib/fields/addressfield/views/addressfield.views.inc b/sites/all/modules/contrib/fields/addressfield/views/addressfield.views.inc index 77a5b45c..9be1637e 100644 --- a/sites/all/modules/contrib/fields/addressfield/views/addressfield.views.inc +++ b/sites/all/modules/contrib/fields/addressfield/views/addressfield.views.inc @@ -6,8 +6,9 @@ function addressfield_field_views_data($field) { $data = field_views_field_default_views_data($field); - // Add a handler for countries. - foreach ($field['storage']['details']['sql'] as $type => $tables) { + // Add a filter handler for countries. + $key = key($field['storage']['details']); + foreach ($field['storage']['details'][$key] as $type => $tables) { foreach ($tables as $table_name => $columns) { if (!isset($columns['country'])) { continue; @@ -22,5 +23,73 @@ function addressfield_field_views_data($field) { } } + // Only expose these components as Views field handlers. + $implemented = array( + 'country' => 'addressfield_views_handler_field_country', + 'administrative_area' => 'views_handler_field', + 'sub_administrative_area' => 'views_handler_field', + 'dependent_locality' => 'views_handler_field', + 'locality' => 'views_handler_field', + 'postal_code' => 'views_handler_field', + 'thoroughfare' => 'views_handler_field', + 'premise' => 'views_handler_field', + 'sub_premise' => 'views_handler_field', + 'organisation_name' => 'views_handler_field', + 'name_line' => 'views_handler_field', + 'first_name' => 'views_handler_field', + 'last_name' => 'views_handler_field', + 'data' => 'views_handler_field_serialized', + ); + + // Get the translated field information. + $properties = addressfield_data_property_info(); + + // Iterate over addressfield defined tables. + foreach ($data as &$table) { + // Make sure the parent Views field (addressfield) is defined. + if (isset($table[$field['field_name']]['field'])) { + // Use the parent field definition as a template for component columns. + $field_def = $table[$field['field_name']]['field']; + + // Remove 'additional fields' from the field definition. We don't + // necessarily want all our sibling columns. + unset($field_def['additional fields']); + + // Define the valid columns. + $valid_columns = array(); + foreach ($implemented as $implement => $handler) { + $column_name = $field['field_name'] . '_' . $implement; + $valid_columns[$column_name] = $handler; + } + + // Iterate over the addressfield components. + foreach ($table as $column_name => &$column) { + if (empty($column['field']) && isset($valid_columns[$column_name])) { + // Assign the default component definition. + $column['field'] = $field_def; + $column['field']['real field'] = $column_name; + $column['field']['handler'] = $valid_columns[$column_name]; + + // Assign human-friendly field labels for addressfield components. + $field_labels = field_views_field_label($field['field_name']); + $field_label = array_shift($field_labels); + $property = str_replace($field_def['field_name'] . '_', '', $column_name); + + if (!empty($properties[$property])) { + $property_label = $properties[$property]['label']; + + $title = t('@field-label - @property-label', array( + '@field-label' => $field_label, + '@property-label' => $property_label, + )); + + $column['title'] = $title; + $column['title short'] = $title; + } + } + } + } + } + return $data; } diff --git a/sites/all/modules/contrib/fields/addressfield/views/addressfield_views_handler_field_country.inc b/sites/all/modules/contrib/fields/addressfield/views/addressfield_views_handler_field_country.inc new file mode 100644 index 00000000..65ca79d3 --- /dev/null +++ b/sites/all/modules/contrib/fields/addressfield/views/addressfield_views_handler_field_country.inc @@ -0,0 +1,40 @@ + TRUE); + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + + $form['display_name'] = array( + '#type' => 'checkbox', + '#title' => t('Display the localized country name instead of the two character country code'), + '#default_value' => $this->options['display_name'], + ); + } + + function get_value($values, $field = NULL) { + $value = parent::get_value($values, $field); + + // If we have a value for the field, look for the country name in the + // Address Field options list array if specified. + if (!empty($value) && !empty($this->options['display_name'])) { + $countries = _addressfield_country_options_list(); + + if (!empty($countries[$value])) { + $value = $countries[$value]; + } + } + + return $value; + } +} diff --git a/sites/all/modules/contrib/fields/autocomplete_deluxe/autocomplete_deluxe-rtl.css b/sites/all/modules/contrib/fields/autocomplete_deluxe/autocomplete_deluxe-rtl.css new file mode 100644 index 00000000..056051c9 --- /dev/null +++ b/sites/all/modules/contrib/fields/autocomplete_deluxe/autocomplete_deluxe-rtl.css @@ -0,0 +1,36 @@ +span.autocomplete-deluxe-value-delete { + float: left; +} +div.autocomplete-deluxe-multiple { + padding: 4px 5px; +} + +input.autocomplete-deluxe-form.autocomplete-deluxe-multiple { + margin-left: 0; + margin-right: 5px; + float: right; +} + +div.autocomplete-deluxe-throbber { + float: left; +} + +.autocomplete-deluxe-closed { + background-position: 0 6px; +} + +.autocomplete-deluxe-open { + background-position: 0 -14px; +} + +.autocomplete-deluxe-item { + float: right; + margin: 3px 5px 3px 0; + padding: 3px 5px 3px 20px; +} + +.autocomplete-deluxe-item-delete { + position: absolute; + right: auto; + left: 3px; +} diff --git a/sites/all/modules/contrib/fields/autocomplete_deluxe/autocomplete_deluxe.css b/sites/all/modules/contrib/fields/autocomplete_deluxe/autocomplete_deluxe.css index cbff966d..795f3699 100644 --- a/sites/all/modules/contrib/fields/autocomplete_deluxe/autocomplete_deluxe.css +++ b/sites/all/modules/contrib/fields/autocomplete_deluxe/autocomplete_deluxe.css @@ -114,7 +114,7 @@ div.autocomplete-deluxe-multiple { background: no-repeat -38px -22px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%); background: no-repeat -38px -22px, -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%); background: no-repeat -38px -22px, linear-gradient(top, #eeeeee 1%, #ffffff 15%); - padding: 4px 5px 4px 20px; + padding: 4px 5px; border: 1px solid #AAAAAA; cursor: text; height: auto !important; diff --git a/sites/all/modules/contrib/fields/autocomplete_deluxe/autocomplete_deluxe.info b/sites/all/modules/contrib/fields/autocomplete_deluxe/autocomplete_deluxe.info index 9bb34210..3017587d 100644 --- a/sites/all/modules/contrib/fields/autocomplete_deluxe/autocomplete_deluxe.info +++ b/sites/all/modules/contrib/fields/autocomplete_deluxe/autocomplete_deluxe.info @@ -5,9 +5,9 @@ core = 7.x files[] = autocomplete_deluxe.module dependencies[] = taxonomy -; Information added by drupal.org packaging script on 2013-08-05 -version = "7.x-2.0-beta3" +; Information added by Drupal.org packaging script on 2015-03-16 +version = "7.x-2.1" core = "7.x" project = "autocomplete_deluxe" -datestamp = "1375695669" +datestamp = "1426503185" diff --git a/sites/all/modules/contrib/fields/autocomplete_deluxe/autocomplete_deluxe.js b/sites/all/modules/contrib/fields/autocomplete_deluxe/autocomplete_deluxe.js index 44d7f153..0bca13de 100644 --- a/sites/all/modules/contrib/fields/autocomplete_deluxe/autocomplete_deluxe.js +++ b/sites/all/modules/contrib/fields/autocomplete_deluxe/autocomplete_deluxe.js @@ -82,7 +82,10 @@ return this; }; - + /** + * If there is no result this label will be shown. + * @type {{label: string, value: string}} + */ Drupal.autocomplete_deluxe.empty = {label: '- ' + Drupal.t('None') + ' -', value: "" }; /** @@ -105,6 +108,9 @@ Drupal.autocomplete_deluxe.Widget = function() { }; + /** + * Url for the callback. + */ Drupal.autocomplete_deluxe.Widget.prototype.uri = null; /** @@ -119,7 +125,7 @@ }; Drupal.autocomplete_deluxe.Widget.prototype.init = function(settings) { - if ($.browser.msie && $.browser.version === "6.0") { + if(navigator.appVersion.indexOf("MSIE 6.") != -1) { return; } @@ -131,6 +137,7 @@ this.required = settings.required; this.limit = settings.limit; this.synonyms = typeof settings.use_synonyms == 'undefined' ? false : settings.use_synonyms; + this.not_found_message = typeof settings.use_synonyms == 'undefined' ? "The term '@term' will be added." : settings.not_found_message; this.wrapper = '""'; @@ -140,7 +147,6 @@ this.delimiter = settings.delimiter.charCodeAt(0); } - this.items = {}; var self = this; @@ -163,7 +169,7 @@ } if ($.isEmptyObject(result)) { result.push({ - label: Drupal.t("The term '@term' will be added.", {'@term' : term}), + label: Drupal.t(self.not_found_message, {'@term' : term}), value: term, newTerm: true }); @@ -203,6 +209,9 @@ }); var jqObject = this.jqObject; + + var autocompleteDataKey = typeof(this.jqObject.data('autocomplete')) === 'object' ? 'item.autocomplete' : 'ui-autocomplete'; + var throbber = $('
 
').insertAfter(jqObject); this.jqObject.bind("autocompletesearch", function(event, ui) { @@ -224,8 +233,9 @@ var re = new RegExp('()*""' + escapedValue + '""|' + escapedValue + '()*', 'gi'); var t = item.label.replace(re,"$&"); } + return $( "
  • " ) - .data( "item.autocomplete", item ) + .data(autocompleteDataKey, item) .append( "" + t + "" ) .appendTo( ul ); }; @@ -304,23 +314,25 @@ this.element.remove(); var values = this.widget.valueForm.val(); var escapedValue = Drupal.autocomplete_deluxe.escapeRegex( this.item.value ); - var regex = new RegExp('()*""' + escapedValue + '""|' + escapedValue + '()*', 'gi'); + var regex = new RegExp('()*""' + escapedValue + '""()*', 'gi'); this.widget.valueForm.val(values.replace(regex, '')); delete this.widget.items[this.value]; }; Drupal.autocomplete_deluxe.MultipleWidget.prototype.setup = function() { var jqObject = this.jqObject; - var parent = jqObject.parent(); - var value_container = jqObject.parent().parent().children('.autocomplete-deluxe-value-container'); - var value_input = value_container.children().children(); + var parent = jqObject.parents('.autocomplete-deluxe-container'); + var value_container = parent.next(); + var value_input = value_container.find('input'); var items = this.items; var self = this; this.valueForm = value_input; // Override the resize function, so that the suggestion list doesn't resizes // all the time. - jqObject.data("autocomplete")._resizeMenu = function() {}; + var autocompleteDataKey = typeof(this.jqObject.data('autocomplete')) === 'object' ? 'autocomplete' : 'ui-autocomplete'; + + jqObject.data(autocompleteDataKey)._resizeMenu = function() {}; jqObject.show(); diff --git a/sites/all/modules/contrib/fields/autocomplete_deluxe/autocomplete_deluxe.module b/sites/all/modules/contrib/fields/autocomplete_deluxe/autocomplete_deluxe.module index d6aa529d..a1efa261 100644 --- a/sites/all/modules/contrib/fields/autocomplete_deluxe/autocomplete_deluxe.module +++ b/sites/all/modules/contrib/fields/autocomplete_deluxe/autocomplete_deluxe.module @@ -27,7 +27,7 @@ function autocomplete_deluxe_field_widget_info() { /** * Custom taxonomy callback, which also accepts an empty string search. */ -function taxonomy_autocomplete_deluxe($field_name, $tags_typed = '', $limit = 10) { +function autocomplete_deluxe_taxonomy_callback($field_name, $tags_typed = '', $limit = 10) { $field = field_info_field($field_name); $use_synonyms = !empty($_GET['synonyms']); @@ -163,6 +163,12 @@ function autocomplete_deluxe_field_widget_settings_form($field, $instance) { '#default_value' => isset($settings['delimiter']) ? $settings['delimiter'] : '', '#size' => 1, ); + $form['not_found_message'] = array( + '#type' => 'textfield', + '#title' => t('Term not found message.'), + '#description' => t('A message text which will be displayed, if the entered term was not found.'), + '#default_value' => isset($settings['not_found_message']) ? $settings['not_found_message'] : "The term '@term' will be added.", + ); if (module_exists('synonyms')) { $form['use_synonyms'] = array( @@ -219,6 +225,7 @@ function autocomplete_deluxe_field_widget_form(&$form, &$form_state, $field, $in '#min_length' => isset($instance['widget']['settings']['min_length']) ? $instance['widget']['settings']['min_length'] : 0, '#use_synonyms' =>isset($instance['widget']['settings']['use_synonyms']) ? $instance['widget']['settings']['use_synonyms'] : 0, '#delimiter' =>isset($instance['widget']['settings']['delimiter']) ? $instance['widget']['settings']['delimiter'] : '', + '#not_found_message' =>isset($instance['widget']['settings']['not_found_message']) ? $instance['widget']['settings']['not_found_message'] : "The term '@term' will be added.", ); $multiple = $field['cardinality'] > 1 || $field['cardinality'] == FIELD_CARDINALITY_UNLIMITED ? TRUE : FALSE; @@ -276,6 +283,7 @@ function autocomplete_deluxe_element_process($element) { 'min_length' => isset($element['#min_length']) ? $element['#min_length'] : 0, 'use_synonyms' => isset($element['#use_synonyms']) ? $element['#use_synonyms'] : 0, 'delimiter' => isset($element['#delimiter']) ? $element['#delimiter'] : '', + 'not_found_message' => isset($element['#not_found_message']) ? $element['#not_found_message'] : "The term '@term' will be added.", ); if (isset($element['#autocomplete_deluxe_path'])) { @@ -384,7 +392,7 @@ function autocomplete_deluxe_element_info() { function autocomplete_deluxe_menu() { $items['autocomplete_deluxe/taxonomy'] = array( 'title' => 'Autocomplete deluxe taxonomy', - 'page callback' => 'taxonomy_autocomplete_deluxe', + 'page callback' => 'autocomplete_deluxe_taxonomy_callback', 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); diff --git a/sites/all/modules/contrib/fields/cck_phone/cck_phone.css b/sites/all/modules/contrib/fields/cck_phone/cck_phone.css index 7dd8b9fc..dda03b50 100644 --- a/sites/all/modules/contrib/fields/cck_phone/cck_phone.css +++ b/sites/all/modules/contrib/fields/cck_phone/cck_phone.css @@ -17,4 +17,4 @@ .cck-phone-settings .cck-phone-default-country { background: #eee; font-weight: bold; -} \ No newline at end of file +} diff --git a/sites/all/modules/contrib/fields/cck_phone/cck_phone.feeds.inc b/sites/all/modules/contrib/fields/cck_phone/cck_phone.feeds.inc new file mode 100644 index 00000000..d17082f3 --- /dev/null +++ b/sites/all/modules/contrib/fields/cck_phone/cck_phone.feeds.inc @@ -0,0 +1,67 @@ + $instance) { + $info = field_info_field($name); + if ($info['type'] == 'phone_number') { + $targets[$name .':country_codes'] = array( + 'name' => t('!label - country code', array('!label' => check_plain($instance['label']))), + 'callback' => 'cck_phone_feeds_set_target', + 'description' => t('The @label field.', array('@label' => $instance['label'])), + ); + $targets[$name .':number'] = array( + 'name' => t('!label - phone number', array('!label' => check_plain($instance['label']))), + 'callback' => 'cck_phone_feeds_set_target', + 'description' => t('The @label field.', array('@label' => $instance['label'])), + ); + $targets[$name .':extension'] = array( + 'name' => t('!label - extension', array('!label' => check_plain($instance['label']))), + 'callback' => 'cck_phone_feeds_set_target', + 'description' => t('The @label field.', array('@label' => $instance['label'])), + ); + } + } +} + +/** + * Callback for feed mapping. + */ +function cck_phone_feeds_set_target($source, $entity, $target, $value) { + if (empty($value)) { + return; + } + + // Handle non-multiple value fields. + if (!is_array($value)) { + $value = array($value); + } + + // Iterate over all values. + $i = 0; + $info = field_info_field($target); + list($field_name, $sub_field) = explode(':', $target); + + // We will call this multiple times, preserve existing values. + $field = empty($entity->{$field_name}) ? array() : $entity->{$field_name}; + + foreach ($value as $v) { + if ($sub_field == 'country_codes') { + $v = strtolower($v); + } + if (!is_array($v) && !is_object($v)) { + $field['und'][$i][$sub_field] = $v; + } + if ($info['cardinality'] == 1) { + break; + } + $i++; + } + $entity->{$field_name} = $field; +} diff --git a/sites/all/modules/contrib/fields/cck_phone/cck_phone.info b/sites/all/modules/contrib/fields/cck_phone/cck_phone.info index 02e21814..787db831 100644 --- a/sites/all/modules/contrib/fields/cck_phone/cck_phone.info +++ b/sites/all/modules/contrib/fields/cck_phone/cck_phone.info @@ -15,9 +15,9 @@ files[] = includes/phone.my.inc files[] = includes/phone.pl.inc files[] = includes/phone.us.inc -; Information added by drupal.org packaging script on 2012-03-02 +; Information added by packaging script on 2013-11-05 version = "7.x-1.x-dev" core = "7.x" project = "cck_phone" -datestamp = "1330689918" +datestamp = "1383621212" diff --git a/sites/all/modules/contrib/fields/cck_phone/cck_phone.js b/sites/all/modules/contrib/fields/cck_phone/cck_phone.js index ac988251..63a8af23 100644 --- a/sites/all/modules/contrib/fields/cck_phone/cck_phone.js +++ b/sites/all/modules/contrib/fields/cck_phone/cck_phone.js @@ -97,4 +97,4 @@ $('a.cck-phone-check').bind('click', Drupal.PhoneNumber.checkall); } }; -})(jQuery); \ No newline at end of file +})(jQuery); diff --git a/sites/all/modules/contrib/fields/cck_phone/cck_phone.module b/sites/all/modules/contrib/fields/cck_phone/cck_phone.module index d261f7ac..3208d7b0 100644 --- a/sites/all/modules/contrib/fields/cck_phone/cck_phone.module +++ b/sites/all/modules/contrib/fields/cck_phone/cck_phone.module @@ -34,7 +34,7 @@ function cck_phone_theme() { 'render element' => 'element', ), 'phone_number_extension' => array( - 'render element' => 'element', + 'variables' => array('extension' => NULL), ), 'cck_phone_formatter_global_phone_number' => array( 'variables' => array('element' => NULL), @@ -65,10 +65,68 @@ function cck_phone_field_info() { ), 'default_widget' => 'phone_number', 'default_formatter' => 'global_phone_number', + // Support hook_entity_property_info() from contrib "Entity API". + 'property_type' => 'field_item_phone_number', + 'property_callbacks' => array('cck_phone_field_property_info_callback'), ), ); } +/** + * Additional callback to adapt the property info of phone number fields. + * @see entity_metadata_field_entity_property_info(). + */ +function cck_phone_field_property_info_callback(&$info, $entity_type, $field, $instance, $field_type) { + $property = &$info[$entity_type]['bundles'][$instance['bundle']]['properties'][$field['field_name']]; + + // Define a data structure so it's possible constituent parts of field. + $property['getter callback'] = 'entity_metadata_field_verbatim_get'; + $property['setter callback'] = 'entity_metadata_field_verbatim_set'; + + // Auto-create the field item as soon as a property is set. + $property['auto creation'] = 'cck_phone_field_item_create'; + + $property['property info'] = cck_phone_field_item_property_info(); + $property['property info']['country_codes']['required'] = !$instance['settings']['enable_default_country']; + if (!$instance['settings']['enable_extension']) { + unset($property['property info']['extension']); + } + + unset($property['query callback']); +} + +/** + * Callback for creating a new, empty phone number field item. + * + * @see cck_phone_field_property_info_callback() + */ +function cck_phone_field_item_create() { + return array('number' => NULL); +} + + +/** + * Defines info for the properties of the phone number field item data structure. + */ +function cck_phone_field_item_property_info() { + $properties['number'] = array( + 'type' => 'text', + 'label' => t('The phone number.'), + 'setter callback' => 'entity_property_verbatim_set', + ); + $properties['country_codes'] = array( + 'type' => 'text', + 'label' => t('The country code for a given phone number.'), + 'setter callback' => 'entity_property_verbatim_set', + ); + $properties['extension'] = array( + 'type' => 'text', + 'label' => t('The extension for a given phone number.'), + 'setter callback' => 'entity_property_verbatim_set', + ); + return $properties; +} + /** * Implements hook_field_instance_settings_form(). */ @@ -255,8 +313,8 @@ function cck_phone_field_is_empty($item, $field) { /** * Theme function for phone extension. */ -function theme_phone_number_extension($element = '') { - return t(' ext. %extension', array('%extension' => $element['element'])); +function theme_phone_number_extension($variables) { + return '' . t('ext.') . ' ' . check_plain($variables['extension']); } /** @@ -267,7 +325,7 @@ function theme_cck_phone_formatter_global_phone_number($element) { // Display a global phone number with country code. if (!empty($element['number']) && !empty($element['country_codes'])) { - // Call country default formatter if exist + // Call country default formatter if exists. $custom_cc = _cck_phone_custom_cc(); if (isset($custom_cc[$element['country_codes']])) { $function = $element['country_codes'] . '_formatter_default'; @@ -276,15 +334,16 @@ function theme_cck_phone_formatter_global_phone_number($element) { } } - // Output a raw value if no custom formatter or formatter return empty + // Output a raw value if no custom formatter or formatter returns empty + // value. if (empty($phone)) { $cc = cck_phone_countrycodes($element['country_codes']); $phone = $cc['code'] . '-' . $element['number']; } - // Extension + // Extension. if (!empty($element['extension'])) { - $phone = $phone . theme('phone_number_extension', $element['extension']); + $phone = $phone . theme('phone_number_extension', $element); } } @@ -299,7 +358,7 @@ function theme_cck_phone_formatter_local_phone_number($element) { // Display a local phone number without country code. if (!empty($element['number'])) { - // Call country local formatter if exist + // Call country local formatter if exists. $custom_cc = _cck_phone_custom_cc(); if (isset($custom_cc[$element['country_codes']])) { $function = $element['country_codes'] . '_formatter_local'; @@ -308,14 +367,14 @@ function theme_cck_phone_formatter_local_phone_number($element) { } } - // Output a raw value if no custom formatter or formatter return empty + // Output a raw value if no custom formatter or formatter return empty. if (empty($phone)) { $phone = $element['number']; } - // Extension + // Extension. if (!empty($element['extension'])) { - $phone = $phone . theme('phone_number_extension', $element['extension']); + $phone = $phone . theme('phone_number_extension', $element); } } @@ -352,6 +411,7 @@ function _cck_phone_cc_options($show_custom = FALSE, $country_selection = array( $options[$cc] = check_plain($cc_name); } + asort($options); return $options; } @@ -632,6 +692,9 @@ function cck_phone_field_widget_process($element, &$form_state, $form) { '#required' => FALSE, '#default_value' => isset($item['extension']) ? $item['extension'] : NULL, '#weight' => 2, + '#attributes' => array( + 'class' => array('extension'), + ), ); } @@ -688,6 +751,9 @@ function cck_phone_phone_number_process($element, &$form_state, $form) { ) ), '#weight' => 0, + '#attributes' => array( + 'class' => array('phone-number'), + ), ); // If only one country code, make it as hidden form item @@ -705,6 +771,9 @@ function cck_phone_phone_number_process($element, &$form_state, $form) { '#type' => 'item', '#markup' => $value = $cc['country'] . ' (' . $cc['code'] . ')', '#weight' => ($settings['country_code_position'] == 'after' ? 1 : -1), + '#attributes' => array( + 'class' => array('country-code'), + ), ); } } @@ -716,6 +785,9 @@ function cck_phone_phone_number_process($element, &$form_state, $form) { // '#title' => 'Country code', '#options' => _cck_phone_cc_options(), '#weight' => ($settings['country_code_position'] == 'after' ? 1 : -1), + '#attributes' => array( + 'class' => array('country-code'), + ), ); } diff --git a/sites/all/modules/contrib/fields/cck_phone/cck_phone_countrycodes.inc b/sites/all/modules/contrib/fields/cck_phone/cck_phone_countrycodes.inc index 478839b0..bc7085e3 100644 --- a/sites/all/modules/contrib/fields/cck_phone/cck_phone_countrycodes.inc +++ b/sites/all/modules/contrib/fields/cck_phone/cck_phone_countrycodes.inc @@ -266,4 +266,4 @@ function cck_phone_countrycodes($cc = NULL) { } return FALSE; -} \ No newline at end of file +} diff --git a/sites/all/modules/contrib/fields/computed_field/computed_field.info b/sites/all/modules/contrib/fields/computed_field/computed_field.info index 8f84bcfe..cc62655d 100644 --- a/sites/all/modules/contrib/fields/computed_field/computed_field.info +++ b/sites/all/modules/contrib/fields/computed_field/computed_field.info @@ -5,9 +5,9 @@ dependencies[] = field package = Fields files[]=computed_field.install files[]=computed_field.module -; Information added by drupal.org packaging script on 2012-02-02 -version = "7.x-1.0-beta1" +; Information added by packaging script on 2013-12-03 +version = "7.x-1.0" core = "7.x" project = "computed_field" -datestamp = "1328217338" +datestamp = "1386094705" diff --git a/sites/all/modules/contrib/fields/computed_field/computed_field.module b/sites/all/modules/contrib/fields/computed_field/computed_field.module index a7b82e5c..2236be1b 100644 --- a/sites/all/modules/contrib/fields/computed_field/computed_field.module +++ b/sites/all/modules/contrib/fields/computed_field/computed_field.module @@ -64,7 +64,7 @@ function computed_field_field_settings_form($field, $instance, $has_data) { $settings = $field['settings']; $form['#element_validate'] = array('computed_field_field_settings_form_validate'); - + $form['code'] = array( '#type' => 'textarea', '#rows' => 15, @@ -89,7 +89,7 @@ function computed_field_field_settings_form($field, $instance, $has_data) { $form['display_format'] = array( '#type' => 'textarea', '#title' => t('Display Code (PHP)'), - '#description' => t('This code should assign a string to the @display_output variable, which will be printed when the field is displayed. The raw computed value of the field is in @value. Note: this code has no effect if you use the "Raw computed value" display formatter.

    Alternately, this code can be supplied by your own custom function named: @display_func($field, $entity_field_item, $entity_lang, $langcode). Return the value to be displayed. Original value is in $entity_field_item[\'value\'].', + '#description' => t('This code should assign a string to the @display_output variable, which will be printed when the field is displayed. The raw computed value of the field is in @value. Note: this code has no effect if you use the "Raw computed value" display formatter.

    Alternately, this code can be supplied by your own custom function named: @display_func($field, $entity_field_item, $entity_lang, $langcode, $entity). Return the value to be displayed. Original value is in $entity_field_item[\'value\'].', array('@display_output' => '$display_output', '@value' => '$entity_field_item[\'value\']', '@display_func' => $display_func)), @@ -110,7 +110,7 @@ function computed_field_field_settings_form($field, $instance, $has_data) { '#disabled' => $has_data, ); $form['database'] = array('#type' => 'fieldset', '#title' => t('Database Storage Settings')); - + if ($has_data) { $form['database']['warning'] = array( '#type' => 'item', @@ -320,13 +320,13 @@ function computed_field_field_formatter_view($entity_type, $entity, $field, $ins $display_func = 'computed_field_' . $field['field_name'] . '_display'; if (function_exists($display_func)) $display_in_code = TRUE; else $display_in_code = FALSE; - + // Loop the items to display foreach ($items as $delta => $item) { - + // For "some" backwards compatibility $entity_field_item = $item; - + // Setup a variable with the entity language if available if (isset($entity->language)) $entity_lang = $entity->language; else $entity_lang = LANGUAGE_NONE; @@ -338,12 +338,12 @@ function computed_field_field_formatter_view($entity_type, $entity, $field, $ins // Execute the display code $display_output = NULL; if ($display_in_code) { - $display_output = $display_func($field, $entity_field_item, $entity_lang, $langcode); + $display_output = $display_func($field, $entity_field_item, $entity_lang, $langcode, $entity); } else { eval($field['settings']['display_format']); } - + // Output the formatted display item switch ($display['type']) { case 'computed_field_unsanitized': @@ -371,78 +371,6 @@ function computed_field_field_is_empty($item, $field) { return empty($item['value']); } -/** - * Implements hook_token_info(). - */ -function computed_field_token_info() { - $types['computed'] = array( - 'name' => t("Computed"), - 'description' => t("Tokens related to Computed fields."), - 'needs-data' => 'node', - ); - $fields = field_info_fields(); - $node = array(); - $computed = array(); - foreach ($fields as $field_name => $field) { - if ($field['module'] == "computed_field") { - $node[str_replace('_', '-', $field_name)] = array( - 'name' => t("Computed: %field_name", array('%field_name' => $field_name)), - 'description' => t("Computed field %field_name value.", array('%field_name' => $field_name)), - 'type' => 'computed', - ); - $computed['rawvalue'] = array( - 'name' => t("Raw computed value"), - 'description' => t("Computed field %field_name raw value.", array('%field_name' => $field_name)), - ); - } - } - if (!empty($computed)) { - return array( - 'types' => $types, - 'tokens' => array('node' => $node, 'computed' => $computed), - ); - } -} - -/** - * Implements hook_tokens(). - */ -function computed_field_tokens($type, $tokens, array $data = array(), array $options = array()) { - $computed_fields = array(); - $replacements = array(); - $sanitize = !empty($options['sanitize']); - $lang = isset($options['language']->language) ? $options['language']->language : LANGUAGE_NONE; - $fields = field_info_fields(); - foreach ($fields as $field_name => $field) { - if ($field['module'] == "computed_field") { - $computed_fields[] = str_replace('_', '-', $field_name); - } - } - foreach ($tokens as $name => $original) { - // For normal display output - if (in_array($name, $computed_fields)) { - $field_name = str_replace('-', '_', $name); - $entity_field_item = $data[$type]->{$field_name}[$lang][0]; - $field = $fields[$field_name]; - // Check if the value is to be formatted by a display function outside the DB - $display_func = 'computed_field_' . $field_name . '_display'; - if (function_exists($display_func)) { - $display_output = $display_func($field, $entity_field_item); - } - else { - eval($field['settings']['display_format']); - } - $replacements[$original] = $sanitize ? check_plain($display_output) : $display_output; - } - // For raw value output - elseif (in_array(str_replace(':rawvalue', '', $name), $computed_fields)) { - $field_name = str_replace('-', '_', str_replace(':rawvalue', '', $name)); - $replacements[$original] = $sanitize ? check_plain($data[$type]->{$field_name}[$lang][0]['value']) : $data[$type]->{$field_name}[$lang][0]['value']; - } - } - return $replacements; -} - /** * Private function to compute the fields value. */ @@ -451,11 +379,11 @@ function _computed_field_compute_value($entity_type, $entity, $field, $instance, // Setup a variable with the field values $entity_field =& $items; - + // Setup a variable with the entity language if available if (isset($entity->language)) $entity_lang = $entity->language; else $entity_lang = LANGUAGE_NONE; - + // Allow the value to be computed from code not stored in DB $compute_func = 'computed_field_' . $field['field_name'] . '_compute'; if (function_exists($compute_func)) { @@ -467,3 +395,4 @@ function _computed_field_compute_value($entity_type, $entity, $field, $instance, } } } + diff --git a/sites/all/modules/contrib/fields/serial/serial.inc b/sites/all/modules/contrib/fields/serial/serial.inc index 917149fb..cb3dec23 100644 --- a/sites/all/modules/contrib/fields/serial/serial.inc +++ b/sites/all/modules/contrib/fields/serial/serial.inc @@ -114,16 +114,16 @@ function _serial_get_table_schema() { 'not null' => TRUE, 'description' => 'The atomic serial field.', ), - 'nid' => array( - 'type' => 'int', - 'unsigned' => TRUE, + 'uniqid' => array( + 'description' => 'Unique temporary allocation Id.', + 'type' => 'varchar', + 'length' => 23, 'not null' => TRUE, - 'description' => 'Id of the owner node.', - ), + 'default' => ''), ), 'primary key' => array('sid'), 'unique keys' => array( - 'nid' => array('nid'), + 'uniqid' => array('uniqid'), ), ); } @@ -142,29 +142,30 @@ function _serial_get_table_schema() { * @return * the unique serial value number. */ -function _serial_generate_value($nid, $bundle, $field_name, $delete = TRUE) { +function _serial_generate_value($bundle, $field_name, $delete = TRUE) { // Get the name of the relevant table. $table = _serial_get_table_name($bundle, $field_name); - // Create a temporary record for this node and retrieve the serial value. + // Insert a temporary record to get a new unique serial value. + $uniqid = uniqid('', TRUE); $sid = db_insert($table) ->fields(array( - 'nid' => $nid, + 'uniqid' => $uniqid, )) ->execute(); // If there's a reason why it's come back undefined, reset it. $sid = isset($sid) ? $sid : 0; - // Delete old temporary records: + // Delete the temporary record. if ($delete && ($sid % 10) == 0) { - db_delete($table) - ->condition('nid', $nid, '<') - ->execute(); + db_delete($table) + ->condition('uniqid', $uniqid, '=') + ->execute(); } - // Return the new unique serial value: + // Return the new unique serial value. return $sid; } @@ -189,22 +190,28 @@ function _serial_init_old_nodes($bundle, $field_name) { foreach ($result as $node) { $nid = $node->nid; $node = node_load($nid); - $sid = _serial_generate_value($nid, $bundle, $field_name, FALSE); + $sid = _serial_generate_value($bundle, $field_name, FALSE); $node->{$field_name} = array('und' => array(array('value' => $sid))); node_save($node); - $last_nid = $nid; $count++; } - // Delete temporary records (except the last): - if (isset($last_nid)) { - $serial_table = _serial_get_table_name($bundle, $field_name); - db_delete($serial_table) - ->condition('nid', $last_nid, '<') - ->execute(); - } - // Return the number of existing nodes that have been initialized: return $count; } +/** + * Retrieves all the managed serial fields. + * + * @return result set containing pairs of (node type name, field name). + */ +function _serial_get_all_fields() { + $query = db_select('field_config', 'f'); + $query->join('field_config_instance', 'i', 'i.field_name = f.field_name'); + $query->fields('i', array('bundle', 'field_name')) + ->condition('f.type', 'serial', '=') + ->condition('i.deleted', 0, '='); + $result = $query->execute(); + return $result->fetchAll(); +} + diff --git a/sites/all/modules/contrib/fields/serial/serial.info b/sites/all/modules/contrib/fields/serial/serial.info index f4056db2..56dfddd7 100644 --- a/sites/all/modules/contrib/fields/serial/serial.info +++ b/sites/all/modules/contrib/fields/serial/serial.info @@ -6,9 +6,9 @@ dependencies[] = field files[] = serial.module -; Information added by drupal.org packaging script on 2011-11-05 -version = "7.x-1.2" +; Information added by drupal.org packaging script on 2013-10-15 +version = "7.x-1.3" core = "7.x" project = "serial" -datestamp = "1320468935" +datestamp = "1381844527" diff --git a/sites/all/modules/contrib/fields/serial/serial.install b/sites/all/modules/contrib/fields/serial/serial.install index b555dce8..18e72bfe 100644 --- a/sites/all/modules/contrib/fields/serial/serial.install +++ b/sites/all/modules/contrib/fields/serial/serial.install @@ -6,7 +6,7 @@ */ /** - * Implementation of hook_uninstall(). + * Implements hook_uninstall(). */ function serial_uninstall() { /* @@ -37,7 +37,7 @@ function serial_field_schema($field) { } /** - * Implementation of hook_schema(). + * Implements hook_schema(). */ function serial_schema() { // Get the standard schema: @@ -46,10 +46,7 @@ function serial_schema() { // Build the schema by iteration over all the serial field instances: $schema = array(); - $query = "SELECT i.bundle AS bundle, f.field_name AS field_name ". - "FROM {field_config} f, {field_config_instance} i ". - "WHERE f.field_name = i.field_name AND f.type = 'serial' AND i.deleted = 0"; - $result = db_query($query); + $result = _serial_get_all_fields(); foreach ($result as $field) { $table = _serial_get_table_name($field->bundle, $field->field_name); $schema[$table] = $table_schema; @@ -59,3 +56,31 @@ function serial_schema() { return $schema; } +/** + * Upgrade path. + * + * Switches from nids to uniqid. + */ +function serial_update_7130() { + // Get the new field schema. + module_load_include('inc', 'serial'); + $table_schema = _serial_get_table_schema(); + $uniqid_schema = $table_schema['fields']['uniqid']; + + // Update the schema of old assistant tables. + $result = _serial_get_all_fields(); + foreach ($result as $field) { + // Empty the table. + $table = _serial_get_table_name($field->bundle, $field->field_name); + db_delete($table)->execute(); + + // Drop nid field and key + db_drop_field($table, 'nid'); + db_drop_unique_key($table, 'nid'); + + // Add uniqid field and key + db_add_field($table, 'uniqid', $uniqid_schema); + db_add_unique_key($table, 'uniqid', array('uniqid')); + } +} + diff --git a/sites/all/modules/contrib/fields/serial/serial.module b/sites/all/modules/contrib/fields/serial/serial.module index 6331866f..688bb101 100644 --- a/sites/all/modules/contrib/fields/serial/serial.module +++ b/sites/all/modules/contrib/fields/serial/serial.module @@ -10,7 +10,7 @@ //==================// /** - * Implementation of hook_field_info(). + * Implements hook_field_info(). */ function serial_field_info() { return array( @@ -24,7 +24,7 @@ function serial_field_info() { } /** - * Implementation of hook_field_create_instance(). + * Implements hook_field_create_instance(). */ function serial_field_create_instance($instance) { $field = field_read_field($instance['field_name']); @@ -45,7 +45,7 @@ function serial_field_create_instance($instance) { } /** - * Implementation of hook_field_delete_instance(). + * Implements hook_field_delete_instance(). */ function serial_field_delete_instance($instance) { $field = field_read_field($instance['field_name']); @@ -57,7 +57,7 @@ function serial_field_delete_instance($instance) { } /** - * Implementation of hook_form_alter(). + * Implements hook_form_alter(). */ function serial_form_alter(&$form, $form_state, $form_id) { @@ -76,37 +76,50 @@ function serial_form_alter(&$form, $form_state, $form_id) { } /** - * Implementation of hook_field_insert(). + * Implements hook_field_presave(). */ -function serial_field_insert($entity_type, $entity, $field, $instance, $langcode, &$items) { - module_load_include('inc', 'serial'); - $sid = _serial_generate_value($entity->nid, $instance['bundle'], $field['field_name']); +function serial_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) { + module_load_include('inc', 'serial'); + if (empty($items)) { + $sid = _serial_generate_value($instance['bundle'], $field['field_name']); $items = array(array('value' => $sid)); - $entity->$field['field_name'] = $items; + } } + /** - * Implementation of hook_field_is_empty(). + * Implements hook_field_is_empty(). */ function serial_field_is_empty($item, $field) { return FALSE; // never should be treated as empty } /** - * Implementation of hook_node_type_update() + * Implements hook_node_presave(). + */ +function serial_node_presave($node) { + if (module_exists('auto_nodetitle')) { + if (auto_nodetitle_get_setting($node->type)) { + auto_nodetitle_set_title($node); + } + } +} + +/** + * Implements hook_node_type_update(). */ function serial_node_type_update($info) { - // Handle content type rename: - if (isset($info->old_type) && ($info->old_type != $info->type)) { - module_load_include('inc', 'serial'); - _serial_rename_tables($info->old_type, $info->type); - } + // Handle content type rename: + if (isset($info->old_type) && ($info->old_type != $info->type)) { + module_load_include('inc', 'serial'); + _serial_rename_tables($info->old_type, $info->type); + } } // Tokens for fields are currently not supported - http://drupal.org/node/691078. ///** -// * Implementation of hook_token_info(). +// * Implements hook_token_info(). // */ //function serial_token_info() { // $type = array( @@ -126,7 +139,7 @@ function serial_node_type_update($info) { //} // ///** -// * Implementation of hook_tokens(). +// * Implements hook_tokens(). // */ //function serial_tokens($type, $tokens, $data, $options) { // // TODO @@ -137,7 +150,7 @@ function serial_node_type_update($info) { //=================// /** - * Implementation of hook_field_formatter_info(). + * Implements hook_field_formatter_info(). */ function serial_field_formatter_info() { return array( @@ -165,12 +178,12 @@ function serial_field_formatter_view($entity_type, $entity, $field, $instance, $ return $element; } -/**************************************************************************** - ** Theme Functions ********************************************************* -/****************************************************************************/ +/** + * Theme Functions + */ /** - * Implementation of hook_theme(). + * Implements hook_theme(). */ function serial_theme() { @@ -196,7 +209,7 @@ function theme_serial_formatter_default($variables) { //==============// /** - * Implementation of hook_field_widget_info(). + * Implements hook_field_widget_info(). */ function serial_field_widget_info() { return array( @@ -208,7 +221,7 @@ function serial_field_widget_info() { } /** - * Implementation of hook_field_widget(). + * Implements hook_field_widget(). */ function serial_field_widget(&$form, &$form_state, $field, $instance, $items, $delta = 0) { return array( diff --git a/sites/all/modules/contrib/fields/title/CHANGELOG.txt b/sites/all/modules/contrib/fields/title/CHANGELOG.txt index be009c24..99d610a9 100644 --- a/sites/all/modules/contrib/fields/title/CHANGELOG.txt +++ b/sites/all/modules/contrib/fields/title/CHANGELOG.txt @@ -1,6 +1,17 @@ Title 7.x-1.x, xxxx-xx-xx ------------------------- +#2286147 by plach: Language fallback does not work when an entity translation is + unpublished. +#2286145 by plach: Prevent empty translations from being synced into the legacy field. +#1772116 by duellj, GaëlG | f4o: Fixed Menu link title is not getting node title + by default. +#1779268 by ndobromirov | brycesenz: Undefined index: field_name in + title_field_views_data_alter(). +#1441224 by MiroslavBanov | OPIN: Fieldgroup and Title break Manage Fields UI. +#1980520 by StoraH, pbz1912: Fixed Empty wrapper tags. +#1920096 by Johnny vd Laar | GiorgosK: Fixed Title incompatibility with the Term + reference widget #1991712 by milesw: Fixed Title displays wrong revision using Revisioning module. #1907078 by sylus: Fixed Undefined index: field_name() in diff --git a/sites/all/modules/contrib/fields/title/MAINTAINERS.txt b/sites/all/modules/contrib/fields/title/MAINTAINERS.txt new file mode 100644 index 00000000..f20ad650 --- /dev/null +++ b/sites/all/modules/contrib/fields/title/MAINTAINERS.txt @@ -0,0 +1,13 @@ + +Title is built and maintained by the Drupal project community. +Everyone is encouraged to submit issues and changes (patches) to improve it, and +to contribute in other ways -- see http://drupal.org/contribute to find out how. + +Project maintainers +------------------- + +The Title maintainers oversee the development of the project as a whole. The project +maintainers for Title are: + +- Francesco Placella 'plach' , branch 7.x-1.x +- Sam Becker 'Sam152' , branch 8.x-2.x diff --git a/sites/all/modules/contrib/fields/title/tests/title_test.info b/sites/all/modules/contrib/fields/title/tests/title_test.info index 5cb830dd..b8ec037b 100644 --- a/sites/all/modules/contrib/fields/title/tests/title_test.info +++ b/sites/all/modules/contrib/fields/title/tests/title_test.info @@ -7,9 +7,9 @@ dependencies[] = title dependencies[] = entity dependencies[] = entity_translation -; Information added by drupal.org packaging script on 2013-07-24 -version = "7.x-1.0-alpha7+5-dev" +; Information added by Drupal.org packaging script on 2015-03-23 +version = "7.x-1.0-alpha7+14-dev" core = "7.x" project = "title" -datestamp = "1374690078" +datestamp = "1427069882" diff --git a/sites/all/modules/contrib/fields/title/title.admin.inc b/sites/all/modules/contrib/fields/title/title.admin.inc index 9cb00653..380cabe1 100644 --- a/sites/all/modules/contrib/fields/title/title.admin.inc +++ b/sites/all/modules/contrib/fields/title/title.admin.inc @@ -14,20 +14,16 @@ function title_form_field_ui_overview(&$form, &$form_state) { if (!empty($entity_info['field replacement'])) { $field_replacement_info = $entity_info['field replacement']; $admin_path = _field_ui_bundle_admin_path($form['#entity_type'], $form['#bundle']); - $form['fields']['#header'][6]['colspan'] += 1; foreach (element_children($form['fields']) as $field_name) { if (isset($field_replacement_info[$field_name])) { - $form['fields'][$field_name]['field_replacement'] = array( + $form['fields'][$field_name]['delete'] = array( '#type' => 'link', '#title' => t('replace'), '#href' => $admin_path . '/fields/replace/' . $field_name, '#options' => array('attributes' => array('title' => t('Replace %field with a customizable field instance that can be translated.', array('%field' => $field_name)))), ); } - else { - $form['fields'][$field_name]['field_replacement'] = array(); - } } } } diff --git a/sites/all/modules/contrib/fields/title/title.field.inc b/sites/all/modules/contrib/fields/title/title.field.inc index 1a6149d3..76c4eb99 100644 --- a/sites/all/modules/contrib/fields/title/title.field.inc +++ b/sites/all/modules/contrib/fields/title/title.field.inc @@ -98,35 +98,37 @@ function title_field_formatter_settings_summary($field, $instance, $view_mode) { function title_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) { $settings = $display['settings']; $output = isset($items[0]) ? $items[0]['safe_value'] : ''; + $element = array(); - if (!empty($output) && $settings['title_link'] == 'content') { - $uri = entity_uri($entity_type, $entity); - $output = l($output, $uri['path'], array('html' => TRUE)); - } - - $wrap_tag = empty($settings['title_style']) ? '_none' : $settings['title_style']; - - if ($wrap_tag != '_none') { - $variables = array( - 'element' => array( - '#tag' => $wrap_tag, - '#value' => $output, - ), - ); - - if (!empty($settings['title_class'])) { - $variables['element']['#attributes'] = array('class' => $settings['title_class']); + if (!empty($output)) { + if ($settings['title_link'] == 'content') { + $uri = entity_uri($entity_type, $entity); + $output = l($output, $uri['path'], array('html' => TRUE)); } - $output = theme('html_tag', $variables); + $wrap_tag = empty($settings['title_style']) ? '_none' : $settings['title_style']; + + if ($wrap_tag != '_none') { + $variables = array( + 'element' => array( + '#tag' => $wrap_tag, + '#value' => $output, + ), + ); + + if (!empty($settings['title_class'])) { + $variables['element']['#attributes'] = array('class' => $settings['title_class']); + } + + $output = theme('html_tag', $variables); + } + + $element = array( + array( + '#markup' => $output, + ), + ); } - - $element = array( - array( - '#markup' => $output, - ), - ); - return $element; } diff --git a/sites/all/modules/contrib/fields/title/title.info b/sites/all/modules/contrib/fields/title/title.info index 24317bdc..8222bb72 100644 --- a/sites/all/modules/contrib/fields/title/title.info +++ b/sites/all/modules/contrib/fields/title/title.info @@ -9,9 +9,9 @@ files[] = title.module files[] = views/views_handler_title_field.inc files[] = tests/title.test -; Information added by drupal.org packaging script on 2013-07-24 -version = "7.x-1.0-alpha7+5-dev" +; Information added by Drupal.org packaging script on 2015-03-23 +version = "7.x-1.0-alpha7+14-dev" core = "7.x" project = "title" -datestamp = "1374690078" +datestamp = "1427069882" diff --git a/sites/all/modules/contrib/fields/title/title.module b/sites/all/modules/contrib/fields/title/title.module index 560acd1b..ee53c42f 100644 --- a/sites/all/modules/contrib/fields/title/title.module +++ b/sites/all/modules/contrib/fields/title/title.module @@ -218,6 +218,9 @@ function title_field_attach_load($entity_type, $entities, $age, $options) { * replaced fields. */ function title_entity_load($entities, $type) { + // Load entity translations otherwise field language will not be computed + // correctly. + module_invoke('entity_translation', 'entity_load', $entities, $type); foreach ($entities as &$entity) { // Synchronize values from the regular field unless we are intializing it. title_entity_sync($type, $entity, NULL, !empty($GLOBALS['title_field_replacement_init'])); @@ -487,8 +490,14 @@ function title_field_sync_get($entity_type, $entity, $legacy_field, $info, $lang $langcode = field_language($entity_type, $entity, $info['field']['field_name'], $langcode); $values = $info['callbacks']['sync_get']($entity_type, $entity, $legacy_field, $info, $langcode); foreach ($values as $name => $value) { - $entity->{$name} = $value; + if ($value !== NULL) { + $entity->{$name} = $value; + } } + // Ensure we do not pollute field language static cache. + $cache = &drupal_static('field_language'); + list($id, ,) = entity_extract_ids($entity_type, $entity); + unset($cache[$entity_type][$id]); } } @@ -584,6 +593,11 @@ function title_field_attach_form($entity_type, $entity, &$form, &$form_state, $l if (isset($form[$legacy_field]['#access'])) { $form[$info['field']['field_name']]['#access'] = $form[$legacy_field]['#access']; } + + // Add class from legacy field so behaviors can still be applied on + // title widget. + $form[$info['field']['field_name']]['#attributes']['class'] = array('form-item-' . $legacy_field); + // Restrict access to the legacy field form element and mark it as // replaced. $form[$legacy_field]['#access'] = FALSE; @@ -952,3 +966,38 @@ function title_field_attach_create_bundle($entity_type, $bundle) { } } } + +/** + * Implements hook_field_info_alter(). + */ +function title_field_info_alter(&$info) { + $supported_types = array('taxonomy_term_reference' => TRUE); + foreach ($info as $field_type => &$field_type_info) { + if (isset($supported_types[$field_type])) { + if (!isset($field_type_info['settings'])) { + $field_type_info['settings'] = array(); + } + $field_type_info['settings'] += array('options_list_callback' => 'title_taxonomy_allowed_values'); + } + } +} + +/** + * Return taxonomy term values for taxonomy reference fields. + */ +function title_taxonomy_allowed_values($field) { + $bundle = !empty($field['settings']['allowed_values'][0]['vocabulary']) ? $field['settings']['allowed_values'][0]['vocabulary'] : NULL; + if ($bundle && ($label = title_field_replacement_get_label_field('taxonomy_term', $bundle))) { + $options = array(); + foreach ($field['settings']['allowed_values'] as $tree) { + $vocabulary = taxonomy_vocabulary_machine_name_load($tree['vocabulary']); + if ($vocabulary && ($terms = taxonomy_get_tree($vocabulary->vid, $tree['parent'], NULL, TRUE))) { + foreach ($terms as $term) { + $options[$term->tid] = str_repeat('-', $term->depth) . entity_label('taxonomy_term', $term); + } + } + } + return $options; + } + return taxonomy_allowed_values($field); +} diff --git a/sites/all/modules/contrib/fields/title/views/title.views.inc b/sites/all/modules/contrib/fields/title/views/title.views.inc index f973d9f7..7dd5145a 100644 --- a/sites/all/modules/contrib/fields/title/views/title.views.inc +++ b/sites/all/modules/contrib/fields/title/views/title.views.inc @@ -9,10 +9,12 @@ function title_field_views_data_alter(&$data) { $replacements = title_field_replacement_info($entity_type); if ($replacements) { foreach ($replacements as $replacement) { - $field = field_info_field($replacement['field']['field_name']); - $table = _field_sql_storage_tablename($field); - if (isset($data[$table][$field['field_name']])) { - $data[$table][$field['field_name']]['field']['handler'] = 'views_handler_title_field'; + if (isset($replacement['field']['field_name'])) { + $field = field_info_field($replacement['field']['field_name']); + $table = _field_sql_storage_tablename($field); + if (isset($data[$table][$field['field_name']])) { + $data[$table][$field['field_name']]['field']['handler'] = 'views_handler_title_field'; + } } } } diff --git a/sites/all/modules/contrib/fields/video_embed_field/img/vimeo.jpg b/sites/all/modules/contrib/fields/video_embed_field/img/vimeo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dd7056584b19eb7866eb63fa5b4c2880545d02b2 GIT binary patch literal 14783 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 literal 0 HcmV?d00001 diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/README.txt b/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/README.txt new file mode 100644 index 00000000..2deae7f3 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/README.txt @@ -0,0 +1,5 @@ +Brightcove Video Embed Field +---------------------------- +This module parses a Brightcove URL via the Video Embed Field + +Example URL: http://link.brightcove.com/services/player/bcpid3303744435001?bckey=AQ~~,AAAAAGL7jok~,vslbwQw3pdWM_Ya9IsUVNvJJIhV9YG1S&bctid=3118695475001 diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/img/brightcove.jpg b/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/img/brightcove.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d72cdca7de823e318fafc047b4b8380b2bb5a3b7 GIT binary patch literal 77996 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 Y15&n`X8-^I literal 0 HcmV?d00001 diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.info b/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.info new file mode 100644 index 00000000..b9eafdd2 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.info @@ -0,0 +1,14 @@ +name = "Video Embed Brightcove" +description = "Provides Brightcove handler for Video Embed Fields." +core = 7.x +package = Media +configure = admin/config/media/vef_video_styles + +dependencies[] = "video_embed_field" + +; Information added by Drupal.org packaging script on 2015-04-17 +version = "7.x-2.0-beta8+7-dev" +core = "7.x" +project = "video_embed_field" +datestamp = "1429278491" + diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.module b/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.module new file mode 100644 index 00000000..0ba0e0c9 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.module @@ -0,0 +1,159 @@ + 'Brightcove Video', + 'function' => 'video_embed_brightcove_handle_video', + 'thumbnail_default' => drupal_get_path('module', 'video_embed_brightcove') . '/img/brightcove.jpg', + 'form' => 'video_embed_brightcove_form', + 'form_validate' => 'video_embed_field_handler_brightcove_form_validate', + 'domains' => array( + 'brightcove.com', + 'link.brightcove.com', + ), + 'defaults' => array( + 'width' => 640, + 'height' => 360, + ), + ); + + return $handlers; +} + +/** + * Form to configure out video settings. + * + * @param array $defaults + * Values for your provider. + * + * @return array + * A form as defined by form API. + */ +function video_embed_brightcove_form($defaults) { + $form = array(); + // Element for the width of the player. + $form['width'] = array( + '#type' => 'textfield', + '#title' => t('Player Width'), + '#description' => t('The width of the player.'), + '#default_value' => $defaults['width'], + ); + + // Element for the height of the player. + $form['height'] = array( + '#type' => 'textfield', + '#title' => t('Player Height'), + '#description' => t('The height of the player.'), + '#default_value' => $defaults['height'], + ); + + return $form; +} + +/** + * Validates the form elements for the Brightcove configuration form. + */ +function video_embed_field_handler_brightcove_form_validate($element, &$form_state, $form) { + video_embed_field_validate_dimensions($element); +} + +/** + * The video handler. + * + * @param string $url + * The full video url. + * @param array $settings + * Handlers settings from the settings form. + * + * @return array|string + * The embed code for the video. + */ +function video_embed_brightcove_handle_video($url, $settings) { + $parameters = _video_embed_brightcove_get_video_properties($url); + + if (isset($parameters['id']) && isset($parameters['key'])) { + // Embed code. + $embed = ' + + + + + + + + + + '; + // Replace our placeholders with the values from the settings. + $embed = format_string($embed, array( + '!id' => $parameters['id'], + '!key' => $parameters['key'], + '@width' => $settings['width'], + '@height' => $settings['height'], + '!videoplayer' => $parameters['player'], + )); + + $video = array( + '#markup' => $embed, + '#suffix' => '', + '#attached' => array( + 'js' => array( + '//admin.brightcove.com/js/BrightcoveExperiences.js' => array( + 'type' => 'external', + ), + ), + ), + ); + + return $video; + } + return ''; +} + +/** + * Helper function to take a brightcove video url and return its id. + * + * @param string $url + * The full brightcove video url. + * + * @return array + * The video properties. + */ +function _video_embed_brightcove_get_video_properties($url) { + // Easy way to break a url into its components. + $components = array( + 'id' => array( + 'start' => 'bcpid', + 'finish' => '\?bckey', + ), + 'key' => array( + 'start' => 'bckey=', + 'finish' => '&bctid', + ), + 'player' => array( + 'start' => 'bctid=', + 'finish' => '', + ), + ); + + $matches = array(); + $return = array(); + foreach ($components as $key => $component) { + $string = "/(.*){$component['start']}(.*){$component['finish']}/"; + preg_match($string, $url, $matches); + if ($matches && !empty($matches[2])) { + $return[$key] = $matches[2]; + } + } + return $return; +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/img/facebook.jpg b/sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/img/facebook.jpg new file mode 100644 index 0000000000000000000000000000000000000000..79a1a1335a8dad03675df6f29331a618e1e2bc16 GIT binary patch literal 145254 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 literal 0 HcmV?d00001 diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.devel_generate.inc b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.devel_generate.inc new file mode 100644 index 00000000..54288833 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.devel_generate.inc @@ -0,0 +1,94 @@ +entry as $entry) { + $videos[] = array( + 'video_url' => $entry->children('media', TRUE)->group->player->attributes()->url, + 'description' => $entry->title, + ); + } + if (empty($videos)) { + video_embed_field_generate_videos(); + } + } + return $videos; +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.feeds.inc b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.feeds.inc new file mode 100644 index 00000000..84bdb7a2 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.feeds.inc @@ -0,0 +1,73 @@ + $instance) { + $info = field_info_field($name); + if ($info['type'] == 'video_embed_field') { + $targets[$name . ":video_url"] = array( + 'name' => t('@name: Embed URL', array('@name' => $instance['label'])), + 'callback' => 'video_embed_field_set_target', + 'description' => t('The URL for the @label field of the @entity_type.', array('@entity_type' => $entity_type, '@label' => $instance['label'])), + 'real_target' => $name, + ); + $targets[$name . ':description'] = array( + 'name' => t('@name: Embed description', array('@name' => $instance['label'])), + 'callback' => 'video_embed_field_set_target', + 'description' => t('The description for the @label field of the @entity_type.', array('@entity_type' => $entity_type, '@label' => $instance['label'])), + 'real_target' => $name, + ); + } + } +} + +/** + * Callback for mapping. Here is where the actual mapping happens. + * + * When the callback is invoked, $target contains the name of the field the + * user has decided to map to and $value contains the value of the feed item + * element the user has picked as a source. + */ +function video_embed_field_set_target($source, $entity, $target, $value) { + if (empty($value)) { + return; + } + + if (!is_array($value)) { + $value = array($value); + } + + list($field_name, $sub_field) = explode(':', $target, 2); + + $info = field_info_field($field_name); + + // Iterate over all values. + $field = isset($entity->$field_name) ? $entity->$field_name : array(LANGUAGE_NONE => array()); + + // Allow for multiple mappings to the same target. + $count = call_user_func_array('array_merge_recursive', $field[LANGUAGE_NONE]); + $delta = count($count[$sub_field]); + + foreach ($value as $v) { + + if ($info['cardinality'] != FIELD_CARDINALITY_UNLIMITED && $info['cardinality'] <= $delta) { + break; + } + + if (is_scalar($v)) { + $field[LANGUAGE_NONE][$delta][$sub_field] = $v; + + $delta++; + } + } + + $entity->{$field_name} = $field; +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.migrate.inc b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.migrate.inc new file mode 100644 index 00000000..a714ca65 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.migrate.inc @@ -0,0 +1,57 @@ + 2, + 'field handlers' => array('MigrateVideoEmbedFieldFieldHandler'), + ); + return $api; +} + +/** + * Custom extended MigrateFieldHandler class for Video Embed Field module. + */ +class MigrateVideoEmbedFieldFieldHandler extends MigrateFieldHandler { + + public function __construct() { + $this->registerTypes(array('video_embed_field')); + } + + /** + * {@inheritdoc} + */ + public function fields($type, $parent_field, $migration = NULL) { + $fields = array( + 'video_url' => t('Video: The video URL.'), + ); + return $fields; + } + + /** + * {@inheritdoc} + */ + public function prepare($entity, array $field_info, array $instance, array $values) { + $arguments = array(); + if (isset($values['arguments'])) { + $arguments = array_filter($values['arguments']); + unset($values['arguments']); + } + $language = $this->getFieldLanguage($entity, $field_info, $arguments); + + // Setup the standard Field API array for saving. + $delta = 0; + foreach ($values as $value) { + $return[$language][$delta] = array('video_url' => $value); + $delta++; + } + + return isset($return) ? $return : NULL; + } +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/views/handlers/views_embed_field_views_handler_field_thumbnail_path.inc b/sites/all/modules/contrib/fields/video_embed_field/views/handlers/views_embed_field_views_handler_field_thumbnail_path.inc new file mode 100644 index 00000000..c1178fe5 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/views/handlers/views_embed_field_views_handler_field_thumbnail_path.inc @@ -0,0 +1,22 @@ + 'views_handler_field', + 'thumbnail_path' => 'views_embed_field_views_handler_field_thumbnail_path', + 'description' => 'views_handler_field', + ); + + // Get the translated field information. + $properties = video_embed_field_data_property_info(); + + // Iterate over video_embed_field defined tables. + foreach ($data as &$table) { + // Make sure the parent Views field (video_embed_field) is defined. + if (isset($table[$field['field_name']]['field'])) { + // Use the parent field definition as a template for component columns. + $field_def = $table[$field['field_name']]['field']; + + // Remove 'additional fields' from the field definition. We don't + // necessarily want all our sibling columns. + unset($field_def['additional fields']); + + // Define the valid columns. + $valid_columns = array(); + foreach ($implemented as $implement => $handler) { + $column_name = $field['field_name'] . '_' . $implement; + $valid_columns[$column_name] = $handler; + } + + // Iterate over the video_embed_field components. + foreach ($table as $column_name => &$column) { + if (empty($column['field']) && isset($valid_columns[$column_name])) { + // Assign the default component definition. + $column['field'] = $field_def; + $column['field']['real field'] = $column_name; + $column['field']['handler'] = $valid_columns[$column_name]; + + // Assign human-friendly labels for video_embed_field components. + $field_labels = field_views_field_label($field['field_name']); + $field_label = array_shift($field_labels); + $property = str_replace($field_def['field_name'] . '_', '', $column_name); + + if (!empty($properties[$property])) { + $property_label = $properties[$property]['label']; + + $title = t('@field-label - @property-label', array( + '@field-label' => $field_label, + '@property-label' => $property_label, + )); + + $column['title'] = $title; + $column['title short'] = $title; + } + } + } + } + } + + return $data; +} diff --git a/sites/all/modules/contrib/files/transliteration/transliteration.api.php b/sites/all/modules/contrib/files/transliteration/transliteration.api.php new file mode 100644 index 00000000..b560ab99 --- /dev/null +++ b/sites/all/modules/contrib/files/transliteration/transliteration.api.php @@ -0,0 +1,22 @@ + $field_name)); + exit; + } + + if (!($instance = field_info_instance($entity_type, $field['field_name'], $bundle))) { + // Error string. The JavaScript handler will realize this is not JSON and + // will display it as debugging information. + print t('There was not found an instance of @field_name in @entity_type.', array( + '@field_name' => $field_name, + '@entity_type' => $entity_type, + )); + exit; + } + + // How many suggestions maximum we are able to output. + $max_suggestions = $instance['widget']['settings']['suggestion_size']; + + // Whether we are allowed to suggest more than one entry per term, shall that + // entry be either term name itself or one of its synonyms. + $suggest_only_unique = $instance['widget']['settings']['suggest_only_unique']; + + // The user enters a comma-separated list of tags. We only autocomplete the + // last tag. + $tags_typed = drupal_explode_tags($tags_typed); + $tag_last = drupal_strtolower(array_pop($tags_typed)); + + $term_matches = array(); + if ($tag_last != '') { + // Part of the criteria for the query come from the field's own settings. + $vocabularies = array(); + $tmp = taxonomy_vocabulary_get_names(); + foreach ($field['settings']['allowed_values'] as $tree) { + $vocabularies[$tmp[$tree['vocabulary']]->vid] = $tree['vocabulary']; + } + $vocabularies = taxonomy_vocabulary_load_multiple(array_keys($vocabularies)); + + // Array of found suggestions. Each subarray of this array will represent + // a single suggestion entry. The sub array must at least contain the + // following keys: + // tid - tid of the suggested term + // name - name of the suggested term + // And optionally, if the term is suggested based on its synonym, the sub + // array should also include the additional key: + // synonym - string representation of the synonym based on which the + // suggested term was included. + $tags_return = array(); + + // Firstly getting a list of tids that match by $term->name. + $query = db_select('taxonomy_term_data', 't'); + $query->addTag('translatable'); + $query->addTag('term_access'); + + // Do not select already entered terms. + if (!empty($tags_typed)) { + $query->condition('t.name', $tags_typed, 'NOT IN'); + } + // Select rows that match by term name. + $result = $query + ->fields('t', array('tid', 'name')) + ->condition('t.vid', array_keys($vocabularies)) + ->condition('t.name', '%' . db_like($tag_last) . '%', 'LIKE') + ->range(0, $max_suggestions) + ->execute() + ->fetchAllKeyed(); + + // Converting results into another format. + foreach ($result as $tid => $name) { + $tags_return[] = array( + 'name' => $name, + 'tid' => $tid, + ); + } + + $synonym_tids = array(); + // Now we go vocabulary by vocabulary looking through synonym fields. + foreach ($vocabularies as $vocabulary) { + // Now we go a synonym field by synonym field gathering suggestions. + // Since officially EntityFieldQuery doesn't support OR conditions + // we are enforced to go a field by field querying multiple times the DB. + $bundle = field_extract_bundle('taxonomy_term', $vocabulary); + foreach (synonyms_synonyms_fields($vocabulary) as $field) { + $field = field_info_field($field); + $instance = field_info_instance('taxonomy_term', $field['field_name'], $bundle); + $query = new EntityFieldQuery(); + $query->entityCondition('entity_type', 'taxonomy_term') + ->entityCondition('bundle', $bundle); + + // We let the class that defines this field type as a source of synonyms + // filter out and provide its suggestions based on this field. + $class = synonyms_extractor_info($field['type']); + call_user_func(array($class, 'processEntityFieldQuery'), $tag_last, $query, $field, $instance); + + if (!empty($tags_typed)) { + $query->propertyCondition('name', $tags_typed, 'NOT IN'); + } + if ($suggest_only_unique && !empty($tags_return)) { + $tmp = array(); + foreach ($tags_return as $tag_return) { + $tmp[] = $tag_return['tid']; + } + // We don't want to search among the terms already found by term name. + $query->entityCondition('entity_id', $tmp, 'NOT IN'); + } + if ($suggest_only_unique && !empty($synonym_tids)) { + // We also don't want to search among the terms already matched by + // previous synonym fields. + $query->entityCondition('entity_id', $synonym_tids, 'NOT IN'); + } + $tmp = $query->execute(); + if (!empty($tmp)) { + // Merging the results. + $tmp = array_keys($tmp['taxonomy_term']); + $synonym_tids = array_merge($synonym_tids, $tmp); + } + } + } + + if (!empty($synonym_tids)) { + foreach (taxonomy_term_load_multiple($synonym_tids) as $synonym_term) { + $tmp = array( + 'name' => $synonym_term->name, + 'tid' => $synonym_term->tid, + ); + // Additionally we have to find out which synonym triggered inclusion of + // this term. + foreach (synonyms_get_sanitized($synonym_term) as $item) { + if (strpos(mb_strtoupper($item, 'UTF-8'), mb_strtoupper($tag_last, 'UTF-8')) !== FALSE) { + $tags_return[] = array('synonym' => $item) + $tmp; + if ($suggest_only_unique) { + // We just want to output 1 single suggestion entry per term, so + // one synonym is enough. + break; + } + } + } + } + } + $prefix = empty($tags_typed) ? '' : drupal_implode_tags($tags_typed) . ', '; + + if (count($tags_return) > $max_suggestions) { + $tags_return = array_slice($tags_return, 0, $max_suggestions); + } + + // Now formatting the results. + foreach ($tags_return as $info) { + $n = $info['name']; + // Term names containing commas or quotes must be wrapped in quotes. + if (strpos($info['name'], ',') !== FALSE || strpos($info['name'], '"') !== FALSE) { + $n = '"' . str_replace('"', '""', $info['name']) . '"'; + } + + if (isset($info['synonym'])) { + $display_name = t('@synonym, synonym of %term', array('@synonym' => $info['synonym'], '%term' => $info['name'])); + } + else { + $display_name = check_plain($info['name']); + } + while (isset($term_matches[$prefix . $n])) { + $n .= ' '; + } + $term_matches[$prefix . $n] = $display_name; + } + } + drupal_json_output($term_matches); +} + +/** + * Mark nodes that reference specific terms for search re-indexing. + * + * This is particularly useful, when the terms in question have been changed. + * + * @param $tids array + * Array of tids of the terms + */ +function synonyms_reindex_nodes_by_terms($tids) { + // In order to speed up the process, we will query DB for nid's that reference + // handled to us tids, and at the end we'll trigger their re-indexing in just + // a single SQL query. Probably it is better to use search_touch_node(), but + // that would imply a big amount of SQL queries on some websites. + $found_nids = array(); + foreach (field_info_field_map() as $field_name => $v) { + if ($v['type'] == 'taxonomy_term_reference' && isset($v['bundles']['node'])) { + // This field is taxonomy term reference and it is attached to nodes, so + // we will run EntityFieldQuery on it. + $query = new EntityFieldQuery(); + $result = $query->entityCondition('entity_type', 'node') + ->fieldCondition($field_name, 'tid', $tids, 'IN') + ->execute(); + if (isset($result['node'])) { + $found_nids = array_merge($found_nids, array_keys($result['node'])); + } + } + } + if (!empty($found_nids)) { + db_update('search_dataset') + ->fields(array('reindex' => REQUEST_TIME)) + ->condition('type', 'node') + ->condition('sid', $found_nids, 'IN') + ->execute(); + } +} + +/** + * Mark nodes that reference terms from a vocabulary for search re-indexing. + * + * @param $vocabulary object + * Fully loaded vocabulary object + */ +function synonyms_reindex_nodes_by_vocabulary($vocabulary) { + $tids = db_select('taxonomy_term_data', 't') + ->fields('t', array('tid')) + ->condition('vid', $vocabulary->vid) + ->execute() + ->fetchCol(); + if (!empty($tids)) { + synonyms_reindex_nodes_by_terms($tids); + } +} + +/** + * Submit handler for Taxonomy vocabulary edit form. + * + * Store extra values attached to form in this module. + */ +function synonyms_taxonomy_form_vocabulary_submit($form, &$form_state) { + $values = $form_state['values']; + + if ($values['op'] == $form['actions']['submit']['#value']) { + if (isset($form['#vocabulary']->vid)) { + $vocabulary = taxonomy_vocabulary_load($form['#vocabulary']->vid); + } + else { + // As a fallback, if this is a just created vocabulary, we try to pull it + // up by the just submitted machine name. + $vocabulary = taxonomy_vocabulary_machine_name_load($values['machine_name']); + } + + // Preprocessing values keeping only field names of the checked fields. + $values['synonyms']['synonyms'] = array_values(array_filter($values['synonyms']['synonyms'])); + + $settings = synonyms_vocabulary_settings($vocabulary); + $settings = $values['synonyms'] + $settings; + synonyms_vocabulary_settings_save($vocabulary, $settings); + } +} diff --git a/sites/all/modules/contrib/taxonomy/synonyms/views/synonyms.views.inc b/sites/all/modules/contrib/taxonomy/synonyms/views/synonyms.views.inc new file mode 100644 index 00000000..5f377aef --- /dev/null +++ b/sites/all/modules/contrib/taxonomy/synonyms/views/synonyms.views.inc @@ -0,0 +1,17 @@ +options['vocabularies']); + $type = $this->options['type']; + $transform = $this->options['transform']; + + switch ($type) { + case 'synonym': + case 'synonym_tid': + // We are requested to do synonyms friendly validation. We will have to + // go through each of allowed vocabularies, collecting terms whose + // synonyms might look like the argument we have. However, it is not + // that easy to achieve due to the fact that synonyms may be kept in + // whatever format in whatever column and only corresponding Synonyms + // extractor class has the knowledge how it is organized. Firstly we are + // going to query database trying to find a term with our argument's + // name. If we find one, it is great and we stop right there. Otherwise, + // the nightmare starts: we are going to use + // AbstractSynonymsExtractor::processEntityFieldQuery() method to find + // synonyms that are similar to our argument. Then we will load those + // terms and manually in PHP will determine whether it is a match. + $query = db_select('taxonomy_term_data', 't') + ->fields('t', array('tid', 'name')); + if (!empty($vocabularies)) { + $query->innerJoin('taxonomy_vocabulary', 'v', 't.vid = v.vid'); + $query->condition('v.machine_name', $vocabularies); + } + if ($transform) { + $query->where("replace(t.name, ' ', '-') = :name", array(':name' => $argument)); + } + else { + $query->condition('t.name', $argument, '='); + } + $result = $query->range(0, 1) + ->execute(); + if ($result->rowCount()) { + // We have found a term, we are going to use it. + $term = taxonomy_term_load($result->fetchField(0)); + $this->argument->argument = $this->synonyms_get_term_property($term); + $this->argument->validated_title = check_plain(entity_label('taxonomy_term', $term)); + return TRUE; + } + + if (empty($vocabularies)) { + // At this point we want to convert an empty $vocabulary (implicitly + // meaning "all") into actually a list of all fully loaded + // vocabularies. + $vocabularies = taxonomy_vocabulary_load_multiple(FALSE); + } + else { + // We need to load the filtered vocabularies based on their machine + // names. + foreach ($vocabularies as $v) { + $vocabularies[$v] = taxonomy_vocabulary_machine_name_load($v); + } + } + + // We haven't had much luck, seems like we have to do the hard part. We + // will pull up terms that are similar to our argument using the same + // functionality as for synonyms friendly autocomplete widget and then + // will find those who actually match among this narrowed set of terms. + // Since $match will be use as value for LIKE SQL operator, we are not + // sure whether we need to substitute dash (-) with spacebar, or keep + // the dash, to match both we will use underscore (_) since this symbol + // matches one symbol in LIKE operator. + $match = $transform ? str_replace('-', '_', $argument) : $argument; + $tids = array(); + // Unfortunately we have to query multiple times the database for each + // vocabulary for each synonyms-source field. + foreach ($vocabularies as $vocabulary) { + $bundle = field_extract_bundle('taxonomy_term', $vocabulary); + foreach (synonyms_synonyms_fields($vocabulary) as $field) { + $field = field_info_field($field); + $instance = field_info_instance('taxonomy_term', $field['field_name'], $bundle); + $query = new EntityFieldQuery(); + $query->entityCondition('entity_type', 'taxonomy_term') + ->entityCondition('bundle', $vocabulary->machine_name); + + // We let the class that defines this field type as a source of + // synonyms filter out and provide its suggestions based on this + // field. + $class = synonyms_extractor_info($field['type']); + call_user_func(array($class, 'processEntityFieldQuery'), $match, $query, $field, $instance); + if (!empty($tids)) { + $query->entityCondition('entity_id', $tids, 'NOT IN'); + } + $result = $query->execute(); + if (isset($result['taxonomy_term'])) { + $tids = array_merge($tids, array_keys($result['taxonomy_term'])); + } + } + } + $terms = taxonomy_term_load_multiple($tids); + // We have an array of terms whose synonyms look like they could be + // equal to our argument, let us iterate over each term's synonyms to + // actually see if they match. + $argument = mb_strtoupper($argument, 'UTF-8'); + foreach ($terms as $term) { + foreach (synonyms_get_term_synonyms($term) as $synonym) { + $synonym = mb_strtoupper($synonym['safe_value'], 'UTF-8'); + if ($transform) { + $synonym = str_replace(' ', '-', $synonym); + } + if ($synonym == $argument) { + // Finally we found a synonym that matches our argument. We are + // going to use the corresponding term and there is no point to + // continue searching. + $this->argument->argument = $this->synonyms_get_term_property($term); + $this->argument->validated_title = check_plain(entity_label('taxonomy_term', $term)); + return TRUE; + } + } + } + // We haven't found any synonym that matched our argument, so there is + // no term to return. + return FALSE; + + default: + return parent::validate_argument($argument); + } + } + + /** + * Return necessary property (per chosen validator) of encountered term. + * + * @param $term object + * Fully loaded taxonomy term from which necessary property should be + * returned + * + * @return mixed + * Necessary property (per chosen validator) of the provided term + */ + function synonyms_get_term_property($term) { + switch ($this->options['type']) { + case 'synonym': + return $term->name; + + case 'synonym_tid': + return $term->tid; + } + return NULL; + } +} diff --git a/sites/all/modules/contrib/theming/colorbox/colorbox.make b/sites/all/modules/contrib/theming/colorbox/colorbox.make new file mode 100644 index 00000000..66b47fab --- /dev/null +++ b/sites/all/modules/contrib/theming/colorbox/colorbox.make @@ -0,0 +1,8 @@ +core = 7.x +api = 2 + +libraries[colorbox][type] = "libraries" +libraries[colorbox][download][type] = "file" +libraries[colorbox][download][url] = "https://github.com/jackmoore/colorbox/archive/1.x.zip" +libraries[colorbox][directory_name] = "colorbox" +libraries[colorbox][destination] = "libraries" diff --git a/sites/all/modules/contrib/views/views_bulk_operations/actions/book.action.inc b/sites/all/modules/contrib/views/views_bulk_operations/actions/book.action.inc new file mode 100644 index 00000000..add893ef --- /dev/null +++ b/sites/all/modules/contrib/views/views_bulk_operations/actions/book.action.inc @@ -0,0 +1,77 @@ + 'node', + 'label' => t('Move to book'), + 'configurable' => TRUE, + 'behavior' => array('changes_property'), + ); + $actions['views_bulk_operations_remove_from_book_action'] = array( + 'type' => 'node', + 'label' => t('Remove from book'), + 'configurable' => FALSE, + ); + } + + return $actions; +} + +function views_bulk_operations_move_to_book_action_form($context) { + $form = array(); + if (!isset($context['book'])) { + $context['book'] = ''; + } + $options = array(); + $books = book_get_books(); + foreach ($books as $value) { + $options[$value['nid']] = $value['title']; + } + + if (empty($options)) { + drupal_set_message(t('You have no books.'), 'error'); + return array(); + } + + $form['book'] = array( + '#type' => 'select', + '#title' => t('Choose a parent book'), + '#options' => $options, + '#description' => t('Select the parent book page you wish to move the book page into'), + ); + return $form; +} + +function views_bulk_operations_move_to_book_action_submit($form, $form_state) { + return array('book' => $form_state['values']['book']); +} + +function views_bulk_operations_move_to_book_action($node, $context = array()) { + if (isset($context['book'])) { + $book_node = node_load($context['book']); + $mlid = db_select('menu_links' , 'ml') + ->condition('ml.link_path' , 'node/' . $node->nid) + ->fields('ml' , array('mlid')) + ->execute() + ->fetchField(); + $node->book['mlid'] = $mlid; + $node->book['bid'] = $book_node->nid; + $node->book['plid'] = $book_node->book['mlid']; + $node->book['module'] = 'book'; + } +} + +/** + * Adds the action 'Remove node from a parent book' + */ +function views_bulk_operations_remove_from_book_action($node, $context) { + $book = $node->book['mlid']; + book_node_delete($node); +} diff --git a/sites/all/modules/contrib/views/views_bulk_operations/actions/user_cancel.action.inc b/sites/all/modules/contrib/views/views_bulk_operations/actions/user_cancel.action.inc new file mode 100644 index 00000000..ea8e8ee1 --- /dev/null +++ b/sites/all/modules/contrib/views/views_bulk_operations/actions/user_cancel.action.inc @@ -0,0 +1,81 @@ + array( + 'type' => 'user', + 'label' => t('Cancel user account'), + 'configurable' => TRUE, + 'behavior' => array('deletes_property'), + )); +} + +function views_bulk_operations_user_cancel_action_form($context) { + module_load_include('inc', 'user', 'user.pages'); + $form['user_cancel_method'] = array( + '#type' => 'item', + '#title' => t('When cancelling these accounts'), + ); + $form['user_cancel_method'] += user_cancel_methods(); + // Remove method descriptions. + foreach (element_children($form['user_cancel_method']) as $element) { + unset($form['user_cancel_method'][$element]['#description']); + } + $admin_access = user_access('administer users'); + $default_notify = variable_get('user_mail_status_canceled_notify', FALSE); + $form['user_cancel_notify'] = array( + '#type' => 'checkbox', + '#title' => t('Notify user when account is canceled.'), + '#default_value' => ($admin_access ? FALSE : $default_notify), + '#access' => $admin_access && $default_notify, + '#description' => t('When enabled, the user will receive an e-mail notification after the account has been cancelled.'), + ); + + return $form; +} + +function views_bulk_operations_user_cancel_action_submit($form, $form_state) { + return array( + 'user_cancel_method' => $form_state['values']['user_cancel_method'], + 'user_cancel_notify' => $form_state['values']['user_cancel_notify'], + ); +} + +function views_bulk_operations_user_cancel_action($account, $context) { + global $user; + // Prevent the user from cancelling itself. + if ($account->uid == $user->uid) { + return; + } + + // Allow other modules to react on the cancellation. + if ($context['user_cancel_method'] != 'user_cancel_delete') { + module_invoke_all('user_cancel', array(), $account, $context['user_cancel_method']); + } + + switch ($context['user_cancel_method']) { + case 'user_cancel_block': + case 'user_cancel_block_unpublish': + default: + // Send account blocked notification if option was checked. + if (!empty($context['user_cancel_notify'])) { + _user_mail_notify('status_blocked', $account); + } + user_save($account, array('status' => 0)); + watchdog('user', 'Blocked user: %name %email.', array('%name' => $account->name, '%email' => '<' . $account->mail . '>'), WATCHDOG_NOTICE); + break; + + case 'user_cancel_reassign': + case 'user_cancel_delete': + // Send account canceled notification if option was checked. + if (!empty($context['user_cancel_notify'])) { + _user_mail_notify('status_canceled', $account); + } + user_delete($account->uid); + watchdog('user', 'Deleted user: %name %email.', array('%name' => $account->name, '%email' => '<' . $account->mail . '>'), WATCHDOG_NOTICE); + break; + } +} diff --git a/sites/all/modules/contrib/views/views_data_export/.gitignore b/sites/all/modules/contrib/views/views_data_export/.gitignore new file mode 100644 index 00000000..e43b0f98 --- /dev/null +++ b/sites/all/modules/contrib/views/views_data_export/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/sites/all/modules/contrib/views/views_data_export/tests/base.test b/sites/all/modules/contrib/views/views_data_export/tests/base.test new file mode 100644 index 00000000..455f5d16 --- /dev/null +++ b/sites/all/modules/contrib/views/views_data_export/tests/base.test @@ -0,0 +1,508 @@ +schemaDefinition()); + variable_set('views_test_views_data', $this->viewsData()); + variable_set('views_test_views_plugins', $this->viewsPlugins()); + + module_enable(array('views_test')); + $this->resetAll(); + + // Load the test dataset. + $data_set = $this->dataSet(); + $query = db_insert('views_test') + ->fields(array_keys($data_set[0])); + foreach ($data_set as $record) { + $query->values($record); + } + $query->execute(); + $this->checkPermissions(array(), TRUE); + } + + /** + * This function allows to enable views ui from a higher class which can't change the setup function anymore. + * + * @TODO + * Convert existing setUp functions. + */ + function enableViewsUi() { + module_enable(array('views_ui')); + // @TODO Figure out why it's required to clear the cache here. + views_module_include('views_default', TRUE); + views_get_all_views(TRUE); + menu_rebuild(); + } + + /** + * The schema definition. + */ + protected function schemaDefinition() { + $schema['views_test'] = array( + 'description' => 'Basic test table for Views tests.', + 'fields' => array( + 'id' => array( + 'type' => 'serial', + 'unsigned' => TRUE, + 'not null' => TRUE, + ), + 'name' => array( + 'description' => "A person's name", + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '', + ), + 'age' => array( + 'description' => "The person's age", + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0), + 'job' => array( + 'description' => "The person's job", + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => 'Undefined', + ), + 'created' => array( + 'description' => "The creation date of this record", + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0, + ), + ), + 'primary key' => array('id'), + 'unique keys' => array( + 'name' => array('name') + ), + 'indexes' => array( + 'ages' => array('age'), + ), + ); + return $schema; + } + + /** + * The views data definition. + */ + protected function viewsData() { + // Declaration of the base table. + $data['views_test']['table'] = array( + 'group' => t('Views test'), + 'base' => array( + 'field' => 'id', + 'title' => t('Views test'), + 'help' => t('Users who have created accounts on your site.'), + ), + ); + + // Declaration of fields. + $data['views_test']['id'] = array( + 'title' => t('ID'), + 'help' => t('The test data ID'), + 'field' => array( + 'handler' => 'views_handler_field_numeric', + 'click sortable' => TRUE, + ), + 'argument' => array( + 'handler' => 'views_handler_argument_numeric', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + $data['views_test']['name'] = array( + 'title' => t('Name'), + 'help' => t('The name of the person'), + 'field' => array( + 'handler' => 'views_handler_field', + 'click sortable' => TRUE, + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + $data['views_test']['age'] = array( + 'title' => t('Age'), + 'help' => t('The age of the person'), + 'field' => array( + 'handler' => 'views_handler_field_numeric', + 'click sortable' => TRUE, + ), + 'argument' => array( + 'handler' => 'views_handler_argument_numeric', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + $data['views_test']['job'] = array( + 'title' => t('Job'), + 'help' => t('The job of the person'), + 'field' => array( + 'handler' => 'views_handler_field', + 'click sortable' => TRUE, + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + $data['views_test']['created'] = array( + 'title' => t('Created'), + 'help' => t('The creation date of this record'), + 'field' => array( + 'handler' => 'views_handler_field_date', + 'click sortable' => TRUE, + ), + 'argument' => array( + 'handler' => 'views_handler_argument_date', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_date', + ), + 'sort' => array( + 'handler' => 'views_handler_sort_date', + ), + ); + return $data; + } + + protected function viewsPlugins() { + return array(); + } + + /** + * A very simple test dataset. + */ + protected function dataSet() { + return array( + array( + 'name' => 'John', + 'age' => 25, + 'job' => 'Singer', + 'created' => gmmktime(0, 0, 0, 1, 1, 2000), + ), + array( + 'name' => 'George', + 'age' => 27, + 'job' => 'Singer', + 'created' => gmmktime(0, 0, 0, 1, 2, 2000), + ), + array( + 'name' => 'Ringo', + 'age' => 28, + 'job' => 'Drummer', + 'created' => gmmktime(6, 30, 30, 1, 1, 2000), + ), + array( + 'name' => 'Paul', + 'age' => 26, + 'job' => 'Songwriter', + 'created' => gmmktime(6, 0, 0, 1, 1, 2000), + ), + array( + 'name' => 'Meredith', + 'age' => 30, + 'job' => 'Speaker', + 'created' => gmmktime(6, 30, 10, 1, 1, 2000), + ), + ); + } + + /** + * Build and return a basic view of the views_test table. + * + * @return view + */ + protected function getBasicView() { + views_include('view'); + + // Create the basic view. + $view = new view(); + $view->vid = 'test_view'; + $view->add_display('default'); + $view->base_table = 'views_test'; + + // Set up the fields we need. + $display = $view->new_display('default', 'Master', 'default'); + $display->override_option('fields', array( + 'id' => array( + 'id' => 'id', + 'table' => 'views_test', + 'field' => 'id', + 'relationship' => 'none', + ), + 'name' => array( + 'id' => 'name', + 'table' => 'views_test', + 'field' => 'name', + 'relationship' => 'none', + ), + 'age' => array( + 'id' => 'age', + 'table' => 'views_test', + 'field' => 'age', + 'relationship' => 'none', + ), + )); + + // Set up the sort order. + $display->override_option('sorts', array( + 'id' => array( + 'order' => 'ASC', + 'id' => 'id', + 'table' => 'views_test', + 'field' => 'id', + 'relationship' => 'none', + ), + )); + + // Set up the pager. + $display->override_option('pager', array( + 'type' => 'none', + 'options' => array('offset' => 0), + )); + + return $view; + } + + public function logViewResult($result, $prefix = 'View result:
    ') { + $this->verbose($prefix . '

    ' . check_plain($result) .'
    '); + } + + public function assertBatchedExportEqual($path, $expected, $message) { + $this->drupalGet($path); + $output = $this->drupalGetContent(); + $this->logViewResult($output); + $this->logViewResult($expected, 'Expected result:
    '); + $this->assertEqual($this->normaliseString($output), $this->normaliseString($expected), $message); + } + + public function assertExportEqual($a, $b, $message) { + $this->logViewResult($a); + $this->logViewResult($b, 'Expected result:
    '); + $this->assertEqual($this->normaliseString($a), $this->normaliseString($b), $message); + } + + protected function normaliseString($s) { + // Normalize line endings + // Convert all line-endings to UNIX format + $s = str_replace("\r\n", "\n", $s); + $s = str_replace("\r", "\n", $s); + $s = trim($s); + return $s; + } + +} + +abstract class ViewsDataExportSimpleExportTest extends ViewsDataExportBaseTest { + + protected $vde_export_type; + + /** + * Tests the non-batched export functionality for this style. + */ + public function testNonBatchedExport() { + $path = 'vde_test/' . $this->randomName(); + list($view, $expected) = $this->getExportView($path); + // Save this view so we can hit the path. + $view->save(); + // Ensure that the menu router system is rebuilt on the next page load. + variable_set('menu_rebuild_needed', TRUE); + + $this->drupalGet($path); + $result = $this->drupalGetContent(); + + $this->assertExportEqual($result, $expected, 'Non batched ' . $this->vde_export_type . ' export matched expected output.'); + } + + /** + * Tests the batched export functionality for this style. + */ + public function testBatchedExport() { + $path = 'vde_test/' . $this->randomName(); + list($view, $expected) = $this->getExportView($path); + $display = &$view->display['vde_test']->handler; + // Set this view to be batched. + $display->override_option('use_batch', 'batch'); + // Save this view so we can hit the path. + $view->save(); + // Ensure that the menu router system is rebuilt on the next page load. + variable_set('menu_rebuild_needed', TRUE); + + $this->assertBatchedExportEqual($path, $expected, 'Batched ' . $this->vde_export_type . ' export matched expected output.'); + } + + /** + * Get a very basic view and expected output for this style. + * + * @return + * An array containing two elements: + * - A View object, for the export. + * - The expected out from that view, if is was executed without further + * changes. + */ + abstract protected function getExportView($path = 'vde_test'); + + /** + * Build and return a basic view of the views_test table. + * + * @return view + */ + protected function getBasicExportView() { + views_include('view'); + + // Create the basic view. + $view = new view(); + $view->vid = 'new'; + $view->base_table = 'views_test'; + + // Set up the fields we need. + $display = $view->new_display('default', 'Master', 'default'); + + $display->override_option('fields', array( + 'id' => array( + 'id' => 'id', + 'table' => 'views_test', + 'field' => 'id', + 'relationship' => 'none', + ), + 'name' => array( + 'id' => 'name', + 'table' => 'views_test', + 'field' => 'name', + 'relationship' => 'none', + ), + 'age' => array( + 'id' => 'age', + 'table' => 'views_test', + 'field' => 'age', + 'relationship' => 'none', + ), + )); + + // Set up the sort order. + $display->override_option('sorts', array( + 'id' => array( + 'order' => 'ASC', + 'id' => 'id', + 'table' => 'views_test', + 'field' => 'id', + 'relationship' => 'none', + ), + )); + + // Set up the pager. + $display->override_option('pager', array( + 'type' => 'none', + 'options' => array('offset' => 0), + )); + + return $view; + } + + /** + * Get a view that's our basic view, but with hide if empty/0 support. + * + * We add this to the 'age' field. + */ + protected function getHideIfEmptyExportView() { + $view = $this->getBasicExportView(); + + $display = $view->display['default']->handler; + + $display->override_option('fields', array( + 'id' => array( + 'id' => 'id', + 'table' => 'views_test', + 'field' => 'id', + 'relationship' => 'none', + ), + 'name' => array( + 'id' => 'name', + 'table' => 'views_test', + 'field' => 'name', + 'relationship' => 'none', + // Hide their name if its empty. + 'hide_empty' => TRUE, + // But we don't hide it if it's: 0. + 'empty_zero' => FALSE, + ), + 'age' => array( + 'id' => 'age', + 'table' => 'views_test', + 'field' => 'age', + 'relationship' => 'none', + // Hide their age if it's empty. + 'hide_empty' => TRUE, + 'empty_zero' => TRUE, + ), + )); + + return $view; + } + + /** + * Execute a given view very simply. + * + * This will take a view, and add a display plugin of the correct export type, + * and then run it and compare it with the expected output. + */ + protected function executeAndCompareGivenView(view $view, $expected, $message = '', $style_options = array()) { + $path = 'vde_test/' . $this->randomName(); + + $display = $view->new_display('views_data_export', 'Data export', 'vde_test'); + $display->override_option('style_plugin', $this->getStylePluginName()); + $display->override_option('style_options', $style_options); + $display->override_option('path', $path); + + // Save this view so we can hit the path. + $view->save(); + + // Ensure that the menu router system is rebuilt on the next page load. + variable_set('menu_rebuild_needed', TRUE); + + $this->drupalGet($path); + $result = $this->drupalGetContent(); + + $this->assertExportEqual($result, $expected, $message); + } + + /** + * Return the name of the style plugin represented by this test. + */ + abstract protected function getStylePluginName(); +} diff --git a/sites/all/modules/contrib/views/views_data_export/tests/csv_export.test b/sites/all/modules/contrib/views/views_data_export/tests/csv_export.test new file mode 100644 index 00000000..9852b778 --- /dev/null +++ b/sites/all/modules/contrib/views/views_data_export/tests/csv_export.test @@ -0,0 +1,211 @@ + 'CSV Export', + 'description' => 'Various tests for exporting to CSV.', + 'group' => 'Views Data Export', + ); + } + + protected $vde_export_type = 'CSV'; + + protected function getStylePluginName() { + return 'views_data_export_csv'; + } + + protected function getExportView($path = 'vde_test') { + // Create the basic view. + $view = $this->getBasicExportView(); + + $display = $view->new_display('views_data_export', 'Data export', 'vde_test'); + $display->override_option('style_plugin', $this->getStylePluginName()); + $display->override_option('path', $path); + + $expected = '"ID","Name","Age" +"1","John","25" +"2","George","27" +"3","Ringo","28" +"4","Paul","26" +"5","Meredith","30"'; + + return array(&$view, $expected); + } + + /** + * Test to ensure that HTML tags are kept in CSV files when requested. + */ + protected function testKeepHTML() { + $view = $this->getBasicExportView(); + + $display = $view->display['default']->handler; + + $display->override_option('fields', array( + 'id' => array( + 'id' => 'id', + 'table' => 'views_test', + 'field' => 'id', + 'relationship' => 'none', + // Add a label to include HTML + 'label' => 'ID', + ), + 'name' => array( + 'id' => 'name', + 'table' => 'views_test', + 'field' => 'name', + 'relationship' => 'none', + // Alter this field to include HTML. + 'alter' => array( + 'alter_text' => TRUE, + 'text' => '[name]', + ), + ), + 'age' => array( + 'id' => 'age', + 'table' => 'views_test', + 'field' => 'age', + 'relationship' => 'none', + ), + )); + + $style_options = array( + 'keep_html' => TRUE, + ); + + $expected = '"ID","Name","Age" +"1","John","25" +"2","George","27" +"3","Ringo","28" +"4","Paul","26" +"5","Meredith","30"'; + + $message = 'Keep HTML test in ' . $this->vde_export_type . ' export matched expected output.'; + + $this->executeAndCompareGivenView($view, $expected, $message, $style_options); + + + // And now make sure that HTML tags are stripped correctly. + $style_options = array( + 'keep_html' => FALSE, + ); + + $expected = '"ID","Name","Age" +"1","John","25" +"2","George","27" +"3","Ringo","28" +"4","Paul","26" +"5","Meredith","30"'; + + $message = 'Keep HTML reverse test in ' . $this->vde_export_type . ' export matched expected output.'; + + $this->executeAndCompareGivenView($view, $expected, $message, $style_options); + } + + /** + * Test to ensure that HTML tags are kept in CSV files when requested. + */ + protected function testTrimFields() { + $view = $this->getBasicExportView(); + + $display = $view->display['default']->handler; + + $display->override_option('fields', array( + 'id' => array( + 'id' => 'id', + 'table' => 'views_test', + 'field' => 'id', + 'relationship' => 'none', + 'label' => 'ID', + ), + 'name' => array( + 'id' => 'name', + 'table' => 'views_test', + 'field' => 'name', + 'relationship' => 'none', + // Alter this field to include HTML. + 'alter' => array( + 'alter_text' => TRUE, + 'text' => ' [name] ', + ), + ), + 'age' => array( + 'id' => 'age', + 'table' => 'views_test', + 'field' => 'age', + 'relationship' => 'none', + ), + )); + + $style_options = array( + 'trim' => FALSE, + ); + + $expected = '"ID","Name","Age" +"1"," John ","25" +"2"," George ","27" +"3"," Ringo ","28" +"4"," Paul ","26" +"5"," Meredith ","30"'; + + $message = 'Trim reverse test in ' . $this->vde_export_type . ' export matched expected output.'; + + $this->executeAndCompareGivenView($view, $expected, $message, $style_options); + + // And now make sure that trimming works as expected. + $style_options = array( + 'trim' => TRUE, + ); + + $expected = '"ID","Name","Age" +"1","John","25" +"2","George","27" +"3","Ringo","28" +"4","Paul","26" +"5","Meredith","30"'; + + $message = 'Trim test in ' . $this->vde_export_type . ' export matched expected output.'; + + $this->executeAndCompareGivenView($view, $expected, $message, $style_options); + } + + /** + * Test to ensure that Encoding options work. + */ + protected function testIconvEncoding() { + $view = $this->getBasicExportView(); + + db_update('views_test') + ->fields(array('name' => 'Jo€hn')) + ->condition('name', 'John') + ->execute(); + + $encodings = array( + 'ISO-8859-1//TRANSLIT' => 'EUR', + 'utf8_decode' => '?', + ); + + foreach ($encodings as $encoding => $conversion) { + + $style_options = array( + 'encoding' => $encoding, + ); + + $expected = '"ID","Name","Age" +"1","Jo' . $conversion . 'hn","25" +"2","George","27" +"3","Ringo","28" +"4","Paul","26" +"5","Meredith","30"'; + + $message = 'Character encoding ' . $encoding . ' worked correctly.'; + + $this->executeAndCompareGivenView($view, $expected, $message, $style_options); + } + + } + +} diff --git a/sites/all/modules/contrib/views/views_data_export/tests/doc_export.test b/sites/all/modules/contrib/views/views_data_export/tests/doc_export.test new file mode 100644 index 00000000..deed57db --- /dev/null +++ b/sites/all/modules/contrib/views/views_data_export/tests/doc_export.test @@ -0,0 +1,48 @@ + 'DOC Export', + 'description' => 'Various tests for exporting to DOC.', + 'group' => 'Views Data Export', + ); + } + + protected $vde_export_type = 'DOC'; + + protected function getStylePluginName() { + return 'views_data_export_doc'; + } + + protected function getExportView($path = 'vde_test') { + // Create the basic view. + $view = $this->getBasicExportView(); + + $display = $view->new_display('views_data_export', 'Data export', 'vde_test'); + $display->override_option('style_plugin', $this->getStylePluginName()); + $display->override_option('path', $path); + + $expected = ' + + + + + + + + + + + +
    IDNameAge
    1John25
    2George27
    3Ringo28
    4Paul26
    5Meredith30
    + +'; + + return array(&$view, $expected); + } + +} diff --git a/sites/all/modules/contrib/views/views_data_export/tests/txt_export.test b/sites/all/modules/contrib/views/views_data_export/tests/txt_export.test new file mode 100644 index 00000000..e7484e97 --- /dev/null +++ b/sites/all/modules/contrib/views/views_data_export/tests/txt_export.test @@ -0,0 +1,164 @@ + 'TXT Export', + 'description' => 'Various tests for exporting to TXT.', + 'group' => 'Views Data Export', + ); + } + + protected $vde_export_type = 'TXT'; + + protected function getStylePluginName() { + return 'views_data_export_txt'; + } + + protected function getExportView($path = 'vde_test') { + // Create the basic view. + $view = $this->getBasicExportView(); + + $display = $view->new_display('views_data_export', 'Data export', 'vde_test'); + $display->override_option('style_plugin', $this->getStylePluginName()); + $display->override_option('path', $path); + + $expected = '[ID] + +1 +[Name] + +John +[Age] + +25 +---------------------------------------- + +[ID] + +2 +[Name] + +George +[Age] + +27 +---------------------------------------- + +[ID] + +3 +[Name] + +Ringo +[Age] + +28 +---------------------------------------- + +[ID] + +4 +[Name] + +Paul +[Age] + +26 +---------------------------------------- + +[ID] + +5 +[Name] + +Meredith +[Age] + +30 +----------------------------------------'; + + return array(&$view, $expected); + } + + /** + * Test to check if empty fields are correctly hidden. + */ + protected function testHideEmptySupport() { + $view = $this->getHideIfEmptyExportView(); + + // We need to ensure that the test fields are actually empty/0. + db_update('views_test') + ->fields(array('age' => 0,)) + ->condition('name', 'Paul') + ->execute(); + + db_update('views_test') + ->fields(array('name' => '',)) + ->condition('name', 'George') + ->execute(); + + db_update('views_test') + ->fields(array('name' => 0,)) + ->condition('name', 'John') + ->execute(); + + $expected = '[ID] + +1 +[Name] + +0 +[Age] + +25 +---------------------------------------- + +[ID] + +2 +[Age] + +27 +---------------------------------------- + +[ID] + +3 +[Name] + +Ringo +[Age] + +28 +---------------------------------------- + +[ID] + +4 +[Name] + +Paul +---------------------------------------- + +[ID] + +5 +[Name] + +Meredith +[Age] + +30 +----------------------------------------'; + + $message = 'Hide if empty support for ' . $this->vde_export_type . ' export matched expected output.'; + + $this->executeAndCompareGivenView($view, $expected, $message); + + } + +} diff --git a/sites/all/modules/contrib/views/views_data_export/tests/xls_export.test b/sites/all/modules/contrib/views/views_data_export/tests/xls_export.test new file mode 100644 index 00000000..ae47de76 --- /dev/null +++ b/sites/all/modules/contrib/views/views_data_export/tests/xls_export.test @@ -0,0 +1,48 @@ + 'XLS Export', + 'description' => 'Various tests for exporting to XLS.', + 'group' => 'Views Data Export', + ); + } + + protected $vde_export_type = 'XLS'; + + protected function getStylePluginName() { + return 'views_data_export_xls'; + } + + protected function getExportView($path = 'vde_test') { + // Create the basic view. + $view = $this->getBasicExportView(); + + $display = $view->new_display('views_data_export', 'Data export', 'vde_test'); + $display->override_option('style_plugin', $this->getStylePluginName()); + $display->override_option('path', $path); + + $expected = ' + + + + + + + + + + + +
    IDNameAge
    1John25
    2George27
    3Ringo28
    4Paul26
    5Meredith30
    + +'; + + return array(&$view, $expected); + } + +} diff --git a/sites/all/modules/contrib/views/views_data_export/tests/xml_export.test b/sites/all/modules/contrib/views/views_data_export/tests/xml_export.test new file mode 100644 index 00000000..6e52d506 --- /dev/null +++ b/sites/all/modules/contrib/views/views_data_export/tests/xml_export.test @@ -0,0 +1,386 @@ + 'XML Export', + 'description' => 'Various tests for exporting to XML.', + 'group' => 'Views Data Export', + ); + } + + protected $vde_export_type = 'XML'; + + protected function getStylePluginName() { + return 'views_data_export_xml'; + } + + protected function getExportView($path = 'vde_test') { + // Create the basic view. + $view = $this->getBasicExportView(); + + $display = $view->new_display('views_data_export', 'Data export', 'vde_test'); + $display->override_option('style_plugin', 'views_data_export_xml'); + $display->override_option('path', $path); + + $expected = ' + + + 1 + John + 25 + + + 2 + George + 27 + + + 3 + Ringo + 28 + + + 4 + Paul + 26 + + + 5 + Meredith + 30 + +'; + + return array(&$view, $expected); + } + + /** + * Test to check if empty fields are correctly hidden. + */ + protected function testHideEmptySupport() { + $view = $this->getHideIfEmptyExportView(); + + // We need to ensure that the test fields are actually empty/0. + db_update('views_test') + ->fields(array('age' => 0,)) + ->condition('name', 'Paul') + ->execute(); + + db_update('views_test') + ->fields(array('name' => '',)) + ->condition('name', 'George') + ->execute(); + + db_update('views_test') + ->fields(array('name' => 0,)) + ->condition('name', 'John') + ->execute(); + + $expected = ' + + + 1 + 0 + 25 + + + 2 + 27 + + + 3 + Ringo + 28 + + + 4 + Paul + + + 5 + Meredith + 30 + +'; + + $message = 'Hide if empty support for ' . $this->vde_export_type . ' export matched expected output.'; + + $this->executeAndCompareGivenView($view, $expected, $message); + + } + + /** + * Test to ensure that valid XML is produced when someone doesn't specify a label. + */ + protected function testEmptyLabels() { + $view = $this->getBasicExportView(); + + $display = $view->display['default']->handler; + + $display->override_option('fields', array( + 'id' => array( + 'id' => 'id', + 'table' => 'views_test', + 'field' => 'id', + 'relationship' => 'none', + ), + 'name' => array( + 'id' => 'name', + 'table' => 'views_test', + 'field' => 'name', + 'relationship' => 'none', + // Remove the label from the name field. + 'label' => '', + ), + 'age' => array( + 'id' => 'age', + 'table' => 'views_test', + 'field' => 'age', + 'relationship' => 'none', + // Make this label intentially invalid XML. + 'label' => '.', + ), + )); + + $expected = ' + + + 1 + John + 25 + + + 2 + George + 27 + + + 3 + Ringo + 28 + + + 4 + Paul + 26 + + + 5 + Meredith + 30 + +'; + + $message = 'Empty label test in ' . $this->vde_export_type . ' export matched expected output.'; + + $this->executeAndCompareGivenView($view, $expected, $message); + } + + /** + * Test to ensure that XML nodes names can be manually specified. + */ + protected function testCustomiseXMLNodes() { + $view = $this->getBasicExportView(); + + // Load the include that contains the _views_data_export_xml_tag_clean function. + module_load_include('inc', 'views_data_export', 'theme/views_data_export.theme'); + + + $root_node = _views_data_export_xml_tag_clean($this->randomName()); + $item_node = _views_data_export_xml_tag_clean($this->randomName()); + + $style_options = array( + 'root_node' => $root_node, + 'item_node' => $item_node, + ); + + $expected = ' +<' . $root_node . '> + <' . $item_node . '> + 1 + John + 25 + + <' . $item_node . '> + 2 + George + 27 + + <' . $item_node . '> + 3 + Ringo + 28 + + <' . $item_node . '> + 4 + Paul + 26 + + <' . $item_node . '> + 5 + Meredith + 30 + +'; + + $message = 'Custom XML nodes test in ' . $this->vde_export_type . ' export matched expected output.'; + + $this->executeAndCompareGivenView($view, $expected, $message, $style_options); + } + + /** + * Test to ensure certain fields can be optionally non-escaped. + */ + protected function testXMLNoEntityEncode() { + $view = $this->getBasicExportView(); + + $display = $view->display['default']->handler; + + $style_options = array( + 'no_entity_encode' => array( + 'id' => 'id', + ), + ); + + $display->override_option('fields', array( + 'id' => array( + 'id' => 'id', + 'table' => 'views_test', + 'field' => 'id', + 'relationship' => 'none', + 'alter' => array( + 'alter_text' => TRUE, + 'text' => '[id]', + ), + ), + 'name' => array( + 'id' => 'name', + 'table' => 'views_test', + 'field' => 'name', + 'relationship' => 'none', + 'alter' => array( + 'alter_text' => TRUE, + 'text' => '[name]', + ), + ), + 'age' => array( + 'id' => 'age', + 'table' => 'views_test', + 'field' => 'age', + 'relationship' => 'none', + ), + )); + + $expected = ' + + + 1 + <em>John</em> + 25 + + + 2 + <em>George</em> + 27 + + + 3 + <em>Ringo</em> + 28 + + + 4 + <em>Paul</em> + 26 + + + 5 + <em>Meredith</em> + 30 + +'; + + $message = 'XML in values test in ' . $this->vde_export_type . ' export matched expected output.'; + + $this->executeAndCompareGivenView($view, $expected, $message, $style_options); + } + + /** + * Test to ensure certain fields can be optionally non-escaped. + */ + protected function testXMLCDATAWrapper() { + $view = $this->getBasicExportView(); + + $style_options = array( + 'cdata_wrapper' => array( + 'id' => 'id', + 'name' => 'name', + ), + ); + + $display = $view->display['default']->handler; + + $display->override_option('fields', array( + 'id' => array( + 'id' => 'id', + 'table' => 'views_test', + 'field' => 'id', + 'relationship' => 'none', + ), + 'name' => array( + 'id' => 'name', + 'table' => 'views_test', + 'field' => 'name', + 'relationship' => 'none', + 'alter' => array( + 'alter_text' => TRUE, + 'text' => '[name]', + ), + ), + 'age' => array( + 'id' => 'age', + 'table' => 'views_test', + 'field' => 'age', + 'relationship' => 'none', + ), + )); + + $expected = ' + + + + John]]> + 25 + + + + George]]> + 27 + + + + Ringo]]> + 28 + + + + Paul]]> + 26 + + + + Meredith]]> + 30 + +'; + + $message = 'XML in values test in ' . $this->vde_export_type . ' export matched expected output.'; + + $this->executeAndCompareGivenView($view, $expected, $message, $style_options); + } + +}