rendered paste bodyfunction views_bookmark_page($how = 'mark', $nid = '', $vbid = '') { // anonymous users can't create bookmarks with this system. global $user; if (!$user || !$user->uid) { return drupal_access_denied(); } $roles = array_keys($user->roles); if ($nid && $node = node_load($nid)); if (!$node) { return drupal_access_denied(); } $result = db_result(db_query("SELECT type FROM {views_bookmark_nodetypes} WHERE vbid = %d AND type = '%s'", $vbid, $node->type)); if (!$result) { return drupal_access_denied(); } $bookmark = db_fetch_object(db_query("SELECT * FROM {views_bookmarks} WHERE vbid = %d", $vbid)); $access = explode(', ', $bookmark->roles); if (!array_intersect($access, $roles)) { return drupal_access_denied(); } // Finally! We have all our ducks in a row. Almost. $uid = $bookmark->global ? 0 : $user->uid; $bookmarked = db_result(db_query("SELECT vbid FROM {views_bookmark_nodes} WHERE vbid = %d AND uid = %d AND nid = %d", $vbid, $uid, $nid)); if ($bookmarked && $how == 'unmark') { db_query("DELETE FROM {views_bookmark_nodes} WHERE vbid = %d AND uid = %d AND nid = %d", $vbid, $uid, $nid); } elseif (!$bookmarked && $how == 'mark') { db_query("INSERT INTO {views_bookmark_nodes} (vbid, uid, nid) VALUES (%d, %d, %d)", $vbid, $uid, $nid); } // Update the bookmark count for this node $count = db_result(db_query('SELECT count(*) FROM {views_bookmark_nodes} WHERE vbid = %d AND nid = %d', $vbid, $nid)); $result = db_query('UPDATE {views_bookmark_node_count} set count = %d WHERE vbid = %d AND nid = %d', $count, $vbid, $nid); if (!db_affected_rows()) { db_query('INSERT INTO {views_bookmark_node_count} VALUES (%d, %d, %d)', $vbid, $nid, $count); } drupal_goto(referer_uri());}//EATE TABLE views_bookmark_nodes_count (// vbid int(10) unsigned NOT NULL default '0',// nid int(10) unsigned NOT NULL default '0',// count int(10) unsigned NOT NULL default '0',// KEY (vbid, nid)// ---------------------------------------------------------------------------// Views hooks/** * Implementation of hook_views_tables */function views_bookmark_views_tables() { // This creates a pseudo table for each bookmark. Doing anything // less would make it harder to filter on multiple bookmarks. $result = db_query("SELECT * from {views_bookmarks} ORDER BY title"); while ($bookmark = db_fetch_object($result)) { $table = array( "name" => "views_bookmark_nodes", "provider" => "views_bookmark", "join" => array( "left" => array( "table" => "node", "field" => "nid" ), "right" => array( "field" => "nid" ), "extra" => array( 'vbid' => $bookmark->vbid ), ), "fields" => array( "vbid" => array( 'name' => t("Bookmark: Ops for %s", array("%s" => $bookmark->title)), 'handler' => 'views_bookmark_ops_handler', 'query_handler' => 'views_bookmark_ops_qhandler', 'vbid' => $bookmark->vbid, ), ), "filters" => array( "uid" => array( 'name' => t("Bookmark: %s", array("%s" => $bookmark->title)), 'list' => array('NULL' => 'Marked'), // Do not be alarmed by the reversal. IS NOT NULL means // is marked. 'operator' => array('IS NOT' => "Is", 'IS' => "Is Not"), 'handler' => 'views_bookmark_handler', 'help' => t("This will filter a only nodes that contain the '%s' mark.", array("%s" => $bookmark->title)), ), ), ); // if bookmark isn't global, ensure it matches only for the current // user. if (!$bookmark->global) { $table['join']['extra']['uid'] = "***CURRENT_USER***"; } $tables["views_bookmark_nodes_$bookmark->vbid"] = $table; $table = array( "name" => "views_bookmarks", "provider" => "views_bookmark", "join" => array( "left" => array( "table" => "views_bookmark_nodes_$bookmark->vbid", // pseudo "field" => "vbid" ), "right" => array( "field" => "vbid" ), // no need for extra because the table it links through already has that ), ); $tables["views_bookmarks_$bookmark->vbid"] = $table; $table = array( "name" => "views_bookmark_nodetypes", "provider" => "views_bookmark", "join" => array( "left" => array( "table" => "node", "field" => "type" ), "right" => array( "field" => "type" ), "extra" => array( 'vbid' => $bookmark->vbid ), ), ); $tables["views_bookmark_nodetypes_$bookmark->vbid"] = $table; $table = array( "name" => "views_bookmark_node_count", "provider" => "views_bookmark", "join" => array( "left" => array( "table" => "node", "field" => "nid" ), "right" => array( "field" => "nid" ), "extra" => array( 'vbid' => $bookmark->vbid ), ), "fields" => array( "count" => array( 'name' => t("Bookmark: Count for %s", array("%s" => $bookmark->title)), 'handler' => 'views_bookmark_ops_handler', 'query_handler' => 'views_bookmark_ops_qhandler', 'vbid' => $bookmark->vbid, ), ), ); $tables["views_bookmark_node_count"] = $table; } return $tables;}