Приведенный ниже код можно вставить в ELiS для получения блока с популярными ресурсами.
https://demo.elibsystem.ru/vod3/storage/demoelibsystem_popular_resources_block-j266w1280h720.mp4
Данный код на больших экранах (на малых и средних скрывается) выводит самые популярные ресурсы по просмотрам в плеерах за последние 30 дней, 7 дней, 1 день, 1 час. При этом ресурсы не повторяются.
Код блока для горизонтальной карусели[править]
<?php
$base_url = $GLOBALS['base_url'];
$limit = 15;
$popular['month'] = array('time'=>'-30 day', 'title'=>'за месяц', 'nodes'=>[]);
$popular['week'] = array('time'=>'-7 day', 'title'=>'за неделю', 'nodes'=>[]);
$popular['day'] = array('time'=>'-1 day', 'title'=>'за сутки', 'nodes'=>[]);
$popular['hour'] = array('time'=>'-1 hour', 'title'=>'за час', 'nodes'=>[]);
$not_nid = array(); // for nids that can not visible
foreach ($popular as $key=>$res) {
$startDateTime = new DateTime();
$startDateTime ->modify($res['time']);
$query = db_select('elis_play_log', 'p')->fields('p', array('nid'));
$query->condition("p.start_timestamp",$startDateTime ->getTimestamp(),">");
$query->addExpression('count(nid)', 'nid_playlog_count');
if (count($not_nid)) {
$query->condition("p.nid", $not_nid, "NOT IN");
}
$query->groupBy("p.nid");
$query->orderBy('nid_playlog_count', 'DESC');
$query->range(0,$limit);
$results = $query->execute()->fetchAll();
$popular[$key]['nodes'] = $results;
foreach ($results as $r) {
$not_nid[] = $r->nid; // find same node only once
}
}
print "<div style='display: flex; justify-content: center;' class='hidden-xs hidden-sm hidden-md' aria-hidden='true'>";
foreach ($popular as $key=>$res) {
if (count($res['nodes']) == 0) continue;
$id = 'carousel-elis-popular-' . $key;
print "<div id='$id' class='carousel slide' data-ride='carousel' style='width: 20%;'>";
print " <div style='background: #777; color: #fff; text-align: center;'>Популярное {$res['title']}</div>";
print " <div class='carousel-inner' role='listbox'>";
foreach ($res['nodes'] as $i=>$node) {
$node_obj = node_load($node->nid);
if ($node_obj !== false && node_access("view", $node_obj)) {
$font_size = strlen($node_obj->title) > 20 ? 10 : 12;
print "<div class='item" . ($i == 0? " active": "") . "' style='background: rgba(0,0,0,.2);'>";
print " <a href='{$base_url}/node/{$node->nid}' style='text-align: center;'>";
print " <img src='{$base_url}/node/{$node->nid}/cover' style='height: 240px; object-fit: scale-down; width: 100%;'/>";
print " <div class='carousel-caption' style='background: rgba(0,0,0,.6); border-radius: 2px; padding: 0.5em; word-break: break-word; overflow: hidden; font-size: {$font_size}px; text-overflow: ellipsis;'>" .
check_plain($node_obj->title) . "</div>";
print " </a>";
print "</div>";
}
}
print " </div>";
print " <a class='left carousel-control' href='#$id' role='button' data-slide='prev'>";
print " <span class='glyphicon glyphicon-chevron-left' aria-hidden='true'></span>";
print " <span class='sr-only'>Previous</span>";
print " </a>";
print " <a class='right carousel-control' href='#$id' role='button' data-slide='next'>";
print " <span class='glyphicon glyphicon-chevron-right' aria-hidden='true'></span>";
print " <span class='sr-only'>Next</span>";
print " </a>";
print "</div>";
}
print "</div>";
?>
Куда добавить[править]
По URL admin/structure/block/add добавьте блок, скопипастив в него описанный выше код. Формат текста должен быть PHP code. Настройте на каких страницах блок будет отображаться, область региона можно выбрать "содержимое" (content).
Код блока для вертикальной карусели[править]
Этот код аналогичен горизонтальной карусели, но его можно размещать в боковые панели.
<?php
$base_url = $GLOBALS['base_url'];
$limit = 10;
$popular['month'] = array('time'=>'-30 day', 'title'=>'за месяц', 'nodes'=>[]);
$popular['week'] = array('time'=>'-7 day', 'title'=>'за неделю', 'nodes'=>[]);
$popular['day'] = array('time'=>'-1 day', 'title'=>'за сутки', 'nodes'=>[]);
$popular['hour'] = array('time'=>'-1 hour', 'title'=>'за час', 'nodes'=>[]);
$not_nid = array(); // for nids that can not visible
foreach ($popular as $key=>$res) {
$startDateTime = new DateTime();
$startDateTime ->modify($res['time']);
$query = db_select('elis_play_log', 'p')->fields('p', array('nid'));
$query->condition("p.start_timestamp",$startDateTime ->getTimestamp(),">");
$query->addExpression('count(nid)', 'nid_playlog_count');
if (count($not_nid)) {
$query->condition("p.nid", $not_nid, "NOT IN");
}
$query->groupBy("p.nid");
$query->orderBy('nid_playlog_count', 'DESC');
$query->range(0,$limit);
$results = $query->execute()->fetchAll();
$popular[$key]['nodes'] = $results;
foreach ($results as $r) {
$not_nid[] = $r->nid; // find same node only once
}
}
print "<div id='popular-content-wrapper' style='display: flex; justify-content: center; flex-direction: column;' class='hidden-xs hidden-sm hidden-md hidden' aria-hidden='true'>";
foreach ($popular as $key=>$res) {
if (count($res['nodes']) == 0) continue;
$id = 'carousel-elis-popular-' . $key;
print "<div id='$id' class='carousel slide' data-ride='carousel' style='width: 100%;'>";
print " <div style='background: #777; color: #fff; text-align: center;'>Популярное {$res['title']}</div>";
print " <div class='carousel-inner' role='listbox'>";
foreach ($res['nodes'] as $i=>$node) {
$node_obj = node_load($node->nid);
if ($node_obj !== false && node_access("view", $node_obj)) {
$font_size = strlen($node_obj->title) > 20 ? 10 : 12;
print "<div class='item" . ($i == 0? " active": "") . "' style='background: rgba(0,0,0,.2);'>";
print " <a href='{$base_url}/node/{$node->nid}' style='text-align: center;'>";
print " <img src='{$base_url}/node/{$node->nid}/cover' style='height: 240px; object-fit: scale-down; width: 100%;'/>";
print " <div class='carousel-caption' style='background: rgba(0,0,0,.6); border-radius: 2px; padding: 0.5em; word-break: break-word; overflow: hidden; font-size: {$font_size}px; text-overflow: ellipsis;'>" . check_plain($node_obj->title) .
"</div>";
print " </a>";
print "</div>";
}
}
print " </div>";
print " <a class='left carousel-control' href='#$id' role='button' data-slide='prev'>";
print " <span class='glyphicon glyphicon-chevron-left' aria-hidden='true'></span>";
print " <span class='sr-only'>Previous</span>";
print " </a>";
print " <a class='right carousel-control' href='#$id' role='button' data-slide='next'>";
print " <span class='glyphicon glyphicon-chevron-right' aria-hidden='true'></span>";
print " <span class='sr-only'>Next</span>";
print " </a>";
print "</div>";
}
print "</div>";
print "<script>jQuery(window).on('load', function(){ jQuery('#popular-content-wrapper').removeClass('hidden'); });</script>";
?>
При вертикальном размещении в правой панели (sidebar secondary), возможно стоит ограничить размер панели с помощью добавления блока с кодом:
<style>#sidebar-secondary {max-width: 180px;}</style>