annotate core/modules/node/src/Plugin/Action/AssignOwnerNode.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 4c8ae668cc8c
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 namespace Drupal\node\Plugin\Action;
Chris@0 4
Chris@0 5 use Drupal\Core\Action\ConfigurableActionBase;
Chris@0 6 use Drupal\Core\Database\Connection;
Chris@0 7 use Drupal\Core\Form\FormStateInterface;
Chris@0 8 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
Chris@0 9 use Drupal\Core\Session\AccountInterface;
Chris@0 10 use Drupal\user\Entity\User;
Chris@0 11 use Symfony\Component\DependencyInjection\ContainerInterface;
Chris@0 12
Chris@0 13 /**
Chris@0 14 * Assigns ownership of a node to a user.
Chris@0 15 *
Chris@0 16 * @Action(
Chris@0 17 * id = "node_assign_owner_action",
Chris@0 18 * label = @Translation("Change the author of content"),
Chris@0 19 * type = "node"
Chris@0 20 * )
Chris@0 21 */
Chris@0 22 class AssignOwnerNode extends ConfigurableActionBase implements ContainerFactoryPluginInterface {
Chris@0 23
Chris@0 24 /**
Chris@0 25 * The database connection.
Chris@0 26 *
Chris@0 27 * @var \Drupal\Core\Database\Connection
Chris@0 28 */
Chris@0 29 protected $connection;
Chris@0 30
Chris@0 31 /**
Chris@0 32 * Constructs a new AssignOwnerNode action.
Chris@0 33 *
Chris@0 34 * @param array $configuration
Chris@0 35 * A configuration array containing information about the plugin instance.
Chris@0 36 * @param string $plugin_id
Chris@0 37 * The plugin ID for the plugin instance.
Chris@0 38 * @param mixed $plugin_definition
Chris@0 39 * The plugin implementation definition.
Chris@0 40 * @param \Drupal\Core\Database\Connection $connection
Chris@0 41 * The database connection.
Chris@0 42 */
Chris@0 43 public function __construct(array $configuration, $plugin_id, $plugin_definition, Connection $connection) {
Chris@0 44 parent::__construct($configuration, $plugin_id, $plugin_definition);
Chris@0 45
Chris@0 46 $this->connection = $connection;
Chris@0 47 }
Chris@0 48
Chris@0 49 /**
Chris@0 50 * {@inheritdoc}
Chris@0 51 */
Chris@0 52 public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
Chris@0 53 return new static($configuration, $plugin_id, $plugin_definition,
Chris@0 54 $container->get('database')
Chris@0 55 );
Chris@0 56 }
Chris@0 57
Chris@0 58 /**
Chris@0 59 * {@inheritdoc}
Chris@0 60 */
Chris@0 61 public function execute($entity = NULL) {
Chris@0 62 /** @var \Drupal\node\NodeInterface $entity */
Chris@0 63 $entity->setOwnerId($this->configuration['owner_uid'])->save();
Chris@0 64 }
Chris@0 65
Chris@0 66 /**
Chris@0 67 * {@inheritdoc}
Chris@0 68 */
Chris@0 69 public function defaultConfiguration() {
Chris@0 70 return [
Chris@0 71 'owner_uid' => '',
Chris@0 72 ];
Chris@0 73 }
Chris@0 74
Chris@0 75 /**
Chris@0 76 * {@inheritdoc}
Chris@0 77 */
Chris@0 78 public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
Chris@0 79 $description = t('The username of the user to which you would like to assign ownership.');
Chris@0 80 $count = $this->connection->query("SELECT COUNT(*) FROM {users}")->fetchField();
Chris@0 81
Chris@0 82 // Use dropdown for fewer than 200 users; textbox for more than that.
Chris@0 83 if (intval($count) < 200) {
Chris@0 84 $options = [];
Chris@0 85 $result = $this->connection->query("SELECT uid, name FROM {users_field_data} WHERE uid > 0 AND default_langcode = 1 ORDER BY name");
Chris@0 86 foreach ($result as $data) {
Chris@0 87 $options[$data->uid] = $data->name;
Chris@0 88 }
Chris@0 89 $form['owner_uid'] = [
Chris@0 90 '#type' => 'select',
Chris@0 91 '#title' => t('Username'),
Chris@0 92 '#default_value' => $this->configuration['owner_uid'],
Chris@0 93 '#options' => $options,
Chris@0 94 '#description' => $description,
Chris@0 95 ];
Chris@0 96 }
Chris@0 97 else {
Chris@0 98 $form['owner_uid'] = [
Chris@0 99 '#type' => 'entity_autocomplete',
Chris@0 100 '#title' => t('Username'),
Chris@0 101 '#target_type' => 'user',
Chris@0 102 '#selection_setttings' => [
Chris@0 103 'include_anonymous' => FALSE,
Chris@0 104 ],
Chris@0 105 '#default_value' => User::load($this->configuration['owner_uid']),
Chris@0 106 // Validation is done in static::validateConfigurationForm().
Chris@0 107 '#validate_reference' => FALSE,
Chris@0 108 '#size' => '6',
Chris@0 109 '#maxlength' => '60',
Chris@0 110 '#description' => $description,
Chris@0 111 ];
Chris@0 112 }
Chris@0 113 return $form;
Chris@0 114 }
Chris@0 115
Chris@0 116 /**
Chris@0 117 * {@inheritdoc}
Chris@0 118 */
Chris@0 119 public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
Chris@0 120 $exists = (bool) $this->connection->queryRange('SELECT 1 FROM {users_field_data} WHERE uid = :uid AND default_langcode = 1', 0, 1, [':uid' => $form_state->getValue('owner_uid')])->fetchField();
Chris@0 121 if (!$exists) {
Chris@0 122 $form_state->setErrorByName('owner_uid', t('Enter a valid username.'));
Chris@0 123 }
Chris@0 124 }
Chris@0 125
Chris@0 126 /**
Chris@0 127 * {@inheritdoc}
Chris@0 128 */
Chris@0 129 public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
Chris@0 130 $this->configuration['owner_uid'] = $form_state->getValue('owner_uid');
Chris@0 131 }
Chris@0 132
Chris@0 133 /**
Chris@0 134 * {@inheritdoc}
Chris@0 135 */
Chris@0 136 public function access($object, AccountInterface $account = NULL, $return_as_object = FALSE) {
Chris@0 137 /** @var \Drupal\node\NodeInterface $object */
Chris@0 138 $result = $object->access('update', $account, TRUE)
Chris@0 139 ->andIf($object->getOwner()->access('edit', $account, TRUE));
Chris@0 140
Chris@0 141 return $return_as_object ? $result : $result->isAllowed();
Chris@0 142 }
Chris@0 143
Chris@0 144 }