Приведенный ниже код можно вставить в ELiS для получения блока с популярными ресурсами.
Данный код на больших экранах (на малых и средних скрывается) выводит самые популярные ресурсы по просмотрам в плеерах за последние 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>