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 }
|