Master-X
Регистрация
|
Вход
Форум
|
Новости
|
Статьи
Главная
»
Форум
»
Программинг, Скрипты, Софт, Сервисы
»
Тема:
Маленькая проблемка - PHP гуру выручайте!
Новая тема
Ответить
цитата
14/12/14 в 12:26
Wicher
На движке имеем в админке настройку вывода релевантных роликов на странице показа видео. Вся настройка - это колличество выводимых релевантных роликов. НО! В блоке вывода рел роликов выводится и тумба ролика который сейчас смотрим. Ход мыслей разработчиков мне не совсем понятен (типа этот ролик подсвечивается через 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;
}
Всем рейтинг за помощь парни!
цитата
14/12/14 в 17:00
Ailk
Текущий видос в релейтед я так понимаю всегда есть?
Код:
# 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;
}
}
ваще меняй движок, говнокодище пиздец просто. Одни запросы мускула в цикле "фор" чего стоят....
цитата
14/12/14 в 17:35
Wicher
Ailk писал:
Текущий видос в релейтед я так понимаю всегда есть?
Да он всегда присутствует
Ailk писал:
unset($related_vid[$i]); // удаляем видос текущий, но тут образуется пустой элемент.
Короче удалился один из релейтед роликов. Ида появился пустой элемент и релейтед видео стало на один меньше. Но текущее видео осталось ((
Ailk писал:
$related_vid = array_values($related_vid); // сдвигаем массив, просто выбирая не пустые значения стандартной функцией.
Да эта строчка добавляет один релейтет ролик вместо пропавшего. В итоге приходим к тому же с чего начали ((
Ailk писал:
ваще меняй движок, говнокодище пиздец просто. Одни запросы мускула в цикле "фор" чего стоят....
Да нагрузку он не держит - вабще беда (( Я его 4 года назад ставил. Мне пришлось сервак недавно под sql отдельный взять. При первой возможности избавлюсь от этого двига , но пока приходится с ним работать , никак по другому...
цитата
14/12/14 в 18:09
Ailk
Тогда в том блоке оставь как есть, а тот что ниже формирует уже готовый ряд:
Код:
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, но не меньше нуля.
цитата
14/12/14 в 18:31
Ailk
хатя стоп, оно все равно выбирает тока те видосы, которые есть массиве постоенном в начале, значит удалить айдишник релейт=айдишнику видео было бы достаточно.
попытка номер два удалить айдишник с первого массива
Код:
# 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;
}
}
цитата
14/12/14 в 18:35
Yacc
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);
цитата
14/12/14 в 18:48
Mika
Искать текущее видео вообще нету смысла. Поэтому этот поиск как и вычисление $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. Ну и таки да, код эффективностью не блещет. Хотя полагаю там не только рилейтеды написаны в таком стиле, так что смысла оптимизировать что-то здесь немного.
цитата
14/12/14 в 19:06
Wicher
Ailk:
Yacc:
Все варианты дают тот же результат - выпиливается одно видео из блока , но то которое проигрывается мать его остается на месте ((
Mika:
При таком раскладе генерируется блок где ролики совсем не релевантны проигрываемуму. Ну и проигрываемый на месте тоже остается , в чем вся и проблема...
Короче вот еще что. В смарти темплейте блок выводится так:
{section name=i loop=$view.related_videos}
тра ля ля css , титл урл тумба
{/section}
Короче я сделал так: {section name=i}
В итоге получил вывод всего одного релевантного ролика , но он сука отличный от проигрываемого!!
Может на мысль наведет...
цитата
14/12/14 в 19:15
Ailk
так может у тебя кеш смарти показывается?
цитата
14/12/14 в 19:21
Wicher
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);
}
Емае может здесь что подправить?
цитата
14/12/14 в 19:31
Mika
Wicher писал:
При таком раскладе генерируется блок где ролики совсем не релевантны проигрываемуму.
Ага, признаю, через чур упросил
Wicher писал:
Ну и проигрываемый на месте тоже остается , в чем вся и проблема...
А вот это странно. Ибо что Ailk выше приводил код, что я, видео с айдишником текущего, не попадает в $related_videos.
Wicher писал:
А еще есть файл view_video.php
И там на тему есть кусок кода:
А этот кусок уже все объясняет, ибо удаляй не удаляй текущее видео в get_related_videos, а его снова в середину вхерачивают
цитата
14/12/14 в 19:31
Ailk
не, в исходном массиве, полученном из тагов нада удалить айдишник текущего видео и все. Может он там несколько раз повторяется ? Хотя по идее должно удалится еще и тогда, когда в окончательно варианте формируется выходной массив. вариант мики или мой с ифом **
упд. Мемкеш почисти, мож него показывается )) там вроде есть какой-то cache::save
цитата
14/12/14 в 19:46
Mika
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 нигде после не используется в качестве айдишника текущего видео.
цитата
14/12/14 в 19:55
Ailk
да, но этот
$related_videos
в начале кода задается как раз функцией, и нигде больше не перезадается.
Код:
$related_videos = Video::get_related_videos($video_id);
Поэтому логично было бы изначально убрать оттуда айдишник совпадающий с текущим видео.
цитата
14/12/14 в 19:56
Wicher
Короче парни не ломайте мозги. Заработало. Щас секунду напишу как!
цитата
14/12/14 в 20:05
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;
}
}
Все нах! Нужное колличество роликов выводится без текущего!
Спасибо огромное! Ваша помощь огромна. Всем рейтинг.
цитата
14/12/14 в 20:06
Mika
Ailk писал:
да, но этот
$related_videos
в начале кода задается как раз функцией, и нигде больше не перезадается.
А это что?
Код:
$video_this = (int) $num_related_videos/2;
$related_videos[$video_this] = $video_info;
$video_info - это, если я верно понимаю, инфа от текущего видео. В результате, каким бы ни был $related_videos, если он не содержит текущее видео, то оно будет принудительно воткнуто на место среднего элемента.
цитата
14/12/14 в 20:09
Ailk
блиа, я даже внимания не обратил из-за названия переменной
цитата
14/12/14 в 20:12
Mika
Wicher писал:
Полностью удаляем вот это место
...
Все нах! Нужное колличество роликов выводится без текущего!
А ты про $video_next и $video_prev не забыл?
Хотя если в ссылках они не используются, то конечно пофиг.
цитата
14/12/14 в 20:15
Ailk
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 по нужную выберется, и в ней может содержатся видео котрое смотришь.
цитата
14/12/14 в 20:21
Wicher
Mika писал:
А ты про $video_next и $video_prev не забыл?
Хотя если в ссылках они не используются, то конечно пофиг.
Я короче просто взял начиисто файлы еще до редактирования , поправил class.video.php как в самом начале
Ailk:
советовал и удалил в файле view_video.php кусок кода. Все идеально просто все на месте все ссылки, все!
Кстатии я попробовал только view_video.php править - хрен. Работает только с исправленным class.video.php Ну и на оборот естественно тоже не работает..
цитата
14/12/14 в 20:23
Wicher
Ailk писал:
это не выход ) все равно может попастца. Потому что по логике скрипта выбираются слева и справа от текущего видоса из массива релятивные, а если ты удалил, то с 1 по нужную выберется, и в ней может содержатся видео котрое смотришь.
Ну блин уже что то...
Мне конечно 4k роликов не прощелкать , но потыкал щас - ниразу не попалось...
цитата
14/12/14 в 21:31
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 элемента внутри цикла обхода элементов массива и к тому же переназначает его? Это говнокод похлеще того, что у ТС.
цитата
14/12/14 в 21:52
Wicher
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 элемента внутри цикла обхода элементов массива и к тому же переназначает его? Это говнокод похлеще того, что у ТС.
Ну это же не скажется на скорости работы скрипта?..
цитата
14/12/14 в 22:00
Ailk
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 элемента внутри цикла обхода элементов массива и к тому же переназначает его? Это говнокод похлеще того, что у ТС.
ой да ладно нудить, ниче что это последняя итерация и выход из цикла?
Стр.
1
,
2
>
последняя »
Новая тема
Ответить
Эта страница в полной версии