Newer
Older
Eric Bremner
committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
namespace Drupal\uw_cfg_common\Service;
use Drupal\node\Entity\Node;
/**
* Class UwNodeContent.
*
* Gets the content out of a node.
*
* @package Drupal\uw_cfg_common\Service
*/
class UwNodeContent {
/**
* The UW node data service.
*
* @var UwNodeData
*/
private $uwNodeData;
/**
* Default constructor.
*
* @param UwNodeData $uwNodeData
* The UW node data service.
*/
public function __construct(UwNodeData $uwNodeData) {
$this->uwNodeData = $uwNodeData;
}
/**
* Gets the content of a node.
*
* @param \Drupal\node\Entity\Node $node
* The node.
* @param string $view_mode
* The view mode.
* @param string $content
* The content to get (either layout builder or summary).
Eric Bremner
committed
*
* @return array
* Array of content to get from the node.
*/
public function getNodeContent(Node $node, string $view_mode, string $content): array {
Eric Bremner
committed
// Get the flags for the node.
$node_flags = $this->getNodeFlags($node, $view_mode, $content);
Eric Bremner
committed
Eric Bremner
committed
// Setup the node data array, based on flags.
Eric Bremner
committed
switch ($node->getType()) {
case 'uw_ct_blog':
Eric Bremner
committed
$content_data = $this->getBlogContent($node_flags);
Eric Bremner
committed
break;
case 'uw_ct_event':
$content_data = $this->getEventContent($node_flags);
break;
case 'uw_ct_news_item':
Eric Bremner
committed
$content_data = $this->getNewsContent($node_flags);
Eric Bremner
committed
break;
case 'uw_ct_web_page':
Eric Bremner
committed
$content_data = $this->getWebPageContent($node_flags);
Eric Bremner
committed
break;
case 'uw_ct_catalog_item':
Eric Bremner
committed
$content_data = $this->getCatalogItemContent($node_flags);
Eric Bremner
committed
break;
case 'uw_ct_contact':
Eric Bremner
committed
$content_data = $this->getContactContent($node_flags);
Eric Bremner
committed
break;
case 'uw_ct_profile':
Eric Bremner
committed
$content_data = $this->getProfileContent($node_flags);
Eric Bremner
committed
break;
}
return $this->uwNodeData->getNodeData($node, $view_mode, $content_data);
}
/**
* Get the content types that have hero images.
*
* @return string[]
* Array of content types that can have hero images.
*/
public function getHeroImageContentTypes() {
return [
'uw_ct_blog' => 'field_uw_hero_image',
'uw_ct_event' => 'field_uw_hero_image',
'uw_ct_news_item' => 'field_uw_hero_image',
];
}
Eric Bremner
committed
/**
* Get the flags for the node.
*
* @param \Drupal\node\Entity\Node $node
* The node.
* @param string $view_mode
* The view mode.
* @param string $content
* The content to get (layout builder or summary).
*
* @return array
* Array of flags for the node.
*/
public function getNodeFlags(Node $node, string $view_mode, string $content): array {
// Get the content types that have hero images.
$hero_image = $this->getHeroImageContentTypes();
Eric Bremner
committed
// Flags for getting teaser content.
$node_flags['get_header'] = FALSE;
$node_flags['get_footer'] = FALSE;
$node_flags['get_image'] = FALSE;
$node_flags['get_content'] = FALSE;
$node_flags['get_title'] = TRUE;
$node_flags['get_hero'] = FALSE;
$node_flags['get_listing_image'] = FALSE;
Eric Bremner
committed
// Setup flags based on teaser content argument.
if ($content == 'all') {
$node_flags['get_header'] = TRUE;
$node_flags['get_footer'] = TRUE;
$node_flags['get_content'] = TRUE;
if ($view_mode == 'full') {
$node_flags['get_title'] = FALSE;
$node_flags['get_hero'] = TRUE;
Eric Bremner
committed
if (in_array($node->getType(), array_keys($hero_image))) {
Eric Bremner
committed
$node_flags['get_title'] = TRUE;
}
}
elseif ($view_mode == 'teaser') {
$node_flags['get_footer'] = FALSE;
$node_flags['get_listing_image'] = TRUE;
}
Eric Bremner
committed
}
else {
if ($content == 'header') {
$node_flags['get_header'] = TRUE;
$node_flags['get_image'] = TRUE;
}
if ($content == 'footer') {
$node_flags['get_footer'] = TRUE;
$node_flags['get_title'] = FALSE;
}
}
return $node_flags;
}
Eric Bremner
committed
/**
Eric Bremner
committed
* Common elements for content data.
Eric Bremner
committed
*
Eric Bremner
committed
* The flags for the node.
*
* @return array
Eric Bremner
committed
* Array of common elements for content data.
Eric Bremner
committed
*/
public function setupContentData(array $node_flags): array {
Eric Bremner
committed
Eric Bremner
committed
$content_data['url'] = [
'type' => 'url',
Eric Bremner
committed
];
$content_data['header'] = [
'has_children' => TRUE,
];
Eric Bremner
committed
if ($node_flags['get_title']) {
$content_data['header']['title'] = [
Eric Bremner
committed
'type' => 'title',
];
}
return $content_data;
}
/**
* Functiont to add to content data array.
*
* @param string $type
* The type of field.
* @param mixed $field_name
* The actual field name(s).
* @param string $label
* The label to be used with the field.
*
* @return string[]
* Array to add to the content data.
*/
public function addToContentData(string $type, $field_name, string $label = NULL): array {
Eric Bremner
committed
return [
Eric Bremner
committed
'type' => $type,
'field' => $field_name,
'label' => $label,
Eric Bremner
committed
];
}
Eric Bremner
committed
/**
Eric Bremner
committed
* Get the node content for blog content type.
Eric Bremner
committed
*
* @param array $node_flags
* The flags for the node.
*
* @return array
* Array of content to get from the node.
*/
Eric Bremner
committed
public function getBlogContent(array $node_flags): array {
Eric Bremner
committed
Eric Bremner
committed
// Get the content data.
$content_data = $this->setupContentData($node_flags);
Eric Bremner
committed
Eric Bremner
committed
// Setup the header content.
if ($node_flags['get_header']) {
$content_data['header']['date'] = $this->addToContentData('date', 'field_uw_blog_date');
$content_data['header']['author'] = $this->addToContentData('author', 'field_author');
Eric Bremner
committed
}
if ($node_flags['get_hero']) {
$content_data['hero_image'] = $this->addToContentData('sources', 'field_uw_hero_image');
}
Eric Bremner
committed
if ($node_flags['get_listing_image']) {
$content_data['listing_image'] = $this->addToContentData('sources', 'field_uw_blog_listing_page_image');
Eric Bremner
committed
}
// Setup the actual content.
if ($node_flags['get_content']) {
$content_data['content'] = $this->addToContentData('content', 'field_uw_blog_summary');
}
// Setup the footer.
if ($node_flags['get_footer']) {
$terms = [
'field_uw_blog_tags',
'field_uw_audience',
Eric Bremner
committed
];
Eric Bremner
committed
$content_data['tags'] = $this->addToContentData('terms', $terms);
Eric Bremner
committed
}
Eric Bremner
committed
return $content_data;
}
/**
* Get the node content for event content type.
*
* @param array $node_flags
* The flags for the node.
*
* @return array
* Array of content to get from the node.
*/
public function getEventContent(array $node_flags): array {
// Setup the content data array.
$content_data = $this->setupContentData($node_flags);
// Setup the header content.
Eric Bremner
committed
if ($node_flags['get_header']) {
$content_data['header']['date'] = $this->addToContentData('date', 'field_uw_event_date');
Eric Bremner
committed
}
if ($node_flags['get_hero']) {
$content_data['hero_image'] = $this->addToContentData('sources', 'field_uw_hero_image');
Eric Bremner
committed
if ($node_flags['get_listing_image']) {
$content_data['listing_image'] = $this->addToContentData('sources', 'field_uw_event_listing_page_img');
Eric Bremner
committed
}
Eric Bremner
committed
// Setup the actual content.
Eric Bremner
committed
if ($node_flags['get_content']) {
Eric Bremner
committed
$content_data['content'] = $this->addToContentData('content', 'field_uw_event_summary');
Eric Bremner
committed
}
Eric Bremner
committed
// Setup the footer content.
Eric Bremner
committed
if ($node_flags['get_footer']) {
$content_data['additional_info'] = [
'has_children' => TRUE,
Eric Bremner
committed
'host' => $this->addToContentData('link', 'field_uw_event_host', 'Host'),
'event_website' => $this->addToContentData('link', 'field_uw_event_website', 'Event website'),
'cost' => $this->addToContentData('plain_text', 'field_uw_event_cost', 'Cost'),
Eric Bremner
committed
];
$content_data['location_info'] = [
'has_children' => TRUE,
Eric Bremner
committed
'address' => $this->addToContentData('address', 'field_uw_event_location_address', 'Location address'),
'map' => $this->addToContentData('map', 'field_uw_event_location_coord', 'Location coordinates'),
Eric Bremner
committed
];
Eric Bremner
committed
$content_data['tags'] = $this->addToContentData(
'terms',
[
Eric Bremner
committed
'field_uw_event_tags',
'field_uw_audience',
'field_uw_event_type',
Eric Bremner
committed
]
);
Eric Bremner
committed
}
return $content_data;
}
Eric Bremner
committed
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
/**
* Get the node content for news content type.
*
* @param array $node_flags
* The flags for the node.
*
* @return array
* Array of content to get from the node.
*/
public function getNewsContent(array $node_flags): array {
// The list of tags for news.
$tag_list = [
'field_uw_news_tags',
'field_uw_audience',
];
return [
'title' => $node_flags['get_title'] ? TRUE : NULL,
'url' => TRUE,
'date' => $node_flags['get_header'] ? 'field_uw_news_date' : NULL,
'sources' => $node_flags['get_image'] ? 'field_uw_news_listing_page_image' : NULL,
'hero' => $node_flags['get_image'] ? 'field_uw_hero_image' : NULL,
'content' => $node_flags['get_content'] ? 'field_uw_news_summary' : NULL,
'tags' => $node_flags['get_footer'] ? $tag_list : NULL,
];
}
/**
* Get the node content for web page content type.
*
* @param array $node_flags
* The flags for the node.
*
* @return array
* Array of content to get from the node.
*/
public function getWebPageContent(array $node_flags): array {
return [
'title' => $node_flags['get_title'] ? TRUE : NULL,
'content' => $node_flags['get_content'] ? 'layout_builder__layout' : NULL,
];
}
/**
* Get the node content for catalog item content type.
*
* @param array $node_flags
* The flags for the node.
*
* @return array
* Array of content to get from the node.
*/
public function getCatalogItemContent(array $node_flags): array {
$tags = [
'Category' => 'field_uw_catalog_category',
'Faculty' => 'field_uw_catalog_faculty',
'Audience' => 'field_uw_audience',
];
return [
'title' => $node_flags['get_title'] ? TRUE : NULL,
'content' => $node_flags['get_content'] ? 'layout_builder__layout' : NULL,
'catalog_tags' => $node_flags['get_footer'] ? $tags : NULL,
];
}
/**
* Get the node content for catalog item content type.
*
* @param array $node_flags
* The flags for the node.
*
* @return array
* Array of content to get from the node.
*/
public function getContactContent(array $node_flags): array {
return [
'title' => $node_flags['get_title'] ? TRUE : NULL,
'position' => $node_flags['get_header'] ? 'field_uw_ct_contact_title' : NULL,
'affiliation' => $node_flags['get_header'] ? 'field_uw_ct_contact_affiliation' : NULL,
'image' => $node_flags['get_image'] ? 'field_uw_ct_contact_image' : NULL,
'content' => $node_flags['get_content'] ? 'layout_builder__layout' : NULL,
'email' => $node_flags['get_footer'] ? 'field_uw_ct_contact_email' : NULL,
'location' => $node_flags['get_footer'] ? 'field_uw_ct_contact_location' : NULL,
'phone' => $node_flags['get_footer'] ? 'field_uw_ct_contact_phone' : NULL,
'additional_info' => $node_flags['get_footer'] ? 'field_uw_ct_contact_info' : NULL,
'link_profile' => $node_flags['get_footer'] ? 'field_uw_ct_contact_link_profile' : NULL,
'personal_webpage' => $node_flags['get_footer'] ? 'field_uw_ct_contact_link_persona' : NULL,
'contact_for' => $node_flags['get_footer'] ? 'field_uw_ct_contact_contact_for' : NULL,
'groups' => $node_flags['get_footer'] ? 'field_uw_ct_contact_group' : NULL,
'url' => TRUE,
];
}
/**
* Get the node content for profile content type.
*
* @param array $node_flags
* The flags for the node.
*
* @return array
* Array of content to get from the node.
*/
public function getProfileContent(array $node_flags): array {
$tag_list = [
'field_uw_ct_profile_type',
];
return [
'title' => $node_flags['get_title'] ? TRUE : NULL,
'position' => $node_flags['get_header'] ? 'field_uw_ct_profile_title' : NULL,
'affiliation' => $node_flags['get_header'] ? 'field_uw_ct_profile_affiliation' : NULL,
'content' => $node_flags['get_content'] ? 'field_uw_profile_summary' : NULL,
'image' => $node_flags['get_header'] ? 'field_uw_ct_profile_image' : NULL,
'sources' => $node_flags['get_image'] ? 'field_uw_ct_profile_image' : NULL,
'tags' => $node_flags['get_footer'] ? $tag_list : NULL,
'link_profile' => $node_flags['get_footer'] ? 'field_uw_ct_profile_info_link' : NULL,
'personal_webpage' => $node_flags['get_footer'] ? 'field_uw_ct_profile_link_persona' : NULL,
'url' => TRUE,
];
}