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
хатя стоп, оно все равно выбирает тока те видосы, которые есть массиве постоенном в начале, значит удалить айдишник релейт=айдишнику видео было бы достаточно.
попытка номер два удалить айдишник с первого массива smail101.gif
Код:

# 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;
            }
        }

Чудный код. smail101.gif

Попробуй заменить на это
Код:
# 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
так может у тебя кеш смарти показывается? smail101.gif
цитата
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);
}
Емае может здесь что подправить? icon_mad.gif
цитата
14/12/14 в 19:31
 Mika
Wicher писал:
При таком раскладе генерируется блок где ролики совсем не релевантны проигрываемуму.

Ага, признаю, через чур упросил icon_smile.gif

Wicher писал:
Ну и проигрываемый на месте тоже остается , в чем вся и проблема...

А вот это странно. Ибо что Ailk выше приводил код, что я, видео с айдишником текущего, не попадает в $related_videos.

Wicher писал:

А еще есть файл view_video.php
И там на тему есть кусок кода:

А этот кусок уже все объясняет, ибо удаляй не удаляй текущее видео в get_related_videos, а его снова в середину вхерачивают icon_smile.gif
цитата
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
блиа, я даже внимания не обратил из-за названия переменной smail101.gif
цитата
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  >  последняя »


Эта страница в полной версии