Рейтинг:1

Ссылки на отключенных пользователей во время миграции

флаг in

У меня есть миграция, которая создает файлы. Для владельцев файлов я пытаюсь найти существующего пользователя по электронной почте, и если не нахожу, я создаю его на лету. Проблема в том, что те пользователи, которых я создаю, должны быть отключены (я не хочу, чтобы они входили на сайт). Но если я отключу их и попытаюсь использовать их как владельца файла, я получу сообщение:

«На этот объект (пользователь: 187) нельзя ссылаться».

Я могу отключить проверку для этого файла миграции, но он отключится полностью, а не только для этой проверки пользователя.

Я попытался использовать переключатель учетных записей (от подписчика событий, реагируя на события pre_import и post_import), чтобы переключиться на пользователя 1 до начала миграции и вернуться обратно, когда она закончится, но не помогло.

Есть идеи, как ссылаться на отключенных пользователей во время миграции, но с включенной проверкой?

Обновлять:

Провел некоторое исследование, и эта проверка выполняется в \Drupal\user\Plugin\EntityReferenceSelection\UserSelection::buildEntityQuery()

Есть код:

// Добавление проверки разрешений, к сожалению, недостаточно для пользователей: core
// требует, чтобы мы также знали о понятиях «заблокировано» и «активно».
if (!$this->currentUser->hasPermission('администрировать пользователей')) {
  $запрос->условие('статус', 1);
}

И если я закомментирую эту строку, она не будет проверена, отключен ли пользователь или нет, и проверка завершится успешно.

Странно то, что даже я использую Account Switcher для переключения на пользователя 1, а внутри моего плагина процесса пользователь действительно равен 1, когда этот код выполняется, пользователь больше не 1, а тот, который я создал и назначил файлу (отключен), поэтому Должно быть, импорт также использует переключатель учетных записей? Есть идеи, как это решить? Можно ли принудительно запустить миграцию от имени определенного пользователя (администратора)?

usmanjutt84 avatar
флаг in
Ваша миграция основана на вашем собственном модуле?
usmanjutt84 avatar
флаг in
Когда я перехожу с D7 на D9, он отлично работает программно с моей стороны. `$d9Node->setOwnerId($d9Uid);`
флаг in
Да. У меня есть настраиваемый плагин процесса, который копирует файл S3 ведро в ведро, а затем я регистрирую эти файлы в файловой системе drupal с помощью File::create(), где я передаю идентификатор пользователя в качестве одного из параметров. Эти файлы используются последующей миграцией для создания объектов медиа-образа путем ссылки на созданные файлы.
флаг in
Но я бы предпочел какое-то общее решение - большая часть миграции не будет использовать мои пользовательские плагины.
Alireza Tabatabaeian avatar
флаг cn
Вы хотите, чтобы все пользователи сайта были отключены? почему вы не позволяете им быть включенными, а они отключают их все после завершения миграции?
флаг in
@AlirezaTabatabaeian не все. Только те, которые я создаю. И я хочу иметь возможность ссылаться на них как на владельцев файлов/сущностей, пока для файла миграции включена проверка.
Alireza Tabatabaeian avatar
флаг cn
В этом случае я бы добавил логическое поле, давайте назовем его `field_should_disabled`, и в случае создания такого пользователя я бы дал им значение True, а затем я мог бы продолжить миграцию с включенным этим пользователем и отключить их после завершения миграции, даже поле может быть удалено после этого
флаг in
@AlirezaTabatabaeian извините, я вас не понимаю. Даже если я переключу пользователя на пользователя 1 во время миграции, он в какой-то момент переключится обратно на пользователя, которого я создал, который отключен, и ссылка не работает. Это проблема.
Alireza Tabatabaeian avatar
флаг cn
Я предлагаю вам оставить пользователей включенными, чтобы вы могли без проблем мигрировать, но вы не хотите, чтобы они были включены на вашем сайте, поэтому решением может быть последующее отключение этих пользователей и отслеживание того, какие пользователи должны быть отключено, а какие пользователи не должны, вы можете установить значение для их учетной записи (используя дополнительное поле), теперь мне стало понятнее? :)
флаг in
Да, теперь ясно. Возможно, это какой-то обходной путь. Мне пришлось бы позаботиться обо всех пользователях, используемых при миграции, а не только о тех, которых я создаю, поскольку существующих также можно отключить, но это выполнимо.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.