diff --git a/autoassignrole.admin.inc b/autoassignrole.admin.inc index 2efdfc8..a6f52c9 100644 --- a/autoassignrole.admin.inc +++ b/autoassignrole.admin.inc @@ -50,13 +50,7 @@ function autoassignrole_auto_settings() { '#options' => array(1 => t('Enabled'), 0 => t('Disabled')), ); - // We can disregard the authenticated user role since it is assigned to each - // user by Drupal. - $roles = user_roles(TRUE); - unset($roles[DRUPAL_AUTHENTICATED_RID]); - $roles = drupal_map_assoc(array_values($roles)); - - if ($roles) { + if ($roles = autoassignrole_get_roles()) { $form['autoassignrole_auto_roles'] = array( '#type' => 'checkboxes', '#title' => t('Roles'), @@ -84,13 +78,7 @@ function autoassignrole_user_settings() { '#options' => array(1 => t('Enabled'), 0 => t('Disabled')), ); - // We can disregard the authenticated user role since it is assigned to each - // user by Drupal. - $roles = user_roles(TRUE); - unset($roles[DRUPAL_AUTHENTICATED_RID]); - $roles = drupal_map_assoc($roles); - - if ($roles) { + if ($roles = autoassignrole_get_roles()) { $form['autoassignrole_user_roles'] = array( '#type' => 'checkboxes', '#title' => t('Roles'), @@ -174,26 +162,31 @@ function autoassignrole_user_settings() { } /** - * Implements hook_form(). + * Provides a FAPI form for adding and editing pages. * - * Form to edit or add role-specific pages. + * @param array $form + * The form API form array. + * @param array $form_state + * The form API form state array. + * @param stdClass|null + * The existing page object or NULL for a new page. + * + * @return array + * A form API renderable array. */ -function autoassignrole_page_form($form, &$form_state, $op = 'add', $name = NULL) { - $roles = user_roles(TRUE); - unset($roles[DRUPAL_AUTHENTICATED_RID]); - $roles = drupal_map_assoc($roles); - - if ($op == 'add') { - $page = (object) array('name' => '', 'title' => '', 'path' => '', 'roles' => array(), 'menu' => '', 'display' => ''); - } - else { - $page = autoassignrole_get_page($name); - $page->roles = drupal_map_assoc(unserialize($page->roles)); +function autoassignrole_page_form($form, &$form_state, stdClass $page = NULL) { + $is_new = empty($page); + if ($is_new) { + $page = autoassignrole_page_create(); } - $form['operation'] = array( + $form['is_new'] = array( '#type' => 'value', - '#value' => $op, + '#value' => $is_new, + ); + $form['export_type'] = array( + '#type' => 'value', + '#value' => $page->export_type, ); $form['title'] = array( '#type' => 'textfield', @@ -206,9 +199,9 @@ function autoassignrole_page_form($form, &$form_state, $op = 'add', $name = NULL $form['name'] = array( '#type' => 'machine_name', '#default_value' => $page->name, - '#disabled' => $op == 'edit', + '#disabled' => !$is_new, '#machine_name' => array( - 'exists' => 'autoassignrole_get_page', + 'exists' => 'autoassignrole_page_load', 'source' => array('title'), ), '#required' => TRUE, @@ -217,7 +210,7 @@ function autoassignrole_page_form($form, &$form_state, $op = 'add', $name = NULL '#type' => 'checkboxes', '#title' => t('Role'), '#description' => t('Select the roles this page will assign'), - '#options' => $roles, + '#options' => autoassignrole_get_roles(), '#required' => TRUE, '#default_value' => $page->roles, ); @@ -249,7 +242,7 @@ function autoassignrole_page_form($form, &$form_state, $op = 'add', $name = NULL $form['submit'] = array( '#type' => 'submit', - '#value' => $op == 'add' ? t('Add') : t('Save'), + '#value' => $is_new ? t('Add') : t('Save'), ); return $form; @@ -290,51 +283,74 @@ function autoassignrole_page_form_validate($form_id, &$form_state) { */ function autoassignrole_page_form_submit($form_id, &$form_state) { $values =& $form_state['values']; - $is_new = $values['operation'] == 'add'; + $is_new = $values['is_new']; $page = (object) array( 'name' => $values['name'], - 'roles' => serialize(array_keys(array_filter($values['roles']))), + 'roles' => array_keys(array_filter($values['roles'])), 'path' => $values['path'], 'menu' => $values['menu'], 'title' => $values['title'], 'display' => $values['display'], + 'export_type' => $values['export_type'] ); - $return = drupal_write_record('autoassignrole_page', $page, $is_new ? array() : 'name'); + ctools_include('export'); + $return = ctools_export_crud_save('autoassignrole_page', $page); - $ops = array(FALSE => t('updated'), TRUE => t('created')); - $op = $ops[$is_new]; if ($return !== FALSE) { menu_rebuild(); - drupal_set_message(t('Successfully @operation Page @page', array('@operation' => $op, '@page' => $page->title))); + if ($is_new) { + drupal_set_message(t('Successfully created page @page.', array('@page' => $page->title))); + } + else { + drupal_set_message(t('Successfully updated page @page.', array('@page' => $page->title))); + } drupal_goto('admin/config/people/autoassignrole/pages'); } else { - drupal_set_message(t('Unfortunately there has been an error and this page could not be %op', array('%op' => $op)), 'error'); + drupal_set_message(t('Error when trying to save page.'), 'error'); } } /** - * Function to delete role-specific page. + * Provides a FAPI form for deleting a pages. + * + * @param array $form + * The form API form array. + * @param array $form_state + * The form API form state array. + * @param stdClass|null + * The existing page object or NULL for a new page. + * @param string $mode + * Mode: 'delete' or 'revert'. + * + * @return array + * A form API renderable array. */ -function autoassignrole_page_delete_confirm($form, &$form_state, $page_id) { - $page = autoassignrole_get_page($page_id); - $form['page_id'] = array( +function autoassignrole_page_delete_confirm($form, &$form_state, $page, $mode) { + $form['page'] = array( '#type' => 'value', - '#value' => $page_id, + '#value' => $page, ); + if ($mode == 'delete') { + $message = t('Are you sure you want to delete the page %name ?', array('%name' => $page->title)); + $button = t('Delete'); + } + else { + $message = t('Are you sure you want to revert the page %name ?', array('%name' => $page->title)); + $button = t('Revert'); + } - return confirm_form($form, t('Are you sure you want to delete the page %name ?', array('%name' => $page->title)), 'admin/config/people/autoassignrole/pages', t('This action cannot be undone.'), t('Delete')); + return confirm_form($form, $message, 'admin/config/people/autoassignrole/pages', t('This action cannot be undone.'), $button); } /** * Form submit handler for autoassignrole_page_delete_confirm(). */ function autoassignrole_page_delete_confirm_submit($form, &$form_state) { - db_delete('autoassignrole_page') - ->condition('name', $form_state['values']['page_id']) - ->execute(); + ctools_include('export'); + ctools_export_crud_delete('autoassignrole_page', $form_state['values']['page']); menu_rebuild(); drupal_set_message(t('Successfully deleted page')); $form_state['redirect'] = 'admin/config/people/autoassignrole/pages'; @@ -347,56 +363,53 @@ function autoassignrole_page_delete_confirm_submit($form, &$form_state) { * Returns a build array. */ function autoassignrole_list_pages() { - $header = array( - array('data' => t('Name'), 'field' => 'name'), - array('data' => 'Title', 'field' => 'title', 'sort' => 'asc'), - array('data' => 'Roles', 'field' => 'roles'), - array('data' => 'Path', 'field' => 'path'), - array('data' => 'Operations'), + $header = array(t('Name'), t('Title'), t('Roles'), t('Path'), t('Storage'), t('Operations')); + $storage = array( + 'Normal' => t('Database'), + 'Default' => t('Code'), + 'Overridden' => t('Code but overridden'), ); - $query = db_select('autoassignrole_page', 'p') - ->extend('PagerDefault') - ->limit(10) - ->extend('TableSort') - ->orderByHeader($header) - ->fields('p', array( - 'name', - 'roles', - 'title', - 'path', - ) + $rows = array(); + ctools_include('export'); + foreach (ctools_export_crud_load_all('autoassignrole_page') as $page) { + $roles = implode(', ', $page->roles); + $operations = array( + array( + 'title' => t('Edit'), + 'href' => 'admin/config/people/autoassignrole/pages/edit/' . $page->name, + ) + ); + if (empty($page->in_code_only) && $page->type == 'Normal') { + $operations[] = array( + 'title' => t('Delete'), + 'href' => 'admin/config/people/autoassignrole/pages/delete/' . $page->name, ); + } + if ($page->type == 'Overridden') { + $operations[] = array( + 'title' => t('Revert'), + 'href' => 'admin/config/people/autoassignrole/pages/revert/' . $page->name, + ); + } - $results = $query->execute(); - - $rows = array(); - foreach ($results as $page) { - $roles = implode(', ', unserialize($page->roles)); - $edit = l(t('Edit'), 'admin/config/people/autoassignrole/pages/edit/' . $page->name); - $delete = l(t('Delete'), 'admin/config/people/autoassignrole/pages/delete/' . $page->name); - $links = $edit . ' | ' . $delete; $rows[] = array( - 'data' => array( - $page->name, - $page->title, - $roles, - $page->path, - $links, - ), + $page->name, + $page->title, + $roles, + $page->path, + $storage[$page->type], + theme(count($operations) == 1 ? 'links' : 'links__ctools_dropbutton', array( + 'links' => $operations, + 'attributes' => array('class' => array('links', 'inline')) + )), ); } - $html = theme('table', - array( - 'header' => $header, - 'rows' => $rows, - 'sticky' => TRUE, - 'empty' => 'No Auto Assign pages created...', - ) - ); - - $html .= theme('pager', array('tags' => array())); - - return $html; + return theme('table', array( + 'header' => $header, + 'rows' => $rows, + 'sticky' => TRUE, + 'empty' => t('No Auto Assign pages yet.'), + )); } diff --git a/autoassignrole.install b/autoassignrole.install index 4a58f2c..1d7a187 100644 --- a/autoassignrole.install +++ b/autoassignrole.install @@ -1,39 +1,17 @@ condition('name', db_like('autoassignrole_') . '%', 'LIKE') + ->execute(); } /** @@ -47,33 +25,40 @@ function autoassignrole_schema() { 'type' => 'varchar', 'length' => 255, 'not null' => TRUE, - 'description' => 'The unique machine name of this page.' + 'description' => 'The unique machine name of this page.', + 'object default' => '', ), 'roles' => array( 'type' => 'text', 'not null' => FALSE, 'description' => 'The roles for this page', + 'serialize' => TRUE, + 'object default' => array(), ), 'path' => array( 'type' => 'text', 'not null' => TRUE, 'description' => 'The path for this page', + 'object default' => '', ), 'menu' => array( 'type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'description' => 'The default parent menu for this menu item', + 'object default' => '', ), 'title' => array( 'type' => 'text', 'not null' => TRUE, 'description' => 'The description for this page', + 'object default' => '', ), 'display' => array( 'type' => 'int', 'not null' => TRUE, 'description' => 'The display type for this page', + 'object default' => '', ), ), 'primary key' => array('name'), @@ -296,6 +281,7 @@ function autoassignrole_update_7105() { 'type' => 'text', 'not null' => FALSE, 'description' => 'The roles for this page', + 'serialize' => TRUE, )); // Convert the {autoassignrole_page} table data. diff --git a/autoassignrole.module b/autoassignrole.module index 1d4cd15..22367c1 100644 --- a/autoassignrole.module +++ b/autoassignrole.module @@ -71,28 +71,36 @@ function autoassignrole_menu() { 'title' => 'Add Auto Assign Role Page', 'access arguments' => array('administer autoassignrole'), 'page callback' => 'drupal_get_form', - 'page arguments' => array('autoassignrole_page_form', 'add'), + 'page arguments' => array('autoassignrole_page_form'), 'type' => MENU_LOCAL_ACTION, 'file' => 'autoassignrole.admin.inc', ); - $items['admin/config/people/autoassignrole/pages/edit/%'] = array( + $items['admin/config/people/autoassignrole/pages/edit/%autoassignrole_page'] = array( 'title' => 'Edit Auto Assign Role Page', 'access arguments' => array('administer autoassignrole'), 'page callback' => 'drupal_get_form', - 'page arguments' => array('autoassignrole_page_form', 'edit', 6), + 'page arguments' => array('autoassignrole_page_form', 6), 'file' => 'autoassignrole.admin.inc', ); - $items['admin/config/people/autoassignrole/pages/delete/%'] = array( + $items['admin/config/people/autoassignrole/pages/delete/%autoassignrole_page'] = array( 'title' => 'Delete Auto Assign Role Page', 'access arguments' => array('administer autoassignrole'), 'page callback' => 'drupal_get_form', - 'page arguments' => array('autoassignrole_page_delete_confirm', 6), + 'page arguments' => array('autoassignrole_page_delete_confirm', 6, 'delete'), + 'file' => 'autoassignrole.admin.inc', + ); + $items['admin/config/people/autoassignrole/pages/revert/%autoassignrole_page'] = array( + 'title' => 'Revert Auto Assign Role Page', + 'access arguments' => array('administer autoassignrole'), + 'page callback' => 'drupal_get_form', + 'page arguments' => array('autoassignrole_page_delete_confirm', 6, 'revert'), 'file' => 'autoassignrole.admin.inc', ); - $pages = autoassignrole_get_pages(); + ctools_include('export'); + $pages = ctools_export_crud_load_all('autoassignrole_page'); foreach ($pages as $page) { - $roles = drupal_map_assoc(unserialize($page->roles)); + $roles = drupal_map_assoc($page->roles); switch ($page->display) { case AUTOASSIGNROLE_PAGE_DISPLAY_STANDARD: $items[$page->path] = array( @@ -167,6 +175,43 @@ function autoassignrole_menu() { } /** + * Provides a route loader for loading an Auto assign role page. + * + * @param string $name + * The page machine name. + * + * @return stdClass|false + * An Auto assign role page object or FALSE on failure. + */ +function autoassignrole_page_load($name) { + ctools_include('export'); + $page = ctools_export_crud_load('autoassignrole_page', $name); + return !empty($page) ? $page : FALSE; +} + +/** + * Creates an empty Auto assign role page object. + * + * @param array $values + * (optional) Associative array with initial values. + * + * @return stdClass + * An Auto assign role page object. + */ +function autoassignrole_page_create(array $values = array()) { + ctools_include('export'); + $page = ctools_export_new_object('autoassignrole_page'); + + foreach ($values as $key => $value) { + if (property_exists($page, $key)) { + $page->$key = $value; + } + } + + return $page; +} + +/** * Finds any role ids attached to current page, if any. */ function autoassignrole_get_active_path_roles() { @@ -285,50 +330,6 @@ function autoassignrole_form_user_register_form_alter(&$form, &$form_state) { } /** - * Function to retrieve all role-specific pages. - * - * @return SelectQuery - * An array of page objects. - */ -function autoassignrole_get_pages() { - $query = _autoasignrole_get_page_query(); - return $query->execute(); -} - -/** - * Function to get role-specific page details. - * - * @param int $id - * The id of the page to be updated. - * - * @return SelectQuery - * A query object with all page details. - */ -function autoassignrole_get_page($id) { - $query = _autoasignrole_get_page_query(); - $query->condition('name', $id, '='); - return $query->execute()->fetchObject(); -} - -/** - * Helper method for getting the page query object. - * - * @return SelectQuery - * The query object. - */ -function _autoasignrole_get_page_query() { - return db_select('autoassignrole_page', 'p') - ->fields('p', array( - 'name', - 'roles', - 'path', - 'title', - 'menu', - 'display', - )); -} - -/** * Get the user description filter field data. * * @return array @@ -407,3 +408,18 @@ function autoassignrole_features_pipe_autoassignrole_page_alter(&$pipe, $data, $ $pipe['variable'][] = $variable; } } + +/** + * Provides a list of roles having both keys and values as role name. + * + * The list is suitable to be used as options list in form API. The built-in + * 'anonymous' and 'authenticated user' roles are filtered out. + * + * @return array + * A list of roles. + */ +function autoassignrole_get_roles() { + $roles = user_roles(TRUE); + unset($roles[DRUPAL_AUTHENTICATED_RID]); + return drupal_map_assoc($roles); +} diff --git a/autoassignrole.test b/autoassignrole.test index 8d38733..93359a1 100644 --- a/autoassignrole.test +++ b/autoassignrole.test @@ -17,7 +17,6 @@ class AutoassignroleAdminAutoTestCase extends DrupalWebTestCase { 'name' => 'Admin auto', 'description' => 'Tests the administrative setting for auto assign role automatic assignment', 'group' => 'Auto assign role', - 'dependencies' => array('ctools'), ); } @@ -200,7 +199,6 @@ class AutoassignroleAdminUserTestCase extends DrupalWebTestCase { 'name' => 'Admin user', 'description' => 'Tests the administrative setting for auto assign role user selection', 'group' => 'Auto assign role', - 'dependencies' => array('ctools'), ); } @@ -652,7 +650,7 @@ class AuthassignroleRolePerPathTestCase extends DrupalWebTestCase { ); // Verify the path has been saved. - $this->assertText('Successfully created Page ' . $this->page_title, 'Verified that path has been created.'); + $this->assertText('Successfully created page ' . $this->page_title . '.', 'Verified that path has been created.'); } } @@ -667,7 +665,6 @@ class AutoassignroleAdminRolePerPageTestCase extends AuthassignroleRolePerPathTe 'name' => 'Admin role by path', 'description' => 'Tests the administrative setting for auto assign role role per page', 'group' => 'Auto assign role', - 'dependencies' => array('ctools'), ); } @@ -741,7 +738,6 @@ class AutoassignroleUserCreationTestCase extends DrupalWebTestCase { 'name' => 'User creation', 'description' => 'Tests the user creation functionality for auto assign role automatic assignment', 'group' => 'Auto assign role', - 'dependencies' => array('ctools'), ); } @@ -807,7 +803,6 @@ class AutoassignroleUserCreationRolePerPathTestCase extends AuthassignroleRolePe 'name' => 'User creation by path', 'description' => 'Tests the user creation functionality for auto assign role automatic assignment based upon a path', 'group' => 'Auto assign role', - 'dependencies' => array('ctools'), ); }