View source
<?php
namespace Drupal\opigno_module\Form;
use Drupal\Core\Entity\ContentEntityForm;
use Drupal\Core\Form\FormStateInterface;
use Drupal\file\Entity\File;
class OpignoActivityForm extends ContentEntityForm {
public function buildForm(array $form, FormStateInterface $form_state) {
$form = parent::buildForm($form, $form_state);
$term_storage = \Drupal::entityTypeManager()
->getStorage('taxonomy_term');
$values = $form_state
->getValues();
$auto_skills = FALSE;
$form['#prefix'] = '<div id="activity-wrapper">';
$form['#suffix'] = '</div>';
$moduleHandler = \Drupal::service('module_handler');
$is_new = $this
->getEntity()
->isNew();
$in_skills_system = FALSE;
$activity = $this
->getEntity();
$skill_id = $activity
->getSkillId();
$params = \Drupal::routeMatch()
->getParameters();
if (!empty($params
->get('opigno_module'))) {
$module_id = $params
->get('opigno_module')
->id();
$module = \Drupal::entityTypeManager()
->getStorage('opigno_module')
->load($module_id);
$in_skills_system = $module
->getSkillsActive();
}
if ($skill_id) {
$default_manual = TRUE;
$parents = $term_storage
->loadAllParents($skill_id);
$parents_ids = array_keys($parents);
}
else {
$default_manual = FALSE;
$parents_ids = [];
}
if (!$is_new || !$moduleHandler
->moduleExists('opigno_skills_system') || isset($module) && !$in_skills_system) {
$form['auto_skills']['#access'] = FALSE;
$auto_skills = $this
->getEntity()
->get('auto_skills')
->getValue()[0]['value'];
}
else {
$form['auto_skills']['widget']['value']['#ajax'] = [
'method' => 'replace',
'effect' => 'fade',
'callback' => '::autoSkillsAjax',
'wrapper' => 'activity-wrapper',
];
$form['usage_activity']['widget']['#default_value'] = 'global';
}
if (isset($module) && $in_skills_system && $is_new) {
$form['auto_skills']['#access'] = FALSE;
$form['auto_skills']['widget']['value']['#default_value'] = TRUE;
$auto_skills = TRUE;
}
if (!empty($values['auto_skills']['value'])) {
$auto_skills = $values['auto_skills']['value'];
}
if ((!isset($module_id) || !$module
->getSkillsActive()) && ($is_new || !$auto_skills)) {
$form['manual_skills_management'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Assign a skill to this activity'),
'#default_value' => $default_manual,
'#weight' => 1,
'#ajax' => [
'method' => 'replace',
'effect' => 'fade',
'callback' => '::autoSkillsAjax',
'wrapper' => 'activity-wrapper',
],
];
}
$target_skills = $term_storage
->loadTree('skills', 0, 1);
$default_target_skill = FALSE;
$options = [];
if ($target_skills) {
$default_target_skill = $target_skills[0]->tid;
}
foreach ($target_skills as $row) {
$options[$row->tid] = $row->name;
if (in_array($row->tid, $parents_ids)) {
$default_target_skill = $row->tid;
}
}
if ($in_skills_system && !$is_new) {
$default_target_skill = $module
->getTargetSkill();
}
else {
$form['manual_management_tree'] = [
'#type' => 'select',
'#title' => $this
->t('Choose skills tree'),
'#options' => $options,
'#weight' => 1,
'#default_value' => $default_target_skill,
'#ajax' => [
'event' => 'change',
'callback' => '::autoSkillsAjax',
'wrapper' => 'activity-wrapper',
],
];
if ($default_target_skill) {
$form['manual_management_tree']['#default_value'] = $default_target_skill;
}
}
$form['skills_list']['widget']['#ajax'] = [
'event' => 'change',
'callback' => '::autoSkillsAjax',
'wrapper' => 'activity-wrapper',
];
$target_skill = $form_state
->getValue('manual_management_tree');
if (!empty($target_skill)) {
$form['skills_list']['widget']['#options'] = $this
->_getSkillsFromTree($target_skill, $form['skills_list']['widget']['#options']);
}
else {
$form['skills_list']['widget']['#options'] = $this
->_getSkillsFromTree($default_target_skill, $form['skills_list']['widget']['#options']);
}
if (isset($values['skills_list'][0])) {
$selected_skill = $term_storage
->load($values['skills_list'][0]['target_id']);
$form['skill_level']['widget']['#default_value'][0] = '0';
$default_skill_level = $values['skill_level'];
$default_skill_level[0]['value'] = 'Level 1';
$form_state
->setValue('skill_level', $default_skill_level);
}
elseif (isset($form['skills_list']['widget']['#default_value'][0])) {
$selected_skill = $term_storage
->load($form['skills_list']['widget']['#default_value'][0]);
}
$form['skill_level']['widget']['#options'] = [
1 => $this
->t('Level 1'),
];
if (isset($selected_skill)) {
$levels = $selected_skill
->get('field_level_names');
if (isset($levels)) {
$levels = $levels
->getValue();
}
}
if (!empty($levels)) {
$form['skill_level']['widget']['#options'] = [];
foreach ($levels as $key => $level) {
$form['skill_level']['widget']['#options'] += [
$key + 1 => $level['value'],
];
}
}
if (!$auto_skills && (isset($values['manual_skills_management']) && $values['manual_skills_management'] == 0 || !$activity
->getSkillId() && !isset($values['manual_skills_management']))) {
$form['manual_management_tree']['#access'] = FALSE;
$form['skill_level']['#access'] = FALSE;
$form['skills_list']['#access'] = FALSE;
$form['usage_activity']['#access'] = FALSE;
}
elseif ($auto_skills && $is_new) {
$form['manual_skills_management']['#access'] = FALSE;
}
elseif (isset($values['manual_skills_management']) || $values['manual_skills_management'] == 1) {
$form['usage_activity']['#access'] = FALSE;
}
return $form;
}
public function _getSkillsFromTree($target_skill, array $term_options) {
$term_storage = \Drupal::entityTypeManager()
->getStorage('taxonomy_term');
$skills_from_tree = $term_storage
->loadTree('skills', $target_skill);
$options = [];
foreach ($skills_from_tree as $row) {
$options[$row->tid] = $row->name;
}
foreach ($term_options as $key => $option) {
if (array_key_exists($key, $options)) {
$term_options[$key] = $options[$key];
}
elseif ($key != '_none') {
unset($term_options[$key]);
}
}
return $term_options;
}
public function autoSkillsAjax(array &$form, FormStateInterface $form_state) {
return $form;
}
public function save(array $form, FormStateInterface $form_state) {
$activity =& $this->entity;
$params = \Drupal::request()->query
->all();
$status = parent::save($form, $form_state);
$values = $form_state
->getValues();
if ($values['auto_skills']['value'] == 0) {
$activity
->set('usage_activity', 'local');
if ($values['manual_skills_management'] == 0) {
$activity
->setSkillId(NULL);
}
$activity
->save();
}
if (!empty($values['field_video'][0]['fids'])) {
$fid = $values['field_video'][0]['fids'][0];
$file = File::load($fid);
$this
->renameFile($file);
}
switch ($status) {
case SAVED_NEW:
if (isset($params['module_id']) && !empty($params['module_id'] && $params['module_vid'])) {
$opigno_module = \Drupal::entityTypeManager()
->getStorage('opigno_module')
->load($params['module_id']);
$opigno_module_obj = \Drupal::service('opigno_module.opigno_module');
$opigno_module_obj
->activitiesToModule([
$activity,
], $opigno_module);
}
\Drupal::messenger()
->addMessage($this
->t('Created the %label Activity.', [
'%label' => $activity
->label(),
]));
break;
default:
\Drupal::messenger()
->addMessage($this
->t('Saved the %label Activity.', [
'%label' => $activity
->label(),
]));
}
$form_state
->setRedirect('entity.opigno_activity.canonical', [
'opigno_activity' => $activity
->id(),
]);
}
public function validateForm(array &$form, FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
$moduleHandler = \Drupal::service('module_handler');
$values = $form_state
->getValues();
if ($moduleHandler
->moduleExists('opigno_skills_system') && isset($values['manual_skill_management']) && $values['manual_skill_management'] == FALSE) {
unset($values['skills_list'][0]);
unset($values['skill_level'][0]);
$form_state
->setValues($values);
}
}
protected function renameFile(&$file) {
if (!empty($file)) {
$stream_wrapper = \Drupal::service('file_system')
->uriScheme($file
->getFileUri());
$filename = $file
->getFilename();
$filename_new = preg_replace('/[^a-zA-Z0-9-_\\.]/', '-', $filename);
$file
->setFilename($filename_new);
$file
->save();
file_move($file, $stream_wrapper . '://' . $filename_new);
}
}
}