Как я могу программно удалить пользователя?


Я новичок в разработке Drupal и нахожусь выше своего понимания в этом вопросе. Моя компания управляет сайтом на основе подписки, предлагающим корпорациям маркетинговые исследования. Компания оплачивает подписку и получает определенное количество пользователей. Лицо, назначенное в качестве основного пользователя, имеет возможность самостоятельно добавлять остальных пользователей. Теперь нам нужно добавить функцию, позволяющую им удалять пользователя, который больше не работает в их компании. При этом нам необходимо следующее, чтобы произойдет:

  1. Удалить запись из таблицы базы данных "пользователи"
  2. Измените автора на любом узле, созданном удаленным пользователем, на "Анонимный"
  3. Отправьте электронное письмо на наш внутренний адрес службы поддержки, сообщив им, что пользователь должен быть удален из других не подключенных систем

Предыдущий разработчик создал пользовательский модуль для управления учетными записями, который позволяет добавлять пользователей при нескольких различных обстоятельствах. Например, пользователь совершенно новичок в компания добавляет его, что означает, что они также должны быть добавлены в другие наши несвязанные системы, в отличие от предоставления учетной записи Drupal пользователю, который уже находится в других наших системах.
В настоящее время многое делается с помощью JavaScript с использованием Drupal.parseJson для обработки запроса на основе сегментов URL-адреса, по которому щелкнули. Это было сделано только для того, чтобы иметь возможность обновить страницу со списком пользователей без полного обновления. Лично мне все равно, работает ли эта новая функция таким образом, или если ему нужно попасть на сервер и обновить страницу. Мне просто нужно найти способ сделать все в приведенном выше списке одним щелчком мыши.

Я посмотрел API и нашел user_delete, но для этого требуется два параметра - $edit и $uid. uid - это не проблема, но все, что я могу найти о $edit, это то, что это "массив отправленных значений формы". Однако мы не используем форму; наши списки пользователей представляют собой статический текст, и все действия выполняются по щелчку href (на данный момент); поэтому ничего не отправляется. Есть ли какой-нибудь способ подделать значения $edit? Или есть другой способ сделать это? Я читаю о hook_user() и думаю, что я бы позвонил user_delete() куда-нибудь, чтобы выполнить фактическое удаление, а затем моя реализация hook_user() обработала бы все остальное с помощью параметра $op = delete. Но прежде чем я начну беспокоиться о том, как добиться того, чтобы происходили другие вещи, мне нужно некоторое руководство о том, как позвонить user_delete().

Стоит ли вообще использовать user_delete()? Было бы меньше проблем, если бы я просто написал свои собственные запросы, чтобы удалить запись пользователя и измените какие-либо записи контента на "Анонимный"?

Author: kiamlaluno, 2011-07-21

3 answers

Это не так сложно, для D6 это выглядело бы так:

  1. Удалить запись из таблицы пользователей базы данных Drupal;

    user_delete(array(), $uid);
    
  2. Изменить автора любого контента, созданного удаленным пользователем, на анонимного;

    Обрабатывается модулем узла.

  3. Отправьте электронное письмо на наш внутренний адрес службы поддержки, сообщив им, что пользователь должен быть удален из других не подключенных систем

    drupal_mail(...);
    

    См. hook_mail для подробности.

 6
Author: googletorp, 2011-07-21 20:45:29

Стоит ли вообще использовать user_delete()? Было бы меньше проблем, если бы я просто написал свои собственные запросы, чтобы удалить запись пользователя и изменить любые записи контента на "Анонимные"?

Чтобы удалить учетную запись пользователя и назначить все узлы, созданные пользователем, анонимному пользователю, вам просто нужно позвонить user_delete(array(), $account->uid) или user_delete(array(), $uid), в зависимости от того, есть ли у вас объект пользователя или идентификатор пользователя.

Что касается назначения узлов, созданных с удаленной учетной записью пользователя, user_delete() вызывает все реализации hook_user() передают "удалить" в качестве значения для $op. Модуль узла реализует крюк, используя следующий код:

function node_user($op, &$edit, &$user) {
  if ($op == 'delete') {
    db_query('UPDATE {node} SET uid = 0 WHERE uid = %d', $user->uid);
    db_query('UPDATE {node_revisions} SET uid = 0 WHERE uid = %d', $user->uid);
  }
}

Как вы видите, функция уже обновляет узлы, созданные удаляемой учетной записью пользователя, и любые изменения узлов, связанные с этой учетной записью пользователя.

Первый параметр, требуемый от user_delete(), обычно не используется в реализациях hook_user(), когда для параметра $op установлено значение "удалить". В большинстве случаев модули просто используйте $account->uid для идентификации пользовательских данных, которые они записали в свои собственные таблицы базы данных. Даже если предположить, что модули сохранили данные, используя другое значение для идентификации учетной записи пользователя, это значение содержится в объекте пользователя.

Что касается написания ваших собственных запросов на удаление учетной записи пользователя, я бы не советовал это делать, так как могут быть модули, которые необходимо информировать при удалении учетной записи пользователя, обычно для удаления данных, связанных с модулем для этой учетной записи. Переписывание кода, когда есть уже функция для этой конкретной цели может означать также обновление кода при переходе на новую версию Drupal. Код не будет таким общим, как код, уже используемый Drupal.

 4
Author: kiamlaluno, 2011-07-21 22:38:29

Некодирующий метод:

Необходимые модули: Триггеры (часть ядра)

Шаг 1: Включить модуль запуска

Шаг 2: Создайте действие отправить электронное письмо

  • перейти к администратору/настройкам/действиям
  • создайте действие "Отправить электронное письмо..."
  • заполните форму

create send email... action

Шаг 3: Создайте триггер

  • перейти к администратору/сборке/триггеру/пользователю
  • в разделе Триггер: После удаления пользователя выберите действие, которое вы только что создали

create trigger

И готово! По умолчанию, когда вы удаляете пользователя, все его сообщения становятся анонимными.

Пересмотрено:

Теперь у вас есть выбор, где вы хотите удалить пользователей прямо сейчас.

  • Вы можете массово удалять пользователей, перейдя к /admin/user/user
  • Перейдите на страницу профиля пользователя и удалите
  • Создайте свой собственный пользовательский модуль и функцию, которая вызывает user_delete(массив(), $uid)

Каждый из эти способы автоматически отправят электронное письмо каждому удаленному пользователю. Я считаю, что этот способ более гибкий, так как вы можете изменить текст письма и получателя без редактирования какого-либо кода.

 0
Author: iStryker, 2011-07-21 21:44:34