Файл: adultscript-2.0.3-pro/files/modules/video/components/related.php
Строк: 85
<?php
defined('_VALID') or die('Restricted Access!');
class VComponent_video_related extends VModule_video
{
public function __construct()
{
parent::__construct();
}
public function render()
{
$query = VUri::query();
$video_id = (isset($query['1'])) ? (int) $query['1'] : 0;
$page = (isset($query['2'])) ? (int) $query['2'] : 1;
$url = 'related/'.$video_id.'/';
if ($page !== 0 && $page !== 1) {
$url .= $page.'/';
}
if (!VUri::match($url)) {
VModule::load('404', TRUE);
}
$this->db->query("SELECT v.video_id, v.title,
GROUP_CONCAT(DISTINCT c.cat_id) AS categories,
GROUP_CONCAT(DISTINCT t.name) AS tags
FROM #__video AS v
INNER JOIN #__video_category AS c ON (c.video_id = v.video_id)
INNER JOIN #__video_tags AS t ON (t.video_id = v.video_id)
WHERE v.video_id = ".$video_id."
AND v.status = 1");
if ($this->db->affected_rows()) {
$video = $this->db->fetch_assoc();
}
if (!isset($video)) {
VModule::load('404', TRUE);
}
VLanguage::load('frontend.video');
$related = (VCfg::get('video.related_method') == 'simple')
? $this->get_related_simple($video_id, $video['title'], $page)
: $this->get_related_complex($video_id, $video['tags'], $page);
$this->tpl->menu = 'video';
$this->tpl->meta_title = __('related-meta-title', array(e($video['title'])));
$this->tpl->meta_desc = __('related-meta-desc', array(e($video['title']), $page, $this->tpl->cfg['site_name']));
$this->tpl->meta_keys = $video['tags'];
$this->tpl->video = $video;
$this->tpl->related = $related['videos'];
$this->tpl->pagination = $related['pagination'];
$this->tpl->load(array('header', 'video_browse', 'footer'));
$this->tpl->display();
}
private function get_related_simple($video_id, $title, $page)
{
$title = $this->db->escape($title);
$sql_count = "SELECT COUNT(*) AS total_related
FROM #__video AS v
WHERE MATCH (v.title) AGAINST ('".$title."')
AND v.status = 1";
$total_videos = $this->db->get_field($sql_count, 'total_related');
$pagination = VPagination::get($page, $total_videos, VCfg::get('video.browse_per_page'));
$sql = "SELECT v.video_id, v.title, v.slug, v.rating, v.rated_by, v.duration, v.thumb,
v.thumbs, v.total_views, v.add_time, v.ext, v.hd, v.premium, u.username,
MATCH (v.title) AGAINST ('".$title."') AS relevance
FROM #__video AS v
LEFT JOIN #__user AS u ON (u.user_id = v.user_id)
WHERE MATCH (v.title) AGAINST ('".$title."')
AND v.status = 1
AND v.video_id != ".$video_id."
ORDER BY relevance DESC
LIMIT ".$pagination['limit'];
return array(
'videos' => $this->db->get_rows($sql),
'pagination' => $pagination
);
}
private function get_related_complex($video_id, $tags, $title)
{
$host = VF::cfg_item('sphinx_host');
$port = VF::cfg_item('sphinx_port');
if (empty($host) OR empty($port)) {
throw new VException('Please set your sphinx search engine host and port!');
}
$per_page = VCfg::get('video.browse_per_page');
$offset = ($page >= 2) ? (($page - 1) * $browse_per_page) : 0;
VF::load('sphinxapi.sphinxapi');
$sphinx = new SphinxClient();
$sphinx->SetServer($host, $port);
$sphinx->SetConnectTimeout(1);
$sphinx->SetFieldWeights(array('tags' => 100, 'title' => 70, 'description' => 30));
$sphinx->SetFilter('video', array($video_id), true);
$sphinx->SetMatchMode(SPH_MATCH_ANY);
$sphinx->SetLimits($offset, $per_page, $offset+$per_page);
$tags = str_replace(',', ' ', VText::truncate_words($tags, 40, ''));
$results = $sphinx->Query($tags, 'videos');
if (isset($results['total']) && isset($results['matches'])) {
$ids = implode(',', array_keys($results['matches']));
$sql = "SELECT v.video_id, v.title, v.slug, v.rating, v.rated_by, v.duration, v.thumb,
v.thumbs, v.total_views, v.add_time, v.ext, v.hd, v.premium, u.username
FROM #__video AS v
LEFT JOIN #__user AS u on (u.user_id = v.user_id)
WHERE v.video_id IN (".$ids.")
ORDER BY FIELD (v.video_id, ".$ids.")";
return array(
'pagination' => VPagination::get($page, $results['total_found'], $per_page),
'videos' => $this->db->get_rows($sql)
);
}
return array(
'pagination' => array(),
'videos' => array()
);
}
}