Commit 90be429e authored by Thomas Nilsson's avatar Thomas Nilsson
Browse files

Issue #3266427 by npcoder, sl27257: Call to a member function id() on null in...

Issue #3266427 by npcoder, sl27257: Call to a member function id() on null in line 24 of modules/contrib/flag_lists/src/Access/FlaggingCollectionAccessControlHandler.php
parent fa7daa3d
Loading
Loading
Loading
Loading
+49 −0
Original line number Diff line number Diff line
@@ -173,3 +173,52 @@ function flag_lists_update_8004() {
  $message = 'Updated the Flagging Collections Related flags to follow the new naming convention.';
  return $message;
}

/**
 * Remove orphaned Flag List Items due to removed users.
 */
function flag_lists_update_8005() {
  $flagListsService = \Drupal::service('flaglists');
  $database = \Drupal::database();

  // Delete all flag list items.
  $query = $database->select('flag_list_item_field_data', 'flifd');
  $query->leftJoin('users', 'u', 'flifd.user_id = u.uid');
  $query
    ->fields('flifd', ['id'])
    ->isNull('u.uid');
  $result = $query->execute();
  foreach ($result as $record) {
    $id = $record->id;
    $flagListItem = $flagListsService->getFlagListItems([$id]);
    $flagListItem[$id]->delete();
  }

  $message = 'Removed orphaned Flag List Items.';
  return $message;
}

/**
 * Remove orphaned Flagging Collections due to removed users.
 */
function flag_lists_update_8006() {
  $flagListsService = \Drupal::service('flaglists');
  $database = \Drupal::database();

  // Remove all flagging collections.
  $query = $database->select('flagging_collection_field_data', 'fcfd');
  $query->leftJoin('users', 'u', 'fcfd.user_id = u.uid');
  $query
    ->fields('fcfd', ['id'])
    ->isNull('u.uid');
  $result = $query->execute();
  foreach ($result as $record) {
    $id = $record->id;
    $flaggingCollection = $flagListsService
      ->getFlaggingCollectionById($id);
    $flaggingCollection->delete();
  }

  $message = 'Removed orphaned Flagging Collections.';
  return $message;
}
+53 −0
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@ use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\user\UserInterface;
use Drupal\Core\Link;
use Drupal\Core\Url;
use Drupal\flag\FlagInterface;
@@ -328,3 +329,55 @@ function flag_lists_entity_extra_field_info_alter(&$info) {
    }
  }
}

/**
  * Implements hook_user_cancel().
  */
function flag_lists_user_cancel($edit, UserInterface $account, $method) {
  // Note, no revision handling implemented.
  $flagListsService = \Drupal::service('flaglists');
  switch ($method) {
    case 'user_cancel_block_unpublish':
      // There is no such thing as unpublish for Flagging Collections.
      break;

    case 'user_cancel_reassign':
      // Anonymize all of the Flagging Collection and
      // Flag List Items for this old account.
      $flaggingCollections =
        $flagListsService->getUsersFlaggingCollections($account);
      // Reassign all Flagging Collections to uid 0.
      foreach ($flaggingCollections as $flaggingCollection) {
        $flag_list_items = $flagListsService->getFlagListItemIds(
          $flaggingCollection->getRelatedFlag()->id());
        foreach ($flagListsService->getFlagListItems($flag_list_items)
          as $flag_list_item) {
          $flag_list_item->setOwnerId(0);
          $flag_list_item->save();
        };
        $flaggingCollection->setOwnerId(0);
        $flaggingCollection->save();
      }
      break;
  }
}

/**
  * Implements hook_ENTITY_TYPE_predelete() for user entities.
  */
function flag_lists_user_predelete($account) {
  // Note, no revision handling implemented.
  $flagListsService = \Drupal::service('flaglists');
  // Delete Flagging Collections (current revisions).
  $flaggingCollections =
    $flagListsService->getUsersFlaggingCollections($account);
  foreach ($flaggingCollections as $flaggingCollection) {
    $flag_list_items = $flagListsService->getFlagListItemIds(
      $flaggingCollection->getRelatedFlag()->id());
    foreach ($flagListsService->getFlagListItems($flag_list_items)
      as $flag_list_item) {
      $flag_list_item->delete();
    };
    $flaggingCollection->delete();
  }
}
+8 −2
Original line number Diff line number Diff line
@@ -82,11 +82,17 @@ class FlagListsService implements FlagListsServiceInterface {
   * @return Drupal\flag_lists\Entity\FlaggingCollection[]
   *   An array of current User's Flagging Collections.
   */
  public function getUsersFlaggingCollections() {
  public function getUsersFlaggingCollections(
    AccountInterface $account = NULL) {
    $query = $this->entityTypeManager
      ->getStorage('flagging_collection')
      ->getQuery();
    if ($account <> NULL) {
      $query->condition('user_id', $account->id());
    }
    else {
      $query->condition('user_id', $this->currentUser->id());
    }

    $ids = $query->execute();
    $flags = $this->getFlaggingCollectionByIds($ids);
+1 −1
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@ class FlaggingCollectionStorage extends SqlContentEntityStorage implements Flagg
   */
  public function userRevisionIds(AccountInterface $account) {
    return $this->database->query(
      'SELECT vid FROM {flagging_collection_field_revision} WHERE uid = :uid ORDER BY vid',
      'SELECT vid FROM {flagging_collection_field_revision} WHERE user_id = :uid ORDER BY vid',
      [':uid' => $account->id()]
    )->fetchCol();
  }