Initial import
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
|
||||
if (!empty($_GET['webview_mode'])):
|
||||
|
||||
\app\models\Ts::set([194])
|
||||
|
||||
?>
|
||||
<link rel="stylesheet" href="/_public/assets/fonts/line-awesome/css/line-awesome.min.css">
|
||||
<style>
|
||||
header, .page-header, footer, .cart, .mobile-logo {display: none !important;}
|
||||
.main-profile-panel, .booking-panel { margin: 0 !important; !important;}
|
||||
.content {width: calc(100% - 20px) !important; padding: 60px 10px 10px 10px !important;}
|
||||
.panel-box { background: #FFFFFF; border: 0}
|
||||
.header-app {
|
||||
background: #FFFFFF;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
height: 50px;
|
||||
line-height: 50px;
|
||||
position: fixed;
|
||||
box-shadow: 0 5px 10px rgba(0,0,0, 0.4);
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
.close-browser-in-app {
|
||||
position: absolute;
|
||||
color: #FFFFFF;
|
||||
background: #000000;
|
||||
width: 25px;
|
||||
height: 25px;
|
||||
right: 15px;
|
||||
top: 14px;
|
||||
font-size: 20px;
|
||||
text-align: center;
|
||||
line-height: 27px;
|
||||
border-radius: 5px !important;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
const closeBrowseBtn = document.createElement('div');
|
||||
closeBrowseBtn.className = 'close-browser-in-app';
|
||||
closeBrowseBtn.innerHTML = '<i class="la la-times"></i>';
|
||||
closeBrowseBtn.addEventListener('click', () => {
|
||||
window.location.href = '<?= Yii::$app->params['portal'] ?>/bg/mobile-api/browser-close/'
|
||||
})
|
||||
const headerApp = document.createElement('div');
|
||||
headerApp.className = 'header-app';
|
||||
headerApp.innerHTML = '<?= \app\models\Ts::get(194)?>'
|
||||
headerApp.appendChild(closeBrowseBtn);
|
||||
window.addEventListener('DOMContentLoaded', function () {
|
||||
document.body.appendChild(headerApp);
|
||||
})
|
||||
</script>
|
||||
<?php endif ?>
|
||||
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
/* @var $this \yii\web\View */
|
||||
if (!empty($_GET['id'])):
|
||||
|
||||
$help = \app\models\Help::findOne($_GET['id']);
|
||||
|
||||
?>
|
||||
<div class="content-body-title"><?=$help->title?></div>
|
||||
<div class="content-body-text">
|
||||
<?= $help->text ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
/**
|
||||
* @var $guide_type
|
||||
*/
|
||||
if (!empty($_FILES) && !empty($_GET['upload'])) {
|
||||
if ($_FILES['upload-cms-guide']['error'] !== UPLOAD_ERR_OK) {
|
||||
// Handle the error
|
||||
switch ($_FILES['upload-cms-guide']['error']) {
|
||||
case UPLOAD_ERR_INI_SIZE:
|
||||
case UPLOAD_ERR_FORM_SIZE:
|
||||
echo "The uploaded file exceeds the maximum file size.";
|
||||
break;
|
||||
case UPLOAD_ERR_PARTIAL:
|
||||
echo "The uploaded file was only partially uploaded.";
|
||||
break;
|
||||
case UPLOAD_ERR_NO_FILE:
|
||||
echo "No file was uploaded.";
|
||||
break;
|
||||
case UPLOAD_ERR_NO_TMP_DIR:
|
||||
echo "Missing a temporary folder.";
|
||||
break;
|
||||
case UPLOAD_ERR_CANT_WRITE:
|
||||
echo "Failed to write file to disk.";
|
||||
break;
|
||||
case UPLOAD_ERR_EXTENSION:
|
||||
echo "A PHP extension stopped the file upload.";
|
||||
break;
|
||||
default:
|
||||
echo "An unknown error occurred.";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
echo json_encode($_FILES);
|
||||
if (!empty($_FILES['upload-cms-guide'])) {
|
||||
|
||||
$file = $_FILES['upload-cms-guide'];
|
||||
$type = $file['type'];
|
||||
$file_size = $file['size'];
|
||||
//if (!$type == 'application/pdf') {
|
||||
// echo json_encode(['error' => 'Качения файл не е pdf']);
|
||||
//}
|
||||
|
||||
$file_size_mb = round($file_size / 1048576, 2);
|
||||
//if ($file_size_mb > 20) {
|
||||
// echo json_encode(['error' => 'Качения файл не е по-голям от 20 МБ']);
|
||||
//}
|
||||
$lg = $_GET['lg'] ?? 'bg';
|
||||
$path = $_SERVER['DOCUMENT_ROOT'] . '/_public/guides/'. $guide_type . '-' . $lg . '.pdf';
|
||||
move_uploaded_file($file["tmp_name"], $path);
|
||||
$_SESSION['flash'] = [];
|
||||
$_SESSION['flash']['success'] = true;
|
||||
$_SESSION['flash']['msg'] = 'Файла е качен успешно';
|
||||
echo json_encode(['success' => 1]);
|
||||
}
|
||||
exit;
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
/**
|
||||
* @var $guide_type
|
||||
*/
|
||||
if (!empty($_FILES) && !empty($_GET['upload'])) {
|
||||
if ($_FILES['upload-cms-qa']['error'] !== UPLOAD_ERR_OK) {
|
||||
// Handle the error
|
||||
switch ($_FILES['upload-cms-qa']['error']) {
|
||||
case UPLOAD_ERR_INI_SIZE:
|
||||
case UPLOAD_ERR_FORM_SIZE:
|
||||
echo "The uploaded file exceeds the maximum file size.";
|
||||
break;
|
||||
case UPLOAD_ERR_PARTIAL:
|
||||
echo "The uploaded file was only partially uploaded.";
|
||||
break;
|
||||
case UPLOAD_ERR_NO_FILE:
|
||||
echo "No file was uploaded.";
|
||||
break;
|
||||
case UPLOAD_ERR_NO_TMP_DIR:
|
||||
echo "Missing a temporary folder.";
|
||||
break;
|
||||
case UPLOAD_ERR_CANT_WRITE:
|
||||
echo "Failed to write file to disk.";
|
||||
break;
|
||||
case UPLOAD_ERR_EXTENSION:
|
||||
echo "A PHP extension stopped the file upload.";
|
||||
break;
|
||||
default:
|
||||
echo "An unknown error occurred.";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
echo json_encode($_FILES);
|
||||
if (!empty($_FILES['upload-cms-qa'])) {
|
||||
|
||||
$file = $_FILES['upload-cms-qa'];
|
||||
$type = $file['type'];
|
||||
$file_size = $file['size'];
|
||||
//if (!$type == 'application/pdf') {
|
||||
// echo json_encode(['error' => 'Качения файл не е pdf']);
|
||||
//}
|
||||
|
||||
$file_size_mb = round($file_size / 1048576, 2);
|
||||
//if ($file_size_mb > 20) {
|
||||
// echo json_encode(['error' => 'Качения файл не е по-голям от 20 МБ']);
|
||||
//}
|
||||
$lg = $_GET['lg'] ?? 'bg';
|
||||
$path = $_SERVER['DOCUMENT_ROOT'] . '/_public/guides/'. $guide_type . '-' . $lg . '.pdf';
|
||||
move_uploaded_file($file["tmp_name"], $path);
|
||||
$_SESSION['flash'] = [];
|
||||
$_SESSION['flash']['success'] = true;
|
||||
$_SESSION['flash']['msg'] = 'Файла е качен успешно';
|
||||
echo json_encode(['success' => 1]);
|
||||
}
|
||||
exit;
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
use app\models\AboutProject;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
$_GET['id'] = 1;
|
||||
$_GET['o'] = 'w';
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нова помощна информация',
|
||||
'title_edit' => 'За проекта',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'index/help' => 'Помощна информация',
|
||||
],
|
||||
],
|
||||
'tabs' => $tabs ?? [],
|
||||
'writeView' => "index/tabs/main/about_project_w",
|
||||
'model' => AboutProject::class,
|
||||
'validation' => function ($p) {
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, AboutProject $model) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Данните са записани успешно' : 'Данните са създадени успешно');
|
||||
$model->redirectTo('index/about-project');
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
Includes::top('Начално табло');
|
||||
$users_count = \app\models\UserPublic::find()->count();
|
||||
$register_objects = \app\models\RegisterObjects::find()->where(['lib_type' => 1])->count();
|
||||
$collections = \app\models\register\Collections::find()->where(['deleted' => 0])->count();
|
||||
$expositions = \app\models\Expositions::find()->count();
|
||||
$publications = \app\models\RegisterObjects::find()->where(['lib_type' => 2])->count();
|
||||
$lg = !empty($_COOKIE['cookie_lg']) ? '/'.$_COOKIE['cookie_lg'].'/' : '';
|
||||
?>
|
||||
|
||||
<div class="flex">
|
||||
<div class="dashboard-info-cm">
|
||||
<div class="label">Брой публични потребители</div>
|
||||
<div class="count"><?= $users_count ?></div>
|
||||
</div>
|
||||
<div class="dashboard-info-cm">
|
||||
<div class="label">Брой обекти</div>
|
||||
<div class="count"><?= $register_objects ?></div>
|
||||
</div>
|
||||
<div class="dashboard-info-cm">
|
||||
<div class="label">Брой колекции</div>
|
||||
<div class="count"><?= $collections ?></div>
|
||||
</div>
|
||||
<div class="dashboard-info-cm">
|
||||
<div class="label">Брой експозиции</div>
|
||||
<div class="count"><?= $expositions ?></div>
|
||||
</div>
|
||||
<div class="dashboard-info-cm">
|
||||
<div class="label">Брой научни публикации</div>
|
||||
<div class="count"><?= $publications ?></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="p5 top30">
|
||||
<div class="flex flex-wrap">
|
||||
<div class="dashboard-plate">
|
||||
<div class="title">Публичен портал</div>
|
||||
<a target="_blank" class="button" href="<?= Yii::$app->params['portal'] . $lg ?>">Влизане в Публичен портал</a>
|
||||
</div>
|
||||
<div class="dashboard-plate">
|
||||
<div class="title">Дигитален магазин</div>
|
||||
<a class="button" href="/admin-global/products/subscriptions/">Влизане в Дигитален магазин</a>
|
||||
</div>
|
||||
<div class="dashboard-plate">
|
||||
<div class="title">Потребители</div>
|
||||
<a class="button" href="/admin-global/user/public/">Влизане в Потребители</a>
|
||||
</div>
|
||||
<div class="dashboard-plate">
|
||||
<div class="title">
|
||||
Табло на вътрешен портал
|
||||
</div>
|
||||
<a target="_blank" class="button" href="<?= Yii::$app->params['register'] ?>">Вход</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
<?php
|
||||
echo $this->render('_upload_file_guide', ['guide_type' => 'cms-guide']);
|
||||
$lg = $_GET['lg'] ?? 'bg';
|
||||
?>
|
||||
<div class="flex top">
|
||||
<div class="top-title">Ръководство на потребителя</div>
|
||||
<div class="breadcrumb p10">
|
||||
<a href="/admin-global/index/dashboard">Начало</a>
|
||||
<span>Ръководство на потребителя</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="inner-content p10">
|
||||
<div class="action-buttons" style="border-bottom: 4px solid #f1f1f1; padding-bottom: 10px">
|
||||
<a href="?lg=bg" class="btn-ib btn-default ct guide-link <?= $lg == 'bg' ? 'selected' : '' ?>"><i
|
||||
class="lg lg-bg"></i> Български</a>
|
||||
<a href="?lg=en" class="btn-ib btn-default ct guide-link <?= $lg == 'en' ? 'selected' : '' ?>"><i
|
||||
class="lg lg-en"></i> Английски</a>
|
||||
<div onclick="uploadDocument(this)" class="btn-ib btn-default"><i class="la la-file-pdf"></i> Качи документ<span
|
||||
id="progress"></span></div>
|
||||
</div>
|
||||
<div class="top10">
|
||||
|
||||
<?php if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/_public/guides/cms-guide-' . $lg . '.pdf')): ?>
|
||||
<iframe src="<?= Yii::$app->params['cms'] . '/_public/guides/cms-guide-' . $lg . '.pdf?time='. time() ?>"
|
||||
style="height: calc(100vh - 200px); width: 100%; border: 0"></iframe>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<style>
|
||||
.guide-link {
|
||||
border: 1px solid #cccccc !important;
|
||||
}
|
||||
|
||||
.guide-link.selected {
|
||||
background: var(--base-background-ultra-bright-clear) !important;
|
||||
}
|
||||
|
||||
.modalImg {
|
||||
height: auto !important;
|
||||
max-height: none !important;
|
||||
}
|
||||
|
||||
.modalImg img {
|
||||
height: auto !important;
|
||||
width: 100% !important;
|
||||
display: block;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
window.onscroll = function () {
|
||||
const ab = one('.action-buttons');
|
||||
if (ab) {
|
||||
if (window.pageYOffset > ab.offsetTop) {
|
||||
ab.addClass('buttons-top')
|
||||
} else {
|
||||
ab.removeClass('buttons-top')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function openZoomImg(src) {
|
||||
modal.modalPreview(src)
|
||||
}
|
||||
|
||||
function uploadDocument(btn) {
|
||||
const process = document.querySelector('#progress')
|
||||
const fileInput = document.createElement('input')
|
||||
fileInput.type = 'file';
|
||||
fileInput.name = 'upload-cms-guide'
|
||||
//fileInput.accept = '.pdf'
|
||||
fileInput.addEventListener('change', () => {
|
||||
btn.classList.add('disabled')
|
||||
const file = fileInput.files[0];
|
||||
const formData = new FormData();
|
||||
formData.append('upload-cms-guide', file);
|
||||
const xhr = new XMLHttpRequest()
|
||||
xhr.upload.addEventListener('progress', (event) => {
|
||||
const percentComplete = event.loaded / event.total * 100;
|
||||
process.innerHTML = ` ${parseInt(percentComplete)}%`
|
||||
if (percentComplete === 100) {
|
||||
setTimeout(function () {
|
||||
process.innerHTML = ''
|
||||
btn.classList.add('disabled')
|
||||
window.location.reload()
|
||||
}, 2000)
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
xhr.open('POST', '?upload=true&lg=<?= $lg ?>');
|
||||
xhr.send(formData);
|
||||
})
|
||||
fileInput.click()
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
@@ -0,0 +1,97 @@
|
||||
<?php
|
||||
echo $this->render('_upload_file_guide', ['guide_type' => 'portal-guide']);
|
||||
$lg = $_GET['lg'] ?? 'bg';
|
||||
?>
|
||||
<div class="flex top">
|
||||
<div class="top-title">Ръководство на публичен портал</div>
|
||||
<div class="breadcrumb p10">
|
||||
<a href="/admin-global/index/dashboard">Начало</a>
|
||||
<span>Ръководство на публичен портал</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="inner-content p10">
|
||||
<div class="action-buttons" style="border-bottom: 4px solid #f1f1f1; padding-bottom: 10px">
|
||||
<a href="?lg=bg" class="btn-ib btn-default ct guide-link <?= $lg == 'bg' ? 'selected' : '' ?>"><i
|
||||
class="lg lg-bg"></i> Български</a>
|
||||
<a href="?lg=en" class="btn-ib btn-default ct guide-link <?= $lg == 'en' ? 'selected' : '' ?>"><i
|
||||
class="lg lg-en"></i> Английски</a>
|
||||
<div onclick="uploadDocument(this)" class="btn-ib btn-default"><i class="la la-file-pdf"></i> Качи документ<span
|
||||
id="progress"></span></div>
|
||||
</div>
|
||||
<div class="top10">
|
||||
|
||||
<?php if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/_public/guides/portal-guide-' . $lg . '.pdf')): ?>
|
||||
<iframe src="<?= Yii::$app->params['cms'] . '/_public/guides/portal-guide-' . $lg . '.pdf?time='. time() ?>"
|
||||
style="height: calc(100vh - 200px); width: 100%; border: 0"></iframe>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<style>
|
||||
.guide-link {
|
||||
border: 1px solid #cccccc !important;
|
||||
}
|
||||
|
||||
.guide-link.selected {
|
||||
background: var(--base-background-ultra-bright-clear) !important;
|
||||
}
|
||||
|
||||
.modalImg {
|
||||
height: auto !important;
|
||||
max-height: none !important;
|
||||
}
|
||||
|
||||
.modalImg img {
|
||||
height: auto !important;
|
||||
width: 100% !important;
|
||||
display: block;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
window.onscroll = function () {
|
||||
const ab = one('.action-buttons');
|
||||
if (ab) {
|
||||
if (window.pageYOffset > ab.offsetTop) {
|
||||
ab.addClass('buttons-top')
|
||||
} else {
|
||||
ab.removeClass('buttons-top')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function openZoomImg(src) {
|
||||
modal.modalPreview(src)
|
||||
}
|
||||
|
||||
function uploadDocument(btn) {
|
||||
const process = document.querySelector('#progress')
|
||||
const fileInput = document.createElement('input')
|
||||
fileInput.type = 'file';
|
||||
fileInput.name = 'upload-cms-guide'
|
||||
//fileInput.accept = '.pdf'
|
||||
fileInput.addEventListener('change', () => {
|
||||
btn.classList.add('disabled')
|
||||
const file = fileInput.files[0];
|
||||
const formData = new FormData();
|
||||
formData.append('upload-cms-guide', file);
|
||||
const xhr = new XMLHttpRequest()
|
||||
xhr.upload.addEventListener('progress', (event) => {
|
||||
const percentComplete = event.loaded / event.total * 100;
|
||||
process.innerHTML = ` ${parseInt(percentComplete)}%`
|
||||
if (percentComplete === 100) {
|
||||
setTimeout(function () {
|
||||
process.innerHTML = ''
|
||||
btn.classList.add('disabled')
|
||||
window.location.reload()
|
||||
}, 2000)
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
xhr.open('POST', '?upload=true&lg=<?= $lg ?>');
|
||||
xhr.send(formData);
|
||||
})
|
||||
fileInput.click()
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
@@ -0,0 +1,147 @@
|
||||
<?php if($_SERVER['REQUEST_METHOD'] != 'POST'): ?>
|
||||
|
||||
<style>
|
||||
|
||||
.help-logic {
|
||||
padding: 20px 0 0 10px
|
||||
}
|
||||
|
||||
.help-logic p {
|
||||
font-size: 12px;
|
||||
font-style: italic;
|
||||
color: var(--base-background-super-dark);
|
||||
width: 500px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.help-key-btn {
|
||||
height: 35px;
|
||||
background: #FFFFFF;
|
||||
border: 1px solid var(--base-background-dark);
|
||||
color: var(--base-background-dark);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.help-key-btn.inactive {
|
||||
background: darkmagenta;
|
||||
color: #FFFFFF;
|
||||
border: 1px solid darkmagenta;
|
||||
}
|
||||
|
||||
.help-key-btn:hover {
|
||||
background: var(--base-background-ultra-bright-clear);
|
||||
color: var(--base-background-super-dark);
|
||||
}
|
||||
|
||||
.help-key-btn.inactive:hover {
|
||||
color: darkmagenta;
|
||||
}
|
||||
|
||||
</style>
|
||||
<div class="help-logic">
|
||||
<?php if (empty($_SESSION['help_keys'])): ?>
|
||||
<button onclick="helpKeys('active')" class="help-key-btn active">Активирай показване на ключовете за помощна
|
||||
информация
|
||||
</button>
|
||||
<p><i class="la la-info-circle"></i> При активиране на "показване на ключовете за помощна информация" ще
|
||||
покажете текстов ключ, който ще се намира
|
||||
до всяко поле за въвеждане във формите за създаване или редакция на цялата система.</p>
|
||||
<?php else: ?>
|
||||
<button onclick="helpKeys('inactive')" class="help-key-btn inactive">Деактивирай показване на ключовете за
|
||||
помощна информация
|
||||
</button>
|
||||
<p><i class="la la-info-circle"></i> При деактивиране на "показване на ключовете за помощна информация" ще
|
||||
скриете текстовия ключ, който се намира до всяко поле за въвеждане във формите за създаване или редакция на
|
||||
цялата система.</p>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<?php endif; ?>
|
||||
<?php
|
||||
|
||||
use app\models\Help;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
$_GET['tab'] = $tab;
|
||||
|
||||
$filter = Yii::$app->getFilterData('and');
|
||||
|
||||
$filter[0] = 'and';
|
||||
|
||||
TableWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Помощна информация',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
]
|
||||
],
|
||||
'filter' => [
|
||||
[
|
||||
'title' => ['Заглавие на помощна информация', 'c4'],
|
||||
'key' => ['Ключ', 'c4'],
|
||||
],
|
||||
],
|
||||
'actions' => [
|
||||
//'new' => 'Добавяне',
|
||||
'edit' => 'Редакция на помощна информация',
|
||||
'delete' => 'Изтриване на помощна информация'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c0 text-right',
|
||||
'Ключ' => '',
|
||||
'Заглавие на помощна информация' => '',
|
||||
],
|
||||
'model' => Help::class,
|
||||
'data' => Help::find()->where(Yii::$app->getFilterData('or'))->loop([
|
||||
'id',
|
||||
function (Help $model) {
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->key . '</a>';
|
||||
},
|
||||
'title'
|
||||
], $_GET['p'] ?? 1, 50)
|
||||
]);
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нова помощна информация',
|
||||
'title_edit' => 'Редакция помощна информация',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'index/help' => 'Помощна информация',
|
||||
],
|
||||
],
|
||||
'tabs' => $tabs ?? [],
|
||||
'writeView' => "index/tabs/" . Includes::tab($tab) . "/help_w",
|
||||
'model' => Help::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
if (empty($p->{'key'}))
|
||||
return ["key" => 'Ключът е задължителен'];
|
||||
if (empty($p->{'title'}))
|
||||
return ["title" => 'Моля, въведете заглавие на помощната информация'];
|
||||
if (empty($p->{'text'}))
|
||||
return ["text" => 'Моля, попълнете текста'];
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, Help $model) use ($tab) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Данните са записани успешно' : 'Данните са създадени успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
?>
|
||||
<?php if($_SERVER['REQUEST_METHOD'] != 'POST'): ?>
|
||||
<script>
|
||||
function helpKeys(action) {
|
||||
request({
|
||||
url: '/admin-global/help-keys-remote/prepare-help/?help_keys=' + action,
|
||||
done: () => {
|
||||
window.location.reload()
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
<?php endif; ?>
|
||||
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
use app\models\History;
|
||||
use app\models\Subscriptions;
|
||||
use app\models\TourObjects;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
$_GET['tab'] = $tab;
|
||||
|
||||
$filter = Yii::$app->getFilterData('and');
|
||||
|
||||
$filter[0] = 'and';
|
||||
|
||||
TableWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Хронология',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
]
|
||||
],
|
||||
//'filter' => [
|
||||
// [
|
||||
// 'name' => ['Име на туристическия обект', 'c4'],
|
||||
// ],
|
||||
//],
|
||||
'actions' => [],
|
||||
'th' => [
|
||||
'№' => 'c0 text-right',
|
||||
'Потребител' => '',
|
||||
'Действие' => '',
|
||||
'Какво' => '',
|
||||
'Дата и час' => '',
|
||||
],
|
||||
'model' => History::class,
|
||||
'data' => History::find()->where(Yii::$app->getFilterData('and'))->orderBy(['date_time' => SORT_DESC])->loop([
|
||||
'id',
|
||||
'user',
|
||||
|
||||
function (History $h) {
|
||||
switch ($h->action) {
|
||||
case 1:
|
||||
return '<span style="color: cornflowerblue; font-weight: bold"><i class="la la-plus-circle"></i> Въвеждане</span>';
|
||||
case 2:
|
||||
return '<span style="color: #228827; font-weight: bold"><i class="la la-pencil-square-o"></i> Редакция</span>';
|
||||
|
||||
}
|
||||
},
|
||||
function(History $h) {
|
||||
return $h->table_name.' ID:'.$h->history_id;
|
||||
},
|
||||
function (History $h) {
|
||||
return $h->formatDate($h->date_time, 'd.m.Y H:i');
|
||||
}
|
||||
], $_GET['p'] ?? 1, 50)
|
||||
]);
|
||||
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
use app\models\Inquiries;
|
||||
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
$_GET['tab'] = $tab;
|
||||
|
||||
$filter = Yii::$app->getFilterData('and');
|
||||
|
||||
$filter[0] = 'and';
|
||||
|
||||
TableWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Запитвания',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
]
|
||||
],
|
||||
'filter' => [
|
||||
[
|
||||
'name' => ['Име', 'c4'],
|
||||
'email' => ['Ел. поща', 'c4'],
|
||||
],
|
||||
],
|
||||
'actions' => [
|
||||
'delete' => 'Изтриване на помощна информация'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c0 text-right',
|
||||
'Име' => 'c1',
|
||||
'Ел. поща' => 'c2',
|
||||
'Действие' => 'c2',
|
||||
'Какво не е наред' => '',
|
||||
'Дата' => 'c0'
|
||||
],
|
||||
'model' => Inquiries ::class,
|
||||
'data' => Inquiries::find()->where(Yii::$app->getFilterData('or'))->orderBy(['date_time' => SORT_DESC])->loop([
|
||||
'id',
|
||||
'name',
|
||||
'email',
|
||||
'operation',
|
||||
'error',
|
||||
function (Inquiries $i) {
|
||||
if ($i->date_time)
|
||||
return '<div class="ct">'.date('d.m.Y H:i ч.', strtotime($i->date_time)).'</div>';
|
||||
}
|
||||
], $_GET['p'] ?? 1, 50)
|
||||
]);
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => '',
|
||||
'title_edit' => 'Преглед запитване',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'index/inquiries' => 'Запитвания',
|
||||
],
|
||||
],
|
||||
'tabs' => $tabs ?? [],
|
||||
'writeView' => "index/tabs/" . Includes::tab($tab) . "/inquiries_w",
|
||||
'model' => Inquiries::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, Inquiries $model) use ($tab) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Данните са записани успешно' : 'Данните са създадени успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,97 @@
|
||||
<?php
|
||||
echo $this->render('_upload_file_qa', ['guide_type' => 'cms-qa']);
|
||||
$lg = $_GET['lg'] ?? 'bg';
|
||||
?>
|
||||
<div class="flex top">
|
||||
<div class="top-title">Въпроси и отговори</div>
|
||||
<div class="breadcrumb p10">
|
||||
<a href="/admin-global/index/dashboard">Начало</a>
|
||||
<span>Въпроси и отговори</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="inner-content p10">
|
||||
<div class="action-buttons" style="border-bottom: 4px solid #f1f1f1; padding-bottom: 10px">
|
||||
<a href="?lg=bg" class="btn-ib btn-default ct guide-link <?= $lg == 'bg' ? 'selected' : '' ?>"><i
|
||||
class="lg lg-bg"></i> Български</a>
|
||||
<a href="?lg=en" class="btn-ib btn-default ct guide-link <?= $lg == 'en' ? 'selected' : '' ?>"><i
|
||||
class="lg lg-en"></i> Английски</a>
|
||||
<div onclick="uploadDocument(this)" class="btn-ib btn-default"><i class="la la-file-pdf"></i> Качи документ<span
|
||||
id="progress"></span></div>
|
||||
</div>
|
||||
<div class="top10">
|
||||
|
||||
<?php if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/_public/guides/cms-qa-' . $lg . '.pdf')): ?>
|
||||
<iframe src="<?= Yii::$app->params['cms'] . '/_public/guides/cms-qa-' . $lg . '.pdf?time='. time() ?>"
|
||||
style="height: calc(100vh - 200px); width: 100%; border: 0"></iframe>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<style>
|
||||
.guide-link {
|
||||
border: 1px solid #cccccc !important;
|
||||
}
|
||||
|
||||
.guide-link.selected {
|
||||
background: var(--base-background-ultra-bright-clear) !important;
|
||||
}
|
||||
|
||||
.modalImg {
|
||||
height: auto !important;
|
||||
max-height: none !important;
|
||||
}
|
||||
|
||||
.modalImg img {
|
||||
height: auto !important;
|
||||
width: 100% !important;
|
||||
display: block;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
window.onscroll = function () {
|
||||
const ab = one('.action-buttons');
|
||||
if (ab) {
|
||||
if (window.pageYOffset > ab.offsetTop) {
|
||||
ab.addClass('buttons-top')
|
||||
} else {
|
||||
ab.removeClass('buttons-top')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function openZoomImg(src) {
|
||||
modal.modalPreview(src)
|
||||
}
|
||||
|
||||
function uploadDocument(btn) {
|
||||
const process = document.querySelector('#progress')
|
||||
const fileInput = document.createElement('input')
|
||||
fileInput.type = 'file';
|
||||
fileInput.name = 'upload-cms-qa'
|
||||
//fileInput.accept = '.pdf'
|
||||
fileInput.addEventListener('change', () => {
|
||||
btn.classList.add('disabled')
|
||||
const file = fileInput.files[0];
|
||||
const formData = new FormData();
|
||||
formData.append('upload-cms-qa', file);
|
||||
const xhr = new XMLHttpRequest()
|
||||
xhr.upload.addEventListener('progress', (event) => {
|
||||
const percentComplete = event.loaded / event.total * 100;
|
||||
process.innerHTML = ` ${parseInt(percentComplete)}%`
|
||||
if (percentComplete === 100) {
|
||||
setTimeout(function () {
|
||||
process.innerHTML = ''
|
||||
btn.classList.add('disabled')
|
||||
window.location.reload()
|
||||
}, 2000)
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
xhr.open('POST', '?upload=true&lg=<?= $lg ?>');
|
||||
xhr.send(formData);
|
||||
})
|
||||
fileInput.click()
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
@@ -0,0 +1,97 @@
|
||||
<?php
|
||||
echo $this->render('_upload_file_qa', ['guide_type' => 'portal-qa']);
|
||||
$lg = $_GET['lg'] ?? 'bg';
|
||||
?>
|
||||
<div class="flex top">
|
||||
<div class="top-title">Въпроси и отговори портал</div>
|
||||
<div class="breadcrumb p10">
|
||||
<a href="/admin-global/index/dashboard">Начало</a>
|
||||
<span>Въпроси и отговори портал</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="inner-content p10">
|
||||
<div class="action-buttons" style="border-bottom: 4px solid #f1f1f1; padding-bottom: 10px">
|
||||
<a href="?lg=bg" class="btn-ib btn-default ct guide-link <?= $lg == 'bg' ? 'selected' : '' ?>"><i
|
||||
class="lg lg-bg"></i> Български</a>
|
||||
<a href="?lg=en" class="btn-ib btn-default ct guide-link <?= $lg == 'en' ? 'selected' : '' ?>"><i
|
||||
class="lg lg-en"></i> Английски</a>
|
||||
<div onclick="uploadDocument(this)" class="btn-ib btn-default"><i class="la la-file-pdf"></i> Качи документ<span
|
||||
id="progress"></span></div>
|
||||
</div>
|
||||
<div class="top10">
|
||||
|
||||
<?php if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/_public/guides/portal-qa-' . $lg . '.pdf')): ?>
|
||||
<iframe src="<?= Yii::$app->params['cms'] . '/_public/guides/portal-qa-' . $lg . '.pdf?time='. time() ?>"
|
||||
style="height: calc(100vh - 200px); width: 100%; border: 0"></iframe>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<style>
|
||||
.guide-link {
|
||||
border: 1px solid #cccccc !important;
|
||||
}
|
||||
|
||||
.guide-link.selected {
|
||||
background: var(--base-background-ultra-bright-clear) !important;
|
||||
}
|
||||
|
||||
.modalImg {
|
||||
height: auto !important;
|
||||
max-height: none !important;
|
||||
}
|
||||
|
||||
.modalImg img {
|
||||
height: auto !important;
|
||||
width: 100% !important;
|
||||
display: block;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
window.onscroll = function () {
|
||||
const ab = one('.action-buttons');
|
||||
if (ab) {
|
||||
if (window.pageYOffset > ab.offsetTop) {
|
||||
ab.addClass('buttons-top')
|
||||
} else {
|
||||
ab.removeClass('buttons-top')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function openZoomImg(src) {
|
||||
modal.modalPreview(src)
|
||||
}
|
||||
|
||||
function uploadDocument(btn) {
|
||||
const process = document.querySelector('#progress')
|
||||
const fileInput = document.createElement('input')
|
||||
fileInput.type = 'file';
|
||||
fileInput.name = 'upload-cms-qa'
|
||||
//fileInput.accept = '.pdf'
|
||||
fileInput.addEventListener('change', () => {
|
||||
btn.classList.add('disabled')
|
||||
const file = fileInput.files[0];
|
||||
const formData = new FormData();
|
||||
formData.append('upload-cms-qa', file);
|
||||
const xhr = new XMLHttpRequest()
|
||||
xhr.upload.addEventListener('progress', (event) => {
|
||||
const percentComplete = event.loaded / event.total * 100;
|
||||
process.innerHTML = ` ${parseInt(percentComplete)}%`
|
||||
if (percentComplete === 100) {
|
||||
setTimeout(function () {
|
||||
process.innerHTML = ''
|
||||
btn.classList.add('disabled')
|
||||
window.location.reload()
|
||||
}, 2000)
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
xhr.open('POST', '?upload=true&lg=<?= $lg ?>');
|
||||
xhr.send(formData);
|
||||
})
|
||||
fileInput.click()
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
/** @var \app\models\AboutProject $model */
|
||||
|
||||
use app\widgets\FileWidget;
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
$media_key = $model->getMediaKey();
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
<form autocomplete="off">
|
||||
<div class="row c9 top15">
|
||||
<label>Лога български език</label>
|
||||
<?= FileWidget::widget([
|
||||
'media_type' => 'image',
|
||||
'object_key' => 'about_project_logos',
|
||||
'media_key' => $media_key,
|
||||
'files' => $model->getFiles('thumb'),
|
||||
'actions' => [
|
||||
'add' => 'Добавяне на изображения',
|
||||
'edit' => 'Редакция на изображение',
|
||||
'delete' => 'Премахване на изображения'
|
||||
],
|
||||
'resolutions' => ['3:1'],
|
||||
'max_file_size' => 2,
|
||||
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
|
||||
]) ?>
|
||||
</div>
|
||||
<div class="row c9 top15">
|
||||
<label>Лога английски език</label>
|
||||
<?= FileWidget::widget([
|
||||
'media_type' => 'image',
|
||||
'object_key' => 'about_project_logos_en',
|
||||
'media_key' => $media_key,
|
||||
'files' => $model->getFiles('thumb'),
|
||||
'actions' => [
|
||||
'add' => 'Добавяне на изображения',
|
||||
'edit' => 'Редакция на изображение',
|
||||
'delete' => 'Премахване на изображения'
|
||||
],
|
||||
'resolutions' => ['3:1'],
|
||||
'max_file_size' => 2,
|
||||
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
|
||||
]) ?>
|
||||
</div>
|
||||
<div class="c10 row top15">
|
||||
<label>Текст BG</label>
|
||||
<textarea name="text_bg" placeholder="Въведи текст BG"><?= $model->text_bg ?></textarea>
|
||||
</div>
|
||||
<div class="c10 row top15">
|
||||
<label>Текст EN</label>
|
||||
<textarea name="text_en" placeholder="Въведи текст EN"><?= $model->text_en ?></textarea>
|
||||
</div>
|
||||
<div class="row c9 top15 flex">
|
||||
<button id="save" class="btn btn-default">
|
||||
<i class="la la-save"></i> Актуализация
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<script src="/_public/assets/js/order.js"></script>
|
||||
<script src="/_public/assets/js/file-img.js"></script>
|
||||
<script src="/_public/plugins/cropperJs/cropper.min.js"></script>
|
||||
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
/**
|
||||
* @var \app\models\Help $model
|
||||
*/
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
|
||||
<?php if ($model->id): ?>
|
||||
<div class="btn btn-default" style="width: 280px; text-align: center"
|
||||
onclick="deleteHelpInfo(this)" data-id="<?= $model->id ?>">
|
||||
<i
|
||||
class="la la-trash"></i> Изтрий помощната информация
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<form autocomplete="off">
|
||||
<div class="c10 row top15">
|
||||
<label>Ключ на помощната информация</label>
|
||||
<input readonly name="key" placeholder="Полето се въвежда автоматично" value="<?= $model->key ?>"/>
|
||||
</div>
|
||||
<div class="c10 row top15">
|
||||
<label>Заглавие на помощната информация</label>
|
||||
<input name="title" placeholder="Въведи заглавие на помощната информация" value="<?= $model->title ?>"/>
|
||||
</div>
|
||||
<div class="c10 row top15">
|
||||
<label>Текст</label>
|
||||
<textarea class="ckEditor" name="text"
|
||||
placeholder="Въведи текст на помощната информация"><?= $model->text ?></textarea>
|
||||
</div>
|
||||
<div class="row c9 top15 flex">
|
||||
<?= Includes::formButtons('index/help') ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
|
||||
<script>
|
||||
function deleteHelpInfo(e) {
|
||||
let id = e.dataset.id
|
||||
modal.confirm('Сигурни ли сте, че искате да изтриете помощната информация', () => {
|
||||
request({
|
||||
url: '/admin-global/help-keys-remote/delete-help/',
|
||||
post: {id},
|
||||
done: r => {
|
||||
if (r.url_to) {
|
||||
window.location.href = r.url_to
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
use app\models\ExplorerObjects;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
$_GET['tab'] = $tab;
|
||||
|
||||
$filter = Yii::$app->getFilterData('and');
|
||||
|
||||
$filter[0] = 'and';
|
||||
|
||||
TableWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Обекти за стани изследовател',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
'new' => 'Нов обект',
|
||||
'edit' => 'Редакция обект',
|
||||
'delete' => 'Изтриване обект'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c0 text-right',
|
||||
'Име на обект' => '',
|
||||
'Бр. точки' => ''
|
||||
],
|
||||
'model' => ExplorerObjects::class,
|
||||
'data' => ExplorerObjects::find()->where(Yii::$app->getFilterData('and'))->loop([
|
||||
'id',
|
||||
function (ExplorerObjects $model) {
|
||||
if($model->tourObject)
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->tourObject->name . '</a>';
|
||||
},
|
||||
'points'
|
||||
], $_GET['p'] ?? 1, 50)
|
||||
]);
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нов туристически обект',
|
||||
'title_edit' => 'Редакция туристически обект',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'mobile-app/become-an-explorer-objects' => 'Стани изследовател обекти',
|
||||
],
|
||||
],
|
||||
'tabs' => $tabs ?? [],
|
||||
'writeView' => "mobile-app/tabs/" . Includes::tab($tab) . "/tour_objects_w",
|
||||
'model' => ExplorerObjects::class,
|
||||
'validation' => function ($p) {
|
||||
if (empty($p->{'tour_object_id'})) {
|
||||
return ['tour_object_id' => 'Моля, изберете туристически обект'];
|
||||
} else {
|
||||
$filter = ['tour_object_id' => $p->tour_object_id];
|
||||
if(!empty($_GET['id']))
|
||||
$filter = ['and', ['=', 'tour_object_id', $p->tour_object_id], ['!=', 'id', $_GET['id']]];
|
||||
$exists = ExplorerObjects::find()->where($filter)->exists();
|
||||
if($exists)
|
||||
return ['tour_object_id' => 'Туристическия обект вече е добавен, моля изберете друг'];
|
||||
}
|
||||
if (empty($p->{'points'}))
|
||||
return ['points' => 'Моля, попълнете брой точки за получаване при посещение на туристическия обект.'];
|
||||
},
|
||||
'postService' => function ($p, ExplorerObjects $model) use ($tab) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Данните са записани успешно' : 'Данните са създадени успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
+111
@@ -0,0 +1,111 @@
|
||||
<?php
|
||||
|
||||
use app\models\TourObjects;
|
||||
|
||||
/**
|
||||
* @var $model TourObjects;
|
||||
*/
|
||||
$lat = $model->latitude ?? 42.698334;
|
||||
$lon = $model->longitude ?? 23.319941;
|
||||
?>
|
||||
<link rel="stylesheet" href="/_public/plugins/leafletjs/leaflet.css">
|
||||
<script src="/_public/plugins/leafletjs/leaflet.js"></script>
|
||||
<style>
|
||||
.search-location {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.search-location .result {
|
||||
position: absolute;
|
||||
top: 40px;
|
||||
left: 0;
|
||||
background: #FFFFFF;
|
||||
z-index: 10000000;
|
||||
padding: 5px;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.search-location .result .row-result {
|
||||
padding: 5px;
|
||||
border: 1px solid #ccc;
|
||||
background: #f1f1f1;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
#map {
|
||||
width: 100%;
|
||||
height: 800px;
|
||||
border: 1px solid var(--base-background-dark);
|
||||
border-radius: 5px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
</style>
|
||||
<div class="search-location c6">
|
||||
<input placeholder="Търси">
|
||||
<div class="result"></div>
|
||||
</div>
|
||||
<div id="map"></div>
|
||||
|
||||
<script>
|
||||
|
||||
|
||||
const inputSearchLocation = document.querySelector('.search-location input');
|
||||
const results = document.querySelector('.search-location .result');
|
||||
|
||||
|
||||
let mapOptions = {
|
||||
center: [<?=$lat ?>, <?= $lon ?>],
|
||||
zoom: 13
|
||||
}
|
||||
let map = new L.map('map', mapOptions);
|
||||
let layer = new L.TileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png');
|
||||
map.addLayer(layer);
|
||||
let marker = new L.Marker([<?=$lat?>, <?= $lon?>]);
|
||||
marker.addTo(map);
|
||||
|
||||
map.on('click', function(e){
|
||||
let coord = e.latlng;
|
||||
let lat = coord.lat;
|
||||
let lon = coord.lng;
|
||||
setNewLocation({lat, lon})
|
||||
});
|
||||
|
||||
inputSearchLocation.addEventListener('keyup', () => {
|
||||
request({
|
||||
url: `https://nominatim.openstreetmap.org/search.php?q=${inputSearchLocation.value}&accept-language=bg&countrycodes=bg&limit=10&format=jsonv2`,
|
||||
done: res => {
|
||||
results.innerHTML = '';
|
||||
res = res || [];
|
||||
res.forEach(r => {
|
||||
let row = document.createElement('div')
|
||||
row.className = 'row-result';
|
||||
console.log(r);
|
||||
row.innerHTML = `<span>${r.display_name}</span>`;
|
||||
row.addEventListener('click', function () {
|
||||
if (r.lat && r.lon) {
|
||||
setNewLocation(r)
|
||||
}
|
||||
})
|
||||
results.appendChild(row)
|
||||
})
|
||||
if (res.length > 0) {
|
||||
results.style.display = 'block'
|
||||
} else {
|
||||
results.style.display = 'none'
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
function setNewLocation(r) {
|
||||
document.querySelector('[name="latitude"]').value = r.lat
|
||||
document.querySelector('[name="longitude"]').value = r.lon
|
||||
marker.setLatLng([r.lat, r.lon])
|
||||
let latLon = [marker.getLatLng()];
|
||||
let markerBounds = L.latLngBounds(latLon);
|
||||
map.fitBounds(markerBounds);
|
||||
|
||||
results.innerHTML = ''
|
||||
results.style.display = 'none'
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1 @@
|
||||
<?php
|
||||
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
use app\models\TourObjects;
|
||||
use app\widgets\FileWidget;
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
/**
|
||||
* @var \app\models\ExplorerObjects $model
|
||||
*/
|
||||
$media_key = $model->getMediaKey();
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
<form autocomplete="off">
|
||||
<div class="c10 row top15">
|
||||
<label class="require">Туристически обект</label>
|
||||
<div class="flex row row-panel">
|
||||
<select class="search-select-box" name="tour_object_id" style="display: none">
|
||||
<option value="">- Избери туристически обект -</option>
|
||||
<?php foreach (TourObjects::find()->all() as $tObject): ?>
|
||||
<option <?= $model->tour_object_id == $tObject->id ? 'selected' : '' ?>
|
||||
value="<?= $tObject->id ?>"><?= $tObject->name ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="c10 row top15">
|
||||
<label class="require">Бр. точки</label>
|
||||
<input name="points" data-format="integer" value="<?= $model->points ?>">
|
||||
</div>
|
||||
<div class="row top15" style="width: 350px">
|
||||
<label>Изображение</label>
|
||||
<?= FileWidget::widget([
|
||||
'media_type' => 'image',
|
||||
'object_key' => 'explorer_object_image',
|
||||
'media_key' => $media_key,
|
||||
'files' => $model->getFiles('thumb'),
|
||||
'actions' => [
|
||||
'add' => 'Добавяне',
|
||||
'edit' => 'Редакция',
|
||||
'delete' => 'Премахване'
|
||||
],
|
||||
'single_file' => true,
|
||||
'resolutions' => ['1:1'],
|
||||
'max_file_size' => 2,
|
||||
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
|
||||
]) ?>
|
||||
</div>
|
||||
<div class="row c9 top15 flex">
|
||||
<?= Includes::formButtons('mobile-app/become-an-explorer-objects') ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<script src="/_public/assets/js/order.js"></script>
|
||||
<script src="/_public/assets/js/file-img.js"></script>
|
||||
<script src="/_public/plugins/cropperJs/cropper.min.js"></script>
|
||||
<script src="/_public/assets/js/search-box.js"></script>
|
||||
<script>
|
||||
all('.search-select-box').forEach(el => {
|
||||
new SearchBox(el)
|
||||
})
|
||||
</script>
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
<?php
|
||||
|
||||
use app\models\UserAdminGlobal;
|
||||
use app\models\UserPublic;
|
||||
use app\services\Auth;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$filter = [];
|
||||
|
||||
$filter['is_mobile_user'] = 1;
|
||||
|
||||
$u = Auth::userAdminGlobal();
|
||||
|
||||
TableWidget::widget([
|
||||
'filter' => [
|
||||
['email' => ['Ел. поща', 'c3']]
|
||||
],
|
||||
'top' => [
|
||||
'title' => 'Потребители мобилно приложение',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'mobile-app/become-an-explorer-objects' => 'Мобилно приложение',
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
//'new' => 'Нов потребител',
|
||||
//'edit' => 'Редакция потребител',
|
||||
//'delete' => 'Изтриване потребител',
|
||||
'export' => 'Експорт (csv)'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c0 text-right',
|
||||
'Ел. поща' => 'c3',
|
||||
'Име' => '',
|
||||
'Клубна карта' => 'c1 ct',
|
||||
'Бр. точки' => 'c1 ct',
|
||||
'Активен' => 'c02 ct'
|
||||
],
|
||||
'data' => UserPublic::find()->where($filter)->andWhere(Yii::$app->getFilterData())->orderBy(['id' => SORT_DESC])->loop([
|
||||
'id',
|
||||
function (UserPublic $model) {
|
||||
return '<a href="?o=w&id=' . $model->id . '">' . $model->email . '</a>';
|
||||
},
|
||||
'full_name',
|
||||
function (UserPublic $model) {
|
||||
return $model->club_card ? '<span style="color: green">да</span>' : '<span style="color: darkred">не</span>';
|
||||
},
|
||||
function (UserPublic $model) {
|
||||
return $model->getExplorerObjectsSumPoints();
|
||||
},
|
||||
function (UserPublic $model) {
|
||||
return $model->statusSwitch('is_active', null, ['Потребителя е активиран', 'Потребителя е деактивиран']);
|
||||
},
|
||||
], $_GET['p'] ?? 1, 30),
|
||||
//'ignoreIds' => [$u->id],
|
||||
'exportData' => function () {
|
||||
return [
|
||||
'header' => [
|
||||
'ID' => ['integer', 10],
|
||||
'E-mail' => ['string', 50],
|
||||
'Име и фамилия' => ['string', 50],
|
||||
],
|
||||
'data' => UserPublic::find()->where(Yii::$app->getFilterData())->orderBy(['full_name' => SORT_ASC])->loop([
|
||||
'id',
|
||||
'full_name',
|
||||
'email',
|
||||
]),
|
||||
'file_name' => 'Потребители_публичен_портал' . date('Y_m_d_H_i')
|
||||
];
|
||||
}
|
||||
]);
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Потребител',
|
||||
'title_edit' => 'Преглед на потребител',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'mobile-app/become-an-explorer-objects' => 'Мобилно приложение',
|
||||
'mobile-app/users' => 'Потребители',
|
||||
]
|
||||
],
|
||||
'writeView' => 'mobile-app/tabs/main/public-user_w',
|
||||
'model' => UserPublic::class,
|
||||
]);
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
use app\widgets\TableWidget;
|
||||
use app\models\register\Fields;
|
||||
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
|
||||
|
||||
TableWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Номенклатури',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало'
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
//'new' => 'Нова категория',
|
||||
//'edit' => 'Редакция на категория',
|
||||
//'delete' => 'Изтриване на категория'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c0 text-right',
|
||||
'Номенклатура' => '',
|
||||
],
|
||||
'data' => Fields::find()->where(['parent_id' => 0])->orderBy(['id' => SORT_DESC])->loop([
|
||||
'id',
|
||||
function (Fields $model) {
|
||||
return $model->name;
|
||||
},
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
@@ -0,0 +1,105 @@
|
||||
<?php
|
||||
|
||||
use app\models\Categories;
|
||||
use app\models\History;
|
||||
use app\models\Partner;
|
||||
use app\services\Auth;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$model = Categories::getModel();
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
|
||||
|
||||
TableWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Категории',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало'
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
'new' => 'Нова категория',
|
||||
'edit' => 'Редакция на категория',
|
||||
'delete' => 'Изтриване на категория'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c0 text-right',
|
||||
'Наименование на категория (bg)' => '',
|
||||
'Наименование на категория (en)' => '',
|
||||
],
|
||||
'data' => Categories::find()->where(['IS', 'parent_id', NULL])->orderBy(['id' => SORT_DESC])->loop([
|
||||
'id',
|
||||
function (Categories $model) {
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
|
||||
},
|
||||
function (Categories $model) {
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->ts_en_name . '</a>';
|
||||
},
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нова категория',
|
||||
'title_edit' => 'Редакция на категория',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'nomenclature/categories' => 'Номенклатури - Категории'
|
||||
],
|
||||
],
|
||||
'tabs' => $tabs ?? [],
|
||||
'writeView' => empty($_GET['id']) && empty($_GET['type']) ? "nomenclature/tabs/main/categories_w" : "nomenclature/tabs/" . Includes::tab($tab) . "/categories_w",
|
||||
'model' => Categories::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
if ($tab == 'main') {
|
||||
if (empty($p->{'name'}))
|
||||
return ["name" => 'Моля, въведете наименование на категорията'];
|
||||
if (empty($p->{'ts_en_name'}))
|
||||
return ["ts_en_name" => 'Моля, въведете наименование на категорията на английски'];
|
||||
|
||||
if (isset($p->{'sub'})) {
|
||||
foreach ($p->{'sub'} as $indexId => $value) {
|
||||
if (empty($p->{'sub'}{$indexId}{'name'}))
|
||||
return ["sub[$indexId][name]" => 'Моля, въведете наименование на подкатегорията'];
|
||||
if (empty($p->{'sub'}{$indexId}{'ts_en_name'}))
|
||||
return ["sub[$indexId][ts_en_name]" => 'Моля, въведете наименование на подкатегорията'];
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, Categories $model) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
if (!empty($p->{'sub'})) {
|
||||
$orderIndex = 0;
|
||||
if ($model->id) {
|
||||
$last = Categories::find()->where(['parent_id' => $model->id])->orderBy(['order_index' => SORT_DESC])->one();
|
||||
if ($last)
|
||||
$orderIndex = $last->order_index;
|
||||
}
|
||||
|
||||
foreach ($p->{'sub'} as $id => $name) {
|
||||
$catToUpdate = empty($_GET['id']) ? new Categories() : Categories::findOne($id);
|
||||
if ($catToUpdate) {
|
||||
$catToUpdate->name = $name['name'];
|
||||
$catToUpdate->ts_en_name = $name['ts_en_name'];
|
||||
$catToUpdate->parent_id = $model->id;
|
||||
if (empty($catToUpdate->id))
|
||||
$catToUpdate->order_index = $orderIndex;
|
||||
$catToUpdate->save();
|
||||
if (empty($name['object_types_list'])) {
|
||||
$catToUpdate->updateObjectTypes([]);
|
||||
} else {
|
||||
$catToUpdate->updateObjectTypes($name['object_types_list']);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
History::addNew($model->id, 'categories', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Категорията е актуализирана успешно' : 'Категорията е създадена успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,110 @@
|
||||
<?php
|
||||
|
||||
use app\models\Collections;
|
||||
use app\models\History;
|
||||
use app\services\Auth;
|
||||
use app\services\Formatter;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$model = Collections::getModel();
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
|
||||
$tabs = [
|
||||
'main' => '<i class="la la-database"></i> Основни данни',
|
||||
'ts_en' => '<i class="lg lg-en"></i> Превод английски',
|
||||
'media' => '<i class="la la-file-movie-o"></i> Медия файлове'
|
||||
];
|
||||
|
||||
|
||||
TableWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Колекции на обекти',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало'
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
'new' => 'Нова колекция',
|
||||
'edit' => 'Редакция на колекция',
|
||||
'delete' => 'Изтриване на колекция'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c0 text-right',
|
||||
'Име на колекция' => '',
|
||||
'История' => 'c1 ct',
|
||||
'Добавена в избрани' => 'c1 ct',
|
||||
'Публикувана' => 'c1 ct',
|
||||
'Дата на публикуване' => 'c1 ct',
|
||||
],
|
||||
'data' => Collections::find()->where([])->orderBy(['id' => SORT_DESC])->loop([
|
||||
'id',
|
||||
function (Collections $model) {
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
|
||||
},
|
||||
|
||||
function (Collections $model) {
|
||||
return '<i data-table="collections" data-id="' . $model->id . '" class="la la-history historyButton"></i>';
|
||||
},
|
||||
function (Collections $model) {
|
||||
return $model->statusSwitch('is_selected', null, ['Колекцията е добавена в избрани', 'Колекцията е махната от избрани']);
|
||||
},
|
||||
function (Collections $model) {
|
||||
return $model->statusSwitch('is_active', null, ['Колекцията е видима на сайта', 'Колекцията е свалена от сайта']);
|
||||
},
|
||||
function (Collections $model) {
|
||||
if ($model->publish_date)
|
||||
return Formatter::date($model->publish_date);
|
||||
},
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нова колекция',
|
||||
'title_edit' => 'Редакция на колекция',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'nomenclature/collections' => 'Колекции на обекти'
|
||||
],
|
||||
],
|
||||
'tabs' => $tabs ?? [],
|
||||
'writeView' => "nomenclature/tabs/" . Includes::tab($tab) . "/collections_w",
|
||||
'model' => Collections::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
if ($tab == 'main') {
|
||||
if (empty($p->{'name'}))
|
||||
return ["name" => 'Моля, въведете име на колекцията'];
|
||||
if (empty($p->{'ts_en_name'}))
|
||||
return ["ts_en_name" => 'Моля, въведете име на колекцията на английски'];
|
||||
if (empty($p->{'annotation'}))
|
||||
return ["annotation" => 'Моля, въведете анотация на колекцията'];
|
||||
if (empty($p->{'description'}))
|
||||
return ["description" => 'Моля, въведете описание на колекцията'];
|
||||
if (empty($p->{'partner_id'}))
|
||||
return ["partner_id" => 'Моля, изберете партноьор, който представя колекцията'];
|
||||
if (empty($p->{'info_center'}))
|
||||
return ["info_center" => 'Моля, попълнете име на информационен център'];
|
||||
if (empty($p->{'info_center_address'}))
|
||||
return ["info_center_address" => 'Моля, попълнете адрес на информационен център'];
|
||||
} else if (Includes::inLocales($tab)) {
|
||||
if (empty($p->{$tab . '_annotation'}))
|
||||
return [$tab . "_annotation" => 'Моля, въведете анотация на колекцията'];
|
||||
if (empty($p->{$tab . '_description'}))
|
||||
return [$tab . "_description" => 'Моля, въведете описание на колекцията'];
|
||||
if (empty($p->{$tab . '_info_center'}))
|
||||
return [$tab . "_info_center" => 'Моля, попълнете име на информационен център'];
|
||||
if (empty($p->{$tab . '_info_center_address'}))
|
||||
return [$tab . "_info_center_address" => 'Моля, попълнете адрес на информационен център'];
|
||||
}
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, Collections $model) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
History::addNew($model->id, 'collections', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Колекцията е актуализирана успешно' : 'Колекцията е създадена успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,101 @@
|
||||
<?php
|
||||
|
||||
use app\models\Categories;
|
||||
use app\models\CommonFields;
|
||||
use app\models\History;
|
||||
use app\services\Auth;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$model = CommonFields::getModel();
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
|
||||
|
||||
TableWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Общи номенклатури',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'nomenclature/categories' => 'Номенклатури',
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
'new' => 'Ново поле',
|
||||
'edit' => 'Редакция на поле',
|
||||
'delete' => 'Изтриване на поле'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c0 text-right',
|
||||
'Име на поле (bg)' => '',
|
||||
'Множествено избиране' => 'c1 ct',
|
||||
],
|
||||
'data' => CommonFields::find()->where(['IS', 'parent_id', NULL])->orderBy(['id' => SORT_DESC])->loop([
|
||||
'id',
|
||||
function (CommonFields $model) {
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
|
||||
},
|
||||
function (CommonFields $model) {
|
||||
return $model->statusSwitch('multiple_filters', null, ['Добавена е възможност за многежествено избиране при филтриране', 'Премахната е възможност за многежествено избиране при филтриране']);
|
||||
},
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Ново поле',
|
||||
'title_edit' => 'Редакция на поле',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'nomenclature/categories' => 'Номенклатури',
|
||||
'nomenclature/common-fields' => 'Общи номенклатури',
|
||||
],
|
||||
],
|
||||
'tabs' => $tabs ?? [],
|
||||
'writeView' => empty($_GET['id']) && empty($_GET['type']) ? "nomenclature/tabs/main/common_fields_w" : "nomenclature/tabs/" . Includes::tab($tab) . "/common_fields_w",
|
||||
'model' => CommonFields::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
if ($tab == 'main') {
|
||||
if (empty($p->{'name'}))
|
||||
return ["name" => 'Моля, въведете име на полето'];
|
||||
if (empty($p->{'ts_en_name'}))
|
||||
return ["ts_en_name" => 'Моля, въведете име на полето'];
|
||||
|
||||
if (isset($p->{'sub'})) {
|
||||
foreach ($p->{'sub'} as $indexId => $value) {
|
||||
if (empty($p->{'sub'}{$indexId}{'name'}))
|
||||
return ["sub[$indexId][name]" => 'Моля, въведете име на полето'];
|
||||
if (empty($p->{'sub'}{$indexId}{'ts_en_name'}))
|
||||
return ["sub[$indexId][ts_en_name]" => 'Моля, въведете име на полето'];
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, CommonFields $model) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
if (!empty($p->{'sub'})) {
|
||||
$orderIndex = 0;
|
||||
if ($model->id) {
|
||||
$last = CommonFields::find()->where(['parent_id' => $model->id])->orderBy(['order_index' => SORT_DESC])->one();
|
||||
if ($last)
|
||||
$orderIndex = $last->order_index;
|
||||
}
|
||||
foreach ($p->{'sub'} as $id => $name) {
|
||||
$catToUpdate = empty($_GET['id']) ? new CommonFields() : CommonFields::findOne($id);
|
||||
if ($catToUpdate) {
|
||||
$catToUpdate->name = $name['name'];
|
||||
$catToUpdate->ts_en_name = $name['ts_en_name'];
|
||||
$catToUpdate->parent_id = $model->id;
|
||||
if (empty($catToUpdate->id))
|
||||
$catToUpdate->order_index = $orderIndex;
|
||||
$catToUpdate->save();
|
||||
}
|
||||
}
|
||||
}
|
||||
History::addNew($model->id, 'common-fields', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Номенклатурата е актуализирана успешно' : 'Номенклатурата е създадена успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,147 @@
|
||||
<?php
|
||||
|
||||
use app\models\History;
|
||||
use app\models\ObjectTemplate;
|
||||
use app\models\ObjectTemplateField;
|
||||
use app\services\Auth;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$model = ObjectTemplate::getModel();
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
TableWidget::widget([
|
||||
'filter' => [
|
||||
[
|
||||
'heritage_type' => ['Вид наследсво', 'c3', ObjectTemplate::heritageTypes()],
|
||||
'name' => ['Наименование', 'c2'],
|
||||
],
|
||||
],
|
||||
'top' => [
|
||||
'title' => 'Видове обекти',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'nomenclature/categories' => 'Номенклатури',
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
'new' => 'Нов вид обект',
|
||||
'edit' => 'Редакция на вид обект',
|
||||
'delete' => 'Изтриване на вид обект'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c0 text-right',
|
||||
'Наименование на вид обект' => '',
|
||||
'Вид наследсво' => '',
|
||||
'Категории' => '',
|
||||
'Полета' => ''
|
||||
],
|
||||
'data' => ObjectTemplate::find()->andWhere(Yii::$app->getFilterData('or'))->orderBy(['id' => SORT_DESC])->loop([
|
||||
'id',
|
||||
function (ObjectTemplate $model) {
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
|
||||
},
|
||||
function (ObjectTemplate $model) {
|
||||
if ($model->heritage_type)
|
||||
return ObjectTemplate::heritageTypes($model->heritage_type);
|
||||
},
|
||||
function (ObjectTemplate $model) {
|
||||
return $model->categoryConcatList;
|
||||
},
|
||||
function (ObjectTemplate $model) {
|
||||
if (!empty($model->objectTemplateFields)) {
|
||||
$objectTemplateFields = [];
|
||||
foreach ($model->objectTemplateFields as $objectTemplateField)
|
||||
$objectTemplateFields[] = '<span style="margin: 1px !important; display: inline-block; font-size: 11px; background: var(--base-background-dark); color: #fff; padding: 2px 3px; border-radius: 4px">' . $objectTemplateField->name . '</span>';
|
||||
return implode(' ', $objectTemplateFields);
|
||||
}
|
||||
}
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нов вид обект',
|
||||
'title_edit' => 'Редакция на вид обект',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'nomenclature/categories' => 'Номенклатури',
|
||||
'nomenclature/object-templates' => 'Видове обекти'
|
||||
],
|
||||
],
|
||||
'tabs' => $tabs ?? [],
|
||||
'writeView' => empty($_GET['id']) && empty($_GET['type']) ? "nomenclature/tabs/main/object_templates_w" : "nomenclature/tabs/" . Includes::tab($tab) . "/object_templates_w",
|
||||
'model' => ObjectTemplate::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
if ($tab == 'main') {
|
||||
if (empty($p->{'name'}))
|
||||
return ["name" => 'Моля, въведете наименованието на вида обект'];
|
||||
if (empty($p->{'ts_en_name'}))
|
||||
return ["ts_en_name" => 'Моля, въведете наименованието на вида обект на английски'];
|
||||
|
||||
if (empty($p->{'heritage_type'}))
|
||||
return ["heritage_type" => 'Моля, изберете вид наследство'];
|
||||
|
||||
if (ObjectTemplate::exists(['name' => $p->{'name'}]))
|
||||
return ["name" => 'Обект с това наименование вече съществува'];
|
||||
|
||||
if (ObjectTemplate::exists(['ts_en_name' => $p->{'ts_en_name'}]))
|
||||
return ["ts_en_name" => 'Обект с това наименование вече съществува'];
|
||||
|
||||
if (isset($p->{'sub'})) {
|
||||
foreach ($p->{'sub'} as $indexId => $value) {
|
||||
if (empty($p->{'sub'}{$indexId}{'name'}))
|
||||
return ["sub[$indexId][name]" => 'Моля, въведете наименование на полето'];
|
||||
if (empty($p->{'sub'}{$indexId}{'ts_en_name'}))
|
||||
return ["sub[$indexId][ts_en_name]" => 'Моля, въведете наименование на полето'];
|
||||
if (empty($p->{'sub'}{$indexId}{'user_interface_type'}))
|
||||
return ["sub[$indexId][user_interface_type]" => 'Моля, изберете тип на стойността'];
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, ObjectTemplate $model) {
|
||||
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
if (!empty($p->{'sub'})) {
|
||||
foreach ($p->{'sub'} as $id => $name) {
|
||||
$objectTemplateField = empty($_GET['id']) ? new ObjectTemplateField() : ObjectTemplateField::findOne($id);
|
||||
$objectTemplateField->ot_id = $model->id;
|
||||
$objectTemplateField->name = $name['name'];
|
||||
$objectTemplateField->ts_en_name = $name['ts_en_name'];
|
||||
$objectTemplateField->is_filter = empty($name['is_filter']) ? null : 1;
|
||||
$objectTemplateField->user_interface_type = $name['user_interface_type'];
|
||||
$userInterfaceTypeId = (int)$name['user_interface_type'];
|
||||
if ($userInterfaceTypeId != 0) {
|
||||
$objectTemplateField->common_field_id = $name['user_interface_type'];
|
||||
} else {
|
||||
$objectTemplateField->common_field_id = null;
|
||||
}
|
||||
//$objectTemplateField->data_type = $name['data_type'];
|
||||
if (empty($_GET['id']))
|
||||
$objectTemplateField->order_index = ObjectTemplateField::getNextOrderIndex($model->id);
|
||||
$objectTemplateField->save();
|
||||
if (empty($_GET['id']) && !empty($name['select_data'])) {
|
||||
foreach (json_decode($name['select_data']) as $stdObject) {
|
||||
$objectTemplateFieldOption = new ObjectTemplateField();
|
||||
if (isset($stdObject->{'bg'}))
|
||||
$objectTemplateFieldOption->name = $stdObject->{'bg'};
|
||||
if (isset($stdObject->{'en'}))
|
||||
$objectTemplateFieldOption->ts_en_name = $stdObject->{'en'};
|
||||
if ($objectTemplateFieldOption->name) {
|
||||
$objectTemplateFieldOption->parent_id = $objectTemplateField->id;
|
||||
$objectTemplateFieldOption->save();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
History::addNew($model->id, 'object_template', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Вида обект е актуализирана успешно' : 'Вида обект е създадена успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,282 @@
|
||||
<?php
|
||||
|
||||
use app\models\Categories;
|
||||
use app\models\CategoriesOt;
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
/**
|
||||
* @var Categories $model
|
||||
*/
|
||||
$media_key = $model->getMediaKey();
|
||||
$min = 1;
|
||||
$max = 30;
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
<form autocomplete="off">
|
||||
<div class="flex top15 c8">
|
||||
<div class="row c6 right10">
|
||||
<label class="require">Наименование на категория (BG)</label>
|
||||
<input name="name" placeholder="Въведи наименование на основна категория"
|
||||
value="<?= $model->name ?>"/>
|
||||
</div>
|
||||
<div class="row c6">
|
||||
<label class="require">Наименование на категория (EN)</label>
|
||||
<input name="ts_en_name" placeholder="Въведи наименование на основна категория"
|
||||
value="<?= $model->ts_en_name ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="row c5 top15">
|
||||
<?php if ($model->id): ?>
|
||||
<div onclick="addSubCategory(this)" data-id="<?= $model->id ?>"
|
||||
class="btn-ib btn-default">
|
||||
<i class="la la-plus-circle"></i> Добавяне на подкатегория
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<div onclick="addNewSubcategory()"
|
||||
class="btn-ib btn-default">
|
||||
<i class="la la-plus-circle"></i> Добавяне на подкатегория
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<div id="bDelete" data-model="app\models\Categories" onclick="checkDelete(this)"
|
||||
class="btn-ib btn-default ct disabled">
|
||||
<i class="la la-trash-o"></i> Изтриване на подкатегории <span id="delCount">(0)</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="c12 top15">
|
||||
<table class="cms-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="text-right">
|
||||
<input id="checkAll" onclick="checkAllCategories(this)" title="Избери всички"
|
||||
class="delete-checkbox" type="checkbox">
|
||||
No
|
||||
</th>
|
||||
<th>Подкатегория (BG)</th>
|
||||
<th>Подкатегория (EN)</th>
|
||||
<th class="c4">Видове обекти</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="sub-categories">
|
||||
<?php
|
||||
foreach ($model->subCategories as $i => $subCategory): ?>
|
||||
<tr class="sub-categories" draggable="true" data-index="<?= $subCategory->order_index ?>">
|
||||
<td class="text-right c1" style="width: 50px">
|
||||
<input onclick="checkSingle(this)" data-del="<?= $subCategory->id ?>"
|
||||
class="delete-checkbox"
|
||||
type="checkbox"
|
||||
style="top: calc(50% - 10px)">
|
||||
<span class="sub-number"><?= $i + 1 ?></span>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="sub[<?= $subCategory->id ?>][name]"
|
||||
value="<?= $subCategory->name ?>">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="sub[<?= $subCategory->id ?>][ts_en_name]"
|
||||
value="<?= $subCategory->ts_en_name ?>">
|
||||
</td>
|
||||
<td>
|
||||
<select style="display:none;" class="search-select-box" multiple
|
||||
name="sub[<?= $subCategory->id ?>][object_types_list][]">
|
||||
<option disabled value="">-- избери видове обекти --</option>
|
||||
<?php foreach ($subCategory->getObjectTemplateList() as $item): ?>
|
||||
<option <?= $item['selected'] ?>
|
||||
value="<?= $item['id'] ?>"><?= $item['name'] ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="row c9 top15 flex">
|
||||
<?= Includes::formButtons('nomenclature/categories') ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<script src="/_public/assets/js/order.js"></script>
|
||||
<script src="/_public/assets/js/search-box.js"></script>
|
||||
<script>
|
||||
|
||||
var objectTypes = '';
|
||||
|
||||
try {
|
||||
objectTypes = '<?= json_encode(CategoriesOt::getObjectTemplateList(true)) ?>'
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
|
||||
all('.search-select-box').forEach(el => {
|
||||
new SearchBox(el)
|
||||
})
|
||||
|
||||
orderItems('.sub-categories', '/update-category-indexes/', function () {
|
||||
var index = 0
|
||||
all('.sub-categories .sub-number').forEach(e => {
|
||||
e.innerText = ++index
|
||||
console.log(e.innerText)
|
||||
})
|
||||
});
|
||||
|
||||
function validateNumber(e, min, max) {
|
||||
if (e.value !== '') {
|
||||
if (e.value < min)
|
||||
e.value = min;
|
||||
if (e.value > max)
|
||||
e.value = max;
|
||||
}
|
||||
}
|
||||
|
||||
let sl = [];
|
||||
|
||||
function checkAllCategories(el) {
|
||||
sl = [];
|
||||
all('td [data-del]').forEach(e => {
|
||||
e.checked = el.checked === true;
|
||||
if (el.checked) {
|
||||
sl.push(e.dataset.del);
|
||||
e.parentNode.parentNode.addClass('checked');
|
||||
} else {
|
||||
e.parentNode.parentNode.removeClass('checked');
|
||||
}
|
||||
|
||||
})
|
||||
updateActionButtons();
|
||||
}
|
||||
|
||||
function checkSingle(e) {
|
||||
if (e.checked) {
|
||||
sl.push(e.dataset.del);
|
||||
e.parentNode.parentNode.addClass('checked');
|
||||
} else {
|
||||
one('#checkAll').checked = false;
|
||||
e.parentNode.parentNode.removeClass('checked');
|
||||
const f = sl.indexOf(e.dataset.del);
|
||||
sl.splice(f, 1);
|
||||
}
|
||||
updateActionButtons(e.dataset.del);
|
||||
}
|
||||
|
||||
function updateActionButtons() {
|
||||
const bDelete = one('#bDelete');
|
||||
const delCount = one('#delCount');
|
||||
const c = sl.length;
|
||||
if (delCount)
|
||||
delCount.innerText = '(' + c + ')';
|
||||
if (c > 0) {
|
||||
if (bDelete)
|
||||
bDelete.removeClass('disabled');
|
||||
} else {
|
||||
if (bDelete)
|
||||
bDelete.addClass('disabled');
|
||||
}
|
||||
}
|
||||
|
||||
function checkDelete(e) {
|
||||
const msg = 'Сигурни ли сте, че искате да изтриете ' + (sl.length > 1 ? 'тези ' + sl.length + ' записа?' : 'този запис?');
|
||||
modal.confirm(msg, () => {
|
||||
console.log(sl)
|
||||
all('tbody .delete-checkbox:checked').forEach(e => {
|
||||
e.parentNode.parentNode.remove();
|
||||
})
|
||||
|
||||
all('tbody .delete-checkbox').forEach((e, i) => {
|
||||
const number = e.parentNode.querySelector('span');
|
||||
number.innerHTML = (i + 1).toString()
|
||||
})
|
||||
const slValues = [];
|
||||
sl.forEach(v => {
|
||||
if (v) {
|
||||
slValues.push(v);
|
||||
}
|
||||
})
|
||||
if (slValues.length > 0) {
|
||||
request({
|
||||
url: window.location.href.split('?')[0] + '?o=d',
|
||||
post: {
|
||||
ids: JSON.stringify(sl),
|
||||
model: e.dataset.model
|
||||
},
|
||||
done: e => {
|
||||
window.location.reload();
|
||||
}
|
||||
})
|
||||
}
|
||||
sl = [];
|
||||
});
|
||||
}
|
||||
|
||||
function addSubCategory(e) {
|
||||
request({
|
||||
url: '/new-sub-category/',
|
||||
post: {
|
||||
parent_id: e.dataset.id
|
||||
},
|
||||
done: e => {
|
||||
//window.location.reload();
|
||||
if (e.id && e.success === true) {
|
||||
addNewSubcategory(e.id, e.orderIndex);
|
||||
flash.success(e.msg, true)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function addNewSubcategory(id, orderIndex) {
|
||||
console.log(id, orderIndex);
|
||||
const tBody = one('#sub-categories');
|
||||
const tCount = tBody.querySelectorAll('tr').length
|
||||
const indexId = id ? id : 'index_' + (tCount + 1)
|
||||
const tr = document.createElement('tr')
|
||||
tr.className = 'sub-categories'
|
||||
tr.setAttribute('draggable', true)
|
||||
tr.setAttribute('data-index', orderIndex)
|
||||
console.log(tr)
|
||||
|
||||
tr.innerHTML = `
|
||||
<td class="text-right c1" style="width: 50px">
|
||||
<input onclick="checkSingle(this)"
|
||||
class="delete-checkbox"
|
||||
type="checkbox"
|
||||
data-del="${id}"
|
||||
style="top: calc(50% - 10px)">
|
||||
<span class="sub-number">${tCount + 1}</span>
|
||||
</td>
|
||||
<td>
|
||||
<input style="width: calc(100% - 20px); margin-left: 5px; height: 20px; padding: 5px"
|
||||
name="sub[${indexId}][name]"
|
||||
value="">
|
||||
</td>
|
||||
<td>
|
||||
<input style="width: calc(100% - 20px); margin-left: 5px; height: 20px; padding: 5px"
|
||||
name="sub[${indexId}][ts_en_name]"
|
||||
value="">
|
||||
</td>
|
||||
<td>
|
||||
<select style="display:none;" class="search-select-box" multiple name="sub[${indexId}][object_types_list][]">
|
||||
<option disabled value="">-- избери видове обекти --</option>
|
||||
${objectTypes}
|
||||
</select>
|
||||
</td>
|
||||
`
|
||||
|
||||
//console.log(tr);
|
||||
|
||||
tBody.appendChild(tr);
|
||||
new SearchBox(tr.querySelector('select'))
|
||||
orderItem(tr, function () {
|
||||
var index = 0
|
||||
all('.sub-categories .sub-number').forEach(e => {
|
||||
e.innerText = ++index
|
||||
console.log(e.innerText)
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
use app\models\Collections;
|
||||
use app\models\Partner;
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
/**
|
||||
* @var Collections $model
|
||||
*/
|
||||
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
<form autocomplete="off">
|
||||
<div class="flex top15 c9">
|
||||
<div class="row c6 right10">
|
||||
<label class="require">Наименование на колекция (BG)</label>
|
||||
<input name="name" placeholder="Въведи наименование на колекция"
|
||||
value="<?= $model->name ?>"/>
|
||||
</div>
|
||||
<div class="row c6">
|
||||
<label class="require">Наименование на колекция (EN)</label>
|
||||
<input name="ts_en_name" placeholder="Въведи наименование на колекция"
|
||||
value="<?= $model->ts_en_name ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c9 top15">
|
||||
<label class="require">Анотация</label>
|
||||
<textarea class="ckEditor" name="annotation"><?= $model->{'annotation'} ?></textarea>
|
||||
</div>
|
||||
<div class="row c9 top15">
|
||||
<label class="require">Описание</label>
|
||||
<textarea class="ckEditor" name="description"><?= $model->{'description'} ?></textarea>
|
||||
</div>
|
||||
<div class="row c9 top15">
|
||||
<label class="require">Партньор</label>
|
||||
<select name="partner_id">
|
||||
<option selected disabled value="">-- Изберете партньор--</option>
|
||||
<?php foreach (Partner::partnerList() as $id => $name): ?>
|
||||
<option <?= $model->partner_id == $id ? 'selected': ''?> value="<?= $id ?>"><?= $name ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="row c9 top15">
|
||||
<label class="require">Информационен център</label>
|
||||
<input name="info_center" placeholder="Въведи наименование на информационен център"
|
||||
value="<?= $model->info_center ?>"/>
|
||||
</div>
|
||||
<div class="row c9 top15">
|
||||
<label class="require">Информационен център адрес</label>
|
||||
<input name="info_center_address" placeholder="Въведи адрес на информационен център"
|
||||
value="<?= $model->info_center_address ?>"/>
|
||||
</div>
|
||||
<div class="row flex c9 top15">
|
||||
<?= Includes::formButtons('nomenclature/collections') ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
+258
@@ -0,0 +1,258 @@
|
||||
<?php
|
||||
|
||||
use app\models\Categories;
|
||||
use app\models\CategoriesOt;
|
||||
use app\models\CommonFields;
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
/**
|
||||
* @var CommonFields $model
|
||||
*/
|
||||
$media_key = $model->getMediaKey();
|
||||
$min = 1;
|
||||
$max = 30;
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
<form autocomplete="off">
|
||||
<div class="flex top15 c8">
|
||||
<div class="row c6 right10">
|
||||
<label class="require">Наименование на поле (BG)</label>
|
||||
<input name="name" placeholder="Въведи наименование поле"
|
||||
value="<?= $model->name ?>"/>
|
||||
</div>
|
||||
<div class="row c6">
|
||||
<label class="require">Наименование на поле (EN)</label>
|
||||
<input name="ts_en_name" placeholder="Въведи наименование на основна категория"
|
||||
value="<?= $model->ts_en_name ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c5 top15">
|
||||
<?php if ($model->id): ?>
|
||||
<div onclick="addSubCategory(this)" data-id="<?= $model->id ?>"
|
||||
class="btn-ib btn-default">
|
||||
<i class="la la-plus-circle"></i> Добавяне на нова опция
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<div onclick="addNewSubcategory()"
|
||||
class="btn-ib btn-default">
|
||||
<i class="la la-plus-circle"></i> Добавяне на нова опция
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<div id="bDelete" data-model="app\models\CommonFields" onclick="checkDelete(this)"
|
||||
class="btn-ib btn-default ct disabled">
|
||||
<i class="la la-trash-o"></i> Изтриване на опции <span id="delCount">(0)</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="c12 top15">
|
||||
<table class="cms-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="text-right">
|
||||
<input id="checkAll" onclick="checkAllCategories(this)" title="Избери всички"
|
||||
class="delete-checkbox" type="checkbox">
|
||||
No
|
||||
</th>
|
||||
<th>Наименование опция (BG)</th>
|
||||
<th>Наименование опция (EN)</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="sub-categories">
|
||||
<?php
|
||||
foreach ($model->options as $i => $subCategory): ?>
|
||||
<tr class="sub-categories" draggable="true" data-index="<?= $subCategory->order_index ?>">
|
||||
<td class="text-right c1" style="width: 50px">
|
||||
<input onclick="checkSingle(this)" data-del="<?= $subCategory->id ?>"
|
||||
class="delete-checkbox"
|
||||
type="checkbox"
|
||||
style="top: calc(50% - 10px)">
|
||||
<span class="sub-number"><?= $i + 1 ?></span>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="sub[<?= $subCategory->id ?>][name]"
|
||||
value="<?= $subCategory->name ?>">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="sub[<?= $subCategory->id ?>][ts_en_name]"
|
||||
value="<?= $subCategory->ts_en_name ?>">
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="row c9 top15 flex">
|
||||
<?= Includes::formButtons('nomenclature/common-fields') ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<script src="/_public/assets/js/order.js"></script>
|
||||
<script>
|
||||
|
||||
var objectTypes = '';
|
||||
|
||||
try {
|
||||
objectTypes = '<?= json_encode(CategoriesOt::getObjectTemplateList(true)) ?>'
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
|
||||
all('.search-select-box').forEach(el => {
|
||||
new SearchBox(el)
|
||||
})
|
||||
|
||||
orderItems('.sub-categories', '/update-common-field-indexes/', function () {
|
||||
var index = 0
|
||||
all('.sub-categories .sub-number').forEach(e => {
|
||||
e.innerText = ++index
|
||||
console.log(e.innerText)
|
||||
})
|
||||
});
|
||||
|
||||
function validateNumber(e, min, max) {
|
||||
if (e.value !== '') {
|
||||
if (e.value < min)
|
||||
e.value = min;
|
||||
if (e.value > max)
|
||||
e.value = max;
|
||||
}
|
||||
}
|
||||
|
||||
let sl = [];
|
||||
|
||||
function checkAllCategories(el) {
|
||||
sl = [];
|
||||
all('td [data-del]').forEach(e => {
|
||||
e.checked = el.checked === true;
|
||||
if (el.checked) {
|
||||
sl.push(e.dataset.del);
|
||||
e.parentNode.parentNode.addClass('checked');
|
||||
} else {
|
||||
e.parentNode.parentNode.removeClass('checked');
|
||||
}
|
||||
|
||||
})
|
||||
updateActionButtons();
|
||||
}
|
||||
|
||||
function checkSingle(e) {
|
||||
if (e.checked) {
|
||||
sl.push(e.dataset.del);
|
||||
e.parentNode.parentNode.addClass('checked');
|
||||
} else {
|
||||
one('#checkAll').checked = false;
|
||||
e.parentNode.parentNode.removeClass('checked');
|
||||
const f = sl.indexOf(e.dataset.del);
|
||||
sl.splice(f, 1);
|
||||
}
|
||||
updateActionButtons(e.dataset.del);
|
||||
}
|
||||
|
||||
function updateActionButtons() {
|
||||
const bDelete = one('#bDelete');
|
||||
const delCount = one('#delCount');
|
||||
const c = sl.length;
|
||||
if (delCount)
|
||||
delCount.innerText = '(' + c + ')';
|
||||
if (c > 0) {
|
||||
if (bDelete)
|
||||
bDelete.removeClass('disabled');
|
||||
} else {
|
||||
if (bDelete)
|
||||
bDelete.addClass('disabled');
|
||||
}
|
||||
}
|
||||
|
||||
function checkDelete(e) {
|
||||
const msg = 'Сигурни ли сте, че искате да изтриете ' + (sl.length > 1 ? 'тези ' + sl.length + ' записа?' : 'този запис?');
|
||||
modal.confirm(msg, () => {
|
||||
console.log(sl)
|
||||
all('tbody .delete-checkbox:checked').forEach(e => {
|
||||
e.parentNode.parentNode.remove();
|
||||
})
|
||||
|
||||
all('tbody .delete-checkbox').forEach((e, i) => {
|
||||
const number = e.parentNode.querySelector('span');
|
||||
number.innerHTML = (i + 1).toString()
|
||||
})
|
||||
const slValues = [];
|
||||
sl.forEach(v => {
|
||||
if (v) {
|
||||
slValues.push(v);
|
||||
}
|
||||
})
|
||||
if (slValues.length > 0) {
|
||||
request({
|
||||
url: window.location.href.split('?')[0] + '?o=d',
|
||||
post: {
|
||||
ids: JSON.stringify(sl),
|
||||
model: e.dataset.model
|
||||
},
|
||||
done: e => {
|
||||
window.location.reload();
|
||||
}
|
||||
})
|
||||
}
|
||||
sl = [];
|
||||
});
|
||||
}
|
||||
|
||||
function addSubCategory(e) {
|
||||
request({
|
||||
url: '/new-common-field-option/',
|
||||
post: {
|
||||
parent_id: e.dataset.id
|
||||
},
|
||||
done: e => {
|
||||
//window.location.reload();
|
||||
if (e.id && e.success === true) {
|
||||
addNewSubcategory(e.id, e.orderIndex);
|
||||
flash.success(e.msg, true)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function addNewSubcategory(id, orderIndex) {
|
||||
console.log(id, orderIndex);
|
||||
const tBody = one('#sub-categories');
|
||||
const tCount = tBody.querySelectorAll('tr').length
|
||||
const indexId = id ? id : 'index_' + (tCount + 1)
|
||||
const tr = document.createElement('tr')
|
||||
tr.className = 'sub-categories'
|
||||
tr.setAttribute('draggable', true)
|
||||
tr.setAttribute('data-index', orderIndex)
|
||||
console.log(tr)
|
||||
|
||||
tr.innerHTML = `
|
||||
<td class="text-right c1" style="width: 50px">
|
||||
<input onclick="checkSingle(this)"
|
||||
class="delete-checkbox"
|
||||
type="checkbox"
|
||||
data-del="${id}"
|
||||
style="top: calc(50% - 10px)">
|
||||
<span class="sub-number">${tCount + 1}</span>
|
||||
</td>
|
||||
<td>
|
||||
<input style="width: calc(100% - 20px); margin-left: 5px; height: 20px; padding: 5px"
|
||||
name="sub[${indexId}][name]"
|
||||
value="">
|
||||
</td>
|
||||
<td>
|
||||
<input style="width: calc(100% - 20px); margin-left: 5px; height: 20px; padding: 5px"
|
||||
name="sub[${indexId}][ts_en_name]"
|
||||
value="">
|
||||
</td>
|
||||
`
|
||||
tBody.appendChild(tr);
|
||||
orderItem(tr, function () {
|
||||
var index = 0
|
||||
all('.sub-categories .sub-number').forEach(e => {
|
||||
e.innerText = ++index
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
+326
@@ -0,0 +1,326 @@
|
||||
<?php
|
||||
|
||||
use app\models\Categories;
|
||||
use app\models\ObjectTemplate;
|
||||
use app\models\ObjectTemplateField;
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
/**
|
||||
* @var ObjectTemplate $model
|
||||
*/
|
||||
|
||||
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
<form autocomplete="off">
|
||||
<div class="flex top15 c11">
|
||||
<div class="row c6 right10">
|
||||
<label class="require">Наименование на вид обект (BG)</label>
|
||||
<input name="name" placeholder="Въведи наименование на вида обект"
|
||||
value="<?= $model->name ?>"/>
|
||||
</div>
|
||||
<div class="row c6">
|
||||
<label class="require">Наименование на вид обект (EN)</label>
|
||||
<input name="ts_en_name" placeholder="Въведи наименование на вида обект"
|
||||
value="<?= $model->ts_en_name ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex top15 c11">
|
||||
<div class="row c6 right10">
|
||||
<label class="require">Вид наследсво</label>
|
||||
<select name="heritage_type">
|
||||
<option selected disabled value="">-- Избери вид наследвство --</option>
|
||||
<?php foreach (ObjectTemplate::heritageTypes() as $id => $type): ?>
|
||||
<option <?= $id == $model->heritage_type ? 'selected' : '' ?> value="<?= $id ?>">
|
||||
<?= $type ?>
|
||||
</option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row c5 top15">
|
||||
<?php if ($model->id): ?>
|
||||
<div onclick="addSub(this)" data-id="<?= $model->id ?>"
|
||||
class="btn-ib btn-default">
|
||||
<i class="la la-plus-circle"></i> Добавяне на динамично поле
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<div onclick="addNewSub()"
|
||||
class="btn-ib btn-default">
|
||||
<i class="la la-plus-circle"></i> Добавяне на динамично поле
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<div id="bDelete" data-model="app\models\ObjectTemplateField" onclick="checkDelete(this)"
|
||||
class="btn-ib btn-default ct disabled">
|
||||
<i class="la la-trash-o"></i> Изтриване на динамични полета<span id="delCount">(0)</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="c11 top15">
|
||||
<table class="cms-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="text-right">
|
||||
<input id="checkAll" onclick="checkAllObjectTypes(this)" title="Избери всички"
|
||||
class="delete-checkbox" type="checkbox">
|
||||
No
|
||||
</th>
|
||||
<th class="c3">Наименование на поле (BG)</th>
|
||||
<th class="c3">Наименование на поле (EN)</th>
|
||||
<!--<th>Тип на данните</th>-->
|
||||
<th>Потребителски интерфейс</th>
|
||||
<th style="width: 70px">За филтър</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="dynamic-fields">
|
||||
<?php foreach ($model->objectTemplateFields as $i => $dynamicField): ?>
|
||||
<?php $fieldOptions = $dynamicField->fieldOptions ?>
|
||||
<tr class="dynamic-fields" draggable="true" data-index="<?= $dynamicField->order_index ?>">
|
||||
<td class="text-right c1" style="width: 50px">
|
||||
<input onclick="checkSingle(this)" data-del="<?= $dynamicField->id ?>"
|
||||
class="delete-checkbox"
|
||||
type="checkbox"
|
||||
style="top: calc(50% - 10px)">
|
||||
<span class="sub-number"><?= $i + 1 ?></span>
|
||||
</td>
|
||||
<td>
|
||||
<input style="width: calc(100% - 20px); margin-left: 5px; height: 20px; padding: 5px"
|
||||
name="sub[<?= $dynamicField->id ?>][name]"
|
||||
value="<?= $dynamicField->name ?>">
|
||||
</td>
|
||||
<td>
|
||||
<input style="width: calc(100% - 20px); margin-left: 5px; height: 20px; padding: 5px"
|
||||
name="sub[<?= $dynamicField->id ?>][ts_en_name]"
|
||||
value="<?= $dynamicField->ts_en_name ?>">
|
||||
</td>
|
||||
<td class="value-type">
|
||||
<?= ObjectTemplateField::userInterfaceType($dynamicField->user_interface_type, true, $dynamicField->id) ?>
|
||||
<?php if ($dynamicField->user_interface_type == 'list' || $dynamicField->user_interface_type == 'list_simple'): ?>
|
||||
<input data-id="<?= $dynamicField->id ?>"
|
||||
name="sub[<?= $dynamicField->id ?>][select_data]" type="hidden"
|
||||
value='<?= $dynamicField->fieldOptionsAsJson($fieldOptions) ?>'>
|
||||
<table class="inner-td-table" data-table="sub[<?= $dynamicField->id ?>][select_data]">
|
||||
<thead>
|
||||
<tr>
|
||||
|
||||
<?php if ($dynamicField->user_interface_type == 'list'): ?>
|
||||
<td>стойност (bg)</td>
|
||||
<td>стойност (en)</td>
|
||||
<?php else: ?>
|
||||
<td>стойност</td>
|
||||
<?php endif; ?>
|
||||
<td></td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody data-id="<?= $dynamicField->id ?>">
|
||||
<?php if (!empty($fieldOptions)): ?>
|
||||
<?php foreach ($fieldOptions as $index => $option): ?>
|
||||
<tr data-option-id="<?= $option->id ?>" class="added-row"
|
||||
data-index="<?= $index ?>"
|
||||
data-table="sub[<?= $dynamicField->id ?>][select_data]">
|
||||
<td><input class="update-bg" value="<?= $option->name ?>"></td>
|
||||
<?php if ($dynamicField->user_interface_type == 'list'): ?>
|
||||
<td><input class="update-en" value="<?= $option->ts_en_name ?>">
|
||||
</td><?php endif; ?>
|
||||
<td class="remove"><i class="la la-remove"></i></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
<tr data-table="sub[<?= $dynamicField->id ?>][select_data]">
|
||||
<td><input class="add-bg"></td>
|
||||
<?php if ($dynamicField->user_interface_type == 'list'): ?>
|
||||
<td><input class="add-en"></td><?php endif; ?>
|
||||
<td class="add-row"><i class="la la-plus-circle"></i></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td class="ct">
|
||||
<input <?= $dynamicField->is_filter ? 'checked' : '' ?> type="checkbox" value="1" name="sub[<?= $dynamicField->id ?>][is_filter]">
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="row c9 top15 flex">
|
||||
<?= Includes::formButtons('nomenclature/object-templates') ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<script src="/_public/assets/js/order.js"></script>
|
||||
<script src="/_public/assets/js/inner-table-items.js"></script>
|
||||
|
||||
<script>
|
||||
const innerTableItems = new InnerTableItems()
|
||||
innerTableItems.setUpdateUrl('/update-dynamic-type-values/')
|
||||
|
||||
orderItems('.dynamic-fields', '/update-dynamic-fields-indexes/', function () {
|
||||
var index = 0
|
||||
all('.dynamic-fields .sub-number').forEach(e => {
|
||||
e.innerText = ++index
|
||||
console.log(e.innerText)
|
||||
})
|
||||
});
|
||||
|
||||
let sl = [];
|
||||
|
||||
function checkAllObjectTypes(el) {
|
||||
console.log(el);
|
||||
sl = [];
|
||||
all('td [data-del]').forEach(e => {
|
||||
e.checked = el.checked === true;
|
||||
if (el.checked) {
|
||||
sl.push(e.dataset.del);
|
||||
e.parentNode.parentNode.addClass('checked');
|
||||
} else {
|
||||
e.parentNode.parentNode.removeClass('checked');
|
||||
}
|
||||
|
||||
})
|
||||
if (sl.length === 0)
|
||||
el.checked = false;
|
||||
updateActionButtons();
|
||||
}
|
||||
|
||||
function checkSingle(e) {
|
||||
if (e.checked) {
|
||||
sl.push(e.dataset.del);
|
||||
e.parentNode.parentNode.addClass('checked');
|
||||
} else {
|
||||
one('#checkAll').checked = false;
|
||||
e.parentNode.parentNode.removeClass('checked');
|
||||
const f = sl.indexOf(e.dataset.del);
|
||||
sl.splice(f, 1);
|
||||
}
|
||||
updateActionButtons(e.dataset.del);
|
||||
}
|
||||
|
||||
function updateActionButtons() {
|
||||
const bDelete = one('#bDelete');
|
||||
const delCount = one('#delCount');
|
||||
const c = sl.length;
|
||||
if (delCount)
|
||||
delCount.innerText = '(' + c + ')';
|
||||
if (c > 0) {
|
||||
if (bDelete)
|
||||
bDelete.removeClass('disabled');
|
||||
} else {
|
||||
if (bDelete)
|
||||
bDelete.addClass('disabled');
|
||||
}
|
||||
}
|
||||
|
||||
function checkDelete(e) {
|
||||
const msg = 'Сигурни ли сте, че искате да изтриете ' + (sl.length > 1 ? 'тези ' + sl.length + ' записа?' : 'този запис?');
|
||||
modal.confirm(msg, () => {
|
||||
console.log(sl)
|
||||
all('tbody .delete-checkbox:checked').forEach(e => {
|
||||
e.parentNode.parentNode.remove();
|
||||
})
|
||||
|
||||
all('tbody .delete-checkbox').forEach((e, i) => {
|
||||
const number = e.parentNode.querySelector('span');
|
||||
number.innerHTML = (i + 1).toString()
|
||||
})
|
||||
const slValues = [];
|
||||
sl.forEach(v => {
|
||||
if (v) {
|
||||
slValues.push(v);
|
||||
}
|
||||
})
|
||||
if (slValues.length > 0) {
|
||||
request({
|
||||
url: window.location.href.split('?')[0] + '?o=d',
|
||||
post: {
|
||||
ids: JSON.stringify(sl),
|
||||
model: e.dataset.model,
|
||||
noFlash: true
|
||||
},
|
||||
done: r => {
|
||||
all('.delete-checkbox', e => {
|
||||
e.checked = false;
|
||||
})
|
||||
updateActionButtons();
|
||||
flash.success(r.message)
|
||||
}
|
||||
})
|
||||
}
|
||||
sl = [];
|
||||
});
|
||||
}
|
||||
|
||||
function addSub(e) {
|
||||
request({
|
||||
url: '/new-dynamic-field/',
|
||||
post: {
|
||||
ot_id: e.dataset.id
|
||||
},
|
||||
done: e => {
|
||||
if (e.id && e.success === true) {
|
||||
addNewSub(e.id, e.orderIndex);
|
||||
flash.success(e.msg, true)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function addNewSub(id, orderIndex) {
|
||||
const tBody = one('#dynamic-fields');
|
||||
const tCount = tBody.querySelectorAll('tr').length
|
||||
const indexId = id ? id : 'index_' + (tCount + 1)
|
||||
const tr = document.createElement('tr')
|
||||
tr.className = 'dynamic-fields'
|
||||
tr.setAttribute('draggable', true)
|
||||
tr.setAttribute('data-index', orderIndex)
|
||||
const
|
||||
select = document.createElement('select'),
|
||||
selectDataType = document.createElement('select')
|
||||
select.className = 'type-value-selector'
|
||||
select.setAttribute('name', `sub[${indexId}][user_interface_type]`)
|
||||
select.setAttribute('onchange', 'innerTableItems.setChangeToSelect(this)')
|
||||
select.innerHTML = '<?= ObjectTemplateField::userInterfaceType(null, true, null, true) ?>'
|
||||
select.setAttribute('data-id', id)
|
||||
|
||||
selectDataType.setAttribute('name', `sub[${indexId}][data_type]`)
|
||||
selectDataType.setAttribute('onchange', 'innerTableItems.setChangeDataType(this)')
|
||||
selectDataType.innerHTML = '<?= ObjectTemplateField::dataType(null, null, true, true) ?>'
|
||||
selectDataType.setAttribute('data-id', id)
|
||||
|
||||
tr.innerHTML = `
|
||||
<td class="text-right c1" style="width: 50px">
|
||||
<input onclick="checkSingle(this)"
|
||||
class="delete-checkbox"
|
||||
type="checkbox"
|
||||
data-del="${id}"
|
||||
style="top: calc(50% - 10px)">
|
||||
<span class="sub-number">${orderIndex || tCount + 1}</span>
|
||||
</td>
|
||||
<td>
|
||||
<input style="width: calc(100% - 20px); margin-left: 5px; height: 20px; padding: 5px"
|
||||
name="sub[${indexId}][name]"
|
||||
value="">
|
||||
</td>
|
||||
<td>
|
||||
<input style="width: calc(100% - 20px); margin-left: 5px; height: 20px; padding: 5px"
|
||||
name="sub[${indexId}][ts_en_name]"
|
||||
value="">
|
||||
</td>
|
||||
<td>${select.outerHTML}</td>
|
||||
<td class="ct">
|
||||
<input type="checkbox" value="1" name="sub[${indexId}][is_filter]">
|
||||
</td>
|
||||
`
|
||||
|
||||
tBody.appendChild(tr);
|
||||
orderItem(tr, function () {
|
||||
var index = 0
|
||||
all('.dynamic-fields .sub-number').forEach(e => {
|
||||
e.innerText = ++index
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
use app\models\Collections;
|
||||
use app\widgets\FileWidget;
|
||||
|
||||
/**
|
||||
* @var $model Collections
|
||||
*/
|
||||
$media_key = $model->getMediaKey();
|
||||
|
||||
?>
|
||||
|
||||
<form autocomplete="off">
|
||||
<div class="inner-content p10">
|
||||
<div class="row info-table c5 top15">
|
||||
<?php if ($model->name): ?>
|
||||
<div class="row-flex">
|
||||
<div>Име на колекцията:</div>
|
||||
<div class="txt-no-transform"><?= $model->name ?></div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<div class="row c9 top15">
|
||||
<label>Заглавно изображение</label>
|
||||
<?= FileWidget::widget([
|
||||
'media_type' => 'image',
|
||||
'object_key' => 'title_collection_image',
|
||||
'media_key' => $media_key,
|
||||
'files' => $model->getFiles('thumb'),
|
||||
'actions' => [
|
||||
'add' => 'Добавяне на изображение',
|
||||
'edit' => 'Редакция на изображенито',
|
||||
'delete' => 'Премахване на изображението'
|
||||
],
|
||||
'single_file' => true,
|
||||
'resolutions' => ['16:11', '4:3', '1:1'],
|
||||
'max_file_size' => 2,
|
||||
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
|
||||
]) ?>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<script src="/_public/assets/js/order.js"></script>
|
||||
<script src="/_public/assets/js/file-img.js"></script>
|
||||
<script src="/_public/plugins/cropperJs/cropper.min.js"></script>
|
||||
<?php if (!$model->media_key): ?>
|
||||
<script>
|
||||
const media_key = '<?= $media_key ?>';
|
||||
request({
|
||||
url: window.location.href + '&media_key_update=1',
|
||||
post: {media_key: media_key}
|
||||
})
|
||||
</script>
|
||||
<?php endif; ?>
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
use app\models\Collections;
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
/**
|
||||
* @var Collections $model
|
||||
*/
|
||||
$ts = $_GET['tab'];
|
||||
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
<?php if (empty($model->id)): ?>
|
||||
<p style="color: darkorange; font-weight: bold">* Формата ще бъде активна след попълването на "Основни
|
||||
данни"</p>
|
||||
<?php endif; ?>
|
||||
<form autocomplete="off" class="<?= empty($model->id) ? 'disabled' : '' ?>">
|
||||
<div class="row c9 top15">
|
||||
<label class="require">Анотация</label>
|
||||
<textarea class="ckEditor" name="<?= $ts ?>_annotation"><?= $model->{$ts . '_annotation'} ?></textarea>
|
||||
</div>
|
||||
<div class="row c9 top15">
|
||||
<label class="require">Описание</label>
|
||||
<textarea class="ckEditor" name="<?= $ts ?>_description"><?= $model->{$ts . '_description'} ?></textarea>
|
||||
</div>
|
||||
<div class="row c9 top15">
|
||||
<label class="require">Информационен център</label>
|
||||
<input name="<?= $ts ?>_info_center" placeholder="Въведи наименование на информационен център"
|
||||
value="<?= $model->{$ts . '_info_center'} ?>"/>
|
||||
</div>
|
||||
<div class="row c9 top15">
|
||||
<label class="require">Информационен център адрес</label>
|
||||
<input name="<?= $ts ?>_info_center_address" placeholder="Въведи адрес на информационен център"
|
||||
value="<?= $model->{$ts.'_info_center_address'} ?>"/>
|
||||
</div>
|
||||
<div class="row flex c9 top15">
|
||||
<?= Includes::formButtons('nomenclature/collections') ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
@@ -0,0 +1,73 @@
|
||||
<?php
|
||||
|
||||
use app\models\OrderProduct;
|
||||
use app\models\Subscriptions;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
$_GET['tab'] = $tab;
|
||||
|
||||
|
||||
TableWidget::widget([
|
||||
'filter' => [
|
||||
[
|
||||
'model_id' => ['Колекция', 'c3', \app\models\register\Collections::getPaidDropDownData()],
|
||||
'user_email' => ['E-mail', 'c2'],
|
||||
'status' => ['Статус', 'c2', ['PAID' => 'Платено', 'CANCELED' => 'Отказано плащане']]
|
||||
],
|
||||
],
|
||||
'top' => [
|
||||
'title' => 'Закупени колекции',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'products/subscriptions' => 'Дигитален магазин',
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
//'new' => 'Нов абонамент',
|
||||
//'edit' => 'Редакция на абонамент',
|
||||
//'delete' => 'Изтриване на абонамент'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c0 text-right',
|
||||
'Колекция' => 'c1',
|
||||
'Дата' => 'c1',
|
||||
'Потребител име' => 'c1',
|
||||
'Потребител e-mail' => '',
|
||||
'Стойност' => '',
|
||||
'Плащане' => ''
|
||||
],
|
||||
'model' => Subscriptions::class,
|
||||
'data' => \app\models\OrderProduct::find()->joinWith('order')->joinWith('order.payment')->where(['model_class' => \app\models\register\Collections::class])->andWhere(Yii::$app->getFilterData('or'))->orderBy(['order_date' => SORT_DESC])->loop([
|
||||
'id',
|
||||
'name_bg',
|
||||
function (\app\models\OrderProduct $orderProduct) {
|
||||
if ($orderProduct->order) {
|
||||
return date('d.m.Y H:i', strtotime($orderProduct->order->order_date));
|
||||
}
|
||||
},
|
||||
function (\app\models\OrderProduct $orderProduct) {
|
||||
if ($orderProduct->order) {
|
||||
return $orderProduct->order->user_name;
|
||||
}
|
||||
},
|
||||
function (\app\models\OrderProduct $orderProduct) {
|
||||
if ($orderProduct->order) {
|
||||
return $orderProduct->order->user_email;
|
||||
}
|
||||
},
|
||||
function (OrderProduct $orderProduct) {
|
||||
return number_format($orderProduct->order->total_price, 2, '.', '') . ' лв';
|
||||
},
|
||||
function (OrderProduct $orderProduct) {
|
||||
if ($orderProduct->order && $orderProduct->order->payment) {
|
||||
$payment = $orderProduct->order->payment;
|
||||
return
|
||||
'<div>статус: <span style="font-weight: bold">' . $payment->status . '</span></div>
|
||||
<div style="margin-top: 4px">дата: ' . date('d.m.Y H:i', strtotime($payment->response_time)) . '</div>';
|
||||
}
|
||||
}
|
||||
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
<?php
|
||||
|
||||
use app\models\OrderProduct;
|
||||
use app\models\Pages;
|
||||
use app\models\Subscriptions;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
$_GET['tab'] = $tab;
|
||||
|
||||
|
||||
TableWidget::widget([
|
||||
'filter' => [
|
||||
[
|
||||
//'model_id' => ['Абонамент', 'c3', Subscriptions::getList()],
|
||||
'user_email' => ['E-mail', 'c2'],
|
||||
'status' => ['Статус', 'c2', ['PAID' => 'Платено', 'CANCELED' => 'Отказано плащане']]
|
||||
//'event_dates' => ['Дата', 'c2 fDatepicker'],
|
||||
//'title' => ['Заглавие на събитието', 'c4'],
|
||||
//'partner_id' => ['Организация', 'c3', Partner::partnerList()],
|
||||
//'is_for_publish' => ['За публикувне', 'c1', [1 => 'да', 'null' => 'не']],
|
||||
//'is_active' => ['Публикувано', 'c1', [1 => 'да', 'null' => 'не']]
|
||||
],
|
||||
],
|
||||
'top' => [
|
||||
'title' => 'Закупени публикации',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'products/subscriptions' => 'Дигитален магазин',
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
//'new' => 'Нов абонамент',
|
||||
//'edit' => 'Редакция на абонамент',
|
||||
//'delete' => 'Изтриване на абонамент'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c0 text-right',
|
||||
'Публикация' => 'c1',
|
||||
'Дата' => 'c1',
|
||||
'Потребител име' => 'c1',
|
||||
'Потребител e-mail' => '',
|
||||
'Стойност' => '',
|
||||
'Плащане' => ''
|
||||
],
|
||||
'model' => Subscriptions::class,
|
||||
'data' => \app\models\OrderProduct::find()->joinWith('order')->joinWith('order.payment')->where(['model_class' => \app\models\RegisterObjects::class])->andWhere(Yii::$app->getFilterData('or'))->orderBy(['order_date' => SORT_DESC])->loop([
|
||||
'id',
|
||||
'name_bg',
|
||||
function (\app\models\OrderProduct $orderProduct) {
|
||||
if ($orderProduct->order) {
|
||||
return date('d.m.Y H:i', strtotime($orderProduct->order->order_date));
|
||||
}
|
||||
},
|
||||
function (\app\models\OrderProduct $orderProduct) {
|
||||
if ($orderProduct->order) {
|
||||
return $orderProduct->order->user_name;
|
||||
}
|
||||
},
|
||||
function (\app\models\OrderProduct $orderProduct) {
|
||||
if ($orderProduct->order) {
|
||||
return $orderProduct->order->user_email;
|
||||
}
|
||||
},
|
||||
function (OrderProduct $orderProduct) {
|
||||
return number_format($orderProduct->order->total_price, 2, '.', '') . ' лв';
|
||||
},
|
||||
function (OrderProduct $orderProduct) {
|
||||
if ($orderProduct->order && $orderProduct->order->payment) {
|
||||
$payment = $orderProduct->order->payment;
|
||||
return
|
||||
'<div>статус: <span style="font-weight: bold">' . $payment->status . '</span></div>
|
||||
<div style="margin-top: 4px">дата: ' . date('d.m.Y H:i', strtotime($payment->response_time)) . '</div>';
|
||||
}
|
||||
}
|
||||
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
@@ -0,0 +1,119 @@
|
||||
<?php
|
||||
|
||||
use app\models\Events;
|
||||
use app\models\OrderBooking;
|
||||
use app\models\OrderProduct;
|
||||
use app\models\Pages;
|
||||
use app\models\Subscriptions;
|
||||
use app\services\Formatter;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
$_GET['tab'] = $tab;
|
||||
|
||||
|
||||
TableWidget::widget([
|
||||
'filter' => [
|
||||
[
|
||||
//'model_id' => ['Абонамент', 'c3', Subscriptions::getList()],
|
||||
'user_email' => ['E-mail', 'c2'],
|
||||
'status' => ['Статус', 'c2', ['PAID' => 'Платено', 'CANCELED' => 'Отказано плащане']],
|
||||
'event_id' => ['Събитие', 'c3', Events::getList()]
|
||||
],
|
||||
],
|
||||
'top' => [
|
||||
'title' => 'Резервации',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'products/subscriptions' => 'Дигитален магазин',
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
//'new' => 'Нов абонамент',
|
||||
//'edit' => 'Редакция на абонамент',
|
||||
//'delete' => 'Изтриване на абонамент'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c0 text-right',
|
||||
'Билет' => 'c1',
|
||||
'Събитие' => '',
|
||||
'Дата' => 'c1',
|
||||
'Потребител име' => 'c1',
|
||||
'Потребител e-mail' => '',
|
||||
'Цена на билета' => '',
|
||||
'Плащане' => ''
|
||||
],
|
||||
'model' => Subscriptions::class,
|
||||
'data' => \app\models\OrderBooking::find()->joinWith('order')->joinWith('order.payment')->andWhere(Yii::$app->getFilterData('or'))->orderBy(['order_date' => SORT_DESC])->loop([
|
||||
'id',
|
||||
'name_bg',
|
||||
function(OrderBooking $orderBooking) {
|
||||
if($orderBooking->event) {
|
||||
return $orderBooking->event->title;
|
||||
}
|
||||
},
|
||||
function (OrderBooking $orderProduct) {
|
||||
if ($orderProduct->order) {
|
||||
return date('d.m.Y H:i', strtotime($orderProduct->order->order_date));
|
||||
}
|
||||
},
|
||||
function (OrderBooking $orderProduct) {
|
||||
if ($orderProduct->order) {
|
||||
return $orderProduct->order->user_name;
|
||||
}
|
||||
},
|
||||
function (OrderBooking $orderProduct) {
|
||||
if ($orderProduct->order) {
|
||||
return $orderProduct->order->user_email;
|
||||
}
|
||||
},
|
||||
function (OrderBooking $orderBooking) {
|
||||
return number_format($orderBooking->single_price, 2, '.', '') . ' лв.';
|
||||
},
|
||||
function (OrderBooking $orderProduct) {
|
||||
if ($orderProduct->order && $orderProduct->order->payment) {
|
||||
$payment = $orderProduct->order->payment;
|
||||
return
|
||||
'<div>статус: <span style="font-weight: bold">' . $payment->status . '</span></div>
|
||||
<div style="margin-top: 4px">дата: ' . date('d.m.Y H:i', strtotime($payment->response_time)) . '</div>';
|
||||
}
|
||||
}
|
||||
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
/*
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нов абонамент',
|
||||
'title_edit' => 'Редакция на абонамент',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'products/subscriptions' => 'Абонаменти',
|
||||
],
|
||||
],
|
||||
'tabs' => $tabs ?? [],
|
||||
'writeView' => "products/tabs/" . Includes::tab($tab) . "/subscriptions_w",
|
||||
'model' => Subscriptions::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
if ($tab == 'main') {
|
||||
if (empty($p->{"name"}))
|
||||
return ["name" => 'Моля, въведете наименование на абонамента'];
|
||||
if (empty($p->{"name_en"}))
|
||||
return ["name_en" => 'Моля, въведете наименование на абонамента'];
|
||||
if(empty($p->{"price"}))
|
||||
return ['price' => 'Моля, въведете цена на абонамента'];
|
||||
|
||||
}
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, Subscriptions $model) use ($tab) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Абонамента е актуализиран успешно' : 'Абонамента е създаден успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
*/
|
||||
@@ -0,0 +1,115 @@
|
||||
<?php
|
||||
|
||||
use app\models\OrderProduct;
|
||||
use app\models\Pages;
|
||||
use app\models\Subscriptions;
|
||||
use app\services\Formatter;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
$_GET['tab'] = $tab;
|
||||
|
||||
|
||||
TableWidget::widget([
|
||||
'filter' => [
|
||||
[
|
||||
'model_id' => ['Абонамент', 'c3', Subscriptions::getList()],
|
||||
'user_email' => ['E-mail', 'c2'],
|
||||
'status' => ['Статус', 'c2', ['PAID' => 'Платено', 'CANCELED' => 'Отказано плащане']]
|
||||
//'event_dates' => ['Дата', 'c2 fDatepicker'],
|
||||
//'title' => ['Заглавие на събитието', 'c4'],
|
||||
//'partner_id' => ['Организация', 'c3', Partner::partnerList()],
|
||||
//'is_for_publish' => ['За публикувне', 'c1', [1 => 'да', 'null' => 'не']],
|
||||
//'is_active' => ['Публикувано', 'c1', [1 => 'да', 'null' => 'не']]
|
||||
],
|
||||
],
|
||||
'top' => [
|
||||
'title' => 'Абонаменти',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'products/subscriptions' => 'Дигитален магазин',
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
//'new' => 'Нов абонамент',
|
||||
//'edit' => 'Редакция на абонамент',
|
||||
//'delete' => 'Изтриване на абонамент'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c0 text-right',
|
||||
'Абонамент' => 'c1',
|
||||
'Дата' => 'c1',
|
||||
'Потребител име' => 'c1',
|
||||
'Потребител e-mail' => '',
|
||||
'Стойност' => '',
|
||||
'Плащане' => ''
|
||||
],
|
||||
'model' => Subscriptions::class,
|
||||
'data' => \app\models\OrderProduct::find()->joinWith('order')->joinWith('order.payment')->where(['model_class' => Subscriptions::class])->andWhere(Yii::$app->getFilterData('or'))->orderBy(['order_date' => SORT_DESC])->loop([
|
||||
'id',
|
||||
'name_bg',
|
||||
function (\app\models\OrderProduct $orderProduct) {
|
||||
if ($orderProduct->order) {
|
||||
return date('d.m.Y H:i', strtotime($orderProduct->order->order_date));
|
||||
}
|
||||
},
|
||||
function (\app\models\OrderProduct $orderProduct) {
|
||||
if ($orderProduct->order) {
|
||||
return $orderProduct->order->user_name;
|
||||
}
|
||||
},
|
||||
function (\app\models\OrderProduct $orderProduct) {
|
||||
if ($orderProduct->order) {
|
||||
return $orderProduct->order->user_email;
|
||||
}
|
||||
},
|
||||
function (OrderProduct $orderProduct) {
|
||||
return number_format($orderProduct->order->total_price, 2, '.', '') . ' лв';
|
||||
},
|
||||
function (OrderProduct $orderProduct) {
|
||||
if ($orderProduct->order && $orderProduct->order->payment) {
|
||||
$payment = $orderProduct->order->payment;
|
||||
return
|
||||
'<div>статус: <span style="font-weight: bold">' . $payment->status . '</span></div>
|
||||
<div style="margin-top: 4px">дата: ' . date('d.m.Y H:i', strtotime($payment->response_time)) . '</div>';
|
||||
}
|
||||
}
|
||||
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
/*
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нов абонамент',
|
||||
'title_edit' => 'Редакция на абонамент',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'products/subscriptions' => 'Абонаменти',
|
||||
],
|
||||
],
|
||||
'tabs' => $tabs ?? [],
|
||||
'writeView' => "products/tabs/" . Includes::tab($tab) . "/subscriptions_w",
|
||||
'model' => Subscriptions::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
if ($tab == 'main') {
|
||||
if (empty($p->{"name"}))
|
||||
return ["name" => 'Моля, въведете наименование на абонамента'];
|
||||
if (empty($p->{"name_en"}))
|
||||
return ["name_en" => 'Моля, въведете наименование на абонамента'];
|
||||
if(empty($p->{"price"}))
|
||||
return ['price' => 'Моля, въведете цена на абонамента'];
|
||||
|
||||
}
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, Subscriptions $model) use ($tab) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Абонамента е актуализиран успешно' : 'Абонамента е създаден успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
*/
|
||||
@@ -0,0 +1,90 @@
|
||||
<?php
|
||||
|
||||
use app\models\register\Partner;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
use app\models\register\Collections;
|
||||
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
|
||||
|
||||
$filter = Yii::$app->getFilterData('and');
|
||||
|
||||
$filter[0] = 'and';
|
||||
$filter[] = ['=', 'deleted', 0];
|
||||
$filter[] = ['=', 'active', 1];
|
||||
$filter[] = ['=', 'published', 1];
|
||||
|
||||
|
||||
TableWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Колекции',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало'
|
||||
]
|
||||
],
|
||||
'filter' => [
|
||||
[
|
||||
'name' => ['Заглавие на колекция', 'c4'],
|
||||
'partner_id' => ['Организация', 'c3', Partner::partnerList()]
|
||||
],
|
||||
],
|
||||
'actions' => [
|
||||
//'new' => 'Нова категория',
|
||||
//'edit' => 'Редакция на категория',
|
||||
// 'delete' => 'Изтриване на колекция'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c0 text-right',
|
||||
'Колекция' => '',
|
||||
'Изображение' => '',
|
||||
'Цена' => 'c1',
|
||||
'Партньор' => '',
|
||||
],
|
||||
'data' => Collections::find()->orderBy(['modified_on' => SORT_DESC])->where(['is_payable' => 1])->andWhere($filter)->loop([
|
||||
'id',
|
||||
function (Collections $model) {
|
||||
return '<a href="?o=w&id=' . $model->id . '">' . $model->name . '</a>';
|
||||
},
|
||||
function (Collections $model) {
|
||||
if ($model->thumbnail && $model->thumbnail != "''")
|
||||
return '<img src="'.Yii::$app->params['register'].'/uploads/collections/' . $model->thumbnail . '" style="height: 200px">';
|
||||
},
|
||||
function (Collections $model) {
|
||||
return number_format($model->price, 2, '.', ' ');
|
||||
},
|
||||
function (Collections $model) {
|
||||
if ($model->partner)
|
||||
return $model->partner->name;
|
||||
},
|
||||
], $_GET['p'] ?? 1, 50)
|
||||
]);
|
||||
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нова колекция',
|
||||
'title_edit' => 'Преглед на колекция',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'products/subscriptions/' => 'Продукти',
|
||||
'products/paid-collections/' => 'Колекции'
|
||||
],
|
||||
],
|
||||
'tabs' => [
|
||||
//'main' => '<i class="la la-database"></i> Основни данни',
|
||||
//'ts_en' => '<i class="lg lg-en"></i> Превод английски'
|
||||
],
|
||||
'writeView' => "products/tabs/" . Includes::tab($tab) . "/collections_register_w",
|
||||
'model' => Collections::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
|
||||
},
|
||||
'postService' => function ($p, Collections $model) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
echo json_encode(['success' => 1]);
|
||||
exit;
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,87 @@
|
||||
<?php
|
||||
|
||||
use app\models\register\Partner;
|
||||
use app\models\RegisterObjects;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
use app\models\register\Collections;
|
||||
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
|
||||
$filter = Yii::$app->getFilterData('and');
|
||||
$filter[] = ['=', 'lib_type', 2];
|
||||
$filter[] = ['=', 'is_payable', 1];
|
||||
|
||||
$filter[0] = 'and';
|
||||
TableWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Публикации',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало'
|
||||
]
|
||||
],
|
||||
'filter' => [
|
||||
[
|
||||
'name' => ['Заглавие на публикация', 'c4'],
|
||||
'partner_id' => ['Организация', 'c3', Partner::partnerList()]
|
||||
],
|
||||
],
|
||||
'actions' => [],
|
||||
'th' => [
|
||||
'№' => 'c0 text-right',
|
||||
'Публикация' => '',
|
||||
'Изображение' => '',
|
||||
'Цена' => 'c1',
|
||||
'Партньор' => '',
|
||||
],
|
||||
'data' => RegisterObjects::find()
|
||||
->where($filter)
|
||||
->loop([
|
||||
'id',
|
||||
function (RegisterObjects $model) {
|
||||
return '<a href="?o=w&id=' . $model->id . '">' . $model->name . '</a>';
|
||||
},
|
||||
function (RegisterObjects $model) {
|
||||
if ($model->getMainImgFile()) {
|
||||
return '<img src="' . $model->getMainImgFile() . '" style="height: 200px">';
|
||||
}
|
||||
},
|
||||
function (RegisterObjects $model) {
|
||||
return number_format($model->price, 2, '.', ' ');
|
||||
},
|
||||
function (RegisterObjects $model) {
|
||||
if ($model->partner)
|
||||
return $model->partner->name;
|
||||
}
|
||||
|
||||
], $_GET['p'] ?? 1, 50)
|
||||
]);
|
||||
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Преглед',
|
||||
'title_edit' => 'Преглед на публикация',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'products/subscriptions/' => 'Дигитален магазин',
|
||||
'products/paid-publications/' => 'Публикации'
|
||||
],
|
||||
],
|
||||
'tabs' => [
|
||||
//'main' => '<i class="la la-database"></i> Основни данни',
|
||||
//'ts_en' => '<i class="lg lg-en"></i> Превод английски'
|
||||
],
|
||||
'writeView' => "products/tabs/" . Includes::tab($tab) . "/publications_register_w",
|
||||
'model' => RegisterObjects::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
|
||||
},
|
||||
'postService' => function ($p, RegisterObjects $model) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
echo json_encode(['success' => 1]);
|
||||
exit;
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,77 @@
|
||||
<?php
|
||||
|
||||
use app\models\Pages;
|
||||
use app\models\Subscriptions;
|
||||
use app\services\Formatter;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
$_GET['tab'] = $tab;
|
||||
|
||||
|
||||
|
||||
TableWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Абонаменти',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'products/subscriptions' => 'Дигитален магазин',
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
'new' => 'Нов абонамент',
|
||||
'edit' => 'Редакция на абонамент',
|
||||
'delete' => 'Изтриване на абонамент'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c1 text-right',
|
||||
'Абонамент' => '',
|
||||
'Цена' => '',
|
||||
'Месеци' => '',
|
||||
],
|
||||
'model' => Subscriptions::class,
|
||||
'data' => Subscriptions::find()->loop([
|
||||
'id',
|
||||
function (Subscriptions $model) {
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
|
||||
},
|
||||
function (Subscriptions $model) {
|
||||
return number_format($model->price, 2, ".", " ");
|
||||
},
|
||||
'months'
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нов абонамент',
|
||||
'title_edit' => 'Редакция на абонамент',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'products/subscriptions' => 'Абонаменти',
|
||||
],
|
||||
],
|
||||
'tabs' => $tabs ?? [],
|
||||
'writeView' => "products/tabs/" . Includes::tab($tab) . "/subscriptions_w",
|
||||
'model' => Subscriptions::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
if ($tab == 'main') {
|
||||
if (empty($p->{"name"}))
|
||||
return ["name" => 'Моля, въведете наименование на абонамента'];
|
||||
if (empty($p->{"name_en"}))
|
||||
return ["name_en" => 'Моля, въведете наименование на абонамента'];
|
||||
if(empty($p->{"price"}))
|
||||
return ['price' => 'Моля, въведете цена на абонамента'];
|
||||
|
||||
}
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, Subscriptions $model) use ($tab) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Абонамента е актуализиран успешно' : 'Абонамента е създаден успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
+87
@@ -0,0 +1,87 @@
|
||||
<?php
|
||||
|
||||
/** @var \app\models\register\Collections $model */
|
||||
|
||||
?>
|
||||
<div class="inner-content p20">
|
||||
<div class="row top15">
|
||||
<a style="width: 200px; text-align: center" href="<?= Yii::$app->goTo('products/paid-collections') ?><?= isset($_GET['p']) ? '?p=' . $_GET['p'] : '' ?>"
|
||||
class="btn btn-default right10"><i class="la la-undo"></i> Обратно в списъка</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="inner-content p20">
|
||||
<?php if ($model->thumbnail && $model->thumbnail != "''"): ?>
|
||||
<img src="<?= Yii::$app->params['register']?>/uploads/collections/<?= $model->thumbnail ?>" style="height: 200px">
|
||||
<?php endif; ?>
|
||||
<div class="flex top15">
|
||||
<div class="row">
|
||||
<label>Цена</label>
|
||||
<div class="flex update-price">
|
||||
<input id="collection-price" data-format="money"
|
||||
value="<?= number_format($model->price, 2, '.', '') ?>"
|
||||
style="width: 150px">
|
||||
<i class="la la-check"></i>
|
||||
<div onclick="updateValuePrice()" class="btn btn-default left5">Актуализирай цената</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex top15">
|
||||
<div class="row c6">
|
||||
<p><i class="lg lg-bg"></i> български</p>
|
||||
<div class="row">
|
||||
<h2><?= $model->name ?></h2>
|
||||
</div>
|
||||
<div class="row top15">
|
||||
<label>Кратко описание</label>
|
||||
<div>
|
||||
<?= $model->annotation ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row top15">
|
||||
<label>Oписание</label>
|
||||
<div>
|
||||
<?= $model->description ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c6">
|
||||
<p><i class="lg lg-bg"></i> английски</p>
|
||||
<div class="row">
|
||||
<h2><?= $model->name_en ?></h2>
|
||||
</div>
|
||||
<div class="row top15">
|
||||
<label>Кратко описание</label>
|
||||
<div>
|
||||
<?= $model->annotation_en ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row top15">
|
||||
<label>Oписание</label>
|
||||
<div>
|
||||
<?= $model->description_en ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
let collectionPrice = document.querySelector('#collection-price');
|
||||
function updateValuePrice() {
|
||||
request({
|
||||
post: {
|
||||
price: collectionPrice.value
|
||||
},
|
||||
done: () => {
|
||||
flash.success('Цената е сменена')
|
||||
flash.success('Цената е сменена')
|
||||
document.querySelector('.update-price').classList.add('updated');
|
||||
|
||||
setTimeout(() => {
|
||||
document.querySelector('.update-price').classList.remove('updated')
|
||||
}, 4000)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
</script>
|
||||
+121
@@ -0,0 +1,121 @@
|
||||
<?php
|
||||
|
||||
/** @var \app\models\RegisterObjects $model */
|
||||
|
||||
?>
|
||||
|
||||
<div class="inner-content p20">
|
||||
<div class="row top15">
|
||||
<a style="width: 200px; text-align: center"
|
||||
href="<?= Yii::$app->goTo('products/paid-publications') ?><?= isset($_GET['p']) ? '?p=' . $_GET['p'] : '' ?>"
|
||||
class="btn btn-default right10"><i class="la la-undo"></i> Обратно в списъка</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="inner-content p20">
|
||||
<?php if ($model->getMainImgFile()): ?>
|
||||
<img src="<?= $model->getMainImgFile() ?>" style="height: 200px">
|
||||
<?php endif; ?>
|
||||
<div class="flex top15 top30">
|
||||
<div class="row">
|
||||
<label>Цена</label>
|
||||
<div class="flex update-price">
|
||||
<input id="publication-price" data-format="money"
|
||||
value="<?= number_format($model->price, 2, '.', '') ?>"
|
||||
style="width: 150px">
|
||||
<i class="la la-check"></i>
|
||||
<div onclick="updateValuePrice()" class="btn btn-default left5">Актуализирай цената</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex top15">
|
||||
<div class="row c6">
|
||||
<p><i class="lg lg-bg"></i> български</p>
|
||||
<div class="row">
|
||||
<h2><?= $model->name ?></h2>
|
||||
</div>
|
||||
<div class="row">
|
||||
<h3>Автор: <?= $model->created_by ?></h3>
|
||||
</div>
|
||||
<div class="row top15">
|
||||
<label>Кратко описание</label>
|
||||
<div>
|
||||
<?= $model->short_description ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row top15">
|
||||
<label>Oписание</label>
|
||||
<div>
|
||||
<?= $model->description ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c6">
|
||||
<p><i class="lg lg-bg"></i> английски</p>
|
||||
<div class="row">
|
||||
<h2><?= $model->ts_en_name ?></h2>
|
||||
</div>
|
||||
<div class="row top15">
|
||||
<label>Кратко описание</label>
|
||||
<div>
|
||||
<?= $model->ts_en_short_description ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row top15">
|
||||
<label>Oписание</label>
|
||||
<div>
|
||||
<?= $model->ts_en_description ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="inner-content p10 top30">
|
||||
<table class="cms-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach ($model->registerObjectFields as $registerObjectField): ?>
|
||||
<tr>
|
||||
<td class="c2 text-right bold">
|
||||
<?php if ($registerObjectField->field): ?>
|
||||
<?= $registerObjectField->field->name ?>:
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php if ($registerObjectField->fieldValue): ?>
|
||||
<?= $registerObjectField->fieldValue->name ?>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<script>
|
||||
let publicationPrice = document.querySelector('#publication-price');
|
||||
|
||||
function updateValuePrice() {
|
||||
request({
|
||||
post: {
|
||||
price: publicationPrice.value
|
||||
},
|
||||
done: () => {
|
||||
flash.success('Цената е сменена')
|
||||
document.querySelector('.update-price').classList.add('updated');
|
||||
|
||||
setTimeout(() => {
|
||||
document.querySelector('.update-price').classList.remove('updated')
|
||||
}, 4000)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
</script>
|
||||
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
use app\models\Pages;
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
/**
|
||||
* @var Pages $model
|
||||
*/
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
<form autocomplete="off">
|
||||
<div class="c10 row">
|
||||
<label>Име на абонамента</label>
|
||||
<div class="flex row row-panel">
|
||||
<div class="row c6 right10">
|
||||
<label class="require"><i class="lg lg-bg"></i> Български</label>
|
||||
<input name="name" placeholder="Въведи заглавието страницата [BG]" value="<?= $model->name ?>"/>
|
||||
</div>
|
||||
<div class="row c6 right10">
|
||||
<label class="require"><i class="lg lg-en"></i> Английски</label>
|
||||
<input name="name_en" placeholder="Въведи заглавието страницата [EN]" value="<?= $model->name_en ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="c10 row top15">
|
||||
<label>Текст</label>
|
||||
<div class="flex row row-panel">
|
||||
<div class="row c6 right10">
|
||||
<label><i class="lg lg-bg"></i> Български</label>
|
||||
<textarea class="ckEditor" name="text" placeholder="Въведи текст на абонамента [BG]"><?= $model->text ?></textarea>
|
||||
</div>
|
||||
<div class="row c6 right10">
|
||||
<label><i class="lg lg-en"></i> Английски</label>
|
||||
<textarea class="ckEditor" name="text_en" placeholder="Въведи текст на абонамента [EN]"><?= $model->text_en ?></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="c6 row top15">
|
||||
<label>Месеци</label>
|
||||
<input style="width: 200px" name="months" type="text" data-format="integer" placeholder="Въведи месеци" value="<?= $model->months ?? 1 ?>"/>
|
||||
</div>
|
||||
<div class="c6 row top15">
|
||||
<label>Цена</label>
|
||||
<input style="width: 200px" name="price" type="text" data-format="money" placeholder="Въведи цена" value="<?= $model->price ?>"/>
|
||||
</div>
|
||||
<div class="row c9 top15 flex">
|
||||
<?= Includes::formButtons('products/subscriptions') ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
@@ -0,0 +1,111 @@
|
||||
<?php
|
||||
|
||||
use app\models\TourObjects;
|
||||
|
||||
/**
|
||||
* @var $model TourObjects;
|
||||
*/
|
||||
$lat = $model->latitude ?? 42.698334;
|
||||
$lon = $model->longitude ?? 23.319941;
|
||||
?>
|
||||
<link rel="stylesheet" href="/_public/plugins/leafletjs/leaflet.css">
|
||||
<script src="/_public/plugins/leafletjs/leaflet.js"></script>
|
||||
<style>
|
||||
.search-location {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.search-location .result {
|
||||
position: absolute;
|
||||
top: 40px;
|
||||
left: 0;
|
||||
background: #FFFFFF;
|
||||
z-index: 10000000;
|
||||
padding: 5px;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.search-location .result .row-result {
|
||||
padding: 5px;
|
||||
border: 1px solid #ccc;
|
||||
background: #f1f1f1;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
#map {
|
||||
width: 100%;
|
||||
height: 800px;
|
||||
border: 1px solid var(--base-background-dark);
|
||||
border-radius: 5px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
</style>
|
||||
<div class="search-location c6">
|
||||
<input placeholder="Търси">
|
||||
<div class="result"></div>
|
||||
</div>
|
||||
<div id="map"></div>
|
||||
|
||||
<script>
|
||||
|
||||
|
||||
const inputSearchLocation = document.querySelector('.search-location input');
|
||||
const results = document.querySelector('.search-location .result');
|
||||
|
||||
|
||||
let mapOptions = {
|
||||
center: [<?=$lat ?>, <?= $lon ?>],
|
||||
zoom: 13
|
||||
}
|
||||
let map = new L.map('map', mapOptions);
|
||||
let layer = new L.TileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png');
|
||||
map.addLayer(layer);
|
||||
let marker = new L.Marker([<?=$lat?>, <?= $lon?>]);
|
||||
marker.addTo(map);
|
||||
|
||||
map.on('click', function(e){
|
||||
let coord = e.latlng;
|
||||
let lat = coord.lat;
|
||||
let lon = coord.lng;
|
||||
setNewLocation({lat, lon})
|
||||
});
|
||||
|
||||
inputSearchLocation.addEventListener('keyup', () => {
|
||||
request({
|
||||
url: `https://nominatim.openstreetmap.org/search.php?q=${inputSearchLocation.value}&accept-language=bg&countrycodes=bg&limit=10&format=jsonv2`,
|
||||
done: res => {
|
||||
results.innerHTML = '';
|
||||
res = res || [];
|
||||
res.forEach(r => {
|
||||
let row = document.createElement('div')
|
||||
row.className = 'row-result';
|
||||
console.log(r);
|
||||
row.innerHTML = `<span>${r.display_name}</span>`;
|
||||
row.addEventListener('click', function () {
|
||||
if (r.lat && r.lon) {
|
||||
setNewLocation(r)
|
||||
}
|
||||
})
|
||||
results.appendChild(row)
|
||||
})
|
||||
if (res.length > 0) {
|
||||
results.style.display = 'block'
|
||||
} else {
|
||||
results.style.display = 'none'
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
function setNewLocation(r) {
|
||||
document.querySelector('[name="latitude"]').value = r.lat
|
||||
document.querySelector('[name="longitude"]').value = r.lon
|
||||
marker.setLatLng([r.lat, r.lon])
|
||||
let latLon = [marker.getLatLng()];
|
||||
let markerBounds = L.latLngBounds(latLon);
|
||||
map.fitBounds(markerBounds);
|
||||
|
||||
results.innerHTML = ''
|
||||
results.style.display = 'none'
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
$museums = \app\models\register\Partner::find()->where(['deleted' => 0, 'active' => 1])->all();
|
||||
/**
|
||||
* @var \app\models\TourObjects $model
|
||||
*/
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
<form autocomplete="off">
|
||||
<div class="c10 row">
|
||||
<label>Име на туристическия обект</label>
|
||||
<div class="flex row row-panel">
|
||||
<div class="row c6 right10">
|
||||
<label class="require"><i class="lg lg-bg"></i> Български</label>
|
||||
<input name="name" placeholder="Въведи име на туристическия обект [BG]" value="<?= $model->name ?>"/>
|
||||
</div>
|
||||
<div class="row c6 right10">
|
||||
<label class="require"><i class="lg lg-en"></i> Английски</label>
|
||||
<input name="name_en" placeholder="Въведи име на туристическия обект [EN]"
|
||||
value="<?= $model->name_en ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="c10 row top15">
|
||||
<label>Текст</label>
|
||||
<div class="flex row row-panel">
|
||||
<div class="row c6 right10">
|
||||
<label><i class="lg lg-bg"></i> Български</label>
|
||||
<textarea class="ckEditor" name="text"
|
||||
placeholder="Въведи текст за туристическия обект [BG]"><?= $model->text ?></textarea>
|
||||
</div>
|
||||
<div class="row c6 right10">
|
||||
<label><i class="lg lg-en"></i> Английски</label>
|
||||
<textarea class="ckEditor" name="text_en"
|
||||
placeholder="Въведи текст за туристическия обект [EN]"><?= $model->text_en ?></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="c5 row top15">
|
||||
<label>Асоциация с партньор</label>
|
||||
<select name="partner_id">
|
||||
<option>Без асоцииране</option>
|
||||
<?php foreach ($museums as $museum): ?>
|
||||
<option <?= $model->partner_id == $museum->id ? 'selected' : '' ?>
|
||||
value="<?= $museum->id ?>"><?= $museum->name ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="c10 row top15">
|
||||
<label>Локация</label>
|
||||
<?= $this->render('_object_location_map', ['model' => $model]) ?>
|
||||
</div>
|
||||
<div class="c10 row top15">
|
||||
<label>Географски координати</label>
|
||||
<div class="row-panel flex">
|
||||
<div class="c6 right10"><label>latitude</label><input readonly name="latitude" placeholder="Latitude" value="<?= $model->latitude ?>"></div>
|
||||
<div class="c6 leaflet-right"><label>longitude</label><input readonly name="longitude" placeholder="Longitude" value="<?= $model->longitude ?>"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c9 top15 flex">
|
||||
<?= Includes::formButtons('tour/tour-objects') ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
@@ -0,0 +1,72 @@
|
||||
<?php
|
||||
use app\models\Subscriptions;
|
||||
use app\models\TourObjects;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
$_GET['tab'] = $tab;
|
||||
|
||||
$filter = Yii::$app->getFilterData('and');
|
||||
|
||||
$filter[0] = 'and';
|
||||
|
||||
TableWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Туристически обекти',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
]
|
||||
],
|
||||
'filter' => [
|
||||
[
|
||||
'name' => ['Наименование на туристическия обект', 'c4'],
|
||||
],
|
||||
],
|
||||
'actions' => [
|
||||
'new' => 'Нов туристически обект',
|
||||
'edit' => 'Редакция на туристически обект',
|
||||
'delete' => 'Изтриване на туристически обект'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c0 text-right',
|
||||
'Наименование на туристическия обект' => '',
|
||||
],
|
||||
'model' => TourObjects::class,
|
||||
'data' => TourObjects::find()->where(Yii::$app->getFilterData('and'))->loop([
|
||||
'id',
|
||||
function (TourObjects $model) {
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
|
||||
},
|
||||
], $_GET['p'] ?? 1, 50)
|
||||
]);
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нов туристически обект',
|
||||
'title_edit' => 'Редакция туристически обект',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'tour/tour-objects' => 'Туристически обекти',
|
||||
],
|
||||
],
|
||||
'tabs' => $tabs ?? [],
|
||||
'writeView' => "tour/tabs/" . Includes::tab($tab) . "/tour_objects_w",
|
||||
'model' => TourObjects::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
if (empty($p->{'name'}))
|
||||
return ["name" => 'Моля, въведете наименование на туристическия обект'];
|
||||
if (empty($p->{'name_en'}))
|
||||
return ["name_en" => 'Моля, въведете наименование на туристическия обект'];
|
||||
|
||||
if (empty($p->{'latitude'}) || empty($p->{'longitude'}))
|
||||
return ["latitude" => 'Моля, изберете локация от картата по-горе за да попълните географските координати автоматично'];
|
||||
},
|
||||
'postService' => function ($p, TourObjects $model) use ($tab) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Данните са записани успешно' : 'Данните са създадени успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,79 @@
|
||||
<?php
|
||||
|
||||
Yii::$app->controller->pageTitle = 'CMS администратори';
|
||||
|
||||
use app\models\UserAdminCms;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
TableWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'CMS администратори',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'user/admin-global' => 'Потребители'
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
//'new' => 'Нов CMS админ',
|
||||
'edit' => 'Редакция на CMS админ',
|
||||
'delete' => 'Изтриване на CMS админ'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c1 text-right',
|
||||
'Ел. поща' => '',
|
||||
'Име' => '',
|
||||
'Активен' => 'c0 ct'
|
||||
],
|
||||
'data' => UserAdminCms::find()->orderBy(['id' => SORT_DESC])->loop([
|
||||
'id',
|
||||
'email_login',
|
||||
'fullName',
|
||||
function (UserAdminCms $model) {
|
||||
return $model->statusSwitch('is_active');
|
||||
}
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нов CMS администратор',
|
||||
'title_edit' => 'Редакция на CMS администратор',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'user/admin-cms' => 'CMS администратори'
|
||||
]
|
||||
],
|
||||
'writeView' => 'user/write/admin-cms_w',
|
||||
'model' => UserAdminCms::class,
|
||||
'validation' => function ($p) {
|
||||
if (isset($p->profile_update)) {
|
||||
if (empty($p->{'email_login'}))
|
||||
return ['email_login' => 'Моля, въведете ел. поща'];
|
||||
if (!filter_var($p->{'email_login'}, FILTER_VALIDATE_EMAIL))
|
||||
return ['email_login' => 'Моля, въведете валиден имейл адрес'];
|
||||
if (UserAdminCms::recordExists('email_login', $p->{'email_login'}))
|
||||
return ['email_login' => 'Този имейл адрес вече се ползва от друг cms администратор'];
|
||||
//if (empty($p->{'role_id'}))
|
||||
// return ['role_id' => 'Моля, изберете роля / група'];
|
||||
}
|
||||
if (isset($p->password_change) || empty($_GET['id'])) {
|
||||
if (empty($p->{'password'}))
|
||||
return ['password' => 'Моля, въведете парола'];
|
||||
|
||||
if (strlen($p->{'password'}) < 6)
|
||||
return ['password' => 'Моля, въведете парола от поне 6 символа'];
|
||||
|
||||
if ($p->{'cPassword'} != $p->{'password'})
|
||||
return ['cPassword' => 'Повторното въвеждане на паролата не съвпада с първата'];
|
||||
}
|
||||
},
|
||||
'postService' => function ($p, UserAdminCms $model) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
if (!isset($p->{'rights'}))
|
||||
$p->{'rights'} = [];
|
||||
$model->updateRights($p->{'rights'});
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Записът е актуализиран успешно' : 'Записът е създадено успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,102 @@
|
||||
<?php
|
||||
|
||||
use app\models\UserAdminGlobal;
|
||||
use app\services\Auth;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$u = Auth::userAdminGlobal();
|
||||
|
||||
$filter = ['IS NOT', 'open_id', NULL];
|
||||
|
||||
TableWidget::widget([
|
||||
'filter' => [
|
||||
['email_login' => ['Ел. поща', 'c3']]
|
||||
],
|
||||
'top' => [
|
||||
'title' => 'Глобални администратори',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'user/admin-global' => 'Потребители'
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
//'new' => 'Нов глобален администратор',
|
||||
'edit' => 'Редакция на глобален администратор',
|
||||
//'delete' => 'Изтриване глобален администратор',
|
||||
'export' => 'Експорт (csv)'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c1 text-right',
|
||||
'Ел. поща' => '',
|
||||
'Име' => '',
|
||||
'Активен' => 'c0 ct'
|
||||
],
|
||||
'data' => UserAdminGlobal::find()->where($filter)->andWhere(Yii::$app->getFilterData())->orderBy(['first_name' => SORT_ASC])->loop([
|
||||
'id',
|
||||
'email_login',
|
||||
function (UserAdminGlobal $model) {
|
||||
return $model->getFullName();
|
||||
},
|
||||
function (UserAdminGlobal $model) use ($u) {
|
||||
$disabled = $model->id == $u->id ? 'disabled' : null;
|
||||
return $model->statusSwitch('is_active', null, null, $disabled);
|
||||
},
|
||||
], $_GET['p'] ?? 1, 30),
|
||||
'ignoreIds' => [$u->id],
|
||||
'exportData' => function () {
|
||||
return [
|
||||
'header' => [
|
||||
'ID' => ['integer', 10],
|
||||
'E-mail' => ['string', 50],
|
||||
'Име' => ['string', 20],
|
||||
'Фамилия' => ['string', 20]
|
||||
],
|
||||
'data' => UserAdminGlobal::find()->where(Yii::$app->getFilterData())->orderBy(['first_name' => SORT_ASC])->loop([
|
||||
'id',
|
||||
'email_login',
|
||||
'first_name',
|
||||
'last_name'
|
||||
]),
|
||||
'file_name' => 'Глобални_администратори_' . date('Y_m_d_H_i')
|
||||
];
|
||||
}
|
||||
]);
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нов глобален администратор',
|
||||
'title_edit' => 'Редакция на глобален администратор',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'user/admin-global' => 'Глобални администратори'
|
||||
]
|
||||
],
|
||||
'writeView' => 'user/write/admin-global_w',
|
||||
'model' => UserAdminGlobal::class,
|
||||
'validation' => function ($p) {
|
||||
if (isset($p->profile_update)) {
|
||||
if (empty($p->{'email_login'}))
|
||||
return ['email_login' => 'Моля, въведете ел. поща'];
|
||||
if (!filter_var($p->{'email_login'}, FILTER_VALIDATE_EMAIL))
|
||||
return ['email_login' => 'Моля, въведете валиден имейл адрес'];
|
||||
if (UserAdminGlobal::recordExists('email_login', $p->{'email_login'}))
|
||||
return ['email_login' => 'Този имейл адрес вече се ползва от друг глобален администратор'];
|
||||
}
|
||||
if (isset($p->password_change) || empty($_GET['id'])) {
|
||||
if (empty($p->{'password'}))
|
||||
return ['password' => 'Моля, въведете парола'];
|
||||
|
||||
if (strlen($p->{'password'}) < 6)
|
||||
return ['password' => 'Моля, въведете парола от поне 6 символа'];
|
||||
|
||||
if ($p->{'cPassword'} != $p->{'password'})
|
||||
return ['cPassword' => 'Повторното въвеждане на паролата не съвпада с първата'];
|
||||
}
|
||||
},
|
||||
'postService' => function ($p, UserAdminGlobal $model) {
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Записът е актуализиран успешно' : 'Записът е създадено успешно');
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1 @@
|
||||
<?php
|
||||
@@ -0,0 +1,63 @@
|
||||
<?php
|
||||
|
||||
|
||||
use app\models\register\Partner;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
TableWidget::widget([
|
||||
'filter' => [
|
||||
['name' => ['Наименование', 'c3']]
|
||||
],
|
||||
'top' => [
|
||||
'title' => 'Партньори',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'user/admin' => 'Потребители'
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
//'new' => 'Нов парньор',
|
||||
'edit' => 'Редакция на партньор',
|
||||
//'delete' => 'Изтриване на партньор'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c1 text-right',
|
||||
'logo' => '',
|
||||
'Име на партньор' => '',
|
||||
'Активен' => 'ct'
|
||||
],
|
||||
'data' => Partner::find()->where(Yii::$app->getFilterData('or'))->orderBy(['id' => SORT_DESC])->loop([
|
||||
'id',
|
||||
function (Partner $model) {
|
||||
return '<img src="' . $model->getSrcOfSingleImage('partner_logo_image', '1:1') . '" style="width:80px">';
|
||||
},
|
||||
function (Partner $model) {
|
||||
return '<a href="?o=w&id=' . $model->id . '">' . $model->name . '</a>';
|
||||
},
|
||||
function (Partner $model) {
|
||||
return $model->statusSwitch('active', null, ['Партньора е активен', 'Партньора е деактивиран']);
|
||||
}
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нов партньор',
|
||||
'title_edit' => 'Редакция на партньор',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'user/admin' => 'Потребители',
|
||||
'user/partner-org' => 'Партньори'
|
||||
]
|
||||
],
|
||||
'writeView' => 'user/write/partner_org_w',
|
||||
'model' => Partner::class,
|
||||
'validation' => function ($p) {
|
||||
},
|
||||
'postService' => function ($p, Partner $model) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Записът е актуализиран успешно' : 'Записът е създадено успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,169 @@
|
||||
<?php
|
||||
|
||||
use app\models\CmsRoles;
|
||||
use app\models\History;
|
||||
use app\models\register\Partner;
|
||||
use app\models\UserPartner;
|
||||
use app\services\Auth;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
TableWidget::widget([
|
||||
'filter' => [
|
||||
[
|
||||
'first_name' => ['Име', 'c1'],
|
||||
'last_name' => ['Фамилия', 'c1'],
|
||||
'partner_id' => ['Организация', 'c3', Partner::partnerList()],
|
||||
'role_id' => ['Роля/група', 'c2', CmsRoles::roleList()],
|
||||
'is_active' => ['Статус', 'c1', [1 => 'Активен', 'null' => 'Не активен']]
|
||||
],
|
||||
],
|
||||
'top' => [
|
||||
'title' => 'Потребители на партньор',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'user/admin-global' => 'Потребители'
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
//'new' => 'Нов потребител',
|
||||
'edit' => 'Редакция на потребител',
|
||||
//'delete' => 'Изтриване на потребител',
|
||||
'export' => 'Експорт (csv)'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c1 text-right',
|
||||
'Ел. поща' => '',
|
||||
'Име' => '',
|
||||
'Организация' => '',
|
||||
'Група / роля ' => '',
|
||||
'Бр. права' => 'c1',
|
||||
'История' => 'c0 ct',
|
||||
'Активен' => 'c0 ct'
|
||||
],
|
||||
'data' => UserPartner::find()->where(Yii::$app->getFilterData())->orderBy(['id' => SORT_DESC])->loop([
|
||||
'id',
|
||||
function (UserPartner $model) {
|
||||
return '<a href="?o=w&id=' . $model->id . '">' . $model->email_login . '</a>';
|
||||
},
|
||||
'fullName',
|
||||
function (UserPartner $model) {
|
||||
if ($model->partner)
|
||||
return $model->partner->name;
|
||||
},
|
||||
function (UserPartner $model) {
|
||||
if ($model->cmsRole)
|
||||
return $model->cmsRole->name;
|
||||
},
|
||||
function (UserPartner $model) {
|
||||
if ($model->getRightsIds())
|
||||
return sizeof($model->getRightsIds());
|
||||
},
|
||||
function (UserPartner $model) {
|
||||
return '<i data-table="user_partner" data-id="' . $model->id . '" class="la la-history historyButton"></i>';
|
||||
},
|
||||
function (UserPartner $model) {
|
||||
return $model->statusSwitch('is_active');
|
||||
}
|
||||
], $_GET['p'] ?? 1, 30),
|
||||
'exportData' => function () {
|
||||
return [
|
||||
'header' => [
|
||||
'ID' => ['integer', 10],
|
||||
'E-mail' => ['string', 50],
|
||||
'Име' => ['string', 20],
|
||||
'Фамилия' => ['string', 20],
|
||||
'Организация' => ['string', 50],
|
||||
'Група / роля' => ['string', 30]
|
||||
],
|
||||
'data' => UserPartner::find()->where(Yii::$app->getFilterData())->orderBy(['first_name' => SORT_ASC])->loop([
|
||||
'id',
|
||||
'email_login',
|
||||
'first_name',
|
||||
'last_name',
|
||||
function (UserPartner $userPartner) {
|
||||
return $userPartner->partner->name;
|
||||
},
|
||||
function (UserPartner $userPartner) {
|
||||
if ($userPartner->cmsRole)
|
||||
return $userPartner->cmsRole->name;
|
||||
}
|
||||
]),
|
||||
'file_name' => 'Партньори_' . date('Y_m_d_H_i')
|
||||
];
|
||||
}
|
||||
]);
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нов партньор',
|
||||
'title_edit' => 'Редакция на партньор',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'user/admin-global' => 'Потребители',
|
||||
'user/partner' => 'Партньори',
|
||||
]
|
||||
],
|
||||
'writeView' => 'user/write/partner_w',
|
||||
'model' => UserPartner::class,
|
||||
'validation' => function ($p, $f) {
|
||||
if (isset($p->profile_update)) {
|
||||
if (empty($p->{'email_login'}))
|
||||
return ['email_login' => 'Моля, въведете ел. поща'];
|
||||
|
||||
if (!filter_var($p->{'email_login'}, FILTER_VALIDATE_EMAIL))
|
||||
return ['email_login' => 'Моля, въведете валиден имейл адрес'];
|
||||
|
||||
if (UserPartner::recordExists('email_login', $p->{'email_login'}))
|
||||
return ['email_login' => 'Този имейл адрес вече се ползва от друг потребител на партньор'];
|
||||
|
||||
/*if (empty($_GET['id'])) {
|
||||
if (empty($p->{'password'}))
|
||||
return ['password' => 'Моля, въведете парола'];
|
||||
}
|
||||
if (!empty($p->{'password'})) {
|
||||
if (strlen($p->{'password'}) < 6)
|
||||
return ['password' => 'Моля, въведете парола от поне 6 символа'];
|
||||
if ($p->{'cPassword'} != $p->{'password'})
|
||||
return ['cPassword' => 'Повторното въвеждане на паролата не съвпада с първата'];
|
||||
}
|
||||
if (empty($p->{'first_name'}))
|
||||
return ['first_name' => 'Моля, попълнете име'];
|
||||
if (empty($p->{'middle_name'}))
|
||||
return ['middle_name' => 'Моля, попълнете презиме'];
|
||||
if (empty($p->{'last_name'}))
|
||||
return ['last_name' => 'Моля, попълнете фамилия'];
|
||||
*/
|
||||
if (empty($p->{'first_name'}))
|
||||
return ['first_name' => 'Моля, попълнете име'];
|
||||
if (empty($p->{'last_name'}))
|
||||
return ['last_name' => 'Моля, попълнете фамилия'];
|
||||
if (empty($p->{'partner_id'}))
|
||||
return ['partner_id' => 'Моля, изберете организация'];
|
||||
if (empty($p->{'role_id'}))
|
||||
return ['role_id' => 'Моля, изберете роля / група'];
|
||||
}
|
||||
if (isset($p->password_change) && !empty($_GET['id'])) {
|
||||
if (empty($p->{'password'}))
|
||||
return ['password' => 'Моля, въведете парола'];
|
||||
if (strlen($p->{'password'}) < 6)
|
||||
return ['password' => 'Моля, въведете парола от поне 6 символа'];
|
||||
if ($p->{'cPassword'} != $p->{'password'})
|
||||
return ['cPassword' => 'Повторното въвеждане на паролата не съвпада с първата'];
|
||||
}
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, UserPartner $model) {
|
||||
$model->setPostDataToModel();
|
||||
$model->uploadSingleImage('upload_image', 'user/partner');
|
||||
$model->save();
|
||||
if (!isset($p->{'rights'}))
|
||||
$p->{'rights'} = [];
|
||||
$model->updateRights($p->{'rights'});
|
||||
|
||||
History::addNew($model->id, 'user_partner', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
|
||||
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Записът е актуализиран успешно' : 'Записът е създадено успешно');
|
||||
Yii::$app->setRefresh();
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
use app\models\UserAdminGlobal;
|
||||
use app\services\Auth;
|
||||
use app\widgets\FormWidget;
|
||||
|
||||
$u = Auth::userAdminGlobal();
|
||||
$_GET['o'] = 'w';
|
||||
$_GET['id'] = $u->id;
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Профил',
|
||||
'title_edit' => 'Профил',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало'
|
||||
]
|
||||
],
|
||||
'writeView' => 'user/write/profile_w',
|
||||
'model' => UserAdminGlobal::class,
|
||||
'validation' => function ($p) {
|
||||
if (isset($p->profile_update)) {
|
||||
if (empty($p->{'email_login'}))
|
||||
return ['email_login' => 'Моля, въведете ел. поща'];
|
||||
if (!filter_var($p->{'email_login'}, FILTER_VALIDATE_EMAIL))
|
||||
return ['email_login' => 'Моля, въведете валиден имейл адрес'];
|
||||
if (UserAdminGlobal::recordExists('email_login', $p->{'email_login'}))
|
||||
return ['email_login' => 'Този имейл адрес вече се ползва от друг глобален администратор'];
|
||||
}
|
||||
if (isset($p->password_change) || empty($_GET['id'])) {
|
||||
if (empty($p->{'password'}))
|
||||
return ['password' => 'Моля, въведете парола'];
|
||||
|
||||
if (strlen($p->{'password'}) < 6)
|
||||
return ['password' => 'Моля, въведете парола от поне 6 символа'];
|
||||
|
||||
if ($p->{'cPassword'} != $p->{'password'})
|
||||
return ['cPassword' => 'Повторното въвеждане на паролата не съвпада с първата'];
|
||||
}
|
||||
},
|
||||
'postService' => function ($p, UserAdminGlobal $model) {
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Записът е актуализиран успешно' : 'Записът е създадено успешно');
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
$model->redirectTo('user/profile', true);
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,106 @@
|
||||
<?php
|
||||
|
||||
use app\models\UserAdminGlobal;
|
||||
use app\models\UserPublic;
|
||||
use app\services\Auth;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$filter = [];
|
||||
|
||||
$u = Auth::userAdminGlobal();
|
||||
|
||||
TableWidget::widget([
|
||||
'filter' => [
|
||||
['email' => ['Ел. поща', 'c3']]
|
||||
],
|
||||
'top' => [
|
||||
'title' => 'Потребители публичен портал',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'user/public' => 'Управление на потребители публичен портал'
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
//'new' => 'Нов потребител',
|
||||
//'edit' => 'Редакция потребител',
|
||||
//'delete' => 'Изтриване потребител',
|
||||
'export' => 'Експорт (csv)'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c0 text-right',
|
||||
'Ел. поща' => 'c3',
|
||||
'Име' => '',
|
||||
'Клубна карта' => 'c1 ct',
|
||||
'Активен' => 'c02 ct'
|
||||
],
|
||||
'data' => UserPublic::find()->where($filter)->andWhere(Yii::$app->getFilterData())->orderBy(['id' => SORT_DESC])->loop([
|
||||
'id',
|
||||
'email',
|
||||
'full_name',
|
||||
/*function (UserPublic $model) use ($u) {
|
||||
$disabled = $model->id == $u->id ? 'disabled' : null;
|
||||
return $model->statusSwitch('is_active', null, null, $disabled);
|
||||
},*/
|
||||
function (UserPublic $model) {
|
||||
return $model->club_card ? '<span style="color: green">да</span>' : '<span style="color: darkred">не</span>';
|
||||
},
|
||||
function (UserPublic $model) {
|
||||
return $model->statusSwitch('is_active', null, ['Потребителя е активиран', 'Потребителя е деактивиран']);
|
||||
}
|
||||
], $_GET['p'] ?? 1, 30),
|
||||
//'ignoreIds' => [$u->id],
|
||||
'exportData' => function () {
|
||||
return [
|
||||
'header' => [
|
||||
'ID' => ['integer', 10],
|
||||
'E-mail' => ['string', 50],
|
||||
'Име и фамилия' => ['string', 50],
|
||||
],
|
||||
'data' => UserPublic::find()->where(Yii::$app->getFilterData())->orderBy(['full_name' => SORT_ASC])->loop([
|
||||
'id',
|
||||
'full_name',
|
||||
'email',
|
||||
]),
|
||||
'file_name' => 'Потребители_публичен_портал' . date('Y_m_d_H_i')
|
||||
];
|
||||
}
|
||||
]);
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нов глобален администратор',
|
||||
'title_edit' => 'Редакция на глобален администратор',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'user/public' => 'Управление на потребители публичен портал'
|
||||
]
|
||||
],
|
||||
'writeView' => 'user/write/public-user_w',
|
||||
'model' => UserPublic::class,
|
||||
'validation' => function ($p) {
|
||||
if (isset($p->profile_update)) {
|
||||
if (empty($p->{'email'}))
|
||||
return ['email' => 'Моля, въведете ел. поща'];
|
||||
if (!filter_var($p->{'email'}, FILTER_VALIDATE_EMAIL))
|
||||
return ['email' => 'Моля, въведете валиден имейл адрес'];
|
||||
if (UserPublic::recordExists('email', $p->{'email'}))
|
||||
return ['email' => 'Този имейл адрес вече се ползва от потребител в публичен портал'];
|
||||
}
|
||||
if (isset($p->password_change) || empty($_GET['id'])) {
|
||||
if (empty($p->{'password'}))
|
||||
return ['password' => 'Моля, въведете парола'];
|
||||
|
||||
if (strlen($p->{'password'}) < 6)
|
||||
return ['password' => 'Моля, въведете парола от поне 6 символа'];
|
||||
|
||||
if ($p->{'cPassword'} != $p->{'password'})
|
||||
return ['cPassword' => 'Повторното въвеждане на паролата не съвпада с първата'];
|
||||
}
|
||||
},
|
||||
'postService' => function ($p, UserPublic $model) {
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Записът е актуализиран успешно' : 'Записът е създадено успешно');
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1 @@
|
||||
<?php
|
||||
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
Yii::$app->controller->pageTitle = 'Права';
|
||||
|
||||
use app\models\CmsRights;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
TableWidget::widget([
|
||||
'filter' => [
|
||||
['name' => ['Наименование', 'c3']]
|
||||
],
|
||||
'top' => [
|
||||
'title' => 'Права',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'user/admin' => 'Потребители'
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
'new' => 'Ново право',
|
||||
'edit' => 'Редакция на право',
|
||||
//'delete' => 'Изтриване на право'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c1 text-right',
|
||||
'Наименование на потребителското правото' => '',
|
||||
'Активен' => ''
|
||||
],
|
||||
'data' => CmsRights::find()->where(Yii::$app->getFilterData())->orderBy(['id' => SORT_DESC])->loop([
|
||||
'id',
|
||||
'name',
|
||||
function(CmsRights $model) {
|
||||
return $model->statusSwitch('is_active', null, ['Правото е активирано', 'Правото е деактивирано']);
|
||||
}
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Ново право',
|
||||
'title_edit' => 'Редакция на право',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'user/admin' => 'Потребители',
|
||||
'user/rights' => 'Права'
|
||||
]
|
||||
],
|
||||
'writeView' => 'user/write/rights_w',
|
||||
'model' => CmsRights::class,
|
||||
'validation' => function ($p) {
|
||||
if (empty($p->{'name'}))
|
||||
return ['name' => 'Моля, въведете наименование на правото'];
|
||||
if (CmsRights::recordExists('name', $p->{'name'}))
|
||||
return ['name' => 'Това право вече е въведено, моля използвайте друго наименование'];
|
||||
},
|
||||
'postService' => function ($p, CmsRights $model) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Записът е актуализиран успешно' : 'Записът е създадено успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
Yii::$app->controller->pageTitle = 'Роли / групи';
|
||||
|
||||
use app\models\CmsRoles;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
TableWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Роли / групи',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'user/admin' => 'Потребители'
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
'new' => 'Нова роля',
|
||||
'edit' => 'Редакция на роля',
|
||||
'delete' => 'Изтриване на роля'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c1 text-right',
|
||||
'Наименование на роля' => 'c3',
|
||||
'Описание на роля' => '',
|
||||
'Бр. зададени права' => ''
|
||||
],
|
||||
'data' => CmsRoles::find()->loop([
|
||||
'id',
|
||||
function (CmsRoles $model) {
|
||||
return '<a href="?o=w&id=' . $model->id . '">' . $model->name . '</a>';
|
||||
},
|
||||
'description',
|
||||
function (CmsRoles $model) {
|
||||
return sizeof($model->getRightsIds());
|
||||
}
|
||||
], $_GET['p'] ?? 1, 20)
|
||||
]);
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нова роля/група',
|
||||
'title_edit' => 'Редакция на роля/група',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'user/admin' => 'Потребители',
|
||||
'user/roles' => 'Роли / групи'
|
||||
]
|
||||
],
|
||||
'writeView' => 'user/write/roles_w',
|
||||
'model' => CmsRoles::class,
|
||||
'validation' => function ($p) {
|
||||
if (empty($p->{'user_type_id'}))
|
||||
return ['user_type_id' => 'Моля, изберете тип потребител'];
|
||||
if (empty($p->{'name'}))
|
||||
return ['name' => 'Моля, въведете наименование на ролята'];
|
||||
if (CmsRoles::recordExists('name', $p->{'name'}))
|
||||
return ['name' => 'Тази роля вече е ваведена, моля използвайте друго наименование'];
|
||||
},
|
||||
'postService' => function ($p, CmsRoles $model) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
if (!isset($p->{'rights'}))
|
||||
$p->{'rights'} = [];
|
||||
$model->updateRights($p->{'rights'});
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Записът е актуализиран успешно' : 'Записът е създадено успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
|
||||
]);
|
||||
@@ -0,0 +1,105 @@
|
||||
<?php
|
||||
use app\models\CmsRoles;
|
||||
use app\models\UserAdminCms;
|
||||
|
||||
/**
|
||||
* @var UserAdminCms $model
|
||||
*/
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
|
||||
<?php if (!empty($_GET['id'])): ?>
|
||||
<form autocomplete="off">
|
||||
<input name="password_change" type="hidden" value="1">
|
||||
<div class="row c7 top15">
|
||||
<div class="top-title">Смяна на парола</div>
|
||||
</div>
|
||||
<div class="c7 flex top15 top-page-panel">
|
||||
<div class="row c6 right10">
|
||||
<label class="require"><?= $model->password ? 'Нова парола' : 'Парола' ?></label>
|
||||
<input type="password" name="password"
|
||||
placeholder="<?= $model->password ? 'Смени паролата за логиин' : 'Въведи парола за логин в системата' ?> "
|
||||
value=""/>
|
||||
</div>
|
||||
<div class="row c6">
|
||||
<label class="require">Повтори паролата</label>
|
||||
<input type="password" name="cPassword" placeholder="Повторете паролата" value=""/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c7 top15 flex">
|
||||
<button class="btn btn-default"><i class="la la-lock"></i> Смени паролата</button>
|
||||
</div>
|
||||
</form>
|
||||
<?php endif ?>
|
||||
|
||||
<form autocomplete="off" class="top15">
|
||||
<input name="profile_update" type="hidden" value="1">
|
||||
<div class="row c7">
|
||||
<div class="top-title">Данни на потребителя</div>
|
||||
</div>
|
||||
<div class="row c7 flex top15">
|
||||
<div class="right10 c6">
|
||||
<label class="require">Потребител (ел. поща)</label>
|
||||
<input name="email_login" placeholder="Въведи ел. поща за логин в системата"
|
||||
value="<?= $model->email_login ?>"/>
|
||||
</div>
|
||||
<div class="c6">
|
||||
<label>Телефон</label>
|
||||
<input name="phone" placeholder="Въведи телефон"
|
||||
value="<?= $model->phone ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c7 top15 flex">
|
||||
<div class="right10 c6">
|
||||
<label>Име</label>
|
||||
<input name="first_name" placeholder="Име" value="<?= $model->first_name ?>">
|
||||
</div>
|
||||
<div class="c6">
|
||||
<label>Фамилия</label>
|
||||
<input name="last_name" placeholder="Фамилия" value="<?= $model->last_name ?>">
|
||||
</div>
|
||||
</div>
|
||||
<?php if (empty($_GET['id'])): ?>
|
||||
<div class="c7 flex top15">
|
||||
<div class="row c6 right10">
|
||||
<label class="require"><?= $model->password ? 'Нова парола' : 'Парола' ?></label>
|
||||
<input type="password" name="password"
|
||||
placeholder="<?= $model->password ? 'Смени паролата за логиин' : 'Въведи парола за логин в системата' ?> "
|
||||
value=""/>
|
||||
</div>
|
||||
<div class="row c6">
|
||||
<label class="require">Повтори паролата</label>
|
||||
<input type="password" name="cPassword" placeholder="Повторете паролата" value=""/>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<div class="row c7 top15 flex">
|
||||
<?=\app\widgets\services\Includes::formButtons('user/admin-cms')?>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function updateCheckListByRole(e) {
|
||||
if(e.value) {
|
||||
request({
|
||||
url: e.dataset.update + '?role_id=' + e.value,
|
||||
done: r => {
|
||||
if(r.rights) {
|
||||
all('.check-list input', e => {
|
||||
e.checked = false;
|
||||
});
|
||||
r.rights.forEach(e => {
|
||||
console.log(e)
|
||||
const inputRight = one('.check-list input[value="'+ e +'"]');
|
||||
inputRight.checked = true;
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
} else {
|
||||
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
use app\models\UserAdminGlobal;
|
||||
use app\widgets\services\Includes;
|
||||
/**
|
||||
* @var UserAdminGlobal $model
|
||||
*/
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
<?php if (!empty($_GET['id'])): ?>
|
||||
<!--
|
||||
<form autocomplete="off">
|
||||
<input name="password_change" type="hidden" value="1">
|
||||
<div class="row c7 top15">
|
||||
<div class="top-title">Смяна на парола</div>
|
||||
</div>
|
||||
<div class="c7 flex top15 top-page-panel">
|
||||
<div class="row c6 right10">
|
||||
<label class="require"><?= $model->password ? 'Нова парола' : 'Парола' ?></label>
|
||||
<input type="password" name="password"
|
||||
placeholder="<?= $model->password ? 'Смени паролата за логиин' : 'Въведи парола за логин в системата' ?> "
|
||||
value=""/>
|
||||
</div>
|
||||
<div class="row c6">
|
||||
<label class="require">Повтори паролата</label>
|
||||
<input type="password" name="cPassword" placeholder="Повторете паролата" value=""/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c7 top15 flex">
|
||||
<button class="btn btn-default"><i class="la la-lock"></i> Смени паролата</button>
|
||||
</div>
|
||||
</form>
|
||||
-->
|
||||
<?php endif ?>
|
||||
<form autocomplete="off" class="top15">
|
||||
<input name="profile_update" type="hidden" value="1">
|
||||
<div class="row c7">
|
||||
<div class="top-title">Данни на потребителя</div>
|
||||
</div>
|
||||
<div class="row c7 flex top15">
|
||||
<div class="right10 c6">
|
||||
<label class="require">Потребител (ел. поща)</label>
|
||||
<input readonly name="email_login" placeholder="Въведи ел. поща за логин в системата"
|
||||
value="<?= $model->email_login ?>"/>
|
||||
</div>
|
||||
<div class="c6">
|
||||
<label>Телефон</label>
|
||||
<input name="phone" placeholder="Въведи телефон"
|
||||
value="<?= $model->phone ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c7 top15 flex">
|
||||
<div class="right10 c6">
|
||||
<label>Име</label>
|
||||
<input name="first_name" placeholder="Име" value="<?= $model->first_name ?>">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php if (empty($_GET['id'])): ?>
|
||||
<div class="c7 flex top15">
|
||||
<div class="row c6 right10">
|
||||
<label class="require"><?= $model->password ? 'Нова парола' : 'Парола' ?></label>
|
||||
<input type="password" name="password"
|
||||
placeholder="<?= $model->password ? 'Смени паролата за логиин' : 'Въведи парола за логин в системата' ?> "
|
||||
value=""/>
|
||||
</div>
|
||||
<div class="row c6">
|
||||
<label class="require">Повтори паролата</label>
|
||||
<input type="password" name="cPassword" placeholder="Повторете паролата" value=""/>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<div class="row c7 top15 flex">
|
||||
<?= Includes::formButtons('user/admin-global'); ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
@@ -0,0 +1,148 @@
|
||||
<?php
|
||||
|
||||
use app\widgets\FileWidget;
|
||||
|
||||
/**
|
||||
* @var \app\models\register\Partner $model
|
||||
*/
|
||||
$media_key = $model->getMediaKey();
|
||||
?>
|
||||
<div class="inner-content p20">
|
||||
<div class="row top15">
|
||||
<a style="width: 200px; text-align: center"
|
||||
href="<?= Yii::$app->goTo('user/partner-org') ?><?= isset($_GET['p']) ? '?p=' . $_GET['p'] : '' ?>"
|
||||
class="btn btn-default right10"><i class="la la-undo"></i> Обратно в списъка</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="inner-content p10">
|
||||
<form autocomplete="off">
|
||||
<div class="row c5">
|
||||
<h2><?= $model->name ?></h2>
|
||||
</div>
|
||||
<div class="row top30" style="width: 350px">
|
||||
<label>Лого</label>
|
||||
<?= FileWidget::widget([
|
||||
'media_type' => 'image',
|
||||
'object_key' => 'partner_logo_image',
|
||||
'media_key' => $media_key,
|
||||
'files' => $model->getFiles('thumb'),
|
||||
'actions' => [
|
||||
'add' => 'Добавяне',
|
||||
'edit' => 'Редакция',
|
||||
'delete' => 'Премахване'
|
||||
],
|
||||
'single_file' => true,
|
||||
'resolutions' => ['1:1'],
|
||||
'max_file_size' => 2,
|
||||
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
|
||||
]) ?>
|
||||
</div>
|
||||
<div class="row top15" style="width: 350px">
|
||||
<label>Хедър изображение за страницата на партньор</label>
|
||||
<?= FileWidget::widget([
|
||||
'media_type' => 'image',
|
||||
'object_key' => 'partner_header_image',
|
||||
'media_key' => $media_key,
|
||||
'files' => $model->getFiles('thumb'),
|
||||
'actions' => [
|
||||
'add' => 'Добавяне',
|
||||
'edit' => 'Редакция',
|
||||
'delete' => 'Премахване'
|
||||
],
|
||||
'single_file' => true,
|
||||
'resolutions' => ['21:5'],
|
||||
'max_file_size' => 4,
|
||||
'error_message' => 'Файловете по-големи от 4МБ, не бяха добавени'
|
||||
]) ?>
|
||||
</div>
|
||||
<div class="row top15 c5">
|
||||
<label>Описание</label>
|
||||
<p><?= $model->description ?></p>
|
||||
</div>
|
||||
<div class="row top15 c5">
|
||||
<label>Уебсайт</label>
|
||||
<p><?= $model->website ?></p>
|
||||
</div>
|
||||
<div class="row top15 c5">
|
||||
<label>Телефон</label>
|
||||
<p><?= $model->phone ?></p>
|
||||
</div>
|
||||
<div class="row top15 c5">
|
||||
<label>E-mail</label>
|
||||
<p><?= $model->email ?></p>
|
||||
</div>
|
||||
<div class="row c15 top15 top-page-panel">
|
||||
<label>Ауторизирани публични потребители</label>
|
||||
<p class="upload-info">* изберете потребители, които да бъдат ауторизирани да проверяват направените
|
||||
резервации в деня и часа на дадено събитие, публикувано партньора.</p>
|
||||
<div class="flex">
|
||||
<div style="width: 700px">
|
||||
<select id="auth_users" style="display:none;" class="search-select-box" multiple
|
||||
name="user_list[]">
|
||||
<option disabled value="">-- избери потребител --</option>
|
||||
<?php foreach ($model->userPublicList() as $item): ?>
|
||||
<option <?= $item['selected'] ?>
|
||||
value="<?= $item['id'] ?>"><?= $item['name'] ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div onclick="updateQrValidators()" id="update_qr_validators" class="btn btn-default"
|
||||
style="width: 200px; text-align: center; height: 10px; line-height: 10px; margin-left: 10px">
|
||||
Актуализирай
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p class="upload-info">Партньорът ще бъде визоализиран на сайта, след като има качено и обработено лого
|
||||
изображение за него във формат 1:1</p>
|
||||
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script src="/_public/assets/js/order.js"></script>
|
||||
<script src="/_public/assets/js/file-img.js"></script>
|
||||
<script src="/_public/plugins/cropperJs/cropper.min.js"></script>
|
||||
<script src="/_public/assets/js/search-box.js"></script>
|
||||
|
||||
<script>
|
||||
all('.search-select-box').forEach(el => {
|
||||
var s = new SearchBox(el)
|
||||
})
|
||||
|
||||
|
||||
function updateQrValidators() {
|
||||
|
||||
const selectEl = document.getElementById("auth_users");
|
||||
const selectedOptions = [];
|
||||
|
||||
for (let i = 0; i < selectEl.options.length; i++) {
|
||||
if (selectEl.options[i].selected) {
|
||||
selectedOptions.push(selectEl.options[i].value);
|
||||
}
|
||||
}
|
||||
console.log(selectedOptions)
|
||||
|
||||
request({
|
||||
url: '/remote/update-qr-validators/',
|
||||
post: {
|
||||
validators: selectedOptions,
|
||||
partner_id: '<?= $model->id ?>'
|
||||
},
|
||||
done: (r) => {
|
||||
console.log(r)
|
||||
if(r && r.success) {
|
||||
flash.success('Списъка с потребители е актуализиран успешно', false)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
<?php if ($model->id && !$model->media_key): ?>
|
||||
<script>
|
||||
const media_key = '<?= $media_key ?>';
|
||||
request({
|
||||
url: window.location.href + '&media_key_update=1',
|
||||
post: {media_key: media_key}
|
||||
})
|
||||
</script>
|
||||
<?php endif; ?>
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
<?php
|
||||
|
||||
use app\models\CmsRoles;
|
||||
use app\models\register\Partner;
|
||||
use app\models\UserPartner;
|
||||
use app\services\JWT;
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
/**
|
||||
* @var \app\models\UserPartner $model
|
||||
*/
|
||||
?>
|
||||
|
||||
<div class="inner-content p10">
|
||||
<form autocomplete="off">
|
||||
<input name="profile_update" type="hidden" value="1">
|
||||
<div class="row c7 top15">
|
||||
<div class="top-title">Данни на потребителя</div>
|
||||
</div>
|
||||
<div class="row c7 top15">
|
||||
<div class="c6">
|
||||
<label>Снимка</label>
|
||||
<div class="image-upload cursor-default">
|
||||
<div class="actions"
|
||||
data-image-name="upload_image"
|
||||
data-add="Добави снимка"
|
||||
data-edit="Смени снимката"
|
||||
data-remove="Премахни снимката"
|
||||
data-remove-msg="Искате ли снимката да бъде премахната?"
|
||||
data-remove-ready="Снимката е премахната"
|
||||
data-warning="Снимката ще се актуализира след запазване на цялата форма"
|
||||
data-default="la la-user"
|
||||
data-src="<?= $model->getSingleImageSrc('user/partner') ?>"
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c7 top15 flex">
|
||||
<div class="right10 c6">
|
||||
<label class="require">Служебен имейл</label>
|
||||
<input name="email_login" placeholder="Въведи ел. поща за логин в системата" value="<?= $model->email_login?>"/>
|
||||
</div>
|
||||
<div class="right10 c6">
|
||||
<label class="require">Име</label>
|
||||
<input name="first_name" placeholder="Име" value="<?= $model->first_name ?>">
|
||||
</div>
|
||||
<div class="c6">
|
||||
<label class="require">Фамилия</label>
|
||||
<input name="last_name" placeholder="Фамилия" value="<?= $model->last_name ?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c7 top15 flex">
|
||||
<div class="c6 right10">
|
||||
<label>Организация</label>
|
||||
<select style="pointer-events: none; appearance: none; border: 0; width: calc(100% - 10px); font-weight: bold; color: #1e6ab3; background: #f1f1f1" readonly="" name="partner_id">
|
||||
<option disabled selected>-- Избери организация --</option>
|
||||
<?php foreach (Partner::partnerList() as $id => $name): ?>
|
||||
<option <?= $model->partner_id == $id ? 'selected' : '' ?>
|
||||
value="<?= $id ?>"><?= $name ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c7 top15">
|
||||
<div class="c8">
|
||||
<label>Представяне</label>
|
||||
<textarea name="presentation"><?= $model->presentation ?></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c7 top15">
|
||||
<div class="c8">
|
||||
<label class="require">Роля / група</label>
|
||||
<select name="role_id" data-update="<?= Yii::$app->goTo('role-rights') ?>"
|
||||
onchange="updateCheckListByRole(this)">
|
||||
<option disabled selected>-- Избери роля / група --</option>
|
||||
<?php foreach (CmsRoles::roleList() as $id => $name): ?>
|
||||
<option <?= $model->role_id == $id ? 'selected' : '' ?> value="<?= $id ?>"><?= $name ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c7 flex top15">
|
||||
<div class="row c8">
|
||||
<label>Добавяне на права</label>
|
||||
<div class="p10 border-default">
|
||||
<input onkeyup="searchInCheckList(this)" placeholder="Филтър на права">
|
||||
<div class="check-list p10 border-default top5" style="width: calc(100% - 20px)">
|
||||
<?= UserPartner::getRightList($model) ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c7 top15 flex">
|
||||
<?= Includes::formButtons('user/partner') ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<script src="/_public/plugins/cropperJs/cropper.min.js"></script>
|
||||
<script>
|
||||
function updateCheckListByRole(e) {
|
||||
if (e.value) {
|
||||
request({
|
||||
url: e.dataset.update + '?role_id=' + e.value,
|
||||
done: r => {
|
||||
if (r.rights) {
|
||||
all('.check-list input', e => {
|
||||
e.checked = false;
|
||||
});
|
||||
r.rights.forEach(e => {
|
||||
console.log(e)
|
||||
const inputRight = one('.check-list input[value="' + e + '"]');
|
||||
inputRight.checked = true;
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
} else {
|
||||
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
use app\models\UserAdminGlobal;
|
||||
|
||||
/**
|
||||
* @var UserAdminGlobal $model
|
||||
*/
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
|
||||
<?php if (!empty($_GET['id'])): ?>
|
||||
<?php if(!$model->open_id): ?>
|
||||
<form autocomplete="off">
|
||||
<input name="password_change" type="hidden" value="1">
|
||||
<div class="row c7 top15">
|
||||
<div class="top-title">Смяна на парола</div>
|
||||
</div>
|
||||
<div class="c7 flex top15 top-page-panel">
|
||||
<div class="row c6 right10">
|
||||
<label class="require"><?= $model->password ? 'Нова парола' : 'Парола' ?></label>
|
||||
<input type="password" name="password"
|
||||
placeholder="<?= $model->password ? 'Смени паролата за логиин' : 'Въведи парола за логин в системата' ?> "
|
||||
value=""/>
|
||||
</div>
|
||||
<div class="row c6">
|
||||
<label class="require">Повтори паролата</label>
|
||||
<input type="password" name="cPassword" placeholder="Повторете паролата" value=""/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c7 top15 flex">
|
||||
<button class="btn btn-default"><i class="la la-save"></i> Смяна на парола</button>
|
||||
</div>
|
||||
</form>
|
||||
<?php endif; ?>
|
||||
<?php endif ?>
|
||||
<form autocomplete="off" class="top15">
|
||||
<div class="row c7 top15">
|
||||
<div class="top-title">Данни на потребителя</div>
|
||||
</div>
|
||||
<input name="profile_update" type="hidden" value="1">
|
||||
<div class="c7 top15">
|
||||
<div class="row flex">
|
||||
<div class="right10 c6">
|
||||
<label class="require">Потребител (ел. поща)</label>
|
||||
<input name="email_login" placeholder="Въведи ел. поща за логин в системата"
|
||||
value="<?= $model->email_login ?>"/>
|
||||
</div>
|
||||
<div class="c6">
|
||||
<label>Телефон</label>
|
||||
<input name="phone" placeholder="Въведи телефон"
|
||||
value="<?= $model->phone ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row top15 flex">
|
||||
<div class="right10 c6">
|
||||
<label>Име</label>
|
||||
<input name="first_name" placeholder="Име" value="<?= $model->first_name ?>">
|
||||
</div>
|
||||
<div class="c6">
|
||||
<label>Фамилия</label>
|
||||
<input name="last_name" placeholder="Фамилия" value="<?= $model->last_name ?>">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c7 top15 flex">
|
||||
<button class="btn btn-default"><i class="la la-save"></i> Актуализирай</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
use app\models\UserAdminGlobal;
|
||||
use app\widgets\services\Includes;
|
||||
exit;
|
||||
/**
|
||||
* @var \app\models\UserPublic $model
|
||||
*/
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
<?php if (!empty($_GET['id'])): ?>
|
||||
<form autocomplete="off">
|
||||
<input name="password_change" type="hidden" value="1">
|
||||
<div class="row c7 top15">
|
||||
<div class="top-title">Смяна на парола</div>
|
||||
</div>
|
||||
<div class="c7 flex top15 top-page-panel">
|
||||
<div class="row c6 right10">
|
||||
<label class="require"><?= $model->password ? 'Нова парола' : 'Парола' ?></label>
|
||||
<input type="password" name="password"
|
||||
placeholder="<?= $model->password ? 'Смени паролата за логиин' : 'Въведи парола за логин в системата' ?> "
|
||||
value=""/>
|
||||
</div>
|
||||
<div class="row c6">
|
||||
<label class="require">Повтори паролата</label>
|
||||
<input type="password" name="cPassword" placeholder="Повторете паролата" value=""/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c7 top15 flex">
|
||||
<button class="btn btn-default"><i class="la la-lock"></i> Смени паролата</button>
|
||||
</div>
|
||||
</form>
|
||||
<?php endif ?>
|
||||
<form autocomplete="off" class="top15">
|
||||
<input name="profile_update" type="hidden" value="1">
|
||||
<div class="row c7">
|
||||
<div class="top-title">Данни на потребителя</div>
|
||||
</div>
|
||||
<div class="row c7 flex top15">
|
||||
<div class="right10 c6">
|
||||
<label class="require">Потребител (ел. поща)</label>
|
||||
<input name="email" placeholder="Въведи ел. поща за логин в системата"
|
||||
value="<?= $model->email ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c7 top15 flex">
|
||||
<div class="right10 c6">
|
||||
<label>Име и фамилия</label>
|
||||
<input name="full_name" placeholder="Име" value="<?= $model->full_name ?>">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php if (empty($_GET['id'])): ?>
|
||||
<div class="c7 flex top15">
|
||||
<div class="row c6 right10">
|
||||
<label class="require"><?= $model->password ? 'Нова парола' : 'Парола' ?></label>
|
||||
<input type="password" name="password"
|
||||
placeholder="<?= $model->password ? 'Смени паролата за логиин' : 'Въведи парола за логин в системата' ?> "
|
||||
value=""/>
|
||||
</div>
|
||||
<div class="row c6">
|
||||
<label class="require">Повтори паролата</label>
|
||||
<input type="password" name="cPassword" placeholder="Повторете паролата" value=""/>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<div class="row c7 top15 flex">
|
||||
<?= Includes::formButtons('user/public'); ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
use app\models\CmsRights;
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
/**
|
||||
* @var CmsRights $model
|
||||
*/
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
<form autocomplete="off">
|
||||
<div class="row c5">
|
||||
<label class="require">Наименование на право</label>
|
||||
<input name="name" placeholder="Въведи наименование потребителското право" value="<?= $model->name ?>"/>
|
||||
</div>
|
||||
<div class="row c5 top15 flex">
|
||||
<?= Includes::formButtons('user/rights') ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
use app\models\CmsRights;
|
||||
use app\models\CmsRoles;
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
/**
|
||||
* @var CmsRoles $model
|
||||
*/
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
<form autocomplete="off">
|
||||
<div class="row c5">
|
||||
<label class="require">Тип потребител</label>
|
||||
<select name="user_type_id">
|
||||
<option disabled selected>-- Избери тип потребител --</option>
|
||||
<?php foreach (CmsRoles::roleUserTypes() as $id => $roleUserType): ?>
|
||||
<option <?= $model->user_type_id == $id ? 'selected' : '' ?> value="<?= $id ?>"><?=$roleUserType?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="row c5 top15">
|
||||
<label class="require">Наименование на роля / група</label>
|
||||
<input name="name" placeholder="Въведи наименование на ролята / групата" value="<?= $model->name ?>"/>
|
||||
</div>
|
||||
<div class="row c5 top15">
|
||||
<label>Описание на роля / група</label>
|
||||
<input name="description" placeholder="Въведи кратко описание на ролята / групата"
|
||||
value="<?= $model->description ?>"/>
|
||||
</div>
|
||||
<div class="row c5 top15">
|
||||
<label>Добавяне на права</label>
|
||||
<div class="p10 border-default">
|
||||
<input onkeyup="searchInCheckList(this)" placeholder="Филтър на права">
|
||||
<div class="check-list p10 border-default top5" style="width: calc(100% - 20px)">
|
||||
<?= CmsRights::getHtmlList($model) ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c5 top15 flex">
|
||||
<?= Includes::formButtons('user/roles') ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
use app\models\CommonFields;
|
||||
|
||||
$commonFields = CommonFields::find()->where(['IS', 'parent_id', NULL])->all();
|
||||
?>
|
||||
<div class="advanced-filter filter">
|
||||
<div class="filter-header">
|
||||
<div class="close-filter"><i class="la la-remove"></i></div>
|
||||
</div>
|
||||
<div class="filter-body">
|
||||
<div class="row top15">
|
||||
<label>Вид шаблон</label>
|
||||
<select style="display: none" class="objet_type_select" multiple >
|
||||
<option value="">-- без филтър --</option>
|
||||
</select>
|
||||
</div>
|
||||
<?php foreach ($commonFields as $commonField): ?>
|
||||
<div class="row top15">
|
||||
<label><?= $commonField->name ?></label>
|
||||
<select style="display: none" class="advanced-select" multiple >
|
||||
<option value="">-- без филтър --</option>
|
||||
<?php foreach ($commonField->options as $option): ?>
|
||||
<option value="<?= $option->id ?>"><?= $option->name ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,72 @@
|
||||
<?php
|
||||
|
||||
|
||||
use app\models\Expositions;
|
||||
use app\models\ExpositionsCategories;
|
||||
use app\models\History;
|
||||
use app\services\Auth;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
/**
|
||||
* @var $listtabs
|
||||
* @var $tab
|
||||
*/
|
||||
|
||||
TableWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Експозиции категории',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
]
|
||||
],
|
||||
'listTabs' => $listtabs,
|
||||
'actions' => [
|
||||
'new' => 'Нова категория',
|
||||
'edit' => 'Редакция на категория',
|
||||
'delete' => 'Изтриване на категори'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c0 text-right',
|
||||
'Име на категория (bg)' => '',
|
||||
'Име на категория (en)' => '',
|
||||
],
|
||||
'data' => ExpositionsCategories::find()->where([])->orderBy(['id' => SORT_ASC])->loop([
|
||||
'id',
|
||||
function (ExpositionsCategories $model) {
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
|
||||
},
|
||||
'name_en'
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нова категория',
|
||||
'title_edit' => 'Редакция на категория',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions?listtab=categories' => 'Категории експозиции'
|
||||
],
|
||||
],
|
||||
'tabs' => ['main' => '<i class="la la-database"></i> Основни данни'],
|
||||
'writeView' => "web-portal/tabs/" . Includes::tab($tab) . "/expositions_categories_w",
|
||||
'model' => ExpositionsCategories::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
if ($tab == 'main') {
|
||||
if (empty($p->{'name'}))
|
||||
return ["name" => 'Моля, въведете име на категорията'];
|
||||
if (empty($p->{'name_en'}))
|
||||
return ["name_en" => 'Моля, въведете име на категорията на английски'];
|
||||
}
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, ExpositionsCategories $model) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
History::addNew($model->id, 'expositions-categories', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Категорията експозиция е актуализирана успешно' : 'Категорията експозиция е създадена успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,132 @@
|
||||
<?php
|
||||
|
||||
use app\models\Expositions;
|
||||
use app\models\ExpositionsObjects;
|
||||
use app\models\History;
|
||||
use app\models\register\Partner;
|
||||
use app\services\Auth;
|
||||
use app\services\Formatter;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
/**
|
||||
* @var $listtabs
|
||||
* @var $tab
|
||||
*/
|
||||
TableWidget::widget([
|
||||
'filter' => [
|
||||
[
|
||||
'name' => ['Име', 'c4'],
|
||||
'partner_id' => ['Организация', 'c3', Partner::partnerList()],
|
||||
'is_for_publish' => ['За публикувне', 'c1', [1 => 'да', 'null' => 'не']],
|
||||
'is_active' => ['Публикувано', 'c1', [1 => 'да', 'null' => 'не']]
|
||||
]
|
||||
],
|
||||
'top' => [
|
||||
'title' => 'Експозиции на обекти',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало'
|
||||
]
|
||||
],
|
||||
'listTabs' => $listtabs,
|
||||
'actions' => [
|
||||
'new' => 'Нова експозиция',
|
||||
'edit' => 'Редакция на експозиция',
|
||||
'delete' => 'Изтриване на експозиция'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c0 text-right',
|
||||
'Име на експозиция' => '',
|
||||
'История' => 'c1 ct',
|
||||
'Добавена в избрани' => 'c1 ct',
|
||||
'За публикуване' => 'c1 ct',
|
||||
'Публикувана' => 'c1 ct',
|
||||
'Дата на публикуване' => 'c1 ct',
|
||||
],
|
||||
'data' => Expositions::find()->where(Yii::$app->getFilterData('or'))->orderBy(['id' => SORT_DESC])->loop([
|
||||
'id',
|
||||
function (Expositions $model) {
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
|
||||
},
|
||||
function (Expositions $model) {
|
||||
return '<i data-table="expositions" data-id="' . $model->id . '" class="la la-history historyButton"></i>';
|
||||
},
|
||||
function (Expositions $model) {
|
||||
return $model->statusSwitch('is_selected', null, ['Експозицията е добавена в избрани', 'Експозицията е махната от избрани']);
|
||||
},
|
||||
function (Expositions $model) {
|
||||
return $model->is_for_publish ? '<span id="blink_' . $model->id . '" class="' . (!$model->is_active ? 'blink-green' : '') . '">да</span>' : 'не';
|
||||
},
|
||||
function (Expositions $model) {
|
||||
return $model->statusSwitch('is_active', null, ['Експозицията е видима на сайта', 'Експозицията е свалена от сайта']);
|
||||
},
|
||||
function (Expositions $model) {
|
||||
if ($model->publish_date)
|
||||
return Formatter::date($model->publish_date);
|
||||
},
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
FormWidget::widget([
|
||||
|
||||
'top' => [
|
||||
'title' => 'Нова експозиция',
|
||||
'title_edit' => 'Редакция на експозиция',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Експозиции на обекти'
|
||||
],
|
||||
],
|
||||
'tabs' => $tabs ?? [],
|
||||
'writeView' => "web-portal/tabs/" . Includes::tab($tab) . "/expositions_w",
|
||||
'model' => Expositions::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
if ($tab == 'main') {
|
||||
if (empty($p->{'name'}))
|
||||
return ["name" => 'Моля, въведете име на експозицията'];
|
||||
if (empty($p->{'ts_en_name'}))
|
||||
return ["ts_en_name" => 'Моля, въведете име на експозицията на английски'];
|
||||
if (empty($p->{'category_id'}))
|
||||
return ["category_id" => 'Моля, изберете категория на експозицията'];
|
||||
if (empty($p->{'annotation'}))
|
||||
return ["annotation" => 'Моля, въведете анотация на експозицията'];
|
||||
if (empty($p->{'description'}))
|
||||
return ["description" => 'Моля, въведете описание на експозицията'];
|
||||
if (empty($p->{'partner_id'}))
|
||||
return ["partner_id" => 'Моля, изберете партноьор, който представя експозицията'];
|
||||
if (empty($p->{'info_center'}))
|
||||
return ["info_center" => 'Моля, попълнете име на информационен център'];
|
||||
if (empty($p->{'info_center_address'}))
|
||||
return ["info_center_address" => 'Моля, попълнете адрес на информационен център'];
|
||||
} else if (Includes::inLocales($tab)) {
|
||||
if (empty($p->{$tab . '_annotation'}))
|
||||
return [$tab . "_annotation" => 'Моля, въведете анотация на експозицията'];
|
||||
if (empty($p->{$tab . '_description'}))
|
||||
return [$tab . "_description" => 'Моля, въведете описание на експозицията'];
|
||||
if (empty($p->{$tab . '_info_center'}))
|
||||
return [$tab . "_info_center" => 'Моля, попълнете име на информационен център'];
|
||||
if (empty($p->{$tab . '_info_center_address'}))
|
||||
return [$tab . "_info_center_address" => 'Моля, попълнете адрес на информационен център'];
|
||||
}
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, Expositions $model) {
|
||||
if (!empty($p->{'exposition_id'}) && !empty($p->{'object_id'}) && !empty($p->{'delete'})) {
|
||||
$eo = ExpositionsObjects::find()->where(['exposition_id' => $p->{'exposition_id'}, 'object_id' => $p->{'object_id'}])->one();
|
||||
if ($eo)
|
||||
$eo->delete();
|
||||
echo json_encode(['success' => 1, 'message' => '']);
|
||||
exit;
|
||||
}
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
if (empty($p->{'tag_list'})) {
|
||||
$model->updateExpositionTags([]);
|
||||
} else {
|
||||
$model->updateExpositionTags($p->{'tag_list'});
|
||||
}
|
||||
History::addNew($model->id, 'expositions', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Експозицията е актуализирана успешно' : 'Експозицията е създадена успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
use app\models\ExpositionsTags;
|
||||
use app\widgets\FormWidget;
|
||||
|
||||
$_GET['o'] = 'w';
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Експозиции тагове',
|
||||
'title_edit' => '',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
],
|
||||
],
|
||||
'writeView' => "web-portal/tabs/main/expositions_tags_w",
|
||||
'model' => ExpositionsTags::class,
|
||||
'validation' => function ($p) {
|
||||
|
||||
},
|
||||
'postService' => function ($p, ExpositionsTags $model) {
|
||||
$model->setPostDataToModel();
|
||||
|
||||
if (isset($p->{'name'}) && $p->name == 'null')
|
||||
$model->name = null;
|
||||
if (isset($p->{'name_en'}) && $p->name_en == 'null')
|
||||
$model->name_en = null;
|
||||
|
||||
$model->save();
|
||||
echo json_encode(['id' => $model->id]);
|
||||
exit;
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
/**
|
||||
* @var $expId
|
||||
*/
|
||||
$filterData = [];
|
||||
|
||||
?>
|
||||
<style>
|
||||
.filter-box {
|
||||
position: fixed;
|
||||
right: 0;
|
||||
height: calc(100% - 137px);
|
||||
background: #FFFFFF;
|
||||
width: 600px;
|
||||
top: 45px;
|
||||
transform: translateX(650px);
|
||||
transition: all 0.3s;
|
||||
padding: 30px 20px 10px 30px;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
.filter-box.open {
|
||||
transform: translateX(0);
|
||||
}
|
||||
|
||||
|
||||
</style>
|
||||
<div class="filter-box">
|
||||
<div class="row">
|
||||
<label>Реф. номер</label>
|
||||
<input data-format="integer" id="filter_object_ref_num" value="<?= $_GET['ref_num'] ?? ''?>" style="width: 200px">
|
||||
</div>
|
||||
<div class="row top15">
|
||||
<label>Име на обект</label>
|
||||
<input id="filter_object_name" value="<?= $_GET['name'] ?? ''?>">
|
||||
</div>
|
||||
<div class="flex flex-center top15">
|
||||
<div onclick="filterExpObjects()" class="btn-ib btn-default"><i class="la la-filter"></i> Филтрирай</div>
|
||||
<div onclick="clearFilterExpObjects()" class="btn-ib btn-rem"><i class="la la-remove"></i> Изчисти</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<script>
|
||||
//dataFormat()
|
||||
</script>
|
||||
|
||||
<!-- //filter_object_name -->
|
||||
@@ -0,0 +1,310 @@
|
||||
<style>
|
||||
.page-navbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.header {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.cms-table {
|
||||
margin: 45px 0 35px 0;
|
||||
}
|
||||
|
||||
.pagination {
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
justify-content: left !important;
|
||||
background: #FFFFFF;
|
||||
padding: 15px;
|
||||
box-shadow: 0 -3px 10px rgba(0, 0, 0, 0.3);
|
||||
width: 100%;
|
||||
margin-left: 0 !important;
|
||||
}
|
||||
|
||||
.page-content {
|
||||
width: 100%;
|
||||
padding: 0 !important;
|
||||
}
|
||||
|
||||
.flex.top {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
background: #FFFFFF;
|
||||
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.3);
|
||||
z-index: 10000;
|
||||
padding-left: 15px;
|
||||
margin-left: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.flex.top .top-title {
|
||||
padding-top: 15px !important;
|
||||
padding-bottom: 10px !important;
|
||||
width: 100%;
|
||||
white-space: nowrap;
|
||||
overflow-x: hidden;
|
||||
font-size: 16px;
|
||||
color: var(--base-background-dark);
|
||||
}
|
||||
|
||||
.inner-content {
|
||||
padding: 1px !important;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.filter-button {
|
||||
position: fixed;
|
||||
right: 15px;
|
||||
bottom: 70px;
|
||||
height: 50px !important;
|
||||
width: 50px !important;
|
||||
text-align: center;
|
||||
line-height: 60px;
|
||||
cursor: pointer;
|
||||
border-radius: 100%;
|
||||
border: 1px solid var(--base-background-dark);
|
||||
background: #FFFFFF;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
|
||||
z-index: 100000;
|
||||
}
|
||||
|
||||
.filter-button:hover {
|
||||
background: var(--base-background-ultra-bright-clear);
|
||||
}
|
||||
|
||||
.filter-button .la {
|
||||
font-size: 25px;
|
||||
color: var(--base-background-dark);
|
||||
}
|
||||
|
||||
.breadcrumb {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
<?php
|
||||
/**
|
||||
* @var $this \yii\web\View
|
||||
*/
|
||||
|
||||
use app\models\History;
|
||||
use app\models\RegisterObjects;
|
||||
use app\services\Auth;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
|
||||
$_GET['tab'] = $tab;
|
||||
|
||||
$title = null;
|
||||
$expId = null;
|
||||
$partner_id = null;
|
||||
|
||||
if (!empty($_GET['expId'])) {
|
||||
$exp = \app\models\Expositions::findOne($_GET['expId']);
|
||||
if ($exp) {
|
||||
$title = $exp->name;
|
||||
$expId = $exp->id;
|
||||
$partner_id = $exp->partner_id;
|
||||
}
|
||||
}
|
||||
|
||||
if(!$partner_id) exit;
|
||||
|
||||
|
||||
$specialCondition = [];
|
||||
|
||||
$specialCondition['partner_id'] = $partner_id;
|
||||
$specialCondition['lib_type'] = 1;
|
||||
|
||||
if(!empty($_GET['ref_num'])) {
|
||||
$specialCondition['ref_num'] = (int)$_GET['ref_num'];
|
||||
}
|
||||
|
||||
if(!empty($_GET['name'])) {
|
||||
$specialCondition['name'] = $_GET['name'];
|
||||
}
|
||||
|
||||
$data = RegisterObjects::find()->where($specialCondition)->orderBy(['date_updated' => SORT_DESC]);
|
||||
|
||||
TableWidget::widget([
|
||||
//'advanced_filter' => $this->render('_advanced_filters/object'),
|
||||
'top' => [
|
||||
'title' => $title ? 'Експозиция: ' . $title : '',
|
||||
'data' => [
|
||||
//'index/dashboard' => 'Начало',
|
||||
//'web-portal/expositions' => 'Уебпортал',
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
// 'edit' => 'Редакция на обект',
|
||||
// 'delete' => 'Изтриване на обект'
|
||||
],
|
||||
'th' => [
|
||||
//'ID' => 'c05 text-right',
|
||||
'Реф. №' => 'c05 text-right',
|
||||
'Добавяне в експозицията' => 'c1',
|
||||
'Изображение' => 'ct c1',
|
||||
'Наименование' => '',
|
||||
],
|
||||
'data' => $data->loop([
|
||||
//'id',
|
||||
'ref_num',
|
||||
function (RegisterObjects $model) use ($expId) {
|
||||
$button = $model->isAddedToExposition($expId);
|
||||
return '<div data-exposition-id="' . $expId . '" data-object-id="' . $model->id . '" class="flex flex-center">' . $button . '</div>';
|
||||
},
|
||||
function (RegisterObjects $model) {
|
||||
if ($model->mainImgFile) {
|
||||
return '<img src="' . $model->mainImgFile . '" style="height: 130px">';
|
||||
}
|
||||
},
|
||||
function (RegisterObjects $model) {
|
||||
if ($model->name)
|
||||
return $model->name;
|
||||
},
|
||||
/*function (RegisterObjects $model) {
|
||||
if ($model->city)
|
||||
return $model->city->place;
|
||||
},*/
|
||||
|
||||
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
|
||||
],
|
||||
'tabs' => $tabs ?? [],
|
||||
'writeView' => empty($_GET['id']) ? "web-portal/tabs/main/register_objects_w" : "web-portal/tabs/" . Includes::tab($tab) . "/register_objects_w",
|
||||
'model' => RegisterObjects::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
if ($tab == 'main') {
|
||||
if (empty($_GET['id'])) {
|
||||
//NEW OBJECT
|
||||
if (empty($p->{'sc_id'}))
|
||||
return ['sc_id' => 'Моля, изберете категория'];
|
||||
if (empty($p->{'sc_id'}))
|
||||
return ['ot_id' => 'Моля, изберете шаблон на обект'];
|
||||
} else {
|
||||
//UPDATE GENERAL DATA
|
||||
if (empty($p->{'name'}))
|
||||
return ['name' => 'Моля, въведете име на обекта'];
|
||||
if (empty($p->{'annotation'}))
|
||||
return ['annotation' => 'Моля, въведете анотация'];
|
||||
if (empty($p->{'description'}))
|
||||
return ['description' => 'Моля, въведете описание'];
|
||||
}
|
||||
} else if (Includes::inLocales($tab)) {
|
||||
if (empty($p->{$tab . '_name'}))
|
||||
return [$tab . '_name' => 'Моля, въведете име на обекта'];
|
||||
if (empty($p->{$tab . '_annotation'}))
|
||||
return [$tab . '_annotation' => 'Моля, въведете анотация'];
|
||||
if (empty($p->{$tab . '_description'}))
|
||||
return [$tab . '_description' => 'Моля, въведете описание'];
|
||||
}
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, RegisterObjects $model) use ($tab) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
History::addNew($model->id, 'register_objects', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
|
||||
if (empty($_GET['media_key_update'])) {
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Обекта е актуализиран успешно' : 'Обекта е създаден успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
}
|
||||
]);
|
||||
echo $this->render('_list_object_filter', ['expId' => $expId])
|
||||
?>
|
||||
<script>
|
||||
function addExpObject(elem) {
|
||||
const exposition_id = elem.parentNode.dataset.expositionId;
|
||||
const object_id = elem.parentNode.dataset.objectId;
|
||||
elem.classList.add('disabled')
|
||||
request({
|
||||
url: '/remote/add-object-to-exposition/',
|
||||
post: {
|
||||
exposition_id,
|
||||
object_id
|
||||
},
|
||||
done: (e) => {
|
||||
if (e.error) {
|
||||
flash.error('Този обект вече е добавен, изберете друг', true);
|
||||
} else {
|
||||
flash.success('Обекта е добавен към експозицията', true);
|
||||
elem.parentNode.innerHTML = '<div onclick="removeExpObject(this)" class="btn-rem btn-ib"><i class="la la-remove"></i> Премахни</div>'
|
||||
}
|
||||
window.parent.loadExpositionObjects()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function removeExpObject(elem) {
|
||||
const exposition_id = elem.parentNode.dataset.expositionId;
|
||||
const object_id = elem.parentNode.dataset.objectId;
|
||||
elem.classList.add('disabled');
|
||||
request({
|
||||
url: '/remote/remove-object-from-exposition/',
|
||||
post: {
|
||||
exposition_id,
|
||||
object_id
|
||||
},
|
||||
done: (e) => {
|
||||
if (e.error) {
|
||||
} else {
|
||||
flash.success('Обекта е премахнат от експозицията', true);
|
||||
elem.parentNode.innerHTML = '<div onclick="addExpObject(this)" class="btn-ib btn-default"><i class="la la-plus-circle"></i> Добави</div>'
|
||||
window.parent.loadExpositionObjects()
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
window.addEventListener('DOMContentLoaded', function () {
|
||||
const top = document.querySelector('.inner-content');
|
||||
const fbx = document.querySelector('.filter-box');
|
||||
const fb = one('filter-button', top);
|
||||
fb.innerHTML = '<i class="la la-search"></i>'
|
||||
fb.addEventListener('click', () => {
|
||||
if (fbx.classList.contains('open')) {
|
||||
fbx.classList.remove('open')
|
||||
fb.innerHTML = '<i class="la la-search"></i>';
|
||||
} else {
|
||||
fbx.classList.add('open')
|
||||
fb.innerHTML = '<i class="la la-remove"></i>';
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
function filterExpObjects() {
|
||||
let expId = '<?= $_GET['expId'] ?? '' ?>';
|
||||
let p = '<?= $_GET['p'] ?? '1' ?>';
|
||||
let filter_object_ref_num = document.querySelector('#filter_object_ref_num')
|
||||
let filter_object_name = document.querySelector('#filter_object_name')
|
||||
let filters = [];
|
||||
|
||||
if (filter_object_name.value !== '')
|
||||
filters.push(`name=${filter_object_name.value}`)
|
||||
|
||||
if (filter_object_ref_num.value !== '')
|
||||
filters.push(`ref_num=${filter_object_ref_num.value}`)
|
||||
|
||||
let q = ''
|
||||
|
||||
if(filters.length > 0) {
|
||||
q = `&${filters.join('&')}`
|
||||
}
|
||||
|
||||
window.location.href = `?expId=${expId}&p=${p}${q}`
|
||||
}
|
||||
|
||||
function clearFilterExpObjects() {
|
||||
let expId = '<?= $_GET['expId'] ?? '' ?>';
|
||||
window.location.href = `?expId=${expId}`
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,128 @@
|
||||
<?php
|
||||
|
||||
use app\models\Campaigns;
|
||||
use app\models\History;
|
||||
use app\models\register\Partner;
|
||||
use app\services\Auth;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
|
||||
|
||||
TableWidget::widget([
|
||||
'filter' => [
|
||||
[
|
||||
'event_dates' => ['Дата', 'c2 fDatepicker'],
|
||||
'title' => ['Заглавие на кампанията', 'c4'],
|
||||
'partner_id' => ['Организация', 'c3', Partner::partnerList()],
|
||||
'is_for_publish' => ['За публикувне', 'c1', [1 => 'да', 'null' => 'не']],
|
||||
'is_active' => ['Публикувана', 'c1', [1 => 'да', 'null' => 'не']]
|
||||
],
|
||||
],
|
||||
'top' => [
|
||||
'title' => 'Кампании',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уеб портал',
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
'new' => 'Нова кампания',
|
||||
'edit' => 'Редакция на кампания',
|
||||
'delete' => 'Изтриване на кампания'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c1 text-right',
|
||||
'Заглавие' => '',
|
||||
'Дати на кампанията' => '',
|
||||
'Партньор' => 'c4',
|
||||
'Тематични зони' => 'c0 ct',
|
||||
'История' => 'c0 ct',
|
||||
'За публикуване' => 'c0 ct',
|
||||
'Публикуване' => 'c0 ct',
|
||||
],
|
||||
'data' => Campaigns::find()->where(Yii::$app->getFilterData())->orderBy(['id' => SORT_DESC])->loop([
|
||||
'id',
|
||||
function (Campaigns $model) {
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->title . '</a>';
|
||||
},
|
||||
function (Campaigns $model) {
|
||||
$event_dates = '';
|
||||
foreach (explode(',', $model->event_dates) as $d) {
|
||||
$event_dates .= '<div class="badge-dark right3">' . date('d.m.Y', strtotime($d)) . '</div>';
|
||||
}
|
||||
return '<div class="flex-wrap">' . $event_dates . '</div>';
|
||||
},
|
||||
function (Campaigns $model) {
|
||||
if ($model->partner)
|
||||
return $model->partner->name;
|
||||
},
|
||||
function (Campaigns $model) {
|
||||
return '<i data-article-key="'.$model->article_key.'" class="la la-stream positionButton"></i>';
|
||||
},
|
||||
function (Campaigns $model) {
|
||||
return '<i data-table="campaigns" data-id="' . $model->id . '" class="la la-history historyButton"></i>';
|
||||
},
|
||||
function (Campaigns $model) {
|
||||
return $model->is_for_publish ? '<span data-published="Пуликувана" data-unpublished="да" id="blink_' . $model->id . '" class="' . (!$model->is_active ? 'blink-green' : '') . '">'. ((!$model->is_active) ? 'да' : 'Публикувана').'</span>' : 'не';
|
||||
},
|
||||
function (Campaigns $model) {
|
||||
return $model->statusSwitch('is_active', null, ['Кампанията е публикувана на сайта', 'Кампанията е свалена от сайта']);
|
||||
}
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нова кампания',
|
||||
'title_edit' => 'Редакция на кампания',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уеб портал',
|
||||
'web-portal/campaigns' => 'Кампании'
|
||||
],
|
||||
],
|
||||
'tabs' => [
|
||||
'main' => '<i class="la la-database"></i> Основни данни',
|
||||
'ts_en' => '<i class="lg lg-en"></i> Превод английски'
|
||||
],
|
||||
'writeView' => "web-portal/tabs/" . Includes::tab($tab) . "/campaigns_w",
|
||||
'model' => Campaigns::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
if ($tab == 'main') {
|
||||
if (empty($p->{'event_dates'}))
|
||||
return ["event_dates" => 'Моля, въведете дати на кампанията'];
|
||||
if (empty($p->{"title"}))
|
||||
return ["title" => 'Моля, въведете заглавие на кампанията'];
|
||||
if (empty($p->{"partner_id"}))
|
||||
return ["partner_id" => 'Моля, изберете организация'];
|
||||
if (empty($p->{"text_short"}))
|
||||
return ["text_short" => 'Моля, въведете кратък текст на кампанията'];
|
||||
if (empty($p->{"text"}))
|
||||
return ["text" => 'Моля, въведете пълен текст на кампанията'];
|
||||
if (!empty($p->{"stream_url"})) {
|
||||
if (empty($p->{"stream_access"}))
|
||||
return ["stream_access" => 'Моля, изберете стрийминг достъп'];
|
||||
}
|
||||
}
|
||||
if (Includes::inLocales($tab)) {
|
||||
if (empty($p->{$tab . "_title"}))
|
||||
return [$tab . "_title" => 'Моля, въведете заглавие на кампанията'];
|
||||
if (empty($p->{$tab . "_text_short"}))
|
||||
return [$tab . "_text_short" => 'Моля, въведете кратък текст на кампанията'];
|
||||
if (empty($p->{$tab . "_text"}))
|
||||
return [$tab . "_text" => 'Моля, въведете пълен текст на кампанията'];
|
||||
}
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, Campaigns $model) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
\app\models\Articles::updateArticle($model);
|
||||
History::addNew($model->id, 'campaigns', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Кампанията е актуализирана успешно' : 'Кампанията е създадена успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
use app\models\register\Partner;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
use app\models\register\Collections;
|
||||
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
|
||||
$filter = Yii::$app->getFilterData('and');
|
||||
|
||||
$filter[0] = 'and';
|
||||
$filter[] = ['=', 'deleted', 0];
|
||||
$filter[] = ['=', 'active', 1];
|
||||
$filter[] = ['=', 'published', 1];
|
||||
|
||||
TableWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Колекции',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало'
|
||||
]
|
||||
],
|
||||
'filter' => [
|
||||
[
|
||||
'name' => ['Заглавие на колекция', 'c4'],
|
||||
'partner_id' => ['Организация', 'c3', Partner::partnerList()],
|
||||
'is_selected' => ['Избрани колекции', 'c1', [1 => 'да', 'null' => 'не']],
|
||||
'private' => ['С абонамент', 'c1', [1 => 'да', 'null' => 'не']]
|
||||
],
|
||||
],
|
||||
'actions' => [
|
||||
//'new' => 'Нова категория',
|
||||
//'edit' => 'Преглед на колекция',
|
||||
// 'delete' => 'Изтриване на колекция'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c0 text-right',
|
||||
'Колекция' => '',
|
||||
'Изображение' => '',
|
||||
'Партньор' => '',
|
||||
'Добавена в избрани' => '',
|
||||
'Достъп с абонамент' => '',
|
||||
],
|
||||
'data' => Collections::find()
|
||||
->where(['or', ['=', 'is_payable', 0], ['IS', 'is_payable', null]])
|
||||
->andWhere($filter)
|
||||
->orderBy(['modified_on' => SORT_DESC])
|
||||
->loop([
|
||||
'id',
|
||||
function (Collections $model) {
|
||||
return '<a href="?o=w&id=' . $model->id . '">' . $model->name . '</a>';
|
||||
},
|
||||
function (Collections $model) {
|
||||
if ($model->thumbnail && $model->thumbnail != "''")
|
||||
return '<img src="' . Yii::$app->params['register'] . '/uploads/collections/' . $model->thumbnail . '" style="height: 200px">';
|
||||
},
|
||||
function (Collections $model) {
|
||||
if ($model->partner)
|
||||
return $model->partner->name;
|
||||
},
|
||||
function (Collections $model) {
|
||||
return $model->statusSwitch('is_selected', null, ['Колекцията е добавена в избрани', 'Колекцията е махната от избрани']);
|
||||
},
|
||||
function (Collections $model) {
|
||||
return $model->statusSwitch('private', null, ['Колекцията е само за лица с платен абонамент', 'Колекцията е за всички']);
|
||||
}
|
||||
], $_GET['p'] ?? 1, 50)
|
||||
]);
|
||||
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нова колекция',
|
||||
'title_edit' => 'Преглед на колекция',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions/' => 'Уебпортал',
|
||||
'web-portal/collections/' => 'Колекции'
|
||||
],
|
||||
],
|
||||
'tabs' => [
|
||||
//'main' => '<i class="la la-database"></i> Основни данни',
|
||||
//'ts_en' => '<i class="lg lg-en"></i> Превод английски'
|
||||
],
|
||||
'writeView' => "web-portal/tabs/" . Includes::tab($tab) . "/collections_register_w",
|
||||
'model' => Collections::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
|
||||
},
|
||||
'postService' => function ($p, Collections $model) {
|
||||
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,11 @@
|
||||
<div class="inner-content p10">
|
||||
<div class="row c2">
|
||||
<div class="top-title" style="color: var(--base-background);">Изберете вида на събитието</div>
|
||||
</div>
|
||||
<div class="row flex top15">
|
||||
<?php foreach (\app\models\Events::eventTypes() as $type => $title): ?>
|
||||
<a href="<?= Yii::$app->setQueryString(['type' => $type]) ?>"
|
||||
class="btn btn-default right5"><?= $title ?></a>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,140 @@
|
||||
<?php
|
||||
|
||||
use app\models\History;
|
||||
use app\models\register\CollectionsObjects;
|
||||
use app\models\RegisterObjects;
|
||||
use app\services\Auth;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
|
||||
$_GET['tab'] = $tab;
|
||||
|
||||
if (!empty($_GET['id'])) {
|
||||
//$tabs['nomenclature'] = '<i class="la la-clipboard-list"></i> Номенклатури';
|
||||
$tabs['main'] = '<i class="la la-database"></i> Основни данни';
|
||||
$tabs['ts_en'] = '<i class="lg lg-en"></i> Превод английски';
|
||||
//$tabs['media'] = '<i class="la la-file-movie-o"></i> Медия файлове';
|
||||
}
|
||||
|
||||
|
||||
$condition = Yii::$app->getFilterData('or', ['identifier']);
|
||||
$identifier = null;
|
||||
if (!empty($_GET['q'])) {
|
||||
|
||||
foreach (explode('|', $_GET['q']) as $id) {
|
||||
$filter = explode(':', $id);
|
||||
if ($filter[0] == 'identifier' && !empty($filter[1])) {
|
||||
$identifier = $filter[1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$data = RegisterObjects::find();
|
||||
$data->where(['lib_type' => 2]);
|
||||
if ($identifier) {
|
||||
$data->innerJoinWith('library');
|
||||
$data->andWhere([
|
||||
'or',
|
||||
['LIKE', 'lib_identifier_isbn_print', $identifier],
|
||||
['LIKE', 'lib_identifier_isbn_online', $identifier],
|
||||
['LIKE', 'lib_identifier_issn_print', $identifier],
|
||||
['LIKE', 'lib_identifier_issn_online', $identifier],
|
||||
['LIKE', 'lib_identifier_doi', $identifier],
|
||||
['LIKE', 'lib_identifier_ismn', $identifier],
|
||||
['LIKE', 'lib_identifier_isan', $identifier],
|
||||
]);
|
||||
}
|
||||
|
||||
$data->andWhere($condition)
|
||||
->orderBy(['date_updated' => SORT_DESC]);
|
||||
|
||||
TableWidget::widget([
|
||||
'filter' => [
|
||||
[
|
||||
'identifier' => ['Идентификатор', 'c2'],
|
||||
'name' => ['Наименование', 'c3'],
|
||||
'ref_num' => ['Реф.№', 'c1'],
|
||||
'partner_id' => ['Партньор', 'c3', \app\models\register\Partner::partnerList()]
|
||||
|
||||
]
|
||||
],
|
||||
//'advanced_filter' => $this->render('_advanced_filters/object'),
|
||||
'top' => [
|
||||
'title' => 'Е-библиотека',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уебпортал',
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
'edit' => 'Преглед на публикация',
|
||||
//'delete' => 'Изтриване'
|
||||
],
|
||||
'th' => [
|
||||
'ID' => 'c05 text-right',
|
||||
'Реф. №' => 'c05 text-right',
|
||||
'Наименование' => 'c2 ct',
|
||||
'Изображение' => 'ct c1',
|
||||
'Партньор' => 'c2 ct',
|
||||
'Дата на добавяне' => 'ct',
|
||||
'Дата на последна актуализация' => 'ct',
|
||||
'Публикувана' => '',
|
||||
],
|
||||
'data' => $data->loop([
|
||||
'id',
|
||||
'ref_num',
|
||||
function (RegisterObjects $model) {
|
||||
if ($model->name)
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
|
||||
},
|
||||
function (RegisterObjects $model) {
|
||||
if ($model->mainImgFile) {
|
||||
return '<img src="' . $model->mainImgFile . '" style="height: 130px">';
|
||||
}
|
||||
},
|
||||
function (RegisterObjects $model) {
|
||||
if ($model->partner)
|
||||
return $model->partner->name;
|
||||
},
|
||||
function (RegisterObjects $model) {
|
||||
//date published
|
||||
if ($model->date_added)
|
||||
return date('d.m.Y H:i', strtotime($model->date_added));
|
||||
},
|
||||
function (RegisterObjects $model) {
|
||||
//date published
|
||||
if ($model->date_updated)
|
||||
return date('d.m.Y H:i', strtotime($model->date_updated));
|
||||
},
|
||||
function (RegisterObjects $model) {
|
||||
//return $model->is_active ? 'да': ''
|
||||
return $model->statusSwitch('is_active', null, ['Публикацията е публикувана на сайта', 'Публикацията е свалена от сайта']);
|
||||
},
|
||||
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нова публикация',
|
||||
'title_edit' => 'Преглед на публикация',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уебпортал',
|
||||
'web-portal/e-library' => 'Е-библиотека'
|
||||
],
|
||||
],
|
||||
'tabs' => $tabs ?? [],
|
||||
'writeView' => empty($_GET['id']) ? "web-portal/tabs/main/e_library_w" : "web-portal/tabs/" . Includes::tab($tab) . "/e_library_w",
|
||||
'model' => RegisterObjects::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
},
|
||||
'postService' => function ($p, RegisterObjects $model) use ($tab) {
|
||||
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,208 @@
|
||||
<?php
|
||||
|
||||
use app\models\Events;
|
||||
use app\models\History;
|
||||
use app\models\Partner;
|
||||
use app\models\PriceObject;
|
||||
use app\services\Auth;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$model = Events::getModel();
|
||||
|
||||
$typeTitle = '';
|
||||
|
||||
|
||||
//exit;
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
|
||||
if (!empty($_GET['type'])) {
|
||||
if ($_GET['type'] == 'booking')
|
||||
$tabs['booking'] = '<i class="la la-cog"></i> Резервация';
|
||||
if ($_GET['type'] == 'online')
|
||||
$tabs['online'] = '<i class="la la-cog"></i> Стрийминг';
|
||||
$tabs['main'] = '<i class="la la-database"></i> Основни данни';
|
||||
$tabs['ts_en'] = '<i class="lg lg-en"></i> Превод английски';
|
||||
$typeTitle = Events::eventTypes($_GET['type']);
|
||||
$typeTitle = $typeTitle ? " [ $typeTitle ]" : "";
|
||||
}
|
||||
|
||||
if (!empty($_GET['id'])) {
|
||||
if ($model->type == 'online')
|
||||
$tabs['online'] = '<i class="la la-cog"></i> Стрийминг';
|
||||
if ($model->type == 'booking')
|
||||
$tabs['booking'] = '<i class="la la-cog"></i> Резервация';
|
||||
$tabs['main'] = '<i class="la la-database"></i> Основни данни';
|
||||
$tabs['ts_en'] = '<i class="lg lg-en"></i> Превод английски';
|
||||
$typeTitle = Events::eventTypes($model->type);
|
||||
$typeTitle = $typeTitle ? " [ $typeTitle ]" : "";
|
||||
}
|
||||
|
||||
TableWidget::widget([
|
||||
'filter' => [
|
||||
[
|
||||
'type' => ['Вид събитие', 'c3', Events::eventTypes()],
|
||||
'event_dates' => ['Дата', 'c2 fDatepicker'],
|
||||
'title' => ['Заглавие на събитието', 'c4'],
|
||||
'partner_id' => ['Организация', 'c3', Partner::partnerList()],
|
||||
'is_for_publish' => ['За публикувне', 'c1', [1 => 'да', 'null' => 'не']],
|
||||
'is_active' => ['Публикувано', 'c1', [1 => 'да', 'null' => 'не']]
|
||||
],
|
||||
],
|
||||
'top' => [
|
||||
'title' => 'Събития',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уебпортал',
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
'new' => 'Ново събитие',
|
||||
'edit' => 'Редакция на събитие',
|
||||
'delete' => 'Изтриване на събитие'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c1 text-right',
|
||||
'Заглавие' => 'c3',
|
||||
'Вид събитие' => '',
|
||||
'Достъп' => 'c0 ct',
|
||||
'Дати на събитието' => 'c4',
|
||||
'Партньор' => 'c3',
|
||||
|
||||
'Тематични зони' => 'c0 ct',
|
||||
'История' => 'c0 ct',
|
||||
'За публикуване' => 'c0 ct',
|
||||
'Публикуване' => 'c0 ct'
|
||||
],
|
||||
'data' => Events::find()->where(Yii::$app->getFilterData('or'))->orderBy(['id' => SORT_DESC])->loop([
|
||||
'id',
|
||||
function (Events $model) {
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->title . '</a>';
|
||||
},
|
||||
function (Events $model) {
|
||||
return str_replace('събитие', '', Events::eventTypes($model->type));
|
||||
},
|
||||
function (Events $model) {
|
||||
|
||||
$access = [1 => 'частен достъп', 2 => 'свободно'];
|
||||
switch ($model->type) {
|
||||
case 'online':
|
||||
return !empty($access[$model->stream_access]) ? $access[$model->stream_access] : 'не определен';
|
||||
case 'booking':
|
||||
return 'с резервация';
|
||||
case 'simple':
|
||||
return 'свободно';
|
||||
}
|
||||
},
|
||||
function (Events $model) {
|
||||
$event_dates = '';
|
||||
foreach (explode(',', $model->event_dates) as $d) {
|
||||
$event_dates .= '<div class="badge-dark right3">' . date('d.m.Y', strtotime($d)) . '</div>';
|
||||
}
|
||||
return '<div class="flex-wrap">' . $event_dates . '</div>';
|
||||
},
|
||||
function (Events $model) {
|
||||
if ($model->partner)
|
||||
return $model->partner->name;
|
||||
},
|
||||
|
||||
function (Events $model) {
|
||||
return '<i data-article-key="'.$model->article_key.'" class="la la-stream positionButton"></i>';
|
||||
},
|
||||
function (Events $model) {
|
||||
return '<i data-table="events" data-id="' . $model->id . '" class="la la-history historyButton"></i>';
|
||||
},
|
||||
function (Events $model) {
|
||||
return $model->is_for_publish ? '<span data-published="Пуликувано" data-unpublished="да" id="blink_' . $model->id . '" class="' . (!$model->is_active ? 'blink-green' : '') . '">'. ((!$model->is_active) ? 'да' : 'Публикувано').'</span>' : 'не';
|
||||
},
|
||||
function (Events $model) {
|
||||
return $model->statusSwitch('is_active', null, ['Събитието е публикувано на сайта', 'Събитието е свалено от сайта']);
|
||||
}
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Ново събитие' . $typeTitle,
|
||||
'title_edit' => 'Редакция на събитие' . $typeTitle,
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уебпортал',
|
||||
'web-portal/events' => 'Събития'
|
||||
],
|
||||
],
|
||||
'tabs' => $tabs ?? [],
|
||||
'writeView' => empty($_GET['id']) && empty($_GET['type']) ? "web-portal/default/events_w" : "web-portal/tabs/" . Includes::tab($tab) . "/events_w",
|
||||
'model' => Events::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
|
||||
if ($tab == 'main') {
|
||||
if (empty($p->{'event_dates'}))
|
||||
return ["event_dates" => 'Моля, въведете дати на събитието'];
|
||||
if (empty($p->{"title"}))
|
||||
return ["title" => 'Моля, въведете заглавие на събитието'];
|
||||
if (empty($p->{"partner_id"}))
|
||||
return ["partner_id" => 'Моля, изберете организация'];
|
||||
if (empty($p->{"text_short"}))
|
||||
return ["text_short" => 'Моля, въведете кратък текст на събитието'];
|
||||
if (empty($p->{"text"}))
|
||||
return ["text" => 'Моля, въведете пълен текст на събитието'];
|
||||
} else if (Includes::inLocales($tab)) {
|
||||
if (empty($p->{$tab . "_title"}))
|
||||
return [$tab . "_title" => 'Моля, въведете заглавие на събитието'];
|
||||
if (empty($p->{$tab . "_text_short"}))
|
||||
return [$tab . "_text_short" => 'Моля, въведете кратък текст на събитието'];
|
||||
if (empty($p->{$tab . "_text"}))
|
||||
return [$tab . "_text" => 'Моля, въведете пълен текст на събитието'];
|
||||
} else if ($tab == 'booking') {
|
||||
if (empty($p->{'daily_open_time'}))
|
||||
return ['daily_open_time' => 'Моля, попълнете вярно времето за дневно посещение'];
|
||||
if (empty($p->{'max_visitors'}))
|
||||
return ['max_visitors' => 'Моля, попълнете максимален брой посетители за деня'];
|
||||
} else if ($tab == 'online') {
|
||||
if (empty($p->{'daily_open_time'}))
|
||||
return ['daily_open_time' => 'Моля, изберете време, в което стийминга ще бъде излъчен'];
|
||||
if (empty($p->{"stream_url"}))
|
||||
return ["stream_url" => 'Моля, попълнете стрийминг линк'];
|
||||
if ($p->{"stream_access"} == 1 && $p->{"stream_purchase_type"} == 'individual_price' && empty($p->{"stream_price"}))
|
||||
return ['stream_price' => 'Моля, попълнете индивидуална цена'];
|
||||
}
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, Events $model) {
|
||||
$model->setPostDataToModel();
|
||||
|
||||
if (!empty($p->{'stream_access'})) {
|
||||
if ($p->{'stream_access'} == 2) {
|
||||
$model->stream_purchase_type = null;
|
||||
$model->stream_price = null;
|
||||
} else {
|
||||
if ($model->stream_purchase_type == 'subscription') {
|
||||
$model->stream_price = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$model->setFirstLast();
|
||||
|
||||
$model->save();
|
||||
if ($model->type == 'booking') {
|
||||
if(!empty($p->{'price_object'})) {
|
||||
foreach ($p->{'price_object'} as $key => $object) {
|
||||
$keyArr = explode('_', $key);
|
||||
$priceObject = $keyArr[0] == 'id' ? PriceObject::findOne($keyArr[1]) : new PriceObject();
|
||||
$priceObject->text_bg = $object['text_bg'];
|
||||
$priceObject->text_en = $object['text_en'];
|
||||
$priceObject->price = $object['price'];
|
||||
$priceObject->event_id = $model->id;
|
||||
$priceObject->save();
|
||||
}
|
||||
}
|
||||
}
|
||||
\app\models\Articles::updateArticle($model);
|
||||
History::addNew($model->id, 'events', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Събитието е актуализирано успешно' : 'Събитието е създадено успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,72 @@
|
||||
<?php
|
||||
|
||||
use app\models\Expositions;
|
||||
use app\models\ExpositionsCategories;
|
||||
use app\models\History;
|
||||
use app\services\Auth;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$model = ExpositionsCategories::getModel();
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
|
||||
$tabs = [
|
||||
];
|
||||
|
||||
|
||||
TableWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Експозиции категории',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало'
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
'new' => 'Нова категория',
|
||||
'edit' => 'Редакция на категория',
|
||||
'delete' => 'Изтриване на категори'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c0 text-right',
|
||||
'Наименование на категория (bg)' => '',
|
||||
'Наименование на категория (en)' => '',
|
||||
],
|
||||
'data' => ExpositionsCategories::find()->where([])->orderBy(['id' => SORT_ASC])->loop([
|
||||
'id',
|
||||
function (ExpositionsCategories $model) {
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
|
||||
},
|
||||
'name_en'
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нова колекция',
|
||||
'title_edit' => 'Редакция на експозиция',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Експозиции на обекти'
|
||||
],
|
||||
],
|
||||
'tabs' => $tabs ?? [],
|
||||
'writeView' => "web-portal/tabs/" . Includes::tab($tab) . "/expositions_categories_w",
|
||||
'model' => ExpositionsCategories::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
if ($tab == 'main') {
|
||||
if (empty($p->{'name'}))
|
||||
return ["name" => 'Моля, въведете име на категорията'];
|
||||
if (empty($p->{'name_en'}))
|
||||
return ["name_en" => 'Моля, въведете име на категорията на английски'];
|
||||
}
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, ExpositionsCategories $model) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
History::addNew($model->id, 'expositions-categories', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Категорията експозиция е актуализирана успешно' : 'Категорията експозиция е създадена успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
/**
|
||||
* @var $this \yii\web\View
|
||||
*/
|
||||
|
||||
use app\models\Expositions;
|
||||
|
||||
|
||||
$model = Expositions::getModel();
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
|
||||
$tabs = [
|
||||
'main' => '<i class="la la-database"></i> Основни данни',
|
||||
'ts_en' => '<i class="lg lg-en"></i> Превод английски',
|
||||
'objects' => '<i class="la la-object-group"></i> Обекти',
|
||||
];
|
||||
|
||||
$listtabs = [
|
||||
'list' => '<i class="la la-navicon"></i> Списък с експозиции',
|
||||
'categories' => '<i class="la la-navicon"></i> Категории',
|
||||
'tags' => '<i class="la la-navicon"></i> Тагове',
|
||||
];
|
||||
|
||||
$_GET['listtab'] = $_GET['listtab'] ?? 'list';
|
||||
|
||||
switch ($_GET['listtab']) {
|
||||
case 'list':
|
||||
echo $this->render('_expositions_list', ['model' => $model, 'tab' => $tab, 'tabs' => $tabs, 'listtabs' => $listtabs]);
|
||||
break;
|
||||
case 'categories':
|
||||
echo $this->render('_expositions_categories', ['model' => $model, 'tab' => $tab, 'tabs' => $tabs, 'listtabs' => $listtabs]);
|
||||
break;
|
||||
case 'tags':
|
||||
echo $this->render('_expositions_tags', ['model' => $model, 'tab' => $tab, 'tabs' => $tabs, 'listtabs' => $listtabs]);
|
||||
}
|
||||
|
||||
?>
|
||||
<?php if (empty($model->id)): ?>
|
||||
<style>
|
||||
#tab_objects {
|
||||
opacity: 0.5;
|
||||
pointer-events: none;
|
||||
}
|
||||
</style>
|
||||
<?php endif; ?>
|
||||
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
|
||||
use app\models\Navigation;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$_GET['listtab'] = $_GET['listtab'] ?? 'main';
|
||||
|
||||
|
||||
|
||||
TableWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Навигация',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уеб портал',
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
'new' => 'Нов бутон',
|
||||
'edit' => 'Редакция на бутон',
|
||||
'delete' => 'Изтриване на бутон'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c1 text-right',
|
||||
'Заглавие' => '',
|
||||
'Текст' => 'c4'
|
||||
],
|
||||
'model' => Navigation::class,
|
||||
'data' => Navigation::find()
|
||||
->where(['menu_type' => $_GET['listtab']])->orderBy(['order_index' => SORT_ASC])->loop([
|
||||
'id',
|
||||
function(Navigation $model) {
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
|
||||
},
|
||||
'relation',
|
||||
'order_index',
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нов слайд',
|
||||
'title_edit' => 'Редакция на слайд',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уеб портал',
|
||||
'web-portal/home-slider' => 'Слайдер начална страница'
|
||||
],
|
||||
],
|
||||
'writeView' => "web-portal/tabs/main/navigation_w",
|
||||
'model' => Navigation::class,
|
||||
'validation' => function ($p) {
|
||||
if (empty($p->{"title"}))
|
||||
return ["title" => 'Моля, въведете заглавие на слайда'];
|
||||
if (empty($p->{"ts_en_title"}))
|
||||
return ["ts_en_title" => 'Моля, въведете заглавие на слайда'];
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, Navigation $model) {
|
||||
$model->setPostDataToModel();
|
||||
if(empty($_GET['id'])) {
|
||||
$nextIndex = 0;
|
||||
$last = Navigation::find()->where(['menu_type' => $p->menu_type])->orderBy(['order_index' => SORT_DESC])->one();
|
||||
if($last) {
|
||||
$nextIndex = $last->order_index + 1;
|
||||
}
|
||||
$model->order_index = $nextIndex;
|
||||
}
|
||||
$model->save();
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Навигацията е актуализирана успешно' : 'Навигацията е създадена успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,63 @@
|
||||
<?php
|
||||
|
||||
Yii::$app->controller->pageTitle = 'Връзки';
|
||||
|
||||
use app\models\CmsRights;
|
||||
use app\models\JoinToUs;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
TableWidget::widget([
|
||||
'filter' => [
|
||||
['name' => ['Наименование', 'c3']]
|
||||
],
|
||||
'top' => [
|
||||
'title' => 'Права',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'user/admin' => 'Потребители'
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
'new' => 'Ново право',
|
||||
'edit' => 'Редакция на право',
|
||||
//'delete' => 'Изтриване на право'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c1 text-right',
|
||||
'Наименование на потребителското правото' => '',
|
||||
'Активен' => ''
|
||||
],
|
||||
'data' => \app\models\JoinToUs::find()->where(Yii::$app->getFilterData())->orderBy(['id' => SORT_DESC])->loop([
|
||||
'id',
|
||||
'name',
|
||||
function(JoinToUs $model) {
|
||||
return $model->statusSwitch('is_active', null, ['Записа е активиран', 'Записа е деактивиран']);
|
||||
}
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Ново право',
|
||||
'title_edit' => 'Редакция на връзка',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'user/admin' => 'Потребители',
|
||||
'user/rights' => 'Права'
|
||||
]
|
||||
],
|
||||
'writeView' => ' web-/rights_w',
|
||||
'model' => CmsRights::class,
|
||||
'validation' => function ($p) {
|
||||
if (empty($p->{'name'}))
|
||||
return ['name' => 'Моля, въведете наименование на връзката'];
|
||||
//if (CmsRights::recordExists('name', $p->{'name'}))
|
||||
// return ['name' => 'Това име вече е въведено, моля използвайте друго наименование'];
|
||||
},
|
||||
'postService' => function ($p, CmsRights $model) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Записът е актуализиран успешно' : 'Записът е създадено успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,119 @@
|
||||
<?php
|
||||
|
||||
|
||||
use app\models\Navigation;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$_GET['listtab'] = $_GET['listtab'] ?? 'main';
|
||||
|
||||
$listtabs = [
|
||||
'main' => '<i class="la la-navicon"></i> Основна навигация',
|
||||
//'header_hidden' => '<i class="la la-bars"></i> Скрита навигация хедър',
|
||||
'footer' => '<i class="la la-navicon"></i> Навигация футър 1',
|
||||
'footer_2' => '<i class="la la-navicon"></i> Навигация футър 2',
|
||||
'footer_3' => '<i class="la la-navicon"></i> Навигация футър 3'
|
||||
];
|
||||
|
||||
TableWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Навигация',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уеб портал',
|
||||
]
|
||||
],
|
||||
'listTabs' => $listtabs,
|
||||
'actions' => [
|
||||
'new' => 'Нов бутон',
|
||||
'edit' => 'Редакция на бутон',
|
||||
'delete' => 'Изтриване на бутон'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c1 text-right',
|
||||
'Име' => '',
|
||||
'Връзка' => 'c4',
|
||||
'Във външни връзки на начална стр.' => 'c1 ct',
|
||||
'В скрита навигация' => 'c1 ct',
|
||||
'В страница на партньор' => 'c1 ct',
|
||||
'Активен' => 'c1 ct',
|
||||
|
||||
],
|
||||
'model' => Navigation::class,
|
||||
'data' => Navigation::find()
|
||||
->where(['menu_type' => $_GET['listtab']])->orderBy(['order_index' => SORT_ASC])->loop([
|
||||
'id',
|
||||
function (Navigation $model) {
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
|
||||
},
|
||||
function (Navigation $model) {
|
||||
if ($model->page_id)
|
||||
return '<a target="_blank" href="' . Yii::$app->goTo('web-portal/pages') . '?o=w&id=' . $model->page_id . '">' . $model->page->name . '</a>';
|
||||
return '<a target="_blank" href="' . $model->url . '">' . $model->url . '</a>';
|
||||
},
|
||||
function (Navigation $model) {
|
||||
return $model->statusSwitch('home_conn');
|
||||
},
|
||||
function (Navigation $model) {
|
||||
return $model->statusSwitch('in_submenu');
|
||||
},
|
||||
function (Navigation $model) {
|
||||
return $model->statusSwitch('partner_page', null, ['Връзката е добавена в страницата на партньора', 'Връзката е премахната от страницата на партньора']);
|
||||
},
|
||||
function (Navigation $model) {
|
||||
return $model->statusSwitch('is_active');
|
||||
},
|
||||
'order_index',
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нов бутон - ' . mb_strtolower(strip_tags($listtabs[$_GET['listtab']])),
|
||||
'title_edit' => 'Редакция на бутон - ' . mb_strtolower(strip_tags($listtabs[$_GET['listtab']])),
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уеб портал',
|
||||
'web-portal/navigation' => 'Навигация'
|
||||
],
|
||||
],
|
||||
'writeView' => "web-portal/tabs/main/navigation_w",
|
||||
'model' => Navigation::class,
|
||||
'validation' => function ($p) {
|
||||
if (empty($p->{"name"}))
|
||||
return ["name" => 'Моля, въведете име на бутона'];
|
||||
if (empty($p->{"ts_en_name"}))
|
||||
return ["ts_en_name" => 'Моля, въведете име на бутона'];
|
||||
if (empty($p->{'relation_type'}))
|
||||
return ["relation_type" => 'Моля, изберете връзка'];
|
||||
if ($p->{'relation_type'} == 'inner_page' && empty($p->{'page_id'}))
|
||||
return ["page_id" => 'Моля, изберете вътрешна страницата'];
|
||||
if ($p->{'relation_type'} == 'outer_page' && empty($p->{'url'}))
|
||||
return ["url" => 'Моля, въведете url адрес'];
|
||||
if ($p->{'relation_type'} == 'outer_page' && !empty($p->{'url'})) {
|
||||
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $p->{'url'}))
|
||||
return ["url" => 'Моля, въведете валиден url адрес'];
|
||||
}
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, Navigation $model) {
|
||||
$model->setPostDataToModel();
|
||||
if ($p->{'relation_type'} == 'inner_page')
|
||||
$model->url = NULL;
|
||||
if ($p->{'relation_type'} == 'outer_page')
|
||||
$model->page_id = NULL;
|
||||
|
||||
if (empty($_GET['id'])) {
|
||||
$nextIndex = 0;
|
||||
$last = Navigation::find()->where(['menu_type' => $p->menu_type])->orderBy(['order_index' => SORT_DESC])->one();
|
||||
if ($last) {
|
||||
$nextIndex = $last->order_index + 1;
|
||||
}
|
||||
$model->order_index = $nextIndex;
|
||||
$model->is_active = 1;
|
||||
}
|
||||
$model->save();
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Навигацията е актуализирана успешно' : 'Навигацията е създадена успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,113 @@
|
||||
<?php
|
||||
|
||||
use app\models\History;
|
||||
use app\models\News;
|
||||
use app\models\register\Partner;
|
||||
use app\services\Auth;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
|
||||
TableWidget::widget([
|
||||
'filter' => [
|
||||
[
|
||||
'title' => ['Заглавие на новина', 'c4'],
|
||||
'partner_id' => ['Организация', 'c3', Partner::partnerList()],
|
||||
'is_for_publish' => ['За публикувне', 'c1', [1 => 'да', 'null' => 'не']],
|
||||
'is_active' => ['Публикувана', 'c1', [1 => 'да', 'null' => 'не']]
|
||||
],
|
||||
],
|
||||
'top' => [
|
||||
'title' => 'Новини',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уеб портал',
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
'new' => 'Нова новина',
|
||||
'edit' => 'Редакция на новина',
|
||||
'delete' => 'Изтриване на новина'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c1 text-right',
|
||||
'Заглавие' => '',
|
||||
'Партньор' => 'c4',
|
||||
'Тематични зони' => 'c0 ct',
|
||||
'История' => 'c0 ct',
|
||||
'За публикуване' => 'c0 ct',
|
||||
'Публикуване' => 'c0 ct'
|
||||
],
|
||||
'data' => News::find()->where(Yii::$app->getFilterData('and'))->orderBy(['id' => SORT_DESC])->loop([
|
||||
'id',
|
||||
function (News $model) {
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->title . '</a>';
|
||||
},
|
||||
function (News $model) {
|
||||
if ($model->partner)
|
||||
return $model->partner->name;
|
||||
},
|
||||
function (News $model) {
|
||||
return '<i data-article-key="'.$model->article_key.'" class="la la-stream positionButton"></i>';
|
||||
},
|
||||
function (News $model) {
|
||||
return '<i data-table="news" data-id="' . $model->id . '" class="la la-history historyButton"></i>';
|
||||
},
|
||||
function (News $model) {
|
||||
return $model->is_for_publish ? '<span data-published="Пуликувана" data-unpublished="да" id="blink_' . $model->id . '" class="' . (!$model->is_active ? 'blink-green' : '') . '">'. ((!$model->is_active) ? 'да' : 'Публикувана').'</span>' : 'не';
|
||||
},
|
||||
function (News $model) {
|
||||
return $model->statusSwitch('is_active', null, ['Новината е публикувана на сайта', 'Новината е свалена от сайта']);
|
||||
|
||||
}
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нова новина',
|
||||
'title_edit' => 'Редакция на новина',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уеб портал',
|
||||
'web-portal/news' => 'Новини'
|
||||
],
|
||||
],
|
||||
'tabs' => [
|
||||
'main' => '<i class="la la-database"></i> Основни данни',
|
||||
'ts_en' => '<i class="lg lg-en"></i> Превод английски'
|
||||
],
|
||||
'writeView' => "web-portal/tabs/" . Includes::tab($tab) . "/news_w",
|
||||
'model' => News::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
if ($tab == 'main') {
|
||||
if (empty($p->{"partner_id"}))
|
||||
return ["partner_id" => 'Моля, изберете организация'];
|
||||
if (empty($p->{"title"}))
|
||||
return ["title" => 'Моля, въведете заглавие на новината'];
|
||||
if (empty($p->{"text_short"}))
|
||||
return ["text_short" => 'Моля, въведете кратък текст на новината'];
|
||||
if (empty($p->{"text"}))
|
||||
return ["text" => 'Моля, въведете пълен текст на новината'];
|
||||
}
|
||||
if (Includes::inLocales($tab)) {
|
||||
if (empty($p->{$tab . "_title"}))
|
||||
return [$tab . "_title" => 'Моля, въведете заглавие на новината'];
|
||||
if (empty($p->{$tab . "_text_short"}))
|
||||
return [$tab . "_text_short" => 'Моля, въведете кратък текст на новината'];
|
||||
if (empty($p->{$tab . "_text"}))
|
||||
return [$tab . "_text" => 'Моля, въведете пълен текст на новината'];
|
||||
}
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, News $model) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
\app\models\Articles::updateArticle($model);
|
||||
History::addNew($model->id, 'news', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Новината е актуализирана успешно' : 'Новината е създадена успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,170 @@
|
||||
<?php
|
||||
|
||||
use app\models\History;
|
||||
use app\models\register\CollectionsObjects;
|
||||
use app\models\RegisterObjects;
|
||||
use app\services\Auth;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
|
||||
$_GET['tab'] = $tab;
|
||||
|
||||
if (!empty($_GET['id'])) {
|
||||
$tabs['nomenclature'] = '<i class="la la-clipboard-list"></i> Номенклатури';
|
||||
$tabs['main'] = '<i class="la la-database"></i> Основни данни';
|
||||
$tabs['ts_en'] = '<i class="lg lg-en"></i> Превод английски';
|
||||
$tabs['media'] = '<i class="la la-file-movie-o"></i> Медия файлове';
|
||||
}
|
||||
|
||||
|
||||
$condition = Yii::$app->getFilterData('or', ['collection_id']);
|
||||
|
||||
$collection_id = Yii::$app->getFilterDataAsArray('collection_id');
|
||||
|
||||
if($collection_id) {
|
||||
$collectionsObjects = CollectionsObjects::find()->select('object_id')->where(['collection_id' => $collection_id])->all();
|
||||
$objectIds = [];
|
||||
foreach ($collectionsObjects as $collectionsObject)
|
||||
$objectIds[] = $collectionsObject->object_id;
|
||||
$condition[] = ['IN', 'ref_num', $objectIds];
|
||||
}
|
||||
|
||||
$data = RegisterObjects::find()
|
||||
->where(['lib_type' => 1])
|
||||
->andWhere($condition)
|
||||
->orderBy(['date_updated' => SORT_DESC]);
|
||||
|
||||
TableWidget::widget([
|
||||
'filter' => [
|
||||
[
|
||||
'name' => ['Наименование', 'c3'],
|
||||
'ref_num' => ['Реф.№', 'c1'],
|
||||
'partner_id' => ['Партньор', 'c3', \app\models\register\Partner::partnerList()],
|
||||
'collection_id' => ['Колекция', 'c3', \app\models\register\Collections::getDropDownData()]
|
||||
]
|
||||
],
|
||||
//'advanced_filter' => $this->render('_advanced_filters/object'),
|
||||
'top' => [
|
||||
'title' => 'Обекти',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уебпортал',
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
'edit' => 'Преглед на обект',
|
||||
//'delete' => 'Изтриване'
|
||||
],
|
||||
'th' => [
|
||||
'ID' => 'c05 text-right',
|
||||
'Реф. №' => 'c05 text-right',
|
||||
'Наименование' => 'c2 ct',
|
||||
'Населено място' => '',
|
||||
'Изображение' => 'ct c1',
|
||||
'Колекции' => '',
|
||||
'Тагове' => '',
|
||||
'Партньор' => 'c2 ct',
|
||||
'Дата на добавяне' => 'ct',
|
||||
'Дата на последна актуализация' => 'ct',
|
||||
'Публикуван' => '',
|
||||
],
|
||||
'data' => $data->loop([
|
||||
'id',
|
||||
'ref_num',
|
||||
function (RegisterObjects $model) {
|
||||
if ($model->name)
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
|
||||
},
|
||||
function (RegisterObjects $model) {
|
||||
if ($model->city)
|
||||
return $model->city->place;
|
||||
},
|
||||
function (RegisterObjects $model) {
|
||||
if ($model->mainImgFile) {
|
||||
return '<img src="' . $model->mainImgFile . '" style="height: 130px">';
|
||||
}
|
||||
},
|
||||
function (RegisterObjects $model) {
|
||||
return $model->getCollectionsListStr();
|
||||
},
|
||||
|
||||
function (RegisterObjects $model) {
|
||||
return $model->getTagsList();
|
||||
},
|
||||
function (RegisterObjects $model) {
|
||||
if($model->partner)
|
||||
return $model->partner->name;
|
||||
},
|
||||
function (RegisterObjects $model) {
|
||||
//date published
|
||||
if ($model->date_added)
|
||||
return date('d.m.Y H:i', strtotime($model->date_added));
|
||||
},
|
||||
function (RegisterObjects $model) {
|
||||
//date published
|
||||
if ($model->date_updated)
|
||||
return date('d.m.Y H:i', strtotime($model->date_updated));
|
||||
},
|
||||
function (RegisterObjects $model) {
|
||||
//return $model->is_active ? 'да': ''
|
||||
return $model->statusSwitch('is_active', null, ['Обекта е публикуван на сайта', 'Обекта е свален от сайта']);
|
||||
},
|
||||
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нов обект',
|
||||
'title_edit' => 'Преглед на обект',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уебпортал',
|
||||
'web-portal/objects-register' => 'Обекти'
|
||||
],
|
||||
],
|
||||
'tabs' => $tabs ?? [],
|
||||
'writeView' => empty($_GET['id']) ? "web-portal/tabs/main/register_objects_w" : "web-portal/tabs/" . Includes::tab($tab) . "/register_objects_w",
|
||||
'model' => RegisterObjects::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
if ($tab == 'main') {
|
||||
if (empty($_GET['id'])) {
|
||||
//NEW OBJECT
|
||||
if (empty($p->{'sc_id'}))
|
||||
return ['sc_id' => 'Моля, изберете категория'];
|
||||
if (empty($p->{'sc_id'}))
|
||||
return ['ot_id' => 'Моля, изберете шаблон на обект'];
|
||||
} else {
|
||||
//UPDATE GENERAL DATA
|
||||
if (empty($p->{'name'}))
|
||||
return ['name' => 'Моля, въведете име на обекта'];
|
||||
if (empty($p->{'annotation'}))
|
||||
return ['annotation' => 'Моля, въведете анотация'];
|
||||
if (empty($p->{'description'}))
|
||||
return ['description' => 'Моля, въведете описание'];
|
||||
}
|
||||
} else if (Includes::inLocales($tab)) {
|
||||
if (empty($p->{$tab . '_name'}))
|
||||
return [$tab . '_name' => 'Моля, въведете име на обекта'];
|
||||
if (empty($p->{$tab . '_annotation'}))
|
||||
return [$tab . '_annotation' => 'Моля, въведете анотация'];
|
||||
if (empty($p->{$tab . '_description'}))
|
||||
return [$tab . '_description' => 'Моля, въведете описание'];
|
||||
}
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, RegisterObjects $model) use ($tab) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
|
||||
History::addNew($model->id, 'register_objects', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
|
||||
if (empty($_GET['media_key_update'])) {
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Обекта е актуализиран успешно' : 'Обекта е създаден успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,193 @@
|
||||
<?php
|
||||
|
||||
use app\models\History;
|
||||
use app\models\Objects;
|
||||
use app\models\ObjectTemplate;
|
||||
use app\models\register\Partner;
|
||||
use app\services\api\NomenclatureService;
|
||||
use app\services\Auth;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
/** @var Objects $model */
|
||||
$model = Objects::getModel();
|
||||
|
||||
$tab = $_GET['tab'] ?? 'nomenclature';
|
||||
|
||||
$_GET['tab'] = $tab;
|
||||
|
||||
if (!empty($_GET['id'])) {
|
||||
$tabs['nomenclature'] = '<i class="la la-clipboard-list"></i> Номенклатури';
|
||||
$tabs['main'] = '<i class="la la-database"></i> Основни данни';
|
||||
$tabs['ts_en'] = '<i class="lg lg-en"></i> Превод английски';
|
||||
$tabs['media'] = '<i class="la la-file-movie-o"></i> Медия файлове';
|
||||
}
|
||||
|
||||
TableWidget::widget([
|
||||
'filter' => [
|
||||
[
|
||||
'objects.name' => ['Наименование', 'c3'],
|
||||
'description' => ['Описание', 'c3'],
|
||||
'annotation' => ['Анотация', 'c3'],
|
||||
'partner_id' => ['Партньор', 'c3', Partner::partnerList()],
|
||||
'heritage_type' => ['Вид наследсво', 'c3', ObjectTemplate::heritageTypesByCategory()],
|
||||
'sc_id' => ['Категория', 'c3 category_search_box', NomenclatureService::categoryFilterSelect()],
|
||||
]
|
||||
],
|
||||
'advanced_filter' => $this->render('_advanced_filters/object'),
|
||||
'top' => [
|
||||
'title' => 'Обекти',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уебпортал',
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
'new' => 'Нов обект',
|
||||
'edit' => 'Редакция на обект',
|
||||
'delete' => 'Изтриване на обект'
|
||||
],
|
||||
'th' => [
|
||||
'ID' => 'c05 text-right',
|
||||
'Наименование' => 'c2',
|
||||
'Изображение' => 'c1 ct',
|
||||
'Категория' => '',
|
||||
'Колекция' => '',
|
||||
'Вид шаблон' => 'c1',
|
||||
'Партньор' => '',
|
||||
'Дата на добавяне' => 'ct',
|
||||
'История' => 'ct',
|
||||
'Активен' => '',
|
||||
],
|
||||
'data' => Objects::find()->andWhere(Yii::$app->getFilterData('or'))
|
||||
->innerJoin('object_template', 'object_template.id = objects.ot_id')
|
||||
->orderBy(['id' => SORT_DESC])->loop([
|
||||
'id',
|
||||
function (Objects $model) {
|
||||
if ($model->name)
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
|
||||
},
|
||||
function (Objects $model) {
|
||||
if ($model->media_key) {
|
||||
$src = $model->getSrcOfSingleImage('title_object_image', 'thumb');
|
||||
return '<img style="width: 100px" src="' . $src . '">';
|
||||
}
|
||||
},
|
||||
function (Objects $model) {
|
||||
return $model->subCategory->name;
|
||||
},
|
||||
function (Objects $model) {
|
||||
if ($model->collections)
|
||||
return $model->collectionConcatList;
|
||||
},
|
||||
|
||||
function (Objects $model) {
|
||||
if ($model->objectTemplate)
|
||||
return $model->objectTemplate->name;
|
||||
},
|
||||
function (Objects $model) {
|
||||
if ($model->partner)
|
||||
return $model->partner->name;
|
||||
},
|
||||
function (Objects $model) {
|
||||
if ($model->history)
|
||||
return $model->history->date;
|
||||
},
|
||||
function (Objects $model) {
|
||||
return '<i data-table="objects" data-id="' . $model->id . '" class="la la-history historyButton"></i>';
|
||||
},
|
||||
function (Objects $model) {
|
||||
return $model->statusSwitch('is_active', null, ['Обекта е видим на сайта', 'Обекта е свален от сайта']);
|
||||
}
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нов обект',
|
||||
'title_edit' => 'Редакция на обект',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уебпортал',
|
||||
'web-portal/objects' => 'Обекти'
|
||||
],
|
||||
],
|
||||
'tabs' => $tabs ?? [],
|
||||
'writeView' => empty($_GET['id']) ? "web-portal/tabs/nomenclature/objects_w" : "web-portal/tabs/" . Includes::tab($tab) . "/objects_w",
|
||||
'model' => Objects::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
if ($tab == 'main') {
|
||||
if (empty($_GET['id'])) {
|
||||
//NEW OBJECT
|
||||
if (empty($p->{'sc_id'}))
|
||||
return ['sc_id' => 'Моля, изберете категория'];
|
||||
if (empty($p->{'sc_id'}))
|
||||
return ['ot_id' => 'Моля, изберете шаблон на обект'];
|
||||
} else {
|
||||
//UPDATE GENERAL DATA
|
||||
if (empty($p->{'name'}))
|
||||
return ['name' => 'Моля, въведете име на обекта'];
|
||||
if (empty($p->{'annotation'}))
|
||||
return ['annotation' => 'Моля, въведете анотация'];
|
||||
if (empty($p->{'description'}))
|
||||
return ['description' => 'Моля, въведете описание'];
|
||||
}
|
||||
} else if (Includes::inLocales($tab)) {
|
||||
if (empty($p->{$tab . '_name'}))
|
||||
return [$tab . '_name' => 'Моля, въведете име на обекта'];
|
||||
if (empty($p->{$tab . '_annotation'}))
|
||||
return [$tab . '_annotation' => 'Моля, въведете анотация'];
|
||||
if (empty($p->{$tab . '_description'}))
|
||||
return [$tab . '_description' => 'Моля, въведете описание'];
|
||||
}
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, Objects $model) use ($tab) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
if ($tab == 'nomenclature') {
|
||||
$model->setObjectFields($p);
|
||||
$model->setCollections($p);
|
||||
}
|
||||
History::addNew($model->id, 'objects', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
|
||||
if (empty($_GET['media_key_update'])) {
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Обекта е актуализиран успешно' : 'Обекта е създаден успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
}
|
||||
]);
|
||||
|
||||
?>
|
||||
|
||||
<script src="/_public/assets/js/search-box.js"></script>
|
||||
<script>
|
||||
new SearchBox('#collections')
|
||||
const category_search_box = new SearchBox('.category_search_box select')
|
||||
const objet_type_select = new SearchBox('.objet_type_select')
|
||||
|
||||
const
|
||||
categorySearchBox = new SearchBox('#category_search_box'),
|
||||
objectTypeSearchBox = new SearchBox('#object_type_search_box')
|
||||
if (categorySearchBox && objectTypeSearchBox) {
|
||||
objectTypeSearchBox.updateFromObject({
|
||||
searchBox: categorySearchBox,
|
||||
url: '/api/object-templates/',
|
||||
queryId: 'sc_id',
|
||||
data: {id: 'id', name: 'name'}
|
||||
})
|
||||
}
|
||||
if (category_search_box && objet_type_select) {
|
||||
objet_type_select.updateFromObject({
|
||||
searchBox: category_search_box,
|
||||
url: '/api/object-templates/',
|
||||
queryId: 'sc_id',
|
||||
data: {id: 'id', name: 'name'}
|
||||
})
|
||||
}
|
||||
|
||||
all('.advanced-select', e => {
|
||||
new SearchBox(e)
|
||||
})
|
||||
</script>
|
||||
@@ -0,0 +1,100 @@
|
||||
<?php
|
||||
|
||||
use app\models\Pages;
|
||||
use app\services\Formatter;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
$_GET['tab'] = $tab;
|
||||
|
||||
$tabs['main'] = '<i class="la la-database"></i> Основни данни';
|
||||
$tabs['media'] = '<i class="la la-file-movie-o"></i> Медия файлове';
|
||||
|
||||
TableWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Страници',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уеб портал',
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
'new' => 'Нова страница',
|
||||
'edit' => 'Редакция на страница',
|
||||
'delete' => 'Изтриване на страница'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c1 text-right',
|
||||
'Заглавие на страница' => '',
|
||||
],
|
||||
'model' => Pages::class,
|
||||
'data' => Pages::find()->loop([
|
||||
'id',
|
||||
function (Pages $model) {
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
|
||||
},
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нова страница',
|
||||
'title_edit' => 'Редакция на страница',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уеб портал',
|
||||
'web-portal/navigation' => 'Страници'
|
||||
],
|
||||
],
|
||||
'tabs' => $tabs ?? [],
|
||||
'writeView' => "web-portal/tabs/" . Includes::tab($tab) . "/pages_w" ,
|
||||
'model' => Pages::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
if ($tab == 'main') {
|
||||
if (empty($p->{"name"}))
|
||||
return ["name" => 'Моля, въведете заглавие на страницата'];
|
||||
if (empty($p->{"name_en"}))
|
||||
return ["name_en" => 'Моля, въведете заглавие на страницата'];
|
||||
if (Pages::exists(['slug' => Formatter::cyrillicTrans(ltrim(rtrim($p->{"name"})))]))
|
||||
return ["name" => 'Заглавието вече съществува'];
|
||||
if (Pages::exists(['slug_en' => Formatter::cyrillicTrans(ltrim(rtrim($p->{"name_en"})))]))
|
||||
return ["name_en" => 'Заглавието вече съществува'];
|
||||
} else if (Includes::inLocales($tab)) {
|
||||
|
||||
}
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, Pages $model) use ($tab) {
|
||||
$model->setPostDataToModel();
|
||||
if ($tab == 'main') {
|
||||
if ($p->{'name'}) {
|
||||
$name = ltrim($p->{'name'}, ' ');
|
||||
$name = rtrim($name, ' ');
|
||||
$model->name = $name;
|
||||
$model->slug = Formatter::cyrillicTrans($name);
|
||||
}
|
||||
if ($p->{'name_en'}) {
|
||||
$name_en = ltrim($p->{'name_en'}, ' ');
|
||||
$name_en = rtrim($name_en, ' ');
|
||||
$model->name_en = $name_en;
|
||||
$model->slug_en = Formatter::cyrillicTrans($name_en);
|
||||
}
|
||||
}
|
||||
$model->save();
|
||||
|
||||
if(!empty($p->contacts) && $model->contact) {
|
||||
$contactModel = \app\models\Contacts::findOne($model->contact->id);
|
||||
foreach ($p->contacts as $contact => $value) {
|
||||
$contactModel->{$contact} = $value;
|
||||
}
|
||||
$contactModel->save();
|
||||
}
|
||||
|
||||
if (empty($_GET['media_key_update'])) {
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Страницата е актуализирана успешно' : 'Страницата е създадена успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,80 @@
|
||||
<?php
|
||||
|
||||
use app\models\Positions;
|
||||
use app\services\Auth;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
TableWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Тематични зони',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уеб портал',
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
'new' => 'Нова група',
|
||||
'edit' => 'Редакция на група',
|
||||
//'delete' => 'Изтриване на група'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c1 text-right',
|
||||
'Тематична зона' => '',
|
||||
'Брой позиции' => 'c4'
|
||||
],
|
||||
'data' => Positions::find()->where(['IS', 'group_id', null])->orderBy(['id' => SORT_DESC])->loop([
|
||||
'id',
|
||||
function (Positions $model) {
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->group_name . '</a>';
|
||||
},
|
||||
function (Positions $model) {
|
||||
return $model->positionsCount;
|
||||
}
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нова група',
|
||||
'title_edit' => 'Редакция на тематична зона',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уеб портал',
|
||||
'web-portal/positions' => 'Тематични зони'
|
||||
],
|
||||
],
|
||||
'writeView' => "web-portal/tabs/main/positions_group_w",
|
||||
'model' => Positions::class,
|
||||
'validation' => function ($p) {
|
||||
if (empty($p->{"group_name"}))
|
||||
return ["group_name" => 'Моля, въведете име на групата'];
|
||||
if (empty($p->{"positions_count"}) && $p->{'positions_count_ready'} == 0)
|
||||
return ["positions_count" => 'Моля, въведете брой позиции'];
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, Positions $model) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
if(!empty($p->positions_count)) {
|
||||
for ($i = 0; $i < $p->positions_count; $i++) {
|
||||
$position = new Positions();
|
||||
$position->group_id = $model->id;
|
||||
$position->order_index = $i;
|
||||
$position->save();
|
||||
}
|
||||
}
|
||||
|
||||
if(!empty($p->enter_class_name)) {
|
||||
foreach ($p->enter_class_name as $id => $class_name) {
|
||||
$positionToUpdate = Positions::findOne($id);
|
||||
if($positionToUpdate) {
|
||||
$positionToUpdate->class_name = $class_name;
|
||||
$positionToUpdate->save();
|
||||
}
|
||||
}
|
||||
}
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Групата на позициите е актуализирана успешно' : 'Групата на позициите е създадена успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,115 @@
|
||||
<?php
|
||||
|
||||
use app\models\Projects;
|
||||
use app\models\History;
|
||||
use app\models\ProjectsPartner;
|
||||
use app\services\Auth;
|
||||
use app\services\Formatter;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
|
||||
if (!empty($_GET['id'])) {
|
||||
$tabs['main'] = '<i class="la la-database"></i> Основни данни';
|
||||
$tabs['ts_en'] = '<i class="lg lg-en"></i> Превод английски';
|
||||
$tabs['docs'] = '<i class="la la-file"></i> Документи';
|
||||
$tabs['media'] = '<i class="la la-images"></i> Галерия (снимки)';
|
||||
}
|
||||
|
||||
|
||||
TableWidget::widget([
|
||||
'filter' => [
|
||||
[
|
||||
'period_date_start' => ['Начална дата', 'c2 fDatepicker'],
|
||||
'title' => ['Заглавие на проекта', 'c4'],
|
||||
'is_active' => ['Публикувана', 'c1', [1 => 'да', 'null' => 'не']]
|
||||
],
|
||||
],
|
||||
'top' => [
|
||||
'title' => 'Проекти',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уеб портал',
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
'new' => 'Нов проект',
|
||||
'edit' => 'Редакция на проект',
|
||||
'delete' => 'Изтриване на проект'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c1 text-right',
|
||||
'Заглавие' => '',
|
||||
'Период' => 'c2 ct',
|
||||
'История' => 'c0 ct',
|
||||
'Дата на публикуване' => 'c1 ct',
|
||||
'За публикуване' => 'c0 ct',
|
||||
'Публикуване' => 'c0 ct',
|
||||
],
|
||||
'data' => Projects::find()->where(Yii::$app->getFilterData())->orderBy(['id' => SORT_DESC])->loop([
|
||||
'id',
|
||||
function (Projects $model) {
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->title . '</a>';
|
||||
},
|
||||
function (Projects $model) {
|
||||
return $model->period;
|
||||
},
|
||||
function (Projects $model) {
|
||||
return '<i data-table="projects" data-id="' . $model->id . '" class="la la-history historyButton"></i>';
|
||||
},
|
||||
function (Projects $model) {
|
||||
return $model->formatDate($model->publish_date);
|
||||
},
|
||||
function (Projects $model) {
|
||||
return $model->is_for_publish ? '<span id="blink_' . $model->id . '" class="' . (!$model->is_active ? 'blink-green' : '') . '">да</span>' : 'не';
|
||||
},
|
||||
function (Projects $model) {
|
||||
return $model->statusSwitch('is_active', null, ['Проекта е публикуван на сайта', 'Проекта е свален от сайта']);
|
||||
}
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нова проект',
|
||||
'title_edit' => 'Редакция на проект',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уеб портал',
|
||||
'web-portal/projects' => 'Проекти'
|
||||
],
|
||||
],
|
||||
'tabs' => $tabs ?? [],
|
||||
'writeView' => "web-portal/tabs/" . Includes::tab($tab) . "/projects_w",
|
||||
'model' => Projects::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
if ($tab == 'main') {
|
||||
if (empty($p->{"title"}))
|
||||
return ["title" => 'Моля, въведете заглавие на проекта'];
|
||||
if (empty($p->{"text"}))
|
||||
return ["text" => 'Моля, въведете пълен текст на проекта'];
|
||||
if(!empty($p->{'website'}) ) {
|
||||
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $p->{'website'})) {
|
||||
return ["website" => 'Моля, въведете валиден url адрес'];
|
||||
}
|
||||
}
|
||||
}
|
||||
if (Includes::inLocales($tab)) {
|
||||
if (empty($p->{$tab . "_title"}))
|
||||
return [$tab . "_title" => 'Моля, въведете заглавие на проекта'];
|
||||
if (empty($p->{$tab . "_text"}))
|
||||
return [$tab . "_text" => 'Моля, въведете пълен текст на проекта'];
|
||||
}
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, Projects $model) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
ProjectsPartner::updateRecords($_POST['partners'] ?? [], ['partner_id', 'project_id', $model->id]);
|
||||
History::addNew($model->id, 'projects', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Проекта е актуализиран успешно' : 'Проекта е създаден успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,77 @@
|
||||
<?php
|
||||
|
||||
use app\models\Pages;
|
||||
use app\models\SeoManagement;
|
||||
use app\services\Formatter;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
$_GET['tab'] = $tab;
|
||||
$_GET['id'] = 1;
|
||||
$_GET['o'] = 'w';
|
||||
|
||||
TableWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'SEO управление',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уеб портал',
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
//'new' => 'Нов SEO запис',
|
||||
//'edit' => 'Редакция на SEO запис',
|
||||
//'delete' => 'Изтриване на SEO запис'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c1 text-right',
|
||||
'Ключови думи' => '',
|
||||
'Текст' => '',
|
||||
'Страница' => '',
|
||||
],
|
||||
'model' => SeoManagement::class,
|
||||
'data' => SeoManagement::find()->loop([
|
||||
'id',
|
||||
'key_words',
|
||||
'text',
|
||||
function (SeoManagement $model) {
|
||||
if ($model->page) {
|
||||
return $model->page->name;
|
||||
} else {
|
||||
return 'основни данни';
|
||||
}
|
||||
}
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нов SEO запис',
|
||||
'title_edit' => 'Редакция на SEO запис',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уеб портал',
|
||||
'web-portal/navigation' => 'SEO управление'
|
||||
],
|
||||
],
|
||||
'tabs' => [],
|
||||
'writeView' => "web-portal/tabs/" . Includes::tab($tab) . "/seo_w",
|
||||
'model' => SeoManagement::class,
|
||||
'validation' => function ($p) {
|
||||
|
||||
if(empty($p->{'page_seo'})) {
|
||||
if(empty($p->{'page_id'})) {
|
||||
return ["page_id" => 'Моля, изберете страница, за която искате да се отнасят данни'];
|
||||
}
|
||||
}
|
||||
},
|
||||
'postService' => function ($p, SeoManagement $model) {
|
||||
$model->setPostDataToModel();
|
||||
$model->save();
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Записа е актуализирана успешно' : 'Записа е създадена успешно');
|
||||
$model->redirectTo('web-portal/seo');
|
||||
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,102 @@
|
||||
<?php
|
||||
|
||||
|
||||
use app\models\Navigation;
|
||||
use app\models\Slides;
|
||||
use app\widgets\FormWidget;
|
||||
use app\widgets\services\Includes;
|
||||
use app\widgets\TableWidget;
|
||||
|
||||
$_GET['listtab'] = $_GET['listtab'] ?? 'home_page';
|
||||
|
||||
$listtabs = [
|
||||
'home_page' => '<i class="la la-navicon"></i> Начална страница'
|
||||
];
|
||||
|
||||
$tab = $_GET['tab'] ?? 'main';
|
||||
|
||||
$tabs = [
|
||||
'main' => '<i class="la la-database"></i> Основни данни',
|
||||
'ts_en' => '<i class="lg lg-en"></i> Превод английски'
|
||||
];
|
||||
|
||||
TableWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Слайдер',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уеб портал',
|
||||
]
|
||||
],
|
||||
'listTabs' => $listtabs,
|
||||
'actions' => [
|
||||
'new' => 'Нов бутон',
|
||||
'edit' => 'Редакция на бутон',
|
||||
'delete' => 'Изтриване на бутон'
|
||||
],
|
||||
'th' => [
|
||||
'№' => 'c1 text-right',
|
||||
'Заглавие' => '',
|
||||
'Url адрес' => 'c4',
|
||||
'Активен' => 'c1 ct'
|
||||
],
|
||||
'model' => Slides::class,
|
||||
'data' => Slides::find()
|
||||
->where(['type' => $_GET['listtab']])->orderBy(['order_index' => SORT_ASC])->loop([
|
||||
'id',
|
||||
function (Slides $model) {
|
||||
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . ($model->title ?? $model->ts_en_title) . '</a>';
|
||||
},
|
||||
'relation',
|
||||
function (Slides $model) {
|
||||
return $model->statusSwitch('is_active');
|
||||
},
|
||||
'order_index',
|
||||
], $_GET['p'] ?? 1, 30)
|
||||
]);
|
||||
|
||||
FormWidget::widget([
|
||||
'top' => [
|
||||
'title' => 'Нов слайд',
|
||||
'title_edit' => 'Редакция на слайд',
|
||||
'data' => [
|
||||
'index/dashboard' => 'Начало',
|
||||
'web-portal/expositions' => 'Уеб портал',
|
||||
'web-portal/slider' => 'Слайдер начална страница'
|
||||
],
|
||||
],
|
||||
'tabs' => $tabs,
|
||||
'writeView' => "web-portal/tabs/" . Includes::tab($tab) . "/slider_w",
|
||||
|
||||
'model' => Slides::class,
|
||||
'validation' => function ($p) use ($tab) {
|
||||
if ($tab == 'main') {
|
||||
if (empty($p->{"title"}))
|
||||
return ["title" => 'Моля, въведете заглавие на слайда'];
|
||||
if (empty($p->{"text"}))
|
||||
return ["text" => 'Моля, въведете текст на слайда'];
|
||||
}
|
||||
if (Includes::inLocales($tab)) {
|
||||
if (empty($p->{$tab . "_title"}))
|
||||
return [$tab . "_title" => 'Моля, въведете заглавие на слайда'];
|
||||
if (empty($p->{$tab . "_text"}))
|
||||
return [$tab . "_text" => 'Моля, въведете текст на слайда'];
|
||||
}
|
||||
return null;
|
||||
},
|
||||
'postService' => function ($p, Slides $model) {
|
||||
$model->setPostDataToModel();
|
||||
if (empty($_GET['id'])) {
|
||||
$nextIndex = 0;
|
||||
$last = Slides::find()->where(['type' => $p->type])->orderBy(['order_index' => SORT_DESC])->one();
|
||||
if ($last) {
|
||||
$nextIndex = $last->order_index + 1;
|
||||
}
|
||||
$model->order_index = $nextIndex;
|
||||
$model->is_active = 1;
|
||||
}
|
||||
$model->save();
|
||||
Yii::$app->flash('success', isset($_GET['id']) ? 'Слайда е актуализиран успешно' : 'Слайда е създаден успешно');
|
||||
$model->smartRedirect();
|
||||
}
|
||||
]);
|
||||
@@ -0,0 +1,201 @@
|
||||
<?php
|
||||
|
||||
use app\models\Events;
|
||||
use app\models\PriceObject;
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
/**
|
||||
* @var Events $model
|
||||
* @var PriceObject $object
|
||||
*/
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
<?php if (empty($model->id)): ?>
|
||||
<p style="color: darkorange; font-weight: bold">* Формата ще бъде активна след попълването на "Основни
|
||||
данни"</p>
|
||||
<?php endif; ?>
|
||||
<form autocomplete="off" class="<?= empty($model->id) ? 'disabled' : '' ?>">
|
||||
<div class="row" style="width: 250px">
|
||||
<label class="require">Време за дневно посещение</label>
|
||||
<input data-min-h="7" data-max-h="20" type="hidden" name="daily_open_time" id="daily_open_time"
|
||||
value="<?= $model->daily_open_time ?>">
|
||||
</div>
|
||||
<div class="row c4 top15">
|
||||
<label class="require">Максимален брой посетители за деня</label>
|
||||
<input data-format="integer" name="max_visitors" style="width: 60px" value="<?= $model->max_visitors ?>">
|
||||
</div>
|
||||
<div class="row top15">
|
||||
<label>Цени</label>
|
||||
</div>
|
||||
<div class="top-page-panel c9">
|
||||
<div class="row c5">
|
||||
<div onclick="addPrice(this)" data-id="<?= $model->id ?>"
|
||||
class="btn-ib btn-default">
|
||||
<i class="la la-plus-circle"></i> Добавяне на цена
|
||||
</div>
|
||||
<div id="bDelete" data-model="app\models\PriceObject" onclick="checkDelete(this)"
|
||||
class="btn-ib btn-default ct disabled">
|
||||
<i class="la la-trash-o"></i> Изтриване на цена <span id="delCount">(0)</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="top15">
|
||||
<table class="cms-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="text-right c1">
|
||||
<input id="checkAll" onclick="checkAllPositions(this)" title="Избери всички"
|
||||
class="delete-checkbox <?= sizeof($model->price_objects) == 0 ? 'hide' : '' ?>" type="checkbox">
|
||||
No
|
||||
</th>
|
||||
<th>Текст [bg]</th>
|
||||
<th>Текст [en]</th>
|
||||
<th style="width: 100px">Цена</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="price_list">
|
||||
<?php foreach ($model->price_objects as $i => $object): ?>
|
||||
<tr>
|
||||
<td class="text-right">
|
||||
<input onclick="checkSingle(this)"
|
||||
data-del="<?= $object->id ?>"
|
||||
class="delete-checkbox"
|
||||
type="checkbox"
|
||||
style="top: calc(50% - 10px)">
|
||||
<span><?= $i + 1 ?></span></td>
|
||||
<td><input name="price_object[id_<?= $object->id ?>][text_bg]" value="<?= $object->text_bg ?>" type="text"></td>
|
||||
<td><input name="price_object[id_<?= $object->id ?>][text_en]" value="<?= $object->text_en ?>" type="text"></td>
|
||||
<td><input name="price_object[id_<?= $object->id ?>][price]" value="<?= $object->price ?>" type="text"
|
||||
data-format="money"></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
<tr id="empty_row" class="<?= (sizeof($model->price_objects) > 0 ? 'hide' : '') ?>">
|
||||
<td colspan="4" class="ct"
|
||||
style="font-size: 14px; padding: 15px; color: var(--base-background-dark); pointer-events: none">
|
||||
Няма добавени цени
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="row c9 top15 flex">
|
||||
<?= Includes::formButtons('web-portal/events') ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const checkAll = one('#checkAll');
|
||||
|
||||
function addPrice(e) {
|
||||
const price_list = one('#price_list');
|
||||
const row = document.createElement('tr');
|
||||
const count = all('#price_list tr').length
|
||||
one('#empty_row').addClass('hide')
|
||||
row.innerHTML = `
|
||||
<td class="text-right">
|
||||
<input onclick="checkSingle(this)"
|
||||
data-del
|
||||
class="delete-checkbox"
|
||||
type="checkbox"
|
||||
style="top: calc(50% - 10px)">
|
||||
<span>${count + 1}</span></td>
|
||||
<td><input name="price_object[c_${count + 1}][text_bg]" type="text"></td>
|
||||
<td><input name="price_object[c_${count + 1}][text_en]" type="text"></td>
|
||||
<td><input name="price_object[c_${count + 1}][price]" type="text" data-format="money"></td>
|
||||
`;
|
||||
price_list.appendChild(row);
|
||||
dataFormat();
|
||||
checkAll.removeClass('hide')
|
||||
}
|
||||
|
||||
timeRange('#daily_open_time');
|
||||
|
||||
let sl = [];
|
||||
|
||||
function checkAllPositions(el) {
|
||||
sl = [];
|
||||
all('td [data-del]').forEach(e => {
|
||||
e.checked = el.checked === true;
|
||||
if (el.checked) {
|
||||
sl.push(e.dataset.del);
|
||||
e.parentNode.parentNode.addClass('checked');
|
||||
} else {
|
||||
e.parentNode.parentNode.removeClass('checked');
|
||||
}
|
||||
|
||||
})
|
||||
updateActionButtons();
|
||||
}
|
||||
|
||||
function checkSingle(e) {
|
||||
if (e.checked) {
|
||||
sl.push(e.dataset.del);
|
||||
console.log(sl)
|
||||
e.parentNode.parentNode.addClass('checked');
|
||||
} else {
|
||||
one('#checkAll').checked = false;
|
||||
e.parentNode.parentNode.removeClass('checked');
|
||||
const f = sl.indexOf(e.dataset.del);
|
||||
sl.splice(f, 1);
|
||||
}
|
||||
updateActionButtons(e.dataset.del);
|
||||
}
|
||||
|
||||
function updateActionButtons() {
|
||||
const bDelete = one('#bDelete');
|
||||
const delCount = one('#delCount');
|
||||
const c = sl.length;
|
||||
if (delCount)
|
||||
delCount.innerText = '(' + c + ')';
|
||||
if (c > 0) {
|
||||
if (bDelete)
|
||||
bDelete.removeClass('disabled');
|
||||
} else {
|
||||
if (bDelete)
|
||||
bDelete.addClass('disabled');
|
||||
}
|
||||
}
|
||||
|
||||
function checkDelete(e) {
|
||||
const msg = 'Сигурни ли сте, че искате да изтриете ' + (sl.length > 1 ? 'тези ' + sl.length + ' записа?' : 'този запис?');
|
||||
modal.confirm(msg, () => {
|
||||
if(all('[data-del]').length === 0) {
|
||||
const checkAll = one('#checkAll')
|
||||
checkAll.checked = false;
|
||||
checkAll.addClass('hide')
|
||||
one('#empty_row').removeClass('hide')
|
||||
}
|
||||
all('[data-del]').forEach(e => {
|
||||
if (e.checked)
|
||||
e.parentNode.parentNode.remove();
|
||||
});
|
||||
all('[data-del]').forEach((e, i) => {
|
||||
const number = e.parentNode.querySelector('span');
|
||||
number.innerText = (i + 1).toString();
|
||||
})
|
||||
const ids = [];
|
||||
sl.forEach(value => {
|
||||
if(value) {
|
||||
ids.push(value);
|
||||
}
|
||||
});
|
||||
sl = [];
|
||||
updateActionButtons();
|
||||
if(ids.length > 0) {
|
||||
request({
|
||||
url: window.location.href.split('?')[0] + '?o=d',
|
||||
post: {
|
||||
ids: JSON.stringify(ids),
|
||||
model: e.dataset.model
|
||||
},
|
||||
done: e => {
|
||||
window.location.reload()
|
||||
}
|
||||
})
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
use app\models\Projects;
|
||||
use app\widgets\DocumentWidget;
|
||||
/**
|
||||
* @var $model Projects
|
||||
*/
|
||||
$document_key = $model->getDocumentKey();
|
||||
|
||||
DocumentWidget::widget([
|
||||
'document_key' => $document_key,
|
||||
'model_class' => Projects::class,
|
||||
'model' => $model
|
||||
]);
|
||||
|
||||
|
||||
@@ -0,0 +1,133 @@
|
||||
<?php
|
||||
|
||||
|
||||
use app\models\Campaigns;
|
||||
use app\models\register\Partner;
|
||||
use app\widgets\FileWidget;
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
/**
|
||||
* @var Campaigns $model
|
||||
*/
|
||||
$media_key = $model->getMediaKey();
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
<form autocomplete="off">
|
||||
<div class="row c2">
|
||||
<label class="require">Дати на кампанията</label>
|
||||
<input type="hidden" name="event_dates" id="event_dates" value="<?= $model->event_dates ?>">
|
||||
</div>
|
||||
<div class="row c6 top15">
|
||||
<label>Локация</label>
|
||||
<input name="location" placeholder="Въведи локация на събитието" value="<?= $model->location ?>"/>
|
||||
</div>
|
||||
<div class="row c6 top15">
|
||||
<label class="require">Заглавие</label>
|
||||
<input name="title" placeholder="Въведи заглавие на събитието" value="<?= $model->title ?>"/>
|
||||
</div>
|
||||
<div class="row c6 top15">
|
||||
<label class="require">Пртньор</label>
|
||||
<select name="partner_id">
|
||||
<option disabled selected>-- Избери организация --</option>
|
||||
<?php foreach (Partner::partnerList() as $id => $name): ?>
|
||||
<option <?= $model->partner_id == $id ? 'selected' : '' ?>
|
||||
value="<?= $id ?>"><?= $name ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="row top15" style="width: 350px">
|
||||
<label>Заглавно изображение</label>
|
||||
<?= FileWidget::widget([
|
||||
'media_type' => 'image',
|
||||
'object_key' => 'title_campaigns_image',
|
||||
'media_key' => $media_key,
|
||||
'files' => $model->getFiles('thumb'),
|
||||
'actions' => [
|
||||
'add' => 'Добавяне',
|
||||
'edit' => 'Редакция',
|
||||
'delete' => 'Премахване'
|
||||
],
|
||||
'single_file' => true,
|
||||
'resolutions' => ['16:11', '16:9', '1:1'],
|
||||
'max_file_size' => 2,
|
||||
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
|
||||
]) ?>
|
||||
</div>
|
||||
<?= $this->render('/shared/instruction_1') ?>
|
||||
<div class="row c9 top15">
|
||||
<label class="require">Кратък текст</label>
|
||||
<textarea class="ckEditor" name="text_short"><?= $model->text_short ?></textarea>
|
||||
</div>
|
||||
<div class="row c9 top15">
|
||||
<label class="require">Пълен текст</label>
|
||||
<textarea class="ckEditor" name="text"><?= $model->text ?></textarea>
|
||||
</div>
|
||||
<div class="row c9 top15">
|
||||
<label>Изображения в кампанията</label>
|
||||
<?= FileWidget::widget([
|
||||
'media_type' => 'image',
|
||||
'object_key' => 'campaigns_images',
|
||||
'media_key' => $media_key,
|
||||
'files' => $model->getFiles('thumb'),
|
||||
'actions' => [
|
||||
'add' => 'Добавяне на изображения',
|
||||
'edit' => 'Редакция на изображение',
|
||||
'delete' => 'Премахване на изображения'
|
||||
],
|
||||
'resolutions' => ['16:11', '16:9', '1:1'],
|
||||
'max_file_size' => 2,
|
||||
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
|
||||
]) ?>
|
||||
</div>
|
||||
<div class="row c9 top15 flex">
|
||||
<div class="c7 right10">
|
||||
<label>Стрийминг линк</label>
|
||||
<input onkeyup="updateLabelRequire(this, '#sta')" name="stream_url"
|
||||
placeholder="Въведи линк на стрийминг"
|
||||
value="<?= $model->stream_url ?>"/>
|
||||
</div>
|
||||
<div class="left10">
|
||||
<label id="sta">Достъп</label>
|
||||
<div class="flex top-page-panel"
|
||||
style="height: 14px; border-radius: 3px; border-color: var(--base-background-dark)">
|
||||
<?php foreach ([1 => 'Частен', 2 => 'Публичен'] as $v => $t): ?>
|
||||
<label style="margin-top: -3px" class="right10 radio-error"><input
|
||||
style="width: 14px; height: 14px;" type="radio"
|
||||
name="stream_access" <?= $model->stream_access == $v ? 'checked' : '' ?>
|
||||
value="<?= $v ?>"/> <?= $t ?>
|
||||
</label>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c3 top15">
|
||||
<label class="require">Дата на публикуване</label>
|
||||
<input type="hidden" name="publish_date" id="publish_date" value="<?= $model->getPublishDate() ?>">
|
||||
</div>
|
||||
<div class="row c9 top15 flex">
|
||||
<?= Includes::formButtons('web-portal/campaigns') ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<script src="/_public/assets/js/order.js"></script>
|
||||
<script src="/_public/assets/js/file-img.js"></script>
|
||||
<script src="/_public/plugins/cropperJs/cropper.min.js"></script>
|
||||
<script src="/_public/plugins/air-datepicker/locales.js"></script>
|
||||
<script src="/_public/plugins/air-datepicker/air-datepicker.js"></script>
|
||||
<script>
|
||||
new AirDatepicker('#event_dates', {
|
||||
inline: true,
|
||||
locale: locales.bg,
|
||||
multipleDates: true,
|
||||
multipleDatesSeparator: ',',
|
||||
selectedDates: document.querySelector('#event_dates').value.split(',')
|
||||
|
||||
});
|
||||
|
||||
new AirDatepicker('#publish_date', {
|
||||
inline: true,
|
||||
locale: locales.bg,
|
||||
selectedDates: [document.querySelector('#publish_date').value]
|
||||
});
|
||||
</script>
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
/** @var Collections $model */
|
||||
|
||||
use app\models\register\Collections;
|
||||
|
||||
?>
|
||||
<div class="inner-content p20">
|
||||
<?php if ($model->thumbnail && $model->thumbnail != "''"): ?>
|
||||
<img src="<?= Yii::$app->params['register'] ?>/uploads/collections/<?= $model->thumbnail ?>" style="height: 200px">
|
||||
<?php endif; ?>
|
||||
<div class="flex">
|
||||
<div class="row c6">
|
||||
<p><i class="lg lg-bg"></i> български</p>
|
||||
<div class="row">
|
||||
<h2><?= $model->name ?></h2>
|
||||
</div>
|
||||
<div class="row top15">
|
||||
<label>Кратко описание</label>
|
||||
<div>
|
||||
<?= $model->annotation ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row top15">
|
||||
<label>Oписание</label>
|
||||
<div>
|
||||
<?= $model->description ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c6">
|
||||
<p><i class="lg lg-bg"></i> английски</p>
|
||||
<div class="row">
|
||||
<h2><?= $model->name_en ?></h2>
|
||||
</div>
|
||||
<div class="row top15">
|
||||
<label>Кратко описание</label>
|
||||
<div>
|
||||
<?= $model->annotation_en ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row top15">
|
||||
<label>Oписание</label>
|
||||
<div>
|
||||
<?= $model->description_en ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,89 @@
|
||||
<?php
|
||||
|
||||
use app\models\RegisterObjects;
|
||||
|
||||
use app\services\ELibraryModels;
|
||||
use app\services\JWT;
|
||||
|
||||
/**
|
||||
* @var RegisterObjects $model
|
||||
*/
|
||||
|
||||
$download = null;
|
||||
if (sizeof($model->getRegisterObjectFiles()->all()) > 0) {
|
||||
$download = $model->getRegisterObjectFiles()->all()[0]->file_url;
|
||||
}
|
||||
|
||||
$lib_variants = [1 => 'Книга', 2 => 'Периодично издание', 3 => 'Статия'];
|
||||
$lib_formats = ["1" => 'Електронно', "3" => 'Печатно', "2" => 'Електронно и печатно'];
|
||||
|
||||
?>
|
||||
<div class="inner-content p10 preview-mode">
|
||||
<?php if ($model->mainImgFile): ?>
|
||||
<img data-preview="<?= $model->mainImgFile ?>" src="<?= $model->mainImgFile ?>" style="height: 300px">
|
||||
<?php endif; ?>
|
||||
<?php if ($model->pdf): ?>
|
||||
<div class="row top15 c7 flex">
|
||||
<button data-pdf="https://portal.nasledstvo.bg/file-system/file-preview-delivery/<?= JWT::encode(['id' => $model->pdf->id], JWT::SECRET_KEY) ?>/"
|
||||
class="btn btn-default"><i class="la la-file-pdf"></i> Преглед
|
||||
</button>
|
||||
<?php if ($download): ?>
|
||||
<a href="<?= $download ?>" download="true" class="left10 btn btn-default"><i class="la la-download"></i>
|
||||
Сваляне на файл</a>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<!-- EDIT -->
|
||||
<div class="row top15 c7">
|
||||
<label>Име на публикацията</label>
|
||||
<div><?= $model->name ?></div>
|
||||
</div>
|
||||
<div class="row top15 c7">
|
||||
<label>Анотация</label>
|
||||
<div><?= $model->annotation ?></div>
|
||||
</div>
|
||||
<?php //if (!empty($_GET['lib']) && $_GET['lib'] == 'sichtbar'): ?>
|
||||
<div class="row top15 c7">
|
||||
<label>Ключови думи</label>
|
||||
<div><?= $model->getTagsList(', ') ?></div>
|
||||
</div>
|
||||
<?php if ($model->library): ?>
|
||||
<div class="row top15 c7">
|
||||
<label>Информация</label>
|
||||
<div>
|
||||
<?php foreach ($model->library as $key => $value):
|
||||
if ($key == "id" || $key == "object_id" || $value == "''" || $value == "") continue;
|
||||
switch ($key) {
|
||||
case 'lib_variant':
|
||||
$value = ELibraryModels::$lib_types[$value][0] ?? $value[0];
|
||||
break;
|
||||
case 'lib_format':
|
||||
$value = ELibraryModels::$lib_format_opt[$value][0] ?? $value[0];
|
||||
break;
|
||||
case 'lib_license':
|
||||
$value = ELibraryModels::$lib_licenses[$value][0];
|
||||
break;
|
||||
case 'lib_rights':
|
||||
$value = ELibraryModels::$lib_rights[$value][0];
|
||||
break;
|
||||
case 'lib_language':
|
||||
$value = ELibraryModels::getLanguages($value);
|
||||
break;
|
||||
}
|
||||
?>
|
||||
<div><b><?= ELibraryModels::$key_labels[$key] ?? $key ?></b>: <?= strip_tags($value) ?></div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif ?>
|
||||
<?php //endif; ?>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
document.querySelectorAll('[data-preview]').forEach(e => {
|
||||
e.classList.add('pointer')
|
||||
e.addEventListener('click', () => {
|
||||
modal.modalPreview(e.dataset.preview);
|
||||
})
|
||||
})
|
||||
</script>
|
||||
@@ -0,0 +1,138 @@
|
||||
<?php
|
||||
|
||||
|
||||
use app\models\Events;
|
||||
use app\models\register\Partner;
|
||||
use app\widgets\FileWidget;
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
/**
|
||||
* @var Events $model
|
||||
*/
|
||||
$media_key = $model->getMediaKey();
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
<form autocomplete="off">
|
||||
<?php if ($model->getEventType()): ?>
|
||||
<input name="type" type="hidden" value="<?= $model->getEventType() ?>">
|
||||
<?php endif; ?>
|
||||
<div class="row c2">
|
||||
<label class="require">Дати на събитието</label>
|
||||
<input type="hidden" name="event_dates" id="event_dates" value="<?= $model->event_dates ?>">
|
||||
</div>
|
||||
<div class="row c6 top15">
|
||||
<label>Локация</label>
|
||||
<input name="location" placeholder="Въведи локация на събитието" value="<?= $model->location ?>"/>
|
||||
</div>
|
||||
<div class="row c6 top15">
|
||||
<label class="require">Заглавие</label>
|
||||
<input name="title" placeholder="Въведи заглавие на събитието" value="<?= $model->title ?>"/>
|
||||
</div>
|
||||
<div class="row c6 top15">
|
||||
<label class="require">Пртньор</label>
|
||||
<select name="partner_id">
|
||||
<option disabled selected>-- Избери организация --</option>
|
||||
<?php foreach (Partner::partnerList() as $id => $name): ?>
|
||||
<option <?= $model->partner_id == $id ? 'selected' : '' ?>
|
||||
value="<?= $id ?>"><?= $name ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="row top15" style="width: 350px">
|
||||
<label>Заглавно изображение</label>
|
||||
<?= FileWidget::widget([
|
||||
'media_type' => 'image',
|
||||
'object_key' => 'title_event_image',
|
||||
'media_key' => $media_key,
|
||||
'files' => $model->getFiles('thumb'),
|
||||
'actions' => [
|
||||
'add' => 'Добавяне',
|
||||
'edit' => 'Редакция',
|
||||
'delete' => 'Премахване'
|
||||
],
|
||||
'single_file' => true,
|
||||
'resolutions' => ['16:11', '21:11', '1:1'],
|
||||
'max_file_size' => 2,
|
||||
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
|
||||
]) ?>
|
||||
</div>
|
||||
<?= $this->render('/shared/instruction_1') ?>
|
||||
<div class="row c9 top15">
|
||||
<label class="require">Кратък текст</label>
|
||||
<textarea class="ckEditor" name="text_short"><?= $model->text_short ?></textarea>
|
||||
</div>
|
||||
<div class="row c9 top15">
|
||||
<label class="require">Подробен текст</label>
|
||||
<textarea class="ckEditor" name="text"><?= $model->text ?></textarea>
|
||||
</div>
|
||||
<div class="row c9 top15">
|
||||
<label>Изображения в събитието</label>
|
||||
<?= FileWidget::widget([
|
||||
'media_type' => 'image',
|
||||
'object_key' => 'event_images',
|
||||
'media_key' => $media_key,
|
||||
'files' => $model->getFiles('thumb'),
|
||||
'actions' => [
|
||||
'add' => 'Добавяне на изображения',
|
||||
'edit' => 'Редакция на изображение',
|
||||
'delete' => 'Премахване на изображения'
|
||||
],
|
||||
'resolutions' => ['16:11', '21:11', '1:1'],
|
||||
'max_file_size' => 2,
|
||||
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
|
||||
]) ?>
|
||||
</div>
|
||||
<?php if ($model->type == 'simple'): ?>
|
||||
<div class="row c9 top15 flex">
|
||||
<div class="c7 right10">
|
||||
<label>Стрийминг линк</label>
|
||||
<input onkeyup="updateLabelRequire(this, '#sta')" name="stream_url"
|
||||
placeholder="Въведи линк на стрийминг"
|
||||
value="<?= $model->stream_url ?>"/>
|
||||
</div>
|
||||
<div class="left10">
|
||||
<label id="sta">Достъп</label>
|
||||
<div class="flex top-page-panel"
|
||||
style="height: 14px; border-radius: 3px; border-color: var(--base-background-dark)">
|
||||
<?php foreach ([1 => 'Частен', 2 => 'Публичен'] as $v => $t): ?>
|
||||
<label style="margin-top: -3px" class="right10 radio-error"><input
|
||||
style="width: 14px; height: 14px;" type="radio"
|
||||
name="stream_access" <?= $model->stream_access == $v ? 'checked' : '' ?>
|
||||
value="<?= $v ?>"/> <?= $t ?>
|
||||
</label>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<div class="row c3 top15">
|
||||
<label class="require">Дата на публикуване</label>
|
||||
<input type="hidden" name="publish_date" id="publish_date" value="<?= $model->getPublishDate() ?>">
|
||||
</div>
|
||||
<div class="row c9 top15 flex">
|
||||
<?= Includes::formButtons('web-portal/events') ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<script src="/_public/assets/js/order.js"></script>
|
||||
<script src="/_public/assets/js/file-img.js"></script>
|
||||
<script src="/_public/plugins/cropperJs/cropper.min.js"></script>
|
||||
<script src="/_public/plugins/air-datepicker/locales.js"></script>
|
||||
<script src="/_public/plugins/air-datepicker/air-datepicker.js"></script>
|
||||
<script>
|
||||
new AirDatepicker('#event_dates', {
|
||||
inline: true,
|
||||
locale: locales.bg,
|
||||
multipleDates: true,
|
||||
multipleDatesSeparator: ',',
|
||||
minDate: '<?= date('Y-m-d') ?>',
|
||||
selectedDates: document.querySelector('#event_dates').value.split(',')
|
||||
});
|
||||
|
||||
new AirDatepicker('#publish_date', {
|
||||
inline: true,
|
||||
locale: locales.bg,
|
||||
minDate: '<?= date('Y-m-d') ?>',
|
||||
selectedDates: [document.querySelector('#publish_date').value]
|
||||
});
|
||||
</script>
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
/**
|
||||
* @var \app\models\ExpositionsCategories $model
|
||||
*/
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
<form autocomplete="off">
|
||||
<div class="flex top15 c9">
|
||||
<div class="row c6 right10">
|
||||
<label class="require">Наименование на категория (BG)</label>
|
||||
<input name="name" placeholder="Въведи наименование на категория"
|
||||
value="<?= $model->name ?>"/>
|
||||
</div>
|
||||
<div class="row c6">
|
||||
<label class="require">Наименование на категория (EN)</label>
|
||||
<input name="name_en" placeholder="Въведи наименование на категория"
|
||||
value="<?= $model->name_en ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row flex c9 top15">
|
||||
<?= Includes::formButtons('web-portal/expositions?listtab=categories') ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
+163
@@ -0,0 +1,163 @@
|
||||
<div class="wl-switch">
|
||||
<a class="" href="?listtab=list"><i class="la la-navicon"></i> Списък с експозиции</a>
|
||||
<a class="" href="?listtab=categories"><i class="la la-navicon"></i> Категории</a>
|
||||
<a class="selected" href="?listtab=tags"><i class="la la-navicon"></i> Тагове</a>
|
||||
</div>
|
||||
<?php
|
||||
|
||||
use app\models\ExpositionsTags;
|
||||
|
||||
$translations = ExpositionsTags::find()->orderBy(['id' => SORT_DESC])->all();
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
<div class="c10 row">
|
||||
<div class="row top15">
|
||||
<div onclick="addTs(this)" class="btn-ib btn-default add-ts"><i class="la la-plus-circle"></i> Добави нов
|
||||
таг
|
||||
</div>
|
||||
</div>
|
||||
<div class="row-panel top15">
|
||||
<input id="searchByName" style="height:13px; width: 300px" type="text" onkeydown="searchByName(this)"
|
||||
placeholder="Търси по име на таг">
|
||||
<div id="clearButton" onclick="clearButton()" class="btn-ib btn-default add-ts disabled left5"><i
|
||||
class="la la-remove"></i>
|
||||
Изчисти
|
||||
</div>
|
||||
<div onclick="searchButton()" class="btn-ib btn-default add-ts"><i class="la la-search"></i> Търси</div>
|
||||
</div>
|
||||
<table class="cms-table top15">
|
||||
<thead id="header" class="<?= sizeof($translations) == 0 ? 'hidden-row' : '' ?>">
|
||||
</thead>
|
||||
<tbody id="tslist">
|
||||
<?php if (sizeof($translations) == 0): ?>
|
||||
<tr id="empty-row">
|
||||
<td class="ct" style="font-size: 16px; padding: 20px" colspan="3">Няма добавени тагове</td>
|
||||
</tr>
|
||||
<?php else: ?>
|
||||
<?php foreach ($translations as $ts): ?>
|
||||
<tr id="ID<?= $ts->id ?>" data-row-id="<?= $ts->id ?>">
|
||||
<td class="c5">
|
||||
<div class="flex left10">
|
||||
<i class="lg lg-bg" style="margin-top: 10px"></i>
|
||||
<input autocomplete="off" oninput="updateTs(this)" data-input-id="<?= $ts->id ?>"
|
||||
name="name" placeholder="[BG]" value="<?= $ts->name ?>"/>
|
||||
</div>
|
||||
</td>
|
||||
<td class="c5">
|
||||
<div class="flex left10">
|
||||
<i class="lg lg-en" style="margin-top: 10px"></i>
|
||||
<input autocomplete="off" oninput="updateTs(this)" data-input-id="<?= $ts->id ?>"
|
||||
name="name_en" placeholder="[EN]" value="<?= $ts->name_en ?>"/>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
const newRow = (id) => {
|
||||
return `<tr id="ID${id}" data-row-id="${id}">
|
||||
<td class="c5">
|
||||
<div class="flex left10">
|
||||
<i class="lg lg-bg" style="margin-top: 10px"></i>
|
||||
<input autocomplete="off" oninput="updateTs(this)" data-input-id="${id}" name="name" placeholder="[BG]" value=""/>
|
||||
</div>
|
||||
</td>
|
||||
<td class="c5">
|
||||
<div class="flex left10">
|
||||
<i class="lg lg-en" style="margin-top: 10px"></i>
|
||||
<input autocomplete="off" oninput="updateTs(this)" data-input-id="${id}" name="name_en" placeholder="[EN]" value=""/>
|
||||
</div>
|
||||
</td>
|
||||
</tr>`;
|
||||
}
|
||||
const addTs = (e) => {
|
||||
e.classList.add('disabled')
|
||||
request({
|
||||
post: {},
|
||||
done: r => {
|
||||
if (r.id) {
|
||||
e.classList.remove('disabled')
|
||||
if (one('#empty-row')) {
|
||||
one('#tslist').innerHTML = newRow(r.id)
|
||||
one('#header').classList.remove('hidden-row')
|
||||
} else {
|
||||
|
||||
let firstRow = one('#tslist tr:first-child')
|
||||
let tb = document.createElement('tbody')
|
||||
tb.innerHTML = newRow(r.id)
|
||||
one('#tslist').insertBefore(tb.firstChild, firstRow)
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
const updateTs = (e) => {
|
||||
let post = {}
|
||||
post[e.name] = e.value || 'null'
|
||||
request({
|
||||
url: `?listtab=tags&o=w&id=${e.dataset.inputId}`, post
|
||||
})
|
||||
}
|
||||
|
||||
const searchByName = (e) => {
|
||||
if (event.keyCode === 13) {
|
||||
const search = e.value.toLowerCase();
|
||||
const clearButton = one('#clearButton');
|
||||
if (search !== '') {
|
||||
clearButton.removeClass('disabled');
|
||||
} else {
|
||||
clearButton.addClass('disabled');
|
||||
}
|
||||
document.querySelectorAll(`#tslist tr`).forEach(tr => {
|
||||
const vBg = tr.querySelector('td:nth-child(1) input').value.toLowerCase();
|
||||
const vEn = tr.querySelector('td:nth-child(2) input').value.toLowerCase();
|
||||
if (search !== '') {
|
||||
if (vBg.indexOf(search) > -1 || vEn.indexOf(search) > -1) {
|
||||
tr.classList.remove('hidden-row')
|
||||
} else {
|
||||
tr.classList.add('hidden-row')
|
||||
}
|
||||
} else {
|
||||
tr.classList.remove('hidden-row')
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const searchButton = () => {
|
||||
const search = one('#searchByName').value.toLowerCase();
|
||||
const clearButton = one('#clearButton');
|
||||
if (search !== '') {
|
||||
clearButton.removeClass('disabled');
|
||||
} else {
|
||||
clearButton.addClass('disabled');
|
||||
}
|
||||
document.querySelectorAll(`#tslist tr`).forEach(tr => {
|
||||
const vBg = tr.querySelector('td:nth-child(1) input').value.toLowerCase();
|
||||
const vEn = tr.querySelector('td:nth-child(2) input').value.toLowerCase();
|
||||
if (search !== '') {
|
||||
if (vBg.indexOf(search) > -1 || vEn.indexOf(search) > -1) {
|
||||
tr.classList.remove('hidden-row')
|
||||
} else {
|
||||
tr.classList.add('hidden-row')
|
||||
}
|
||||
} else {
|
||||
tr.classList.remove('hidden-row')
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const clearButton = () => {
|
||||
one('#searchByName').value = '';
|
||||
document.querySelectorAll(`#tslist tr`).forEach(tr => {
|
||||
tr.classList.remove('hidden-row')
|
||||
})
|
||||
const clearButton = one('#clearButton');
|
||||
clearButton.addClass('disabled');
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,114 @@
|
||||
<?php
|
||||
|
||||
use app\models\ExpositionsCategories;
|
||||
use app\models\Partner;
|
||||
use app\widgets\FileWidget;
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
/**
|
||||
* @var \app\models\Expositions $model
|
||||
*/
|
||||
|
||||
$media_key = $model->getMediaKey();
|
||||
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
<form autocomplete="off">
|
||||
|
||||
<div class="row c9 top15">
|
||||
<label>Галерия</label>
|
||||
<?= FileWidget::widget([
|
||||
'media_type' => 'image',
|
||||
'object_key' => 'title_expositions_images',
|
||||
'media_key' => $media_key,
|
||||
'model_id' => $model->id,
|
||||
'model_class' => \app\models\Expositions::class,
|
||||
'files' => $model->getFiles('thumb'),
|
||||
'actions' => [
|
||||
'add' => 'Добавяне на изображение',
|
||||
'edit' => 'Редакция на изображенито',
|
||||
'delete' => 'Премахване на изображението'
|
||||
],
|
||||
'resolutions' => ['1:1', '16:11'],
|
||||
'max_file_size' => 2,
|
||||
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
|
||||
]) ?>
|
||||
</div>
|
||||
<div class="flex top15 c9">
|
||||
<div class="row c6 right10">
|
||||
<label class="require">Наименование на експозиция (BG)</label>
|
||||
<input name="name" placeholder="Въведи наименование на експозиция"
|
||||
value="<?= $model->name ?>"/>
|
||||
</div>
|
||||
<div class="row c6">
|
||||
<label class="require">Наименование на експозиция (EN)</label>
|
||||
<input name="ts_en_name" placeholder="Въведи наименование на експозиция"
|
||||
value="<?= $model->ts_en_name ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex top15 c9">
|
||||
<div class="row c3 right10">
|
||||
<label class="require">Категория</label>
|
||||
<select name="category_id">
|
||||
<option selected disabled>-- избери категория --</option>
|
||||
<?php foreach (ExpositionsCategories::dropDownList($model->category_id) as $category): ?>
|
||||
<option value="<?= $category->id ?>" <?= $category->selected ?>><?= $category->name ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c9 top15">
|
||||
<label class="require">Анотация</label>
|
||||
<textarea class="ckEditor" name="annotation"><?= $model->{'annotation'} ?></textarea>
|
||||
</div>
|
||||
<div class="row c9 top15">
|
||||
<label class="require">Описание</label>
|
||||
<textarea class="ckEditor" name="description"><?= $model->{'description'} ?></textarea>
|
||||
</div>
|
||||
<div class="row c9 top15">
|
||||
<label>Тагове</label>
|
||||
<select style="display:none;" class="search-select-box" multiple
|
||||
name="tag_list[]">
|
||||
<option disabled value="">-- избери тагове --</option>
|
||||
<?php foreach ($model->getTagList() as $item): ?>
|
||||
<option <?= $item['selected'] ?>
|
||||
value="<?= $item['id'] ?>"><?= $item['name'] ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="row c9 top15">
|
||||
<label class="require">Партньор</label>
|
||||
<select name="partner_id">
|
||||
<option selected disabled value="">-- Изберете партньор --</option>
|
||||
<?php foreach (\app\models\register\Partner::partnerList() as $id => $name): ?>
|
||||
<option <?= $model->partner_id == $id ? 'selected' : '' ?> value="<?= $id ?>"><?= $name ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="row c9 top15">
|
||||
<label class="require">Информационен център</label>
|
||||
<input name="info_center" placeholder="Въведи наименование на информационен център"
|
||||
value="<?= $model->info_center ?>"/>
|
||||
</div>
|
||||
<div class="row c9 top15">
|
||||
<label class="require">Информационен център адрес</label>
|
||||
<input name="info_center_address" placeholder="Въведи адрес на информационен център"
|
||||
value="<?= $model->info_center_address ?>"/>
|
||||
</div>
|
||||
<div class="row flex c9 top15">
|
||||
<?= Includes::formButtons('web-portal/expositions') ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script src="/_public/assets/js/order.js"></script>
|
||||
<script src="/_public/assets/js/file-img.js"></script>
|
||||
<script src="/_public/plugins/cropperJs/cropper.min.js"></script>
|
||||
<script src="/_public/assets/js/search-box.js"></script>
|
||||
|
||||
<script>
|
||||
all('.search-select-box').forEach(el => {
|
||||
new SearchBox(el)
|
||||
})
|
||||
</script>
|
||||
@@ -0,0 +1,94 @@
|
||||
<?php
|
||||
|
||||
use app\models\Navigation;
|
||||
use app\models\Pages;
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
/**
|
||||
* @var Navigation $model
|
||||
*/
|
||||
$availableListTabs = ['main', 'footer', 'footer_2', 'footer_3'];
|
||||
|
||||
?>
|
||||
<?php if (!empty($_GET['listtab']) && in_array($_GET['listtab'], $availableListTabs)): ?>
|
||||
<div class="inner-content p10">
|
||||
<form autocomplete="off">
|
||||
<div class="c10 row">
|
||||
<label class="require">Име на бутон</label>
|
||||
<div class="flex row row-panel">
|
||||
<div class="row c6 right10">
|
||||
<label><i class="lg lg-bg"></i> BG</label>
|
||||
<input name="name" placeholder="Въведи име на бутона"
|
||||
value="<?= $model->name ?>"/>
|
||||
</div>
|
||||
<div class="row c6">
|
||||
<label><i class="lg lg-en"></i> EN</label>
|
||||
<input name="ts_en_name" placeholder="Въведи име на бутона"
|
||||
value="<?= $model->ts_en_name ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="c10 row top15">
|
||||
<label class="require">Връзка</label>
|
||||
<div class="flex row row-panel">
|
||||
<div class="row c6 right10">
|
||||
<label class="inner-block"><input <?= $model->isRelationType('inner_page') ?>
|
||||
value="inner_page" type="radio" name="relation_type"> Вътрешна страница
|
||||
</label>
|
||||
<select data-content="inner_page" <?= $model->isRelationTypeFor('inner_page') ?> name="page_id">
|
||||
<option value="" disabled selected>Избери вътрешна страница</option>
|
||||
<?php foreach (Pages::getList() as $id => $page): ?>
|
||||
<option <?= $id == $model->page_id ? 'selected' : '' ?>
|
||||
value="<?= $id ?>"><?= $page ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="row c6">
|
||||
<label class="inner-block"><input <?= $model->isRelationType('outer_page') ?>
|
||||
value="outer_page" type="radio" name="relation_type"> Url адрес на страница
|
||||
</label>
|
||||
<div>
|
||||
<input placeholder="Въведи url адрес на външна или вътрешна страница"
|
||||
data-content="outer_page" <?= $model->isRelationTypeFor('outer_page') ?> name="url"
|
||||
value="<?= $model->url ?>">
|
||||
</div>
|
||||
<div class="top5">
|
||||
<input placeholder="Въведи url адрес на външна или вътрешна страница за уторизирани потребители"
|
||||
data-content="outer_page" <?= $model->isRelationTypeFor('outer_page') ?>
|
||||
name="url_authorised"
|
||||
value="<?= $model->url_authorised ?>">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php if (empty($_GET['id'])): ?>
|
||||
<input name="menu_type" type="hidden" value="<?= $_GET['listtab'] ?>">
|
||||
<?php endif; ?>
|
||||
<div class="row c9 top15 flex">
|
||||
<?= Includes::formButtons('web-portal/navigation/?listtab=' . $_GET['listtab']) ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<script>
|
||||
all('[name="relation_type"]', e => {
|
||||
e.addEventListener('click', () => {
|
||||
all('[data-content]', (elm) => {
|
||||
elm.parentNode.removeClass('form-error')
|
||||
let msg = elm.parentNode.querySelector('.error-bubble');
|
||||
if (msg) {
|
||||
msg.remove();
|
||||
}
|
||||
if (elm.dataset.content === e.value) {
|
||||
elm.removeAttribute('readonly')
|
||||
elm.removeClass('disabled')
|
||||
} else {
|
||||
elm.setAttribute('readonly', true)
|
||||
elm.addClass('disabled')
|
||||
elm.value = ''
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
</script>
|
||||
@@ -0,0 +1,110 @@
|
||||
<?php
|
||||
|
||||
use app\models\News;
|
||||
use app\models\register\Partner;
|
||||
use app\widgets\FileWidget;
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
/**
|
||||
* @var News $model
|
||||
*/
|
||||
$media_key = $model->getMediaKey();
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
<form autocomplete="off">
|
||||
<div class="row c5">
|
||||
<label class="require">Пртньор</label>
|
||||
<select name="partner_id">
|
||||
<option disabled selected>-- Избери организация --</option>
|
||||
<?php foreach (Partner::partnerList() as $id => $name): ?>
|
||||
<option <?= $model->partner_id == $id ? 'selected' : '' ?>
|
||||
value="<?= $id ?>"><?= $name ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="row c5 top15">
|
||||
<label class="require">Заглавие</label>
|
||||
<input name="title" placeholder="Въведи заглавие на новината" value="<?= $model->title ?>"/>
|
||||
</div>
|
||||
<div class="row c9 top15">
|
||||
<label>Заглавно изображение</label>
|
||||
<?= FileWidget::widget([
|
||||
'media_type' => 'image',
|
||||
'object_key' => 'title_news_image',
|
||||
'media_key' => $media_key,
|
||||
'files' => $model->getFiles('thumb'),
|
||||
'actions' => [
|
||||
'add' => 'Добавяне на изображение',
|
||||
'edit' => 'Редакция на изображенито',
|
||||
'delete' => 'Премахване на изображението'
|
||||
],
|
||||
'single_file' => true,
|
||||
'resolutions' => ['16:11', '16:9', '1:1'],
|
||||
'max_file_size' => 2,
|
||||
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
|
||||
]) ?>
|
||||
</div>
|
||||
<?= $this->render('/shared/instruction_1') ?>
|
||||
<div class="row c9 top15">
|
||||
<label class="require">Кратък текст (на български)</label>
|
||||
<textarea class="ckEditor" name="text_short"><?= $model->text_short ?></textarea>
|
||||
</div>
|
||||
<div class="row c9 top15">
|
||||
<label class="require">Пълен текст (на български)</label>
|
||||
<textarea class="ckEditor" name="text"><?= $model->text ?></textarea>
|
||||
</div>
|
||||
<div class="row c9 top15">
|
||||
<label>Изображения в новината</label>
|
||||
<?= FileWidget::widget([
|
||||
'media_type' => 'image',
|
||||
'object_key' => 'news_images',
|
||||
'media_key' => $media_key,
|
||||
'files' => $model->getFiles('thumb'),
|
||||
'actions' => [
|
||||
'add' => 'Добавяне на изображения',
|
||||
'edit' => 'Редакция на изображение',
|
||||
'delete' => 'Премахване на изображения'
|
||||
],
|
||||
'resolutions' => ['16:11', '16:9', '1:1'],
|
||||
'max_file_size' => 2,
|
||||
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
|
||||
]) ?>
|
||||
</div>
|
||||
<div class="row c9 top15 flex">
|
||||
<div class="c7 right10">
|
||||
<label>Стрийминг линк</label>
|
||||
<input onkeyup="updateLabelRequire(this, '#sta')" name="stream_url" placeholder="Въведи линк на стрийминг"
|
||||
value="<?= $model->stream_url ?>"/>
|
||||
</div>
|
||||
<div class="left10">
|
||||
<label id="sta">Достъп</label>
|
||||
<div class="flex top-page-panel" style="height: 14px; border-radius: 3px; border-color: var(--base-background-dark)">
|
||||
<?php foreach ([1 => 'Частен', 2 => 'Публичен'] as $v => $t): ?>
|
||||
<label style="margin-top: -3px" class="right10 radio-error"><input style="width: 14px; height: 14px;" type="radio" name="stream_access" <?= $model->stream_access == $v ? 'checked' : '' ?>
|
||||
value="<?= $v ?>"/> <?= $t ?>
|
||||
</label>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c3 top15">
|
||||
<label class="require">Дата на публикуване</label>
|
||||
<input type="hidden" name="publish_date" id="publish_date" value="<?= $model->getPublishDate() ?>">
|
||||
</div>
|
||||
<div class="row c9 top15 flex">
|
||||
<?= Includes::formButtons('web-portal/news') ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<script src="/_public/assets/js/order.js"></script>
|
||||
<script src="/_public/assets/js/file-img.js"></script>
|
||||
<script src="/_public/plugins/cropperJs/cropper.min.js"></script>
|
||||
<script src="/_public/plugins/air-datepicker/locales.js"></script>
|
||||
<script src="/_public/plugins/air-datepicker/air-datepicker.js"></script>
|
||||
<script>
|
||||
new AirDatepicker('#publish_date', {
|
||||
inline: true,
|
||||
locale: locales.bg,
|
||||
selectedDates: [document.querySelector('#publish_date').value]
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
use app\models\Objects;
|
||||
use app\models\Partner;
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
/**
|
||||
* @var Objects $model
|
||||
*/
|
||||
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
<form autocomplete="off">
|
||||
<?php if ($model->ot_id && $model->sc_id): ?>
|
||||
<!-- EDIT -->
|
||||
<div class="row info-table c4 top15">
|
||||
<div class="row-flex">
|
||||
<div>Категория:</div>
|
||||
<div class="fl-capitalize"><?= $model->subCategory->mainCategory->name ?></div>
|
||||
</div>
|
||||
<div class="row-flex">
|
||||
<div>Под категория:</div>
|
||||
<div class="fl-capitalize"><?= $model->subCategory->name ?></div>
|
||||
</div>
|
||||
<div class="row-flex">
|
||||
<div>Вид обект:</div>
|
||||
<div class="fl-capitalize"><?= $model->objectTemplate->name ?></div>
|
||||
</div>
|
||||
<div class="row-flex">
|
||||
<div>Партньор:</div>
|
||||
<div class="fl-capitalize"><?= $model->partner->name ?></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row c7 top15">
|
||||
<label class="require">Партньор</label>
|
||||
<select name="partner_id">
|
||||
<option selected disabled value="">-- Изберете партньор--</option>
|
||||
<?php foreach (Partner::partnerList() as $id => $name): ?>
|
||||
<option <?= $model->partner_id == $id ? 'selected': ''?> value="<?= $id ?>"><?= $name ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="row top15 c7">
|
||||
<label class="require">Наименование на обекта</label>
|
||||
<input name="name" value="<?= $model->name ?>">
|
||||
</div>
|
||||
<div class="row top15 c7">
|
||||
<label class="require">Анотация</label>
|
||||
<textarea name="annotation"><?= $model->annotation ?></textarea>
|
||||
</div>
|
||||
<div class="row top15 c7">
|
||||
<label class="require">Подробно описание</label>
|
||||
<textarea class="ckEditor" name="description"><?= $model->description ?></textarea>
|
||||
</div>
|
||||
<div class="row c9 top15 flex">
|
||||
<?= Includes::formButtons('web-portal/objects') ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</form>
|
||||
</div>
|
||||
@@ -0,0 +1,91 @@
|
||||
<?php
|
||||
|
||||
use app\models\Pages;
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
/**
|
||||
* @var Pages $model
|
||||
*/
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
<form autocomplete="off">
|
||||
<div class="c10 row">
|
||||
<label>Заглавие страница</label>
|
||||
<div class="flex row row-panel">
|
||||
<div class="row c6 right10">
|
||||
<label class="require"><i class="lg lg-bg"></i> Български</label>
|
||||
<input name="name" placeholder="Въведи заглавието страницата [BG]" value="<?= $model->name ?>"/>
|
||||
</div>
|
||||
<div class="row c6 right10">
|
||||
<label class="require"><i class="lg lg-en"></i> Английски</label>
|
||||
<input name="name_en" placeholder="Въведи заглавието страницата [EN]" value="<?= $model->name_en ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="c10 row top15">
|
||||
<label>Текст</label>
|
||||
<div class="row row-panel">
|
||||
<div class="row c12">
|
||||
<label><i class="lg lg-bg"></i> Български</label>
|
||||
<textarea class="ckEditor" name="text" placeholder="Въведи текст на страницата [BG]"><?= $model->text ?></textarea>
|
||||
</div>
|
||||
<div class="row c12 top15">
|
||||
<label><i class="lg lg-en"></i> Английски</label>
|
||||
<textarea class="ckEditor" name="text_en" placeholder="Въведи текст на страницата [EN]"><?= $model->text_en ?></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php if($model && $model->contact): ?>
|
||||
<div class="panel row-panel top15 c10">
|
||||
<h2>Контакти</h2>
|
||||
<div class="row">
|
||||
<div class="flex row">
|
||||
<div class="row c6 right10">
|
||||
<label>Телефон</label>
|
||||
<input name="contacts[phone]" value="<?= $model->contact->phone ?>">
|
||||
</div>
|
||||
<div class="row c6">
|
||||
<label>E-mail</label>
|
||||
<input name="contacts[email]" value="<?= $model->contact->email ?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex row top15">
|
||||
<div class="row c12">
|
||||
<label>Уебсайт</label>
|
||||
<input name="contacts[website]" value="<?= $model->contact->website ?>">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row top15">
|
||||
<label>Адрес</label>
|
||||
<div class="flex row row-panel">
|
||||
<div class="row c6 right10">
|
||||
<label class="require"><i class="lg lg-bg"></i> Български</label>
|
||||
<input name="contacts[address]" placeholder="Въведи адрес [BG]" value="<?= $model->contact->address ?>"/>
|
||||
</div>
|
||||
<div class="row c6 right10">
|
||||
<label class="require"><i class="lg lg-en"></i> Английски</label>
|
||||
<input name="contacts[address_en]" placeholder="Въведи адрес [EN]" value="<?= $model->contact->address_en ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row top15">
|
||||
<label>Управляващ орган</label>
|
||||
<div class="flex row row-panel">
|
||||
<div class="row c6 right10">
|
||||
<label class="require"><i class="lg lg-bg"></i> Български</label>
|
||||
<input name="contacts[managing_authority]" placeholder="Въведи управляващ орган [BG]" value="<?= $model->contact->managing_authority ?>"/>
|
||||
</div>
|
||||
<div class="row c6 right10">
|
||||
<label class="require"><i class="lg lg-en"></i> Английски</label>
|
||||
<input name="contacts[managing_authority_en]" placeholder="Въведи управляващ орган [EN]" value="<?= $model->contact->managing_authority_en ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif ?>
|
||||
<div class="row c9 top15 flex">
|
||||
<?= Includes::formButtons('web-portal/pages') ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
+173
@@ -0,0 +1,173 @@
|
||||
<?php
|
||||
|
||||
use app\models\Positions;
|
||||
use app\widgets\services\Includes;
|
||||
|
||||
/**
|
||||
* @var Positions $model
|
||||
*/
|
||||
$media_key = $model->getMediaKey();
|
||||
$min = 1;
|
||||
$max = 15;
|
||||
?>
|
||||
<div class="inner-content p10">
|
||||
<form autocomplete="off">
|
||||
<div class="row c3 top15">
|
||||
<label class="require">Име на групата</label>
|
||||
<input name="group_name" placeholder="Въведи име на групата на позициите"
|
||||
value="<?= $model->group_name ?>"/>
|
||||
</div>
|
||||
<?php if($model->id == 1):?>
|
||||
<p class="upload-info">Материалите се показват на началната страница за да иглеждат добре е препоръчително броят на активните позиции в тематичната зона да бъде нечетно число.</i></p>
|
||||
<?php endif; ?>
|
||||
<?php if ($model->positionsCount == 0): ?>
|
||||
<div class="row c3 top15">
|
||||
<label class="require">Брой позиции</label>
|
||||
<input onkeyup="validateNumber(this, <?= $min ?>, <?= $max ?>)" type="number" min="<?= $min ?>"
|
||||
max="<?= $max ?>" name="positions_count" placeholder="Въведи колко на брой ще бъдат позициите"/>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
|
||||
<div class="row c5 top15">
|
||||
<div onclick="addPosition(this)" data-id="<?= $model->id ?>"
|
||||
class="btn-ib btn-default <?= $model->positionsCount >= $max ? 'disabled' : '' ?>">
|
||||
<i class="la la-plus-circle"></i> Добавяне на позиция
|
||||
</div>
|
||||
<div id="bDelete" data-model="app\models\Positions" onclick="checkDelete(this)"
|
||||
class="btn-ib btn-default ct disabled">
|
||||
<i class="la la-trash-o"></i> Изтриване на позиции <span id="delCount">(0)</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="c9 top15">
|
||||
<table class="cms-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="text-right c0">
|
||||
<input id="checkAll" onclick="checkAllPositions(this)" title="Избери всички"
|
||||
class="delete-checkbox" type="checkbox">
|
||||
No
|
||||
</th>
|
||||
<th>Материял</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
$articles = ['Новина', 'Събитие', 'Кампания'];
|
||||
foreach ($model->positions as $i => $position): ?>
|
||||
<tr draggable="true" data-index="<?= $position->order_index ?>">
|
||||
<td class="text-right">
|
||||
<input onclick="checkSingle(this)" data-del="<?= $position->id ?>"
|
||||
class="delete-checkbox"
|
||||
type="checkbox"
|
||||
style="top: calc(50% - 10px)">
|
||||
<span class="order-index"><?= $position->order_index + 1 ?></span>
|
||||
</td>
|
||||
<td><?= $position->article ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<input type="hidden" name="positions_count_ready" value="<?= $model->positionsCount ?>">
|
||||
<div class="row c9 top15 flex">
|
||||
<?= Includes::formButtons('web-portal/positions') ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script src="/_public/assets/js/order.js"></script>
|
||||
|
||||
<script>
|
||||
|
||||
orderItems('[data-index]', '/update-positions-indexes/', function () {
|
||||
var index = 0
|
||||
all('[data-index] .order-index').forEach(e => {
|
||||
e.innerText = ++index
|
||||
})
|
||||
});
|
||||
|
||||
function validateNumber(e, min, max) {
|
||||
if (e.value !== '') {
|
||||
if (e.value < min)
|
||||
e.value = min;
|
||||
if (e.value > max)
|
||||
e.value = max;
|
||||
}
|
||||
}
|
||||
|
||||
let sl = [];
|
||||
|
||||
function checkAllPositions(el) {
|
||||
sl = [];
|
||||
all('td [data-del]').forEach(e => {
|
||||
e.checked = el.checked === true;
|
||||
if (el.checked) {
|
||||
sl.push(e.dataset.del);
|
||||
e.parentNode.parentNode.addClass('checked');
|
||||
} else {
|
||||
e.parentNode.parentNode.removeClass('checked');
|
||||
}
|
||||
|
||||
})
|
||||
updateActionButtons();
|
||||
}
|
||||
|
||||
function checkSingle(e) {
|
||||
if (e.checked) {
|
||||
sl.push(e.dataset.del);
|
||||
e.parentNode.parentNode.addClass('checked');
|
||||
} else {
|
||||
one('#checkAll').checked = false;
|
||||
e.parentNode.parentNode.removeClass('checked');
|
||||
const f = sl.indexOf(e.dataset.del);
|
||||
sl.splice(f, 1);
|
||||
}
|
||||
updateActionButtons(e.dataset.del);
|
||||
}
|
||||
|
||||
function updateActionButtons() {
|
||||
const bDelete = one('#bDelete');
|
||||
const delCount = one('#delCount');
|
||||
const c = sl.length;
|
||||
if (delCount)
|
||||
delCount.innerText = '(' + c + ')';
|
||||
if (c > 0) {
|
||||
if (bDelete)
|
||||
bDelete.removeClass('disabled');
|
||||
} else {
|
||||
if (bDelete)
|
||||
bDelete.addClass('disabled');
|
||||
}
|
||||
}
|
||||
|
||||
function checkDelete(e) {
|
||||
const msg = 'Сигурни ли сте, че искате да изтриете ' + (sl.length > 1 ? 'тези ' + sl.length + ' записа?' : 'този запис?');
|
||||
modal.confirm(msg, () => {
|
||||
request({
|
||||
url: window.location.href.split('?')[0] + '?o=d',
|
||||
post: {
|
||||
ids: JSON.stringify(sl),
|
||||
model: e.dataset.model
|
||||
},
|
||||
done: e => {
|
||||
window.location.reload();
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
function addPosition(e) {
|
||||
request({
|
||||
url: '/new-article-position/',
|
||||
post: {
|
||||
group_id: e.dataset.id
|
||||
},
|
||||
done: e => {
|
||||
window.location.reload();
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user