Reklama plugin

This commit is contained in:
merdan 2021-04-01 11:04:39 +05:00
parent b3b6493b8d
commit d7e10e2864
69 changed files with 1100 additions and 1733 deletions

View File

@ -28,7 +28,7 @@ return [
| any other location as required by the application or its packages. | any other location as required by the application or its packages.
*/ */
'name' => 'October CMS', 'name' => 'Orient news',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@ -62,7 +62,7 @@ return [
| |
*/ */
'timezone' => 'UTC', 'timezone' => 'Asia/Ashgabat',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@ -148,7 +148,7 @@ return [
*/ */
'loadDiscoveredPackages' => false, 'loadDiscoveredPackages' => false,
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Class Aliases | Class Aliases

View File

@ -1,52 +0,0 @@
<?php namespace PolloZen\MostVisited;
use Backend;
use System\Classes\PluginBase;
use RainLab\Blog\Models\Post as PostModel;
/**
* MostVisited Plugin Information File
*/
class Plugin extends PluginBase
{
public $require = ['RainLab.Blog'];
/**
* Returns information about this plugin.
*
* @return array
*/
public function pluginDetails()
{
return [
'name' => 'Most Visited Posts',
'description' => 'Register visit to RainLab Blog publication and retrieve the most visited publications',
'author' => 'PolloZen',
'icon' => 'icon-list-ul'
];
}
/**
* Boot method, called right before the request route.
*
* @return array
*/
public function boot(){
PostModel::extend(function($model){
$model->hasMany['visits'] = ['PolloZen\MostVisited\Models\Visits'];
});
}
/**
* Registers any front-end components implemented in this plugin.
*
* @return array
*/
public function registerComponents(){
return [
'PolloZen\MostVisited\Components\RegisterVisit' => 'registerVisit',
'PolloZen\MostVisited\Components\TopVisited' => 'topPosts',
];
}
}

View File

@ -1,58 +0,0 @@
#Most Visited Post for [RainLab Blog](https://octobercms.com/plugin/rainlab-blog)
Plugin to register visits to [RainLab Blog](https://octobercms.com/plugin/rainlab-blog) Blog Publications and create a list of the most visited posts in a period of time
##Installing the watcher
**IMPORTANT**
In order to register the visit to a Publication `RegisterVisit` component must be added to Post Page
##Create a most visited posts list
Add the `TopVisitedComponent`
This component has parameters
**Most Visited From** - The time period to get the most visited publications
- Today
- Current Week
- Last Week
- All the time
**Category filter**
You can select a category filter, this way you can get the Top 10 from a particular category. If no category is selected, the component will retrieve the top 10 from all your publications
**Top**
How many publications must be retrieved
###Examples
Using these three parameters you can construct different lists. Eg.
- **Last week**, top **10** from **local news**
- **Today** top **5** from **all the site**
- Top **10** from **all the site** in **all the time**
###Displaying the results
The `TopVisitedComponent` inject the **mostVisitedPosts** object
Use as you already use the RainLab blog post
```
{% for post in mostVisitedPosts %}
<div class="post">
<div class="postImage"><img alt="" src="{{post.featured_images[0].path}}"></div>
<div class="post-content">
<h3>{{post.title}}</h3>
<a href="{{post.url}}">Continue reading</a>
</div>
</div>
{% endfor %}
```
##Support and bugs reporting
You can write in the forum or visit me in [Github](https://github.com/sanPuerquitoProgramador/most-visited-posts)

View File

@ -1,32 +0,0 @@
<?php namespace PolloZen\MostVisited\Components;
use Cms\Classes\ComponentBase;
use Carbon\Carbon;
use PolloZen\MostVisited\Models\Visits;
class RegisterVisit extends ComponentBase
{
public function componentDetails()
{
return [
'name' => 'Register Visit',
'description' => 'Attach this component to your blog post page/partial in order to register the user visit'
];
}
public function defineProperties()
{
return [];
}
public function onRun(){
if($this->page[ 'post' ]){
if($this->page[ 'post' ]->id){
$idPost = $this->page[ 'post' ]->id;
$today = Carbon::today();
$visit = new Visits;
$visit = $visit->firstOrCreate(['post_id'=>$idPost, 'date'=>$today]);
$visit->whereId($visit->id)->increment('visits');
}
}
}
}

View File

@ -1,196 +0,0 @@
<?php namespace PolloZen\MostVisited\Components;
use Cms\Classes\Page;
use Cms\Classes\ComponentBase;
use Carbon\Carbon;
use PolloZen\MostVisited\Models\Visits;
use RainLab\Blog\Models\Post;
use RainLab\Blog\Models\Category;
class TopVisited extends ComponentBase
{
/**
* @var Illuminate\Database\Eloquent\Collection | array
*/
public $mostVisitedPosts;
/**
* Reference to the page name for linking to posts.
* @var string
*/
public $postPage;
/**
* Category filter
*/
public $category;
public function componentDetails()
{
return [
'name' => 'Top Visited Component',
'description' => 'Retrieve the top visited RainLab Blog Posts'
];
}
/**
* Definition of propertys
* @return [array]
*/
public function defineProperties()
{
return [
'period' =>[
'title' => 'Most visited from:',
'description' => '',
'default' => 2,
'type' => 'dropdown',
'options' => [
'1' => 'Today',
'2' => 'Current week',
'3' => 'Yesterday',
'4' => 'Last week',
'5' => 'All time'
],
'showExternalParam' => false
],
'category' =>[
'title' => 'Category Filter',
'description' => 'Filter result by category. All categories by default',
'type' => 'dropdown',
'placeholder' => 'Select a category',
'showExternalParam' => false,
'default' => 0
],
'postPerPage' => [
'title' => 'Top',
'description' => 'How many results must be fetched',
'default' => 5,
'type' => 'string'
],
'postPage' => [
'title' => 'Post page',
'description' => 'Page to show linked posts',
'type' => 'dropdown',
'default' => 'blog/post',
'group' => 'Links',
],
'slug' => [
'title' => 'rainlab.blog::lang.settings.post_slug',
'description' => 'rainlab.blog::lang.settings.post_slug_description',
'default' => '{{ :slug }}',
'type' => 'string',
'group' => 'Links'
]
];
}
/**
* [getPostPageOptions]
* @return [array][Blog]
*/
public function getPostPageOptions()
{
return Page::sortBy('baseFileName')->lists('baseFileName', 'baseFileName');
}
/**
* [getCategoryOptions]
* @return [array list] [Blog Categories]
*/
public function getCategoryOptions(){
$categories = [0=>'No filter'] + Category::orderBy('name')->lists('name','id');
return $categories;
}
public function onRun(){
$this->prepareVars();
$this->mostVisitedPosts = $this->page['mostVisitedPosts'] = $this->getMostVisitedPosts();
}
/**
* prepare Vars function
* @return [object]
*/
protected function prepareVars() {
/*Get the category filter*/
$this->category = ($this->property('category')!=0) ? $this->property('category') : null;
/* Get post page */
$this->postPage = $this->property('postPage') ? $this->property('postPage') : '404';
/* Top */
$this->postPerPage = is_int($this->property('postPerPage')) ? $this->property('postPerPage') : 5;
}
/**
* getTop Function [Obtiene los Post ID del rango y categorua seleccionados]
* @return [type] [description]
*/
protected function getTop(){
switch($this->property('period')){
case '1':
$dateRange = Carbon::today();
break;
case '2':
$fromDate = Carbon::now()->startOfWeek()->format('Y-m-d');
$toDate = Carbon::now()->endOfWeek()->format('Y-m-d');
break;
case '3':
$dateRange = Carbon::yesterday();
break;
case '4':
$fromDate = Carbon::now()->subDays(7)->startOfWeek()->format('Y/m/d');
$toDate = Carbon::now()->subDays(7)->endOfWeek()->format('Y/m/d');
break;
default:
// Si no hay fecha se toman todos
break;
}
$v = Visits::select('pollozen_mostvisited_visits.post_id');
if(isset($dateRange)){
$v->where('date',$dateRange);
} elseif (isset($fromDate)) {
$v->whereBetween('date', array($fromDate, $toDate));
}
$v ->selectRaw('sum(visits) as visits, count(pollozen_mostvisited_visits.post_id) as touchs')
->groupBy('post_id')
->orderBy('visits','desc');
if($this->category !== null){
$v->join('rainlab_blog_posts_categories',function($join){
$join ->on('pollozen_mostvisited_visits.post_id','=','rainlab_blog_posts_categories.post_id')
->where('rainlab_blog_posts_categories.category_id','=',$this->category);
});
}
$v->limit($this->property('postPerPage'));
$topIds = $v -> lists('post_id');
return $topIds;
}
protected function getMostVisitedPosts(){
/* Obtenemos los ID de los más visitados en el rango solicitado */
$topIds = $this->getTop();
if(count($topIds)!=0){
$placeholders = implode(',', array_fill(0, count($topIds), '?')) ;
/* Empezamos con el objeto de los posts en general que estén publicados*/
$p = Post::isPublished();
$p->whereIn('id', $topIds);
$p->orderByRaw("FIELD(id,{$placeholders})",$topIds);
$mostVisitedPosts = $p->get();
/* Agregamos el helper de la URL*/
$mostVisitedPosts->each(function($post) {
$post->setUrl($this->postPage,$this->controller);
});
/* Mandamos los resultados */
return $mostVisitedPosts;
} else {
return [];
}
}
}

View File

@ -1 +0,0 @@
<p>Nothing to see here. This component is added to the post page in order to register the visit</p>

View File

@ -1,18 +0,0 @@
{% set mostVisitedPosts = __SELF__.mostVisitedPosts %}
<div class="popular-post">
<h3>Top Publications</h3>
<div>
<ul>
{% for post in mostVisitedPosts %}
<li>
<div>
<div class="thumb"><img alt="" src="{{post.featured_images[0].path}}"></div>
<div class="post-content">
<h3><a href="{{post.url}}">{{post.title}}</a></h3>
</div>
</div>
</li>
{% endfor %}
</ul>
</div>
</div>

View File

@ -1,37 +0,0 @@
<?php namespace PolloZen\MostVisited\Models;
use Model;
// use RainLab\Blog\Models\Category as BlogCategory;
use RainLab\Blog\Models\Post;
use Config;
/**
* Visits Model
*/
class Visits extends Model
{
/**
* @var string The database table used by the model.
*/
public $table = 'pollozen_mostvisited_visits';
/**
* @var array Guarded fields
*/
protected $guarded = ['*'];
/**
* @var array Fillable fields
*/
protected $fillable = ['post_id','date'];
/**
* @var array Relations
*/
public $belongsTo = [
'post' => ['Rainlab\Blog\Models\Post']
];
}

View File

@ -1,8 +0,0 @@
# ===================================
# List Column Definitions
# ===================================
columns:
id:
label: ID
searchable: true

View File

@ -1,8 +0,0 @@
# ===================================
# Form Field Definitions
# ===================================
fields:
id:
label: ID
disabled: true

View File

@ -1,27 +0,0 @@
<?php namespace PolloZen\MostVisited\Updates;
use Schema;
use October\Rain\Database\Schema\Blueprint;
use October\Rain\Database\Updates\Migration;
class CreateVisitsTable extends Migration
{
public function up()
{
Schema::create('pollozen_mostvisited_visits', function(Blueprint $table)
{
$table->engine = 'InnoDB';
$table->increments('id');
$table->integer('post_id')->unsigned();
$table->date('date');
$table->smallInteger('visits')->unsigned()->default(0);
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('pollozen_mostvisited_visits');
}
}

View File

@ -1,5 +0,0 @@
1.0.1:
- First version of MostVisited. Create the Visitis table
- create_visits_table.php
1.0.2:
- Improve a new query to get the top visited post. Same results in 4x faster

View File

@ -46,7 +46,11 @@ class Category extends Model
'table' => 'rainlab_blog_posts_categories', 'table' => 'rainlab_blog_posts_categories',
'scope' => 'isPublished', 'scope' => 'isPublished',
'count' => true 'count' => true
] ],
'posts_filtered' => ['RainLab\Blog\Models\Post',
'table' => 'rainlab_blog_posts_categories',
'scope' => 'postsWithCats',
],
]; ];
public function beforeValidate() public function beforeValidate()
@ -78,6 +82,10 @@ class Category extends Model
}); });
} }
public function take_posts($count = 3){
return $this->posts->take($count);
}
/** /**
* Sets the "url" attribute with a URL to this object * Sets the "url" attribute with a URL to this object
* *

View File

@ -224,6 +224,13 @@ class Post extends Model
; ;
} }
public function scopePostsWithCats($query){
return $query
->isPublished()
->with('categories')
->orderBy('published_at','desc')
->take(7);
}
/** /**
* Lists posts for the frontend * Lists posts for the frontend
* *
@ -395,7 +402,7 @@ class Post extends Model
return array_get($parts, 0); return array_get($parts, 0);
} }
return Html::limit($this->content_html, 600); return Html::limit($this->content_html, 280);
} }
// //

View File

@ -0,0 +1,17 @@
<?php namespace Tps\Reklama;
use System\Classes\PluginBase;
class Plugin extends PluginBase
{
public function registerComponents()
{
return [
'Tps\Reklama\Components\Advertisement' => 'adverts',
];
}
public function registerSettings()
{
}
}

View File

@ -0,0 +1,66 @@
<?php namespace Tps\Reklama\Components;
use Cms\Classes\ComponentBase;
use Tps\Reklama\Models\Group;
class Advertisement extends ComponentBase
{
public $group;
public function componentDetails()
{
return [
'name' => 'Advertisements',
'description' => 'Reklamajyklar'
];
}
public function defineProperties(){
return [
'code' => [
'title' => 'Group',
'description' => 'Choose advertisement group',
'type' => 'dropdown',
'required' => 'required',
'validationMessage' => 'Please select group'
],
'type' => [
'title' => 'Display type',
'description' => 'Choose display type group',
'type' => 'dropdown',
'default' => 'single',
'required' => 'required',
'validationMessage' => 'Please select type'
],
'width' =>[
'title' => 'Item width',
'type' => 'number',
],
'height' => [
'title' => 'Item height',
'type' => 'number',
]
];
}
public function getCodeOptions()
{
return Group::all()->pluck('name','code')->toArray();
}
public function getTypeOptions()
{
return [
'single'=>'single',
'single_slide'=>'single_slide',
'single_random'=>'single_random',
'slider'=>'slider',
];
}
public function onRun(){
$this->group = Group::where('code',$this->property('code'))
->with('adds')
->first();
}
}

View File

@ -0,0 +1 @@
{% partial __SELF__ ~ "::"~ __SELF__.property('type') %}

View File

@ -0,0 +1,15 @@
<div class="partnerSlider">
<button class="p1">
<span></span>
</button>
<button class="n1">
<span></span>
</button>
<div class="partnerSlider__inner">
{% for reklama in __SELF__.group.adds %}
<a href="{{reklama.url|default('#')}}" class="partnerSlider__item">
<img src="{{reklama.media|media}}" alt="{{reklama.title}}">
</a>
{% endfor %}
</div>
</div>

View File

@ -0,0 +1,18 @@
<?php namespace Tps\Reklama\Controllers;
use Backend\Classes\Controller;
use BackendMenu;
class GroupsController extends Controller
{
public $implement = [ 'Backend\Behaviors\ListController', 'Backend\Behaviors\FormController' ];
public $listConfig = 'config_list.yaml';
public $formConfig = 'config_form.yaml';
public function __construct()
{
parent::__construct();
BackendMenu::setContext('Tps.Reklama', 'main-menu-item', 'side-menu-item');
}
}

View File

@ -0,0 +1,18 @@
<?php namespace Tps\Reklama\Controllers;
use Backend\Classes\Controller;
use BackendMenu;
class ReklamasController extends Controller
{
public $implement = [ 'Backend\Behaviors\ListController', 'Backend\Behaviors\FormController' ];
public $listConfig = 'config_list.yaml';
public $formConfig = 'config_form.yaml';
public function __construct()
{
parent::__construct();
BackendMenu::setContext('Tps.Reklama', 'main-menu-item', 'side-menu-item2');
}
}

View File

@ -0,0 +1,18 @@
<div data-control="toolbar">
<a href="<?= Backend::url('tps/reklama/groupscontroller/create') ?>" class="btn btn-primary oc-icon-plus"><?= e(trans('backend::lang.form.create')) ?></a>
<button
class="btn btn-default oc-icon-trash-o"
disabled="disabled"
onclick="$(this).data('request-data', {
checked: $('.control-list').listWidget('getChecked')
})"
data-request="onDelete"
data-request-confirm="<?= e(trans('backend::lang.list.delete_selected_confirm')) ?>"
data-trigger-action="enable"
data-trigger=".control-list input[type=checkbox]"
data-trigger-condition="checked"
data-request-success="$(this).prop('disabled', true)"
data-stripe-load-indicator>
<?= e(trans('backend::lang.list.delete_selected')) ?>
</button>
</div>

View File

@ -0,0 +1,10 @@
name: GroupsController
modelClass: Tps\Reklama\Models\Group
form: $/tps/reklama/models/group/fields.yaml
defaultRedirect: tps/reklama/groupscontroller
create:
redirect: 'tps/reklama/groups/update/:id'
redirectClose: tps/reklama/groupscontroller
update:
redirect: tps/reklama/groups
redirectClose: tps/reklama/groupscontroller

View File

@ -0,0 +1,12 @@
title: GroupsController
modelClass: Tps\Reklama\Models\Group
list: $/tps/reklama/models/group/columns.yaml
recordUrl: 'tps/reklama/groups/update/:id'
noRecordsMessage: 'backend::lang.list.no_records'
recordsPerPage: 20
showSetup: true
showCheckboxes: true
toolbar:
buttons: list_toolbar
search:
prompt: 'backend::lang.list.search_prompt'

View File

@ -0,0 +1,46 @@
<?php Block::put('breadcrumb') ?>
<ul>
<li><a href="<?= Backend::url('tps/reklama/groupscontroller') ?>">GroupsController</a></li>
<li><?= e($this->pageTitle) ?></li>
</ul>
<?php Block::endPut() ?>
<?php if (!$this->fatalError): ?>
<?= Form::open(['class' => 'layout']) ?>
<div class="layout-row">
<?= $this->formRender() ?>
</div>
<div class="form-buttons">
<div class="loading-indicator-container">
<button
type="submit"
data-request="onSave"
data-hotkey="ctrl+s, cmd+s"
data-load-indicator="<?= e(trans('backend::lang.form.saving')) ?>"
class="btn btn-primary">
<?= e(trans('backend::lang.form.create')) ?>
</button>
<button
type="button"
data-request="onSave"
data-request-data="close:1"
data-hotkey="ctrl+enter, cmd+enter"
data-load-indicator="<?= e(trans('backend::lang.form.saving')) ?>"
class="btn btn-default">
<?= e(trans('backend::lang.form.create_and_close')) ?>
</button>
<span class="btn-text">
<?= e(trans('backend::lang.form.or')) ?> <a href="<?= Backend::url('tps/reklama/groupscontroller') ?>"><?= e(trans('backend::lang.form.cancel')) ?></a>
</span>
</div>
</div>
<?= Form::close() ?>
<?php else: ?>
<p class="flash-message static error"><?= e(trans($this->fatalError)) ?></p>
<p><a href="<?= Backend::url('tps/reklama/groupscontroller') ?>" class="btn btn-default"><?= e(trans('backend::lang.form.return_to_list')) ?></a></p>
<?php endif ?>

View File

@ -0,0 +1 @@
<?= $this->listRender() ?>

View File

@ -0,0 +1,22 @@
<?php Block::put('breadcrumb') ?>
<ul>
<li><a href="<?= Backend::url('tps/reklama/groupscontroller') ?>">GroupsController</a></li>
<li><?= e($this->pageTitle) ?></li>
</ul>
<?php Block::endPut() ?>
<?php if (!$this->fatalError): ?>
<div class="form-preview">
<?= $this->formRenderPreview() ?>
</div>
<?php else: ?>
<p class="flash-message static error"><?= e($this->fatalError) ?></p>
<?php endif ?>
<p>
<a href="<?= Backend::url('tps/reklama/groupscontroller') ?>" class="btn btn-default oc-icon-chevron-left">
<?= e(trans('backend::lang.form.return_to_list')) ?>
</a>
</p>

View File

@ -0,0 +1,54 @@
<?php Block::put('breadcrumb') ?>
<ul>
<li><a href="<?= Backend::url('tps/reklama/groupscontroller') ?>">GroupsController</a></li>
<li><?= e($this->pageTitle) ?></li>
</ul>
<?php Block::endPut() ?>
<?php if (!$this->fatalError): ?>
<?= Form::open(['class' => 'layout']) ?>
<div class="layout-row">
<?= $this->formRender() ?>
</div>
<div class="form-buttons">
<div class="loading-indicator-container">
<button
type="submit"
data-request="onSave"
data-request-data="redirect:0"
data-hotkey="ctrl+s, cmd+s"
data-load-indicator="<?= e(trans('backend::lang.form.saving')) ?>"
class="btn btn-primary">
<?= e(trans('backend::lang.form.save')) ?>
</button>
<button
type="button"
data-request="onSave"
data-request-data="close:1"
data-hotkey="ctrl+enter, cmd+enter"
data-load-indicator="<?= e(trans('backend::lang.form.saving')) ?>"
class="btn btn-default">
<?= e(trans('backend::lang.form.save_and_close')) ?>
</button>
<button
type="button"
class="oc-icon-trash-o btn-icon danger pull-right"
data-request="onDelete"
data-load-indicator="<?= e(trans('backend::lang.form.deleting')) ?>"
data-request-confirm="<?= e(trans('backend::lang.form.confirm_delete')) ?>">
</button>
<span class="btn-text">
<?= e(trans('backend::lang.form.or')) ?> <a href="<?= Backend::url('tps/reklama/groupscontroller') ?>"><?= e(trans('backend::lang.form.cancel')) ?></a>
</span>
</div>
</div>
<?= Form::close() ?>
<?php else: ?>
<p class="flash-message static error"><?= e(trans($this->fatalError)) ?></p>
<p><a href="<?= Backend::url('tps/reklama/groupscontroller') ?>" class="btn btn-default"><?= e(trans('backend::lang.form.return_to_list')) ?></a></p>
<?php endif ?>

View File

@ -0,0 +1,18 @@
<div data-control="toolbar">
<a href="<?= Backend::url('tps/reklama/reklamascontroller/create') ?>" class="btn btn-primary oc-icon-plus"><?= e(trans('backend::lang.form.create')) ?></a>
<button
class="btn btn-default oc-icon-trash-o"
disabled="disabled"
onclick="$(this).data('request-data', {
checked: $('.control-list').listWidget('getChecked')
})"
data-request="onDelete"
data-request-confirm="<?= e(trans('backend::lang.list.delete_selected_confirm')) ?>"
data-trigger-action="enable"
data-trigger=".control-list input[type=checkbox]"
data-trigger-condition="checked"
data-request-success="$(this).prop('disabled', true)"
data-stripe-load-indicator>
<?= e(trans('backend::lang.list.delete_selected')) ?>
</button>
</div>

View File

@ -0,0 +1,10 @@
name: ReklamasController
form: $/tps/reklama/models/reklama/fields.yaml
modelClass: Tps\Reklama\Models\Reklama
defaultRedirect: tps/reklama/reklamascontroller
create:
redirect: 'tps/reklama/reklamascontroller/update/:id'
redirectClose: tps/reklama/reklamascontroller
update:
redirect: tps/reklama/reklamascontroller
redirectClose: tps/reklama/reklamascontroller

View File

@ -0,0 +1,12 @@
title: ReklamasController
modelClass: Tps\Reklama\Models\Reklama
list: $/tps/reklama/models/reklama/columns.yaml
recordUrl: 'tps/reklama/reklamascontroller/update/:id'
noRecordsMessage: 'backend::lang.list.no_records'
recordsPerPage: 20
showSetup: true
showCheckboxes: true
toolbar:
buttons: list_toolbar
search:
prompt: 'backend::lang.list.search_prompt'

View File

@ -0,0 +1,46 @@
<?php Block::put('breadcrumb') ?>
<ul>
<li><a href="<?= Backend::url('tps/reklama/reklamascontroller') ?>">ReklamasController</a></li>
<li><?= e($this->pageTitle) ?></li>
</ul>
<?php Block::endPut() ?>
<?php if (!$this->fatalError): ?>
<?= Form::open(['class' => 'layout']) ?>
<div class="layout-row">
<?= $this->formRender() ?>
</div>
<div class="form-buttons">
<div class="loading-indicator-container">
<button
type="submit"
data-request="onSave"
data-hotkey="ctrl+s, cmd+s"
data-load-indicator="<?= e(trans('backend::lang.form.saving')) ?>"
class="btn btn-primary">
<?= e(trans('backend::lang.form.create')) ?>
</button>
<button
type="button"
data-request="onSave"
data-request-data="close:1"
data-hotkey="ctrl+enter, cmd+enter"
data-load-indicator="<?= e(trans('backend::lang.form.saving')) ?>"
class="btn btn-default">
<?= e(trans('backend::lang.form.create_and_close')) ?>
</button>
<span class="btn-text">
<?= e(trans('backend::lang.form.or')) ?> <a href="<?= Backend::url('tps/reklama/reklamascontroller') ?>"><?= e(trans('backend::lang.form.cancel')) ?></a>
</span>
</div>
</div>
<?= Form::close() ?>
<?php else: ?>
<p class="flash-message static error"><?= e(trans($this->fatalError)) ?></p>
<p><a href="<?= Backend::url('tps/reklama/reklamascontroller') ?>" class="btn btn-default"><?= e(trans('backend::lang.form.return_to_list')) ?></a></p>
<?php endif ?>

View File

@ -0,0 +1 @@
<?= $this->listRender() ?>

View File

@ -0,0 +1,22 @@
<?php Block::put('breadcrumb') ?>
<ul>
<li><a href="<?= Backend::url('tps/reklama/reklamascontroller') ?>">ReklamasController</a></li>
<li><?= e($this->pageTitle) ?></li>
</ul>
<?php Block::endPut() ?>
<?php if (!$this->fatalError): ?>
<div class="form-preview">
<?= $this->formRenderPreview() ?>
</div>
<?php else: ?>
<p class="flash-message static error"><?= e($this->fatalError) ?></p>
<?php endif ?>
<p>
<a href="<?= Backend::url('tps/reklama/reklamascontroller') ?>" class="btn btn-default oc-icon-chevron-left">
<?= e(trans('backend::lang.form.return_to_list')) ?>
</a>
</p>

View File

@ -0,0 +1,54 @@
<?php Block::put('breadcrumb') ?>
<ul>
<li><a href="<?= Backend::url('tps/reklama/reklamascontroller') ?>">ReklamasController</a></li>
<li><?= e($this->pageTitle) ?></li>
</ul>
<?php Block::endPut() ?>
<?php if (!$this->fatalError): ?>
<?= Form::open(['class' => 'layout']) ?>
<div class="layout-row">
<?= $this->formRender() ?>
</div>
<div class="form-buttons">
<div class="loading-indicator-container">
<button
type="submit"
data-request="onSave"
data-request-data="redirect:0"
data-hotkey="ctrl+s, cmd+s"
data-load-indicator="<?= e(trans('backend::lang.form.saving')) ?>"
class="btn btn-primary">
<?= e(trans('backend::lang.form.save')) ?>
</button>
<button
type="button"
data-request="onSave"
data-request-data="close:1"
data-hotkey="ctrl+enter, cmd+enter"
data-load-indicator="<?= e(trans('backend::lang.form.saving')) ?>"
class="btn btn-default">
<?= e(trans('backend::lang.form.save_and_close')) ?>
</button>
<button
type="button"
class="oc-icon-trash-o btn-icon danger pull-right"
data-request="onDelete"
data-load-indicator="<?= e(trans('backend::lang.form.deleting')) ?>"
data-request-confirm="<?= e(trans('backend::lang.form.confirm_delete')) ?>">
</button>
<span class="btn-text">
<?= e(trans('backend::lang.form.or')) ?> <a href="<?= Backend::url('tps/reklama/reklamascontroller') ?>"><?= e(trans('backend::lang.form.cancel')) ?></a>
</span>
</div>
</div>
<?= Form::close() ?>
<?php else: ?>
<p class="flash-message static error"><?= e(trans($this->fatalError)) ?></p>
<p><a href="<?= Backend::url('tps/reklama/reklamascontroller') ?>" class="btn btn-default"><?= e(trans('backend::lang.form.return_to_list')) ?></a></p>
<?php endif ?>

View File

@ -0,0 +1,6 @@
<?php return [
'plugin' => [
'name' => 'Reklama',
'description' => ''
]
];

View File

@ -0,0 +1,42 @@
<?php namespace Tps\Reklama\Models;
use Model;
/**
* Model
*/
class Group extends Model
{
use \October\Rain\Database\Traits\Validation;
/*
* Disable timestamps by default.
* Remove this line if timestamps are defined in the database table.
*/
public $timestamps = false;
/**
* @var string The database table used by the model.
*/
public $table = 'tps_reklama_group';
/**
* @var array Validation rules
*/
public $rules = [
];
public $hasMany = [
'adds_count' => ['Tps\Reklama\Models\Reklama',
'table' => 'tps_reklama_item',
'count' => true
],
'adds' => ['Tps\Reklama\Models\Reklama',
'table' => 'tps_reklama_item',
'scope' => 'unExpiered'
// 'order' => 'order asc',
// 'condition' => 'active = 1'
],
];
}

View File

@ -0,0 +1,50 @@
<?php namespace Tps\Reklama\Models;
use Carbon\Carbon;
use Model;
/**
* Model
*/
class Reklama extends Model
{
use \October\Rain\Database\Traits\Validation;
/*
* Disable timestamps by default.
* Remove this line if timestamps are defined in the database table.
*/
public $timestamps = false;
/**
* @var string The database table used by the model.
*/
public $table = 'tps_reklama_item';
/**
* @var array Validation rules
*/
public $rules = [
];
public $belongsTo = [
'group' => ['Tps\Reklama\Models\Group',
'table' => 'tps_reklama_group',
'order' => 'name'
],
];
public function scopeUnExpiered($query){
return $query->where('active',1)
->where(function ($q) {
$q->where('end_date', '>', Carbon::now(config('app.timezone')))
->orWhereNull('end_date');
})
->where(function ($q) {
$q->where('start_date', '<', Carbon::now(config('app.timezone')))
->orWhereNull('start_date');
})
->orderBy('order');
}
}

View File

@ -0,0 +1,17 @@
columns:
code:
label: Code
type: text
searchable: true
sortable: true
name:
label: Name
type: text
searchable: true
sortable: true
adds_count:
label: Items
type: number
sortable: true
relation: adds_count
valueFrom: count

View File

@ -0,0 +1,12 @@
fields:
name:
label: Name
span: left
type: text
comment: 'Group name'
code:
label: Code
span: auto
required: 1
type: text
comment: 'Group code'

View File

@ -0,0 +1,18 @@
columns:
title:
label: title
type: text
url:
label: url
type: text
start_date:
label: start_date
type: datetime
end_date:
label: end_date
type: datetime
group:
label: group
type: text
relation: group
valueFrom: name

View File

@ -0,0 +1,53 @@
fields:
title:
label: Title
span: auto
type: text
desciption:
label: Description
span: auto
type: text
url:
label: Url
span: auto
type: text
comment: 'link where to redirect on click'
group:
label: Group
nameFrom: code
descriptionFrom: name
span: auto
required: 1
type: relation
order:
label: 'Sort order'
span: auto
type: number
comment: 'Sorts in ascending order'
start_date:
label: 'Start Date'
mode: datetime
span: auto
type: datepicker
comment: 'Date when will start showing (leave blank for immediate showing)'
media:
label: 'Media file'
mode: image
span: auto
type: mediafinder
end_date:
label: 'End Date'
mode: datetime
span: auto
type: datepicker
comment: 'Date when will end showing (leave blank for endless show)'
enable_stats:
label: 'Statistics counter'
span: auto
type: switch
comment: 'Enable,disabel counter for views and clicks'
active:
label: Status
span: auto
type: switch
comment: 'Enable, disable status'

View File

@ -0,0 +1,28 @@
plugin:
name: 'tps.reklama::lang.plugin.name'
description: 'tps.reklama::lang.plugin.description'
author: TPS
icon: oc-icon-ge
homepage: ''
navigation:
main-menu-item:
label: Reklama
url: tps/reklama/groupscontroller
icon: icon-empire
sideMenu:
side-menu-item:
label: Groups
url: tps/reklama/groupscontroller
icon: icon-sitemap
side-menu-item2:
label: Reklama
url: tps/reklama/reklamascontroller
icon: icon-star
side-menu-item3:
label: Statistics
url: tps/reklama/groupscontroller
icon: icon-line-chart
permissions:
reklama:
tab: Reklama
label: Rerklama

View File

@ -0,0 +1,23 @@
<?php namespace Tps\Reklama\Updates;
use Schema;
use October\Rain\Database\Updates\Migration;
class BuilderTableCreateTpsReklamaGroup extends Migration
{
public function up()
{
Schema::create('tps_reklama_group', function($table)
{
$table->engine = 'InnoDB';
$table->increments('id')->unsigned();
$table->string('name')->nullable();
$table->string('code');
});
}
public function down()
{
Schema::dropIfExists('tps_reklama_group');
}
}

View File

@ -0,0 +1,30 @@
<?php namespace Tps\Reklama\Updates;
use Schema;
use October\Rain\Database\Updates\Migration;
class BuilderTableCreateTpsReklamaItem extends Migration
{
public function up()
{
Schema::create('tps_reklama_item', function($table)
{
$table->engine = 'InnoDB';
$table->increments('id')->unsigned();
$table->string('title', 255)->nullable();
$table->string('desciption', 255)->nullable();
$table->string('url', 255)->nullable();
$table->string('media', 255);
$table->dateTime('start_date')->nullable();
$table->dateTime('end_date')->nullable();
$table->timestamp('created_at')->nullable();
$table->timestamp('updated_at')->nullable();
$table->integer('group_id')->unsigned();
});
}
public function down()
{
Schema::dropIfExists('tps_reklama_item');
}
}

View File

@ -0,0 +1,24 @@
<?php namespace Tps\Reklama\Updates;
use Schema;
use October\Rain\Database\Updates\Migration;
class BuilderTableCreateTpsReklamaStatistika extends Migration
{
public function up()
{
Schema::create('tps_reklama_statistika', function($table)
{
$table->engine = 'InnoDB';
$table->increments('id')->unsigned();
$table->integer('click')->unsigned();
$table->integer('view')->unsigned();
$table->date('date');
});
}
public function down()
{
Schema::dropIfExists('tps_reklama_statistika');
}
}

View File

@ -0,0 +1,25 @@
<?php namespace Tps\Reklama\Updates;
use Schema;
use October\Rain\Database\Updates\Migration;
class BuilderTableUpdateTpsReklamaItem extends Migration
{
public function up()
{
Schema::table('tps_reklama_item', function($table)
{
$table->smallInteger('order')->unsigned()->default(0);
$table->boolean('active')->default(1);
});
}
public function down()
{
Schema::table('tps_reklama_item', function($table)
{
$table->dropColumn('order');
$table->dropColumn('active');
});
}
}

View File

@ -0,0 +1,23 @@
<?php namespace Tps\Reklama\Updates;
use Schema;
use October\Rain\Database\Updates\Migration;
class BuilderTableUpdateTpsReklamaItem2 extends Migration
{
public function up()
{
Schema::table('tps_reklama_item', function($table)
{
$table->boolean('enable_stats')->default(0);
});
}
public function down()
{
Schema::table('tps_reklama_item', function($table)
{
$table->dropColumn('enable_stats');
});
}
}

View File

@ -0,0 +1,23 @@
<?php namespace Tps\Reklama\Updates;
use Schema;
use October\Rain\Database\Updates\Migration;
class BuilderTableUpdateTpsReklamaStatistika extends Migration
{
public function up()
{
Schema::table('tps_reklama_statistika', function($table)
{
$table->integer('item_id')->unsigned();
});
}
public function down()
{
Schema::table('tps_reklama_statistika', function($table)
{
$table->dropColumn('item_id');
});
}
}

View File

@ -0,0 +1,20 @@
1.0.1:
- 'Initialize plugin.'
1.0.2:
- 'Created table tps_reklama_item'
- builder_table_create_tps_reklama_item.php
1.0.3:
- 'Created table tps_reklama_group'
- builder_table_create_tps_reklama_group.php
1.0.4:
- 'Created table tps_reklama_statistika'
- builder_table_create_tps_reklama_statistika.php
1.0.5:
- 'Updated table tps_reklama_statistika'
- builder_table_update_tps_reklama_statistika.php
1.0.6:
- 'Updated table tps_reklama_item'
- builder_table_update_tps_reklama_item.php
1.0.7:
- 'Updated table tps_reklama_item'
- builder_table_update_tps_reklama_item_2.php

View File

@ -16,3 +16,12 @@ set rb.featerd_image = wp.guid
////////////// replace image address ////////////// replace image address
UPDATE rainlab_blog_posts set featured_image = REPLACE(featured_image,'https://orient.tm/en/wp-content/','') where featured_image !='' UPDATE rainlab_blog_posts set featured_image = REPLACE(featured_image,'https://orient.tm/en/wp-content/','') where featured_image !=''
///////////////////////post views//////
INSERT INTO orient.vdomah_blogviews_views (views,post_id)
select pp.pageviews,rb.id FROM orient_wordpress.iatm_orient_2_popularpostsdata pp
INNER join orient.rainlab_blog_posts rb on rb.id_en = pp.postid
INSERT INTO orient.pollozen_mostvisited_visits (post_id,date,visits)
select rb.id, pp.view_date , pp.pageviews FROM orient_wordpress.iatm_orient_2_popularpostssummary pp
INNER join orient.rainlab_blog_posts rb on rb.id_en = pp.postid

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="940" height="160" viewBox="0 0 940 160">
<rect id="Реклама_большая_1_" data-name="Реклама большая (1)" width="940" height="160" fill="#b4b4b4"/>
</svg>

After

Width:  |  Height:  |  Size: 229 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 945 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 483 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 KiB

View File

@ -23,7 +23,7 @@ ru:
page.tags: 'ТЭГИ' page.tags: 'ТЭГИ'
page.calendar: 'КАЛЕНДАРЬ НОВОСТЕЙ' page.calendar: 'КАЛЕНДАРЬ НОВОСТЕЙ'
page.latest_news: 'Последние новости' page.latest_news: 'Последние новости'
page.more: 'Ещё' page.more: 'Посмотреть всё'
page.search: 'Поиск' page.search: 'Поиск'
page.search_result: 'По результату поиска было найдено: :number статьи' page.search_result: 'По результату поиска было найдено: :number статьи'
contact: 'НАШИ КОНТАКТЫ' contact: 'НАШИ КОНТАКТЫ'

View File

@ -55,4 +55,9 @@ tabs:
label: Linkedin label: Linkedin
default: default:
span: auto span: auto
topCategory:
tab: Home Page
label: Top section cateegory
default: events
span: left

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
title = "Пост" title = "Пост"
url = "/post/:id/:slug" url = "/post/:id/:slug"
layout = "master" layout = "cms"
is_hidden = 0 is_hidden = 0
robot_index = "index" robot_index = "index"
robot_follow = "follow" robot_follow = "follow"
@ -10,6 +10,7 @@ localeTitle[en] = "Post"
[blogPost] [blogPost]
slug = "{{ :slug }}" slug = "{{ :slug }}"
id = "{{ :id }}"
categoryPage = "blog/category" categoryPage = "blog/category"
[SeoBlogPost] [SeoBlogPost]
@ -17,11 +18,8 @@ post = "post"
[views] [views]
slug = "{{ :slug }}" slug = "{{ :slug }}"
[registerVisit]
== ==
<article class="news__content"> <article class="news__content">
<header> <header>
<time class="news__date"> <time class="news__date">
<span>{{post.published_at|date('d.m.Y')}}</span> <span>{{post.published_at|date('d.m.Y')}}</span>
@ -31,16 +29,16 @@ slug = "{{ :slug }}"
<span>{{post.published_at|date('H:i')}}</span> <span>{{post.published_at|date('H:i')}}</span>
</time> </time>
<h1 class="news__title"> <h1 class="news__title">
{{post.title}}} {{post.title}}
</h1> </h1>
{% if post.image %} {% if post.image %}
<picture class="news__image"> <picture class="news__image">
<img src="{{post.image|media|resize(983,null, { mode: 'contain' })}}" alt="{{post.title}}"> <img src="{{post.featured_image|media}}" alt="{{post.title}}">
</picture> </picture>
{% endif %} {% endif %}
</header> </header>
<div class="news__body"> <div class="news__body">
{{post.content}} {{post.content_html|raw}}
</div> </div>
<div class="news__footer"> <div class="news__footer">
<div class="news__footer-social"> <div class="news__footer-social">
@ -145,12 +143,8 @@ slug = "{{ :slug }}"
{% endif %} {% endif %}
</div> </div>
<div class="news__footer-name">
Нуры АМАНОВ
</div>
</div> </div>
</article> </article>
<div class="news__sidebar"> <div class="news__sidebar">
{% partial 'latest_news'%} {% partial 'latest_news'%}
</div> </div>

View File

@ -0,0 +1,14 @@
<div class="card">
<div class="card__header">
<time class="card__header-date"><span>{{post.published_at|date('d.m.Y')}}</span>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 4 4">
<path id="Polygon_1" data-name="Polygon 1" d="M2,0,4,2,2,4,0,2Z"
fill="#a2a2a2" />
</svg>
<span>{{post.published_at|date('H:i')}}</span>
</time>
</div>
<a href="{{'post'|page({id:post.id,slug:post.slug})}}" class="card__link">
{{post.title}}
</a>
</div>

View File

@ -0,0 +1,39 @@
{% set posts = category.take_posts(3) %}
<div class="main__body-column">
<div class="main__body-header">
<div class="main__body-header-title">
{{category.name}}
</div>
<a href="{{'category'|page({slug:category.slug})}}" class="main__body-header-link">
{{'page.more'|_}}
</a>
</div>
<a href="{{'assets/images/news/1.png'|theme}}" class="primary progressive replace">
<img class="preview" src="{{'assets/images/lazy/1.jpg'|theme}}" alt="{{posts.first.title}}">
</a>
<div class="main__body-card">
<div class="card">
<div class="card__header">
<div class="card__header-category">
{{category.name}}
</div>
</div>
<div class="card__header">
<time class="card__header-date"><span>{{posts.first.published_at|date('d.m.Y')}}</span>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 4 4">
<path id="Polygon_1" data-name="Polygon 1" d="M2,0,4,2,2,4,0,2Z"
fill="#a2a2a2" />
</svg>
<span>{{posts.first.published_at|date('H:i')}}</span>
</time> </span>
</div>
</div>
<a href="{{'post'|page({id:posts.first.id,slug:posts.first.slug})}}" class="card__link">
{{posts.first.title}}
</a>
</div>
{% partial 'index/category_post_item' post = posts.1 %}
{% partial 'index/category_post_item' post = posts.last %}
</div>

View File

@ -0,0 +1,23 @@
<div class="card">
<div class="card__header">
<div class="card__header-category">
{% if post.categories.count>1 %}
{{post.categories.where('name','!=', category.name).first.name}}
{% else %}
{{post.categories.implode('name',',')}}
{% endif %}
</div>
</div>
<div class="card__header">
<time class="card__header-date"><span>{{post.published_at|date('d.m.Y')}}</span>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 4 4">
<path id="Polygon_1" data-name="Polygon 1" d="M2,0,4,2,2,4,0,2Z"
fill="#a2a2a2" />
</svg>
<span>{{post.published_at|date('H:i')}}</span>
</time>
</div>
<a href="{{'post'|page({id:post.id,slug:post.slug})}}" class="card__link">
{{post.title}}
</a>
</div>

View File

@ -0,0 +1,37 @@
{% set firstPost = category.posts_filtered.shift %}
<section class="event">
<div class="auto__container">
<div class="event__inner">
<div class="event__header">
<div class="event__header-title">
{{category.name}}
</div>
<a href="{{'category'|page({slug:category.slug})}}" class="event__header-link">
{{'page.more'|_}}
</a>
</div>
<div class="event__body">
<div class="event__body-row">
<div class="event__body-image">
<a href="{{'assets/images/news/1.png'|theme}}" class="primary progressive replace">
<img class="preview" src="{{'assets/images/lazy/1.jpg'|theme}}" alt="{{firstPost.title}}">
</a>
<div class="event__body-card">
{% partial 'index/post_item' post = firstPost category = category %}
</div>
</div>
<div class="event__body-column">
{% for post_item in category.posts_filtered.splice(0,3)%}
{% partial 'index/post_item' post = post_item category = category %}
{% endfor %}
</div>
<div class="event__body-column">
{% for post_item in category.posts_filtered %}
{% partial 'index/post_item' post = post_item category = category%}
{% endfor %}
</div>
</div>
</div>
</div>
</div>
</section>

View File

@ -1,18 +1,18 @@
[viewBag]
[blogPosts] [blogPosts]
pageNumber = "{{ :page }}" pageNumber = "{{ :page }}"
postsPerPage = 6 postsPerPage = 6
noPostsMessage = "No posts found" noPostsMessage = "No posts found"
sortOrder = "published_at desc" sortOrder = "published_at desc"
categoryPage = "category" categoryPage = "category"
postPage = "category" postPage = "post"
exceptPost = "{{ :id }}" exceptPost = "{{ :id }}"
[viewBag]
== ==
<div class="news__sidebar-title"> <div class="news__sidebar-title">
{{'page.latest_news'|_}} {{'page.latest_news'|_}}
</div> </div>
{% for post in posts %}} {% for post in posts %}
<div class="card"> <div class="card">
<div class="card__header"> <div class="card__header">
<time class="news__date"> <time class="news__date">
@ -37,7 +37,7 @@ exceptPost = "{{ :id }}"
</div> </div>
</div> </div>
<a href="{{postPage|page({slug:post.slug,id:post.id})}}" class="card__link"> <a href="{{postPage|page({slug:post.slug,id:post.id})}}" class="card__link">
<h2>{{post.title}}</h2> <h6>{{post.title}}</h6>
</a> </a>
</div> </div>
{% endfor %} {% endfor %}

View File

@ -1,5 +1,5 @@
<div class="heading__row"> <div class="heading__row">
<a href="images/news/1.png" class="heading__image primary progressive replace"> <a href="{{'assets/images/news/1.png'|theme}}" class="heading__image primary progressive replace">
<picture> <picture>
<img class="preview" src="{{post.featured_image|media}}" alt=""> <img class="preview" src="{{post.featured_image|media}}" alt="">
@ -33,17 +33,15 @@
stroke-width="1" /> stroke-width="1" />
</g> </g>
</svg> </svg>
<span> <span>{{post.views}}</span>
480
</span>
</div> </div>
</div> </div>
<div class="heading__content-body"> <div class="heading__content-body">
<a href="#" > <a href="{{postPage|page({id:post.id,slug:post.slug})}}" >
<h2 class="heading__content-body-link">{{post.title}}</h2> <h2 class="heading__content-body-link">{{post.title}}</h2>
</a> </a>
<div class="heading__content-body-para"> <div class="heading__content-body-para">
{{post.excerpt}} {{post.summary|raw}}
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,67 +1,36 @@
[blogPosts]
pageNumber = "{{ :page }}"
postsPerPage = 6
noPostsMessage = "No posts found"
sortOrder = "published_at desc"
categoryPage = "category"
postPage = "post"
[viewBag]
==
<section class="hero"> <section class="hero">
<div class="auto__container"> <div class="auto__container">
<div class="hero__inner"> <div class="hero__inner">
<div class="slider"> <div class="slider">
<div class="slider__inner"> <div class="slider__inner">
{% for post in posts %}
<div class="slider__item"> <div class="slider__item">
<img src="images/news/2.png" alt=""> <img src="{{post.featured_image|media}}" alt="{{post.title}}">
{% if post.categories.count()>0%}
<div class="slider__item-category"> <div class="slider__item-category">
Культура, События {{post.categories.implode('name', ', ')}}
</div>
</div>
<div class="slider__item">
<img src="images/news/2.png" alt="">
<div class="slider__item-category">
Культура, События
</div>
</div>
<div class="slider__item">
<img src="images/news/2.png" alt="">
<div class="slider__item-category">
Культура, События
</div>
</div>
<div class="slider__item">
<img src="images/news/3.png" alt="">
<div class="slider__item-category">
Культура, События
</div>
</div>
<div class="slider__item">
<img src="images/news/2.png" alt="">
<div class="slider__item-category">
Культура, События
</div>
</div>
<div class="slider__item">
<img src="images/news/2.png" alt="">
<div class="slider__item-category">
Культура, События
</div> </div>
{% endif %}
</div> </div>
{% endfor %}
</div> </div>
<div class="slider__nav"> <div class="slider__nav">
<div class="slider__nav-inner"> <div class="slider__nav-inner">
<a class="active" href="#" data-slide="1"> {% for post in posts %}
<span>ORIENT вышел на ленту Euronews</span> <a class="active" href="#" data-slide="{{loop.index}}">
</a> <span>{{post.title}}</span>
<a href="#" data-slide="2">
<span>В Туркменистане определят лучших дизайнеров эксклюзивной одежды</span>
</a>
<a href="#" data-slide="3">
<span>Дубай создаст альянс по распределению вакцин от COVID-19</span>
</a>
<a href="#" data-slide="4">
<span>Хлопковая пряжа и нефтяной кокс что покупает зарубежный бизнес на
туркменской
бирже </span>
</a>
<a href="#" data-slide="5">
<span>ORIENT вышел на ленту Euronews</span>
</a>
<a href="#" data-slide="6">
<span>ORIENT вышел на ленту Euronews</span>
</a> </a>
{% endfor %}
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,6 +1,6 @@
[blogTags] [blogTags]
hideOrphans = 1 hideOrphans = 1
results = 10 results = 20
direction = "desc" direction = "desc"
[viewBag] [viewBag]
@ -9,9 +9,9 @@ direction = "desc"
{{'page.tags'|_}} {{'page.tags'|_}}
</div> </div>
<div class="main__sidebar-tag"> <div class="main__sidebar-tag">
{% for tag in tags %} {% for tag in blogTags.tags %}
<a class="main__sidebar-tag-link" href="{{tag.url}}"> <a class="main__sidebar-tag-link" href="{{'tag'|page({slug:tag.slug})}}">
{{tag.title}} {{tag.name}}
</a> </a>
{% endofr%} {% endfor%}
</div> </div>