Initial import

This commit is contained in:
Admin Nasledstvo
2026-05-01 20:52:04 +03:00
commit ac168868ee
10028 changed files with 2337954 additions and 0 deletions
@@ -0,0 +1,29 @@
<?php
header('Content-type: application/json');
use app\models\UserPublic;
use app\services\JWT;
$post = \Yii::$app->request->getRawBody();
$postDecode = json_decode($post);
if (!empty($postDecode->device_id) && !empty($postDecode->uid)) {
$device_id = $postDecode->device_id;
$uid = $postDecode->uid;
$user = UserPublic::find()->where(['device_id' => $device_id])->one();
if ($user) {
$decode = JWT::decode($user->device_id, JWT::SECRET_KEY);
if($decode->uid == $uid) {
$user->is_mobile_user = 1;
$user->save();
echo json_encode(['userToken' => JWT::encode(['id' => $user->id], JWT::SECRET_KEY), 'profile'=> $user->profileData()]);
exit;
}
} else {
echo json_encode(['error' => 'wrong_user']);
exit;
}
} else {
echo json_encode(['error' => 'wrong_user']);
exit;
}
@@ -0,0 +1,34 @@
<?php
header('Content-type: application/json');
use app\models\UserPublic;
use app\services\JWT;
$post = \Yii::$app->request->getRawBody();
$postDecode = json_decode($post);
if (!empty($postDecode->email) && !empty($postDecode->password)) {
$email = $postDecode->email;
$password = $postDecode->password;
$user = UserPublic::find()->where(['email' => $email])->one();
if(!empty($_GET['partner'])) {
if(sizeof($user->qrValidators) == 0) {
echo json_encode(['error' => 'wrong_user']);
exit;
}
}
//echo json_encode(['email' => $user->email, 'password' => password_verify($password, $user->password_hash), 'hash' => $user->password_hash]);
//exit;
if ($user && password_verify($password, $user->password_hash)) {
$user->is_mobile_user = 1;
$user->save();
echo json_encode(['userToken' => JWT::encode(['id' => $user->id], JWT::SECRET_KEY), 'profile'=> $user->profileData()]);
exit;
} else {
echo json_encode(['error' => 'wrong_user']);
exit;
}
} else {
echo json_encode(['error' => 'wrong_user']);
exit;
}
@@ -0,0 +1,88 @@
<?php
use app\models\Articles;
use app\services\Formatter;
use app\services\ViewReg;
$data = [];
if (!empty($_GET['id'])) {
$lg = \Yii::$app->language;
$condition = [];
//$condition['is_active'] = 1;
$condition['id'] = $_GET['id'];
$articles = Articles::find()->where($condition);
$article = $articles->one();
$favorite = false;
$user = \app\services\Auth::getUserByToken();
if ($user) {
$favoriteExists = \app\models\UserFavorites::find()->where(['user_id' => $user->id, 'table' => 'articles', 'fid' => $_GET['id']])->exists();
if ($favoriteExists)
$favorite = true;
}
if ($article && $article->article) {
$model = new \stdClass();
$model->title = $lg == 'en' ? $article->title_en ?? $article->title : $article->title;
$model->text = strip_tags($article->article->text());
$model->type = 'articles';
$model->images = $article->article->images('16:11');
$model->img = $article->article->image('16:11') ?? \Yii::$app->params['portal'] . '/_public/images/empty-169.png';
$model->isFavorite = $favorite;
if ($article->art_table == 'campaigns') {
$model->date = $article->campaigns->getFormattedDates();
$model->location = $lg == 'en' ? $article->campaigns->ts_en_location : $article->campaigns->location;
}
if ($article->art_table == 'events') {
$model->date = $article->events->getFormattedDates();
$model->dates = explode(',', $article->events->event_dates);
if ($article->events->type == 'booking') {
$model->bookingAvailable = $article->events->isBookingAvailable();
$model->event_id = $article->events->id;
$slug = Formatter::cyrillicTrans($article->article->title());
$model->booking_url = Yii::$app->params['portal'] . '/' . $lg . '/sabitia/' . Formatter::encodeId($article->id) . "-$slug/?booking=true&webview_mode=true";
if (!empty($_GET['tickets'])) {
$tickets = \app\models\OrderBooking::find()->where(['event_id' => $article->events->id])->all();
$ticketGroups = [];
$all_tickets_count = 0;
$all_validated = 0;
foreach ($tickets as $ticketGroup) {
if(empty($ticketGroups[$ticketGroup->ticket_id])) {
$ticketGroups[$ticketGroup->ticket_id] = [
'count' => $ticketGroup->tickets_count,
'name' => $lg == 'en' ? $ticketGroup->name_en : $ticketGroup->name_bg,
'validated_count' => $ticketGroup->validated_count
];
} else {
$ticketGroups[$ticketGroup->ticket_id]['count'] += $ticketGroup->tickets_count;
$ticketGroups[$ticketGroup->ticket_id]['validated_count'] += $ticketGroup->validated_count;
}
}
foreach ($ticketGroups as $group) {
$all_tickets_count += $group['count'];
$all_validated += $group['validated_count'];
}
$model->tickets = array_values($ticketGroups);
$model->total_tickets = $all_tickets_count;
$model->total_validated = $all_validated;
}
}
$model->location = $lg == 'en' ? $article->events->ts_en_location : $article->events->location;
}
if ($article->art_table == 'news') {
$model->date = date('d.m.Y', strtotime($article->publish_date));
}
$model->id = $article->id;
$data[] = $model;
}
}
header('Content-type: application/json');
echo json_encode(['data' => $data]);
exit;
@@ -0,0 +1,59 @@
<?php
use app\models\Articles;
$lg = \Yii::$app->language;
$articles = Articles::find();
$data = [];
$page = $_GET['page'] ?? 1;
$per_page = 10;
$condition = ['and'];
//$condition['is_active'] = 1;
if (!empty($_GET['type']) && $_GET['type'] != 'default')
$condition[] = ['=', 'art_table', $_GET['type']];
//region [Articles]
if (!empty($_GET['token'])) {
/** @var \app\models\UserPublic $user */
$user = \app\services\Auth::getUserByToken($_GET['token']);
if ($user) {
$partner_ids = [];
foreach ($user->qrValidators as $qrValidator) {
$partner_ids[] = $qrValidator->partner_id;
}
if (sizeof($partner_ids) > 0) {
$articles->innerJoinWith('events');
$condition[] = ['=', 'type', 'booking'];
$condition[] = ['IN', 'events.partner_id', $partner_ids];
}
}
}
$articles->where($condition);
$articles->orderBy(['publish_date' => SORT_DESC])
->offset($page * $per_page - $per_page)->limit($per_page);
$count = $articles->count();
$lastPage = ceil($count / $per_page);
foreach ($articles->all() as $article) {
if ($article->article) {
$model = new \stdClass();
$model->title = $lg == 'en' ? $article->title_en ?? $article->title : $article->title;
$model->type = $article->art_table;
$model->img = $article->article->image() ?? \Yii::$app->params['portal'] . '/_public/images/empty-169.png';
$model->id = $article->id;
$data[] = $model;
}
}
header('Content-type: application/json');
echo json_encode(['data' => $data, 'lastPage' => $lastPage, 'count' => $count]);
exit;
@@ -0,0 +1,44 @@
<?php
/* @var $this \yii\web\View */
$lg = Yii::$app->language;
use app\models\register\Fields;
use app\models\register\FieldsValuesRelations;
use app\services\JR;
$parent_id = $_GET['parent_value_id'];
$id = 1;
$levels = [];
//field_type: 1 - specific, 2 - general, 3 - category
$fieldsValuesRelations = FieldsValuesRelations::find()->where(['parent_value_id' => $parent_id])->all();
$ids = [];
foreach ($fieldsValuesRelations as $fieldsValuesRelation) {
if ($fieldsValuesRelation->child_field_id != 0)
$ids[] = $fieldsValuesRelation->child_field_id;
}
$fields = Fields::find()->where(['IN', 'id', $ids])->andWhere(['lib_type' => 1])->all();
foreach ($fields as $field) {
//type: 1-dropdown, 2-text
if ($field->type == 1) {
$options = [];
foreach ($field->fieldsValues as $option) {
$options[] = ['id' => $option->id, 'name' => $lg == 'en' ? $option->name_en : $option->name];
}
$levels[] = ['parent_id' => $parent_id, 'dropdown' => $_GET['dropdown'], 'id' => $parent_id . "_" . $id++, 'label' => $field->getNameByLocale(), 'type' => 'select', 'name' => 'name_id_' . $field->id, 'options' => $options, 'dynamic' => true];
} else {
$levels[] = ['parent_id' => $parent_id, 'dropdown' => $_GET['dropdown'], 'id' => $parent_id . "_" . $id++, 'label' => $field->getNameByLocale(), 'type' => 'input', 'name' => 'name_text_' . $field->id];
}
}
JR::message(JR::done, ['levels' => $levels]);
?>
@@ -0,0 +1,72 @@
<?php
/* @var $this \yii\web\View */
$lg = Yii::$app->language;
use app\models\register\Fields;
use app\services\JR;
$translateModule = [
'object_name' => [
'bg' => 'Име на обект',
'en' => 'Object name'
],
'object_creator' => [
'bg' => 'Създател на обект',
'en' => 'Object creator'
],
'year' => [
'bg' => 'Година',
'en' => 'Year'
]
];
$id = 1;
$levels = [
['id' => $id++, 'label' => $translateModule['object_name'][$lg], 'type' => 'input', 'name' => 'object_name'],
['id' => $id++, 'label' => $translateModule['object_creator'][$lg], 'type' => 'input', 'name' => 'object_creator'],
['id' => $id++, 'label' => $translateModule['year'][$lg], 'type' => 'input-range', 'name' => 'year'],
];
//field_type: 1 - specific, 2 - general, 3 - category
$specificFields = Fields::find()->where(['lib_type' => 1, 'field_type' => 2])->andWhere(['>', 'level', 0])->all();
foreach ($specificFields as $field) {
//type: 1-dropdown, 2-text
if($field->type == 1) {
$options = [];
foreach ($field->fieldsValues as $option) {
$options[] = ['id' => $option->id, 'name' => $lg == 'en' ? $option->name_en : $option->name];
}
$levels[] = ['id' => $id++, 'label' => $field->getNameByLocale(), 'type' => 'select', 'name' => 'name_id_' . $field->id, 'options' => $options, 'dynamic' => false];
} else {
$levels[] = ['id' => $id++, 'label' => $field->getNameByLocale(), 'type' => 'input', 'name' => 'name_text_' . $field->id];
}
}
$categories = Fields::find()->where(['lib_type' => 1, 'field_type' => 3])->andWhere(['>', 'level', 0])->all();
foreach ($categories as $field) {
//type: 1-dropdown, 2-text
if($field->type == 1) {
$options = [];
foreach ($field->fieldsValues as $option) {
$options[] = ['id' => $option->id, 'name' => $lg == 'en' ? $option->name_en : $option->name];
}
$levels[] = ['id' => $id++, 'label' => $field->getNameByLocale(), 'type' => 'select', 'name' => 'name_id_' . $field->id, 'options' => $options, 'dynamic' => true];
} else {
$levels[] = ['id' => $id++, 'label' => $field->getNameByLocale(), 'type' => 'input', 'name' => 'name_text_' . $field->id];
}
}
$tags = \app\models\register\Tags::find()->all();
$tagsParser = [];
foreach ($tags as $tag) {
$text = $lg == 'en' ? ($tag->text_en ?? $tag->text) : $tag->text;
$tagsParser[] = ['id' => $tag->id, 'name' => $text];
}
JR::message(JR::done, ['levels' => $levels, 'tags' => $tagsParser]);
@@ -0,0 +1,48 @@
<?php
$data = [];
$favorite = false;
if (!empty($_GET['id'])) {
$user = \app\services\Auth::getUserByToken();
if($user) {
$favoriteExists = \app\models\UserFavorites::find()->where(['user_id' => $user->id, 'table' => 'collections', 'fid' => $_GET['id']])->exists();
if($favoriteExists)
$favorite = true;
}
$lg = \Yii::$app->language;
$condition = [];
$condition = ['and'];
$condition[] = ['=', 'active', 1];
$condition[] = ['=', 'published', 1];
$condition[] = ['=', 'id', $_GET['id']];
$collections = \app\models\register\Collections::find()->where($condition);
$collection = $collections->one();
if ($collection) {
$model = new \stdClass();
$model->title = $lg == 'en' ? $collection->name_en ?? $collection->name : $collection->name;
$model->type = 'collections';
$model->text = strip_tags($collection->textDescription());
$model->img = $collection->getImg(\Yii::$app->params['portal'] . '/_public/images/empty-169.png');
$model->id = $collection->id;
$model->isFavorite = $favorite;
$model->items = [];
foreach ($collection->collectionsObjects as $collectionsObject) {
$object = $collectionsObject->object;
$item = new stdClass();
$item->id = $object->id;
$item->title = $object->getTitle();
$item->image = $object->getImg();
$model->items[] = $item;
}
$data[] = $model;
}
}
header('Content-type: application/json');
echo json_encode(['data' => $data]);
exit;
@@ -0,0 +1,163 @@
<?php
use app\models\register\Collections;
use app\models\register\CollectionsObjects;
use app\models\register\Fields;
use app\models\register\ObjectTags;
use app\models\RegisterObjects;
$lg = Yii::$app->language;
$per_page = 10;
$page = $_GET['page'] ?? 1;
/**
* @var \yii\web\View $this
*/
if (!empty($_GET['advance_filter']) || !empty($_GET['tags'])) {
$objects = RegisterObjects::find();
$objects = $objects->select('register_objects.ref_num')->where(['lib_type' => 1]);
$conditionOr = ['or'];
//[ FILTER BY NAME ]
if (!empty($_GET['object_name'])) {
$conditionOr[] = ['LIKE', 'name', $_GET['object_name']];
$conditionOr[] = ['LIKE', 'ts_en_name', $_GET['object_name']];
}
//[ FILTER BY CREATOR ]
if (!empty($_GET['created_by'])) {
$conditionOr[] = ['=', 'created_by', $_GET['created_by']];
}
$conditionAnd = ['and'];
//[ FILTER BY YEAR FROM ]
if (!empty($_GET['year_from'])) {
$conditionAnd[] = ['>=', 'created_year', $_GET['year_from']];
}
//[ FILTER BY YEAR TO ]
if (!empty($_GET['year_to'])) {
$conditionAnd[] = ['<=', 'created_year', $_GET['year_to']];
}
//region [FILTER BY OBJECT FIELDS]
$fields = Fields::find()->where(['lib_type' => 1, 'active' => 1, 'deleted' => 0])->all();
$objectFieldIdArray = [];
$objectFieldValueTextArray = [];
foreach ($fields as $field) {
if (!empty($_GET['name_id_' . $field->id]))
$objectFieldIdArray[] = $_GET['name_id_' . $field->id];
if (!empty($_GET['name_text_' . $field->id]))
$objectFieldValueTextArray[] = $_GET['name_text_' . $field->id];
}
if (sizeof($objectFieldIdArray) > 0 || sizeof($objectFieldValueTextArray) > 0) {
$objects = $objects->joinWith('registerObjectFields');
}
if(sizeof($objectFieldIdArray) > 0) {
$conditionOr[] = ['IN', 'value_id', $objectFieldIdArray];
}
if(sizeof($objectFieldValueTextArray) > 0) {
foreach ($objectFieldValueTextArray as $value) {
$conditionOr[] = ['=', 'value_text', $value];
}
}
$objectIds = [];
if($conditionOr != ['or'] || $conditionAnd != ['and']) {
$objects = $objects->andWhere($conditionOr ?? [])->andWhere($conditionAnd ?? [])->all();
foreach ($objects as $object) {
$objectIds[] = $object->ref_num;
}
}
if(!empty($_GET['tags'])) {
$tags = explode('_', $_GET['tags']);
$objectTags = ObjectTags::find()->where(['IN', 'tag_id', $tags])->andWhere(['active' => 1, 'deleted' => 0])->all();
foreach ($objectTags as $objectTag) {
if(!in_array($objectTag->object_id, $objectIds)) {
$objectIds[] = $objectTag->object_id;
}
}
}
$collectionObjectConditionAnd = ['and'];
$collectionObjectConditionAnd[] = ['IN', 'object_id', $objectIds];
$collectionObjectConditionAnd[] = ['=', 'deleted', 0];
$collectionObjectConditionAnd[] = ['=', 'active', 1];
$collectionObjectConditionAnd[] = ['=', 'published', 1];
if (!empty($_GET['partner_id']))
$collectionObjectConditionAnd[] = ['=', 'partner_id', $_GET['partner_id']];
$collectionObjectConditionOr = ['or'];
$collectionObjectConditionOr[] = ['IS', 'is_payable', NULL];
$collectionObjectConditionOr[] = ['=', 'is_payable', 0];
$collectionObjects = CollectionsObjects::find()->joinWith('collection')
->where($collectionObjectConditionOr)
->andWhere($collectionObjectConditionAnd)
->groupBy('collection_id');
$count = $collectionObjects->count();
if ($count <= $per_page) $page = 1;
$collectionObjects->offset($per_page * $page - $per_page)->limit($per_page);
if (!empty($_GET['order_title'])) {
$collectionObjects = $collectionObjects->orderBy([$_GET['order_title'] => SORT_ASC]);
} else {
$collectionObjects = $collectionObjects->orderBy(['id' => SORT_DESC]);
}
//region DISPLAY DATA
$count = $collectionObjects->count();
$data = [];
/** @var CollectionsObjects $collectionObject */
foreach ($collectionObjects->all() as $collectionObject) {
$model = new \stdClass();
$collection = $collectionObject->collection;
$model->title = $lg == 'en' ? ($collection->name_en ?? $collection->name) : $collection->name;
$model->type = 'collection';
$model->img = $collection->getImg(\Yii::$app->params['portal'] . '/_public/images/empty-169.png');
$model->id = $collection->id;
$data[] = $model;
}
header('Content-type: application/json');
echo json_encode(['data' => $data, 'lastPage' => ceil($count/$per_page), 'count' => $count]);
//endregion
} else {
$collections = Collections::find()->where(['or', ['=', 'is_payable', 0], ['IS', 'is_payable', null]])
->andWhere(['deleted' => 0, 'active' => 1, 'published' => 1]);
if (!empty($_GET['partner_id'])) {
$collections = $collections->andWhere(['partner_id' => $_GET['partner_id']]);
}
$collections = $collections->offset($per_page * $page - $per_page)->limit($per_page);
$count = $collections->count();
$data = [];
foreach ($collections->all() as $collection) {
$model = new \stdClass();
$model->title = $lg == 'en' ? $collection->name_en ?? $collection->name : $collection->name;
$model->type = 'collection';
$model->img = $collection->getImg(\Yii::$app->params['portal'] . '/_public/images/empty-169.png');
$model->id = $collection->id;
$data[] = $model;
}
header('Content-type: application/json');
echo json_encode(['data' => $data, 'lastPage' => ceil($count/$per_page), 'count' => $count]);
}
@@ -0,0 +1,30 @@
<?php
/* @var $this \yii\web\View */
use app\models\UserExplorerObjects;
use app\services\Auth;
$user = Auth::getUserByToken();
if($user) {
header('Content-type: application/json');
$body = json_decode(Yii::$app->request->getRawBody());
if($body->id)
$explorerObject = \app\models\ExplorerObjects::findOne($body->id);
$userExplorerObject = UserExplorerObjects::find()->where(['user_id' => $user->id, 'explorer_object_id' => $body->id])->one();
if(!$userExplorerObject) {
$userExplorerObject = new UserExplorerObjects();
$userExplorerObject->user_id = $user->id;
$userExplorerObject->explorer_object_id = $body->id;
$userExplorerObject->date_visit = date('Y-m-d H:i:s');
$userExplorerObject->save();
echo json_encode(['visit' => 'success', 'points' => $explorerObject->points]);
} else {
echo json_encode(['visit' => 'visited', 'points' => $explorerObject->points]);
}
exit;
}
echo json_encode(['error' => 'User not authenticated']);
exit;
@@ -0,0 +1,14 @@
<?php
use app\services\GeoService;
$lat = $_GET['lat'] ?? 42.698334;
$lon = $_GET['lon'] ?? 23.319941;
$dist = $_GET['dist'] ?? 50;
/* @var $this \yii\web\View */
$nearest = GeoService::getNearestObjects($lat, $lon, $dist);
header('Content-type: application/json');
echo json_encode(['data' => GeoService::orderList($nearest)]);
exit;
@@ -0,0 +1,85 @@
<?php
$lat = $_GET['lat'] ?? 42.698334;
$lon = $_GET['lon'] ?? 23.319941;
$dist = $_GET['dist'] ?? 50;
?>
<link rel="stylesheet" href="<?= Yii::$app->params['portal'] ?>/_public/plugins/leafletjs/leaflet.css">
<script src="<?= Yii::$app->params['portal'] ?>/_public/plugins/leafletjs/leaflet.js"></script>
<style>
#map {
width: 100%;
height: 100%;
}
body {
padding: 0;
margin: 0;
}
.leaflet-left {
right: 10px;
left: auto;
}
.leaflet-control-attribution.leaflet-control a {
display: none;
}
.leaflet-control-container {
display: none;
}
</style>
<div id="map"></div>
<script>
let lang = '<?= Yii::$app->language ?>'
let host = '<?= Yii::$app->params['portal'] ?>'
let addedPoints = [];
let mapOptions = {
center: [<?=$lat ?>, <?= $lon ?>],
zoom: 13
}
let map = new L.map('map', mapOptions);
let layer = new L.TileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png');
map.addLayer(layer);
let marker = new L.Marker([<?=$lat?>, <?= $lon?>]);
marker.addTo(map);
let icon = L.icon({
iconUrl: '/_public/plugins/leafletjs/images/pin-b.png',
iconSize: [40, 40]
});
let iconBlue = L.icon({
iconUrl: '/_public/plugins/leafletjs/images/point-blue.png',
iconSize: [30, 30]
});
marker.setIcon(icon)
function addPoints() {
const xhr = new XMLHttpRequest()
xhr.open('get', `${host}/${lang}/remote/get-nearest-objects/?lat=<?= $lat ?>&lon=<?= $lon ?>&dist=<?= $dist ?>&explorer=1`)
if(addedPoints.length > 0) {
addedPoints.forEach(pointToDelete => {
map.removeLayer(pointToDelete)
})
}
xhr.responseType = 'json';
xhr.onload = function () {
if (xhr.response) {
const points = xhr.response;
points.forEach(p => {
if (p.latitude !== '<?= $lat?>' && p.longitude !== '<?= $lon?>') {
let point = new L.Marker([p.latitude, p.longitude]);
point.setIcon(iconBlue)
point.addTo(map);
addedPoints.push(point)
point.addEventListener('click', () => {
window.parent.postMessage(JSON.stringify(p), '*');
})
}
})
}
}
xhr.send();
}
setTimeout(function () {
addPoints()
}, 50)
</script>
@@ -0,0 +1,31 @@
<?php
use app\services\JR;
$lg = Yii::$app->language;
$translateModule = [
'object_name' => [
'bg' => 'Име на обект',
'en' => 'Object name'
],
'category' => [
'bg' => 'Категория',
'en' => 'Category'
],
];
$tags = \app\models\ExpositionsTags::find()->all();
$tagsParser = [];
foreach ($tags as $tag) {
$text = $lg == 'en' ? ($tag->name_en ?? $tag->name) : $tag->name;
$tagsParser[] = ['id' => $tag->id, 'name' => $text];
}
$id = 0;
$categories = \app\models\ExpositionsCategories::find()->all();
$options = [];
foreach ($categories as $category) {
$options[] = ['id' => $category->id, 'name' => $category->title()];
}
$levels[] = ['id' => $id++, 'label' => $translateModule['category'][$lg], 'type' => 'select', 'name' => 'category', 'options' => $options, 'dynamic' => false];
JR::message(JR::done, ['levels' => $levels, 'tags' => $tagsParser]);
@@ -0,0 +1,56 @@
<?php
use app\models\Articles;
use app\models\Expositions;
if(empty($_GET['id']))
exit;
$lg = Yii::$app->language;
$favorite = false;
$user = \app\services\Auth::getUserByToken();
if($user) {
$favoriteExists = \app\models\UserFavorites::find()->where(['user_id' => $user->id, 'table' => 'expositions', 'fid' => $_GET['id']])->exists();
if($favoriteExists)
$favorite = true;
}
/**
* @var \yii\web\View $this
*/
?>
<?php
$condition = [];
$condition['is_active'] = 1;
$condition['id'] = $_GET['id'];
$exposition = Expositions::find()->where($condition)->one();
$data = [];
$model = new \stdClass();
$model->title = $exposition->title();
$model->type = 'expositions';
$model->text = $exposition->textDescription();
$model->img = $exposition->getImg();
$model->images = $exposition->imagesObjectArray();
$model->id = $exposition->id;
$model->isFavorite = $favorite;
$model->items = [];
foreach ($exposition->objectList as $collectionsObject) {
$object = $collectionsObject->object;
$item = new stdClass();
$item->id = $object->id;
$item->title = $object->getTitle();
$item->image = $object->getImg(\Yii::$app->params['portal']. '/_public/images/empty-169.png');
$model->items[] = $item;
}
$data[] = $model;
header('Content-type: application/json');
echo json_encode(['data' => $data]);
exit;
?>
@@ -0,0 +1,47 @@
<?php
use app\models\Articles;
use app\models\Expositions;
$lg = Yii::$app->language;
$per_page = 10;
$page = $_GET['page'] ?? 1
/**
* @var \yii\web\View $this
*/
?>
<?php
$condition = [];
$condition['is_active'] = 1;
$expositions = Expositions::find()->where($condition);
$expositions = $expositions->offset($per_page * $page - $per_page)->limit($per_page);
if (!empty($_GET['category']))
$expositions = $expositions->andWhere(['category_id' => $_GET['category']]);
if (!empty($_GET['tags'])) {
$tags = explode('_', $_GET['tags']);
if (sizeof($tags) > 0)
$expositions->joinWith('expositionTags')->andWhere(['IN', 'exposition_tag_id', $tags]);
}
$count = $expositions->count();
$expositions->orderBy(['publish_date' => SORT_DESC]);
$data = [];
foreach ($expositions->all() as $exposition) {
$model = new \stdClass();
$model->title = $exposition->title();
$model->type = 'exposition';
$model->img = $exposition->getImg();
$model->id = $exposition->id;
$data[] = $model;
}
header('Content-type: application/json');
echo json_encode(['data' => $data, 'lastPage' => ceil($count/$per_page), 'count' => $count]);
exit;
?>
@@ -0,0 +1,108 @@
<?php
use app\models\Expositions;
use app\models\register\Collections;
use app\models\RegisterObjects;
use app\models\UserFavorites;
use app\models\Articles;
header('Content-type: application/json');
$user = \app\services\Auth::getUserByToken();
if($user) {
$lg = Yii::$app->language;
$per_page = 10;
if (!empty($_GET['type'])) {
$page = $_GET['page'] ?? 1;
$fav = UserFavorites::find()->where(['user_id' => $user->id, 'table' => $_GET['type']])->all();
$ids = [];
foreach ($fav as $f)
$ids[] = $f->fid;
switch ($_GET['type']):
case 'collections':
$data = [];
$models = Collections::find()->where(['IN', 'id', $ids]);
$count = $models->count();
$models = $models->offset($per_page * $page - $per_page)->limit($per_page);
foreach ($models->all() as $dbModel) {
$model = new \stdClass();
$model->title = $lg == 'en' ? $dbModel->name_en ?? $dbModel->name : $dbModel->name;
$model->type = 'collections';
$model->path = '/tabs/search/collection';
$model->img = $dbModel->getImg(\Yii::$app->params['portal'] . '/_public/images/empty-169.png');
$model->id = $dbModel->id;
$data[] = $model;
}
echo json_encode(['data' => $data, 'lastPage' => ceil($count / $per_page), 'count' => $count]);
exit;
case 'expositions':
$data = [];
$models = Expositions::find()->where(['IN', 'id', $ids]);
$count = $models->count();
$models = $models->offset($per_page * $page - $per_page)->limit($per_page);
foreach ($models->all() as $dbModel) {
$model = new \stdClass();
$model->title = $lg == 'en' ? $dbModel->ts_en_name ?? $dbModel->name : $dbModel->name;
$model->type = 'expositions';
$model->path = '/tabs/search/exposition';
$model->img = $dbModel->getImg();
$model->id = $dbModel->id;
$data[] = $model;
}
echo json_encode(['data' => $data, 'lastPage' => ceil($count / $per_page), 'count' => $count]);
exit;
case 'register_objects':
$data = [];
$models = RegisterObjects::find()->where(['lib_type' => 1])->andWhere(['IN', 'id', $ids]);
$count = $models->count();
$models = $models->offset($per_page * $page - $per_page)->limit($per_page);
foreach ($models->all() as $dbModel) {
$model = new \stdClass();
$model->title = $lg == 'en' ? $dbModel->ts_en_name ?? $dbModel->name : $dbModel->name;
$model->type = 'register_objects';
$model->path = '/tabs/search/object';
$model->img = $dbModel->getImg(\Yii::$app->params['portal'] . '/_public/images/empty-169.png');
$model->id = $dbModel->id;
$data[] = $model;
}
echo json_encode(['data' => $data, 'lastPage' => ceil($count / $per_page), 'count' => $count]);
exit;
case 'articles':
$data = [];
$models = Articles::find()->andWhere(['IN', 'id', $ids]);
$count = $models->count();
$models = $models->offset($per_page * $page - $per_page)->limit($per_page);
foreach ($models->all() as $dbModel) {
$model = new \stdClass();
$model->title = $lg == 'en' ? $dbModel->title_en ?? $dbModel->title : $dbModel->title;
$model->type = $dbModel->art_table;
$model->path = '/tabs/articles/' . $dbModel->art_table;
$model->img = ($dbModel->getArticle()->image('16:11') ? $dbModel->getArticle()->image('16:11') : \Yii::$app->params['portal'] . '/_public/images/empty-169.png');
$model->id = $dbModel->id;
$data[] = $model;
}
echo json_encode(['data' => $data, 'lastPage' => ceil($count / $per_page), 'count' => $count]);
exit;
endswitch;
}
}
echo json_encode(['error' => 1, 'message' => 'Permission denied']);
exit;
/* @var $this \yii\web\View */
@@ -0,0 +1,32 @@
<?php
header('Content-type: application/json');
use app\models\UserPublic;
use app\services\JWT;
$post = \Yii::$app->request->getRawBody();
$postDecode = json_decode($post);
if(!empty($postDecode->uid)) {
function loop($postDecode)
{
if (!$postDecode->uid) return;
$server_id = md5(time() . uniqid());
$uid = $postDecode->uid;
$token = JWT::encode(['server_id' => $server_id, 'uid' => $uid], JWT::SECRET_KEY);
$user = UserPublic::find()->where(['device_id' => $token])->exists();
if (!$user) {
echo json_encode(['device_id' => $token]);
exit;
} else {
loop($postDecode);
}
}
loop($postDecode);
}
exit;
@@ -0,0 +1,34 @@
<?php
/** @var \app\models\UserPublic $user */
$user = \app\services\Auth::getUserByToken($_GET['token']);
if ($user) {
$partner_ids = [];
foreach ($user->qrValidators as $qrValidator) {
$partner_ids[] = $qrValidator->partner_id;
}
if (sizeof($partner_ids) > 0) {
//$articles->innerJoinWith('events');
$events = \app\models\Events::find();
$condition = ['and'];
$condition[] = ['=', 'type', 'booking'];
$condition[] = ['IN', 'partner_id', $partner_ids];
$events->where($condition);
$data = [];
foreach ($events->all() as $event) {
$data[] = [
'id' => $event->id,
'name' => $event->title(),
'date' => date('d.m.Y', strtotime($event->event_dates))];
}
echo json_encode(['data' => $data]);
exit;
}
}
/* @var $this \yii\web\View */
@@ -0,0 +1,13 @@
<?php
use app\services\Auth;
use app\services\JR;
/** @var \app\models\UserPublic $user */
//$user = Auth::getUserByToken();
$user = \app\models\UserPublic::findOne(34);
if(!$user)
JR::message(JR::not_authenticated);
JR::message(JR::done, ['profile' => $user->profileData()]);
@@ -0,0 +1,49 @@
<?php
use app\models\Expositions;
use app\models\Positions;
use app\models\register\Collections;
use app\services\JR;
$lg = Yii::$app->language;
$sliderPositions = Positions::findOne(70);
$whatsNewPositions = Positions::find()->where(['id' => 1])->one();
$collections = Collections::find()->where(['is_selected' => 1, 'deleted' => 0])->all();
$expositions = Expositions::find()->where(['is_active' => 1, 'is_selected' => 1])->all();
$pos = function ($incomingPosition) use ($lg) {
$items = [];
/** @var Positions $position */
foreach ($incomingPosition->positions as $position) {
if ($position->articleModel) {
$items[] = (object)[
'id' => $position->articleModel->id,
'img' => $position->articleModel->article->image('16:11'),
'title' => $position->articleModel->{'title' . ($lg == 'en' ? '_en' : '')},
'type' => $position->articleModel->art_table
];
}
}
return $items;
};
$coll = function ($inc) use ($lg) {
$items = [];
/** @var Collections | Expositions $item */
foreach ($inc as $item) {
$items[] = (object)[
'id' => $item->id,
'img' => $item->getImg(),
'title' => $item->title()
];
}
return $items;
};
JR::message(JR::done, ['obj' => [
'slides' => $pos($sliderPositions),
'whats_new' => $pos($whatsNewPositions),
'collections' => $coll($collections),
'expositions' => $coll($expositions)
]]);
@@ -0,0 +1,61 @@
<?php
use app\models\TourObjects;
$lg = Yii::$app->language;
$id = $_GET['id'];
$model = TourObjects::findOne($id);
/* @var $this \yii\web\View */
if (!$model) exit;
$htmlText = $lg == 'en' ? $model->text_en : $model->text;
$text = preg_replace('#<a.*?>([^>]*)</a>#i', '$1', $htmlText);
/** @var \app\models\register\Partner $partner */
$partner = null;
if($model->partner_id)
$partner = \app\models\register\Partner::findOne($model->partner_id);
?>
<style>
.info-map-box .title {
font-weight: bold;
font-size: 16px;
color: var(--color-main);
padding-bottom: 5px;
}
.info-map-box .body {
height: 200px;
overflow-y: scroll;
padding-right: 5px;
text-align: left;
}
.info-map-box .body::-webkit-scrollbar {
width: 3px;
}
.info-map-box .body::-webkit-scrollbar-track {
box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
}
.info-map-box .body::-webkit-scrollbar-thumb {
background-color: darkgrey;
outline: 1px solid slategrey;
}
.info-map-box .body p {
text-align: left !important;
}
</style>
<div class="info-map-box">
<div class="title"><?= $lg == 'en' ? $model->name_en : $model->name ?></div>
<div class="body">
<?= $text ?>
</div>
<?php if($partner): ?>
<div style="margin-top: 10px">
<a href="<?= $partner->getUrl() ?>"><?= $lg == 'en' ? "To the website" : 'Към уебсайта'?></a>
</div>
<?php endif; ?>
</div>
@@ -0,0 +1,72 @@
<?php
use app\services\IdServer;
use app\services\JWT;
$lg = Yii::$app->language;
$object = \app\models\RegisterObjects::findOne($_GET['id']);
$data = [];
if ($object) {
$favorite = false;
$user = \app\services\Auth::getUserByToken();
if ($user) {
$favoriteExists = \app\models\UserFavorites::find()->where(['user_id' => $user->id, 'table' => 'register_objects', 'fid' => $_GET['id']])->exists();
if ($favoriteExists)
$favorite = true;
}
$item = new stdClass();
$item->id = $object->id;
$item->title = $object->getTitle();
$item->text = $object->getLongText();
$item->image = $object->getMainImgFile(\Yii::$app->params['portal'] . '/_public/images/empty-169.png');
$item->type = 'register_objects';
$item->isFavorite = $favorite;
$item->images = [];
foreach ($object->images(\Yii::$app->params['portal'] . '/_public/images/empty-169.png') as $index => $image) {
$item->images[] = [
'id' => ($index + 1),
'img' => $image
];
}
$item->docs = [];
$item->videos = [];
$item->models = [];
$docs = $object->getPdfDocuments();
$videos = $object->getVideoList();
$models3d = $object->get3DModelList();
if ($videos && sizeof($videos)) {
foreach ($videos as $v) {
$id = JWT::encode(['id' => $v->id], JWT::SECRET_KEY);
$item->videos[] = [
'id' => $v->id,
'thumb' => IdServer::getVideoThumb($v->id),
'url' => Yii::$app->params['media_server'] . '/media/play-mobile/' . $id . '/'
];
}
}
if ($models3d && sizeof($models3d) > 0) {
foreach ($models3d as $v) {
$id = JWT::encode(['id' => $v->id], JWT::SECRET_KEY);
$item->models[] = [
'id' => $v->id,
//'thumb' => IdServer::getVideoThumb($v->id),
'title' => $v->video_title ?? ($lg == 'en' ? '3D model' : '3D модел'),
'url' => Yii::$app->params['media_server'] . '/api/render-model/' . $id . '/?lg=' . $lg
];
}
}
foreach ($docs as $doc) {
$id = JWT::encode(['id' => $doc->id], JWT::SECRET_KEY);
$item->docs[] = [
'img' => $item->image,
'url' => Yii::$app->params['portal'] . '/file-system/file-preview-delivery/' . $id . '/'
];
}
$data[] = $item;
}
header('Content-type: application/json');
echo json_encode(['data' => $data]);
exit;
@@ -0,0 +1,67 @@
<?php
use app\models\Order;
use app\services\JR;
if (empty($_GET['id'])) exit;
$id = $_GET['id'];
/* @var $this \yii\web\View */
$user = \app\services\Auth::getUserByToken();
//$user = \app\models\UserPublic::findOne(34);
$lg = Yii::$app->language;
$data = [];
if ($user) {
$per_page = 10;
$page = $_GET['page'] ?? 1;
$orders = Order::find()->where(['user_id' => $user->id, 'id' => $id])->offset($per_page * $page - $per_page)->orderBy(['id' => SORT_DESC]);
$count = $orders->count();
foreach ($orders->all() as $order) {
$paying = $order->payment;
//$booking = $order->booking;
//$event = $booking && $booking->event ? $booking->event->title() : '';
$booking = [];
foreach ($order->booking as $ticket) {
$booking[] = $ticket->responseData();
}
$default = $booking[0] ?? null;
$event = null;
if (!empty($booking[0])) {
$event = [
'name' => $booking[0]['event'],
'img' => $booking[0]['event_img'],
];
}
$status = [
'PAID' => [
'bg' => 'Платено',
'en' => 'Paid'
],
'PENDING' => [
'bg' => 'Изчаква се плащане',
'en' => 'Payment pending'
]
];
$item = [
'id' => $order->id,
'price' => $order->total_price,
'date' => $order->order_date,
'status' => $paying->status == 'PAID' ? ($status['PAID'][$lg]) : $status['PENDING'][$lg],
'booking' => $booking,
];
if ($event) {
$item['event'] = $event;
}
$data[] = $item;
}
JR::message(JR::done, ['data' => $data, 'lastPage' => ceil($count / $per_page), 'count' => $count]);
}
@@ -0,0 +1,115 @@
<?php
/* @var $this \yii\web\View */
use app\models\Order;
use app\services\JR;
//$user = \app\services\Auth::getUserByToken();
$user = \app\models\UserPublic::findOne(34);
$lg = Yii::$app->language;
$data = [];
if ($user) {
$per_page = 10;
$page = $_GET['page'] ?? 1;
$event_ids = [];
if ($user) {
$events = \app\models\Events::find();
$partner_ids = [];
foreach ($user->qrValidators as $qrValidator) {
$partner_ids[] = $qrValidator->partner_id;
}
if (sizeof($partner_ids) > 0) {
//$articles->innerJoinWith('events');
$condition = ['and'];
$condition[] = ['=', 'type', 'booking'];
$condition[] = ['IN', 'partner_id', $partner_ids];
$events->where($condition);
foreach ($events->all() as $event) {
$event_ids[] = $event->id;
}
}
if(!empty($_GET['event_id'])) {
$event_ids = [$_GET['event_id']];
}
if(!empty($_GET['article_id'])) {
$article = \app\models\Articles::findOne($_GET['article_id']);
if($article) {
$event_id = $article->article->id();
if($event_id) {
$event_ids = [$event_id];
}
}
}
}
$orders = Order::find()->joinWith('booking')->where(['IN', 'event_id', $event_ids]);
if(!empty($_GET['order_number'])) {
$orders->andWhere(['id' => $_GET['order_number']]);
}
$orders->offset($per_page * $page - $per_page)->orderBy(['id' => SORT_DESC]);
$count = $orders->count();
foreach ($orders->all() as $order) {
$paying = $order->payment;
//$booking = $order->booking;
//$event = $booking && $booking->event ? $booking->event->title() : '';
$booking = [];
foreach ($order->booking as $ticket) {
$count = $ticket->tickets_count;
$booking[] = [
'id' => $ticket->id,
'ticket_type' => $ticket->{'name_' . $lg},
'event' => $ticket->event->title(),
'event_img' => $ticket->event->image('16:11'),
'single_price' => $ticket->single_price,
'datetime' => $ticket->formatedHtmlDate(),
'hashed_id' => $ticket->getHashedId(),
'tickets_count' => $count
];
}
$default = $booking[0] ?? null;
$event = null;
if (!empty($booking[0])) {
$event = [
'name' => $booking[0]['event'],
'img' => $booking[0]['event_img'],
];
}
$status = [
'PAID' => [
'bg' => 'Платено',
'en' => 'Paid'
],
'PENDING' => [
'bg' => 'Изчаква се плащане',
'en' => 'Payment pending'
]
];
$item = [
'id' => $order->id,
'price' => $order->total_price,
'date' => date('d.m.Y H:i', strtotime($order->order_date)),
'status' => $paying->status == 'PAID' ? ($status['PAID'][$lg]) : $status['PENDING'][$lg],
'booking' => $booking,
];
if ($event) {
$item['event'] = $event;
}
$data[] = $item;
}
JR::message(JR::done, ['data' => $data, 'lastPage' => ceil($count / $per_page), 'count' => $count]);
}
@@ -0,0 +1,70 @@
<?php
use app\models\Order;
use app\services\JR;
$user = \app\services\Auth::getUserByToken();
//$user = \app\models\UserPublic::findOne(34);
$lg = Yii::$app->language;
$data = [];
if ($user) {
$per_page = 10;
$page = $_GET['page'] ?? 1;
$orders = Order::find()->where(['user_id' => $user->id])->offset($per_page * $page - $per_page)->orderBy(['id' => SORT_DESC]);
$count = $orders->count();
foreach ($orders->all() as $order) {
$paying = $order->payment;
//$booking = $order->booking;
//$event = $booking && $booking->event ? $booking->event->title() : '';
$booking = [];
foreach ($order->booking as $ticket) {
$count = $ticket->tickets_count;
$booking[] = [
'id' => $ticket->id,
'ticket_type' => $ticket->{'name_' . $lg},
'event' => $ticket->event->title(),
'event_img' => $ticket->event->image('16:11'),
'single_price' => $ticket->single_price,
'datetime' => $ticket->formatedHtmlDate(),
'hashed_id' => $ticket->getHashedId(),
'tickets_count' => $count
];
}
$default = $booking[0] ?? null;
$event = null;
if (!empty($booking[0])) {
$event = [
'name' => $booking[0]['event'],
'img' => $booking[0]['event_img'],
];
}
$status = [
'PAID' => [
'bg' => 'Платено',
'en' => 'Paid'
],
'PENDING' => [
'bg' => 'Изчаква се плащане',
'en' => 'Payment pending'
]
];
$item = [
'id' => $order->id,
'price' => $order->total_price,
'date' => $order->order_date,
'status' => $paying->status == 'PAID' ? ($status['PAID'][$lg]) : $status['PENDING'][$lg],
'booking' => $booking,
];
if ($event) {
$item['event'] = $event;
}
$data[] = $item;
}
JR::message(JR::done, ['data' => $data, 'lastPage' => ceil($count / $per_page), 'count' => $count]);
}
@@ -0,0 +1,30 @@
<?php
use app\models\OrderBooking;
use app\services\JR;
$g = $_GET;
$event_id = $_GET['event_id'] ?? null;
$ticket_token = $_GET['ticket_token'] ?? null;
$user = \app\services\Auth::getUserByToken();
if($event_id && $user) {
$booking = OrderBooking::getBookingByHashId($ticket_token);
if($event_id != $booking->event_id) {
JR::message(JR::error, ['wrong_event' => 1]);
}
if(empty($_GET['validated_count'])) {
if ($booking->validated_count < $booking->tickets_count) {
JR::message(JR::done, $booking->responseData());
} else {
JR::message(JR::done, $booking->responseData());
}
} else {
$count = $booking->validated_count ?? 0;
$booking->validated_count = $count + $_GET['validated_count'];
$booking->last_validation_time = date('Y-m-d H:i:s');
$booking->save();
JR::message(JR::done, ['ready' => 1]);
}
} else {
JR::message(JR::not_authenticated);
}
@@ -0,0 +1,19 @@
<?php
header('Content-type: application/json');
$user = \app\services\Auth::getUserByToken();
if($user) {
$jsonData = Yii::$app->request->getRawBody();
$data = json_decode($jsonData);
if($data->status) {
$user->club_card = $data->status == 'active' ? 1 : null;
$user->save();
}
echo json_encode(['success'=> 1, 'profile' => $user->profileData()]);
exit;
}
echo json_encode(['error' => 1, 'message' => 'Permission denied']);
exit;
@@ -0,0 +1,28 @@
<?php
header('Content-type: application/json');
$user = \app\services\Auth::getUserByToken();
if($user) {
$jsonData = Yii::$app->request->getRawBody();
$data = json_decode($jsonData);
if($data->isFavorite == true) {
$favorite = new \app\models\UserFavorites();
$favorite->user_id = $user->id;
$favorite->fid = $data->id;
$favorite->table = $data->type;
$favorite->date_added = date('Y-m-d H:i:s');
$favorite->save();
} else {
$favorite = \app\models\UserFavorites::find()->where(['user_id' => $user->id, 'fid' => $data->id, 'table' => $data->type])->one();
if($favorite) {
$favorite->delete();
}
}
echo json_encode(['success'=> 1]);
exit;
}
echo json_encode(['error' => 1, 'message' => 'Permission denied']);
exit;
@@ -0,0 +1,8 @@
<?php
/* @var $this \yii\web\View */
echo $_GET['ticket'] ?? 'ticket empty'
?>
@@ -0,0 +1,41 @@
<?php
use app\models\UserExplorerObjects;
use app\services\JR;
use app\services\Auth;
$lang = Yii::$app->language;
$user = \app\services\Auth::getUserByToken();
$per_page = 20;
$page = $_GET['page'] ?? 1;
/* @var $this \yii\web\View */
if (!$user)
JR::message(JR::not_authenticated);
$userExplorerObjects = UserExplorerObjects::find()->where(['user_id' => $user->id]);
$count = $userExplorerObjects->count();
$userExplorerObjects = $userExplorerObjects->limit($per_page)->offset($per_page*$page - $per_page)->orderBy(['date_visit' => SORT_DESC])->all();
$data = [];
foreach ($userExplorerObjects as $ueo) {
if($ueo->explorerObject && $ueo->explorerObject->tourObject) {
$tourObject = $ueo->explorerObject->tourObject;
$data[] = (object)['name' => $lang == 'en' ? $tourObject->name_en : $tourObject->name,
'points' => $ueo->explorerObject->points,
'img' => $ueo->explorerObject->getSrcOfSingleImage('explorer_object_image', '1:1'),
'date' => $ueo->date_visit ? date('d.m.Y', strtotime($ueo->date_visit)) : ''
];
}
}
JR::message(JR::done, ['data' => $data, 'lastPage' => ceil($count/$per_page), 'count' => $count]);