forum_access.install in Forum Access 6
Same filename and directory in other branches
Install, update and uninstall functions for the forum_access module.
File
forum_access.installView source
<?php
/**
* @file
* Install, update and uninstall functions for the forum_access module.
*
*/
/**
* Implementation of hook_install().
*/
function forum_access_install() {
drupal_install_schema('forum_access');
db_query("UPDATE {system} SET weight = 2 WHERE name = 'forum_access'");
if ($vid = variable_get('forum_nav_vocabulary', FALSE)) {
$result = db_query("\n SELECT t.tid\n FROM {term_data} t\n LEFT JOIN {forum_access} fa ON t.tid = fa.tid\n WHERE fa.tid IS NULL AND t.vid = %d\n ", $vid);
$grant_create_by_rid = array(
DRUPAL_ANONYMOUS_RID => 0,
DRUPAL_AUTHENTICATED_RID => 1,
);
while ($td = db_fetch_object($result)) {
foreach ($grant_create_by_rid as $rid => $grant_create) {
db_query("\n INSERT INTO {forum_access}\n (tid, rid, grant_view, grant_update, grant_delete, grant_create, priority)\n VALUES(%d, %d, 1, 0, 0, %d, 0)\n ", $td->tid, $rid, $grant_create);
}
}
}
}
/**
* Implementation of hook_schema().
*/
function forum_access_schema() {
$schema['forum_access'] = array(
'description' => 'The base Forum Access Control table.',
'fields' => array(
'tid' => array(
'description' => 'The {term_data}.tid to which this {forum_access} entry applies.',
'type' => 'int',
'not null' => TRUE,
'default' => 0,
),
'rid' => array(
'description' => 'The {role}.rid to which this {forum_access} entry applies.',
'type' => 'int',
'not null' => TRUE,
'default' => 0,
),
'grant_view' => array(
'description' => 'Whether to grant "view" permission.',
'type' => 'int',
'size' => 'tiny',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
),
'grant_update' => array(
'description' => 'Whether to grant "update" permission.',
'type' => 'int',
'size' => 'tiny',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
),
'grant_delete' => array(
'description' => 'Whether to grant "delete" permission.',
'type' => 'int',
'size' => 'tiny',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
),
'grant_create' => array(
'description' => 'Whether to grant "create" permission.',
'type' => 'int',
'size' => 'tiny',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
),
'priority' => array(
'description' => 'The priority of this grant.',
'type' => 'int',
'size' => 'small',
'not null' => TRUE,
'default' => 0,
),
),
'indexes' => array(
'tid' => array(
'tid',
),
'rid' => array(
'rid',
),
),
);
return $schema;
}
/**
* Implementation of hook_enable().
*/
function forum_access_enable() {
variable_del('forum_access_rids');
// clear cache
_forum_access_update_table();
}
/**
* Add missing default records to the {forum_acces} table.
*
* @return An array of links to the forums whose records have been added.
*/
function _forum_access_update_table() {
$result = db_query("SELECT td.tid, td.name FROM {term_data} td LEFT JOIN {forum_access} fa ON td.tid = fa.tid WHERE td.vid = %d AND fa.tid IS NULL", _forum_access_get_vid());
$forums = array();
while ($forum = db_fetch_array($result)) {
$forums[] = l($forum['name'], 'admin/content/forum/edit/forum/' . $forum['tid']);
$record = array(
'tid' => $forum['tid'],
'rid' => DRUPAL_ANONYMOUS_RID,
'grant_view' => 1,
);
drupal_write_record('forum_access', $record);
$record['rid'] = DRUPAL_AUTHENTICATED_RID;
$record['grant_create'] = 1;
drupal_write_record('forum_access', $record);
}
return $forums;
}
/**
* Implementation of hook_disable().
*/
function forum_access_disable() {
forum_access_enabled(FALSE);
}
/*
* Implementation of hook_uninstall().
*/
function forum_access_uninstall() {
// Remove moderator role.
if ($moderator_rid = variable_get('forum_access_moderator_rid', 0)) {
db_query('DELETE FROM {role} WHERE rid = %d', $moderator_rid);
db_query('DELETE FROM {permission} WHERE rid = %d', $moderator_rid);
db_query('DELETE FROM {users_roles} WHERE rid = %d', $moderator_rid);
}
drupal_uninstall_schema('forum_access');
variable_del('forum_access_allowed_node_edit_elements');
variable_del('forum_access_allowed_node_edit_options');
variable_del('forum_access_batch_threshold');
variable_del('forum_access_D5_legacy_mode');
variable_del('forum_access_default_template_tid');
variable_del('forum_access_moderator_rid');
variable_del('forum_access_new_template_tid');
variable_del('forum_access_provide_moderators_template_variable');
variable_del('forum_access_rids');
}
/**
* Purge orphaned grants that were left behind when deleting roles.
*/
function forum_access_update_1() {
$ret = array();
$ret[] = update_sql("DELETE FROM {forum_access} WHERE rid NOT IN (SELECT rid from {role})");
$ret[] = update_sql("DELETE FROM {node_access} WHERE realm = 'forum_access' AND gid NOT IN (SELECT rid from {role})");
return $ret;
}
/**
* Add a priority column (will probably not be used until D6).
*/
function forum_access_update_2() {
$ret = array();
db_add_field($ret, 'forum_access', 'priority', array(
'description' => 'The priority of this grant.',
'type' => 'int',
'size' => 'small',
'not null' => TRUE,
'default' => 0,
));
return $ret;
}
/**
* Warn users upgrading from Drupal 5.
*/
function forum_access_update_6100() {
drupal_set_message('<b>Upgrading Forum Access from Drupal 5? Then please read:</b><br />In Drupal 5, comment posting was not restricted by Forum Access; users with <em>View</em> access (and the <em>post comments</em> permission) were always allowed to post forum comments. Starting with Drupal 6, posting comments is now restricted to users with <em>Post</em> access. If you prefer the old behavior, then go to ' . l('Forum Settings', 'admin/content/forum/settings', array(
'fragment' => 'edit-forum-admin-settings-forum-access',
)) . ' and turn <em>Drupal 5 legacy mode</em> on.', 'warning', FALSE);
return array();
}
/**
* Clean out {forum_access} table and remove Forum Moderator assignments.
*/
function forum_access_update_6101() {
$ret = array();
$forum_vid = variable_get('forum_nav_vocabulary', 0);
$ret[] = update_sql("DELETE FROM {forum_access} WHERE tid NOT IN (SELECT tid FROM {term_data} WHERE vid = {$forum_vid})");
$ret[] = update_sql("DELETE FROM {forum_access} WHERE rid NOT IN (SELECT rid FROM {role})");
if ($moderator_rid = variable_get('forum_access_moderator_rid', FALSE)) {
$ret[] = update_sql("DELETE FROM {users_roles} WHERE rid = {$moderator_rid}");
$ret[] = update_sql("UPDATE {permission} SET perm = 'administer comments, administer nodes' WHERE rid = {$moderator_rid}");
}
return $ret;
}
/**
* Return the abort message.
*/
function abort_disabled_update() {
return array(
'#abort' => array(
'success' => FALSE,
'query' => t('Please enable %module before trying to run this update.', array(
'%module' => 'Forum Access',
)),
),
);
}
/**
* Set the proper permissions for the Forum Moderator role.
*/
function forum_access_update_6102() {
$ret = array();
if (!module_exists('forum_access')) {
return abort_disabled_update();
}
$moderator_rid = forum_access_query_moderator_rid();
if (isset($moderator_rid)) {
if (db_result(db_query("SELECT COUNT(*) FROM {permission} WHERE rid = %d", $moderator_rid))) {
$ret[] = update_sql("UPDATE {permission} SET perm = 'administer comments, administer nodes' WHERE rid = {$moderator_rid}");
}
else {
$ret[] = update_sql("INSERT INTO {permission} (rid, perm) VALUES ({$moderator_rid}, 'administer comments, administer nodes')");
}
}
return $ret;
}
/**
* Remove bogus rows from the {forum_access} table.
*/
function forum_access_update_6103() {
$ret = array();
if ($vid = variable_get('forum_nav_vocabulary', FALSE)) {
$ret[] = update_sql("\n DELETE FROM {forum_access}\n WHERE tid NOT IN (\n SELECT t.tid\n FROM {term_data} t\n WHERE t.vid = {$vid}\n )\n ");
if ($ret[0]['success'] && ($affected_rows = db_affected_rows())) {
$ret[0]['query'] = $ret[0]['query'] . '<br />' . $affected_rows . ' bogus rows purged.';
}
}
return $ret;
}
/**
* Remove grants for roles with the 'administer nodes' permission.
*/
function forum_access_update_6104() {
$ret = array();
if ($admin_rids = array_keys(user_roles(FALSE, 'administer nodes'))) {
$ret[] = update_sql("\n UPDATE {forum_access}\n SET grant_view = 0, grant_update = 0, grant_delete = 0\n WHERE rid IN (" . implode($admin_rids, ', ') . ")\n ");
$ret[] = update_sql("\n DELETE FROM {node_access}\n WHERE realm = 'forum_access'\n AND gid IN (" . implode($admin_rids, ', ') . ")\n ");
}
return $ret;
}
/**
* Add missing default records to the {forum_access} table.
*/
function forum_access_update_6105() {
if (!module_exists('forum_access')) {
return abort_disabled_update();
}
$forums = _forum_access_update_table();
$msg = t('Please see the <a href="@href">release notes for release 6.x-1.5 of the @Forum_Access module</a>.', array(
'@href' => 'http://drupal.org/node/936848',
'@Forum_Access' => 'Forum Access',
));
if (!empty($forums)) {
$msg .= '<br />' . t('The following forums have been updated as explained in the release notes:') . '<ul><li>' . implode($forums, '</li><li>') . '</li></ul>';
}
drupal_set_message($msg, 'warning');
return array();
}
/**
* Change our {acl} table records from 'name' to 'number'.
*/
function forum_access_update_6106() {
$acl_version = db_result(db_query("SELECT schema_version FROM {system} WHERE type = 'module' AND name = 'acl'"));
if ($acl_version < 6002) {
$ret[] = array(
'success' => FALSE,
'query' => t('Please update the !ACL module (%version) to version !link or later first!', array(
'!ACL' => l('ACL', 'http://drupal.org/project/acl'),
'%version' => $acl_version,
'!link' => l('6.x-1.3', 'http://drupal.org/node/1017698'),
)),
);
$ret['#abort'] = array(
'success' => FALSE,
'query' => t('Some updates are still pending.<br/>Please re-run the update script.'),
);
return $ret;
}
switch ($GLOBALS['db_type']) {
case 'pgsql':
$ret[] = update_sql("UPDATE {acl} SET number = CAST(name AS INTEGER) WHERE module = 'forum_access' AND name IS NOT NULL");
break;
default:
$ret[] = update_sql("UPDATE {acl} SET number = name WHERE module = 'forum_access' AND name IS NOT NULL");
}
if ($ret[0]['success']) {
$ret[] = update_sql("UPDATE {acl} SET name = NULL WHERE module = 'forum_access' AND number IS NOT NULL");
}
return $ret;
}
/**
* Add the 'post comments' permissions to the Forum Moderator role.
*/
function forum_access_update_6107() {
$ret = array();
if ($moderator_rid = variable_get('forum_access_moderator_rid', 0)) {
$result = db_query("SELECT p.rid, p.perm FROM {permission} p WHERE p.rid = %d", $moderator_rid);
if ($moderator = db_fetch_array($result)) {
$perm = $moderator['perm'];
$perms = explode(', ', $perm);
foreach (array(
'post comments',
'post comments without approval',
) as $p) {
if (array_search($p, $perms) === FALSE) {
$perms[] = $p;
}
}
$new_perm = implode(', ', $perms);
if ($new_perm != $perm) {
$ret[] = update_sql("UPDATE {permission} SET perm = '{$new_perm}' WHERE rid = {$moderator_rid}");
}
}
}
return $ret;
}
Functions
Name | Description |
---|---|
abort_disabled_update | Return the abort message. |
forum_access_disable | Implementation of hook_disable(). |
forum_access_enable | Implementation of hook_enable(). |
forum_access_install | Implementation of hook_install(). |
forum_access_schema | Implementation of hook_schema(). |
forum_access_uninstall | |
forum_access_update_1 | Purge orphaned grants that were left behind when deleting roles. |
forum_access_update_2 | Add a priority column (will probably not be used until D6). |
forum_access_update_6100 | Warn users upgrading from Drupal 5. |
forum_access_update_6101 | Clean out {forum_access} table and remove Forum Moderator assignments. |
forum_access_update_6102 | Set the proper permissions for the Forum Moderator role. |
forum_access_update_6103 | Remove bogus rows from the {forum_access} table. |
forum_access_update_6104 | Remove grants for roles with the 'administer nodes' permission. |
forum_access_update_6105 | Add missing default records to the {forum_access} table. |
forum_access_update_6106 | Change our {acl} table records from 'name' to 'number'. |
forum_access_update_6107 | Add the 'post comments' permissions to the Forum Moderator role. |
_forum_access_update_table | Add missing default records to the {forum_acces} table. |