trinion_zadachnik-1.0.x-dev/trinion_zadachnik.module
trinion_zadachnik.module
<?php
/**
* Implements hook_form_alter().
*/
function trinion_zadachnik_form_alter(&$form, \Drupal\Core\Form\FormStateInterface &$form_state, $form_id) {
if ($form_id == 'node_zadacha_form') {
if ($base_document = Drupal::request()->get('base-document')) {
if ($node = \Drupal\node\Entity\Node::load($base_document)) {
$bundle = $node->bundle();
$doc_name = \Drupal\node\Entity\NodeType::load($bundle)->label();
$title = t($doc_name) . ' №' . $node->label() . ',';
$form['field_tz_tema']['widget'][0]['value']['#default_value'] = $title;
$form['field_tz_ssylka_na_obekt']['widget'][0]['value']['#default_value'] = $node->toUrl()->toString();
}
}
$config = Drupal::config('trinion_zadachnik.settings');
if ($default_value = $config->get('default_activity'))
$form['field_tz_deyatelnost']['widget']['#default_value'] = $default_value;
if ($default_value = $config->get('default_prioritet'))
$form['field_tz_prioritet']['widget']['#default_value'] = $default_value;
if (!empty($_COOKIE['proekt']) && is_numeric($_COOKIE['proekt']) && $_COOKIE['proekt'] != \Drupal::config('trinion_zadachnik.settings')->get('project_nerazobrannaya_tid'))
$form['field_tz_proekt']['widget']['#default_value'] = $_COOKIE['proekt'];
}
if (in_array($form_id, ['taxonomy_term_tz_proekt_form', 'taxonomy_term_prioritet_zadachi_form', 'taxonomy_term_kategoriya_zadachi_form', 'taxonomy_term_tz_statusy_zadach_form', 'taxonomy_term_deatelnost_zadacha_form'])) {
$form['description']['#access'] = FALSE;
$form['relations']['#access'] = FALSE;
$form['status']['#access'] = FALSE;
}
if ($form_id == 'node_zadacha_edit_form') {
$form['change_comment'] = [
'#type' => 'textarea',
'#title' => t('Comment on the change'),
'#weight' => 99,
];
}
if ($form_id == 'node_zadacha_form' || $form_id == 'node_zadacha_edit_form') {
unset($form['field_tz_role']['widget']['#options']['administrator'],$form['field_tz_role']['widget']['#options']['anonymous'],$form['field_tz_role']['widget']['#options']['authenticated']);
$form['field_tz_proekt']['widget']['#ajax'] = [
'callback' => 'trinion_zadachnik_field_tz_proekt_callback',
'event' => 'change',
];
$form['#validate'][] = 'trinion_zadachnik_zadacha_task_form_validate';
$form['#after_build'] = ['trinion_zadachnik_node_zadacha_form'];
}
elseif ($form_id == 'comment_tz_k_zadache_form') {
$route_match = Drupal::routeMatch();
if ($route_match->getRouteName() == 'entity.node.canonical') {
if ($route_match->getParameter('node')->bundle() != 'zadacha')
$form['field_tz_private']['#access'] = FALSE;
elseif (!Drupal::service('trinion_zadachnik.helper')->isUserSotrudnik())
$form['field_tz_private']['#access'] = FALSE;
}
$form['#after_build'] = ['trinion_zadachnik_comment_tz_k_zadache_form'];
}
elseif ($form_id == 'node_stroka_vremeni_form') {
$task_id = Drupal::request()->get('task');
if ($task_id && $task = \Drupal\node\Entity\Node::load($task_id)) {
if ($task->get('field_tz_otvetstvennyy')->getString() != Drupal::currentUser()->id()) {
Drupal::messenger()->addError(t('You cannot take on this task.'));
$form['actions']['#access'] = FALSE;
}
}
else {
Drupal::messenger()->addError(t('Task not set'));
$form['actions']['#access'] = FALSE;
}
}
}
function trinion_zadachnik_comment_tz_k_zadache_form($form, \Drupal\Core\Form\FormState $form_state) {
unset($form['field_tz_kommentariy']['widget'][0]['format']['help']);
return $form;
}
function trinion_zadachnik_node_zadacha_form($form, \Drupal\Core\Form\FormState $form_state) {
unset($form['field_tz_opisanie']['widget'][0]['format']['help']);
return $form;
}
function trinion_zadachnik_field_tz_proekt_callback($form, \Drupal\Core\Form\FormState $form_state) {
$response = new \Drupal\Core\Ajax\AjaxResponse();
$kategoriya = $form['field_tz_kategoriya_zadachi'];
$otvetstvennyy = $form['field_tz_otvetstvennyy'];
$related_task = $form['field_tz_related_tasks'];
$response->addCommand(new \Drupal\Core\Ajax\InsertCommand('.field--name-field-tz-kategoriya-zadachi', $kategoriya));
$response->addCommand(new \Drupal\Core\Ajax\InsertCommand('.field--name-field-tz-otvetstvennyy', $otvetstvennyy));
$response->addCommand(new \Drupal\Core\Ajax\InsertCommand('.field--name-field-tz-related-tasks', $related_task));
return $response;
}
/**
* Implements hook_preprocess_HOOK().
*/
function trinion_zadachnik_preprocess_views_view_field(&$variables) {
if ($variables['field']->field == 'field_tz_otvetstvennyy') {
$items = [];
foreach ($variables['row']->_entity->get('field_tz_otvetstvennyy') as $item) {
if ($user = \Drupal\user\Entity\User::load($item->entity->id())) {
$items[] = $user->get('field_tb_nick_name')->getString();
}
}
$variables['output'] = implode(', ', $items);
}
}
function trinion_zadachnik_zadacha_task_form_validate($form, \Drupal\Core\Form\FormState &$form_state) {
$user_selected = $role_selected = FALSE;
$otvetstvennyy = $form_state->getValue('field_tz_otvetstvennyy');
if ($otvetstvennyy) {
foreach ($otvetstvennyy as $key => $item) {
if (is_numeric($key)) {
if (!is_null($item['target_id'])) {
$user_selected = TRUE;
break;
}
}
}
}
// foreach ($form_state->getValue('field_tz_role') as $key => $item) {
// if (is_numeric($key)) {
// if (!is_null($item['target_id'])) {
// $role_selected = TRUE;
// break;
// }
// }
// }
if (!$user_selected && !$role_selected)
$form_state->setErrorByName('', t('Be sure to fill in either the Responsible field or the Role.'));
}
/**
* Implements hook_entity_extra_field_info().
*/
function trinion_zadachnik_entity_extra_field_info() {
$extra = [];
$extra['node']['zadacha'] = [
'display' => [
'knopka_smeni_statusa_zadachi' => [
'label' => t('Change task status form'),
'weight' => '100'
]
]
];
return $extra;
}
function trinion_zadachnik_node_view(array &$build, \Drupal\node\NodeInterface $node, $display, $view_mode) {//dump($node->id());
$bundle = $node->bundle();
if ($bundle == 'zadacha') {
if ($node->get('field_tz_status_zadachi')->getString() == Drupal::config('trinion_zadachnik.settings')->get('status_novaya_tid')) {
$build['#cache']['max-age'] = 0;
if ($node->hasField('field_tbi_ishodniy_element') && $node->get('field_tbi_ishodniy_element')->getString() == '')
$build['knopka_smeni_statusa_zadachi'] = \Drupal::formBuilder()->getForm('Drupal\trinion_zadachnik\Form\ChangeTaskStatusForm', $node);
}
}
}
/**
* Implements hook_entity_load().
*/
function trinion_zadachnik_entity_load($entities, $entity_type_id) {
if ($entity_type_id == 'node') {
foreach ($entities as $entity) {
$bundle = $entity->bundle();
if ($bundle == 'zadacha') {
$entity->node_title = t('@document № @num from @date', [
'@document' => $entity->get('type')->first()->entity->label(),
'@num' => $entity->label(),
'@date' => date('j.m.Y H:i', $entity->get('created')->getString()),
]
);
}
}
}
}
/**
* Implements hook_entity_access().
*/
function trinion_zadachnik_entity_access(\Drupal\Core\Entity\EntityInterface $entity, $operation, \Drupal\Core\Session\AccountInterface $account) {
$bundle = $entity->bundle();
if ($bundle == 'zadacha') {
if ($operation == 'update') {
$allowed_users = [$entity->get('uid')->getString()];
$uid = $account->id();
$user = \Drupal\user\Entity\User::load($uid);
$tids = [0];
foreach ($user->get('field_tz_proekt') as $item) {
$tids[] = $item->entity->id();
}
$project_tid = $entity->get('field_tz_proekt')->getString();
if (in_array($project_tid, $tids))
if (Drupal::service('trinion_zadachnik.helper')->accessUserToProject($uid, $project_tid, 'edit any'))
$allowed_users[] = $uid;
foreach ($entity->get('field_tz_otvetstvennyy') as $item) {
$allowed_users[] = $item->getString();
}
if ($entity->get('uid')->getString() != $uid) {
if ($user->get('field_tz_redaktirovat_zadachi')->getString() == 1) {
if (in_array($uid, $allowed_users)) {
return \Drupal\Core\Access\AccessResult::allowed();
}
}
}
}
elseif ($operation == 'view') {
$allowed_users = [$entity->get('uid')->getString()];
$uid = $account->id();
$user = \Drupal\user\Entity\User::load($uid);
$tids = [0];
foreach ($user->get('field_tz_proekt') as $item) {
$tids[] = $item->entity->id();
}
$project_tid = $entity->get('field_tz_proekt')->getString();
if (in_array($project_tid, $tids))
if (Drupal::service('trinion_zadachnik.helper')->accessUserToProject($uid, $project_tid, 'view any'))
$allowed_users[] = $uid;
foreach ($entity->get('field_tz_otvetstvennyy') as $item) {
$allowed_users[] = $item->getString();
}
return \Drupal\Core\Access\AccessResult::forbiddenIf(!in_array($uid, $allowed_users));
}
}
elseif ($bundle == 'stroka_vremeni')
return \Drupal\Core\Access\AccessResult::forbiddenIf($account->isAnonymous());
}
/**
* Implements hook_entity_presave().
*/
function trinion_zadachnik_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {
$bundle = $entity->bundle();
$entity_type = $entity->getEntityType()->id();
if ($entity_type == 'comment' && $bundle == 'tz_k_zadache') {
if ($entity->getCommentedEntity()->bundle() == 'zadacha')
Drupal::service('trinion_main.mails')->uvedomlenieNoviyCommentKZadache($entity);
}
if ($bundle == 'zadacha') {
if ($entity->isNew()) {
$query = \Drupal::database()->select('node_field_data')
->condition('type', $bundle);
$query->addExpression('CAST(title as SIGNED)', 'num');
$query->orderBy('num', 'DESC');
$query->range(0, 1);
if (!($last = $query->execute()->fetchField()))
$last = 0;
$entity->title = $last + 1;
}
if ($days_to_complete = $entity->get('field_tz_dney_na_vypolnenie')->getString()) {
$start_time = $entity->get('field_tz_vremya_nachala_zadachi')->getString();
if (empty($start_time))
$start_time = date('Y-m-d H:i:s');
$hours_to_complete = round($days_to_complete * 24);
$entity->field_tz_vrem_vypoleniya_zadachi = date('Y-m-d\TH:i:s', strtotime($hours_to_complete . ' hours', strtotime($start_time)));
}
}
elseif ($bundle == 'stroka_vremeni') {
if ($entity->isNew()) {
$entity->title = Drupal::service('trinion_main.helper')->getNextDocumentNumber('stroka_vremeni');
$entity->field_tz_polzovatel = Drupal::currentUser()->id();
if ($entity->get('field_tz_zadacha')->getString() == '')
$entity->field_tz_zadacha = Drupal::request()->get('task');
}
}
}
/**
* Implements hook_entity_insert().
*/
function trinion_zadachnik_entity_insert(\Drupal\Core\Entity\EntityInterface $entity) {
$bundle = $entity->bundle();
if ($bundle == 'zadacha') {
Drupal::service('trinion_main.mails')->uvedomlenieNovayaZadacha($entity);
$text = t('New task') . '<a href="/node/' . $entity->id() . '">#' . $entity->label() . '</a> ' . $entity->get('field_tz_tema')->getString();
foreach ($entity->get('field_tz_otvetstvennyy') as $user) {
\Drupal\trinion_base\Controller\NoticeController::uvedomlenie($user->getString(), $text);
}
}
elseif ($bundle == 'change_log') {
if ($entity->field_tcl_object->first()->entity->bundle() == 'zadacha')
Drupal::service('trinion_main.mails')->uvedomlenieObIzmeneniiZadachi($entity);
$changelog_comment = Drupal::request()->request->get('change_comment');
if (!empty($changelog_comment) && trim($changelog_comment) != '') {
$task_nid = Drupal::routeMatch()->getParameter('node')->id();
$comment = Drupal::service('trinion_zadachnik.helper')->createComment($task_nid, $changelog_comment);
$comment->field_tz_ssilka_na_izmenenie = $entity->id();
$comment->save();
}
}
elseif ($bundle == 'mail') {
Drupal::service("trinion_zadachnik.mail_processor")->processMailMessage($entity);
}
}
/**
* Implements hook_views_query_alter().
*/
function trinion_zadachnik_views_query_alter(\Drupal\views\ViewExecutable $view, \Drupal\views\Plugin\views\query\QueryPluginBase $query) {
if ($view->id() == 'ssylka_na_suschnost_proekty_v_zadache') {
$user = Drupal::currentUser();
$user = \Drupal\user\Entity\User::load($user->id());
$tids = [0];
foreach ($user->get('field_tz_proekt') as $item)
$tids[] = $item->entity->id();
$query->addWhere(0, 'taxonomy_term_field_data.tid', $tids, 'IN');
}
if ($view->id() == 'zadachi_naznachennye_mne') {
$selected_status = Drupal::request()->get('field_tz_status_zadachi_target_id');
if (is_null($selected_status)) {
$closed_tids = [];
$closed_tids[] = Drupal::config('trinion_zadachnik.settings')->get('status_zakrita_tid');
$closed_tids[] = Drupal::config('trinion_zadachnik.settings')->get('status_otmenena_tid');
$query->addWhere(0, 'node__field_tz_status_zadachi.field_tz_status_zadachi_target_id', $closed_tids, 'NOT IN');
}
}
}
/**
* Implements hook_views_post_build().
*/
function trinion_zadachnik_views_pre_build(\Drupal\views\ViewExecutable $view) {
$view_id = $view->id();
if ($view_id == 'zadachi_naznachennye_mne' && !empty($_COOKIE['proekt'])) {
$view->setExposedInput(['field_tz_proekt_target_id' => $_COOKIE['proekt']]);
}
}
/**
* Implements hook_views_pre_execute().
*/
function trinion_zadachnik_views_pre_execute(\Drupal\views\ViewExecutable $view) {
$view_id = $view->id();
if ($view_id == 'zadachi_naznachennye_mne') {
$show_only_my = Drupal::service('trinion_main.helper')->getMyAllSwitcherValue($view->id());
if ($show_only_my || $view->current_display == 'widget_my_task') {
// filter by Responsible and Role
$roles = Drupal::currentUser()->getRoles(TRUE);
$roles_assoc = [
':empty' => 'empty',
];
foreach ($roles as $role) {
$roles_assoc[':' . $role] = $role;
}
$roles_place_holder = implode(',', array_keys($roles_assoc));
$query = $view->build_info['query'];
$uid = Drupal::currentUser()->id();
$query->leftJoin('node__field_tz_role', 'r', 'node_field_data.nid = r.entity_id AND r.field_tz_role_target_id IN (' . $roles_place_holder . ')', $roles_assoc);
$query->leftJoin('node__field_tz_otvetstvennyy', 'ru', 'node_field_data.nid = ru.entity_id AND ru.field_tz_otvetstvennyy_target_id = :uid', [':uid' => $uid]);
$or = $query->orConditionGroup();
$or->isNotNull('r.entity_id');
$or->isNotNull('ru.entity_id');
$query->condition($or);
$view->build_info['query'] = $query;
$view->build_info['count_query'] = $query;
}
elseif (!$show_only_my || $view->current_display == 'widget_my_projects') {
$uid = Drupal::currentUser()->id();
$user = \Drupal\user\Entity\User::load($uid);
$projects[] = 0;
foreach ($user->get('field_tz_proekt') as $item) {
$project_id = $item->entity->id();
if (Drupal::service('trinion_zadachnik.helper')->accessUserToProject($uid, $project_id, 'view any')) {
$projects[] = $project_id;
}
}
$query = $view->build_info['query'];
$query->leftJoin('node__field_tz_otvetstvennyy', 'ru', 'node_field_data.nid = ru.entity_id AND ru.field_tz_otvetstvennyy_target_id = :uid', [':uid' => $uid]);
$or = $query->orConditionGroup();
$or->isNotNull('ru.entity_id');
$or->condition('node_field_data.uid', $uid);
// filter by projects
$or->condition('node__field_tz_proekt.field_tz_proekt_target_id', $projects, 'IN');
$query->condition($or);
$view->build_info['query'] = $query;
$view->build_info['count_query'] = $query;
}
}
elseif ($view_id == 'trinion_terms') {
$query = $view->build_info['query'];
$query->condition('tid', Drupal::config('trinion_zadachnik.settings')->get('project_nerazobrannaya_tid'), '<>');
}
}
/**
* Implements hook_query_alter().
*/
function trinion_zadachnik_query_alter(Drupal\Core\Database\Query\AlterableInterface $query) {
if ($query->hasTag('entity_reference')) {
// фильтр пользователей так же по проекту
$project = Drupal::request()->get('project');
if (!is_null($project) && $project) {
$project_id = 0;
if (preg_match('/\((.*?)\)\s*/', $project, $match)) {
$project_id = $match[1];
}
$query->join('user__field_tz_proekt', 'pr', 'pr.entity_id = base_table.uid');
$query->condition('pr.field_tz_proekt_target_id', $project_id);
}
}
}
/**
* Implements hook_trinion_base_dashboard_widget().
*/
function trinion_zadachnik_trinion_base_dashboard_widget() {
$widget = new \Drupal\trinion_base\Widget();
$widget->setType('pie');
$widget->setTitle(t('My tasks'));
$widget->setWeight(1);
$view = \Drupal\views\Views::getView('zadachi_naznachennye_mne');
$view->setDisplay('widget_my_task');
$view->execute();
$data = [];
foreach ($view->result as $row) {
$term = \Drupal\taxonomy\Entity\Term::load($row->node__field_tz_status_zadachi_field_tz_status_zadachi_target);
$config = Drupal::config('trinion_zadachnik.settings');
switch ($term->id()) {
case $config->get('status_novaya_tid'):
$color = '#f2f234';
break;
case $config->get('status_v_rabote_tid'):
$color = '#008000';
break;
case $config->get('status_vipolnenae_tid'):
$color = '#018fd5';
break;
case $config->get('status_zakrita_tid'):
$color = '#848484';
break;
case $config->get('status_na_dorabotku_tid'):
$color = '#ff0000';
break;
case $config->get('status_otlozheno_tid'):
$color = '#000000';
break;
case $config->get('status_nuzhen_otklik_tid'):
$color = '#f9a306';
break;
case $config->get('status_otmenena_tid'):
$color = '#fde2af';
break;
default:
$color = '#' . str_pad(dechex(mt_rand(0, 0xFFFFFF)), 6, '0', STR_PAD_LEFT);
}
$data[$term->label()] = [
'cnt' => $row->nid,
'color' => $color,
];
}
$widget->setData($data);
$widgets[] = $widget;
return $widgets;
}
