Commit 64fdc09d authored by nicola85's avatar nicola85

Add 'MatchingUnitIndex'

parent 315b8d77
<?php
/**
* Merge non blocking events so that we display them as a continuous single event.
*
* @param $events array
*
* @return array
*/
function bat_api_merge_non_blocking_events($events) {
$prev_id = FALSE;
foreach ($events as $id => $event) {
if ($prev_id !== FALSE && isset($event['rendering']) && $event['rendering'] == 'background' && !$event['blocking']) {
$last_event = $events[$prev_id];
if (isset($last_event['rendering']) && $last_event['rendering'] == 'background' && !$last_event['blocking']) {
if ($last_event['resourceId'] == $event['resourceId'] &&
$last_event['title'] == $event['title'] &&
$last_event['color'] == $event['color']) {
$events[$prev_id]['end'] = $event['end'];
unset($events[$id]);
continue;
}
}
}
$prev_id = $id;
}
return $events;
}
<?php
/**
* @file
* Contains \Drupal\bat_api\Plugin\Deriver\MatchingUnitIndex.php
*/
namespace Drupal\bat_api\Plugin\Deriver;
use Drupal\Component\Plugin\Derivative\DeriverBase;
use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class MatchingUnitIndex extends DeriverBase implements ContainerDeriverInterface {
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, $base_plugin_id) {
return new static(
$container->get('router.route_provider'),
$container->get('entity.manager')
);
}
public function getDerivativeDefinitions($base_plugin_definition) {
$entity_type_id = 'calendar-matching-units';
$this->derivatives[$entity_type_id] = $base_plugin_definition;
$this->derivatives[$entity_type_id]['title'] = t('Calendar matching units');
$this->derivatives[$entity_type_id]['description'] = t('Index of units objects.');
$this->derivatives[$entity_type_id]['category'] = t('Calendar matching units');
$this->derivatives[$entity_type_id]['path'] = "$entity_type_id";
return $this->derivatives;
}
}
<?php
/**
* @file
* Contains \Drupal\bat_api\Plugin\ServiceDefinition\MatchingUnitIndex.php
*/
namespace Drupal\bat_api\Plugin\ServiceDefinition;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Entity\Query\QueryFactory;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\services\ServiceDefinitionBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\HttpFoundation\Request;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Access\AccessResult;
use Drupal\bat_unit\Entity\TypeBundle;
use Roomify\Bat\Calendar\Calendar;
use Roomify\Bat\Store\DrupalDBStore;
use Roomify\Bat\Unit\Unit;
/**
* @ServiceDefinition(
* id = "matching_unit_index",
* methods = {
* "GET"
* },
* translatable = true,
* deriver = "\Drupal\bat_api\Plugin\Deriver\MatchingUnitIndex"
* )
*/
class MatchingUnitIndex extends ServiceDefinitionBase implements ContainerFactoryPluginInterface {
/**
* The entity query factory.
*
* @var \Drupal\Core\Entity\Query\QueryFactoryInterface
*/
protected $queryFactory;
/**
* The entity type manager.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('entity.query'),
$container->get('entity_type.manager')
);
}
/**
* @param array $configuration
* @param string $plugin_id
* @param mixed $plugin_definition
* @param \Drupal\Core\Entity\Query\QueryFactory $query_factory
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, QueryFactory $query_factory, EntityTypeManagerInterface $entity_type_manager) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->queryFactory = $query_factory;
$this->entityTypeManager = $entity_type_manager;
}
/**
* {@inheritdoc}
*/
public function getCacheMaxAge() {
return 0;
}
/**
* {@inheritdoc}
*/
public function processRequest(Request $request, RouteMatchInterface $route_match, SerializerInterface $serializer) {
$unit_types = $request->query->get('unit_types');
$start_date = $request->query->get('start_date');
$end_date = $request->query->get('end_date');
$event_type = $request->query->get('event_type');
$event_states = $request->query->get('event_states');
if ($unit_types == 'all') {
$unit_types = array();
foreach (bat_unit_get_types() as $type => $info) {
$unit_types[] = $type;
}
}
else {
$unit_types = array_filter(explode(',', $unit_types));
}
$states = array_filter(explode(',', $event_states));
$events_json = array();
// Get the event type definition from Drupal
$bat_event_type = bat_event_type_load($event_type);
$target_entity_type = $bat_event_type->target_entity_type;
// For each type of event create a state store and an event store
$state_store = new DrupalDBStore($event_type, DrupalDBStore::BAT_STATE);
$start_date_object = new \DateTime($start_date);
$end_date_object = new \DateTime($end_date);
$today = new \DateTime();
if (!\Drupal::currentUser()->hasPermission('view past event information') && $today > $start_date_object) {
if ($today > $end_date_object) {
$return->events = array();
return $return;
}
$start_date_object = $today;
}
foreach ($unit_types as $unit_type) {
$entities = $this->getReferencedIds($unit_type);
$childrens = array();
$units = array();
foreach ($entities as $entity) {
$target_entity = entity_load($target_entity_type, $entity['id']);
$units[] = new Unit($entity['id'], $target_entity->getEventDefaultValue($event_type));
}
if (!empty($units)) {
$dates = array(
$end_date_object->getTimestamp() => $end_date_object,
);
$calendar = new Calendar($units, $state_store);
$event_ids = $calendar->getEvents($start_date_object, $end_date_object);
foreach ($event_ids as $unit_id => $unit_events) {
foreach ($unit_events as $key => $event) {
$event_start_date = $event->getStartDate();
$dates[$event_start_date->getTimestamp()] = $event_start_date;
}
}
ksort($dates);
$dates = array_values($dates);
for ($i = 0; $i < (count($dates) - 1); $i++) {
$sd = $dates[$i];
$ed = clone($dates[$i + 1]);
$ed->sub(new \DateInterval('PT1M'));
$response = $calendar->getMatchingUnits($sd, $ed, $states, array(), FALSE, FALSE);
if (count(array_keys($response->getIncluded()))) {
$color = 'green';
}
else {
$color = 'red';
}
$events_json[] = array(
'id' => $unit_type,
'resourceId' => $unit_type,
'start' => $sd->format('Y-m-d') . 'T' . $sd->format('H:i:00'),
'end' => $ed->format('Y-m-d') . 'T' . $ed->format('H:i:00'),
'color' => $color,
'rendering' => 'background',
'blocking' => 0,
'title' => '',
);
}
}
}
$events_json = bat_api_merge_non_blocking_events($events_json);
return array_values($events_json);
}
public function getReferencedIds($unit_type, $ids = array()) {
$query = db_select('unit', 'n')
->fields('n', array('id', 'unit_type_id', 'type', 'name'));
if (!empty($ids)) {
$query->condition('id', $ids, 'IN');
}
$query->condition('unit_type_id', $unit_type);
$bat_units = $query->execute()->fetchAll();
$units = array();
foreach ($bat_units as $unit) {
$units[] = array(
'id' => $unit->id,
'name' => $unit->name,
'type_id' => $unit_type,
);
}
return $units;
}
}
......@@ -82,11 +82,12 @@ class UnitIndex extends ServiceDefinitionBase implements ContainerFactoryPluginI
public function processRequest(Request $request, RouteMatchInterface $route_match, SerializerInterface $serializer) {
$event_type = $request->query->get('event_type');
$unit_types = $request->query->get('types');
$unit_ids = $request->query->get('ids');
$return_children = TRUE;
$create_event_access = FALSE;
if (bat_event_access(bat_event_create2(array('type' => $event_type)), 'create', \Drupal::currentUser()) == AccessResult::allowed()) {
if (bat_event_access(bat_event_create(array('type' => $event_type)), 'create', \Drupal::currentUser()) == AccessResult::allowed()) {
$create_event_access = TRUE;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment