From 253524c527edd870d34390817e7856b31b487bf6 Mon Sep 17 00:00:00 2001 From: Bachir Soussi Chiadmi Date: Tue, 25 Oct 2016 20:12:36 +0200 Subject: [PATCH] updated flag_list to 3.x version. ATTENTION DO NOT WORK ANYMORE create new folder broken --- .../contrib/flag/flag_lists/CHANGELOG.txt | 45 +- .../flag-list--flag-3.2-compatibility.patch | 25 - .../flag-list--flag-3.x-compatibility.patch | 526 ----- ...ists-remove_deleted_entity-2114731-2.patch | 55 - .../flag/flag_lists/flag_lists.admin.inc | 116 +- .../contrib/flag/flag_lists/flag_lists.inc | 50 + .../contrib/flag/flag_lists/flag_lists.info | 12 +- .../flag/flag_lists/flag_lists.install | 196 +- .../contrib/flag/flag_lists/flag_lists.module | 732 +++---- .../flag/flag_lists/flag_lists.module.orig | 1737 ----------------- .../flag_lists/includes/flag_lists.views.inc | 11 +- .../includes/flag_lists.views_default.inc | 10 +- .../flag_lists_handler_field_list.inc | 2 +- .../flag_lists_handler_field_list_delete.inc | 4 +- .../flag_lists_handler_field_list_edit.inc | 2 +- .../includes/flag_lists_handler_field_ops.inc | 28 +- .../flag_lists_handler_field_template.inc | 6 +- ...lag_lists_handler_field_template_types.inc | 8 +- .../flag_lists_handler_filter_list.inc | 20 + .../flag/flag_lists/js/flag_lists_ops.js | 13 +- .../flag/flag_lists/theme/flag_lists.css | 4 +- 21 files changed, 781 insertions(+), 2821 deletions(-) delete mode 100644 sites/all/modules/contrib/flag/flag_lists/flag-list--flag-3.2-compatibility.patch delete mode 100644 sites/all/modules/contrib/flag/flag_lists/flag-list--flag-3.x-compatibility.patch delete mode 100644 sites/all/modules/contrib/flag/flag_lists/flag_lists-remove_deleted_entity-2114731-2.patch create mode 100644 sites/all/modules/contrib/flag/flag_lists/flag_lists.inc delete mode 100644 sites/all/modules/contrib/flag/flag_lists/flag_lists.module.orig create mode 100644 sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_filter_list.inc diff --git a/sites/all/modules/contrib/flag/flag_lists/CHANGELOG.txt b/sites/all/modules/contrib/flag/flag_lists/CHANGELOG.txt index 7b0923d9..a03382d9 100644 --- a/sites/all/modules/contrib/flag/flag_lists/CHANGELOG.txt +++ b/sites/all/modules/contrib/flag/flag_lists/CHANGELOG.txt @@ -1,14 +1,50 @@ -// $id: $ +Flag lists (Sep. 06, 2016) +==== +Tweeked the code to follow the proposals in the API -Flag lists (Jan. 27, 2011 +Flag lists (Aug. 24, 2015) +==== +#2535084: Enhanced selection messages +#2539056: flag_lists_do_flag doesn't work with skip_permission_check=true + +Flag lists (Jun. 10, 2015) +==== +#2379621: Three Error Messages +#2379719: Undefined Property Error Message +#2380077: Hidden Undefined Property Error Message +#2379743: Ajax Message Problems +#2379701: Two Required Fields +#2389083: Ensure that Flag_lists 7.x-3.x can only be used with Flag 7.x-3.0 +#2392489: uid lenght in flag_lists_flags and flag_lists_content +#2390871: New template creation +#2388741-11: Special Characters? +#2452549: Flag List 7.x-3.0-beta1 does to work with Views-generated lists - 0 item(s) added +#2453679: Add titles to view generated lists +#2454401: Views & uninstall +#2453803: Not all Flag lists operations are working +#2465553: Feature Requests: Option to customize wording; List Operations as block? +#2388741-24: Special Characters? +#2388741-28: Special Characters? +#2465553-8: Feature Requests: Option to customize wording; List Operations as block? +#2473121: Question about invoking hook_flag (This changes the name of the hooks for this module) +#2453803-5: Not all Flag lists operations are working +#2465553-13: Feature Requests: Option to customize wording; List Operations as block? +#2496007-2: Autocomplete when selecting a flag lists in a view +#2496007-3: Autocomplete when selecting a flag lists in a view + + +Flag lists (Jan. 27, 2011) +==== Fix bug: Incorrectly checking status of non-flag_lists flags. Fix bug: Incorrectly applying hook_flag_access() on non-flag_lists flags. -Flag lists (Jan. 14, 2011 +Flag lists (Jan. 14, 2011) +==== #1002292 Fixed Tokens not replaced in add-to-list and remove-from-list js messages. #1002292 Token module now a required dependency. Flag lists (Jan. 12, 2011) +==== #1023432 by erikwebb: Fixed No default value for $account in flag_lists_fl_delete(). #1002294 by architectJpres: Fixed List block incompatible with block caching. Block caching turned off for now. Still not making db updates so you need to @@ -75,4 +111,5 @@ improve some messages allow users with "administer flags" permission to bypass flag_lists_is_owner() checks. First run at views integration -Better admin table for lists \ No newline at end of file +Better admin table for lists + diff --git a/sites/all/modules/contrib/flag/flag_lists/flag-list--flag-3.2-compatibility.patch b/sites/all/modules/contrib/flag/flag_lists/flag-list--flag-3.2-compatibility.patch deleted file mode 100644 index 9905c5eb..00000000 --- a/sites/all/modules/contrib/flag/flag_lists/flag-list--flag-3.2-compatibility.patch +++ /dev/null @@ -1,25 +0,0 @@ -From d4d5acf83713c2a8413e1182294e887159c0e445 Mon Sep 17 00:00:00 2001 -From: Bachir Soussi Chiadmi -Date: Wed, 25 Sep 2013 15:25:25 +0200 -Subject: [PATCH] flag 3.2 compatibility - ---- - flag_lists.module | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/flag_lists.module b/flag_lists.module -index 13a5dd7..8b25b24 100644 ---- a/flag_lists.module -+++ b/flag_lists.module -@@ -1413,7 +1413,7 @@ function flag_lists_page($action = NULL, $flag_name = NULL, $entity_id = NULL) { - // $flag->link_type = 'toggle'; - $sid = flag_get_sid($user->uid); - $new_action = _flag_lists_is_flagged($flag, $entity_id, $user->uid, $sid) ? 'unflag' : 'flag'; -- $new_link = $flag->theme($new_action, $entity_id, TRUE); -+ $new_link = $flag->theme($new_action, $entity_id, array("after_flagging" => TRUE)); - flag_lists_fix_link($new_link, $new_action); - drupal_json_output(array( - 'status' => TRUE, --- -1.8.1.5 - diff --git a/sites/all/modules/contrib/flag/flag_lists/flag-list--flag-3.x-compatibility.patch b/sites/all/modules/contrib/flag/flag_lists/flag-list--flag-3.x-compatibility.patch deleted file mode 100644 index 9df64519..00000000 --- a/sites/all/modules/contrib/flag/flag_lists/flag-list--flag-3.x-compatibility.patch +++ /dev/null @@ -1,526 +0,0 @@ -diff --git a/flag_lists.admin.inc b/flag_lists.admin.inc -index a71a11cc511ebba08169b334407985c8f501bc30..71d532209d15f2171dce7d0906131572f22b97b3 100644 ---- a/flag_lists.admin.inc -+++ b/flag_lists.admin.inc -@@ -110,7 +110,7 @@ function flag_lists_add_js($type = NULL) { - } - - // New flag. Load the template row. -- $query = db_select('flags', 'f'); -+ $query = db_select('flag', 'f'); - $query->leftJoin('flag_lists_types', 'fl', 'f.name = fl.name'); - $query->fields('f') - ->fields('fl') -@@ -119,7 +119,7 @@ function flag_lists_add_js($type = NULL) { - $row = $query->execute() - ->fetchObject(); - -- $newflag = flag_flag::factory_by_content_type('node'); -+ $newflag = flag_flag::factory_by_entity_type('node'); - - $flag = $newflag->factory_by_row($row); - // The template fid becomes the flag_lists parent flag. -@@ -243,7 +243,7 @@ function flag_lists_form_submit($form, $form_state, $account = NULL) { - else { - // New flag. Load the template row. - $type = $form_state['values']['type']; -- $query = db_select('flags', 'f'); -+ $query = db_select('flag', 'f'); - $query->leftJoin('flag_lists_types', 'fl', 'f.name = fl.name'); - $query->fields('f') - ->fields('fl') -@@ -252,7 +252,7 @@ function flag_lists_form_submit($form, $form_state, $account = NULL) { - $row = $query->execute() - ->fetchObject(); - -- $newflag = flag_flag::factory_by_content_type('node'); -+ $newflag = flag_flag::factory_by_entity_type('node'); - - $flag = $newflag->factory_by_row($row); - // The template fid becomes the flag_lists parent flag. -diff --git a/flag_lists.install b/flag_lists.install -index bd290d10d849d116a8ca68fb6abf0dcc93136f53..a84fd496888fb65c6cdddacaf37828ede23def76 100644 ---- a/flag_lists.install -+++ b/flag_lists.install -@@ -30,7 +30,7 @@ function flag_lists_schema() { - 'unsigned' => TRUE, - 'not null' => TRUE, - ), -- 'content_type' => array( -+ 'entity_type' => array( - 'type' => 'varchar', - 'length' => '32', - 'not null' => TRUE, -@@ -72,13 +72,13 @@ function flag_lists_schema() { - 'not null' => TRUE, - 'default' => 0, - ), -- 'content_type' => array( -+ 'entity_type' => array( - 'type' => 'varchar', - 'length' => '32', - 'not null' => TRUE, - 'default' => '', - ), -- 'content_id' => array( -+ 'entity_id' => array( - 'type' => 'int', - 'unsigned' => TRUE, - 'not null' => TRUE, -@@ -106,11 +106,11 @@ function flag_lists_schema() { - ), - 'primary key' => array('fcid'), - 'unique keys' => array( -- 'fid_content_id_uid_sid' => array('fid', 'content_id', 'uid', 'sid'), -+ 'fid_entity_id_uid_sid' => array('fid', 'entity_id', 'uid', 'sid'), - ), - 'indexes' => array( -- 'content_type_content_id' => array('content_type', 'content_id'), -- 'content_type_uid_sid' => array('content_type', 'uid', 'sid'), -+ 'entity_type_entity_id' => array('entity_type', 'entity_id'), -+ 'entity_type_uid_sid' => array('entity_type', 'uid', 'sid'), - ), - ); - $schema['flag_lists_counts'] = array( -@@ -122,13 +122,13 @@ function flag_lists_schema() { - 'not null' => TRUE, - 'default' => 0, - ), -- 'content_type' => array( -+ 'entity_type' => array( - 'type' => 'varchar', - 'length' => '32', - 'not null' => TRUE, - 'default' => '', - ), -- 'content_id' => array( -+ 'entity_id' => array( - 'type' => 'int', - 'unsigned' => TRUE, - 'not null' => TRUE, -@@ -143,10 +143,10 @@ function flag_lists_schema() { - 'disp-width' => '10', - ) - ), -- 'primary key' => array('fid', 'content_id'), -+ 'primary key' => array('fid', 'entity_id'), - 'indexes' => array( -- 'fid_content_type' => array('fid', 'content_type'), -- 'content_type_content_id' => array('content_type', 'content_id'), -+ 'fid_entity_type' => array('fid', 'entity_type'), -+ 'entity_type_entity_id' => array('entity_type', 'entity_id'), - 'count' => array('count'), - ), - ); -@@ -190,13 +190,13 @@ function flag_lists_install() { - function flag_lists_uninstall() { - // Remove our template flags. - $query = db_select('flag_lists_types', 'fl'); -- $query->leftJoin('flags', 'f', 'fl.name = f.name'); -+ $query->leftJoin('flag', 'f', 'fl.name = f.name'); - $query->addField('fl', 'fid', 'fid'); - $query->distinct(); - $fids = $query->execute(); - - foreach ($fids as $fid) { -- db_delete('flags')->condition('fid', $fid->fid); -+ db_delete('flag')->condition('fid', $fid->fid); - db_delete('flag_content')->condition('fid', $fid->fid); - db_delete('flag_types')->condition('fid', $fid->fid); - db_delete('flag_counts')->condition('fid', $fid->fid); -diff --git a/flag_lists.module b/flag_lists.module -index 8fde9dd12b25e5e82ff79204fd800139460cd7e7..13a5dd77ead6832901a6fb0aac6511c0bc62eb3b 100644 ---- a/flag_lists.module -+++ b/flag_lists.module -@@ -214,7 +214,7 @@ function theme_flag_lists_user_list($variables) { - $content = flag_lists_get_flagged_content($fid, $uid); - foreach ($content as $item) { - if ($item->content_type == 'node') { -- $node = node_load($item->content_id); -+ $node = node_load($item->entity_id); - $items[] = l($node->title, 'node/' . $node->nid); - } - } -@@ -811,7 +811,7 @@ function flag_lists_set_messages(&$flag) { - * - * Make sure a user can only see his/her own personal flags. - */ --function flag_lists_flag_access($flag, $content_id, $action, $account) { -+function flag_lists_flag_access($flag, $entity_id, $action, $account) { - if (!empty($flag->module) && $flag->module == 'flag_lists') { - switch ($action) { - case 'flag': -@@ -936,7 +936,7 @@ function flag_lists_get_user_flags($content_type = NULL, $account = NULL, $use_f - $query = db_select('flag_lists_flags', 'fl') - ->fields('fl') - ->condition('fl.uid', $account->uid); -- $query->leftJoin('flags', 'f', 'fl.pfid = f.fid'); -+ $query->leftJoin('flag', 'f', 'fl.pfid = f.fid'); - $query->leftJoin('flag_lists_types', 'ft', 'ft.name = f.name'); - $query->addField('ft', 'type'); - if ($content_type) { -@@ -1011,12 +1011,12 @@ function theme_flag_lists_list($variables) { - // Make sure we have a node. - if (is_object($node) && user_access('create flag lists')) { - $content_type = $node->type; -- $content_id = $node->nid; -+ $entity_id = $node->nid; - } - // Or at least confirm we are on a node page and use has access. - elseif (arg(0) == 'node' && is_numeric(arg(1)) && user_access('create flag lists')) { -- $content_id = arg(1); -- $query = db_select('node')->condition('nid', $content_id); -+ $entity_id = arg(1); -+ $query = db_select('node')->condition('nid', $entity_id); - $query->addField('node', 'type'); - $content_type = $query->execute()->fetchField(); - } -@@ -1034,19 +1034,19 @@ function theme_flag_lists_list($variables) { - // Build the list of lists for this node. - foreach ($flags as $flag) { - if ($flag->module == 'flag_lists') { -- $action = _flag_lists_is_flagged($flag, $content_id, $user->uid, 0) ? 'unflag' : 'flag'; -+ $action = _flag_lists_is_flagged($flag, $entity_id, $user->uid, 0) ? 'unflag' : 'flag'; - } - else { -- $action = $flag->is_flagged($content_id) ? 'unflag' : 'flag';; -+ $action = $flag->is_flagged($entity_id) ? 'unflag' : 'flag';; - } - - // Do we need the ops? - if ($ops && $flag->module == 'flag_lists') { - $ops_links = theme('flag_lists_ops', array('flag' => $flag)); -- $link = $flag->theme($action, $content_id) . $ops_links; -+ $link = $flag->theme($action, $entity_id) . $ops_links; - } - else { -- $link = $flag->theme($action, $content_id); -+ $link = $flag->theme($action, $entity_id); - } - - // If it's a list, fix the link. -@@ -1201,12 +1201,12 @@ function flag_lists_get_flagged_content($fid, $uid) { - * The full flag object of for the flag link being generated. - * @param $action - * The action this link will perform. Either 'flag' or 'unflag'. -- * @param $content_id -+ * @param $entity_id - * The ID of the node, comment, user, or other object being flagged. - * @return - * An array defining properties of the link. - */ --function flag_lists_flag_link($flag, $action, $content_id) { -+function flag_lists_flag_link($flag, $action, $entity_id) { - return array(); - } - -@@ -1224,30 +1224,61 @@ function flag_lists_flag_link_types() { - - - function flag_lists_flag_default_flags($name = 'fl_template') { -- return array( -- array( -- 'api_version' => 2, -- 'name' => $name, -- 'module' => 'flag_lists', -- 'content_type' => 'node', -- 'global' => 0, -- 'show_on_page' => 0, -- 'show_on_teaser' => 0, -- 'show_on_form' => 0, -- // The following UI labels aren't wrapped in t() because they are written -- // to the DB in English. They are passed to t() later, thus allowing for -- // multilingual sites. -- 'title' => 'Flag lists template', -- 'flag_short' => 'Add to your [flag_lists:title] [flag_lists:term]', -- 'flag_long' => 'Add this post to your [flag_lists:title] [flag_lists:term]', -- 'flag_message' => 'This post has been added to your [flag_lists:title] [flag_lists:term]', -- 'unflag_short' => 'Remove this from your [flag_lists:title] [flag_lists:term]', -- 'unflag_long' => 'Remove this post from your [flag_lists:title] [flag_lists:term]', -- 'unflag_message' => 'This post has been removed from your [flag_lists:title] [flag_lists:term]', -- 'types' => array(), -- 'link_type' => 'toggle', -- ), -- ); -+ // return array( -+ // array( -+ // 'api_version' => 2, -+ // 'name' => $name, -+ // 'module' => 'flag_lists', -+ // 'content_type' => 'node', -+ // 'global' => 0, -+ // 'show_on_page' => 0, -+ // 'show_on_teaser' => 0, -+ // 'show_on_form' => 0, -+ // // The following UI labels aren't wrapped in t() because they are written -+ // // to the DB in English. They are passed to t() later, thus allowing for -+ // // multilingual sites. -+ // 'title' => 'Flag lists template', -+ // 'flag_short' => 'Add to your [flag_lists:title] [flag_lists:term]', -+ // 'flag_long' => 'Add this post to your [flag_lists:title] [flag_lists:term]', -+ // 'flag_message' => 'This post has been added to your [flag_lists:title] [flag_lists:term]', -+ // 'unflag_short' => 'Remove this from your [flag_lists:title] [flag_lists:term]', -+ // 'unflag_long' => 'Remove this post from your [flag_lists:title] [flag_lists:term]', -+ // 'unflag_message' => 'This post has been removed from your [flag_lists:title] [flag_lists:term]', -+ // 'types' => array(), -+ // 'link_type' => 'toggle', -+ // ), -+ // ); -+ -+$flags = array(); -+// Exported flag: "Flag lists template". -+$flags['fl_template'] = array( -+ 'entity_type' => 'node', -+ 'title' => 'Flag lists template', -+ 'global' => 0, -+ 'types' => array(), -+ 'flag_short' => 'Add to your [flag_lists:title] [flag_lists:term]', -+ 'flag_long' => 'Add this post to your [flag_lists:title] [flag_lists:term]', -+ 'flag_message' => 'This post has been added to your [flag_lists:title] [flag_lists:term]', -+ 'unflag_short' => 'Remove this from your [flag_lists:title] [flag_lists:term]', -+ 'unflag_long' => 'Remove this post from your [flag_lists:title] [flag_lists:term]', -+ 'unflag_message' => 'This post has been removed from your [flag_lists:title] [flag_lists:term]', -+ 'unflag_denied_text' => '', -+ 'link_type' => 'toggle', -+ 'weight' => 0, -+ 'api_version' => 3, -+ 'module' => 'flag_lists', -+ 'show_on_page' => 0, -+ 'show_on_teaser' => 0, -+ 'show_on_form' => 0, -+ 'status' => FALSE, -+ 'import_roles' => array( -+ 'flag' => array(), -+ 'unflag' => array(), -+ ), -+); -+return $flags; -+ -+ - } - - /** -@@ -1294,7 +1325,7 @@ function flag_lists_insert($flag) { - ->fields(array( - 'pfid' => $flag->pfid, - 'uid' => $flag->uid, -- 'content_type' => $flag->content_type, -+ 'entity_type' => $flag->entity_type, - 'name' => $flag->name, - 'title' => $flag->title, - 'options' => $flag->get_serialized_options($flag), -@@ -1330,7 +1361,7 @@ function flag_lists_fl_delete($flag, $account = NULL) { - * Used both for the regular callback as well as the JS version. We use this - * instead of the flag module's because our flags are not in the flags table. - */ --function flag_lists_page($action = NULL, $flag_name = NULL, $content_id = NULL) { -+function flag_lists_page($action = NULL, $flag_name = NULL, $entity_id = NULL) { - global $user; - - // Shorten up the variables that affect the behavior of this page. -@@ -1341,7 +1372,7 @@ function flag_lists_page($action = NULL, $flag_name = NULL, $content_id = NULL) - $has_js = isset($_GET['has_js']); - - // Check the flag token, then perform the flagging. -- if (!flag_check_token($token, $content_id)) { -+ if (!flag_check_token($token, $entity_id)) { - $error = t('Bad token. You seem to have followed an invalid link.'); - } - elseif ($user->uid == 0 && !$has_js) { -@@ -1355,7 +1386,7 @@ function flag_lists_page($action = NULL, $flag_name = NULL, $content_id = NULL) - - // Identify it as ours. - $flag->module = 'flag_lists'; -- flag_lists_do_flag($flag, $action, $content_id); -+ flag_lists_do_flag($flag, $action, $entity_id); - } - - // If an error was received, set a message and exit. -@@ -1381,14 +1412,14 @@ function flag_lists_page($action = NULL, $flag_name = NULL, $content_id = NULL) - // $flag = flag_lists_get_flag($flag_name); - // $flag->link_type = 'toggle'; - $sid = flag_get_sid($user->uid); -- $new_action = _flag_lists_is_flagged($flag, $content_id, $user->uid, $sid) ? 'unflag' : 'flag'; -- $new_link = $flag->theme($new_action, $content_id, TRUE); -+ $new_action = _flag_lists_is_flagged($flag, $entity_id, $user->uid, $sid) ? 'unflag' : 'flag'; -+ $new_link = $flag->theme($new_action, $entity_id, TRUE); - flag_lists_fix_link($new_link, $new_action); - drupal_json_output(array( - 'status' => TRUE, - 'newLink' => $new_link, - // Further information for the benefit of custom JavaScript event handlers: -- 'contentId' => $content_id, -+ 'contentId' => $entity_id, - 'contentType' => $flag->content_type, - 'flagName' => $flag->name, - 'flagStatus' => $action, -@@ -1397,7 +1428,7 @@ function flag_lists_page($action = NULL, $flag_name = NULL, $content_id = NULL) - } - else { - $flag = flag_lists_get_flag($flag->fid); -- drupal_set_message($flag->get_label($action . '_message', $content_id)); -+ drupal_set_message($flag->get_label($action . '_message', $entity_id)); - drupal_goto(); - } - } -@@ -1413,7 +1444,7 @@ function flag_lists_fix_link(&$link, $action) { - * - * @param $action - * Either 'flag' or 'unflag'. -- * @param $content_id -+ * @param $entity_id - * The ID of the item to flag or unflag. - * @param $account - * The user on whose behalf to flag. Leave empty for the current user. -@@ -1423,7 +1454,7 @@ function flag_lists_fix_link(&$link, $action) { - * FALSE if some error occured (e.g., user has no permission, flag isn't - * applicable to the item, etc.), TRUE otherwise. - */ -- function flag_lists_do_flag($flag, $action, $content_id, $account = NULL, $skip_permission_check = FALSE) { -+ function flag_lists_do_flag($flag, $action, $entity_id, $account = NULL, $skip_permission_check = FALSE) { - if (!isset($account)) { - $account = $GLOBALS['user']; - } -@@ -1431,7 +1462,7 @@ function flag_lists_fix_link(&$link, $action) { - return FALSE; - } - if (!$skip_permission_check) { -- if (!$flag->access($content_id, $action, $account)) { -+ if (!$flag->access($entity_id, $action, $account)) { - // User has no permission to flag/unflag this object. - return FALSE; - } -@@ -1439,7 +1470,7 @@ function flag_lists_fix_link(&$link, $action) { - else { - // We are skipping permission checks. However, at a minimum we must make - // sure the flag applies to this content type: -- if (!$flag->applies_to_content_id($content_id)) { -+ if (!$flag->applies_to_content_id($entity_id)) { - return FALSE; - } - } -@@ -1460,17 +1491,17 @@ function flag_lists_fix_link(&$link, $action) { - - // Perform the flagging or unflagging of this flag. We invoke hook_flag here - // because we do our own flagging. -- $flagged = _flag_lists_is_flagged($flag, $content_id, $uid, $sid); -+ $flagged = _flag_lists_is_flagged($flag, $entity_id, $uid, $sid); - if ($action == 'unflag') { - if ($flagged) { -- $fcid = _flag_lists_unflag($flag, $content_id, $uid, $sid); -- module_invoke_all('flag', 'unflag', $flag, $content_id, $account, $fcid); -+ $fcid = _flag_lists_unflag($flag, $entity_id, $uid, $sid); -+ module_invoke_all('flag', 'unflag', $flag, $entity_id, $account, $fcid); - } - } - elseif ($action == 'flag') { - if (!$flagged) { -- $fcid = _flag_lists_flag($flag, $content_id, $uid, $sid); -- module_invoke_all('flag', 'flag', $flag, $content_id, $account, $fcid); -+ $fcid = _flag_lists_flag($flag, $entity_id, $uid, $sid); -+ module_invoke_all('flag', 'flag', $flag, $entity_id, $account, $fcid); - } - } - -@@ -1487,12 +1518,12 @@ function flag_lists_fix_link(&$link, $action) { - * bypass it. - * - */ -- function _flag_lists_is_flagged($flag, $content_id, $uid, $sid) { -+ function _flag_lists_is_flagged($flag, $entity_id, $uid, $sid) { - $query = db_select('flag_lists_content') - ->condition('fid', $flag->fid) - ->condition('uid', $uid) - ->condition('sid', $sid) -- ->condition('content_id', $content_id); -+ ->condition('entity_id', $entity_id); - $query->addField('flag_lists_content', 'fid'); - return $query->execute()->fetchField(); - } -@@ -1504,19 +1535,19 @@ function flag_lists_fix_link(&$link, $action) { - * flag_lists_do_flag() function instead. - * - */ -- function _flag_lists_flag($flag, $content_id, $uid, $sid) { -+ function _flag_lists_flag($flag, $entity_id, $uid, $sid) { - $fcid = db_insert('flag_lists_content') - ->fields(array( - 'fid' => $flag->fid, -- 'content_type' => $flag->content_type, -- 'content_id' => $content_id, -+ 'entity_type' => $flag->entity_type, -+ 'entity_id' => $entity_id, - 'uid' => $uid, - 'sid' => $sid, - 'timestamp' => REQUEST_TIME, - )) - ->execute(); - -- _flag_lists_update_count($flag, $content_id); -+ _flag_lists_update_count($flag, $entity_id); - return $fcid; - } - -@@ -1527,10 +1558,10 @@ function flag_lists_fix_link(&$link, $action) { - * flag_lists_do_flag() function instead. - * - */ -- function _flag_lists_unflag($flag, $content_id, $uid, $sid) { -+ function _flag_lists_unflag($flag, $entity_id, $uid, $sid) { - $query = db_select('flag_lists_content') - ->condition('fid', $flag->fid) -- ->condition('content_id', $content_id) -+ ->condition('entity_id', $entity_id) - ->condition('uid', $uid) - ->condition('sid', $sid); - $query->addField('flag_lists_content', 'fcid'); -@@ -1539,7 +1570,7 @@ function flag_lists_fix_link(&$link, $action) { - db_delete('flag_lists_content') - ->condition('fcid', $fcid) - ->execute(); -- _flag_lists_update_count($flag, $content_id); -+ _flag_lists_update_count($flag, $entity_id); - } - return $fcid; - } -@@ -1547,11 +1578,11 @@ function flag_lists_fix_link(&$link, $action) { - /** - * Updates the flag count for this content - */ -- function _flag_lists_update_count($flag, $content_id) { -+ function _flag_lists_update_count($flag, $entity_id) { - $count = db_select('flag_lists_content', 'f') - ->fields('f') - ->condition('fid', $flag->fid) -- ->condition('content_id', $content_id) -+ ->condition('entity_id', $entity_id) - ->countQuery() - ->execute() - ->fetchField(); -@@ -1559,7 +1590,7 @@ function flag_lists_fix_link(&$link, $action) { - if (empty($count)) { - $num_deleted = db_delete('flag_lists_counts') - ->condition('fid', $flag->fid) -- ->condition('content_id', $content_id) -+ ->condition('entity_id', $entity_id) - ->execute(); - } - else { -@@ -1568,14 +1599,14 @@ function flag_lists_fix_link(&$link, $action) { - 'count' => $count, - )) - ->condition('fid', $flag->fid) -- ->condition('content_id', $content_id) -+ ->condition('entity_id', $entity_id) - ->execute(); - if (empty($num_updated)) { - db_insert('flag_lists_counts') - ->fields(array( - 'fid' => $flag->fid, -- 'content_type' => $flag->content_type, -- 'content_id' => $content_id, -+ 'entity_type' => $flag->entity_type, -+ 'entity_id' => $entity_id, - 'count' => $count, - )) - ->execute(); diff --git a/sites/all/modules/contrib/flag/flag_lists/flag_lists-remove_deleted_entity-2114731-2.patch b/sites/all/modules/contrib/flag/flag_lists/flag_lists-remove_deleted_entity-2114731-2.patch deleted file mode 100644 index 27f6f074..00000000 --- a/sites/all/modules/contrib/flag/flag_lists/flag_lists-remove_deleted_entity-2114731-2.patch +++ /dev/null @@ -1,55 +0,0 @@ -diff --git a/flag_lists.module b/flag_lists.module -index d829113..b3c04f0 100644 ---- a/flag_lists.module -+++ b/flag_lists.module -@@ -1587,6 +1587,32 @@ function flag_lists_fix_link(&$link, $action) { - return $fcid; - } - -+ -+ /** -+ * Remove all entries of entity_id and type -+ * -+ * @param $entity_id -+ * Entity id which has been flagged. -+ * @param $type -+ * The entity type. -+ */ -+ function _flag_lists_remove_entity($entity_id, $type) { -+ $query = db_select('flag_lists_content') -+ ->condition('entity_id', $entity_id) -+ ->condition('entity_type', $type); -+ $query->fields('flag_lists_content', array('fcid', 'fid', 'uid', 'sid')); -+ $items = $query->execute()->fetchAll(); -+ -+ if ($items) { -+ foreach ($items as $key => $value) { -+ db_delete('flag_lists_content') -+ ->condition('fcid', $value->fcid) -+ ->execute(); -+ watchdog('flag_lists', t('Deleted entry @fcid from flat_lists_content', array('@fcid' => $value->fcid))); -+ } -+ } -+ } -+ - /** - * Updates the flag count for this content - */ -@@ -1766,3 +1792,17 @@ function flag_lists_views_form_substitutions() { - $select_all_placeholder => drupal_render($select_all), - ); - } -+ -+ -+/** -+ * Implements hook_entity_delete -+ */ -+function flag_lists_entity_delete($entity, $type) { -+ foreach (flag_get_flags($type) as $flag) { -+ if (isset($entity->vid)) { -+ $items = _flag_lists_remove_entity($entity->vid, $type); -+ } -+ } -+} -+ -+ diff --git a/sites/all/modules/contrib/flag/flag_lists/flag_lists.admin.inc b/sites/all/modules/contrib/flag/flag_lists/flag_lists.admin.inc index c4ffc4fa..f8283553 100644 --- a/sites/all/modules/contrib/flag/flag_lists/flag_lists.admin.inc +++ b/sites/all/modules/contrib/flag/flag_lists/flag_lists.admin.inc @@ -26,6 +26,8 @@ function theme_flag_lists_admin_page($variables) { $view = views_get_view('flag_lists', FALSE); if (!empty($view)) { $view->set_display('default'); + $view->pre_execute(); + $view->execute(); $output .= $view->render(); } } @@ -84,12 +86,19 @@ function flag_lists_add($type = NULL) { * Callback for adding new lists through AJAX. */ function flag_lists_add_js($type = NULL) { + + $token = $_REQUEST['form_token']; + if ( is_null($token) || !drupal_valid_token($token, variable_get('flag_lists_name','list'))) { + drupal_json_output(array('error' => t('Are you using an old link?'))); + exit(); + } + if (is_null($type)) { drupal_json_output(array('error' => t('Type not supplied.'))); exit(); } - $name = check_plain($_REQUEST['name']); + $name = $_REQUEST['name']; if (!isset($name) || empty($name)) { drupal_json_output(array('error' => t('List name not supplied.'))); exit(); @@ -101,7 +110,7 @@ function flag_lists_add_js($type = NULL) { } if (flag_lists_title_exists($name, $type)) { - drupal_json_output(array('error' => t('You already have a @name with this name for this type of content.', array('@name' => variable_get('flag_lists_name', t('list')))))); + drupal_json_output(array('error' => t('You already have a @name with this name for this type of content.', array('@name' => variable_get('flag_lists_name', 'list'))))); exit(); } @@ -162,7 +171,7 @@ function flag_lists_form($form, $form_state, $name = NULL, $type = NULL) { } // Adding a new list. if (!isset($name)) { - drupal_set_title(t('Add a new list')); + drupal_set_title(t('Add a new @name', array('@name' => variable_get('flag_lists_name', 'list')))); $form['edit'] = array( '#type' => 'hidden', '#value' => FALSE, @@ -173,7 +182,7 @@ function flag_lists_form($form, $form_state, $name = NULL, $type = NULL) { else { $flag = flag_lists_get_flag($name); - $title_string_name = variable_get('flag_lists_name', 'list'); + $title_string_name = t('@name', array('@name' => variable_get('flag_lists_name', 'list'))); $title_string = t('Edit your "@title" @name title', array('@title' => $flag->get_title(), '@name' => $title_string_name)); drupal_set_title(); @@ -191,7 +200,7 @@ function flag_lists_form($form, $form_state, $name = NULL, $type = NULL) { '#type' => 'textfield', '#title' => t('Title'), '#default_value' => empty($flag->title) ? '' : $flag->title, - '#description' => t('A short, descriptive title for this @name list. Limit to 255 characters.', array('@name' => variable_get('flag_lists_name', t('list')))), + '#description' => t('A short, descriptive title for this @name list. Limit to 255 characters.', array('@name' => variable_get('flag_lists_name', 'list'))), '#maxlength' => 255, '#required' => TRUE, '#access' => empty($flag->locked['title']), @@ -214,12 +223,12 @@ function flag_lists_form($form, $form_state, $name = NULL, $type = NULL) { function flag_lists_form_validate($form, $form_state) { // Ensure 255 charactor or less name. if (drupal_strlen($form_state['values']['title']) > 255) { - form_set_error('name', t('The @name title may only be 255 characters long.', array('@name' => variable_get('flag_lists_name', t('list'))))); + form_set_error('name', t('The @name title may only be 255 characters long.', array('@name' => variable_get('flag_lists_name', 'list')))); } // Ensure the machine name is unique. if (!$form_state['values']['edit']) { if (flag_lists_title_exists($form_state['values']['title'], $form_state['values']['type'])) { - form_set_error('title', t('You already have a @name with this name for this type of content.', array('@name' => variable_get('flag_lists_name', t('list'))))); + form_set_error('title', t('You already have a @name with this name for this type of content.', array('@name' => variable_get('flag_lists_name', 'list')))); } } } @@ -287,7 +296,7 @@ function flag_lists_settings_form($form, $form_state) { $form['flag_lists_name'] = array( '#type' => 'textfield', '#title' => t('Substitute "list" with your own terminology'), - '#default_value' => variable_get('flag_lists_name', t('list')), + '#default_value' => t('@name', array('@name' => variable_get('flag_lists_name', 'list'))), '#description' => t('You can choose to use another name for "list", such as "favorites" or "bookmarks". Lowercase and plural names usually work best.'), '#required' => TRUE, ); @@ -341,7 +350,7 @@ function flag_lists_delete_confirm($form, $form_state, $name) { $form['fid'] = array('#type' => 'value', '#value' => $flag->fid); return confirm_form($form, - t('Are you sure you want to delete %title?', array('%title' => $flag->get_title())), + t('Are you sure you want to delete @title?', array('@title' => $flag->get_title())), isset($_GET['destination']) ? $_GET['destination'] : '/', t('This action cannot be undone.'), t('Delete'), t('Cancel') @@ -359,14 +368,14 @@ function flag_lists_delete_confirm_submit($form, &$form_state) { * Form to create a new template. */ function flag_lists_create_template_form($form, $form_state) { - drupal_set_title(t('Add a new list template')); + drupal_set_title(t('Add a new @name template', array('@name' => variable_get('flag_lists_name', 'list')))); $form['help'] = array( '#value' => t('This form creates a new, blank list template. After saving, you will be able to configure further options.'), ); $form['name'] = array( '#type' => 'textfield', '#title' => t('Template name'), - '#description' => t('The machine-name for this template. It may be up to 32 characters long and my only contain lowercase letters, underscores, and numbers.'), + '#description' => t('The machine-name for this template. It may be up to 20 characters long and my only contain lowercase letters, underscores, and numbers.'), '#maxlength' => 255, '#required' => TRUE, ); @@ -385,9 +394,9 @@ function flag_lists_create_template_form_validate($form, &$form_state) { if (!preg_match('/^[a-z_][a-z0-9_]*$/', $form_state['values']['name'])) { form_set_error('name', t('The flag name may only contain lowercase letters, underscores, and numbers.')); } - // Ensure 32 charactor or less name. - if (drupal_strlen($form_state['values']['name']) > 32) { - form_set_error('name', t('The flag name may only be 32 characters long.')); + // Ensure 20 charactor or less name. + if (drupal_strlen($form_state['values']['name']) > 20) { + form_set_error('name', t('The flag name may only be 20 characters long.')); } // Ensure the machine name is unique. $flag = flag_get_flag('fl_template_' . $form_state['values']['name']); @@ -400,9 +409,10 @@ function flag_lists_create_template_form_validate($form, &$form_state) { * New template submit. */ function flag_lists_create_template_form_submit($form, &$form_state) { - $template = flag_lists_flag_default_flags('fl_template_' . $form_state['values']['name']); - $flag = flag_flag::factory_by_array($template[0]); - $flag->title = t('List template') . ' ' . $form_state['values']['name']; + $template = flag_lists_flag_default_flags(); + $flag = flag_flag::factory_by_array(array_shift($template)); + $flag->title = t('Flag list template') . ' ' . $form_state['values']['name']; + $flag->name = 'fl_template_' . $form_state['values']['name']; $flag->save(); // Enter the new template into flag_lists_types. db_insert('flag_lists_types') @@ -410,11 +420,11 @@ function flag_lists_create_template_form_submit($form, &$form_state) { 'name' => $flag->name, )) ->execute(); - $form_state['redirect'] = FLAG_ADMIN_PATH . '/edit/' . $flag->name; + drupal_set_message(t('You must save the template below otherwise the functionality is not guaranteed!'), 'warning'); + $form_state['redirect'] = FLAG_ADMIN_PATH . '/manage/' . $flag->name; } - /** * Developer tool to generate dummy lists and listings. */ @@ -490,10 +500,10 @@ function flag_lists_generate_lists_form_submit($form, &$form_state) { // Delete listings. if ($form_state['values']['kill_listings']) { - $flags = flag_lists_get_flags(); + $flags = flag_lists_get_flags(); foreach ($flags as $flag) { $result = db_select('flag_lists_content', 'f') - ->fields('f', array('fcid', 'content_id')) + ->fields('f', array('fcid', 'entity_id')) ->condition('fid', $flag->fid) ->execute(); @@ -501,7 +511,7 @@ function flag_lists_generate_lists_form_submit($form, &$form_state) { db_delete('flag_lists_content')->condition('fid', $flag->fid)->execute(); db_delete('flag_lists_counts')->condition('fid', $flag->fid)->execute(); - module_invoke_all('flag', 'unflag', $flag, $row->content_id, $account, $row->fcid); + module_invoke_all('flag', 'unflag', $flag, $row->entity_id, $account, $row->fcid); } } drupal_set_message(t('All listings were deleted.')); @@ -525,7 +535,7 @@ function flag_lists_generate_lists_form_submit($form, &$form_state) { // Generate lists. if ($form_state['values']['lists'] && count($templates)) { - for ($i = 1; $i <= $form_state['values']['lists']; $i++ ) { + for ($i = 1; $i <= $form_state['values']['lists']; $i++) { $template = flag_get_flag(NULL, array_rand($templates)); $account->uid = $uids[array_rand($uids)]; $edit['values']['title'] = devel_create_greeking(7, TRUE); @@ -533,7 +543,7 @@ function flag_lists_generate_lists_form_submit($form, &$form_state) { $form = array(); flag_lists_form_submit($form, $edit, $account); } - drupal_set_message(t('@lists created.', array('@lists' => format_plural($form_state['values']['lists'], '1 list', '@count lists')))); + drupal_set_message(t('@lists created.', array('@lists' => format_plural($form_state['values']['lists'], '1 list', '@count lists')))); } // Generate listings. @@ -541,14 +551,14 @@ function flag_lists_generate_lists_form_submit($form, &$form_state) { $count = 0; - for ($i = 1; $i <= $form_state['values']['listings']; $i++ ) { + for ($i = 1; $i <= $form_state['values']['listings']; $i++) { $account->uid = $uids[array_rand($uids)]; $lists = flag_lists_get_user_flags(NULL, $account); // Remove any lists that don't use the chosen templates. foreach ($lists as $key => $list) { - if (!isset($templates[$list->pfid])) { - unset($lists[$key]); + if (!isset($templates[$list->pfid])) { + unset($lists[$key]); } } @@ -589,52 +599,24 @@ function flag_lists_generate_lists_form_submit($form, &$form_state) { $count++; } } - drupal_set_message(t('@listings listed.', array('@listings' => format_plural($count, '1 node', '@count nodes')))); - if ($count < $form_state['values']['listings']) { - drupal_set_message(t('Listings are generated randomly. Occassionally a listing will not be created if the random user has no lists or if the node type to be listed has no nodes.')); - } + drupal_set_message(t('@listings listed.', array('@listings' => format_plural($count, '1 node', '@count nodes')))); + if ($count < $form_state['values']['listings']) { + drupal_set_message(t('Listings are generated randomly. Occassionally a listing will not be created if the random user has no lists or if the node type to be listed has no nodes.')); + } } } +function flag_lists_autocomplete_list_callback($string = "") { + $matches = array(); - -/** - * Clean lists from deleted enties - */ -function flag_list_clean_deleted(){ - - drupal_set_title(t('Flag lists Clean')); - $output = '

' . t('This page shows all the deleted entityties id from flag lists.') . '

'; - - $total = 0; - $list = ""; - $output .= "

".$total ." entities have been deleted.

"; - $output .= $list; - return $output; + drupal_json_output($matches); } diff --git a/sites/all/modules/contrib/flag/flag_lists/flag_lists.inc b/sites/all/modules/contrib/flag/flag_lists/flag_lists.inc new file mode 100644 index 00000000..0761ec8f --- /dev/null +++ b/sites/all/modules/contrib/flag/flag_lists/flag_lists.inc @@ -0,0 +1,50 @@ +flag_lists_save($flag); +} + + /** + * Saves a flag to the database. It is a wrapper around update($flag) and insert($flag). + */ + function flag_lists_save(&$flag) { + if (isset($flag->fid)) { + flag_lists_update($flag); + $flag->is_new = FALSE; + } + else { + flag_lists_insert($flag); + $flag->is_new = TRUE; + } + // Clear the page cache for anonymous users. +// cache_clear_all('*', 'cache_page', TRUE); + } + + /** + * Saves an existing flag to the database. Better use save($flag). + */ + function flag_lists_update($flag) { + db_query("UPDATE {flag_lists_flags} SET title = '%s', name = '%s' WHERE fid = %d", $flag->title, $flag->name, $flag->fid); + } + + /** + * Saves a new flag to the database. Better use save($flag). + */ + function flag_lists_insert($flag) { + db_query("INSERT INTO {flag_lists_flags} (pfid, uid, content_type, name, title, options) VALUES (%d, %d, '%s', '%s', '%s', '%s')", $flag->pfid, $flag->uid, $flag->content_type, $flag->name, $flag->title, $flag->get_serialized_options($flag)); + $flag->fid = db_last_insert_id('flags', 'fid'); + $flag->name = 'flag_lists_'. $flag->uid .'_'. $flag->fid; + $flag->flag_lists_update($flag); + + foreach ($flag->types as $type) { + db_query("INSERT INTO {flag_types} (fid, type) VALUES (%d, '%s')", $flag->fid, $type); + } + } +} \ No newline at end of file diff --git a/sites/all/modules/contrib/flag/flag_lists/flag_lists.info b/sites/all/modules/contrib/flag/flag_lists/flag_lists.info index 07030fb4..47f2d80e 100644 --- a/sites/all/modules/contrib/flag/flag_lists/flag_lists.info +++ b/sites/all/modules/contrib/flag/flag_lists/flag_lists.info @@ -1,8 +1,9 @@ name = Flag lists core = 7.x package = Flags -dependencies[] = flag +dependencies[] = flag (>7.x-3.0) dependencies[] = token +dependencies[] = views files[] = flag_lists.admin.inc files[] = flag_lists.module @@ -17,11 +18,14 @@ files[] = includes/flag_lists_handler_field_ops.inc files[] = includes/flag_lists_handler_field_template.inc files[] = includes/flag_lists_handler_field_template_types.inc files[] = includes/flag_lists_handler_filter_template.inc +files[] = includes/flag_lists_handler_filter_list.inc description = Allows users to create personal flag lists. -; Information added by drupal.org packaging script on 2012-05-03 -version = "7.x-1.1" + + +; Information added by Drupal.org packaging script on 2016-09-07 +version = "7.x-3.1" core = "7.x" project = "flag_lists" -datestamp = "1336060255" +datestamp = "1473230043" diff --git a/sites/all/modules/contrib/flag/flag_lists/flag_lists.install b/sites/all/modules/contrib/flag/flag_lists/flag_lists.install index a84fd496..4545d90c 100644 --- a/sites/all/modules/contrib/flag/flag_lists/flag_lists.install +++ b/sites/all/modules/contrib/flag/flag_lists/flag_lists.install @@ -26,7 +26,6 @@ function flag_lists_schema() { ), 'uid' => array( 'type' => 'int', - 'size' => 'small', 'unsigned' => TRUE, 'not null' => TRUE, ), @@ -106,7 +105,7 @@ function flag_lists_schema() { ), 'primary key' => array('fcid'), 'unique keys' => array( - 'fid_entity_id_uid_sid' => array('fid', 'entity_id', 'uid', 'sid'), + 'fid_content_id_uid_sid' => array('fid', 'entity_id', 'uid', 'sid'), ), 'indexes' => array( 'entity_type_entity_id' => array('entity_type', 'entity_id'), @@ -191,17 +190,198 @@ function flag_lists_uninstall() { // Remove our template flags. $query = db_select('flag_lists_types', 'fl'); $query->leftJoin('flag', 'f', 'fl.name = f.name'); - $query->addField('fl', 'fid', 'fid'); + $query->addField('f', 'fid', 'fid'); $query->distinct(); $fids = $query->execute(); foreach ($fids as $fid) { - db_delete('flag')->condition('fid', $fid->fid); - db_delete('flag_content')->condition('fid', $fid->fid); - db_delete('flag_types')->condition('fid', $fid->fid); - db_delete('flag_counts')->condition('fid', $fid->fid); + db_delete('flag')->condition('fid', $fid->fid)->execute(); + db_delete('flagging')->condition('fid', $fid->fid)->execute(); + db_delete('flag_types')->condition('fid', $fid->fid)->execute(); + db_delete('flag_counts')->condition('fid', $fid->fid)->execute(); + } + + db_delete('variable')->condition('name', 'flag_lists%', 'LIKE')->execute(); + + $view_to_delete = views_get_view('flag_lists'); + if (!empty($view_to_delete)) { + views_delete_view($view_to_delete); + } + + $view_to_delete =views_get_view('flag_lists_content'); + if (!empty($view_to_delete)) { + views_delete_view($view_to_delete); + } + + $view_to_delete = views_get_view('flag_lists_user_lists'); + if (!empty($view_to_delete)) { + views_delete_view($view_to_delete); + } + + $view_to_delete = views_get_view('flag_lists_user_list'); + if (!empty($view_to_delete)) { + views_delete_view($view_to_delete); } - db_delete('variable')->condition('name', 'flag_lists%', 'LIKE'); drupal_set_message(t('Flag lists has been uninstalled.')); } + +/** + * Get rid of garbage list entries that are orphaned from a list + */ +function flag_lists_update_7000() { + $orphans = db_query("SELECT flc.fcid, flc.fid, flc.content_id, flc.uid, flcounts.content_type, count + FROM {flag_lists_content} flc + JOIN {flag_lists_counts} flcounts ON flcounts.fid=flc.fid AND flc.content_id=flcounts.content_id + LEFT JOIN {flag_lists_flags} flf ON flf.fid=flc.fid + WHERE flf.fid IS NULL"); + + foreach ($orphans as $orphan) { + $num_deleted = db_delete('flag_lists_content') + ->condition('fid', $orphan->fid) + ->condition('fcid', $orphan->fcid) + ->condition('uid', $orphan->uid) + ->execute(); + + if (!empty($num_deleted)) { + drupal_set_message("Deleting flag_id: $orphan->fid flag_content_id: $orphan->fcid"); + + db_update('flag_lists_counts') + ->fields(array( + 'count' => ($orphan->count <= 1) ? 0 : $orphan->count - 1, + )) + ->condition('content_type', $orphan->content_type) + ->condition('fid', $orphan->fid) + ->condition('content_id', $orphan->content_id) + ->execute(); + } + } +} + + +/** + * Update the flag_lists_flags table + */ +function flag_lists_update_7301() { + db_change_field('flag_lists_flags','content_type', 'entity_type', + array( + 'type' => 'varchar', + 'length' => '32', + 'not null' => TRUE, + 'default' => '', + )); +} + +/** + * Update the flag_lists_content table + */ +function flag_lists_update_7302() { + db_drop_unique_key('flag_lists_content','fid_content_id_uid_sid'); + db_drop_index('flag_lists_content','content_type_content_id'); + db_drop_index('flag_lists_content','content_type_uid_sid'); + + db_change_field('flag_lists_content','content_type', 'entity_type', + array( + 'type' => 'varchar', + 'length' => '32', + 'not null' => TRUE, + 'default' => '', + )); + + db_change_field('flag_lists_content','content_id', 'entity_id', + array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0, + )); + + db_add_unique_key('flag_lists_content', + 'fid_entity_id_uid_sid', + array('fid', 'entity_id', 'uid', 'sid')); + db_add_index('flag_lists_content', + 'entity_type_uid_sid', + array('entity_type', 'uid', 'sid')); + db_add_index('flag_lists_content', + 'entity_type_entity_id', + array('entity_type', 'entity_id')); +} + +/** + * Update the flag_lists_counts table + */ +function flag_lists_update_7303() { + db_drop_primary_key('flag_lists_counts'); + db_drop_index('flag_lists_counts','fid_content_type'); + db_drop_index('flag_lists_counts','content_type_content_id'); + + db_change_field('flag_lists_counts','content_type', 'entity_type', + array( + 'type' => 'varchar', + 'length' => '32', + 'not null' => TRUE, + 'default' => '', + )); + db_change_field('flag_lists_counts','content_id', 'entity_id', + array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0, + 'disp-width' => '10', + ), + array('primary key' => array('fid', 'entity_id'))); + + db_add_index('flag_lists_counts', + 'fid_entity_type', + array('fid', 'entity_type')); + db_add_index('flag_lists_counts', + 'entity_type_entity_id', + array('entity_type', 'entity_id')); +} + +/** + * Update the views + */ +function flag_lists_update_7304() { + + $myview = views_get_view('flag_lists', TRUE); + $myview->display['default']->display_options['fields']['name_2']['table'] = 'flag'; + $myview->display['default']->display_options['filters']['name']['table'] = 'flag'; + views_save_view($myview); + // Clear the cache for the pager + $cache = $myview->name . ':block:results:'; + cache_clear_all($cache, 'cache_views_data', TRUE); + + $myview = views_get_view('flag_lists_content', TRUE); + unset($myview->display['default']->display_options['relationships']['content_id']); + $myview->display['default']->display_options['relationships']['entity_id']['id'] = 'entity_id'; + $myview->display['default']->display_options['relationships']['entity_id']['table'] = 'flag_lists_content'; + $myview->display['default']->display_options['relationships']['entity_id']['field'] = 'entity_id'; + $myview->display['default']->display_options['relationships']['entity_id']['label'] = 'Listed content'; + $myview->display['default']->display_options['relationships']['entity_id']['required'] = TRUE; + views_save_view($myview); + // Clear the cache for the pager + $cache = $myview->name . ':block:results:'; + cache_clear_all($cache, 'cache_views_data', TRUE); + + $myview = views_get_view('flag_lists_user_list', TRUE); + $myview->display['page_1']->display_options['path'] = 'flag/lists/%'; + views_save_view($myview); + // Clear the cache for the pager + $cache = $myview->name . ':block:results:'; + cache_clear_all($cache, 'cache_views_data', TRUE); + +} + +/** + * Update the flag_lists_flags table + */ +function flag_lists_update_7305() { + db_change_field('flag_lists_flags','uid', 'uid', + array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + )); +} diff --git a/sites/all/modules/contrib/flag/flag_lists/flag_lists.module b/sites/all/modules/contrib/flag/flag_lists/flag_lists.module index 720be4d6..04b4ff12 100644 --- a/sites/all/modules/contrib/flag/flag_lists/flag_lists.module +++ b/sites/all/modules/contrib/flag/flag_lists/flag_lists.module @@ -56,16 +56,6 @@ function flag_lists_menu() { 'type' => MENU_LOCAL_TASK, 'weight' => 3, ); - $items[FLAG_ADMIN_PATH . '/lists/clean'] = array( - 'title' => 'Clean lists from deleted entities', - 'page callback' => 'flag_list_clean_deleted', - 'access callback' => 'user_access', - 'access arguments' => array('administer flags'), - 'file' => 'flag_lists.admin.inc', - 'type' => MENU_LOCAL_TASK, - 'weight' => 4, - ); - if (module_exists('devel_generate')) { $items['admin/config/development/generate/flag-lists'] = array( 'title' => 'Generate lists', @@ -97,7 +87,17 @@ function flag_lists_menu() { 'type' => MENU_CALLBACK, ); - $items['flags/lists/edit/%'] = array( + // Callback for autocomplete of lists in views filter + $items['flag-lists/autocomplete_list_callback'] = array( + 'title' => 'Find a list', + 'page callback' => 'flag_lists_autocomplete_list_callback', + 'access callback' => 'user_access', + 'access arguments' => array('create flag lists'), + 'file' => 'flag_lists.admin.inc', + 'type' => MENU_CALLBACK, + ); + + $items['flag/lists/edit/%'] = array( 'title' => 'Edit a list', 'page callback' => 'drupal_get_form', 'page arguments' => array('flag_lists_form', 3), @@ -106,7 +106,7 @@ function flag_lists_menu() { 'file' => 'flag_lists.admin.inc', 'type' => MENU_CALLBACK, ); - $items['flags/lists/delete/%'] = array( + $items['flag/lists/delete/%'] = array( 'title' => 'Delete a list', 'page callback' => 'drupal_get_form', 'page arguments' => array('flag_lists_delete_confirm', 3), @@ -132,16 +132,17 @@ function flag_lists_menu() { 'type' => MENU_CALLBACK, ); - $items['user/%user/flags/lists'] = array( - 'title' => ucfirst(variable_get('flag_lists_name', 'list')), + $items['user/%user/flag/lists'] = array( + 'title' =>drupal_ucfirst(variable_get('flag_lists_name', 'list')), 'page callback' => 'flag_lists_user_page', 'page arguments' => array(1), 'access callback' => 'user_access', 'access arguments' => array('view flag lists'), 'type' => MENU_LOCAL_TASK, ); - $items['user/%user/flags/lists/%'] = array( - 'title' => ucfirst(variable_get('flag_lists_name', 'list')) . ' content', + $items['user/%user/flag/lists/%'] = array( + 'title' =>drupal_ucfirst(variable_get('flag_lists_name', 'list') + . ' ' . 'content'), 'page callback' => 'flag_lists_user_list', 'page arguments' => array(1, 4), 'access callback' => 'user_access', @@ -155,14 +156,15 @@ function flag_lists_menu() { * User flag page. Display a list of user-created flag lists. */ function flag_lists_user_page($user) { - // Can we use our default view? + // Can we use our default view? if (module_exists('views')) { $view = views_get_view('flag_lists_user_lists', FALSE); if (!empty($view)) { $view->set_display('default'); $view->set_arguments(array($user->uid)); + $view->pre_execute(); $output = $view->render(); - drupal_set_title(str_replace(array_keys($view->build_info['substitutions']), $view->build_info['substitutions'], $view->build_info['title'])); + /* drupal_set_title(str_replace(array_keys($view->build_info['substitutions']), $view->build_info['substitutions'], $view->build_info['title'])); */ } return $output; } @@ -183,7 +185,7 @@ function theme_flag_lists_user_page($variables) { // Build the list of flag lists for this node. foreach ($flags as $flag) { $ops = theme('flag_lists_ops', array('flag' => $flag)); - $items[] = l($flag->title, "user/$uid/flags/lists/" . $flag->fid) . $ops; + $items[] = l($flag->title, "user/$uid/flag/lists/" . $flag->fid) . $ops; } } drupal_add_css(drupal_get_path('module', 'flag_lists') . '/theme/flag_lists.css'); @@ -195,14 +197,15 @@ function theme_flag_lists_user_page($variables) { */ function flag_lists_user_list($user, $fid) { $uid = $user->uid; - // Can we use our default view? + // Can we use our default view? if (module_exists('views')) { $view = views_get_view('flag_lists_user_list', FALSE); if (!empty($view)) { $view->set_display('default'); $view->set_arguments(array($fid)); + $view->pre_execute(); $output = $view->render(); - drupal_set_title(str_replace(array_keys($view->build_info['substitutions']), $view->build_info['substitutions'], $view->build_info['title'])); + drupal_set_title(str_replace(array_keys($view->build_info['substitutions']), $view->build_info['substitutions'], $view->build_info['title']), PASS_THROUGH); } return $output; } @@ -223,14 +226,14 @@ function theme_flag_lists_user_list($variables) { drupal_set_title($flag->title); $content = flag_lists_get_flagged_content($fid, $uid); foreach ($content as $item) { - if ($item->content_type == 'node') { + if ($item->entity_type == 'node') { $node = node_load($item->entity_id); $items[] = l($node->title, 'node/' . $node->nid); } } $breadcrumb = menu_get_active_breadcrumb(); - $breadcrumb[] = l(t('@name lists', array('@name' => drupal_ucfirst(variable_get('flag_lists_name', t('lists'))))), 'user/' . arg(1) . '/flags/lists'); + $breadcrumb[] = l(t('@name lists', array('@name' => drupal_ucfirst(variable_get('flag_lists_name', 'list')))), 'user/' . arg(1) . '/flag/lists'); drupal_set_breadcrumb($breadcrumb); return theme('item_list', array('items' => $items)); } @@ -280,7 +283,8 @@ function flag_lists_permission() { 'view flag lists' => array( 'title' => t('View flag lists'), 'description' => t(''), - )); + ) + ); } /** @@ -315,13 +319,17 @@ function flag_lists_form_alter(&$form, &$form_state, $form_id) { foreach (element_children($form['display']) as $display) { $form['display'][$display]['#type'] = 'value'; } + $form['display']['link_type']['#default_value'] = 'fl_template'; - $form['display']['#description'] = t('Unlike normal flags, lists are only displayed in a block provided by this module or in views blocks. See the block admin page to place the block.'); + $form['display']['#description'] = t('Unlike normal flags, lists are only displayed in a block provided by this module or in views blocks. See the block admin page to place the block.'); + unset($form['display']['link_options_confirm']['flag_confirmation']); + unset($form['display']['link_options_confirm']['unflag_confirmation']); + $form['display']['link_options_intro']['#children'] = ''; $form['#validate'][] = 'flag_lists_template_validate'; $form['#submit'][] = 'flag_lists_template_submit'; } - break; + break; case 'views_exposed_form': // Force the exposed filters to perform actions on the page itself because @@ -329,7 +337,7 @@ function flag_lists_form_alter(&$form, &$form_state, $form_id) { if ($form['#id'] == 'views-exposed-form-flag-lists-default') { $form['#action'] = '/' . implode('/', arg()); } - break; + break; } // Flag lists operations related changes @@ -389,24 +397,24 @@ function flag_lists_ops_form($form, &$form_state, $flo) { if ($flags = flag_lists_get_user_flags(NULL, $account)) { // Build the list of flag lists for this node. foreach ($flags as $flag) { - $items[((string)$flag->fid)] = $flag->title; + $items[((string) $flag->fid)] = $flag->title; } } // Group items into a fieldset for easier theming. $form['flag_lists_' . $form_state['flo_operation']] = array( '#type' => 'fieldset', - '#title' => t('List operations'), + '#title' => t('@name operations', array( '@name' => drupal_ucfirst( variable_get('flag_lists_name', 'list')))), '#tree' => TRUE, '#attributes' => array('class' => array('flag-lists-ops-fieldset')), ); switch ($flo->options['flo']['operation']) { case 'unflag': - $null_text = 'Remove from a list'; + $null_text = t('Remove from a @name', array('@name' => variable_get('flag_lists_name', 'list'))); $operation = 'unflag'; $form['flag_lists_' . $form_state['flo_operation']]['list'] = array( '#type' => 'button', - '#value' => t('Remove from list'), + '#value' => t('Remove from @name', array('@name' => variable_get('flag_lists_name', 'list'))), '#ajax' => array( 'callback' => 'flag_lists_ops_form_ajax_callback', 'wrapper' => 'flag-list-ops-container-' . $flo->options['flo']['operation'], @@ -414,7 +422,7 @@ function flag_lists_ops_form($form, &$form_state, $flo) { ); break; default: - $null_text = 'Add to a list'; + $null_text = t('Add to a @name', array('@name' => variable_get('flag_lists_name', 'list'))); $operation = 'flag'; drupal_add_library('system', 'ui.dialog'); $form['flag_lists_' . $form_state['flo_operation']]['list'] = array( @@ -422,8 +430,8 @@ function flag_lists_ops_form($form, &$form_state, $flo) { '#options' => array('0' => t('- ' . $null_text . ' -')) + $items, '#default_value' => '0', '#ajax' => array( - 'callback' => 'flag_lists_ops_form_ajax_callback', - 'wrapper' => 'flag-list-ops-container-' . $flo->options['flo']['operation'], + 'callback' => 'flag_lists_ops_form_ajax_callback', + 'wrapper' => 'flag-list-ops-container-' . $flo->options['flo']['operation'], ), '#attributes' => array( 'class' => array( @@ -442,7 +450,7 @@ function flag_lists_ops_form($form, &$form_state, $flo) { $list_types[] = $row->type; } } - drupal_add_js(array('flag_lists' => array('types' => $list_types, 'json_path' => $base_url . '/flag-lists/add/%/js')), 'setting'); + drupal_add_js(array('flag_lists' => array('types' => $list_types, 'json_path' => $base_url . '/flag-lists/add/%/js', 'listname' => variable_get('flag_lists_name', 'list'), 'form_token' => drupal_get_token(variable_get('flag_lists_name','list')))), 'setting'); break; } @@ -452,6 +460,7 @@ function flag_lists_ops_form($form, &$form_state, $flo) { } if (!empty($_REQUEST['flag_lists_ops'])) { $ops = $_REQUEST['flag_lists_ops']; + $ops = is_array($ops) ? $ops : array($ops); } if (!empty($ops) && !empty($list) && $form_state['values']['flag_lists_' . $form_state['flo_operation']]['operation'] == 'unflag') { $hidden_deleted_values = ''; @@ -481,21 +490,23 @@ function flag_lists_ops_form($form, &$form_state, $flo) { return $form; } -function flag_lists_ops_form_ajax_callback($form, $form_state) { +function flag_lists_ops_form_ajax_callback(&$form, &$form_state) { // The form has already been submitted and updated. We can return the replaced // item as it is. + $message = ''; if (!flag_lists_ops_form_validate($form, $form_state)) { $message = flag_lists_ops_form_submit($form, $form_state); } - $form['flag_lists_' . $form_state['flo_operation']]['status_message']['#markup'] = '
' . $message . '
'; - if ($form_state['flo_operation'] == 'flag') $form['flag_lists_' . $form_state['flo_operation']]['list']['#value'] = '0'; + if ($form_state['flo_operation'] == 'flag') { + $form['flag_lists_' . $form_state['flo_operation']]['list']['#value'] = '0'; + } $form['flag_lists_' . $form_state['flo_operation']]['status_message']['#attributes']['class'][] = 'alert-success'; return $form['flag_lists_' . $form_state['flo_operation']]; } -function flag_lists_ops_form_validate(&$form, &$form_state) { +function flag_lists_ops_form_validate($form, &$form_state) { global $user; $error_count = 0; @@ -509,16 +520,18 @@ function flag_lists_ops_form_validate(&$form, &$form_state) { switch ($form_state['values']['flag_lists_' . $form_state['flo_operation']]['operation']) { case 'unflag': - $ops = $_REQUEST['flag_lists_ops']; - foreach ($ops as $key => $op) { - $ops[$key] = explode('-', $op); - if (empty($ops[$key][1]) || !($flag = flag_lists_get_flag($ops[$key][1]))) { + $user_flag_lists = flag_lists_get_user_flags(); + foreach ($user_flag_lists as $key => $op) { + $ops[$key] = explode('_', $key); + if (empty($ops[$key][3]) || !($flag = flag_lists_get_flag($ops[$key][3]))) { form_set_error('flag_lists][remove', t('Invalid options list selected to remove from.')); $error_count++; } - else if ($flag->uid != $user->uid) { - form_set_error('flag_lists][remove', t('You are only allowed to remove content from your own lists.')); - $error_count++; + else { + if ($flag->uid != $user->uid) { + form_set_error('flag_lists][remove', t('You are only allowed to remove content from your own lists.')); + $error_count++; + } } } break; @@ -527,13 +540,17 @@ function flag_lists_ops_form_validate(&$form, &$form_state) { form_set_error('flag_lists][list', t('No list selected. Please select a list to add to.')); $error_count++; } - else if (!($flag = flag_lists_get_flag($form_state['values']['flag_lists_' . $form_state['flo_operation']]['list']))) { - form_set_error('flag_lists][list', t('Invalid list selected. Please select a list to add to.')); - $error_count++; - } - else if ($flag->uid != $user->uid) { - form_set_error('flag_lists][list', t('Invalid list selected. Please select a list to add to.')); - $error_count++; + else { + if (!($flag = flag_lists_get_flag($form_state['values']['flag_lists_' . $form_state['flo_operation']]['list']))) { + form_set_error('flag_lists][list', t('Invalid list selected. Please select a list to add to.')); + $error_count++; + } + else { + if ($flag->uid != $user->uid) { + form_set_error('flag_lists][list', t('Invalid list selected. Please select a list to add to.')); + $error_count++; + } + } } break; } @@ -541,25 +558,31 @@ function flag_lists_ops_form_validate(&$form, &$form_state) { return $error_count; } -function flag_lists_ops_form_submit(&$form, &$form_state) { +function flag_lists_ops_form_submit($form, &$form_state) { // Get the $ops from the originating form. $ops = $_REQUEST['flag_lists_ops']; + $ops = is_array($ops) ? $ops : array($ops); $success_count = 0; - // Get the operation, or set it switch ($form_state['values']['flag_lists_' . $form_state['flo_operation']]['operation']) { case 'unflag': $operation = 'unflag'; $message = 'removed from'; - foreach ($ops as $op) { - // Process the ID into 2 parts - list($nid, $fid) = explode('-', $op); - if (empty($nid) || empty($fid)) return; - - if (($flag = flag_lists_get_flag($fid)) && ($node = node_load($nid))) { - if (flag_lists_do_flag($flag, $operation, $nid)) { - $success_count++; + $user_flag_lists = flag_lists_get_user_flags(); + foreach ($user_flag_lists as $key => $op) { + // Iterate over all flags by this user + list($k1,$k2,$owner,$ofid) = explode('_', $key); + + foreach ($ops as $op) { + // Iterate over all selected items + list($nid,$fid) = array_merge( explode('-', $op), array(FALSE)); + if ($fid <> 0 && $fid == $ofid) { + if (($flag = flag_lists_get_flag($fid)) && ($node = node_load($nid))) { + if (flag_lists_do_flag($flag, $operation, $nid)) { + $success_count++; + } + } } } } @@ -578,7 +601,12 @@ function flag_lists_ops_form_submit(&$form, &$form_state) { break; } - $message = t('@count item(s) ' . $message . ' !title', array('@count' => $success_count, '!title' => $flag->title)); + if (!empty($flag->title) && $success_count <> 0) { + $message = t('@count item(s) ' . $message . ' !listname !title', array('@count' => $success_count, '!listname' => variable_get('flag_lists_name','list'), '!title' => $flag->title)); + } + else { + $message = t('No items affected.'); + } if ($_GET['q'] != 'system/ajax') { drupal_set_message($message); } @@ -621,7 +649,10 @@ function flag_lists_template_validate($form, &$form_state) { if (isset($content_types) && count($content_types)) { $content_types = implode(', ', $content_types); $templates = implode(', ', array_unique($templates)); - form_set_error('types', t('The flaggable content type(s) "@type" is(are) already assigned to the template(s) "@template." A content type may be assigned to only one template. To reassign a content type you must first remove its other assignment.', array('@type' => $content_types, '@template' => $templates))); + form_set_error('types', t('The flaggable content type(s) "@type" is(are) already assigned to the template(s) "@template." A content type may be assigned to only one template. To reassign a content type you must first remove its other assignment.', array( + '@type' => $content_types, + '@template' => $templates + ))); } } @@ -640,6 +671,7 @@ function flag_lists_template_submit($form, &$form_state) { ->execute(); } } + /** * Helper function to build an array of all lists available to or owned by the * current user and that are available on the current content type. @@ -661,7 +693,7 @@ function flag_lists_get_content_fids() { ->condition('fc.uid', $user->uid) ->condition('fn.type', $type); $query->leftJoin('flag_types', 'fn', 'fn.fid = fc.fid'); - $query->leftJoin('flags', 'f', 'fc.fid = f.fid'); + $query->leftJoin('flag', 'f', 'fc.fid = f.fid'); $fc_result = $query->execute(); foreach ($fc_result as $row) { @@ -672,7 +704,7 @@ function flag_lists_get_content_fids() { // This is the flag / unflag callback elseif (arg(0) == 'flag' && (arg(1) == 'flag' || arg(1) == 'unflag')) { // Get the flag for this request. - $fids[] = db_select('flags', 'f') + $fids[] = db_select('flag', 'f') ->fields('f', array('fid')) ->condition('name', arg(2)) ->execute() @@ -681,7 +713,7 @@ function flag_lists_get_content_fids() { // Get the regular flags for this node. The flag module will narrow by role, // etc. when flag_get_flags() is called. These flag ids are always returned. - $query = db_select('flags', 'f') + $query = db_select('flag', 'f') ->fields('f', array('fid')) ->condition('fc.fid', NULL); $query->leftJoin('flag_lists', 'fc', 'fc.fid = f.fid'); @@ -704,11 +736,11 @@ function flag_lists_get_content_fids() { function flag_lists_block_info() { return array( 'flag_lists' => array( - 'info' => t('Lists'), + 'info' => drupal_ucfirst(t('@name', array('@name' => variable_get('flag_lists_name','list')))), 'cache' => DRUPAL_NO_CACHE, ), 'flag_lists_list' => array( - 'info' => t('My lists'), + 'info' => t('My @name', array('@name' => variable_get('flag_lists_name', 'list'))), 'cache' => DRUPAL_NO_CACHE, ), ); @@ -726,13 +758,13 @@ function flag_lists_block_configure($delta = '') { 'create_lists' => array( '#type' => 'checkbox', '#title' => t('Show link to add new list'), - '#default_value' => variable_get('flag_lists_create_lists', 0), + '#default_value' => variable_get('flag_lists_create_lists', 1), '#description' => t('Checking this adds a link to the create new list form.'), ), 'ops' => array( '#type' => 'checkbox', '#title' => t('Show edit and delete links'), - '#default_value' => variable_get('flag_lists_ops', 0), + '#default_value' => variable_get('flag_lists_ops', 1), '#description' => t('Checking this appends edit and delete links to each list name for users with access.'), ), 'include_flags' => array( @@ -770,8 +802,13 @@ function flag_lists_block_view($delta = '') { case 'flag_lists': if (user_access('create flag lists')) { $block = array( - 'subject' => t('My lists'), - 'content' => theme('flag_lists_list', array('node' => NULL, 'create' => variable_get('flag_lists_create_lists', 0), 'ops' =>variable_get('flag_lists_ops', 0), 'use_flags' => variable_get('flag_lists_include_flags', 0))), + 'subject' => t('My @name', array('@name' => variable_get('flag_lists_name', 'list'))), + 'content' => theme('flag_lists_list', array( + 'node' => NULL, + 'create' => variable_get('flag_lists_create_lists', 0), + 'ops' => variable_get('flag_lists_ops', 0), + 'use_flags' => variable_get('flag_lists_include_flags', 0) + )), ); } break; @@ -781,7 +818,7 @@ function flag_lists_block_view($delta = '') { $account = user_load($user->uid); $block = array( - 'subject' => t('My lists'), + 'subject' => t('My @name', array('@name' => variable_get('flag_lists_name', 'list'))), 'content' => flag_lists_user_page($account), ); } @@ -807,13 +844,13 @@ function flag_lists_set_messages(&$flag) { // Get the parent flag. These are cached by the flag module. $pflag = flag_get_flag(NULL, $flag->pfid); $title = $flag->title; - $lists_name = variable_get('flag_lists_name', t('list')); - $flag->flag_short = $pflag->flag_short; - $flag->flag_long = $pflag->flag_long; - $flag->flag_message = $pflag->flag_message; - $flag->unflag_short = $pflag->unflag_short; - $flag->unflag_long = $pflag->unflag_long; - $flag->unflag_message = $pflag->unflag_message; + $lists_name = t('@name', array('@name' => variable_get('flag_lists_name', 'list'))); + $flag->flag_short = $pflag->flag_short; + $flag->flag_long = $pflag->flag_long; + $flag->flag_message = $pflag->flag_message; + $flag->unflag_short = $pflag->unflag_short; + $flag->unflag_long = $pflag->unflag_long; + $flag->unflag_message = $pflag->unflag_message; } /** @@ -822,24 +859,24 @@ function flag_lists_set_messages(&$flag) { * Make sure a user can only see his/her own personal flags. */ function flag_lists_flag_access($flag, $entity_id, $action, $account) { - if (!empty($flag->module) && $flag->module == 'flag_lists') { - switch ($action) { - case 'flag': - case 'unflag': - $fid = db_select('flag_lists_flags', 'f') - ->fields('f') - ->condition('f.uid', $account->uid) - ->execute() - ->fetchField(); - if (!empty($fid)) { - return array('flag_lists' => TRUE); - } - else { - return array('flag_lists' => FALSE); - } + if ( !empty($flag->name) && (strpos($flag->name, 'flag_lists') === 0) ) { + switch ($action) { + case 'flag': + case 'unflag': + $fid = db_select('flag_lists_flags', 'f') + ->fields('f') + ->condition('f.uid', $account->uid) + ->execute() + ->fetchField(); + if (!empty($fid)) { + return array('flag_lists' => TRUE); + } + else { + return array('flag_lists' => FALSE); + } + } } } -} /** * Implementation of hook_link(). @@ -885,13 +922,13 @@ function flag_lists_flag_delete($flag) { // flag_lists_types uses the template flag name, not our own fid. db_delete('flag_lists_types') - ->condition('name', $flag->name) - ->execute(); + ->condition('name', $flag->name) + ->execute(); // Now delete the sub-flags. $num_deleted = db_delete('flag_lists_flags') - ->condition('pfid', $flag->fid) - ->execute(); + ->condition('pfid', $flag->fid) + ->execute(); if (!empty($num_deleted)) { drupal_set_message(t('The template flag "@title" and all its sub-flags have been deleted.', array('@title' => $flag->title))); } @@ -902,7 +939,7 @@ function flag_lists_flag_delete($flag) { */ function flag_lists_views_api() { return array( - 'api' => 2.0, + 'api' => 3.0, 'path' => drupal_get_path('module', 'flag_lists') . '/includes', ); } @@ -927,7 +964,9 @@ function flag_lists_is_owner($action, $name) { if (!user_access($action . ' own flag lists')) { return FALSE; } - if (db_select('flag_lists_flags', 'f')->fields('f')->condition('f.name', $name)->condition('f.uid', $user->uid)->countQuery()->execute()->fetchField()) { + if (db_select('flag_lists_flags', 'f')->fields('f')->condition('f.name', $name)->condition('f.uid', $user->uid) + ->countQuery()->execute()->fetchField() + ) { return TRUE; } return FALSE; @@ -967,8 +1006,12 @@ function flag_lists_get_user_flags($content_type = NULL, $account = NULL, $use_f if ($use_flags) { $flags = flag_get_flags('node', $content_type, $account); - // Strip out any list templates foreach ($flags as $key => $flag) { + if (!isset($flag->module)) { + // Assume flag is from flag module + $flags[$key]->module = 'flag'; + } + // Strip out any list templates if (stristr($flag->name, 'fl_template') !== FALSE) { unset($flags[$key]); } @@ -989,8 +1032,16 @@ function theme_flag_lists_ops($variables) { $flag = $variables['flag']; $links = array( - 'flags_edit' => array('title' => t('edit'), 'href' => 'flags/lists/edit/' . $flag->name, 'query' => drupal_get_destination()), - 'flags_delete' => array('title' => t('delete'), 'href' => 'flags/lists/delete/' . $flag->name, 'query' => drupal_get_destination()), + 'flags_edit' => array( + 'title' => t('edit'), + 'href' => 'flag/lists/edit/' . $flag->name, + 'query' => drupal_get_destination() + ), + 'flags_delete' => array( + 'title' => t('delete'), + 'href' => 'flag/lists/delete/' . $flag->name, + 'query' => drupal_get_destination() + ), ); return theme('links', array('links' => $links, 'attributes' => array('class' => 'flag_lists_ops'))); } @@ -1042,9 +1093,10 @@ function theme_flag_lists_list($variables) { global $user; if ($flags = flag_lists_get_user_flags($content_type, $user, $use_flags)) { // Build the list of lists for this node. + foreach ($flags as $flag) { if ($flag->module == 'flag_lists') { - $action = _flag_lists_is_flagged($flag, $entity_id, $user->uid, 0) ? 'unflag' : 'flag'; + $action = _flag_lists_is_flagged($flag, $entity_id, $user->uid, 0) ? 'unflag' : 'flag'; } else { $action = $flag->is_flagged($entity_id) ? 'unflag' : 'flag';; @@ -1076,7 +1128,11 @@ function theme_flag_lists_list($variables) { } drupal_add_css(drupal_get_path('module', 'flag_lists') . '/theme/flag_lists.css'); - return theme('item_list', array('items' => $items, 'type' => 'ul', 'attributes' => array('class' => 'flag-lists-links'))); + return theme('item_list', array( + 'items' => $items, + 'type' => 'ul', + 'attributes' => array('class' => 'flag-lists-links') + )); } @@ -1121,7 +1177,7 @@ function flag_lists_get_flags($limit = NULL, $header = NULL) { ->fields('fl') ->groupBy('fl.fid') ->extend('PagerDefault') - ->limit($limit); + ->limit($limit); $query->leftJoin('flag_types', 'ft', 'ft.fid = fl.pfid'); $query->addExpression('GROUP_CONCAT(ft.type)', 'types'); $result = $query->execute(); @@ -1221,74 +1277,50 @@ function flag_lists_flag_link($flag, $action, $entity_id) { } /** - * Implementation of hook_flag_link_types(). + * Implementation of hook_flag_link_type_info(). */ -function flag_lists_flag_link_types() { +function flag_lists_flag_link_type_info() { return array( 'fl_template' => array( 'title' => t('Flag Lists toggle'), 'description' => t('If you are creating a Flag lists template flag, you must select this link type.'), + 'options' => array(), + 'uses standard js' => TRUE, + 'uses standard css' => TRUE, ), ); } -function flag_lists_flag_default_flags($name = 'fl_template') { - // return array( - // array( - // 'api_version' => 2, - // 'name' => $name, - // 'module' => 'flag_lists', - // 'content_type' => 'node', - // 'global' => 0, - // 'show_on_page' => 0, - // 'show_on_teaser' => 0, - // 'show_on_form' => 0, - // // The following UI labels aren't wrapped in t() because they are written - // // to the DB in English. They are passed to t() later, thus allowing for - // // multilingual sites. - // 'title' => 'Flag lists template', - // 'flag_short' => 'Add to your [flag_lists:title] [flag_lists:term]', - // 'flag_long' => 'Add this post to your [flag_lists:title] [flag_lists:term]', - // 'flag_message' => 'This post has been added to your [flag_lists:title] [flag_lists:term]', - // 'unflag_short' => 'Remove this from your [flag_lists:title] [flag_lists:term]', - // 'unflag_long' => 'Remove this post from your [flag_lists:title] [flag_lists:term]', - // 'unflag_message' => 'This post has been removed from your [flag_lists:title] [flag_lists:term]', - // 'types' => array(), - // 'link_type' => 'toggle', - // ), - // ); - -$flags = array(); -// Exported flag: "Flag lists template". -$flags['fl_template'] = array( - 'entity_type' => 'node', - 'title' => 'Flag lists template', - 'global' => 0, - 'types' => array(), - 'flag_short' => 'Add to your [flag_lists:title] [flag_lists:term]', - 'flag_long' => 'Add this post to your [flag_lists:title] [flag_lists:term]', - 'flag_message' => 'This post has been added to your [flag_lists:title] [flag_lists:term]', - 'unflag_short' => 'Remove this from your [flag_lists:title] [flag_lists:term]', - 'unflag_long' => 'Remove this post from your [flag_lists:title] [flag_lists:term]', - 'unflag_message' => 'This post has been removed from your [flag_lists:title] [flag_lists:term]', - 'unflag_denied_text' => '', - 'link_type' => 'toggle', - 'weight' => 0, - 'api_version' => 3, - 'module' => 'flag_lists', - 'show_on_page' => 0, - 'show_on_teaser' => 0, - 'show_on_form' => 0, - 'status' => FALSE, - 'import_roles' => array( - 'flag' => array(), - 'unflag' => array(), - ), -); -return $flags; - - +function flag_lists_flag_default_flags() { + $flags = array(); + // Exported flag: "Flag lists template". + $flags['fl_template'] = array( + 'entity_type' => 'node', + 'title' => 'Flag lists template', + 'global' => 0, + 'types' => array(), + 'flag_short' => 'Add to your [flag_lists:title] [flag_lists:term]', + 'flag_long' => 'Add this post to your [flag_lists:title] [flag_lists:term]', + 'flag_message' => 'This post has been added to your [flag_lists:title] [flag_lists:term]', + 'unflag_short' => 'Remove this from your [flag_lists:title] [flag_lists:term]', + 'unflag_long' => 'Remove this post from your [flag_lists:title] [flag_lists:term]', + 'unflag_message' => 'This post has been removed from your [flag_lists:title] [flag_lists:term]', + 'unflag_denied_text' => '', + 'link_type' => 'toggle', + 'weight' => 0, + 'api_version' => 3, + 'module' => 'flag_lists', + 'show_on_page' => 0, + 'show_on_teaser' => 0, + 'show_on_form' => 0, + 'status' => FALSE, + 'import_roles' => array( + 'flag' => array(), + 'unflag' => array(), + ), + ); + return $flags; } /** @@ -1310,7 +1342,7 @@ function flag_lists_save(&$flag, $account = NULL) { module_invoke_all('flag_lists', $flag, $account); } // Clear the page cache for anonymous users. -// cache_clear_all('*', 'cache_page', TRUE); + // cache_clear_all('*', 'cache_page', TRUE); } /** @@ -1361,7 +1393,7 @@ function flag_lists_fl_delete($flag, $account = NULL) { $flag->is_deleted = TRUE; module_invoke_all('flag_lists', $flag, $account); _flag_lists_clear_cache(); - drupal_set_message(t('The @name @title has been deleted.', array('@name' => variable_get('flag_lists_name', t('list')), '@title' => $flag->title))); + drupal_set_message(t('The @name @title has been deleted.', array('@name' => variable_get('flag_lists_name', 'list'), '@title' => $flag->title))); } @@ -1419,8 +1451,8 @@ function flag_lists_page($action = NULL, $flag_name = NULL, $entity_id = NULL) { // If successful, return data according to the request type. if ($js) { drupal_add_http_header('Content-Type', 'text/javascript; charset=utf-8'); -// $flag = flag_lists_get_flag($flag_name); - // $flag->link_type = 'toggle'; + // $flag = flag_lists_get_flag($flag_name); + // $flag->link_type = 'toggle'; $sid = flag_get_sid($user->uid); $new_action = _flag_lists_is_flagged($flag, $entity_id, $user->uid, $sid) ? 'unflag' : 'flag'; $new_link = $flag->theme($new_action, $entity_id, array("after_flagging" => TRUE)); @@ -1430,7 +1462,7 @@ function flag_lists_page($action = NULL, $flag_name = NULL, $entity_id = NULL) { 'newLink' => $new_link, // Further information for the benefit of custom JavaScript event handlers: 'contentId' => $entity_id, - 'contentType' => $flag->content_type, + 'contentType' => $flag->entity_type, 'flagName' => $flag->name, 'flagStatus' => $action, )); @@ -1449,206 +1481,182 @@ function flag_lists_fix_link(&$link, $action) { $link = str_replace('/flag/' . $action . '/', '/flag-lists/' . $action . '/', $link); } - /** - * Flags, or unflags, an item. - * - * @param $action - * Either 'flag' or 'unflag'. - * @param $entity_id - * The ID of the item to flag or unflag. - * @param $account - * The user on whose behalf to flag. Leave empty for the current user. - * @param $skip_permission_check - * Flag the item even if the $account user doesn't have permission to do so. - * @return - * FALSE if some error occured (e.g., user has no permission, flag isn't - * applicable to the item, etc.), TRUE otherwise. - */ - function flag_lists_do_flag($flag, $action, $entity_id, $account = NULL, $skip_permission_check = FALSE) { - if (!isset($account)) { - $account = $GLOBALS['user']; - } - if (!$account) { +/** + * Flags, or unflags, an item. + * + * @param $action + * Either 'flag' or 'unflag'. + * @param $entity_id + * The ID of the item to flag or unflag. + * @param $account + * The user on whose behalf to flag. Leave empty for the current user. + * @param $skip_permission_check + * Flag the item even if the $account user doesn't have permission to do so. + * @return + * FALSE if some error occured (e.g., user has no permission, flag isn't + * applicable to the item, etc.), TRUE otherwise. + */ +function flag_lists_do_flag($flag, $action, $entity_id, $account = NULL, $skip_permission_check = FALSE) { + if (!isset($account)) { + $account = $GLOBALS['user']; + } + if (!$account) { + return FALSE; + } + if (!$skip_permission_check) { + if (!$flag->access($entity_id, $action, $account)) { + // User has no permission to flag/unflag this object. return FALSE; } - if (!$skip_permission_check) { - if (!$flag->access($entity_id, $action, $account)) { - // User has no permission to flag/unflag this object. - return FALSE; - } - } - else { - // We are skipping permission checks. However, at a minimum we must make - // sure the flag applies to this content type: - if (!$flag->applies_to_content_id($entity_id)) { - return FALSE; - } - } - - // Clear various caches; We don't want code running after us to report - // wrong counts or false flaggings. -// flag_get_counts(NULL, NULL, TRUE); -// flag_get_user_flags(NULL, NULL, NULL, NULL, TRUE); - - // Find out which user id to use. - $uid = $flag->global ? 0 : $account->uid; - - $sid = flag_get_sid($uid); - // Anonymous users must always have a session id. - if ($sid == 0 && $account->uid == 0) { + } + else { + // We are skipping permission checks. However, at a minimum we must make + // sure the flag applies to this content type: + if (!$flag->applies_to_entity_id($entity_id)) { return FALSE; } - - // Perform the flagging or unflagging of this flag. We invoke hook_flag here - // because we do our own flagging. - $flagged = _flag_lists_is_flagged($flag, $entity_id, $uid, $sid); - if ($action == 'unflag') { - if ($flagged) { - $fcid = _flag_lists_unflag($flag, $entity_id, $uid, $sid); - module_invoke_all('flag', 'unflag', $flag, $entity_id, $account, $fcid); - } - } - elseif ($action == 'flag') { - if (!$flagged) { - $fcid = _flag_lists_flag($flag, $entity_id, $uid, $sid); - module_invoke_all('flag', 'flag', $flag, $entity_id, $account, $fcid); - } - } - - return TRUE; } + // Clear various caches; We don't want code running after us to report + // wrong counts or false flaggings. + // flag_get_counts(NULL, NULL, TRUE); + // flag_get_user_flags(NULL, NULL, NULL, NULL, TRUE); - /** - * Returns TRUE if a certain user has flagged this content. - * - * - * This method is similar to is_flagged() except that it does direct SQL and - * doesn't do caching. Use it when you want to not affect the cache, or to - * bypass it. - * - */ - function _flag_lists_is_flagged($flag, $entity_id, $uid, $sid) { - $query = db_select('flag_lists_content') - ->condition('fid', $flag->fid) - ->condition('uid', $uid) - ->condition('sid', $sid) - ->condition('entity_id', $entity_id); - $query->addField('flag_lists_content', 'fid'); - return $query->execute()->fetchField(); + // Find out which user id to use. + $uid = $flag->global ? 0 : $account->uid; + + $sid = flag_get_sid($uid); + // Anonymous users must always have a session id. + if ($sid == 0 && $account->uid == 0) { + return FALSE; } - /** - * A low-level method to flag content. - * - * You probably shouldn't call this raw private method: call the - * flag_lists_do_flag() function instead. - * - */ - function _flag_lists_flag($flag, $entity_id, $uid, $sid) { - $fcid = db_insert('flag_lists_content') - ->fields(array( - 'fid' => $flag->fid, - 'entity_type' => $flag->entity_type, - 'entity_id' => $entity_id, - 'uid' => $uid, - 'sid' => $sid, - 'timestamp' => REQUEST_TIME, - )) + // Perform the flagging or unflagging of this flag. We invoke hook_flag here + // because we do our own flagging. + $flagged = _flag_lists_is_flagged($flag, $entity_id, $uid, $sid); + if ($action == 'unflag') { + if ($flagged) { + $fcid = _flag_lists_unflag($flag, $entity_id, $uid, $sid); + module_invoke_all('flag_unflag', $flag, $entity_id, $account, $fcid); + return TRUE; + } + } + elseif ($action == 'flag') { + if (!$flagged) { + $fcid = _flag_lists_flag($flag, $entity_id, $uid, $sid); + module_invoke_all('flag_flag', $flag, $entity_id, $account, $fcid); + return TRUE; + } + } + + return FALSE; +} + + +/** + * Returns TRUE if a certain user has flagged this content. + * + * + * This method is similar to is_flagged() except that it does direct SQL and + * doesn't do caching. Use it when you want to not affect the cache, or to + * bypass it. + * + */ +function _flag_lists_is_flagged($flag, $entity_id, $uid, $sid) { + $query = db_select('flag_lists_content') + ->condition('fid', $flag->fid) + ->condition('uid', $uid) + ->condition('sid', $sid) + ->condition('entity_id', $entity_id); + $query->addField('flag_lists_content', 'fid'); + return $query->execute()->fetchField(); +} + +/** + * A low-level method to flag content. + * + * You probably shouldn't call this raw private method: call the + * flag_lists_do_flag() function instead. + * + */ +function _flag_lists_flag($flag, $entity_id, $uid, $sid) { + $fcid = db_insert('flag_lists_content') + ->fields(array( + 'fid' => $flag->fid, + 'entity_type' => $flag->entity_type, + 'entity_id' => $entity_id, + 'uid' => $uid, + 'sid' => $sid, + 'timestamp' => REQUEST_TIME, + )) + ->execute(); + + _flag_lists_update_count($flag, $entity_id); + return $fcid; +} + +/** + * A low-level method to unflag content. + * + * You probably shouldn't call this raw private method: call the + * flag_lists_do_flag() function instead. + * + */ +function _flag_lists_unflag($flag, $entity_id, $uid, $sid) { + $query = db_select('flag_lists_content') + ->condition('fid', $flag->fid) + ->condition('entity_id', $entity_id) + ->condition('uid', $uid) + ->condition('sid', $sid); + $query->addField('flag_lists_content', 'fcid'); + $fcid = $query->execute()->fetchField(); + if ($fcid) { + db_delete('flag_lists_content') + ->condition('fcid', $fcid) ->execute(); - _flag_lists_update_count($flag, $entity_id); - return $fcid; } + return $fcid; +} - /** - * A low-level method to unflag content. - * - * You probably shouldn't call this raw private method: call the - * flag_lists_do_flag() function instead. - * - */ - function _flag_lists_unflag($flag, $entity_id, $uid, $sid) { - $query = db_select('flag_lists_content') +/** + * Updates the flag count for this content + */ +function _flag_lists_update_count($flag, $entity_id) { + $count = db_select('flag_lists_content', 'f') + ->fields('f') + ->condition('fid', $flag->fid) + ->condition('entity_id', $entity_id) + ->countQuery() + ->execute() + ->fetchField(); + + if (empty($count)) { + $num_deleted = db_delete('flag_lists_counts') ->condition('fid', $flag->fid) ->condition('entity_id', $entity_id) - ->condition('uid', $uid) - ->condition('sid', $sid); - $query->addField('flag_lists_content', 'fcid'); - $fcid = $query->execute()->fetchField(); - if ($fcid) { - db_delete('flag_lists_content') - ->condition('fcid', $fcid) - ->execute(); - _flag_lists_update_count($flag, $entity_id); - } - return $fcid; + ->execute(); } - - - /** - * Remove all entries of entity_id and type - * - * @param $entity_id - * Entity id which has been flagged. - * @param $type - * The entity type. - */ - function _flag_lists_remove_entity($entity_id, $type) { - $query = db_select('flag_lists_content') - ->condition('entity_id', $entity_id) - ->condition('entity_type', $type); - $query->fields('flag_lists_content', array('fcid', 'fid', 'uid', 'sid')); - $items = $query->execute()->fetchAll(); - - if ($items) { - foreach ($items as $key => $value) { - db_delete('flag_lists_content') - ->condition('fcid', $value->fcid) - ->execute(); - watchdog('flag_lists', t('Deleted entry @fcid from flat_lists_content', array('@fcid' => $value->fcid))); - } - } - } - - /** - * Updates the flag count for this content - */ - function _flag_lists_update_count($flag, $entity_id) { - $count = db_select('flag_lists_content', 'f') - ->fields('f') + else { + $num_updated = db_update('flag_lists_counts') + ->fields(array( + 'count' => $count, + )) ->condition('fid', $flag->fid) ->condition('entity_id', $entity_id) - ->countQuery() - ->execute() - ->fetchField(); - - if (empty($count)) { - $num_deleted = db_delete('flag_lists_counts') - ->condition('fid', $flag->fid) - ->condition('entity_id', $entity_id) - ->execute(); - } - else { - $num_updated = db_update('flag_lists_counts') + ->execute(); + if (empty($num_updated)) { + db_insert('flag_lists_counts') ->fields(array( + 'fid' => $flag->fid, + 'entity_type' => $flag->entity_type, + 'entity_id' => $entity_id, 'count' => $count, )) - ->condition('fid', $flag->fid) - ->condition('entity_id', $entity_id) ->execute(); - if (empty($num_updated)) { - db_insert('flag_lists_counts') - ->fields(array( - 'fid' => $flag->fid, - 'entity_type' => $flag->entity_type, - 'entity_id' => $entity_id, - 'count' => $count, - )) - ->execute(); - } } } +} /** * Checks for a list template for a content type. @@ -1668,7 +1676,11 @@ function flag_lists_template_exists($type) { * Checks for a list title by node type. */ function flag_lists_title_exists($title, $type) { - return db_query("SELECT COUNT(flf.fid) FROM {flag_lists_flags} flf LEFT JOIN {flag_types} ft ON flf.pfid=ft.fid WHERE flf.title=:title AND ft.type=:type AND flf.uid=:uid", array(':title' => $title, ':type' => $type, ':uid' => $GLOBALS['user']->uid))->fetchField(); + return db_query("SELECT COUNT(flf.fid) FROM {flag_lists_flags} flf LEFT JOIN {flag_types} ft ON flf.pfid=ft.fid WHERE flf.title=:title AND ft.type=:type AND flf.uid=:uid", array( + ':title' => $title, + ':type' => $type, + ':uid' => $GLOBALS['user']->uid + ))->fetchField(); } /** @@ -1718,6 +1730,7 @@ function flag_lists_token_info() { * Implements hook_tokens(). */ function flag_lists_tokens($type, $tokens, array $data = array(), array $options = array()) { + $sanitize = !empty($options['sanitize']); $replacements = array(); if ($type == 'flag_lists' && !empty($data['flag_lists'])) { @@ -1725,10 +1738,10 @@ function flag_lists_tokens($type, $tokens, array $data = array(), array $options foreach ($tokens as $name => $original) { switch ($name) { case 'title': - $replacements[$original] = $flag_list->title; + $replacements[$original] = $sanitize ? check_plain($flag_list->title) : $flag_lists->title; break; case 'term': - $replacements[$original] = variable_get('flag_lists_name', t('list')); + $replacements[$original] = $sanitize ? check_plain(variable_get('flag_lists_name', 'list')) : variable_get('flag_lists_name', 'list'); break; } } @@ -1765,21 +1778,10 @@ function flag_lists_views_form_substitutions() { $select_all = array( '#type' => 'checkbox', '#default_value' => FALSE, - '#attributes' => array('class' => array('flo-table-select-all')), + '#attributes' => array('class' => array('flo-table-select-all'), + 'title' => array(t('Select all'))), ); return array( $select_all_placeholder => drupal_render($select_all), ); } - - -/** - * Implements hook_entity_delete - */ -function flag_lists_entity_delete($entity, $type) { - foreach (flag_get_flags($type) as $flag) { - if (isset($entity->vid)) { - $items = _flag_lists_remove_entity($entity->vid, $type); - } - } -} diff --git a/sites/all/modules/contrib/flag/flag_lists/flag_lists.module.orig b/sites/all/modules/contrib/flag/flag_lists/flag_lists.module.orig deleted file mode 100644 index 8b25b241..00000000 --- a/sites/all/modules/contrib/flag/flag_lists/flag_lists.module.orig +++ /dev/null @@ -1,1737 +0,0 @@ - 'Lists', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('flag_lists_settings_form'), - 'access callback' => 'user_access', - 'access arguments' => array('administer flags'), - 'description' => 'Configure default settings allowing users to mark content with personal flags.', - 'file' => 'flag_lists.admin.inc', - 'type' => MENU_LOCAL_TASK, - 'weight' => 100, - ); - $items[FLAG_ADMIN_PATH . '/lists/settings'] = array( - 'title' => 'Settings', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('flag_lists_settings_form'), - 'access callback' => 'user_access', - 'access arguments' => array('administer flags'), - 'description' => 'Configure default settings allowing users to mark content with personal flags.', - 'file' => 'flag_lists.admin.inc', - 'type' => MENU_DEFAULT_LOCAL_TASK, - 'weight' => 1, - ); - $items[FLAG_ADMIN_PATH . '/lists/list'] = array( - 'title' => 'List', - 'page callback' => 'flag_lists_admin_page', - 'access callback' => 'user_access', - 'access arguments' => array('administer flags'), - 'file' => 'flag_lists.admin.inc', - 'type' => MENU_LOCAL_TASK, - 'weight' => 2, - ); - $items[FLAG_ADMIN_PATH . '/lists/template'] = array( - 'title' => 'New template', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('flag_lists_create_template_form'), - 'access callback' => 'user_access', - 'access arguments' => array('administer flags'), - 'file' => 'flag_lists.admin.inc', - 'type' => MENU_LOCAL_TASK, - 'weight' => 3, - ); - if (module_exists('devel_generate')) { - $items['admin/config/development/generate/flag-lists'] = array( - 'title' => 'Generate lists', - 'description' => 'Generate a given number of lists and listings on site content. Optionally delete existing lists and listings.', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('flag_lists_generate_lists_form'), - 'access callback' => 'user_access', - 'access arguments' => array('administer flags'), - 'file' => 'flag_lists.admin.inc', - ); - } - $items['flag-lists/add/%'] = array( - 'title' => 'Add a list', - 'page callback' => 'flag_lists_add', - 'page arguments' => array(2), - 'access callback' => 'user_access', - 'access arguments' => array('create flag lists'), - 'file' => 'flag_lists.admin.inc', - 'type' => MENU_NORMAL_ITEM, - ); - // Callback for adding a new list through JS - $items['flag-lists/add/%/js'] = array( - 'title' => 'Add a list', - 'page callback' => 'flag_lists_add_js', - 'page arguments' => array(2), - 'access callback' => 'user_access', - 'access arguments' => array('create flag lists'), - 'file' => 'flag_lists.admin.inc', - 'type' => MENU_CALLBACK, - ); - - $items['flags/lists/edit/%'] = array( - 'title' => 'Edit a list', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('flag_lists_form', 3), - 'access callback' => 'flag_lists_is_owner', - 'access arguments' => array(2, 3), - 'file' => 'flag_lists.admin.inc', - 'type' => MENU_CALLBACK, - ); - $items['flags/lists/delete/%'] = array( - 'title' => 'Delete a list', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('flag_lists_delete_confirm', 3), - 'access callback' => 'flag_lists_is_owner', - 'access arguments' => array(2, 3), - 'file' => 'flag_lists.admin.inc', - 'type' => MENU_CALLBACK, - ); - $items[FLAG_ADMIN_PATH . '/flag-lists/rebuild'] = array( - 'title' => 'Rebuild all flag lists', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('flag_lists_rebuild_confirm'), - 'access callback' => 'user_access', - 'access arguments' => array('administer flag lists'), - 'file' => 'flag_lists.admin.inc', - 'type' => MENU_CALLBACK, - ); - $items['flag-lists'] = array( - 'title' => 'Flag', - 'page callback' => 'flag_lists_page', - 'access callback' => 'user_access', - 'access arguments' => array('access content'), - 'type' => MENU_CALLBACK, - ); - - $items['user/%user/flags/lists'] = array( - 'title' => ucfirst(variable_get('flag_lists_name', 'list')), - 'page callback' => 'flag_lists_user_page', - 'page arguments' => array(1), - 'access callback' => 'user_access', - 'access arguments' => array('view flag lists'), - 'type' => MENU_LOCAL_TASK, - ); - $items['user/%user/flags/lists/%'] = array( - 'title' => ucfirst(variable_get('flag_lists_name', 'list')) . ' content', - 'page callback' => 'flag_lists_user_list', - 'page arguments' => array(1, 4), - 'access callback' => 'user_access', - 'access arguments' => array('view flag lists'), - 'type' => MENU_CALLBACK, - ); - return $items; -} - -/** - * User flag page. Display a list of user-created flag lists. - */ -function flag_lists_user_page($user) { - // Can we use our default view? - if (module_exists('views')) { - $view = views_get_view('flag_lists_user_lists', FALSE); - if (!empty($view)) { - $view->set_display('default'); - $view->set_arguments(array($user->uid)); - $output = $view->render(); - drupal_set_title(str_replace(array_keys($view->build_info['substitutions']), $view->build_info['substitutions'], $view->build_info['title'])); - } - return $output; - } - else { - return theme('flag_lists_user_page', array('uid' => $user->uid)); - } -} - -/** - * Theme the output for a user flag administration page. - */ -function theme_flag_lists_user_page($variables) { - $uid = $variables['uid']; - - $account = user_load($uid); - drupal_set_title(t('Lists')); - if ($flags = flag_lists_get_user_flags(NULL, $account)) { - // Build the list of flag lists for this node. - foreach ($flags as $flag) { - $ops = theme('flag_lists_ops', array('flag' => $flag)); - $items[] = l($flag->title, "user/$uid/flags/lists/" . $flag->fid) . $ops; - } - } - drupal_add_css(drupal_get_path('module', 'flag_lists') . '/theme/flag_lists.css'); - return theme('item_list', array('items' => $items)); -} - -/** - * List the contents of a user-defined list - */ -function flag_lists_user_list($user, $fid) { - $uid = $user->uid; - // Can we use our default view? - if (module_exists('views')) { - $view = views_get_view('flag_lists_user_list', FALSE); - if (!empty($view)) { - $view->set_display('default'); - $view->set_arguments(array($fid)); - $output = $view->render(); - drupal_set_title(str_replace(array_keys($view->build_info['substitutions']), $view->build_info['substitutions'], $view->build_info['title'])); - } - return $output; - } - - else { - return theme('flag_lists_user_list', array('uid' => $uid, 'fid' => $fid)); - } -} - -/** - * Theme the output of user-defined list page - */ -function theme_flag_lists_user_list($variables) { - $uid = $variables['uid']; - $fid = $variables['fid']; - - $flag = flag_lists_get_flag($fid); - drupal_set_title($flag->title); - $content = flag_lists_get_flagged_content($fid, $uid); - foreach ($content as $item) { - if ($item->content_type == 'node') { - $node = node_load($item->entity_id); - $items[] = l($node->title, 'node/' . $node->nid); - } - } - - $breadcrumb = menu_get_active_breadcrumb(); - $breadcrumb[] = l(t('@name lists', array('@name' => drupal_ucfirst(variable_get('flag_lists_name', t('lists'))))), 'user/' . arg(1) . '/flags/lists'); - drupal_set_breadcrumb($breadcrumb); - return theme('item_list', array('items' => $items)); -} - -/** - * Implementation of hook_theme(). - */ -function flag_lists_theme() { - $path = drupal_get_path('module', 'flag') . '/theme'; - - return array( - 'flag_lists_list' => array( - 'variables' => array('node' => NULL, 'create' => NULL, 'ops' => NULL, 'use_flags' => NULL), - ), - 'flag_lists_admin_page' => array( - 'variables' => array('flags' => NULL), - ), - 'flag_lists_user_page' => array( - 'variables' => array('uid' => NULL), - ), - 'flag_lists_user_list' => array( - 'variables' => array('flag_name' => NULL), - ), - 'flag_lists_ops' => array( - 'variables' => array('flag' => NULL), - ) - ); -} - -/** - * Implementation of hook_permission(). - */ -function flag_lists_permission() { - return array( - 'create flag lists' => array( - 'title' => t('Create flag lists'), - 'description' => t(''), - ), - 'edit own flag lists' => array( - 'title' => t('Edit own flag lists'), - 'description' => t(''), - ), - 'delete own flag lists' => array( - 'title' => t('Delete own flag lists'), - 'description' => t(''), - ), - 'view flag lists' => array( - 'title' => t('View flag lists'), - 'description' => t(''), - )); -} - -/** - * Implementation of hook_form_alter(). - */ -function flag_lists_form_alter(&$form, &$form_state, $form_id) { - switch ($form_id) { - case 'flag_form': - // A template flag should always have a record in the flag_lists_types table. - $result = db_select('flag_lists_types', 'f')->fields('f')->execute(); - foreach ($result as $type) { - $types[$type->name] = $type->type; - } - - if (isset($types[$form['name']['#default_value']])) { - $form['name']['#type'] = 'value'; - $form['global']['#type'] = 'value'; - $form['title']['#description'] = t('A short, descriptive title for this template. It will be used in administrative interfaces to refer to this template.'); - - // Warn about types that already have a template. - foreach ($form['access']['types']['#options'] as $option => $value) { - if (in_array($option, $types) && $form['access']['types']['#default_value'] != $option) { - $form['access']['types']['#options'][$option] .= '' . t('(Already has a template.)') . ''; - } - } - $form['access']['types']['#description'] .= t('A type may only be selected in one list template.'); - - // Unset anon permissions for now. @todo allow anon listing. - unset($form['access']['roles']['flag']['#options'][1]); - unset($form['access']['roles']['unflag']['#options'][1]); - - foreach (element_children($form['display']) as $display) { - $form['display'][$display]['#type'] = 'value'; - } - $form['display']['link_type']['#default_value'] = 'fl_template'; - $form['display']['#description'] = t('Unlike normal flags, lists are only displayed in a block provided by this module or in views blocks. See the block admin page to place the block.'); - - $form['#validate'][] = 'flag_lists_template_validate'; - $form['#submit'][] = 'flag_lists_template_submit'; - } - break; - - case 'views_exposed_form': - // Force the exposed filters to perform actions on the page itself because - // the views default viwe didn't come with a page display - if ($form['#id'] == 'views-exposed-form-flag-lists-default') { - $form['#action'] = '/' . implode('/', arg()); - } - break; - } - - // Flag lists operations related changes - if (strpos($form_id, 'views_form_') === 0) { - $flo = _flag_lists_ops_get_field($form_state['build_info']['args'][0]); - - // Not a FLO-enabled views form. - if (empty($flo)) { - return; - } - - // Add FLO's custom callbacks. - $form['#validate'][] = 'flag_lists_ops_form_validate'; - $form['#submit'][] = 'flag_lists_ops_form_submit'; - - // Allow FLO to work when embedded using views_embed_view(), or in a block. - if (empty($flo->view->override_path)) { - if (!empty($flo->view->preview) || $flo->view->display_handler instanceof views_plugin_display_block) { - $flo->view->override_path = $_GET['q']; - } - } - - // Quickfix for FLO & exposed filters using ajax. See http://drupal.org/node/1191928. - $query = drupal_get_query_parameters($_GET, array('q')); - $form['#action'] = url($flo->view->get_url(), array('query' => $query)); - - // Add basic FLO functionality. - if ($form_state['step'] == 'views_form_views_form') { - $form = flag_lists_ops_form($form, $form_state, $flo); - } - } -} - -/** - * Add the Flag list select menu widget. - */ -function flag_lists_ops_form($form, &$form_state, $flo) { - $form['#attached']['js'][] = drupal_get_path('module', 'flag_lists') . '/js/flag_lists_ops.js'; - $form['#attached']['css'][] = drupal_get_path('module', 'flag_lists') . '/css/flag_lists_ops.css'; - $form['#prefix'] = '
'; - $form['#suffix'] = '
'; - - $form_state['flo_operation'] = $flo->options['flo']['operation']; - - // Force browser to reload the page if Back is hit. - if (preg_match('/msie/i', $_SERVER['HTTP_USER_AGENT'])) { - drupal_add_http_header('Cache-Control', 'no-cache'); // works for IE6+ - } - else { - drupal_add_http_header('Cache-Control', 'no-store'); // works for Firefox and other browsers - } - - global $user; - global $base_url; - $account = user_load($user->uid); - $items = array(); - if ($flags = flag_lists_get_user_flags(NULL, $account)) { - // Build the list of flag lists for this node. - foreach ($flags as $flag) { - $items[((string)$flag->fid)] = $flag->title; - } - } - - // Group items into a fieldset for easier theming. - $form['flag_lists_' . $form_state['flo_operation']] = array( - '#type' => 'fieldset', - '#title' => t('List operations'), - '#tree' => TRUE, - '#attributes' => array('class' => array('flag-lists-ops-fieldset')), - ); - switch ($flo->options['flo']['operation']) { - case 'unflag': - $null_text = 'Remove from a list'; - $operation = 'unflag'; - $form['flag_lists_' . $form_state['flo_operation']]['list'] = array( - '#type' => 'button', - '#value' => t('Remove from list'), - '#ajax' => array( - 'callback' => 'flag_lists_ops_form_ajax_callback', - 'wrapper' => 'flag-list-ops-container-' . $flo->options['flo']['operation'], - ), - ); - break; - default: - $null_text = 'Add to a list'; - $operation = 'flag'; - drupal_add_library('system', 'ui.dialog'); - $form['flag_lists_' . $form_state['flo_operation']]['list'] = array( - '#type' => 'select', - '#options' => array('0' => t('- ' . $null_text . ' -')) + $items, - '#default_value' => '0', - '#ajax' => array( - 'callback' => 'flag_lists_ops_form_ajax_callback', - 'wrapper' => 'flag-list-ops-container-' . $flo->options['flo']['operation'], - ), - '#attributes' => array( - 'class' => array( - 'flag-lists-ops-dropdown', - ), - ), - ); - - // Add the necessary JS for creating a new list via AJAX - $result = db_select('flag_lists_types') - ->fields('flag_lists_types') - ->execute(); - $list_types = array(); - foreach ($result as $row) { - if (!empty($row->type)) { - $list_types[] = $row->type; - } - } - drupal_add_js(array('flag_lists' => array('types' => $list_types, 'json_path' => $base_url . '/flag-lists/add/%/js')), 'setting'); - break; - } - - // Get the $ops from the originating form. - if (!empty($form_state['values']['flag_lists_' . $form_state['flo_operation']]['list'])) { - $list = $form_state['values']['flag_lists_' . $form_state['flo_operation']]['list']; - } - if (!empty($_REQUEST['flag_lists_ops'])) { - $ops = $_REQUEST['flag_lists_ops']; - } - if (!empty($ops) && !empty($list) && $form_state['values']['flag_lists_' . $form_state['flo_operation']]['operation'] == 'unflag') { - $hidden_deleted_values = ''; - foreach ($ops as $nid) { - $hidden_deleted_values .= ''; - } - } - - $form['flag_lists_' . $form_state['flo_operation']]['operation'] = array( - '#type' => 'hidden', - '#value' => $operation, - ); - $form['flag_lists_' . $form_state['flo_operation']]['go'] = array( - '#type' => 'submit', - '#value' => t('Go'), - '#attributes' => array( - 'class' => array('flag-lists-ops-go'), - ), - ); - unset($form['actions']['submit']); - - // Generate a status message for AJAX submission. - $form['flag_lists_' . $form_state['flo_operation']]['status_message'] = array('#markup' => ''); - $form['flag_lists_' . $form_state['flo_operation']]['#prefix'] = '
'; - $form['flag_lists_' . $form_state['flo_operation']]['#suffix'] = (!empty($hidden_deleted_values)) ? $hidden_deleted_values : '' . '
'; - - return $form; -} - -function flag_lists_ops_form_ajax_callback($form, $form_state) { - // The form has already been submitted and updated. We can return the replaced - // item as it is. - if (!flag_lists_ops_form_validate($form, $form_state)) { - $message = flag_lists_ops_form_submit($form, $form_state); - } - - $form['flag_lists_' . $form_state['flo_operation']]['status_message']['#markup'] = '
' . $message . '
'; - if ($form_state['flo_operation'] == 'flag') $form['flag_lists_' . $form_state['flo_operation']]['list']['#value'] = '0'; - $form['flag_lists_' . $form_state['flo_operation']]['status_message']['#attributes']['class'][] = 'alert-success'; - - return $form['flag_lists_' . $form_state['flo_operation']]; -} - -function flag_lists_ops_form_validate(&$form, &$form_state) { - global $user; - - $error_count = 0; - - // Check to see if an items are selected, if not fail right away. - if (!isset($_REQUEST['flag_lists_ops']) || empty($_REQUEST['flag_lists_ops'])) { - form_set_error('', t('No content selected.')); - $error_count++; - return $error_count; - } - - switch ($form_state['values']['flag_lists_' . $form_state['flo_operation']]['operation']) { - case 'unflag': - $ops = $_REQUEST['flag_lists_ops']; - foreach ($ops as $key => $op) { - $ops[$key] = explode('-', $op); - if (empty($ops[$key][1]) || !($flag = flag_lists_get_flag($ops[$key][1]))) { - form_set_error('flag_lists][remove', t('Invalid options list selected to remove from.')); - $error_count++; - } - else if ($flag->uid != $user->uid) { - form_set_error('flag_lists][remove', t('You are only allowed to remove content from your own lists.')); - $error_count++; - } - } - break; - default: - if (empty($form_state['values']['flag_lists_' . $form_state['flo_operation']]['list'])) { - form_set_error('flag_lists][list', t('No list selected. Please select a list to add to.')); - $error_count++; - } - else if (!($flag = flag_lists_get_flag($form_state['values']['flag_lists_' . $form_state['flo_operation']]['list']))) { - form_set_error('flag_lists][list', t('Invalid list selected. Please select a list to add to.')); - $error_count++; - } - else if ($flag->uid != $user->uid) { - form_set_error('flag_lists][list', t('Invalid list selected. Please select a list to add to.')); - $error_count++; - } - break; - } - - return $error_count; -} - -function flag_lists_ops_form_submit(&$form, &$form_state) { - // Get the $ops from the originating form. - $ops = $_REQUEST['flag_lists_ops']; - $success_count = 0; - - // Get the operation, or set it - switch ($form_state['values']['flag_lists_' . $form_state['flo_operation']]['operation']) { - case 'unflag': - $operation = 'unflag'; - $message = 'removed from'; - - foreach ($ops as $op) { - // Process the ID into 2 parts - list($nid, $fid) = explode('-', $op); - if (empty($nid) || empty($fid)) return; - - if (($flag = flag_lists_get_flag($fid)) && ($node = node_load($nid))) { - if (flag_lists_do_flag($flag, $operation, $nid)) { - $success_count++; - } - } - } - break; - default: - $operation = 'flag'; - $message = 'added to'; - - if ($flag = flag_lists_get_flag($form_state['values']['flag_lists_' . $form_state['flo_operation']]['list'])) { - foreach ($ops as $nid) { - if (flag_lists_do_flag($flag, $operation, $nid)) { - $success_count++; - } - } - } - break; - } - - $message = t('@count item(s) ' . $message . ' !title', array('@count' => $success_count, '!title' => $flag->title)); - if ($_GET['q'] != 'system/ajax') { - drupal_set_message($message); - } - else { - return $message; - } -} - -/** - * Gets the FLO field if it exists on the passed-in view. - * - * @return - * The field object if found. Otherwise, FALSE. - */ -function _flag_lists_ops_get_field($view) { - foreach ($view->field as $field_name => $field) { - if ($field instanceof flag_lists_handler_field_ops) { - // Add in the view object for convenience. - $field->view = $view; - return $field; - } - } - return FALSE; -} - -function flag_lists_template_validate($form, &$form_state) { - $types = array_filter($form_state['values']['types']); - $errors = array(); - foreach ($types as $type) { - $result = db_select('flag_lists_types', 'f') - ->fields('f') - ->condition('type', $type) - ->condition('name', $form_state['values']['name'], '<>') - ->execute(); - foreach ($result as $errors) { - $content_types[] = $errors->type; - $templates[] = $errors->name; - } - } - if (isset($content_types) && count($content_types)) { - $content_types = implode(', ', $content_types); - $templates = implode(', ', array_unique($templates)); - form_set_error('types', t('The flaggable content type(s) "@type" is(are) already assigned to the template(s) "@template." A content type may be assigned to only one template. To reassign a content type you must first remove its other assignment.', array('@type' => $content_types, '@template' => $templates))); - } -} - -function flag_lists_template_submit($form, &$form_state) { - $types = array_filter($form_state['values']['types']); - // Clean out the old types, then add the new. - $num_deleted = db_delete('flag_lists_types') - ->condition('name', $form_state['values']['name']) - ->execute(); - foreach ($types as $type) { - db_insert('flag_lists_types') - ->fields(array( - 'name' => $form_state['values']['name'], - 'type' => $type, - )) - ->execute(); - } -} -/** - * Helper function to build an array of all lists available to or owned by the - * current user and that are available on the current content type. - */ -function flag_lists_get_content_fids() { - global $user; - - // This is a node view. We only care about nodes for now. - if (arg(0) == 'node' && is_numeric(arg(1)) && is_null(arg(2))) { - $type = db_select('node', 'n') - ->fields('n', array('type')) - ->condition('nid', arg(1)) - ->execute() - ->fetchField(); - - // Get current user's flags for this node. - $query = db_select('flag_lists', 'fc') - ->fields('f', 'fid') - ->condition('fc.uid', $user->uid) - ->condition('fn.type', $type); - $query->leftJoin('flag_types', 'fn', 'fn.fid = fc.fid'); - $query->leftJoin('flags', 'f', 'fc.fid = f.fid'); - $fc_result = $query->execute(); - - foreach ($fc_result as $row) { - $fids[] = $row->fid; - } - } - - // This is the flag / unflag callback - elseif (arg(0) == 'flag' && (arg(1) == 'flag' || arg(1) == 'unflag')) { - // Get the flag for this request. - $fids[] = db_select('flags', 'f') - ->fields('f', array('fid')) - ->condition('name', arg(2)) - ->execute() - ->fetchField(); - } - - // Get the regular flags for this node. The flag module will narrow by role, - // etc. when flag_get_flags() is called. These flag ids are always returned. - $query = db_select('flags', 'f') - ->fields('f', array('fid')) - ->condition('fc.fid', NULL); - $query->leftJoin('flag_lists', 'fc', 'fc.fid = f.fid'); - $f_result = $query->execute(); - - foreach ($f_result as $obj) { - $fids[] = $obj->fid; - } - if (is_array($fids)) { - return array_unique($fids); - } - else { - return array(); - } -} - -/** - * Implements hook_block_info(); - */ -function flag_lists_block_info() { - return array( - 'flag_lists' => array( - 'info' => t('Lists'), - 'cache' => DRUPAL_NO_CACHE, - ), - 'flag_lists_list' => array( - 'info' => t('My lists'), - 'cache' => DRUPAL_NO_CACHE, - ), - ); -} - -/** - * Implements hook_block_configure(). - */ -function flag_lists_block_configure($delta = '') { - $form = array(); - - switch ($delta) { - case 'flag_lists': - $form = array( - 'create_lists' => array( - '#type' => 'checkbox', - '#title' => t('Show link to add new list'), - '#default_value' => variable_get('flag_lists_create_lists', 0), - '#description' => t('Checking this adds a link to the create new list form.'), - ), - 'ops' => array( - '#type' => 'checkbox', - '#title' => t('Show edit and delete links'), - '#default_value' => variable_get('flag_lists_ops', 0), - '#description' => t('Checking this appends edit and delete links to each list name for users with access.'), - ), - 'include_flags' => array( - '#type' => 'checkbox', - '#title' => t('Include flag module flags'), - '#default_value' => variable_get('flag_lists_include_flags', 0), - '#description' => t('Checking this will append flag module flags to the list of lists.'), - ), - ); - break; - } - return $form; -} - -/** - * Implements hook_block_save(). - */ -function flag_lists_block_save($delta = '', $edit = array()) { - switch ($delta) { - case 'flag_lists': - variable_set('flag_lists_create_lists', $edit['create_lists']); - variable_set('flag_lists_ops', $edit['ops']); - variable_set('flag_lists_include_flags', $edit['include_flags']); - break; - } -} - -/** - * Implements hook_block_view(). - */ -function flag_lists_block_view($delta = '') { - $block = array(); - - switch ($delta) { - case 'flag_lists': - if (user_access('create flag lists')) { - $block = array( - 'subject' => t('My lists'), - 'content' => theme('flag_lists_list', array('node' => NULL, 'create' => variable_get('flag_lists_create_lists', 0), 'ops' =>variable_get('flag_lists_ops', 0), 'use_flags' => variable_get('flag_lists_include_flags', 0))), - ); - } - break; - case 'flag_lists_list': - if (user_access('create flag lists')) { - global $user; - $account = user_load($user->uid); - - $block = array( - 'subject' => t('My lists'), - 'content' => flag_lists_user_page($account), - ); - } - break; - } - return (!empty($block['content'])) ? $block : array(); -} - -/** - * Implementation of hook_user_delete(). - */ -function flag_lists_user_delete($account) { - // Remove personal flags by this user. - $num_deleted = db_delete('flag_lists_flags') - ->condition('uid', $account->uid) - ->execute(); -} - -/** - * Build a flag's messages. - */ -function flag_lists_set_messages(&$flag) { - // Get the parent flag. These are cached by the flag module. - $pflag = flag_get_flag(NULL, $flag->pfid); - $title = $flag->title; - $lists_name = variable_get('flag_lists_name', t('list')); - $flag->flag_short = $pflag->flag_short; - $flag->flag_long = $pflag->flag_long; - $flag->flag_message = $pflag->flag_message; - $flag->unflag_short = $pflag->unflag_short; - $flag->unflag_long = $pflag->unflag_long; - $flag->unflag_message = $pflag->unflag_message; -} - -/** - * Implementation of hook_flag_access(). - * - * Make sure a user can only see his/her own personal flags. - */ -function flag_lists_flag_access($flag, $entity_id, $action, $account) { - if (!empty($flag->module) && $flag->module == 'flag_lists') { - switch ($action) { - case 'flag': - case 'unflag': - $fid = db_select('flag_lists_flags', 'f') - ->fields('f') - ->condition('f.uid', $account->uid) - ->execute() - ->fetchField(); - if (!empty($fid)) { - return array('flag_lists' => TRUE); - } - else { - return array('flag_lists' => FALSE); - } - } -} -} - -/** - * Implementation of hook_link(). - */ -// There may be a better way to keep flag lists out of the links, but this -// works for now. @todo Find a better way to keep flags lists out of links. -function flag_lists_link_alter(&$links, $node) { - if (!variable_get('flag_lists_use_links', 1)) { - foreach ($links as $name => $link) { - if (stristr($name, 'flag-fl_')) { - unset($links[$name]); - } - } - } -} - -/** - * Implementation of hook_flag_alter(). - */ -function flag_lists_flag_alter(&$flag) { -} - -/** - * Implementation of hook_flag_delete(). - * - * This is not in flag yet. - */ -function flag_lists_flag_delete($flag) { - // Template flag is being deleted. Clean up our tables. - // Collect the sub-flag fids so we can delete counts and content records. - $results = db_select('flag_lists_flags', 'f') - ->fields('f', array('fid', 'name')) - ->condition('pfid', $flag->fid) - ->execute(); - foreach ($results as $fid) { - db_delete('flag_lists_counts') - ->condition('fid', $flag->fid) - ->execute(); - db_delete('flag_lists_content') - ->condition('fid', $flag->fid) - ->execute(); - } - - // flag_lists_types uses the template flag name, not our own fid. - db_delete('flag_lists_types') - ->condition('name', $flag->name) - ->execute(); - - // Now delete the sub-flags. - $num_deleted = db_delete('flag_lists_flags') - ->condition('pfid', $flag->fid) - ->execute(); - if (!empty($num_deleted)) { - drupal_set_message(t('The template flag "@title" and all its sub-flags have been deleted.', array('@title' => $flag->title))); - } -} - -/** - * Implementation of hook_views_api(). - */ -function flag_lists_views_api() { - return array( - 'api' => 2.0, - 'path' => drupal_get_path('module', 'flag_lists') . '/includes', - ); -} - -/** - * Helper function to test if a flag is owned by the current user, or current - * user can administer flags. - */ -function flag_lists_is_owner($action, $name) { - global $user; - if (user_access('administer flags')) { - return TRUE; - } - - // If we don't have an fid, then we have the flag name. - if (is_numeric($name)) { - $query = db_select('flag_lists_flags', 'f')->condition('fid', $name); - $query->addField('f', 'name'); - $name = $query->execute()->fetchField(); - } - - if (!user_access($action . ' own flag lists')) { - return FALSE; - } - if (db_select('flag_lists_flags', 'f')->fields('f')->condition('f.name', $name)->condition('f.uid', $user->uid)->countQuery()->execute()->fetchField()) { - return TRUE; - } - return FALSE; -} - -/** - * Get a single user's lists, and merge in flag module flags - */ -function flag_lists_get_user_flags($content_type = NULL, $account = NULL, $use_flags = FALSE) { - $flags = array(); - $lists = array(); - if (!isset($account)) { - $account = $GLOBALS['user']; - } - // Get flag lists flags - $query = db_select('flag_lists_flags', 'fl') - ->fields('fl') - ->condition('fl.uid', $account->uid); - $query->leftJoin('flag', 'f', 'fl.pfid = f.fid'); - $query->leftJoin('flag_lists_types', 'ft', 'ft.name = f.name'); - $query->addField('ft', 'type'); - if ($content_type) { - $query->condition('ft.type', $content_type); - } - - $result = $query->execute(); - foreach ($result as $row) { - if (!isset($lists[$row->name])) { - $lists[$row->name] = flag_flag::factory_by_row($row); - $lists[$row->name]->module = 'flag_lists'; - } - else { - $lists[$row->name]->types[] = $row->type; - } - } - // Get regular flags. - if ($use_flags) { - $flags = flag_get_flags('node', $content_type, $account); - - // Strip out any list templates - foreach ($flags as $key => $flag) { - if (stristr($flag->name, 'fl_template') !== FALSE) { - unset($flags[$key]); - } - } - } - - $flags = array_merge($lists, $flags); - return $flags; -} - -/** - * Theme function to return edit, delete links. - * - * @param $flag - * The flag whose links are being built. - */ -function theme_flag_lists_ops($variables) { - $flag = $variables['flag']; - - $links = array( - 'flags_edit' => array('title' => t('edit'), 'href' => 'flags/lists/edit/' . $flag->name, 'query' => drupal_get_destination()), - 'flags_delete' => array('title' => t('delete'), 'href' => 'flags/lists/delete/' . $flag->name, 'query' => drupal_get_destination()), - ); - return theme('links', array('links' => $links, 'attributes' => array('class' => 'flag_lists_ops'))); -} - -/** - * Theme a list of lists - * - * @param $node - * The listable node - * @param boolean $create - * Show the create list form. - * @param boolean $ops - * Show the edit / delete links for lists - * @param boolean $use_flags - * Show flags from the flag module - * @return - */ - -// @todo Separate out the code from the theming better. -function theme_flag_lists_list($variables) { - $node = $variables['node']; - $create = $variables['create']; - $ops = $variables['ops']; - $use_flags = $variables['use_flags']; - - $items = array(); - - // Make sure we have a node. - if (is_object($node) && user_access('create flag lists')) { - $content_type = $node->type; - $entity_id = $node->nid; - } - // Or at least confirm we are on a node page and use has access. - elseif (arg(0) == 'node' && is_numeric(arg(1)) && user_access('create flag lists')) { - $entity_id = arg(1); - $query = db_select('node')->condition('nid', $entity_id); - $query->addField('node', 'type'); - $content_type = $query->execute()->fetchField(); - } - else { - return; - } - - // Do we have a list template for this node type, or are we s - if (!flag_lists_template_exists($content_type) && !$use_flags) { - return; - } - - global $user; - if ($flags = flag_lists_get_user_flags($content_type, $user, $use_flags)) { - // Build the list of lists for this node. - foreach ($flags as $flag) { - if ($flag->module == 'flag_lists') { - $action = _flag_lists_is_flagged($flag, $entity_id, $user->uid, 0) ? 'unflag' : 'flag'; - } - else { - $action = $flag->is_flagged($entity_id) ? 'unflag' : 'flag';; - } - - // Do we need the ops? - if ($ops && $flag->module == 'flag_lists') { - $ops_links = theme('flag_lists_ops', array('flag' => $flag)); - $link = $flag->theme($action, $entity_id) . $ops_links; - } - else { - $link = $flag->theme($action, $entity_id); - } - - // If it's a list, fix the link. - if ($flag->module == 'flag_lists') { - flag_lists_fix_link($link, $action); - } - $items[] = $link; - } - } - if ($create && flag_lists_template_exists($content_type)) { - $items[] = l(t('Make a new @name', array('@name' => variable_get('flag_lists_name', t('list')))), 'flag-lists/add/' . $content_type, array('query' => drupal_get_destination())); - } - - // Return if nothing to display. - if (empty($items) || !count($items)) { - return; - } - - drupal_add_css(drupal_get_path('module', 'flag_lists') . '/theme/flag_lists.css'); - return theme('item_list', array('items' => $items, 'type' => 'ul', 'attributes' => array('class' => 'flag-lists-links'))); -} - - -// Do we still need this, and/or do we need our own cache? -/** - * Clear the flag cache. - * - * This is a less severe cache clear than provided by flag. All flag lists - * users must be authorized, so we don't need to flush the page cache. For now, - * flag lists titles won't be in the menu, so no need to clear that. - */ -function _flag_lists_clear_cache() { - // We're not using _flag_clear_cache because we probably don't need the menu - // rebuild and don't need to clear the page cache. - if (module_exists('views')) { - views_invalidate_cache(); - } -} - -/** - * Update ALL flag lists with settings form values. - */ -function flag_lists_rebuild() { - $flags = flag_lists_get_flags(); - foreach ($flags as $flag) { - flag_lists_set_messages($flag); - $flag->link_type = 'toggle'; - flag_lists_save($flag); - } -} - -/** - * Build array of all flag lists. - * - * @return If limit and header arguments are provided, the paged flags, otherwise - * an array of all flags. - */ -function flag_lists_get_flags($limit = NULL, $header = NULL) { - $flags = array(); - if ($limit) { - $query = db_select('flag_lists_flags', 'fl') - ->fields('fl') - ->groupBy('fl.fid') - ->extend('PagerDefault') - ->limit($limit); - $query->leftJoin('flag_types', 'ft', 'ft.fid = fl.pfid'); - $query->addExpression('GROUP_CONCAT(ft.type)', 'types'); - $result = $query->execute(); - } - else { - $query = db_select('flag_lists_flags', 'fl') - ->fields('fl') - ->groupBy('fl.fid'); - $query->leftJoin('flag_types', 'ft', 'ft.fid = fl.pfid'); - $query->addExpression('GROUP_CONCAT(ft.type)', 'types'); - $result = $query->execute(); - } - foreach ($result as $row) { - $flags[$row->name] = flag_flag::factory_by_row($row); - $flags[$row->name]->types = explode(',', $row->types); - $flags[$row->name]->uid = $row->uid; - } - return $flags; -} - -/** - * Get a specific flag. - * - * Using this instead of flag_get_flag() for performance. - */ -function flag_lists_get_flag($fid) { - // If we don't have an fid, then we have the flag name. - if (!is_numeric($fid)) { - $query = db_select('flag_lists_flags') - ->condition('name', $fid); - $query->addField('flag_lists_flags', 'fid'); - $fid = $query->execute()->fetchField(); - } - - $query = db_select('flag_lists_flags', 'fl') - ->fields('fl') - ->condition('fl.fid', $fid); - $query->leftJoin('flag_types', 'ft', 'ft.fid = fl.pfid'); - $query->addField('ft', 'type'); - $result = $query->execute(); - - foreach ($result as $row) { - if (!isset($flag->name)) { - $flag = flag_flag::factory_by_row($row); - } - else { - $flag->types[] = $row->type; - } - } - return $flag; -} - -/** - * Get all flagged content in a flag. - * - * Using this instead of flag_get_flagged_content() because we need to make sure that we use flag_lists_get_flags() - * - * @param - * The flag name for which to retrieve flagged content. - */ -function flag_lists_get_flagged_content($fid, $uid) { - $return = array(); - $flag = flag_lists_get_flag($fid); - - $result = db_select('flag_lists_content', 'f') - ->fields('f') - ->condition('f.fid', $flag->fid) - ->condition('f.uid', $uid) - ->execute(); - - foreach ($result as $row) { - $return[] = $row; - } - return $return; -} - - -/** - * Implementation of hook_flag_link(). - * - * When Flag uses a link type provided by this module, it will call this - * implementation of hook_flag_link(). It returns a single link's attributes, - * using the same structure as hook_link(). Note that "title" is provided by - * the Flag configuration if not specified here. - * - * @param $flag - * The full flag object of for the flag link being generated. - * @param $action - * The action this link will perform. Either 'flag' or 'unflag'. - * @param $entity_id - * The ID of the node, comment, user, or other object being flagged. - * @return - * An array defining properties of the link. - */ -function flag_lists_flag_link($flag, $action, $entity_id) { - return array(); -} - -/** - * Implementation of hook_flag_link_types(). - */ -function flag_lists_flag_link_types() { - return array( - 'fl_template' => array( - 'title' => t('Flag Lists toggle'), - 'description' => t('If you are creating a Flag lists template flag, you must select this link type.'), - ), - ); -} - - -function flag_lists_flag_default_flags($name = 'fl_template') { - // return array( - // array( - // 'api_version' => 2, - // 'name' => $name, - // 'module' => 'flag_lists', - // 'content_type' => 'node', - // 'global' => 0, - // 'show_on_page' => 0, - // 'show_on_teaser' => 0, - // 'show_on_form' => 0, - // // The following UI labels aren't wrapped in t() because they are written - // // to the DB in English. They are passed to t() later, thus allowing for - // // multilingual sites. - // 'title' => 'Flag lists template', - // 'flag_short' => 'Add to your [flag_lists:title] [flag_lists:term]', - // 'flag_long' => 'Add this post to your [flag_lists:title] [flag_lists:term]', - // 'flag_message' => 'This post has been added to your [flag_lists:title] [flag_lists:term]', - // 'unflag_short' => 'Remove this from your [flag_lists:title] [flag_lists:term]', - // 'unflag_long' => 'Remove this post from your [flag_lists:title] [flag_lists:term]', - // 'unflag_message' => 'This post has been removed from your [flag_lists:title] [flag_lists:term]', - // 'types' => array(), - // 'link_type' => 'toggle', - // ), - // ); - -$flags = array(); -// Exported flag: "Flag lists template". -$flags['fl_template'] = array( - 'entity_type' => 'node', - 'title' => 'Flag lists template', - 'global' => 0, - 'types' => array(), - 'flag_short' => 'Add to your [flag_lists:title] [flag_lists:term]', - 'flag_long' => 'Add this post to your [flag_lists:title] [flag_lists:term]', - 'flag_message' => 'This post has been added to your [flag_lists:title] [flag_lists:term]', - 'unflag_short' => 'Remove this from your [flag_lists:title] [flag_lists:term]', - 'unflag_long' => 'Remove this post from your [flag_lists:title] [flag_lists:term]', - 'unflag_message' => 'This post has been removed from your [flag_lists:title] [flag_lists:term]', - 'unflag_denied_text' => '', - 'link_type' => 'toggle', - 'weight' => 0, - 'api_version' => 3, - 'module' => 'flag_lists', - 'show_on_page' => 0, - 'show_on_teaser' => 0, - 'show_on_form' => 0, - 'status' => FALSE, - 'import_roles' => array( - 'flag' => array(), - 'unflag' => array(), - ), -); -return $flags; - - -} - -/** - * Saves a flag to the database. It is a wrapper around update($flag) and insert($flag). - */ -function flag_lists_save(&$flag, $account = NULL) { - if (!isset($account)) { - $account = $GLOBALS['user']; - } - - if (isset($flag->fid)) { - flag_lists_update($flag); - $flag->is_new = FALSE; - module_invoke_all('flag_lists', $flag, $account); - } - else { - flag_lists_insert($flag); - $flag->is_new = TRUE; - module_invoke_all('flag_lists', $flag, $account); - } - // Clear the page cache for anonymous users. -// cache_clear_all('*', 'cache_page', TRUE); -} - -/** - * Saves an existing flag to the database. Better use save($flag). - */ -function flag_lists_update($flag) { - $num_updated = db_update('flag_lists_flags') - ->fields(array( - 'title' => $flag->title, - 'name' => $flag->name, - 'options' => $flag->get_serialized_options($flag), - )) - ->condition('fid', $flag->fid) - ->execute(); -} - -/** - * Saves a new flag to the database. Better use save($flag). - */ -function flag_lists_insert($flag) { - $flag->fid = db_insert('flag_lists_flags') - ->fields(array( - 'pfid' => $flag->pfid, - 'uid' => $flag->uid, - 'entity_type' => $flag->entity_type, - 'name' => $flag->name, - 'title' => $flag->title, - 'options' => $flag->get_serialized_options($flag), - )) - ->execute(); - $flag->name = 'flag_lists_' . $flag->uid . '_' . $flag->fid; - flag_lists_update($flag); -} - -/** - * Delete a flag_lists flag. - * - */ -function flag_lists_fl_delete($flag, $account = NULL) { - if (!isset($account)) { - $account = $GLOBALS['user']; - } - - db_delete('flag_lists_counts')->condition('fid', $flag->fid)->execute(); - db_delete('flag_lists_content')->condition('fid', $flag->fid)->execute(); - db_delete('flag_lists_flags')->condition('fid', $flag->fid)->execute(); - - $flag->is_deleted = TRUE; - module_invoke_all('flag_lists', $flag, $account); - _flag_lists_clear_cache(); - drupal_set_message(t('The @name @title has been deleted.', array('@name' => variable_get('flag_lists_name', t('list')), '@title' => $flag->title))); -} - - -/** - * Menu callback for (un)flagging a node. - * - * Used both for the regular callback as well as the JS version. We use this - * instead of the flag module's because our flags are not in the flags table. - */ -function flag_lists_page($action = NULL, $flag_name = NULL, $entity_id = NULL) { - global $user; - - // Shorten up the variables that affect the behavior of this page. - $js = isset($_REQUEST['js']); - $token = $_REQUEST['token']; - - // Specifically $_GET to avoid getting the $_COOKIE variable by the same key. - $has_js = isset($_GET['has_js']); - - // Check the flag token, then perform the flagging. - if (!flag_check_token($token, $entity_id)) { - $error = t('Bad token. You seem to have followed an invalid link.'); - } - elseif ($user->uid == 0 && !$has_js) { - $error = t('You must have JavaScript and cookies enabled in your browser to flag content.'); - } - else { - if (empty($flag_name) || !($flag = flag_lists_get_flag($flag_name))) { - // Flag does not exist. - $error = t('You are not allowed to flag, or unflag, this content.'); - } - - // Identify it as ours. - $flag->module = 'flag_lists'; - flag_lists_do_flag($flag, $action, $entity_id); - } - - // If an error was received, set a message and exit. - if (isset($error)) { - if ($js) { - drupal_add_http_header('Content-Type', 'text/javascript; charset=utf-8'); - print drupal_to_js(array( - 'status' => FALSE, - 'errorMessage' => $error, - )); - exit; - } - else { - drupal_set_message($error); - drupal_access_denied(); - return; - } - } - - // If successful, return data according to the request type. - if ($js) { - drupal_add_http_header('Content-Type', 'text/javascript; charset=utf-8'); -// $flag = flag_lists_get_flag($flag_name); - // $flag->link_type = 'toggle'; - $sid = flag_get_sid($user->uid); - $new_action = _flag_lists_is_flagged($flag, $entity_id, $user->uid, $sid) ? 'unflag' : 'flag'; - $new_link = $flag->theme($new_action, $entity_id, array("after_flagging" => TRUE)); - flag_lists_fix_link($new_link, $new_action); - drupal_json_output(array( - 'status' => TRUE, - 'newLink' => $new_link, - // Further information for the benefit of custom JavaScript event handlers: - 'contentId' => $entity_id, - 'contentType' => $flag->content_type, - 'flagName' => $flag->name, - 'flagStatus' => $action, - )); - exit; - } - else { - $flag = flag_lists_get_flag($flag->fid); - drupal_set_message($flag->get_label($action . '_message', $entity_id)); - drupal_goto(); - } -} - -function flag_lists_fix_link(&$link, $action) { - // This is a hack to let us use our own flag/unflag callbacks without having - // to override $flag->theme and creating our own flag_link type. - $link = str_replace('/flag/' . $action . '/', '/flag-lists/' . $action . '/', $link); -} - - /** - * Flags, or unflags, an item. - * - * @param $action - * Either 'flag' or 'unflag'. - * @param $entity_id - * The ID of the item to flag or unflag. - * @param $account - * The user on whose behalf to flag. Leave empty for the current user. - * @param $skip_permission_check - * Flag the item even if the $account user doesn't have permission to do so. - * @return - * FALSE if some error occured (e.g., user has no permission, flag isn't - * applicable to the item, etc.), TRUE otherwise. - */ - function flag_lists_do_flag($flag, $action, $entity_id, $account = NULL, $skip_permission_check = FALSE) { - if (!isset($account)) { - $account = $GLOBALS['user']; - } - if (!$account) { - return FALSE; - } - if (!$skip_permission_check) { - if (!$flag->access($entity_id, $action, $account)) { - // User has no permission to flag/unflag this object. - return FALSE; - } - } - else { - // We are skipping permission checks. However, at a minimum we must make - // sure the flag applies to this content type: - if (!$flag->applies_to_content_id($entity_id)) { - return FALSE; - } - } - - // Clear various caches; We don't want code running after us to report - // wrong counts or false flaggings. -// flag_get_counts(NULL, NULL, TRUE); -// flag_get_user_flags(NULL, NULL, NULL, NULL, TRUE); - - // Find out which user id to use. - $uid = $flag->global ? 0 : $account->uid; - - $sid = flag_get_sid($uid); - // Anonymous users must always have a session id. - if ($sid == 0 && $account->uid == 0) { - return FALSE; - } - - // Perform the flagging or unflagging of this flag. We invoke hook_flag here - // because we do our own flagging. - $flagged = _flag_lists_is_flagged($flag, $entity_id, $uid, $sid); - if ($action == 'unflag') { - if ($flagged) { - $fcid = _flag_lists_unflag($flag, $entity_id, $uid, $sid); - module_invoke_all('flag', 'unflag', $flag, $entity_id, $account, $fcid); - } - } - elseif ($action == 'flag') { - if (!$flagged) { - $fcid = _flag_lists_flag($flag, $entity_id, $uid, $sid); - module_invoke_all('flag', 'flag', $flag, $entity_id, $account, $fcid); - } - } - - return TRUE; - } - - - /** - * Returns TRUE if a certain user has flagged this content. - * - * - * This method is similar to is_flagged() except that it does direct SQL and - * doesn't do caching. Use it when you want to not affect the cache, or to - * bypass it. - * - */ - function _flag_lists_is_flagged($flag, $entity_id, $uid, $sid) { - $query = db_select('flag_lists_content') - ->condition('fid', $flag->fid) - ->condition('uid', $uid) - ->condition('sid', $sid) - ->condition('entity_id', $entity_id); - $query->addField('flag_lists_content', 'fid'); - return $query->execute()->fetchField(); - } - - /** - * A low-level method to flag content. - * - * You probably shouldn't call this raw private method: call the - * flag_lists_do_flag() function instead. - * - */ - function _flag_lists_flag($flag, $entity_id, $uid, $sid) { - $fcid = db_insert('flag_lists_content') - ->fields(array( - 'fid' => $flag->fid, - 'entity_type' => $flag->entity_type, - 'entity_id' => $entity_id, - 'uid' => $uid, - 'sid' => $sid, - 'timestamp' => REQUEST_TIME, - )) - ->execute(); - - _flag_lists_update_count($flag, $entity_id); - return $fcid; - } - - /** - * A low-level method to unflag content. - * - * You probably shouldn't call this raw private method: call the - * flag_lists_do_flag() function instead. - * - */ - function _flag_lists_unflag($flag, $entity_id, $uid, $sid) { - $query = db_select('flag_lists_content') - ->condition('fid', $flag->fid) - ->condition('entity_id', $entity_id) - ->condition('uid', $uid) - ->condition('sid', $sid); - $query->addField('flag_lists_content', 'fcid'); - $fcid = $query->execute()->fetchField(); - if ($fcid) { - db_delete('flag_lists_content') - ->condition('fcid', $fcid) - ->execute(); - _flag_lists_update_count($flag, $entity_id); - } - return $fcid; - } - - /** - * Updates the flag count for this content - */ - function _flag_lists_update_count($flag, $entity_id) { - $count = db_select('flag_lists_content', 'f') - ->fields('f') - ->condition('fid', $flag->fid) - ->condition('entity_id', $entity_id) - ->countQuery() - ->execute() - ->fetchField(); - - if (empty($count)) { - $num_deleted = db_delete('flag_lists_counts') - ->condition('fid', $flag->fid) - ->condition('entity_id', $entity_id) - ->execute(); - } - else { - $num_updated = db_update('flag_lists_counts') - ->fields(array( - 'count' => $count, - )) - ->condition('fid', $flag->fid) - ->condition('entity_id', $entity_id) - ->execute(); - if (empty($num_updated)) { - db_insert('flag_lists_counts') - ->fields(array( - 'fid' => $flag->fid, - 'entity_type' => $flag->entity_type, - 'entity_id' => $entity_id, - 'count' => $count, - )) - ->execute(); - } - } - } - -/** - * Checks for a list template for a content type. - */ -function flag_lists_template_exists($type) { - $query = db_select('flag_lists_types') - ->condition('type', $type); - $query->addField('flag_lists_types', 'type'); - $exists = $query->execute()->fetchField(); - if (!empty($exists)) { - return TRUE; - } - return FALSE; -} - -/** - * Checks for a list title by node type. - */ -function flag_lists_title_exists($title, $type) { - return db_query("SELECT COUNT(flf.fid) FROM {flag_lists_flags} flf LEFT JOIN {flag_types} ft ON flf.pfid=ft.fid WHERE flf.title=:title AND ft.type=:type AND flf.uid=:uid", array(':title' => $title, ':type' => $type, ':uid' => $GLOBALS['user']->uid))->fetchField(); -} - -/** - * Get a list of template flag names. - */ -function flag_lists_get_templates() { - $templates = array(); - $result = db_select('flag_lists_types', 'f') - ->fields('f', array( - 'name' - )) - ->distinct() - ->execute(); - foreach ($result as $obj) { - $templates[] = flag_get_flag($obj->name); - } - return $templates; -} - - -/** - * Implements hook_token_info(). - */ -function flag_lists_token_info() { - $type = array( - 'name' => t('Flag lists'), - 'description' => t('Tokens related to flag lists.'), - 'needs-data' => 'flag_lists', - ); - - $flag_lists['term'] = array( - 'name' => t("Term"), - 'description' => t("The terminology used to name the lists, such as list, wishlist, favorites, etc."), - ); - $flag_lists['title'] = array( - 'name' => t("Title"), - 'description' => t("The title of the list."), - ); - - return array( - 'types' => array('flag_lists' => $type), - 'tokens' => array('flag_lists' => $flag_lists), - ); -} - -/** - * Implements hook_tokens(). - */ -function flag_lists_tokens($type, $tokens, array $data = array(), array $options = array()) { - $replacements = array(); - - if ($type == 'flag_lists' && !empty($data['flag_lists'])) { - $flag_list = $data['flag_lists']; - foreach ($tokens as $name => $original) { - switch ($name) { - case 'title': - $replacements[$original] = $flag_list->title; - break; - case 'term': - $replacements[$original] = variable_get('flag_lists_name', t('list')); - break; - } - } - } - return $replacements; -} - -/** - * Preprocess link title and text for the flag.tpl.php - * - * This seems to be the only place to do this - */ -function flag_lists_preprocess_flag(&$variables) { - if (module_exists('token') && !empty($variables['flag']->module) && $variables['flag']->module == 'flag_lists') { - if (!empty($variables['link_text'])) { - $variables['link_text'] = token_replace($variables['link_text'], array('flag_lists' => $variables['flag'])); - } - if (!empty($variables['link_title'])) { - $variables['link_title'] = token_replace($variables['link_title'], array('flag_lists' => $variables['flag'])); - } - if (!empty($variables['message_text'])) { - $variables['message_text'] = token_replace($variables['message_text'], array('flag_lists' => $variables['flag'])); - } - } -} - -/** - * Implements hook_views_form_substitutions(). - */ -function flag_lists_views_form_substitutions() { - // Views check_plains the column label, so Flag lists needs to do the same - // in order for the replace operation to succeed. - $select_all_placeholder = check_plain(''); - $select_all = array( - '#type' => 'checkbox', - '#default_value' => FALSE, - '#attributes' => array('class' => array('flo-table-select-all')), - ); - return array( - $select_all_placeholder => drupal_render($select_all), - ); -} diff --git a/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists.views.inc b/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists.views.inc index 01d68668..b53aea82 100644 --- a/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists.views.inc +++ b/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists.views.inc @@ -59,7 +59,7 @@ function flag_lists_views_data_alter(&$data) { ); // We need fid and name form flags' data, and join. - $data['flags'] = array( + $data['flag'] = array( 'table' => array( 'group' => t('Flag'), 'join' => array( @@ -228,8 +228,7 @@ function flag_lists_views_data() { 'handler' => 'flag_lists_handler_field_list', ), 'filter' => array( - 'handler' => 'views_handler_filter_string', - 'allow empty' => TRUE, + 'handler' => 'flag_lists_handler_filter_list', ), 'argument' => array( 'handler' => 'views_handler_argument_string', @@ -261,7 +260,7 @@ function flag_lists_views_data() { 'join' => array( 'node' => array( 'left_field' => 'nid', - 'field' => 'content_id', + 'field' => 'entity_id', ), ), 'group' => t('Flag lists'), @@ -275,7 +274,7 @@ function flag_lists_views_data() { 'label' => t('List user'), ), ), - 'content_id' => array( + 'entity_id' => array( 'relationship' => array( 'title' => t('Node'), 'help' => t('The node that has been listed'), @@ -313,7 +312,7 @@ function flag_lists_views_data() { 'flag_lists_flags' => array( 'table' => 'flag_lists_types', 'type' => 'INNER', - 'left_table' => 'flags', + 'left_table' => 'flag', 'left_field' => 'name', 'field' => 'name', ), diff --git a/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists.views_default.inc b/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists.views_default.inc index 6a2a59f5..a00ba96b 100644 --- a/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists.views_default.inc +++ b/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists.views_default.inc @@ -168,7 +168,7 @@ function flag_lists_views_default_views() { 'exclude' => 0, 'link_to_list' => FALSE, 'id' => 'name_2', - 'table' => 'flags', + 'table' => 'flag', 'field' => 'name', 'relationship' => 'none', ), @@ -259,7 +259,7 @@ function flag_lists_views_default_views() { 'reduce' => 0, ), 'id' => 'name', - 'table' => 'flags', + 'table' => 'flag', 'field' => 'name', 'relationship' => 'none', ), @@ -843,7 +843,7 @@ function flag_lists_views_default_views() { 'type' => 'none', )); $handler = $view->new_display('page', 'Page', 'page_1'); - $handler->override_option('path', 'flags/lists/%'); + $handler->override_option('path', 'flag/lists/%'); $handler->override_option('menu', array( 'type' => 'none', 'title' => '', @@ -859,6 +859,6 @@ function flag_lists_views_default_views() { 'name' => 'navigation', )); - $views[$view->name] = $view; + $views[$view->name] = $view; return $views; -} \ No newline at end of file +} diff --git a/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_list.inc b/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_list.inc index e4edb057..ea056b90 100644 --- a/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_list.inc +++ b/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_list.inc @@ -45,7 +45,7 @@ class flag_lists_handler_field_list extends views_handler_field { function render_link($data, $values) { if (!empty($this->options['link_to_list']) && $data !== NULL && $data !== '') { $this->options['alter']['make_link'] = TRUE; - $this->options['alter']['path'] = "user/" . $values->{$this->aliases['uid']} . "/flags/lists/" . $values->{$this->aliases['fid']}; + $this->options['alter']['path'] = "user/" . $values->{$this->aliases['uid']} . "/flag/lists/" . $values->{$this->aliases['fid']}; } return $data; } diff --git a/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_list_delete.inc b/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_list_delete.inc index 3b4f7db3..deed0d76 100644 --- a/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_list_delete.inc +++ b/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_list_delete.inc @@ -45,6 +45,6 @@ class flag_lists_handler_field_list_delete extends views_handler_field { } $text = !empty($this->options['text']) ? $this->options['text'] : t('delete'); - return l($text, "flags/lists/delete/" . $fid, array('query' => drupal_get_destination())); + return l($text, "flag/lists/delete/" . $fid, array('query' => drupal_get_destination())); } -} \ No newline at end of file +} diff --git a/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_list_edit.inc b/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_list_edit.inc index 0f52d400..02b75aee 100644 --- a/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_list_edit.inc +++ b/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_list_edit.inc @@ -45,6 +45,6 @@ class flag_lists_handler_field_list_edit extends views_handler_field { } $text = !empty($this->options['text']) ? $this->options['text'] : t('edit'); - return l($text, "flags/lists/edit/" . $fid, array('query' => drupal_get_destination())); + return l($text, "flag/lists/edit/" . $fid, array('query' => drupal_get_destination())); } } diff --git a/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_ops.inc b/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_ops.inc index 56a8c86a..c3d3723e 100644 --- a/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_ops.inc +++ b/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_ops.inc @@ -69,6 +69,17 @@ class flag_lists_handler_field_ops extends views_handler_field { '#tree' => TRUE, ); + // Do we add or delete? + $operation = array(); + if ($this->options['flo']['operation'] == 'flag') { + $operation[0] = 'Add'; + $operation[1] = 'to'; + } + else { + $operation[0] = 'Remove'; + $operation[1] = 'from'; + }; + // At this point, the query has already been run, so we can access the results // in order to get the base key value (for example, nid for nodes). foreach ($this->view->result as $row_index => $row) { @@ -78,7 +89,13 @@ class flag_lists_handler_field_ops extends views_handler_field { $form[$this->options['id']][$row_index] = array( '#type' => 'radio', '#parents' => array($this->options['id']), - '#return_value' => $entity_id, + '#return_value' => $entity_id . (isset($row->flag_lists_flags_fid) ? ('-' . $row->flag_lists_flags_fid) : ''), + '#attributes' => array('title' => + array(t('@oper this item, @entity_id, @direction the @name', + array('@oper' => $operation[0], + '@entity_id' => $entity_id, + '@direction' => $operation[1], + '@name' => variable_get('flag_lists_name','list'))))), ); } else { @@ -86,9 +103,14 @@ class flag_lists_handler_field_ops extends views_handler_field { '#type' => 'checkbox', '#return_value' => $entity_id . (isset($row->flag_lists_flags_fid) ? ('-' . $row->flag_lists_flags_fid) : ''), '#default_value' => FALSE, - '#attributes' => array('class' => array('flo-select')), + '#attributes' => array('class' => array('flo-select'), + 'title' => array(t('@oper item @entity_id @direction the @name', + array('@oper' => $operation[0], + '@entity_id' => $entity_id, + '@direction' => $operation[1], + '@name' => variable_get('flag_lists_name', 'list'))))), ); } } } -} \ No newline at end of file +} diff --git a/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_template.inc b/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_template.inc index 6fa2605a..0c6203ed 100644 --- a/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_template.inc +++ b/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_template.inc @@ -14,7 +14,7 @@ class flag_lists_handler_field_template extends views_handler_field { */ function construct() { parent::construct(); - $this->additional_fields['name'] = array('table' => 'flags', 'field' => 'name'); + $this->additional_fields['name'] = array('table' => 'flag', 'field' => 'name'); } function option_definition() { @@ -44,7 +44,7 @@ class flag_lists_handler_field_template extends views_handler_field { function render_link($data, $values) { if (!empty($this->options['link_to_template']) && $data !== NULL && $data !== '') { $this->options['alter']['make_link'] = TRUE; - $this->options['alter']['path'] = "admin/build/flags/edit/" . $values->{$this->aliases['name']}; + $this->options['alter']['path'] = "admin/structure/flags/manage/" . $values->{$this->aliases['name']}; } return $data; } @@ -52,4 +52,4 @@ class flag_lists_handler_field_template extends views_handler_field { function render($values) { return $this->render_link(check_plain($values->{$this->field_alias}), $values); } -} \ No newline at end of file +} diff --git a/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_template_types.inc b/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_template_types.inc index e48b05d2..44814916 100644 --- a/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_template_types.inc +++ b/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_field_template_types.inc @@ -1,4 +1,5 @@ additional_fields['name'] = array('table' => 'flags', 'field' => 'name'); + $this->additional_fields['name'] = array('table' => 'flag', 'field' => 'name'); } + function query() { $this->add_additional_fields(); $this->field_alias = $this->aliases['name']; } - function pre_render($values) { + function pre_render(&$values) { $names = array(); $this->items = array(); @@ -23,7 +25,7 @@ class flag_lists_handler_field_template_types extends views_handler_field_preren if (count($names)) { $query = db_select('flag_lists_types', 'flt'); - $query->innerJoin('flags', 'f', 'flt.name = f.name'); + $query->innerJoin('flag', 'f', 'flt.name = f.name'); $result = $query->fields('flt', array('type', 'name')) ->condition('f.name', $names, 'IN') ->orderBy('flt.type') diff --git a/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_filter_list.inc b/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_filter_list.inc new file mode 100644 index 00000000..e62223d1 --- /dev/null +++ b/sites/all/modules/contrib/flag/flag_lists/includes/flag_lists_handler_filter_list.inc @@ -0,0 +1,20 @@ + 0) { - $(this).after('New list?
'); + $(this).after('New ' + Drupal.settings.flag_lists.listname + '?
'); var dialog = $('.new-list-form', $(this).parent()).dialog({ autoOpen: false, height: 300, width: 350, modal: true, buttons: { - "Create a new list": function() { + "Create": function() { var name = $('input.name', $(this)).val(); var type = $('select.type', $(this)).val(); + name = encodeURIComponent(name); - $.getJSON(Drupal.settings.flag_lists.json_path.replace('%', type)+'?name='+name, function(data) { + $.getJSON(Drupal.settings.flag_lists.json_path.replace('%', type)+ '?form_token=' + Drupal.settings.flag_lists.form_token +'&name='+name, function(data) { if (data.error) { alert(data.error); } else { select.append(''); $('input.name', $(this)).val(''); + location.reload(true); dialog.dialog('close'); } }); @@ -70,9 +72,12 @@ // Put entries into the optgroup for (j in Drupal.settings.flag_lists.types) { var type = Drupal.settings.flag_lists.types[j]; - $('.new-list-form form select.type').append(''); + $('.new-list-form form select.type').append(''); } } + if ( Drupal.settings.flag_lists.types.length <= 1) { + $('.new-list-form form select.type', context).hide(); + } }); } } diff --git a/sites/all/modules/contrib/flag/flag_lists/theme/flag_lists.css b/sites/all/modules/contrib/flag/flag_lists/theme/flag_lists.css index d049b07b..fcf3403d 100644 --- a/sites/all/modules/contrib/flag/flag_lists/theme/flag_lists.css +++ b/sites/all/modules/contrib/flag/flag_lists/theme/flag_lists.css @@ -1,4 +1,4 @@ -.block-flag_lists .flag-message { +.block-flag-lists .flag-message { position: relative; clear: both; top:0; @@ -6,4 +6,4 @@ line-height: normal; width: auto; font-size: .8em; -} \ No newline at end of file +}