hme api ready

This commit is contained in:
merdan 2025-04-29 11:35:17 +05:00
parent 6d4eae516c
commit e883865284
8 changed files with 414 additions and 95 deletions

View File

@ -73,4 +73,10 @@ class AdvertisementsController extends BaseApiController
} }
} }
public function home(){
//top
//mid
//right
//footer
}
} }

View File

@ -3,7 +3,7 @@
use Cms\Classes\Controller; use Cms\Classes\Controller;
class BaseApiController extends Controller{ class BaseApiController extends Controller{
private function apiArrayResponseBuilder($statusCode = null, $message = null, $data = []) protected function apiArrayResponseBuilder($statusCode = null, $message = null, $data = [])
{ {
$arr = [ $arr = [
'status_code' => (isset($statusCode)) ? $statusCode : 500, 'status_code' => (isset($statusCode)) ? $statusCode : 500,

View File

@ -0,0 +1,40 @@
<?php namespace Tps\Tps\Controllers\API;
use Cms\Classes\Theme;
use RainLab\Pages\Classes\Menu;
use Cms\Classes\Page;
class CmsController extends BaseApiController{
protected $menuItems;
protected $menuName;
public function index(){
//slider
//world
//most read
//marque
}
public function headerInfo(){
if ($this->menuItems !== null) {
return $this->menuItems;
}
$theme = Theme::getActiveTheme();
$data['customData'] = $theme->getCustomData();
$menu = Menu::load($theme, 'new-top-menui');
$data['menuItems'] = $menu['settings']['items'];
if ($menu) {
return $this->apiArrayResponseBuilder(200, 'success', $data);
}
return $this->apiArrayResponseBuilder(404, 'not found');
}
}

View File

@ -1,6 +1,7 @@
<?php namespace Tps\Tps\Controllers\API; <?php namespace Tps\Tps\Controllers\API;
use Config; use Config;
use DB;
use Tps\Tps\Models\Media; use Tps\Tps\Models\Media;
class MediaController extends BaseApiController class MediaController extends BaseApiController
@ -32,4 +33,36 @@ class MediaController extends BaseApiController
} }
public function home(){
$path = Config::get('app.cdn').Config::get('cms.storage.media.path');
$data = DB::table(DB::raw("(
SELECT id, name, media_file, poster_file, published_at, type, subtitle,
ROW_NUMBER() OVER (PARTITION BY type ORDER BY published_at) as row_num
FROM tps_tps_media
WHERE published_at IS NOT NULL
) as ranked_posts"))
->where('row_num', '<=', 4)
->orderBy('published_at','desc')
->get();
if($data){
$data = Media::hydrate($data->toArray());
$data->transform(function ($value) use ($path) {
$value->poster_file = $path.$value->poster_file;
$mediaArray = [];
for($i=0; $i < count($value->media_file); $i++){
$mediaArray[$i] = $value->media_file[$i];
$mediaArray[$i]['media']=$path.$value->media_file[$i]['media'];
}
$value->media_file = $mediaArray;
return $value;
});
return $this->apiArrayResponseBuilder(200, 'success', $data->groupBy('type'));
}
}
} }

View File

@ -0,0 +1,207 @@
<?php namespace Tps\Tps\Controllers\API;
use DB;
use Config;
use RainLab\Blog\Models\Post;
use Carbon\Carbon;
use Illuminate\Support\Facades\App;
class PostController extends BaseApiController
{
//postes list
public function index(){
$path = Config::get('app.cdn').Config::get('cms.storage.media.path');
$filter = [
'page' => input('page'),
'sort' => input('sort') ??'published_at desc',
'perPage' => input('count'),
'search' => trim(input('search')),
'category' => input('category'),
'date' => input('date'),
'typePost' => input('typePost'),
'postGroup' => input('group'),
'published' => true,
'select' => ['id','title','slug', 'featured', 'published_at', 'more_photo','afisha_phone', 'afisha_address', 'afisha_phone_new', DB::raw("IF(featured_image<>'',concat('$path',featured_image),featured_image) as main_image")]
];
if(request()->has('featured')){
$filter['featured'] = true;
}
$data = Post::with(['categories:id,name'])->listFrontEnd($filter);
if($data){
$data->each(function ($item, $key) {
$item->url = $this->pageUrl('new/newPost',['id'=>$item->id,'slug'=>$item->slug]);
});
}
return $this->apiArrayResponseBuilder(200, 'success', $data);
}
//posts item
public function show($locale,$id){
$path = Config::get('app.cdn').Config::get('cms.storage.media.path');
//$post = $this->Post::find($id,['id','content_html','author','slug', 'afisha_phone', 'afisha_address', 'afisha_phone_new']);
$post = Post::where('id', $id)
->select('id', 'content_html', 'author', 'title','slug','published_at', 'more_photo','afisha_phone', 'afisha_address', 'afisha_phone_new', DB::raw("IF(featured_image<>'',concat('$path',featured_image),featured_image) as main_image"))
->with(['categories:id,name'])
->first();
if(!is_null($post)) {
$post->url = $this->pageUrl('new/newPost',['id'=>$post->id,'slug'=>$post->slug]);
$obj = Db::table('vdomah_blogviews_views')
->where('post_id', $post->getKey());
if ($obj->count() > 0) {
$row = $obj->first();
$views = $row->views + rand(1,10);;
$obj->update(['views' => $views]);
$post['views'] = $row->views;
}
else {
Db::table('vdomah_blogviews_views')->insert([
'post_id' => $post->getKey(),
'views' => rand(1,10)
]);
}
return $this->apiArrayResponseBuilder(200, 'success', [$post]);
}
else {
return $this->apiArrayResponseBuilder(404, 'not found', ['error' => 'Resource id=' . $id . ' could not be found']);
}
}
public function lenta(){
$now = Carbon::now();
$locale = App::getLocale();
$posts = DB::table(DB::raw("(
SELECT id, title, slug, published_at, type_post,
ROW_NUMBER() OVER (PARTITION BY type_post ORDER BY published_at) as row_num
FROM rainlab_blog_posts
WHERE published IS NOT NULL
AND published = 1
AND published_at IS NOT NULL
AND type_post IS NOT NULL
AND type_post <> ''
AND published_at < '{$now}'
AND locale = '{$locale}'
) as ranked_posts"))
->where('row_num', '<=', 7)
->orderBy('published_at','desc')
->get();
if($posts){
$posts = Post::hydrate($posts->toArray());
$posts->each(function ($item, $key) {
$item->url = $this->pageUrl('new/newPost',['id'=>$item->id,'slug'=>$item->slug]);
});
return $this->apiArrayResponseBuilder(200, 'success', $posts->groupBy('type_post'));
}
return $this->apiArrayResponseBuilder(200, 'no records found');
}
public function homeTop(){
$path = Config::get('app.cdn').Config::get('cms.storage.media.path');
$featured = Post::isPublished()
->select('id', 'title', 'slug', 'published_at', DB::raw("IF(featured_image<>'', concat('$path', featured_image), featured_image) as main_image, 'featured' as type"))
->where('featured', true)
->orderByDesc('published_at')
->limit(4);
// Second query
$morque = Post::isPublished()
->select('id', 'title', 'slug', 'published_at', DB::raw("featured_image as main_image, 'marquee' as type"))
->where('on_morque', true)
->where('featured', false)
->orderByDesc('published_at')
->limit(5);
$turkmenposts = Post::isPublished()
->select('id', 'title', 'slug', 'published_at', DB::raw("featured_image as main_image, 'lenta' as type"))
->where('on_morque', false)
->where('featured', false)
->where('type_post','turkmenistan')
->orderByDesc('published_at')
->limit(7);
// Union
$posts = $morque->unionAll($featured)->unionAll($turkmenposts)->get();
if($posts){
$posts = Post::hydrate($posts->toArray());
$posts->each(function ($item, $key) {
$item->url = $this->pageUrl('new/newPost',['id'=>$item->id,'slug'=>$item->slug]);
});
return $this->apiArrayResponseBuilder(200, 'success', $posts->groupBy('type'));
}
return $this->apiArrayResponseBuilder(200, 'no records found');
}
public function homeMid(){
$path = Config::get('app.cdn').Config::get('cms.storage.media.path');
$world = Post::isPublished()
->select('id', 'title', 'slug', 'published_at','type_post', 'excerpt', DB::raw("IF(featured_image<>'', concat('$path', featured_image), featured_image) as main_image, 'world' as type"))
->where('on_morque', false)
->where('featured', false)
->where('type_post','world')
->orderByDesc('published_at')
->with(['categories:name'])
->limit(5);
$popular = Post::isPublished()
->select('id', 'title', 'slug', 'published_at', 'type_post', 'excerpt', DB::raw("IF(featured_image<>'', concat('$path', featured_image), featured_image) as main_image, 'popular' as type"))
->leftJoin('vdomah_blogviews_views as pv', 'pv.post_id', '=', 'rainlab_blog_posts.id')
// ->where('published_at','>=',Carbon::now()->addMonth(-1))
->orderByDesc('views', 'DESC')
->with(['categories:name'])
->limit(5);
$redaktors = Post::isPublished()
->select('id', 'title', 'slug', 'published_at','type_post', 'excerpt', DB::raw("IF(featured_image<>'', concat('$path', featured_image), featured_image) as main_image, 'redaktor' as type"))
->orderByDesc('published_at')
->with(['categories:name'])
->where('on_morque', false)
->where('featured', false)
->whereHas('categories', function($q) {
$q->where('slug', 'ot-redaktora');
})
->limit(5);
$publications = Post::isPublished()
->select('id', 'title', 'slug', 'published_at','type_post', 'excerpt', DB::raw("IF(featured_image<>'', concat('$path', featured_image), featured_image) as main_image, 'redaktor' as type"))
->orderByDesc('published_at')
->where('on_morque', false)
->where('featured', false)
->whereHas('category_groups', function($q) {
$q->where('slug', 'stati');
})
->limit(4);
// Union
$posts = $world->unionAll($popular)->unionAll($redaktors)->get();
if($posts){
$posts = Post::hydrate($posts->toArray());
$posts->each(function ($item, $key) {
$item->url = $this->pageUrl('new/newPost',['id'=>$item->id,'slug'=>$item->slug]);
});
return $this->apiArrayResponseBuilder(200, 'success', $posts->groupBy('type'));
}
return $this->apiArrayResponseBuilder(200, 'no records found');
}
}

View File

@ -1,78 +0,0 @@
<?php namespace Tps\Tps\Controllers\API;
use DB;
use Config;
use RainLab\Blog\Models\Post;
class PostController extends BaseApiController
{
//postes list
public function index(){
$path = Config::get('app.cdn').Config::get('cms.storage.media.path');
$filter = [
'page' => input('page'),
'sort' => input('sort') ??'published_at desc',
'perPage' => input('count'),
'search' => trim(input('search')),
'category' => input('category'),
'date' => input('date'),
'typePost' => input('typePost'),
'postGroup' => input('group'),
'published' => true,
'select' => ['id','title','slug', 'featured', 'published_at', 'more_photo','afisha_phone', 'afisha_address', 'afisha_phone_new', DB::raw("IF(featured_image<>'',concat('$path',featured_image),featured_image) as main_image")]
];
if(request()->has('featured')){
$filter['featured'] = true;
}
$data = Post::with(['categories:id,name'])->listFrontEnd($filter);
if($data){
$data->each(function ($item, $key) {
$item->url = $this->pageUrl('new/newPost',['id'=>$item->id,'slug'=>$item->slug]);
});
}
return $this->apiArrayResponseBuilder(200, 'success', $data);
}
//posts item
public function show($locale,$id){
$path = Config::get('app.cdn').Config::get('cms.storage.media.path');
//$post = $this->Post::find($id,['id','content_html','author','slug', 'afisha_phone', 'afisha_address', 'afisha_phone_new']);
$post = Post::where('id', $id)
->select('id', 'content_html', 'author', 'title','slug','published_at', 'more_photo','afisha_phone', 'afisha_address', 'afisha_phone_new', DB::raw("IF(featured_image<>'',concat('$path',featured_image),featured_image) as main_image"))
->with(['categories:id,name'])
->first();
if(!is_null($post)) {
$post->url = $this->pageUrl('new/newPost',['id'=>$post->id,'slug'=>$post->slug]);
$obj = Db::table('vdomah_blogviews_views')
->where('post_id', $post->getKey());
if ($obj->count() > 0) {
$row = $obj->first();
$views = $row->views + rand(1,10);;
$obj->update(['views' => $views]);
$post['views'] = $row->views;
}
else {
Db::table('vdomah_blogviews_views')->insert([
'post_id' => $post->getKey(),
'views' => rand(1,10)
]);
}
return $this->apiArrayResponseBuilder(200, 'success', [$post]);
}
else {
return $this->apiArrayResponseBuilder(404, 'not found', ['error' => 'Resource id=' . $id . ' could not be found']);
}
}
}

View File

@ -2,24 +2,23 @@
use Tps\Tps\Controllers\TestQuestion; use Tps\Tps\Controllers\TestQuestion;
// Custom Routes
Route::get('{locale}/test/questions/{id}', 'Tps\Tps\Controllers\TestQuestion@getQuestions');
Route::post('fatoni/generate/api', array('as' => 'fatoni.generate.api', 'uses' => 'AhmadFatoni\ApiGenerator\Controllers\ApiGeneratorController@generateApi'));
Route::post('fatoni/update/api/{id}', array('as' => 'fatoni.update.api', 'uses' => 'AhmadFatoni\ApiGenerator\Controllers\ApiGeneratorController@updateApi'));
Route::get('fatoni/delete/api/{id}', array('as' => 'fatoni.delete.api', 'uses' => 'AhmadFatoni\ApiGenerator\Controllers\ApiGeneratorController@deleteApi'));
//postlar bilen categorialar //postlar bilen categorialar
Route::resource('api/categories', 'AhmadFatoni\ApiGenerator\Controllers\API\CategoriesController', ['except' => ['destroy', 'create', 'edit']]); Route::resource('api/categories', 'Tps\Tps\Controllers\API\CategoriesController', ['except' => ['destroy', 'create', 'edit']]);
Route::resource('api/advetisements', 'AhmadFatoni\ApiGenerator\Controllers\API\AdvertisementsController', ['except' => ['destroy', 'create', 'edit']]); Route::resource('api/advetisements', 'Tps\Tps\Controllers\API\AdvertisementsController', ['except' => ['destroy', 'create', 'edit']]);
Route::get('api/group/advertisements', 'AhmadFatoni\ApiGenerator\Controllers\API\AdvertisementsController@getByGroup'); Route::get('api/group/advertisements', 'Tps\Tps\Controllers\API\AdvertisementsController@getByGroup');
Route::resource('{locale}/api/posts', 'AhmadFatoni\ApiGenerator\Controllers\API\postsController', ['except' => ['destroy', 'create', 'edit']]); Route::resource('{locale}/api/posts', 'Tps\Tps\Controllers\API\PostController', ['except' => ['destroy', 'create', 'edit']]);
//header
Route::get('api/v2/categories', 'AhmadFatoni\ApiGenerator\Controllers\API\CategoriesV2Controller@index'); Route::get('api/v2/header','Tps\Tps\Controllers\API\CmsController@headerInfo');
Route::get('api/v2/media', 'AhmadFatoni\ApiGenerator\Controllers\API\MediaController@index'); //lenta
//Route::get('api/v2/afisha', 'AhmadFatoni\ApiGenerator\Controllers\API\AfishaController@index'); Route::get('{locale}/api/v2/lenta','Tps\Tps\Controllers\API\PostController@lenta');
Route::resource('api/v2/afisha', 'AhmadFatoni\ApiGenerator\Controllers\API\AfishaController', ['except' => ['destroy', 'create', 'edit']]); Route::get('{locale}/api/v2/home-top','Tps\Tps\Controllers\API\PostController@homeTop');
Route::get('{locale}/api/v2/home-mid','Tps\Tps\Controllers\API\PostController@homeMid');
Route::get('{locale}/api/v2/home-footer','Tps\Tps\Controllers\API\MediaController@home');
Route::get('api/v2/categories', 'Tps\Tps\Controllers\API\CategoriesV2Controller@index');
Route::get('api/v2/media', 'Tps\Tps\Controllers\API\MediaController@index');
Route::resource('api/v2/afisha', 'Tps\Tps\Controllers\API\AfishaController', ['except' => ['destroy', 'create', 'edit']]);
Route::get('api/version',function (){ Route::get('api/version',function (){
return '2.0.8'; return '2.0.8';

View File

@ -1,9 +1,13 @@
items: items:
- -
title: Новости title: Новости
nesting: null
type: url type: url
url: /ru/posts/news url: /ru/posts/news
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -18,9 +22,13 @@ items:
items: items:
- -
title: События title: События
nesting: null
type: url type: url
url: /ru/posts/news/events url: /ru/posts/news/events
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -41,7 +49,7 @@ items:
locale: locale:
en: en:
title: Economy title: Economy
url: '' url: /en/posts/news/economy
tm: tm:
title: Ykdysadyýet title: Ykdysadyýet
url: /tm/posts/news/ykdysadyyet url: /tm/posts/news/ykdysadyyet
@ -50,9 +58,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: Общество title: Общество
nesting: null
type: url type: url
url: /ru/posts/news/society url: /ru/posts/news/society
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -66,9 +78,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: Культура title: Культура
nesting: null
type: url type: url
url: /ru/posts/news/culture url: /ru/posts/news/culture
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -82,9 +98,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: 'Новости бизнеса' title: 'Новости бизнеса'
nesting: null
type: url type: url
url: /ru/posts/news/novosti-biznesa url: /ru/posts/news/novosti-biznesa
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -98,9 +118,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: Спорт title: Спорт
nesting: null
type: url type: url
url: /ru/posts/news/sport url: /ru/posts/news/sport
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -114,9 +138,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: Наука title: Наука
nesting: null
type: url type: url
url: /ru/posts/news/nauka url: /ru/posts/news/nauka
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -130,9 +158,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: Экомир title: Экомир
nesting: null
type: url type: url
url: /ru/posts/news/eco-world url: /ru/posts/news/eco-world
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -146,9 +178,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: Технологии title: Технологии
nesting: null
type: url type: url
url: /ru/posts/news/technology url: /ru/posts/news/technology
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -162,9 +198,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: 'Новости партнеров' title: 'Новости партнеров'
nesting: null
type: url type: url
url: /ru/posts/news/novosti-partnerov url: /ru/posts/news/novosti-partnerov
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -178,9 +218,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: Статьи title: Статьи
nesting: null
type: url type: url
url: /ru/posts/stati url: /ru/posts/stati
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -195,9 +239,13 @@ items:
items: items:
- -
title: События title: События
nesting: null
type: url type: url
url: /ru/posts/stati/events url: /ru/posts/stati/events
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -211,9 +259,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: Экономика title: Экономика
nesting: null
type: url type: url
url: /ru/posts/stati/economy url: /ru/posts/stati/economy
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -227,9 +279,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: Общество title: Общество
nesting: null
type: url type: url
url: /ru/posts/stati/society url: /ru/posts/stati/society
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -243,9 +299,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: 'От редактора' title: 'От редактора'
nesting: null
type: url type: url
url: /ru/posts/stati/ot-redaktora url: /ru/posts/stati/ot-redaktora
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -259,9 +319,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: Культура title: Культура
nesting: null
type: url type: url
url: /ru/posts/stati/culture url: /ru/posts/stati/culture
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -275,9 +339,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: Полезное title: Полезное
nesting: null
type: url type: url
url: /ru/posts/stati/poleznoe url: /ru/posts/stati/poleznoe
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -291,9 +359,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: Спорт title: Спорт
nesting: null
type: url type: url
url: /ru/posts/stati/sport url: /ru/posts/stati/sport
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -307,9 +379,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: Экомир title: Экомир
nesting: null
type: url type: url
url: /ru/posts/stati/eco-world url: /ru/posts/stati/eco-world
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -323,9 +399,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: Технологии title: Технологии
nesting: null
type: url type: url
url: /ru/posts/stati/technology url: /ru/posts/stati/technology
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -339,9 +419,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: Медиа title: Медиа
nesting: null
type: url type: url
url: /ru/posts/media url: /ru/posts/media
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -396,9 +480,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: Афиша title: Афиша
nesting: null
type: url type: url
url: /ru/posts/poster url: /ru/posts/poster
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -413,9 +501,13 @@ items:
items: items:
- -
title: Концерты title: Концерты
nesting: null
type: url type: url
url: /ru/posts/poster/koncerty url: /ru/posts/poster/koncerty
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -429,9 +521,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: Кинотеатры title: Кинотеатры
nesting: null
type: url type: url
url: /ru/posts/poster/kinoteatry url: /ru/posts/poster/kinoteatry
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -445,9 +541,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: Театры title: Театры
nesting: null
type: url type: url
url: /ru/posts/poster/teatry url: /ru/posts/poster/teatry
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -461,9 +561,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: Выставки title: Выставки
nesting: null
type: url type: url
url: /ru/posts/poster/vystavki url: /ru/posts/poster/vystavki
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -477,9 +581,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: Спорт title: Спорт
nesting: null
type: url type: url
url: /ru/posts/poster/sportt url: /ru/posts/poster/sportt
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en:
@ -493,9 +601,13 @@ items:
isExternal: '0' isExternal: '0'
- -
title: Объявления title: Объявления
nesting: null
type: url type: url
url: /ru/posts/poster/obyavleniya url: /ru/posts/poster/obyavleniya
code: '' code: ''
reference: null
cmsPage: null
replace: null
viewBag: viewBag:
locale: locale:
en: en: