diff --git a/front_page.admin.inc b/front_page.admin.inc index f4e9599..9c4de2d 100644 --- a/front_page.admin.inc +++ b/front_page.admin.inc @@ -27,7 +27,7 @@ function front_page_admin($form, &$form_state) { ); // build the form for roles - $roles = user_roles(); + $roles = front_page_get_roles_untranslated(); $front_page_data = front_page_get_all(); // Map the available modes common for all roles. @@ -55,20 +55,20 @@ function front_page_admin($form, &$form_state) { } // Iterate each role - foreach ($roles as $rid => $role) { + foreach ($roles as $role) { // Determine the mode for this role - $mode = isset($front_page_data[$rid]['mode']) ? $front_page_data[$rid]['mode'] : ''; + $mode = isset($front_page_data[$role->name]) ? $front_page_data[$role->name]->mode : ''; - $form['roles'][$rid] = array( + $form['roles'][$role->name] = array( '#type' => 'fieldset', '#collapsible' => TRUE, '#collapsed' => TRUE, - '#title' => t('Front Page for !rolename (%mode)', array('!rolename' => $role, '%mode' => $modes[$mode])), - '#weight' => isset($front_page_data[$rid]['weight']) ? $front_page_data[$rid]['weight'] : 0, + '#title' => t('Front Page for !rolename (%mode)', array('!rolename' => $role->name, '%mode' => $modes[$mode])), + '#weight' => isset($front_page_data[$role->name]) ? $front_page_data[$role->name]->weight : 0, ); - $form['roles'][$rid]['mode'] = array( + $form['roles'][$role->name]['mode'] = array( '#type' => 'radios', '#title' => t('Select mode'), '#default_value' => $mode, @@ -78,11 +78,11 @@ function front_page_admin($form, &$form_state) { // We need a wrapper because of a core bug that prevents the visible // #state from properly hiding text_format widgets: // @see: https://drupal.org/node/997826 - $form['roles'][$rid]['data_wrapper'] = array( + $form['roles'][$role->name]['data_wrapper'] = array( '#type' => 'container', '#states' => array( 'visible' => array( - ':input[name="roles[' . $rid . '][mode]"]' => array( + ':input[name="roles[' . $role->name . '][mode]"]' => array( array('value' => 'full'), array('value' => 'themed') ), @@ -90,24 +90,24 @@ function front_page_admin($form, &$form_state) { ), ); - $form['roles'][$rid]['data_wrapper']['data'] = array( + $form['roles'][$role->name]['data_wrapper']['data'] = array( '#type' => 'text_format', '#title' => t('Data'), - '#default_value' => (isset($front_page_data[$rid]['data']) && isset($front_page_data[$rid]['mode']) && ($front_page_data[$rid]['mode'] == 'themed' || $front_page_data[$rid]['mode'] == 'full')) ? $front_page_data[$rid]['data'] : NULL, - '#format' => !empty($front_page_data[$rid]['filter_format']) ? $front_page_data[$rid]['filter_format'] : NULL, + '#default_value' => (isset($front_page_data[$role->name]) && ($front_page_data[$role->name]->mode == 'themed' || $front_page_data[$role->name]->mode == 'full')) ? $front_page_data[$role->name]->data : NULL, + '#format' => !empty($front_page_data[$role->name]) && $front_page_data[$role->name]->filter_format ? $front_page_data[$role->name]->filter_format : filter_default_format(), '#description' => t('Paste your HTML or TEXT here.') . '

' . t('You can paste in the full HTML code for a complete page and include a different style sheet in the HEAD of the document if you want a completely different layout and style to the rest of your site.'), ); - $form['roles'][$rid]['path'] = array( + $form['roles'][$role->name]['path'] = array( '#type' => 'textfield', '#title' => t('Path'), - '#default_value' => (isset($front_page_data[$rid]['data']) && isset($front_page_data[$rid]['mode']) && ($front_page_data[$rid]['mode'] == 'redirect' || $front_page_data[$rid]['mode'] == 'alias')) ? $front_page_data[$rid]['data'] : NULL, + '#default_value' => (isset($front_page_data[$role->name]) && ($front_page_data[$role->name]->mode == 'redirect' || $front_page_data[$role->name]->mode == 'alias')) ? $front_page_data[$role->name]->data : NULL, '#cols' => 20, '#rows' => 1, '#description' => t('If you are using Redirect or Alias you need to specify the path. An alias path should only include the URL part of a URL (eg "node/51"). A redirect path can contain a full URL including get parameters and fragment string (eg "node/51?page=5#anchor").'), '#states' => array( 'visible' => array( - ':input[name="roles[' . $rid . '][mode]"]' => array( + ':input[name="roles[' . $role->name . '][mode]"]' => array( array('value' => 'redirect'), array('value' => 'alias') ), @@ -129,25 +129,25 @@ function front_page_admin($form, &$form_state) { */ function front_page_admin_validate($form, &$form_state) { if (is_array($form_state['values']['roles'])) { - foreach ($form_state['values']['roles'] as $rid => $role) { + foreach ($form_state['values']['roles'] as $role_name => $role) { switch ($role['mode']) { case 'themed': case 'full': if (empty($role['data_wrapper']['data']['value'])) { - form_set_error('roles][' . $rid . '][data][value', 'You must set the data field for ' . $role['mode'] . ' mode.'); + form_set_error('roles][' . $role_name . '][data][value', 'You must set the data field for ' . $role['mode'] . ' mode.'); } break; case 'redirect': if (empty($role['path'])) { - form_set_error('roles][' . $rid . '][path', 'You must set the path field for redirect mode.'); + form_set_error('roles][' . $role_name . '][path', 'You must set the path field for redirect mode.'); } break; case 'alias': if (empty($role['path'])) { - form_set_error('roles][' . $rid . '][path', 'You must set the path field for alias mode.'); + form_set_error('roles][' . $role_name . '][path', 'You must set the path field for alias mode.'); } elseif (!preg_match('@^[^?#]+$@', $role['path'])) { - form_set_error('roles][' . $rid . '][path', 'You must set only the URI part of a URL in alias mode.'); + form_set_error('roles][' . $role_name . '][path', 'You must set only the URI part of a URL in alias mode.'); } break; } @@ -160,44 +160,34 @@ function front_page_admin_validate($form, &$form_state) { */ function front_page_admin_submit($form, &$form_state) { variable_set('front_page_enable', $form_state['values']['front_page_enable']); - - db_query("UPDATE {front_page} SET mode=''"); if (is_array($form_state['values']['roles'])) { - foreach ($form_state['values']['roles'] as $rid => $role) { + foreach ($form_state['values']['roles'] as $role_name => $role) { + $setting = front_page_get_by_role_name($role_name); + if (!$setting) { + $setting = new stdClass(); + $setting->role = $role_name; + $setting->export_type = EXPORT_IN_CODE; + } switch ($role['mode']) { case 'themed': case 'full': - db_merge('front_page') - ->key(array('rid' => $rid)) - ->fields(array( - 'mode' => $role['mode'], - 'data' => $role['data_wrapper']['data']['value'], - 'filter_format' => $role['data_wrapper']['data']['format'], - )) - ->execute(); + $setting->mode = $role['mode']; + $setting->data = $role['data_wrapper']['data']['value']; + $setting->filter_format = $role['data_wrapper']['data']['format']; break; case 'redirect': case 'alias': - db_merge('front_page') - ->key(array('rid' => $rid)) - ->fields(array( - 'mode' => $role['mode'], - 'data' => $role['path'], - 'filter_format' => '', - )) - ->execute(); + $setting->mode = $role['mode']; + $setting->data = $role['path']; + $setting->filter_format = ''; break; default: - db_merge('front_page') - ->key(array('rid' => $rid)) - ->fields(array( - 'mode' => '', - 'data' => '', - 'filter_format' => '', - )) - ->execute(); + $setting->mode = ''; + $setting->data = ''; + $setting->filter_format = ''; break; } + ctools_export_crud_save('front_page', $setting); } } drupal_set_message(t('Your settings have been saved.')); @@ -207,21 +197,18 @@ function front_page_admin_submit($form, &$form_state) { * Form for arranging the roles according to what order the roles should be processed. */ function front_page_admin_arrange_form($form, &$form_state) { - $roles = user_roles(); $front_page_data = front_page_get_all(); - foreach ($roles as $rid => $role) { - $front_page_data[$rid]['name'] = $role; - } $form['roles'] = array( '#tree' => TRUE, ); - foreach ($front_page_data as $role_id => $role) { - $form['roles'][$role_id]['title']['#markup'] = $role['name']; - $form['roles'][$role_id]['mode']['#markup'] = !empty($role['mode']) ? $role['mode'] : 'skip'; - $form['roles'][$role_id]['preview']['#markup'] = !empty($role['mode']) ? l(t('preview'), 'front_page/preview/' . $role_id, array('attributes' => array('target' => '_blank'))) : ''; - if (!empty($role['mode'])) { - $form['roles'][$role_id]['enabled'] = array( + foreach ($front_page_data as $role_name => $role) { + $loaded_role = user_role_load_by_name($role_name); + $form['roles'][$role_name]['title']['#markup'] = $role->role; + $form['roles'][$role_name]['mode']['#markup'] = !empty($role->mode) ? $role->mode : 'skip'; + $form['roles'][$role_name]['preview']['#markup'] = !empty($role->mode) ? l(t('preview'), 'front_page/preview/' . $loaded_role->rid, array('attributes' => array('target' => '_blank'))) : ''; + if (!empty($role->mode)) { + $form['roles'][$role_name]['enabled'] = array( '#type' => 'checkbox', '#title' => t('Enable'), '#title_display' => 'invisible', @@ -229,14 +216,14 @@ function front_page_admin_arrange_form($form, &$form_state) { ); } else { - $form['roles'][$role_id]['enabled']['#markup'] = 'disabled'; + $form['roles'][$role_name]['enabled']['#markup'] = 'disabled'; } - $form['roles'][$role_id]['weight'] = array( + $form['roles'][$role_name]['weight'] = array( '#type' => 'weight', '#title' => t('Weight'), '#title_display' => 'invisible', '#delta' => 10, - '#default_value' => isset($role['weight']) ? $role['weight'] : 0, + '#default_value' => isset($role->weight) ? $role->weight : 0, ); } @@ -252,25 +239,20 @@ function front_page_admin_arrange_form($form, &$form_state) { */ function front_page_admin_arrange_form_submit($form, &$form_state) { $front_page_data = front_page_get_all(); - foreach ($form_state['values']['roles'] as $rid => $role) { - if (isset($role['mode']) && !$role['mode'] || !isset($front_page_data[$rid])) { - db_merge('front_page') - ->key(array('rid' => $rid)) - ->fields(array( - 'mode' => '', - 'data' => '', - 'filter_format' => '', - 'weight' => $role['weight'], - )) - ->execute(); + foreach ($form_state['values']['roles'] as $role_name => $role) { + if (isset($role['mode']) && !$role['mode'] || !isset($front_page_data[$role_name])) { + $setting = isset($front_page_data[$role_name]) ? $front_page_data[$role_name] : new stdClass(); + $setting->role = $role_name; + $setting->mode = ''; + $setting->data = ''; + $setting->fielter_format = ''; + $setting->weight = $role['weight']; + ctools_export_crud_save('front_page', $setting); } else { - db_merge('front_page') - ->key(array('rid' => $rid)) - ->fields(array( - 'weight' => $role['weight'], - )) - ->execute(); + $setting = $front_page_data[$role_name]; + $setting->weight = $role['weight']; + ctools_export_crud_save('front_page', $setting); } } } @@ -313,8 +295,8 @@ function theme_front_page_admin_arrange_form($variables) { ); $rows = array(); - foreach (element_children($form['roles']) as $rid) { - $element = &$form['roles'][$rid]; + foreach (element_children($form['roles']) as $role_name) { + $element = &$form['roles'][$role_name]; // Add special classes to be used for tabledrag.js. $element['weight']['#attributes']['class'] = array('front-page-weight'); diff --git a/front_page.info b/front_page.info index d41d193..acaca12 100644 --- a/front_page.info +++ b/front_page.info @@ -3,3 +3,5 @@ description = Allows site admins setup custom front pages for the site. package = Administration core = 7.x configure = admin/config/front/settings + +dependencies[] = ctools diff --git a/front_page.install b/front_page.install index 91c2ecf..0715dbd 100644 --- a/front_page.install +++ b/front_page.install @@ -30,11 +30,18 @@ function front_page_schema() { $schema['front_page'] = array( 'description' => 'Stores Front Page settings.', 'fields' => array( - 'rid' => array( - 'type' => 'int', - 'not null' => TRUE, + 'id' => array( + 'type' => 'serial', 'unsigned' => TRUE, - 'description' => 'Primary Key: Role ID.', + 'not null' => TRUE, + 'description' => 'Primary key', + ), + 'role' => array( + 'type' => 'varchar', + 'length' => 64, + 'not null' => TRUE, + 'default' => '', + 'description' => 'Unique role name.', ), 'mode' => array( 'type' => 'varchar', @@ -62,10 +69,23 @@ function front_page_schema() { 'description' => 'The weight of the front page setting.', ) ), - 'primary key' => array('rid'), + 'primary key' => array('id'), 'indexes' => array( 'weight' => array('weight'), ), + 'export' => array( + 'key' => 'role', + 'key name' => 'Role name', + 'primary key' => 'id', + 'identifier' => 'front_page_preset', // Exports will be as $myobj + 'default hook' => 'default_front_page_presets', // Function hook name. + 'api' => array( + 'owner' => 'front_page', + 'api' => 'default_front_page_presets', // Base name for api include files. + 'minimum_version' => 2, + 'current_version' => 2, + ), + ), ); return $schema; @@ -143,4 +163,39 @@ function front_page_update_7201() { $path = variable_get('front_page_breadcrumb_redirect', ''); variable_set('front_page_home_link_path', $path); variable_del('front_page_breadcrumb_redirect'); -} \ No newline at end of file +} + +/** + * Use role names in stead of rids. + */ +function front_page_update_7202() { + db_change_field('front_page', 'rid', 'rid', array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + )); + db_drop_primary_key('front_page'); + db_add_field('front_page', 'id', array( + 'type' => 'serial', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'description' => 'Primary key', + ), array('indexes' => array('temp_index' => array('id')))); + db_add_field('front_page', 'role', array( + 'type' => 'varchar', + 'length' => 64, + 'not null' => TRUE, + 'default' => '', + 'description' => 'Unique role name.', + )); + $roles = db_select('role', 'r') + ->fields('r', array('rid', 'name')) + ->execute() + ->fetchAllKeyed(); + foreach ($roles as $rid => $name) { + db_update('front_page')->fields(array('role' => $name))->condition('rid', $rid)->execute(); + } + db_drop_field('front_page', 'rid'); + db_add_primary_key('front_page', array('id')); + db_drop_index('front_page', 'temp_index'); +} diff --git a/front_page.module b/front_page.module index 13c97b8..7c42edc 100644 --- a/front_page.module +++ b/front_page.module @@ -123,11 +123,14 @@ function front_page_init() { } if (user_access('administer menu') && preg_match('@^front_page/preview/([0-9]+)$@', $_GET['q'], $match)) { - $_front_page = front_page_get_by_rid($match[1]); + $role = user_role_load($match[1]); + if ($role) { + $_front_page = front_page_get_by_role_name($role->name); + } } if ($_front_page) { - switch ($_front_page['mode']) { + switch ($_front_page->mode) { case 'themed': case 'full': $_GET['q'] = 'front_page'; @@ -136,12 +139,12 @@ function front_page_init() { break; case 'redirect': - $url = front_page_parse_url($_front_page['data']); + $url = front_page_parse_url($_front_page->data); drupal_goto($url['path'], $url['options']); break; case 'alias': - $url = front_page_parse_url($_front_page['data']); + $url = front_page_parse_url($_front_page->data); $_GET['q'] = drupal_get_normal_path($url['path']); // need to set variable site_frontpage to current path so that it thinks it is the front page. $conf['site_frontpage'] = $_GET['q']; @@ -161,12 +164,12 @@ function front_page() { global $_front_page; if ($_front_page) { - switch ($_front_page['mode']) { + switch ($_front_page->mode) { case 'themed': - return check_markup($_front_page['data'], $_front_page['filter_format']); + return check_markup($_front_page->data, $_front_page->filter_format); case 'full': - print check_markup($_front_page['data'], $_front_page['filter_format']); + print check_markup($_front_page->data, $_front_page->filter_format); exit; } } @@ -203,42 +206,29 @@ function front_page_parse_url($path) { */ function front_page_get_by_role($index = 0, $number = 1) { global $user; - $result = db_select('front_page', 'fp') - ->fields('fp') - ->condition('rid', array_keys($user->roles)) - ->condition('mode', '', '<>') - ->orderBy('weight', 'ASC') - ->orderBy('rid', 'DESC') - ->range($index, $number) - ->execute() - ->fetchAssoc(); - return $result; + $roles = $user->roles; + ctools_include('export'); + $result = ctools_export_load_object('front_page', 'names', $user->roles); + uasort($result, 'front_page_sort_weight'); + return reset($result); } /** * Function to return the first role enabled in front page, ordered by weight. */ -function front_page_get_by_rid($rid) { - $result = db_select('front_page', 'fp') - ->fields('fp') - ->condition('rid', $rid) - ->condition('mode', '', '<>') - ->execute() - ->fetchAssoc(); - return $result; +function front_page_get_by_role_name($role_name) { + ctools_include('export'); + $result = ctools_export_load_object('front_page', 'names', array($role_name)); + return isset($result[$role_name]) ? $result[$role_name] : FALSE; } /** * Function to return all the roles in front page, ordered by weight. */ function front_page_get_all() { - global $user; - $result = db_select('front_page', 'fp') - ->fields('fp') - ->orderBy('weight', 'ASC') - ->orderBy('rid', 'DESC') - ->execute() - ->fetchAllAssoc('rid', PDO::FETCH_ASSOC); + ctools_include('export'); + $result = ctools_export_load_object('front_page'); + uasort($result, 'front_page_sort_weight'); return $result; } @@ -276,8 +266,22 @@ function front_page_theme() { * Implements hook_user_role_delete(). */ function front_page_user_role_delete($role) { - // Delete Front configuration for the role being deleted. - db_delete('front_page') - ->condition('rid', $role->rid) - ->execute(); + ctools_include('export'); + ctools_export_crud_delete('front_page', $role->name); +} + +function front_page_sort_weight($a, $b) { + if ($a->weight != $b->weight) { + return $a->weight - $b->weight; + } + $a_role = user_role_load_by_name($a->role); + $b_role = user_role_load_by_name($b->role); + return $b_role->rid - $a_role->rid; +} + +function front_page_get_roles_untranslated() { + return db_select('role', 'r') + ->fields('r') + ->execute() + ->fetchAllAssoc('rid', PDO::FETCH_OBJ); }