ercore-8.x-1.20/modules/ercore_core/src/ErcoreCollaborationBuild.php
modules/ercore_core/src/ErcoreCollaborationBuild.php
<?php
namespace Drupal\ercore_core;
use Drupal\ercore\ErcoreStartDate;
/**
* Class ErcoreCollaborationBuild.
*
* @package Drupal\ercore_core
*/
class ErcoreCollaborationBuild {
/**
* Data types which form row headers.
*
* @return array
* Return array of data types.
*/
public static function dataTypes() {
return [
'academic' => 'Academic Research Institutions',
'undergrad' => 'Primarily Undergraduate Institutions',
'black' => 'Historically Black Colleges and Universities',
'hispanic' => 'Hispanic Serving Institutions',
'tribal' => 'Tribal Colleges and Universities',
'lab' => 'National Laboratories',
'industry' => 'Industry',
'none' => 'None/Other',
'totals' => 'Totals',
];
}
/**
* Builds data array for participant data block.
*
* @return array
* Returns array of objects.
*/
public static function buildDataArray() {
$dataArray = [];
foreach (self::dataTypes() as $key => $type) {
$dataArray[$key] = new ErcoreCollaboration();
$dataArray[$key]->setName($type);
}
return $dataArray;
}
/**
* Build Node ID array.
*
* @return array
* Array of User IDs.
*/
public static function getNodeIds() {
$query = \Drupal::entityQuery('node')
->condition('type', 'ercore_collaboration')
->condition('status', 1);
return $query->execute();
}
/**
* Build data object.
*
* @return array
* Array of Users.
*/
public static function getNodes() {
$ids = self::getNodeIds();
$nodes = [];
foreach ($ids as $id) {
$node = \Drupal::entityTypeManager()->getStorage('node')->load($id);
if (!$node->get('field_ercore_collaboration_start')->isEmpty()) {
$collaboration_start = $node->get('field_ercore_collaboration_start')->getValue();
if (!$node->get('field_ercore_collaboration_end')->isEmpty()) {
$end = $node->get('field_ercore_collaboration_end')->getValue();
$collaboration_end = ErcoreStartDate::dateArgumentToUnix($end[0]['value']);
}
else {
$collaboration_end = ErcoreStartDate::endUnix();
}
if (!$node->get('field_ercore_cn_collaborator')->isEmpty()) {
$nodes[$id] = [
'start' => ErcoreStartDate::dateArgumentToUnix($collaboration_start[0]['value']),
'end' => $collaboration_end,
'count' => 0,
];
$externals = $node->get('field_ercore_cn_collaborator')->getValue();
foreach ($externals as $external) {
$pid = $external['target_id'];
$type = '';
$category = '';
$title='';
$collaborator = \Drupal::entityTypeManager()
->getStorage('paragraph')
->load($pid);
if (!$collaborator->get('field_ercore_cr_inst')->isEmpty()) {
// field_ercore_cn_collaborator
$institution = $collaborator->get('field_ercore_cr_inst')->entity;
if (!empty($institution)) {
if (!$institution->get('field_ercore_inst_type')->isEmpty()) {
$type = $institution->get('field_ercore_inst_type')->value;
}
if (!$institution->get('field_ercore_inst_category')->isEmpty())
{
$category = $institution->get('field_ercore_inst_category')->value;
}
if (!$institution->get('title')->isEmpty())
{
$title = $institution->get('title')->value;
}
$nodes[$id]['data'][$category][$type][] = $pid;
$nodes[$id]['institution'][$category][$type][] = $institution->id();
}
$nodes[$id]['count'] += 1;
}
}
}
}
}
// print_r(var_dump($nodes));
return $nodes;
}
/**
* Filter data by date.
*
* @param bool $entire_range
* Use cumulative date or filtered.
*
* @return array
* Array of User IDs.
*/
public static function filteredNodes($entire_range = FALSE) {
$dates = ercore_get_filter_dates();
if ($entire_range === TRUE) {
$dates = ercore_get_project_filter_dates();
}
$filtered = [];
$nodes = self::getNodes();
foreach ($nodes as $nid => $node) {
if (($node['start'] <= $dates['end'] && $node['end'] >= $dates['start'])
|| ($node['start'] <= $dates['end'] && empty($node['end']))) {
$filtered[$nid] = $node;
}
}
return $filtered;
}
/**
* Counts external collaborators.
*
* @param bool $entire_range
* Use cumulative date or filtered.
*
* @return int
* Count of external collaborators.
*/
public static function countExternals($entire_range = FALSE) {
$count = 0;
$nodes = self::filteredNodes($entire_range);
foreach ($nodes as $node) {
$count += $node['count'];
}
return $count;
}
/**
* Gets all Participant data.
*/
public static function getData() {
$data = self::buildDataArray();
$nodes = self::filteredNodes();
$institution_array = [];
foreach ($nodes as $nid => $node) {
foreach ($node['data'] as $key => $external) {
$data[$key]->groupData($external);
$data['totals']->groupData($external);
}
foreach ($node['institution'] as $category => $cat_val){
foreach ($cat_val as $type => $nids){
foreach ($nids as $nid){
$institution_array[$category][$type][]=$nid;
}
}
}
}
foreach ($institution_array as $institution_array_key => $institution_array_val){
$data[$institution_array_key]->groupInst($institution_array_val);
$data['totals']->groupInstTot($institution_array_val);
}
return $data;
}
}
