С нами с 08.09.07
Сообщения: 296
Рейтинг: 375
|
Добавлено: 14/12/14 в 12:26 |
На движке имеем в админке настройку вывода релевантных роликов на странице показа видео. Вся настройка - это колличество выводимых релевантных роликов. НО! В блоке вывода рел роликов выводится и тумба ролика который сейчас смотрим. Ход мыслей разработчиков мне не совсем понятен (типа этот ролик подсвечивается через CSS как "сейчас вы смотрите") но в общем есть как есть. Все что можно в темплейтах и в CSS я выпилил. Тумба уже не подсвечивается и выводится в виде как все остальные релевантные тумбы.
Но совсем ее убрать не могу.
Как я понял , релевантность определяется по тегам из базы и плюс еще в коде определяется тумба ролика на котором стоим (что бы потом ее подсвечивать в темплейте).
Что нужно вкорячить в код , что бы запретить вывод этой тумбы? Вот собственно вся проблема..
КОД
Код: [развернуть] | public function get_related_videos($video_id)
{
global $config , $servers;
$video_info = Video::get_video_info($video_id);
$keyword = trim($video_info['video_keywords']);
$keyword = mysql_clean($keyword);
#echo $keyword;
$tag = new Tags($keyword, $video_id, '', '0||0');
$tags = $tag->get_tags();
unset($tag);
#echo "<pre>";print_r($tags);echo "</pre>";
$related_vid = array();
for ($i = 0; $i < count($tags); $i ++)
{
$sql = "SELECT tv.vid FROM
`tag_video` AS tv,
`tags` AS t WHERE
tv.tag_id=t.id AND
t.tag='" . mysql_clean($tags[$i]) . "'
GROUP BY tv.vid";
$result = mysql_query($sql) or mysql_die($sql);
while ($tmp_array = mysql_fetch_assoc($result))
{
$tmp = $tmp_array['vid'];
if (! in_array($tmp, $related_vid))
{
$related_vid[] = $tmp;
}
}
unset($tmp_array);
}
#echo count($related_vid);
if (count($related_vid) < 2)
{
$sql = "SELECT `video_id` FROM `videos` WHERE
`video_user_id`='" . (int) $video_info['video_user_id'] . "' AND
`video_type`='public' AND
`video_active`=1 AND
`video_approve`=1
ORDER BY `video_id` DESC";
$result = mysql_query($sql) or mysql_die($sql);
while ($tmp_array = mysql_fetch_assoc($result))
{
if (! in_array($tmp_array['video_id'], $related_vid))
{
$related_vid[] = $tmp_array['video_id'];
}
}
}
# Find Position Of Curent Video in related_vid array
$video_this = 0;
for ($i = 0; $i < count($related_vid); $i ++)
{
if ($related_vid[$i] == $video_id)
{
$video_this = $i;
break;
}
}
# Generate List of Related Videos
$array_index_start = $video_this - ($config['rel_video_per_page'] / 2);
if ($array_index_start < 0)
{
$array_index_start = 0;
if (count($related_vid) > $config['rel_video_per_page'])
{
$array_index_end = $config['rel_video_per_page'] - 1;
}
else
{
$array_index_end = count($related_vid) - 1;
}
}
if (! isset($array_index_end))
{
$array_index_end = $video_this + ($config['rel_video_per_page'] / 2);
if ($array_index_end > count($related_vid))
{
$array_index_end = count($related_vid) - 1;
}
}
#echo 'start' , $array_index_start , '<br />';
#echo 'end', $array_index_end;
#echo "<pre>"; print_r($related_vid);
$array_index_start = intval($array_index_start);
$array_index_end = intval($array_index_end);
for ($i = $array_index_start; $i <= $array_index_end; $i ++)
{
if (isset($related_vid[$i]))
{
$sql = "SELECT * FROM `videos` WHERE
`video_active`=1 AND
`video_approve`=1 AND
`video_type`='public' AND
`video_id`=" . (int) $related_vid[$i];
#echo "$i > $sql <br />";
$result = mysql_query($sql) or mysql_die($sql);
if (mysql_num_rows($result) == 1)
{
while ($related_video = mysql_fetch_assoc($result))
{
$related_video['video_thumb_url'] = $servers[$related_video['video_thumb_server_id']];
$related_videos[] = $related_video;
}
}
}
}
return $related_videos;
} |
Всем рейтинг за помощь парни!
|
|
|
|
💀💀💀
С нами с 31.05.10
Сообщения: 4689
Рейтинг: 728
|
Добавлено: 14/12/14 в 17:00 |
Текущий видос в релейтед я так понимаю всегда есть?
Код: |
# Find Position Of Curent Video in related_vid array
$video_this = 0;
for ($i = 0; $i < count($related_vid); $i ++)
{
if ($related_vid[$i] == $video_id)
{
$video_this = $i;
unset($related_vid[$i]); // удаляем видос текущий, но тут образуется пустой элемент.
$related_vid = array_values($related_vid); // сдвигаем массив, просто выбирая не пустые значения стандартной функцией.
break;
}
}
|
ваще меняй движок, говнокодище пиздец просто. Одни запросы мускула в цикле "фор" чего стоят....
|
|
|
|
С нами с 08.09.07
Сообщения: 296
Рейтинг: 375
|
Добавлено: 14/12/14 в 17:35 |
Ailk писал: | Текущий видос в релейтед я так понимаю всегда есть?
|
Да он всегда присутствует
Ailk писал: |
unset($related_vid[$i]); // удаляем видос текущий, но тут образуется пустой элемент.
|
Короче удалился один из релейтед роликов. Ида появился пустой элемент и релейтед видео стало на один меньше. Но текущее видео осталось ((
Ailk писал: |
$related_vid = array_values($related_vid); // сдвигаем массив, просто выбирая не пустые значения стандартной функцией.
|
Да эта строчка добавляет один релейтет ролик вместо пропавшего. В итоге приходим к тому же с чего начали ((
Ailk писал: |
ваще меняй движок, говнокодище пиздец просто. Одни запросы мускула в цикле "фор" чего стоят....
|
Да нагрузку он не держит - вабще беда (( Я его 4 года назад ставил. Мне пришлось сервак недавно под sql отдельный взять. При первой возможности избавлюсь от этого двига , но пока приходится с ним работать , никак по другому...
|
|
|
|
💀💀💀
С нами с 31.05.10
Сообщения: 4689
Рейтинг: 728
|
Добавлено: 14/12/14 в 18:09 |
Тогда в том блоке оставь как есть, а тот что ниже формирует уже готовый ряд:
Код: |
for ($i = $array_index_start; $i <= $array_index_end; $i ++)
{
if (isset($related_vid[$i]))
{
$sql = "SELECT * FROM `videos` WHERE
`video_active`=1 AND
`video_approve`=1 AND
`video_type`='public' AND
`video_id`=" . (int) $related_vid[$i];
#echo "$i > $sql <br />";
$result = mysql_query($sql) or mysql_die($sql);
if (mysql_num_rows($result) == 1)
{
while ($related_video = mysql_fetch_assoc($result))
{
$related_video['video_thumb_url'] = $servers[$related_video['video_thumb_server_id']];
if($related_video['id'] != $video_id ) // **
$related_videos[] = $related_video;
}
}
}
}
|
каммент с **
т.е. записываем только те, котрые не равны иду. Я не знаю какое там название для айдишника используется, подставь сам суда $related_video['id'] или как там $related_video['video_id']. Но тут выходное количество видео уменьшится на 1. Нада будет или $array_index_end увеличить на 1, или $array_index_start уменьшить на 1, но не меньше нуля.
|
|
|
|
💀💀💀
С нами с 31.05.10
Сообщения: 4689
Рейтинг: 728
|
Добавлено: 14/12/14 в 18:31 |
хатя стоп, оно все равно выбирает тока те видосы, которые есть массиве постоенном в начале, значит удалить айдишник релейт=айдишнику видео было бы достаточно.
попытка номер два удалить айдишник с первого массива
Код: |
# Find Position Of Curent Video in related_vid array
$video_this = 0;
$tmp_vid_id[] = $video_id; // для того чтоб вычесть один массив из другого стандартной функцией.
for ($i = 0; $i < count($related_vid); $i ++)
{
if ($related_vid[$i] == $video_id)
{
$video_this = $i;
$related_vid = array_diff($related_vid,$tmp_vid_id); // альтернативный вариант удаления вычитанием массивов
break;
}
}
|
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 14/12/14 в 18:35 |
Wicher писал: | # Find Position Of Curent Video in related_vid array
$video_this = 0;
for ($i = 0; $i < count($related_vid); $i ++)
{
if ($related_vid[$i] == $video_id)
{
$video_this = $i;
break;
}
} |
Чудный код.
Попробуй заменить на это
Код: | # Find Position Of Curent Video in related_vid array
$video_this = 0;
// $video_this = array_search($video_id, $related_vid); |
|
|
|
|
С нами с 18.10.02
Сообщения: 4165
Рейтинг: 3365
|
Добавлено: 14/12/14 в 18:48 |
Искать текущее видео вообще нету смысла. Поэтому этот поиск как и вычисление $array_index_start / $array_index_end
можно заменить на
Код: | $array_index_start = 0;
$array_index_end = min($config['rel_video_per_page'], count($related_vid)); |
Ну и в последнем блоке после
Код: | for ($i = $array_index_start; $i <= $array_index_end; $i ++)
{ |
добавить
Код: | if ($related_vid[$i] == $video_id) continue; |
чтобы пропустить текущее видео и не добавлять к массиву.
P.S. Ну и таки да, код эффективностью не блещет. Хотя полагаю там не только рилейтеды написаны в таком стиле, так что смысла оптимизировать что-то здесь немного.
|
|
|
|
С нами с 08.09.07
Сообщения: 296
Рейтинг: 375
|
Добавлено: 14/12/14 в 19:06 |
Ailk: Yacc:
Все варианты дают тот же результат - выпиливается одно видео из блока , но то которое проигрывается мать его остается на месте ((
Mika:
При таком раскладе генерируется блок где ролики совсем не релевантны проигрываемуму. Ну и проигрываемый на месте тоже остается , в чем вся и проблема...
Короче вот еще что. В смарти темплейте блок выводится так:
{section name=i loop=$view.related_videos}
тра ля ля css , титл урл тумба
{/section}
Короче я сделал так: {section name=i}
В итоге получил вывод всего одного релевантного ролика , но он сука отличный от проигрываемого!!
Может на мысль наведет...
|
|
|
|
💀💀💀
С нами с 31.05.10
Сообщения: 4689
Рейтинг: 728
|
Добавлено: 14/12/14 в 19:15 |
так может у тебя кеш смарти показывается?
|
|
|
|
С нами с 08.09.07
Сообщения: 296
Рейтинг: 375
|
Добавлено: 14/12/14 в 19:21 |
Ailk:
Не я папку с кэшем чищу постоянно и браузер в режиме приватности запускаю постоянно.
Я еще вот че нашел в этом долбаном скрипте.
Короче этот кусок кода что я приводил был из файла class.video.php
А еще есть файл view_video.php
И там на тему есть кусок кода:
Код: [развернуть] | # Related Videos Start
$related_videos = Video::get_related_videos($video_id);
$video_this = '';
for ($i = 0; $i < count($related_videos); $i ++)
{
if ($related_videos[$i]['video_id'] == $video_id)
{
$video_this = $i;
break;
}
}
if ($video_this === '')
{
$num_related_videos = count($related_videos);
if ($num_related_videos > 4)
{
$video_this = (int) $num_related_videos/2;
$related_videos[$video_this] = $video_info;
}
else if ($num_related_videos > 2)
{
$video_this = 0;
}
}
$view['related_videos'] = $related_videos;
$video_next = $video_this + 1;
$video_prev = $video_this - 1;
if (! isset($related_videos[$video_next]))
{
$view['video_next'] = 0;
}
else
{
$view['video_next'] = $related_videos["$video_next"];
}
if (! isset($related_videos[$video_prev]))
{
$view['video_prev'] = 0;
}
else
{
$view['video_prev'] = $related_videos["$video_prev"];
}
if (isset($_SESSION['UID']))
{
$sql = "SELECT * FROM `favourite` WHERE
`favourite_user_id`=" . (int) $_SESSION['UID'] . " AND
`favourite_video_id`=" . (int) $video_id;
$result = mysql_query($sql) or mysql_die($sql);
if (mysql_num_rows($result) == 1)
{
$smarty->assign('favourite', 1);
}
}
$sql = "SELECT `user_name`,`user_website` FROM `users` WHERE
`user_id`='" . (int) $video_info['video_user_id'] . "'";
$result = mysql_query($sql) or mysql_die($sql);
$user_info = mysql_fetch_assoc($result);
$view['user_info'] = $user_info;
Cache::save($cache_id, $view);
}
$html_title = htmlspecialchars_uni($video_info['video_title']);
$html_keywords = htmlspecialchars_uni($video_info['video_keywords']);
$html_description = htmlspecialchars_uni($video_info['video_description']);
$smarty->assign('html_description', $html_description);
$smarty->assign('html_title', $html_title);
$smarty->assign('html_keywords', $html_keywords);
$smarty->assign('view', $view);
} |
Емае может здесь что подправить?
|
|
|
|
С нами с 18.10.02
Сообщения: 4165
Рейтинг: 3365
|
Добавлено: 14/12/14 в 19:31 |
Wicher писал: | При таком раскладе генерируется блок где ролики совсем не релевантны проигрываемуму. |
Ага, признаю, через чур упросил
Wicher писал: | Ну и проигрываемый на месте тоже остается , в чем вся и проблема... |
А вот это странно. Ибо что Ailk выше приводил код, что я, видео с айдишником текущего, не попадает в $related_videos.
Wicher писал: |
А еще есть файл view_video.php
И там на тему есть кусок кода:
|
А этот кусок уже все объясняет, ибо удаляй не удаляй текущее видео в get_related_videos, а его снова в середину вхерачивают
|
|
|
|
💀💀💀
С нами с 31.05.10
Сообщения: 4689
Рейтинг: 728
|
Добавлено: 14/12/14 в 19:31 |
не, в исходном массиве, полученном из тагов нада удалить айдишник текущего видео и все. Может он там несколько раз повторяется ? Хотя по идее должно удалится еще и тогда, когда в окончательно варианте формируется выходной массив. вариант мики или мой с ифом **
упд. Мемкеш почисти, мож него показывается )) там вроде есть какой-то cache::save
|
|
|
|
С нами с 18.10.02
Сообщения: 4165
Рейтинг: 3365
|
Добавлено: 14/12/14 в 19:46 |
Ailk писал: | не, в исходном массиве, полученном из тагов нада удалить айдишник текущего видео и все. |
Не все, посмотри на второй код, там есть такое:
Код: | if ($video_this === '')
{
$num_related_videos = count($related_videos);
if ($num_related_videos > 4)
{
$video_this = (int) $num_related_videos/2;
$related_videos[$video_this] = $video_info;
}
else if ($num_related_videos > 2)
{
$video_this = 0;
}
} |
Поэтому имхо самым простым решением будет оставить функцию get_related_videos как есть, а в файле view_video.php
вместо
Код: | $view['related_videos'] = $related_videos;
$video_next = $video_this + 1;
$video_prev = $video_this - 1; |
написать
Код: | unset($related_videos[$video_this]);
$related_videos = array_values($related_videos);
$view['related_videos'] = $related_videos;
$video_next = $video_this;
$video_prev = $video_this-1; |
Это при условии конечно, что больше нигде $view['related_videos'] меняться не будет, и $video_this нигде после не используется в качестве айдишника текущего видео.
|
|
|
|
💀💀💀
С нами с 31.05.10
Сообщения: 4689
Рейтинг: 728
|
Добавлено: 14/12/14 в 19:55 |
да, но этот $related_videos в начале кода задается как раз функцией, и нигде больше не перезадается.
Код: | $related_videos = Video::get_related_videos($video_id); |
Поэтому логично было бы изначально убрать оттуда айдишник совпадающий с текущим видео.
|
|
|
|
С нами с 08.09.07
Сообщения: 296
Рейтинг: 375
|
Добавлено: 14/12/14 в 19:56 |
Короче парни не ломайте мозги. Заработало. Щас секунду напишу как!
|
|
|
|
С нами с 08.09.07
Сообщения: 296
Рейтинг: 375
|
Добавлено: 14/12/14 в 20:05 |
Файл
class.video.php
Делаем как предложил Ailk:
Тоесть добавляем две строчки
unset($related_vid[$i]); // удаляем видос текущий, но тут образуется пустой элемент.
$related_vid = array_values($related_vid); // сдвигаем массив, просто выбирая не пустые значения стандартной функцией.
Далее в файле view_video.php
Полностью удаляем вот это место
$video_this = '';
for ($i = 0; $i < count($related_videos); $i ++)
{
if ($related_videos[$i]['video_id'] == $video_id)
{
$video_this = $i;
break;
}
}
Все нах! Нужное колличество роликов выводится без текущего!
Спасибо огромное! Ваша помощь огромна. Всем рейтинг.
|
|
|
|
С нами с 18.10.02
Сообщения: 4165
Рейтинг: 3365
|
Добавлено: 14/12/14 в 20:06 |
Ailk писал: | да, но этот $related_videos в начале кода задается как раз функцией, и нигде больше не перезадается. |
А это что?
Код: | $video_this = (int) $num_related_videos/2;
$related_videos[$video_this] = $video_info; |
$video_info - это, если я верно понимаю, инфа от текущего видео. В результате, каким бы ни был $related_videos, если он не содержит текущее видео, то оно будет принудительно воткнуто на место среднего элемента.
|
|
|
|
💀💀💀
С нами с 31.05.10
Сообщения: 4689
Рейтинг: 728
|
Добавлено: 14/12/14 в 20:09 |
блиа, я даже внимания не обратил из-за названия переменной
|
|
|
|
С нами с 18.10.02
Сообщения: 4165
Рейтинг: 3365
|
Добавлено: 14/12/14 в 20:12 |
Wicher писал: | Полностью удаляем вот это место
...
Все нах! Нужное колличество роликов выводится без текущего! |
А ты про $video_next и $video_prev не забыл?
Хотя если в ссылках они не используются, то конечно пофиг.
|
|
|
|
💀💀💀
С нами с 31.05.10
Сообщения: 4689
Рейтинг: 728
|
Добавлено: 14/12/14 в 20:15 |
Wicher писал: | Файл
class.video.php
Делаем как предложил Ailk:
Тоесть добавляем две строчки
unset($related_vid[$i]); // удаляем видос текущий, но тут образуется пустой элемент.
$related_vid = array_values($related_vid); // сдвигаем массив, просто выбирая не пустые значения стандартной функцией.
Далее в файле view_video.php
Полностью удаляем вот это место
$video_this = '';
for ($i = 0; $i < count($related_videos); $i ++)
{
if ($related_videos[$i]['video_id'] == $video_id)
{
$video_this = $i;
break;
}
}
Все нах! Нужное колличество роликов выводится без текущего!
Спасибо огромное! Ваша помощь огромна. Всем рейтинг. |
это не выход ) все равно может попастца. Потому что по логике скрипта выбираются слева и справа от текущего видоса из массива релятивные, а если ты удалил, то с 1 по нужную выберется, и в ней может содержатся видео котрое смотришь.
|
|
|
|
С нами с 08.09.07
Сообщения: 296
Рейтинг: 375
|
Добавлено: 14/12/14 в 20:21 |
Mika писал: | А ты про $video_next и $video_prev не забыл?
Хотя если в ссылках они не используются, то конечно пофиг. |
Я короче просто взял начиисто файлы еще до редактирования , поправил class.video.php как в самом начале Ailk: советовал и удалил в файле view_video.php кусок кода. Все идеально просто все на месте все ссылки, все!
Кстатии я попробовал только view_video.php править - хрен. Работает только с исправленным class.video.php Ну и на оборот естественно тоже не работает..
|
|
|
|
С нами с 08.09.07
Сообщения: 296
Рейтинг: 375
|
Добавлено: 14/12/14 в 20:23 |
Ailk писал: | это не выход ) все равно может попастца. Потому что по логике скрипта выбираются слева и справа от текущего видоса из массива релятивные, а если ты удалил, то с 1 по нужную выберется, и в ней может содержатся видео котрое смотришь. |
Ну блин уже что то...
Мне конечно 4k роликов не прощелкать , но потыкал щас - ниразу не попалось...
|
|
|
|
С нами с 17.08.11
Сообщения: 61
Рейтинг: 62
|
Добавлено: 14/12/14 в 21:31 |
Вместо
Код: | for ($i = 0; $i < count($related_videos); $i ++) |
сделайте foreach. Или хотя бы так:
Код: | for ($i = 0, $count = count($related_videos); $i < $count; $i ++) |
А массив рилейтед формируйте в новой переменной.
И да, вот это:
Код: | for ($related_vid... {
unset($related_vid[$i]);
$related_vid = array_values($related_vid);
...} |
кто делает unset элемента внутри цикла обхода элементов массива и к тому же переназначает его? Это говнокод похлеще того, что у ТС.
|
|
|
|
С нами с 08.09.07
Сообщения: 296
Рейтинг: 375
|
Добавлено: 14/12/14 в 21:52 |
ravlio писал: | Вместо
Код: | for ($i = 0; $i < count($related_videos); $i ++) |
сделайте foreach. Или хотя бы так:
Код: | for ($i = 0, $count = count($related_videos); $i < $count; $i ++) |
|
Если так то ненужная тумба открытого ролика появляется буквально в каждом третем ролике..
ravlio писал: |
А массив рилейтед формируйте в новой переменной.
|
Буду признателен если подскажете как.
ravlio писал: |
И да, вот это:
Код: | for ($related_vid... {
unset($related_vid[$i]);
$related_vid = array_values($related_vid);
...} |
кто делает unset элемента внутри цикла обхода элементов массива и к тому же переназначает его? Это говнокод похлеще того, что у ТС. |
Ну это же не скажется на скорости работы скрипта?..
|
|
|
|
💀💀💀
С нами с 31.05.10
Сообщения: 4689
Рейтинг: 728
|
Добавлено: 14/12/14 в 22:00 |
ravlio писал: | Вместо
Код: | for ($i = 0; $i < count($related_videos); $i ++) |
сделайте foreach. Или хотя бы так:
Код: | for ($i = 0, $count = count($related_videos); $i < $count; $i ++) |
А массив рилейтед формируйте в новой переменной.
И да, вот это:
Код: | for ($related_vid... {
unset($related_vid[$i]);
$related_vid = array_values($related_vid);
...} |
кто делает unset элемента внутри цикла обхода элементов массива и к тому же переназначает его? Это говнокод похлеще того, что у ТС. |
ой да ладно нудить, ниче что это последняя итерация и выход из цикла?
|
|
|
|