portal.mkgtu.ru/common/components/tableForm/PortfolioTableComponent.php

1245 lines
51 KiB
PHP
Raw Normal View History

2024-03-28 09:51:45 +03:00
<?php
namespace common\components\tableForm;
use common\modules\student\models\Teacher;
use common\services\NamesManagementService;
use kartik\builder\TabularForm;
use kartik\dialog\Dialog;
use kartik\icons\Icon;
use kartik\select2\Select2;
use sguinfocom\DatePickerMaskedWidget\DatePickerMaskedWidget;
use stdClass;
use Yii;
use yii\base\Component;
use yii\base\UserException;
use yii\bootstrap4\Modal;
use yii\data\ArrayDataProvider;
use yii\helpers\ArrayHelper;
use yii\helpers\FileHelper;
use yii\helpers\Html;
use yii\web\JsExpression;
class PortfolioTableComponent extends Component
{
const ATTR_VISIBLE = 4;
const ATTR_READONLY = 1;
const ATTR_REQUIRED = 2;
const ATTR_RECOVERY = 5;
const ATTR_HYPERLINK = 3;
const ATTR_MULTILINE = 6;
private const VALUE_TYPE_PATTERN = "/([\x{0410}-\x{042F}]+)(Ссылка)(\\.[\x{0410}-\x{042F}]+)/iu";
private const TABULAR_VALUE_DATE_TYPE = 'Дата';
private const TABULAR_VALUE_REFERENCE_TYPE = 'СправочникСсылка';
private string $LapUID = '';
private string $PlanUID = '';
private string $LapResultClassUID = '';
private NamesManagementService $namesManagementService;
public function __construct(NamesManagementService $namesManagementService, $config = [])
{
parent::__construct($config);
$this->namesManagementService = $namesManagementService;
}
public function drawTable(&$portfolio, $puid, $luid, $ref_UID, $stringIndex, $result = null)
{
if (isset($portfolio->return, $portfolio->return->LapResultStrings, $result) && $result == 'Success') {
if (is_array($portfolio->return->LapResultStrings)) {
$strings = $portfolio->return->LapResultStrings;
} else {
$strings = [$portfolio->return->LapResultStrings];
}
$string = ArrayHelper::getValue($strings, $stringIndex);
$rows = $this->dataCollection($string);
foreach ($rows as $row) {
if (isset($row['table_rows'], $row['table_reference_UID']) && $row['table_reference_UID'] == $ref_UID) {
$tabular_parameters = $this->tabularParameters($row);
$parameterPage = [
'puid' => $puid,
'luid' => $luid,
'isAfterAdd' => 'false',
'stringIndex' => $stringIndex,
'uniqueCardSignature' => ArrayHelper::getValue(Yii::$app->request->post(), 'uniqueCardSignature'),
];
$tableButtonSubmit = ArrayHelper::getValue(Yii::$app->request->post(), 'table_button_submit');
if (isset($tableButtonSubmit) && $tableButtonSubmit == 'add') {
$parameterPage['isAfterAdd'] = 'true';
}
return Yii::$app->view->renderAjax('@common/components/tableForm/_tabular_form.php', [
'row' => $row,
'parameter_page' => $parameterPage,
'screening' => $tabular_parameters['screening'],
'attributes' => $tabular_parameters['attributes'],
'dataProvider' => $tabular_parameters['dataProvider'],
]);
}
}
return '<div class="alert alert-danger" role="alert"> Возникла ошибка в работе сервиса. Обратитесь к администратору</div>';
} else {
return '<div class="alert alert-danger" role="alert"> Возникла ошибка в работе сервиса. Обратитесь к администратору</div>';
}
}
public function dataCollection(&$string)
{
$data = [];
if (isset($string->LapResultProperties)) {
$lapResultProperties = $string->LapResultProperties;
if (!is_array($lapResultProperties)) {
$lapResultProperties = [$lapResultProperties];
}
$PropertyAttributeValue = $this->namesManagementService->getPropertyAttributeValueColumnName();
$PropertyAttributeName = $this->namesManagementService->getPropertyAttributeNameColumnName();
foreach ($lapResultProperties as $prop) {
$value = '';
if (isset($prop->ValueRef)) {
$value = $prop->ValueRef->ReferenceName;
} elseif (isset($prop->Value)) {
$value = $prop->Value;
}
$attributes = [Yii::$app->portfolioTable::ATTR_VISIBLE];
if (isset($prop->Attributes)) {
foreach ($prop->Attributes as $attribute) {
if (isset($attribute->{$PropertyAttributeValue}) && $attribute->{$PropertyAttributeValue}) {
switch ($attribute->{$PropertyAttributeName}) {
case 'ТолькоПросмотр':
if ($attribute->{$PropertyAttributeValue}) {
$attributeValue = Yii::$app->portfolioTable::ATTR_READONLY;
}
break;
case 'ВосстанавливатьСохраненныйеЗначения':
if ($attribute->{$PropertyAttributeValue}) {
$attributeValue = Yii::$app->portfolioTable::ATTR_RECOVERY;
}
break;
case 'ПроверкаЗаполнения':
if ($attribute->{$PropertyAttributeValue}) {
$attributeValue = Yii::$app->portfolioTable::ATTR_REQUIRED;
}
break;
case "МногострочныйРежим":
if ($attribute->{$PropertyAttributeValue})
$attributeValue = Yii::$app->portfolioTable::ATTR_MULTILINE;
break;
case 'Гиперссылка':
if ($attribute->{$PropertyAttributeValue}) {
$attributeValue = Yii::$app->portfolioTable::ATTR_HYPERLINK;
}
break;
case 'Видимость':
if (!$attribute->{$PropertyAttributeValue}) {
$attributes = array_diff($attributes, [Yii::$app->portfolioTable::ATTR_VISIBLE]);
}
break;
default:
$attributeValue = '';
}
if (!empty($attributeValue)) {
$attributes[] = $attributeValue;
$attributeValue = '';
}
}
}
}
$table = null;
$table_reference_UID = null;
$table_reference_UID = $prop->Property->ReferenceUID;
if ($prop->GroupType == 'Table' && isset($prop->Group->Rows)) {
$table = $prop->Group->Rows;
} elseif ($prop->GroupType == 'Table') {
$table = 'isEmpty';
}
$data[] = [
'value' => $value,
'table_rows' => $table,
'type' => $prop->ValueType,
'attributes' => $attributes,
'group_type' => $prop->GroupType,
'line_number' => $prop->LineNumber,
'name' => trim((string)$prop->Description),
'table_reference_UID' => $table_reference_UID
];
}
}
return $data;
}
public function tabularParameters($row, $canEdit = true)
{
$screening = rand();
$data_table = [];
$table_header = [];
$thisIs_refType = [];
$refType_filters = [];
$refType_classes = [];
$thisIs_dateType = [];
if (!is_array($row['table_rows'])) {
$row['table_rows'] = [$row['table_rows']];
}
foreach ($row['table_rows'] as $rows) {
$buffer = [];
if (!is_array($rows->Columns)) {
$rows->Columns = [$rows->Columns];
}
foreach ($rows->Columns as $cols) {
$table_header[md5($cols->Description)] = $cols->Description;
if (!isset($cols->Value) && isset($cols->ValueRef)) {
$cols->Value = $cols->ValueRef->ReferenceName;
}
if (mb_strpos($cols->ValueType, PortfolioTableComponent::TABULAR_VALUE_REFERENCE_TYPE) !== false) {
$refType_filters[md5($cols->Description)] = base64_encode(json_encode($cols->Filters));
if (preg_match(
PortfolioTableComponent::VALUE_TYPE_PATTERN,
$cols->ValueType,
$matches
)) {
$refType_classes[md5($cols->Description)] = "{$matches[1]}{$matches[3]}";
}
$thisIs_refType[$cols->Description] = '';
$buffer[md5($cols->Description)] = base64_encode(json_encode([
'ReferenceName' => '',
'ReferenceId' => '',
'ReferenceUID' => '',
'ReferenceClassName' => '',
]));
} elseif ($cols->ValueType == PortfolioTableComponent::TABULAR_VALUE_DATE_TYPE) {
$buffer[md5($cols->Description)] = date('Y-m-d');
$thisIs_dateType[] = $cols->Description;
} else {
$buffer[md5($cols->Description)] = '';
}
if (!empty($cols->Value)) {
if ($cols->ValueType == PortfolioTableComponent::TABULAR_VALUE_DATE_TYPE) {
$buffer[md5($cols->Description)] = Yii::$app->formatter->asDate(strtotime($cols->Value), 'yyyy-MM-dd');
$thisIs_dateType[] = $cols->Description;
} else {
$buffer[md5($cols->Description)] = $cols->Value;
}
}
if (isset($cols->ValueRef)) {
$thisIs_refType[$cols->Description] = $cols->ValueRef->ReferenceName;
$buffer[md5($cols->Description)] = base64_encode(json_encode([
'ReferenceName' => $cols->ValueRef->ReferenceName,
'ReferenceId' => $cols->ValueRef->ReferenceId,
'ReferenceUID' => $cols->ValueRef->ReferenceUID,
'ReferenceClassName' => $cols->ValueRef->ReferenceClassName,
]));
}
}
if ($canEdit) {
$data_table[$rows->RowNumber - 1] = array_merge(['RowNumber' => $rows->RowNumber], $buffer);
} else {
$data_table[$rows->RowNumber - 1] = $buffer;
}
}
ksort($table_header);
ksort($data_table);
$dataProvider = new ArrayDataProvider([
'allModels' => $data_table,
]);
$attributes = [];
foreach ($table_header as $hKey => $head) {
$attributes[$hKey] = ['label' => $head];
if (in_array($head, $thisIs_dateType)) {
$attributes[$hKey] = [
'label' => $head,
'type' => TabularForm::INPUT_WIDGET,
'widgetClass' => DatePickerMaskedWidget::class,
'options' => [
'inline' => false,
'language' => 'ru',
'template' => '{input}{addon}',
'id' => 'date_picker_masked_widget_' . rand(),
'pluginOptions' => [
'format' => 'yyyy-mm-dd',
'todayHighlight' => true,
'autoclose' => true
],
'clientOptions' => [
'clearBtn' => false,
'weekStart' => '1',
'autoclose' => true,
'todayBtn' => 'linked',
'format' => 'dd.mm.yyyy',
'calendarWeeks' => 'true',
'todayHighlight' => 'true',
'orientation' => 'top left',
],
'maskOptions' => [
'alias' => 'dd.mm.yyyy'
],
]
];
}
if (in_array($head, array_keys($thisIs_refType))) {
if ($canEdit) {
$attributes[$hKey] = [
'label' => $head,
'type' => TabularForm::INPUT_WIDGET,
'widgetClass' => Select2::class,
'options' => function ($model) use ($hKey, $screening, $refType_filters, $refType_classes) {
$initValueText = ArrayHelper::getValue(
json_decode(base64_decode($model[$hKey])),
'ReferenceName'
);
return [
'initValueText' => empty($initValueText) ? ' ' : $initValueText,
'options' => [
'id' => 'select_2_' . rand(),
'placeholder' => 'Введите запрос для поиска ...',
],
'pluginOptions' => [
'dropdownParent' => "#_tabular_form_table$screening",
'allowClear' => true,
'minimumInputLength' => 5,
'language' => [
'errorLoading' => new JsExpression("function () { return 'Waiting for results...'; }"),
],
'ajax' => [
'cache' => true,
'dataType' => 'json',
'url' => '/site/selected-tabular-element',
'data' => new JsExpression("
function(params) {
return {
query: params.term,
filters: '{$refType_filters[$hKey]}',
ref_class: '{$refType_classes[$hKey]}',
};
}
")
],
'escapeMarkup' => new JsExpression('function (params) { return params; }'),
'templateResult' => new JsExpression('function(params) { return params.text; }'),
'templateSelection' => new JsExpression('function (params) { return params.text; }'),
],
];
}
];
} else {
$attributes[$hKey] = [
'label' => $head,
'type' => TabularForm::INPUT_TEXT,
'staticValue' => function ($model) use ($hKey) {
$value = $model[$hKey] ?? '';
return ArrayHelper::getValue(
json_decode(base64_decode($value)),
'ReferenceName',
$value
);
}
];
}
}
}
if ($canEdit) {
$attributes['RowNumber'] = [
'label' => '',
'type' => TabularForm::INPUT_HIDDEN
];
}
return [
'screening' => $screening,
'attributes' => $attributes,
'dataProvider' => $dataProvider
];
}
public function modalForTable($row, $parameter_page, $canEdit = true)
{
$pathToSvg = FileHelper::normalizePath('/frontend/web/install/img/twotone-table_chart-24px.svg');
if ($row['table_rows'] == 'isEmpty' && isset($row['line_number'])) {
$LapResultStringsClass = Yii::$app->getPortfolioService->loadLapResultClassesProperties(
$this->PlanUID,
$this->LapUID,
$this->LapResultClassUID
);
if (
isset($LapResultStringsClass) &&
isset($LapResultStringsClass->return) &&
isset($LapResultStringsClass->return->LapResultStrings) &&
isset($LapResultStringsClass->return->LapResultStrings->LapResultProperties)
) {
$LapResultProperties = $LapResultStringsClass->return->LapResultStrings->LapResultProperties;
if (!is_array($LapResultProperties)) {
$LapResultProperties = [$LapResultProperties];
}
foreach ($LapResultProperties as $LapResultProperty) {
if ($LapResultProperty->LineNumber != $row['line_number']) {
continue;
}
if ($LapResultProperty->GroupType == 'Table' && isset($LapResultProperty->Group->Rows)) {
$row['table_rows'] = $LapResultProperty->Group->Rows;
}
}
}
}
$tabular_parameters = $this->tabularParameters($row, $canEdit);
Modal::begin([
'title' => Html::tag('h5', $row['name']),
'size' => 'modal-md',
'toggleButton' => [
'tag' => 'button',
'label' => "<img src=\"{$pathToSvg}\" width=\"24 px\" height=\"24px\">",
'class' => 'btn-sm btn-primary'
]
]);
echo Yii::$app->view->render('@common/components/tableForm/_tabular_form.php', [
'row' => $row,
'canEdit' => $canEdit,
'parameter_page' => $parameter_page,
'screening' => $tabular_parameters['screening'],
'attributes' => $tabular_parameters['attributes'],
'dataProvider' => $tabular_parameters['dataProvider'],
]);
Modal::end();
}
public function dropDownListButton($types)
{
if (!empty($types) && is_array($types)) {
echo Html::beginTag('div', ['class' => 'row']);
echo Html::beginTag('div', ['class' => 'col-12']);
echo Html::beginTag('div', ['class' => 'btn-group float-right form-group']);
echo Html::tag(
'button',
'Добавить',
[
'type' => 'button',
'aria-haspopup' => 'true',
'aria-expanded' => 'false',
'data-toggle' => 'dropdown',
'class' => 'btn btn-outline-secondary dropdown-toggle'
]
);
echo Html::beginTag(
'ul',
[
'id' => 'drop-menu',
'style' => 'width: 200px',
'class' => 'dropdown-menu dropdown-menu-with-old-style',
]
);
foreach ($types as $class) {
echo Html::tag(
'li',
Html::a($class->ReferenceName, '#'),
[
'style' => 'padding: 4px 0',
'data-lcuid' => $class->ReferenceUID
]
);
}
echo Html::endTag('ul');
echo Html::endTag('div');
echo Html::endTag('div');
echo Html::endTag('div');
}
}
public function editButtons($string, $recordbook_id, $luid, $puid)
{
echo Html::a(
'Удалить',
[
'luid' => $luid,
'puid' => $puid,
'recordbook_id' => $recordbook_id,
'/student/portfolio/delete-portfolio',
'uid' => $string->Result->ReferenceUID
],
[
'class' => 'btn btn-sm btn-danger float-right',
'data' => ['confirm' => 'Вы подтверждаете удаление портфолио?']
]
);
echo Html::a(
'Редактировать',
'#',
[
'style' => 'margin-right: 10px',
'data-uid' => $string->Result->ReferenceUID,
'data-lcuid' => $string->ResultForm->ReferenceUID,
'class' => 'btn btn-sm btn-primary float-right edit-result'
]
);
}
public function deleteButton(stdClass $string, int $recordbook_id, string $luid, string $puid, int $i)
{
echo Html::a(
'Удалить',
[
'idx' => $i,
'luid' => $luid,
'puid' => $puid,
'/student/portfolio/delete-file',
'recordbook_id' => $recordbook_id,
'uid' => $string->Result->ReferenceUID
],
[
'class' => 'btn-sm btn-danger float-right',
'data' => [
'confirm' => 'Вы подтверждаете удаление файла?',
],
]
);
}
public function additionalInfoBlock(array $marks, stdClass $string, array $comments, array $allFiles, int $recordbook_id, string $luid, string $puid, string $portfolio_type)
{
if ($portfolio_type == 'portfolio') {
echo Html::beginTag('div', ['class' => 'row']);
echo Html::beginTag('div', ['class' => 'col-12 col-md-6']);
echo Html::tag('h5', 'Оценка:');
echo Html::endTag('div');
if (isset($marks[$string->Result->ReferenceUID])) {
echo Html::beginTag('div', ['class' => 'col-12 col-md-6']);
echo Html::tag(
'h5',
Html::tag(
'b',
$marks[$string->Result->ReferenceUID]
)
);
echo Html::endTag('div');
}
echo Html::endTag('div');
if (isset($string->Teachers)) {
echo Html::beginTag('div', ['class' => 'row']);
echo Html::beginTag('div', ['class' => 'col-12 col-md-6']);
echo Html::tag('h5', 'Преподаватели:');
echo Html::endTag('div');
if (!is_array($string->Teachers)) {
$string->Teachers = [$string->Teachers];
}
echo Html::beginTag('div', ['class' => 'col-12 col-md-6']);
foreach ($string->Teachers as $rawTeacher) {
echo Html::beginTag('div', ['class' => 'row']);
echo Html::beginTag('div', ['class' => 'col-12']);
echo Html::tag(
'h5',
Html::tag(
'b',
(new Teacher(['rawTeacher' => $rawTeacher]))->renderTeacher()
)
);
echo Html::endTag('div');
echo Html::endTag('div');
}
echo Html::endTag('div');
echo Html::endTag('div');
}
if (isset($string->Status, $string->Status->ReferenceName)) {
echo Html::beginTag('div', ['class' => 'row']);
echo Html::beginTag('div', ['class' => 'col-12 col-md-6']);
echo Html::tag('h5', 'Статус документа:');
echo Html::endTag('div');
echo Html::beginTag('div', ['class' => 'col-12 col-md-6']);
echo Html::tag(
'h5',
Html::tag(
'b',
$string->Status->ReferenceName
)
);
echo Html::endTag('div');
echo Html::endTag('div');
}
}
echo Html::tag('h5', 'Файлы:');
echo Html::beginTag(
'table',
['class' => 'table table-striped table-bordered', 'style' => 'padding-top: 20px; font-size: 80%']
);
foreach ($allFiles as $i => $file) {
echo Html::beginTag('tr');
echo Html::beginTag('td');
echo Html::a(
!empty($file->Description) ? $file->Description : "{$file->Name}.{$file->Extension}",
[
'/student/portfolio/file',
'uid' => $string->Result->ReferenceUID,
'idx' => $i,
],
[
'target' => 'blank',
'data-pjax' => 0
]
) . ' (' . Yii::$app->formatter->asShortSize($file->Size) . ') ';
if ($portfolio_type != 'umk') {
$this->deleteButton($string, $recordbook_id, $luid, $puid, $i);
}
echo Html::endTag('td');
echo Html::endTag('tr');
}
echo Html::endTag('table');
if ($portfolio_type != 'umk') {
echo Html::beginTag('div', ['class' => 'row']);
echo Html::beginTag('div', ['class' => 'col-12']);
echo Html::a(
'Добавить файл',
'#',
[
'data-uid' => $string->Result->ReferenceUID,
'class' => 'btn-sm btn-primary float-right upload-file'
]
);
echo Html::endTag('div');
echo Html::endTag('div');
}
if ($portfolio_type == 'portfolio' || $portfolio_type == 'evaluation') {
echo Html::tag('h5', 'Комментарии:');
echo Html::beginTag('div', ['class' => 'row']);
echo Html::beginTag('div', ['class' => 'col-12']);
if (isset($comments[$string->Result->ReferenceUID])) {
echo Html::beginTag(
'table',
['class' => 'table table-striped table-bordered', 'style' => 'padding-top: 20px; font-size: 80%']
);
foreach ($comments[$string->Result->ReferenceUID] as $comment) {
echo Html::beginTag('tr');
echo Html::beginTag('td', ['style' => 'width: 40%;']);
echo Html::tag('p', Html::tag('b', $comment['author']), ['style' => 'margin-bottom: 0;']);
echo Html::tag('p', Yii::$app->formatter->asDatetime(strtotime($comment['date'])));
echo Html::endTag('td');
echo Html::beginTag('td');
echo Html::tag('p', $comment['text'], ['class' => 'portfolio_breakable_comment', 'style' => 'font-size: 1.5rem;']);
echo Html::endTag('td');
echo Html::endTag('tr');
}
echo Html::endTag('table');
}
echo Html::endTag('div');
echo Html::beginTag('div', ['class' => 'col-12']);
echo Html::a(
'Добавить комментарий',
'#',
[
'data-uid' => $string->Result->ReferenceUID,
'class' => 'btn-sm btn-primary float-right add-comment'
]
);
echo Html::endTag('div');
echo Html::endTag('div');
}
}
public function evaluationButton($marks, $string)
{
echo Html::beginTag('div', ['class' => 'row']);
echo Html::beginTag('div', ['class' => 'col-12 col-md-6']);
echo Html::tag('h5', 'Оценивание:');
echo Html::endTag('div');
if (isset($marks[$string->Result->ReferenceUID])) {
echo Html::beginTag('div', ['class' => 'col-12 col-md-6']);
echo Html::tag('b', $marks[$string->Result->ReferenceUID]);
echo Html::endTag('div');
} else {
echo Html::beginTag('div', ['class' => 'col-12 col-md-6']);
echo Html::a('Оценить', '#', [
'data-uid' => $string->Result->ReferenceUID,
'data-statementid' => (isset($string->Statement) ? $string->Statement->ReferenceUID : ''),
'class' => 'btn-sm btn-primary float-right add-mark'
]);
echo Html::endTag('div');
}
echo Html::endTag('div');
}
public function check(?string $studentId, ?string $plan_id, ?int $discipline_id, string $portfolio_type)
{
if ($portfolio_type == 'portfolio') {
return true;
} elseif ($portfolio_type == 'evaluation') {
return !empty($studentId);
} elseif ($portfolio_type == 'umk') {
return isset($plan_id, $discipline_id);
}
return false;
}
public function portfolioTableShow($param_array = [], $portfolio_type = null)
{
if (empty($param_array) || $portfolio_type == null) {
return;
}
echo Dialog::widget(['options' => []]);
$luid = (isset($param_array['luid'])) ? $param_array['luid'] : '';
$puid = (isset($param_array['puid'])) ? $param_array['puid'] : '';
$types = (isset($param_array['types'])) ? $param_array['types'] : null;
$files = (isset($param_array['files'])) ? $param_array['files'] : null;
$marks = (isset($param_array['marks'])) ? $param_array['marks'] : [];
$caf_id = (isset($param_array['caf_id'])) ? $param_array['caf_id'] : null;
$plan_id = (isset($param_array['plan_id'])) ? $param_array['plan_id'] : null;
$comments = (isset($param_array['comments'])) ? $param_array['comments'] : [];
$portfolio = (isset($param_array['portfolio'])) ? $param_array['portfolio'] : null;
$studentId = (isset($param_array['studentId'])) ? $param_array['studentId'] : null;
$recordbook_id = (isset($param_array['recordbook_id'])) ? (int)$param_array['recordbook_id'] : 0;
$discipline_id = (isset($param_array['discipline_id'])) ? (int)$param_array['discipline_id'] : null;
$this->LapUID = $luid;
$this->PlanUID = $puid;
if ($portfolio_type == 'portfolio') {
$this->dropDownListButton($types);
}
$strings = [];
if (isset($portfolio->return, $portfolio->return->LapResultStrings)) {
if (is_array($portfolio->return->LapResultStrings)) {
$strings = $portfolio->return->LapResultStrings;
} else {
$strings = [$portfolio->return->LapResultStrings];
}
}
if (empty($strings) && $this->check($studentId, $plan_id, $discipline_id, $portfolio_type)) {
if ((strlen((string)$puid) && strlen((string)$luid)) || (strlen((string)$discipline_id) + strlen((string)$recordbook_id) + strlen((string)$studentId)) < 1) {
$message = 'Для выбранных параметров нет данных.';
} else {
$message = 'Для отображения данных выберите элемент в дереве слева.';
}
echo Html::tag(
'div',
$message,
['class' => 'alert alert-info', 'role' => 'alert']
);
}
foreach ($strings as $stringIndex => $string) {
if ($this->LapResultClassUID != $string->ResultForm->ReferenceUID) {
$this->LapResultClassUID = $string->ResultForm->ReferenceUID;
}
$uniqueCardSignature = md5(json_encode($string, JSON_FORCE_OBJECT));
$data = [];
$data[] = [
'name' => 'Наименование',
'value' => $string->Result->ReferenceName,
'type' => 'text',
'attributes' => [$this::ATTR_VISIBLE],
'group_type' => (isset($string->GroupType)) ? $string->GroupType : 'NoGroup'
];
$data = array_merge($data, $this->dataCollection($string));
echo Html::beginTag('div', ['style' => 'border: 1px solid var(--gray); border-radius: 4px; padding: 20px; margin-bottom:25px']);
if ($portfolio_type == 'portfolio') $this->editButtons($string, $recordbook_id, $luid, $puid);
echo Html::beginTag(
'table',
[
'class' => 'table table-striped table-bordered',
'style' => ($portfolio_type == 'portfolio') ? 'margin-top: 50px; ' : '' . 'font-size: 80%;'
]
);
foreach ($data as $row) {
if (!in_array($this::ATTR_VISIBLE, $row['attributes'])) {
continue;
}
echo Html::beginTag('tr');
echo Html::tag('th', $row['name'], ['style' => 'width: 20%']);
echo Html::beginTag('td');
if ($row['group_type'] == 'Table' && isset($row['table_rows'])) {
$this->modalForTable(
$row,
[
'puid' => $puid,
'luid' => $luid,
'caf_id' => $caf_id,
'plan_id' => $plan_id,
'studentId' => $studentId,
'stringIndex' => $stringIndex,
'uniqueCardSignature' => $uniqueCardSignature,
],
$portfolio_type != 'umk'
);
} elseif (in_array($this::ATTR_HYPERLINK, $row['attributes'])) {
echo Html::a($row['value'], 'http://' . $row['value'], ['target' => '_blank']);
} elseif ($row['type'] == 'Дата') {
if (!empty($row['value'])) {
echo Yii::$app->formatter->asDate($row['value']);
}
} elseif ($row['type'] == 'Булево') {
echo $row['value'] == 'true' ? Icon::show('check') : '';
} elseif (in_array($this::ATTR_MULTILINE, $row['attributes'])) {
echo nl2br($row['value']);
} else {
echo $row['value'];
}
echo Html::endTag('td');
echo Html::endTag('tr');
}
echo Html::endTag('table');
if ($portfolio_type == 'evaluation') {
$this->evaluationButton($marks, $string);
}
Yii::$app->formatter->sizeFormatBase = 1000;
$allFiles = [];
if (isset($files[$string->Result->ReferenceUID]->return->AttachedFile)) {
$allFiles = $files[$string->Result->ReferenceUID]->return->AttachedFile;
if (!is_array($allFiles)) {
$allFiles = [$allFiles];
}
}
$this->additionalInfoBlock($marks, $string, $comments, $allFiles, $recordbook_id, $luid, $puid, $portfolio_type);
echo Html::endTag('div');
}
}
public function addPortfolio($portfolio_buffer, $ref_UID, $stringIndex = '')
{
$uniqueCardSignature = ArrayHelper::getValue(Yii::$app->request->post(), 'uniqueCardSignature');
if (empty($stringIndex)) {
$key = ArrayHelper::getValue($portfolio_buffer, 'return.LapResultStrings.LapResultProperties');
} else {
$key = ArrayHelper::getValue($portfolio_buffer, "return.LapResultStrings.{$stringIndex}.LapResultProperties");
}
if (empty($key)) {
foreach (ArrayHelper::getValue($portfolio_buffer, 'return.LapResultStrings') as $stringNumber => $string) {
if ($uniqueCardSignature == md5(json_encode($string, JSON_FORCE_OBJECT))) {
$portfolio_buffer->return->LapResultStrings = $string;
$key = ArrayHelper::getValue($portfolio_buffer, 'return.LapResultStrings.LapResultProperties');
break;
}
}
}
$PropertyAttributeValue = $this->namesManagementService->getPropertyAttributeValueColumnName();
$PropertyAttributeName = $this->namesManagementService->getPropertyAttributeNameColumnName();
$key = array_keys($key);
for ($i = 0; $i < count($key); $i++) {
if (empty($stringIndex)) {
$lap_res = ArrayHelper::getValue($portfolio_buffer, "return.LapResultStrings.LapResultProperties.{$key[$i]}");
} else {
$lap_res = ArrayHelper::getValue($portfolio_buffer, "return.LapResultStrings.{$stringIndex}.LapResultProperties.{$key[$i]}");
}
if ($lap_res->Property->ReferenceUID != $ref_UID) {
continue;
}
foreach ($lap_res->Attributes as $a_key => $attr) {
if (isset($lap_res->Attributes[$a_key]->{$PropertyAttributeName}) && $lap_res->Attributes[$a_key]->{$PropertyAttributeName} == 'ВосстанавливатьСохраненныеЗначения') {
$lap_res->Attributes[$a_key]->{$PropertyAttributeValue} = false;
$lap_res->ActualAttributes[$a_key]->{$PropertyAttributeValue} = false;
}
}
if (isset($lap_res->Group->Rows->RowNumber)) {
$lap_res->Group->Rows = [$lap_res->Group->Rows];
}
$new_field = json_decode(json_encode($lap_res->Group->Rows[0]));
$max = 0;
foreach ($lap_res->Group->Rows as $row) {
if ($row->RowNumber > $max) {
$max = $row->RowNumber;
}
}
if (isset($new_field->Columns->LineNumber)) {
$new_field->Columns = [$new_field->Columns];
}
$nf_key = array_keys($new_field->Columns);
for ($j = 0; $j < count($nf_key); $j++) {
if (isset($new_field->Columns[$nf_key[$j]], $new_field->Columns[$nf_key[$j]]->Value)) {
$new_field->Columns[$nf_key[$j]]->Value = '';
}
if (isset($new_field->Columns[$nf_key[$j]], $new_field->Columns[$nf_key[$j]]->ValueRef)) {
$new_field->Columns[$nf_key[$j]]->ValueRef = (object)[
'ReferenceName' => '',
'ReferenceId' => '',
'ReferenceUID' => '',
'ReferenceClassName' => '',
];
}
}
$new_field->RowNumber = $max + 1;
$lap_res->Group->Rows[] = $new_field;
if (empty($stringIndex)) {
$portfolio_buffer->return->LapResultStrings->LapResultProperties[$key[$i]] = $lap_res;
} else {
$portfolio_buffer->return->LapResultStrings[$stringIndex]->LapResultProperties[$key[$i]] = $lap_res;
}
}
return $portfolio_buffer;
}
private function addGroupFromLapResultClassUID($lap_res, $LapResultClassUID)
{
if (!$LapResultClassUID) {
throw new UserException("Нет идентификатора типа карточки.");
}
$post_buffer = Yii::$app->request->post();
$portfolioClasses = Yii::$app->getPortfolioService->loadLapResultClassesProperties(
$post_buffer['puid'],
$post_buffer['luid'],
$LapResultClassUID
);
$count = $lap_res['LineNumber'] - 1;
$Group = ArrayHelper::getValue($portfolioClasses, "return.LapResultStrings.LapResultProperties.{$count}.Group");
if (!$Group) {
throw new UserException("Невозможно восстановить структуру.");
}
if (isset($Group->Rows->RowNumber)) {
$Group->Rows = [$Group->Rows];
}
$new_field = json_decode(json_encode($Group->Rows[0]), true);
$max = 0;
foreach ($Group->Rows as $row) {
if ($row->RowNumber > $max) {
$max = $row->RowNumber;
}
}
if (isset($new_field['Columns']->LineNumber)) {
$new_field['Columns'] = [$new_field['Columns']];
}
$nf_key = array_keys($new_field['Columns']);
for ($j = 0; $j < count($nf_key); $j++) {
$cols = $new_field['Columns'][$nf_key[$j]];
if (mb_strpos($cols['ValueType'], PortfolioTableComponent::TABULAR_VALUE_REFERENCE_TYPE) !== false) {
$new_field['Columns'][$nf_key[$j]]['ValueRef'] = (object)[
'ReferenceName' => '',
'ReferenceId' => '',
'ReferenceUID' => '',
'ReferenceClassName' => '',
];
} elseif ($cols['ValueType'] == PortfolioTableComponent::TABULAR_VALUE_DATE_TYPE) {
$new_field['Columns'][$nf_key[$j]]['Value'] = date('Y-m-d');
} else {
$new_field['Columns'][$nf_key[$j]]['Value'] = '';
}
}
return [$new_field];
}
public function deletePortfolio($portfolio, &$new_table, $selection, $ref_UID, $stringIndex = '')
{
$uniqueCardSignature = ArrayHelper::getValue(Yii::$app->request->post(), 'uniqueCardSignature');
if (empty($stringIndex)) {
$key = ArrayHelper::getValue($portfolio, 'return.LapResultStrings.LapResultProperties');
} else {
$key = ArrayHelper::getValue($portfolio, "return.LapResultStrings.{$stringIndex}.LapResultProperties");
}
if (empty($key)) {
foreach (ArrayHelper::getValue($portfolio, 'return.LapResultStrings') as $stringNumber => $string) {
if ($uniqueCardSignature == md5(json_encode($string, JSON_FORCE_OBJECT))) {
$portfolio->return->LapResultStrings = $string;
$key = ArrayHelper::getValue($portfolio, 'return.LapResultStrings.LapResultProperties');
break;
}
}
}
$PropertyAttributeValue = $this->namesManagementService->getPropertyAttributeValueColumnName();
$PropertyAttributeName = $this->namesManagementService->getPropertyAttributeNameColumnName();
$key = array_keys($key);
$portfolio_buffer = json_decode(json_encode($portfolio), true);
$key = array_keys($key);
for ($i = 0; $i < count($key); $i++) {
if (empty($stringIndex)) {
$lap_res = ArrayHelper::getValue($portfolio_buffer, "return.LapResultStrings.LapResultProperties.{$key[$i]}");
} else {
$lap_res = ArrayHelper::getValue($portfolio_buffer, "return.LapResultStrings.{$stringIndex}.LapResultProperties.{$key[$i]}");
}
if ($lap_res['Property']['ReferenceUID'] != $ref_UID) {
continue;
}
foreach ($lap_res['Attributes'] as $a_key => $attr) {
if (isset($lap_res['Attributes'][$a_key][$PropertyAttributeName]) && $lap_res['Attributes'][$a_key][$PropertyAttributeName] == 'ВосстанавливатьСохраненныеЗначения') {
$lap_res['Attributes'][$a_key][$PropertyAttributeValue] = false;
$lap_res['ActualAttributes'][$a_key][$PropertyAttributeValue] = false;
}
}
$rows = (isset($lap_res['Group']['Rows']['RowNumber'])) ? [$lap_res['Group']['Rows']] : $lap_res['Group']['Rows'];
$lap_res['Group']['Rows'] = [];
$j = 0;
foreach ($rows as $r_key => $row) {
foreach ($selection as $num_del) {
if ($row['RowNumber'] == $new_table[$num_del]['RowNumber']) {
unset($rows[$r_key]);
break;
}
}
if (array_key_exists($r_key, $rows)) {
$lap_res['Group']['Rows'][$j] = $row;
$lap_res['Group']['Rows'][$j]['RowNumber'] = $j + 1;
$j++;
}
}
if (empty($stringIndex)) {
ArrayHelper::setValue($portfolio_buffer, "return.LapResultStrings.LapResultProperties.{$key[$i]}", $lap_res);
} else {
ArrayHelper::setValue($portfolio_buffer, "return.LapResultStrings.{$stringIndex}.LapResultProperties.{$key[$i]}", $lap_res);
}
}
return $portfolio_buffer;
}
public function rewritePortfolio($portfolio, &$new_table, $ref_UID, $stringIndex = '')
{
$isAfterAdd = ArrayHelper::getValue(Yii::$app->request->post(), 'isAfterAdd');
$isAfterAdd = empty($isAfterAdd) ? false : (bool)$isAfterAdd;
if ($isAfterAdd) {
$portfolio = $this->addPortfolio($portfolio, $ref_UID, $stringIndex);
}
$uniqueCardSignature = ArrayHelper::getValue(Yii::$app->request->post(), 'uniqueCardSignature');
if (empty($stringIndex)) {
$key = ArrayHelper::getValue($portfolio, 'return.LapResultStrings.LapResultProperties');
} else {
$key = ArrayHelper::getValue($portfolio, "return.LapResultStrings.{$stringIndex}.LapResultProperties");
}
if (empty($key)) {
foreach (ArrayHelper::getValue($portfolio, 'return.LapResultStrings') as $stringNumber => $string) {
if ($uniqueCardSignature == md5(json_encode($string, JSON_FORCE_OBJECT))) {
$portfolio->return->LapResultStrings = $string;
$key = ArrayHelper::getValue($portfolio, 'return.LapResultStrings.LapResultProperties');
break;
}
}
}
$key = array_keys($key);
$portfolio_buffer = json_decode(json_encode($portfolio), true);
$LapResultClassUID = null;
$PropertyAttributeValue = $this->namesManagementService->getPropertyAttributeValueColumnName();
$PropertyAttributeName = $this->namesManagementService->getPropertyAttributeNameColumnName();
for ($i = 0; $i < count($key); $i++) {
if (empty($stringIndex)) {
$LapResultClassUID = ArrayHelper::getValue($portfolio_buffer, "return.LapResultStrings.ResultForm.ReferenceUID");
} else {
$LapResultClassUID = ArrayHelper::getValue($portfolio_buffer, "return.LapResultStrings.{$stringIndex}.ResultForm.ReferenceUID");
}
if (empty($stringIndex)) {
$lap_res = ArrayHelper::getValue($portfolio_buffer, "return.LapResultStrings.LapResultProperties.{$key[$i]}");
} else {
$lap_res = ArrayHelper::getValue($portfolio_buffer, "return.LapResultStrings.{$stringIndex}.LapResultProperties.{$key[$i]}");
}
if ($lap_res['Property']['ReferenceUID'] != $ref_UID) {
continue;
}
if ($lap_res['GroupType'] == 'Table' && !isset($lap_res['Group']['Rows'])) {
$lap_res['Group']['Rows'] = $this->addGroupFromLapResultClassUID($lap_res, $LapResultClassUID);
}
foreach ($lap_res['Attributes'] as $a_key => $attr) {
if (isset($lap_res['Attributes'][$a_key][$PropertyAttributeName]) && $lap_res['Attributes'][$a_key][$PropertyAttributeName] == 'ВосстанавливатьСохраненныеЗначения') {
$lap_res['Attributes'][$a_key][$PropertyAttributeValue] = false;
$lap_res['ActualAttributes'][$a_key][$PropertyAttributeValue] = false;
}
$lap_res['Attributes'][$a_key][$PropertyAttributeValue] = $lap_res['ActualAttributes'][$a_key][$PropertyAttributeValue];
}
$lap_res['Group']['Rows'] = (isset($lap_res['Group']['Rows']['RowNumber'])) ? [$lap_res['Group']['Rows']] : $lap_res['Group']['Rows'];
if (array_key_exists('RowNumber', $lap_res['Group']['Rows'])) {
$lap_res['Group']['Rows'] = [$lap_res['Group']['Rows']];
}
foreach ($lap_res['Group']['Rows'] as $r_key => $row) {
if (array_key_exists('LineNumber', $row['Columns'])) {
$row['Columns'] = [$row['Columns']];
$lap_res['Group']['Rows'][$r_key]['Columns'] = [$lap_res['Group']['Rows'][$r_key]['Columns']];
}
foreach ($row['Columns'] as $c_key => $col) {
$isValue = ArrayHelper::getValue($lap_res, "Group.Rows.{$r_key}.Columns.{$c_key}.Value");
$isValueRef = ArrayHelper::getValue($lap_res, "Group.Rows.{$r_key}.Columns.{$c_key}.ValueRef");
if (isset($isValue)) {
$lap_res['Group']['Rows'][$r_key]['Columns'][$c_key]['Value'] = $new_table[$row['RowNumber'] - 1][md5($col['Description'])];
}
if (isset($isValueRef)) {
$lap_res['Group']['Rows'][$r_key]['Columns'][$c_key]['ValueRef'] = json_decode(base64_decode($new_table[$row['RowNumber'] - 1][md5($col['Description'])]), true);
}
}
}
if (empty($stringIndex)) {
ArrayHelper::setValue($portfolio_buffer, "return.LapResultStrings.LapResultProperties.{$key[$i]}", $lap_res);
} else {
ArrayHelper::setValue($portfolio_buffer, "return.LapResultStrings.{$stringIndex}.LapResultProperties.{$key[$i]}", $lap_res);
}
}
return $portfolio_buffer;
}
}