View source
<?php
namespace Drupal\opigno_group_manager\Entity;
use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Entity\ContentEntityBase;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\group\Entity\Group;
class OpignoGroupManagedContent extends ContentEntityBase {
public static function createWithValues($group_id, $group_content_type_id, $entity_id, $success_score_min = 0, $is_mandatory = 0, $coordinate_x = 0, $coordinate_y = 0, $in_skills_system = 0) {
$values = [
'group_id' => $group_id,
'group_content_type_id' => $group_content_type_id,
'entity_id' => $entity_id,
'success_score_min' => $success_score_min,
'is_mandatory' => $is_mandatory,
'coordinate_x' => $coordinate_x,
'coordinate_y' => $coordinate_y,
'in_skills_system' => $in_skills_system,
];
return parent::create($values);
}
public function getGroupId() {
return $this
->get('group_id')->target_id;
}
public function setGroupId($group_id) {
$this
->set('group_id', $group_id);
return $this;
}
public function getGroup() {
return $this
->get('group_id')->entity;
}
public function setGroup(Group $group) {
$this
->setGroupId($group
->id());
return $this;
}
public function getGroupContentTypeId() {
return $this
->get('group_content_type_id')->value;
}
public function setGroupContentTypeId($group_content_type_id) {
$this
->set('group_content_type_id', $group_content_type_id);
return $this;
}
public function getEntityId() {
return $this
->get('entity_id')->value;
}
public function setEntityId($entity_id) {
$this
->set('entity_id', $entity_id);
return $this;
}
public function getSuccessScoreMin() {
return $this
->get('success_score_min')->value;
}
public function setSuccessScoreMin($success_score_min) {
$this
->set('success_score_min', $success_score_min);
return $this;
}
public function isMandatory() {
return $this
->get('is_mandatory')->value;
}
public function isInSkillSystem() {
return $this
->get('in_skills_system')->value;
}
public function setSkillSystem($is_InSkillSystem) {
$this
->set('in_skills_system', $is_InSkillSystem)->value;
return $this;
}
public function setMandatory($is_mandatory) {
$this
->set('is_mandatory', $is_mandatory);
return $this;
}
public function getCoordinateX() {
return $this
->get('coordinate_x')->value;
}
public function setCoordinateX($coordinate_x) {
$this
->set('coordinate_x', $coordinate_x);
return $this;
}
public function getCoordinateY() {
return $this
->get('coordinate_y')->value;
}
public function setCoordinateY($coordinate_y) {
$this
->set('coordinate_y', $coordinate_y);
return $this;
}
public function getParentsLinks() {
return OpignoGroupManagedLink::loadByProperties([
'group_id' => $this
->getGroupId(),
'child_content_id' => $this
->id(),
]);
}
public function getChildrenLinks() {
return OpignoGroupManagedLink::loadByProperties([
'group_id' => $this
->getGroupId(),
'parent_content_id' => $this
->id(),
]);
}
public function hasChildLink() {
return !empty($this
->getChildrenLinks());
}
public function getGroupContentType() {
$manager = \Drupal::getContainer()
->get('opigno_group_manager.content_types.manager');
return $manager
->createInstance($this
->getGroupContentTypeId());
}
public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
$fields = parent::baseFieldDefinitions($entity_type);
$fields['group_id'] = BaseFieldDefinition::create('entity_reference')
->setLabel('Group')
->setCardinality(1)
->setSetting('target_type', 'group');
$fields['group_content_type_id'] = BaseFieldDefinition::create('string')
->setLabel('Group Content Type ID')
->setDescription('The content type ID (should be a plugin ID)');
$fields['entity_id'] = BaseFieldDefinition::create('integer')
->setLabel('Entity ID')
->setDescription('The entity ID');
$fields['success_score_min'] = BaseFieldDefinition::create('integer')
->setLabel('Success score minimum')
->setDescription('The minimum score to success this content')
->setDefaultValue(0);
$fields['is_mandatory'] = BaseFieldDefinition::create('boolean')
->setLabel('Is mandatory')
->setDescription('Indicate if this content is mandatory to succeed the Group')
->setDefaultValue(FALSE);
$fields['coordinate_x'] = BaseFieldDefinition::create('integer')
->setLabel('Coordinate X')
->setDescription('The X coordinate in this Group manager')
->setDefaultValue(0);
$fields['coordinate_y'] = BaseFieldDefinition::create('integer')
->setLabel('Coordinate Y')
->setDescription('The Y coordinate in this Group manager')
->setDefaultValue(0);
$fields['in_skills_system'] = BaseFieldDefinition::create('boolean')
->setLabel('In the sills system')
->setDescription('Indicate if this module in the skills system')
->setDefaultValue(FALSE);
return $fields;
}
public static function loadByProperties(array $properties) {
return \Drupal::entityTypeManager()
->getStorage('opigno_group_content')
->loadByProperties($properties);
}
public static function loadByGroupId($group_id) {
try {
return self::loadByProperties([
'group_id' => $group_id,
]);
} catch (InvalidPluginDefinitionException $e) {
return [];
}
}
public function delete() {
$as_child_links = OpignoGroupManagedLink::loadByProperties([
'group_id' => $this
->getGroupId(),
'child_content_id' => $this
->id(),
]);
$as_parent_links = OpignoGroupManagedLink::loadByProperties([
'group_id' => $this
->getGroupId(),
'parent_content_id' => $this
->id(),
]);
$all_links = array_merge($as_child_links, $as_parent_links);
foreach ($all_links as $link) {
$link
->delete();
}
parent::delete();
}
public static function getFirstStep($learning_path_id) {
$contents = self::loadByGroupId($learning_path_id);
foreach ($contents as $content) {
$parents = $content
->getParentsLinks();
if (empty($parents)) {
return $content;
}
}
return FALSE;
}
public function getNextStep($user_score, $attempts = NULL, $module = NULL, $guidedNavigation = NULL, $type_id = NULL) {
if ($type_id != 'ContentTypeCourse') {
$_SESSION['step_required_conditions_failed'] = FALSE;
}
$user_scores = [];
$db_connection = \Drupal::service('database');
$query = $db_connection
->select('opigno_group_link', 'ogl');
$query
->fields('ogl', [
'id',
'required_score',
]);
$query
->condition('parent_content_id', $this
->id());
$query
->condition('required_score', $user_score, '<=');
$query
->orderBy('required_score', 'DESC');
$query
->orderBy('id');
$query
->execute()
->fetchAllAssoc('id');
$query
->range(0, 1);
$result = $query
->execute()
->fetchObject();
$no_conditions_met = TRUE;
if ($result) {
$next_step_id = $result->id;
if ($result->required_score > 0) {
$no_conditions_met = FALSE;
}
}
$required_conditions = $db_connection
->select('opigno_group_link', 'ogl')
->fields('ogl', [
'id',
'required_score',
'required_activities',
])
->condition('parent_content_id', $this
->id())
->condition('group_id', $this
->getGroupId())
->execute()
->fetchAllAssoc('id');
$required_flag = FALSE;
$min_score = $this
->getSuccessScoreMin();
if ($this
->isMandatory()) {
if ($min_score === '0' || $user_score >= $min_score) {
$required_flag = TRUE;
}
}
else {
$required_flag = TRUE;
}
if ($required_flag && $required_conditions && $attempts) {
foreach ($attempts as $id => $module_attempts) {
if (!empty($module_attempts)) {
$last_attempts[$id] = $module_attempts[max(array_keys($module_attempts))];
$type_id = $module
->getEntityTypeId();
if ('opigno_module' === $type_id && in_array($module
->getKeepResultsOption(), [
'newest',
'all',
])) {
$last = reset($last_attempts);
if (!empty($last)) {
$user_scores[$id] = $last
->getScore();
}
}
else {
$course_modules = opigno_learning_path_get_course_modules($module
->id());
foreach ($course_modules as $step_id => $course_module) {
if (in_array($course_module
->getKeepResultsOption(), [
'newest',
'all',
])) {
if (!empty($last_attempts[$step_id])) {
$user_scores[$step_id] = $last_attempts[$step_id]
->getScore();
}
if (empty($user_scores[$step_id])) {
$user_scores[$step_id] = 0;
}
}
}
}
}
}
if (isset($guidedNavigation) && $guidedNavigation) {
foreach ($required_conditions as $required_condition) {
$required_activities = $required_condition->required_activities ? unserialize($required_condition->required_activities) : NULL;
$required_score = $required_condition->required_score;
$check_required_activities = TRUE;
if ($required_score && $user_score < $required_score) {
$no_conditions_met = TRUE;
$next_step_id = NULL;
$check_required_activities = FALSE;
}
if ($check_required_activities && $required_activities && $last_attempts) {
$successful_activities = $this
->getSuccessfulRequiredActvities($required_activities, $last_attempts);
if ($successful_activities) {
$success = TRUE;
foreach ($required_activities as $required_activity) {
if (!in_array($required_activity, $successful_activities)) {
$success = FALSE;
break;
}
}
if ($success && count($required_activities) == count($successful_activities)) {
$next_step_id = $required_condition->id;
$no_conditions_met = FALSE;
break;
}
}
}
}
}
if ($no_conditions_met) {
$no_required_free = TRUE;
foreach ($required_conditions as $required_condition) {
if ($required_condition->required_score == '0' && empty($required_condition->required_activities)) {
$next_step_id = $required_condition->id;
$no_required_free = FALSE;
break;
}
}
if ($no_required_free) {
$next_step_id = NULL;
$_SESSION['step_required_conditions_failed'] = TRUE;
}
}
}
if (!empty($next_step_id)) {
$next_step_link = OpignoGroupManagedLink::load($next_step_id);
if ($next_step_link) {
return $next_step_link
->getChildContent();
}
}
return FALSE;
}
public function getSuccessfulRequiredActvities($required_activities, $last_attempt_id) {
$successful_activities = [];
$module_id = $this
->getEntityId();
$type_id = $this
->getGroupContentTypeId();
if ($type_id == 'ContentTypeCourse') {
$modules_content = $this
->loadByGroupId($module_id);
$modules_ids = [];
foreach ($modules_content as $content) {
$modules_ids[] = $content
->getEntityId();
}
}
$required_activities_array = [];
foreach ($required_activities as $id) {
if (strpos($id, '-') !== FALSE) {
[
$activity_id,
$answer_id,
] = explode('-', $id);
}
else {
$activity_id = $id;
}
if (!array_key_exists($activity_id, $required_activities_array)) {
$required_activities_array[$activity_id] = [];
}
if (isset($answer_id)) {
$required_activities_array[$activity_id][$answer_id] = $answer_id;
}
}
foreach ($required_activities_array as $id => $required_activity) {
if (is_array($last_attempt_id)) {
foreach ($last_attempt_id as $last_id) {
if (!empty($last_id)) {
if (!empty($modules_ids)) {
foreach ($modules_ids as $module_id) {
$this
->getSuccessActivities($last_id
->id(), $id, $module_id, $successful_activities, $required_activity);
}
}
else {
$this
->getSuccessActivities($last_id
->id(), $id, $module_id, $successful_activities, $required_activity);
}
}
}
}
}
$success = TRUE;
foreach ($successful_activities as $successful_activitiy) {
if (!in_array($successful_activitiy, $required_activities)) {
$success = FALSE;
break;
}
}
if (!($success && count($required_activities) == count($successful_activities))) {
$successful_activities = [];
}
return $successful_activities;
}
protected function getSuccessActivities($last_attempt_id, $id, $module_id, &$successful_activities, $required_activity = NULL) {
$answer = \Drupal::entityTypeManager()
->getStorage('opigno_answer')
->loadByProperties([
'user_module_status' => $last_attempt_id,
'activity' => $id,
'module' => $module_id,
]);
if ($answer) {
$user_responses_array = [];
$answer = array_pop($answer);
$xapi_data = json_decode($answer->field_xapidata->value);
$wrong_activity = TRUE;
if (empty($required_activity)) {
if (!empty($xapi_data->statement->result) && $xapi_data->statement->result->completion && $xapi_data->statement->result->success) {
$wrong_activity = FALSE;
if (!in_array($id, $successful_activities)) {
$successful_activities[] = (string) $id;
}
}
}
if ($wrong_activity) {
if (!in_array($id, $successful_activities)) {
$successful_activities[] = (string) $id;
}
$user_response = explode('[,]', $xapi_data->statement->result->response);
if ($user_response) {
if (!in_array($id, $user_responses_array)) {
$user_responses_array[] = (string) $id;
}
foreach ($user_response as $item) {
if ($item === 'true') {
$item = '0';
}
if ($item === 'false') {
$item = '1';
}
$user_responses_array[] = $id . '-' . $item;
$successful_activities[] = $id . '-' . $item;
}
}
}
}
return $successful_activities;
}
}