Mercurial > hg > isophonics-drupal-site
comparison core/modules/comment/src/Form/CommentAdminOverview.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 1fec387a4317 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4c8ae668cc8c |
---|---|
1 <?php | |
2 | |
3 namespace Drupal\comment\Form; | |
4 | |
5 use Drupal\comment\CommentInterface; | |
6 use Drupal\Component\Utility\Unicode; | |
7 use Drupal\Core\Datetime\DateFormatterInterface; | |
8 use Drupal\Core\Entity\EntityTypeManagerInterface; | |
9 use Drupal\Core\Extension\ModuleHandlerInterface; | |
10 use Drupal\Core\Form\FormBase; | |
11 use Drupal\Core\Form\FormStateInterface; | |
12 use Drupal\user\PrivateTempStoreFactory; | |
13 use Symfony\Component\DependencyInjection\ContainerInterface; | |
14 | |
15 /** | |
16 * Provides the comments overview administration form. | |
17 */ | |
18 class CommentAdminOverview extends FormBase { | |
19 | |
20 /** | |
21 * The entity type manager. | |
22 * | |
23 * @var \Drupal\Core\Entity\EntityTypeManagerInterface | |
24 */ | |
25 protected $entityTypeManager; | |
26 | |
27 /** | |
28 * The comment storage. | |
29 * | |
30 * @var \Drupal\comment\CommentStorageInterface | |
31 */ | |
32 protected $commentStorage; | |
33 | |
34 /** | |
35 * The date formatter service. | |
36 * | |
37 * @var \Drupal\Core\Datetime\DateFormatterInterface | |
38 */ | |
39 protected $dateFormatter; | |
40 | |
41 /** | |
42 * The module handler. | |
43 * | |
44 * @var \Drupal\Core\Extension\ModuleHandlerInterface | |
45 */ | |
46 protected $moduleHandler; | |
47 | |
48 /** | |
49 * The tempstore factory. | |
50 * | |
51 * @var \Drupal\user\PrivateTempStoreFactory | |
52 */ | |
53 protected $tempStoreFactory; | |
54 | |
55 /** | |
56 * Creates a CommentAdminOverview form. | |
57 * | |
58 * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager | |
59 * The entity manager service. | |
60 * @param \Drupal\Core\Datetime\DateFormatterInterface $date_formatter | |
61 * The date formatter service. | |
62 * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler | |
63 * The module handler. | |
64 * @param \Drupal\user\PrivateTempStoreFactory $temp_store_factory | |
65 * The tempstore factory. | |
66 */ | |
67 public function __construct(EntityTypeManagerInterface $entity_type_manager, DateFormatterInterface $date_formatter, ModuleHandlerInterface $module_handler, PrivateTempStoreFactory $temp_store_factory) { | |
68 $this->entityTypeManager = $entity_type_manager; | |
69 $this->commentStorage = $entity_type_manager->getStorage('comment'); | |
70 $this->dateFormatter = $date_formatter; | |
71 $this->moduleHandler = $module_handler; | |
72 $this->tempStoreFactory = $temp_store_factory; | |
73 } | |
74 | |
75 /** | |
76 * {@inheritdoc} | |
77 */ | |
78 public static function create(ContainerInterface $container) { | |
79 return new static( | |
80 $container->get('entity_type.manager'), | |
81 $container->get('date.formatter'), | |
82 $container->get('module_handler'), | |
83 $container->get('user.private_tempstore') | |
84 ); | |
85 } | |
86 | |
87 /** | |
88 * {@inheritdoc} | |
89 */ | |
90 public function getFormId() { | |
91 return 'comment_admin_overview'; | |
92 } | |
93 | |
94 /** | |
95 * Form constructor for the comment overview administration form. | |
96 * | |
97 * @param array $form | |
98 * An associative array containing the structure of the form. | |
99 * @param \Drupal\Core\Form\FormStateInterface $form_state | |
100 * The current state of the form. | |
101 * @param string $type | |
102 * The type of the overview form ('approval' or 'new'). | |
103 * | |
104 * @return array | |
105 * The form structure. | |
106 */ | |
107 public function buildForm(array $form, FormStateInterface $form_state, $type = 'new') { | |
108 | |
109 // Build an 'Update options' form. | |
110 $form['options'] = [ | |
111 '#type' => 'details', | |
112 '#title' => $this->t('Update options'), | |
113 '#open' => TRUE, | |
114 '#attributes' => ['class' => ['container-inline']], | |
115 ]; | |
116 | |
117 if ($type == 'approval') { | |
118 $options['publish'] = $this->t('Publish the selected comments'); | |
119 } | |
120 else { | |
121 $options['unpublish'] = $this->t('Unpublish the selected comments'); | |
122 } | |
123 $options['delete'] = $this->t('Delete the selected comments'); | |
124 | |
125 $form['options']['operation'] = [ | |
126 '#type' => 'select', | |
127 '#title' => $this->t('Action'), | |
128 '#title_display' => 'invisible', | |
129 '#options' => $options, | |
130 '#default_value' => 'publish', | |
131 ]; | |
132 $form['options']['submit'] = [ | |
133 '#type' => 'submit', | |
134 '#value' => $this->t('Update'), | |
135 ]; | |
136 | |
137 // Load the comments that need to be displayed. | |
138 $status = ($type == 'approval') ? CommentInterface::NOT_PUBLISHED : CommentInterface::PUBLISHED; | |
139 $header = [ | |
140 'subject' => [ | |
141 'data' => $this->t('Subject'), | |
142 'specifier' => 'subject', | |
143 ], | |
144 'author' => [ | |
145 'data' => $this->t('Author'), | |
146 'specifier' => 'name', | |
147 'class' => [RESPONSIVE_PRIORITY_MEDIUM], | |
148 ], | |
149 'posted_in' => [ | |
150 'data' => $this->t('Posted in'), | |
151 'class' => [RESPONSIVE_PRIORITY_LOW], | |
152 ], | |
153 'changed' => [ | |
154 'data' => $this->t('Updated'), | |
155 'specifier' => 'changed', | |
156 'sort' => 'desc', | |
157 'class' => [RESPONSIVE_PRIORITY_LOW], | |
158 ], | |
159 'operations' => $this->t('Operations'), | |
160 ]; | |
161 $cids = $this->commentStorage->getQuery() | |
162 ->condition('status', $status) | |
163 ->tableSort($header) | |
164 ->pager(50) | |
165 ->execute(); | |
166 | |
167 /** @var $comments \Drupal\comment\CommentInterface[] */ | |
168 $comments = $this->commentStorage->loadMultiple($cids); | |
169 | |
170 // Build a table listing the appropriate comments. | |
171 $options = []; | |
172 $destination = $this->getDestinationArray(); | |
173 | |
174 $commented_entity_ids = []; | |
175 $commented_entities = []; | |
176 | |
177 foreach ($comments as $comment) { | |
178 $commented_entity_ids[$comment->getCommentedEntityTypeId()][] = $comment->getCommentedEntityId(); | |
179 } | |
180 | |
181 foreach ($commented_entity_ids as $entity_type => $ids) { | |
182 $commented_entities[$entity_type] = $this->entityTypeManager | |
183 ->getStorage($entity_type) | |
184 ->loadMultiple($ids); | |
185 } | |
186 | |
187 foreach ($comments as $comment) { | |
188 /** @var $commented_entity \Drupal\Core\Entity\EntityInterface */ | |
189 $commented_entity = $commented_entities[$comment->getCommentedEntityTypeId()][$comment->getCommentedEntityId()]; | |
190 $comment_permalink = $comment->permalink(); | |
191 if ($comment->hasField('comment_body') && ($body = $comment->get('comment_body')->value)) { | |
192 $attributes = $comment_permalink->getOption('attributes') ?: []; | |
193 $attributes += ['title' => Unicode::truncate($body, 128)]; | |
194 $comment_permalink->setOption('attributes', $attributes); | |
195 } | |
196 $options[$comment->id()] = [ | |
197 'title' => ['data' => ['#title' => $comment->getSubject() ?: $comment->id()]], | |
198 'subject' => [ | |
199 'data' => [ | |
200 '#type' => 'link', | |
201 '#title' => $comment->getSubject(), | |
202 '#url' => $comment_permalink, | |
203 ], | |
204 ], | |
205 'author' => [ | |
206 'data' => [ | |
207 '#theme' => 'username', | |
208 '#account' => $comment->getOwner(), | |
209 ], | |
210 ], | |
211 'posted_in' => [ | |
212 'data' => [ | |
213 '#type' => 'link', | |
214 '#title' => $commented_entity->label(), | |
215 '#access' => $commented_entity->access('view'), | |
216 '#url' => $commented_entity->urlInfo(), | |
217 ], | |
218 ], | |
219 'changed' => $this->dateFormatter->format($comment->getChangedTimeAcrossTranslations(), 'short'), | |
220 ]; | |
221 $comment_uri_options = $comment->urlInfo()->getOptions() + ['query' => $destination]; | |
222 $links = []; | |
223 $links['edit'] = [ | |
224 'title' => $this->t('Edit'), | |
225 'url' => $comment->urlInfo('edit-form', $comment_uri_options), | |
226 ]; | |
227 if ($this->moduleHandler->moduleExists('content_translation') && $this->moduleHandler->invoke('content_translation', 'translate_access', [$comment])->isAllowed()) { | |
228 $links['translate'] = [ | |
229 'title' => $this->t('Translate'), | |
230 'url' => $comment->urlInfo('drupal:content-translation-overview', $comment_uri_options), | |
231 ]; | |
232 } | |
233 $options[$comment->id()]['operations']['data'] = [ | |
234 '#type' => 'operations', | |
235 '#links' => $links, | |
236 ]; | |
237 } | |
238 | |
239 $form['comments'] = [ | |
240 '#type' => 'tableselect', | |
241 '#header' => $header, | |
242 '#options' => $options, | |
243 '#empty' => $this->t('No comments available.'), | |
244 ]; | |
245 | |
246 $form['pager'] = ['#type' => 'pager']; | |
247 | |
248 return $form; | |
249 } | |
250 | |
251 /** | |
252 * {@inheritdoc} | |
253 */ | |
254 public function validateForm(array &$form, FormStateInterface $form_state) { | |
255 $form_state->setValue('comments', array_diff($form_state->getValue('comments'), [0])); | |
256 // We can't execute any 'Update options' if no comments were selected. | |
257 if (count($form_state->getValue('comments')) == 0) { | |
258 $form_state->setErrorByName('', $this->t('Select one or more comments to perform the update on.')); | |
259 } | |
260 } | |
261 | |
262 /** | |
263 * {@inheritdoc} | |
264 */ | |
265 public function submitForm(array &$form, FormStateInterface $form_state) { | |
266 $operation = $form_state->getValue('operation'); | |
267 $cids = $form_state->getValue('comments'); | |
268 /** @var \Drupal\comment\CommentInterface[] $comments */ | |
269 $comments = $this->commentStorage->loadMultiple($cids); | |
270 if ($operation != 'delete') { | |
271 foreach ($comments as $comment) { | |
272 if ($operation == 'unpublish') { | |
273 $comment->setUnpublished(); | |
274 } | |
275 elseif ($operation == 'publish') { | |
276 $comment->setPublished(); | |
277 } | |
278 $comment->save(); | |
279 } | |
280 drupal_set_message($this->t('The update has been performed.')); | |
281 $form_state->setRedirect('comment.admin'); | |
282 } | |
283 else { | |
284 $info = []; | |
285 /** @var \Drupal\comment\CommentInterface $comment */ | |
286 foreach ($comments as $comment) { | |
287 $langcode = $comment->language()->getId(); | |
288 $info[$comment->id()][$langcode] = $langcode; | |
289 } | |
290 $this->tempStoreFactory | |
291 ->get('comment_multiple_delete_confirm') | |
292 ->set($this->currentUser()->id(), $info); | |
293 $form_state->setRedirect('comment.multiple_delete_confirm'); | |
294 } | |
295 } | |
296 | |
297 } |