Смена изображения и ссылки при обновлении страницы

Тема в разделе "Как сделать...", создана пользователем GLOOMY, 30 май 2013.

  1. GLOOMY

    GLOOMY Постоялец

    Регистр.:
    24 авг 2009
    Сообщения:
    71
    Симпатии:
    6
    Дорогие друзья!

    Недавно возникла задача, нужно над тизерами новостных агрегаторов, поставить несколько своих, да так чтобы они были похожи по размеру, и менялись при обновлении страницы.

    Сама задача состоит так:
    1. Есть два рекламируемых сайта
    2. Для каждого из них нужно сделать по два тизера, они должны меняться при обновлении
    3. У каждого тизера есть ссылка на свою страницу
    4. При клике по тизеру окно должно открываться в новой вкладке
    5. Под тизером должна быть ссылка с анкором
    Т.е. для одного сайта два тизера и для другого сайта два тизера. При загрузки страницы показывается только два тизера, один для одного сайта, а второй для другого, и при обновлении они меняются.

    Долго искал нужный JavaScript, и наткнулся на такой:
    Код:
    <script language="JavaScript">
    <!--
    function random_imglink(){
    var myimages=new Array()
    //specify random images below. You can have as many as you wish
    myimages[1]="/advert/exchanger/site1pic1.jpg"
    myimages[2]="/advert/exchanger/site1pic2.jpg"
    myimages[1]="/advert/exchanger/site2pic1.jpg"
    myimages[2]="/advert/exchanger/site2pic2.jpg"
     
    //specify corresponding links below
    var imagelinks=new Array()
    imagelinks[1]="http://site1.ru/link1.html"
    imagelinks[2]="http://site1.ru/link2.html"
    imagelinks[1]="http://site2.ru/link1.html"
    imagelinks[2]="http://site2.ru/link2.html"
     
    var ry=Math.floor(Math.random()*myimages.length)
    if (ry==0)
    ry=1
    document.write('<a href='+'"'+imagelinks[ry]+'"'+'><img src="'+myimages[ry]+'" border=0></a>')
    }
    random_imglink()
    //-->
    </script>
    Однако данный код не подошел, так как ссылки и картинки он крутит рандомно, так же ссылки открываются в родительском окне. Вторая же причина в том, что под тизерами еще нужно сделать ссылки с анкорами, если их вписать под кодом в шаблон вручную, то придется для двух сайтов вешать два кода.

    Помогите решить задачу. Заранее всем очень благодарен!
     
  2. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    884
    Симпатии:
    540
    чтобы открывал в новом онке сделай
    <a target="_blank" href='+'"'+imagelinks[ry]+'"'+'>

    чтобы показывал ссылки не рандомно- тут нужно сделать в куках счётчик и заменить var ry=Math.floor(Math.random()*myimages.length) на этот счётчик
    типо чтото
    banner_i = getCookie('banner_i') ;
    if (!banner_i || banner_i >= myimages.length){
    banner_i =0;
    }
    setCookie ('banner_i', banner_i+1 )

    //specify corresponding links below
    Аналогично с myimages

    var imagelinks1=new Array()

    var imagelinks2=new Array()

    imagelinks1[1]="Перейти по ссылке"
    imagelinks1[2]="Перейти по ссылке"
    imagelinks2[1]="Перейти по ссылке"
    imagelinks2[2]="Перейти по ссылке"

    document.write('<a href='+'"'+imagelinks1[ry]+'"'+'><img src="'+myimages1[ry]+'" border=0></a>')
    document.write('<a href='+'"'+imagelinks2[ry]+'"'+'><img src="'+myimages2[ry]+'" border=0></a>')
     
    GLOOMY2009 нравится это.
  3. GLOOMY

    GLOOMY Постоялец

    Регистр.:
    24 авг 2009
    Сообщения:
    71
    Симпатии:
    6
    Что-то я запутался совсем, где что менять...

    В общем нарыл я другой способ на PHP:

    Для создания тизерного блока вставляем в нужное место своего шаблона следующий код:
    PHP:
    <table><tr>
    <?
    $ini='tizer.txt';
    $adv=file($ini);
    $c=6;
    $out = mt_rand(0, count($adv) - $c);
    $sad=$out+$c;
    for($i = $out; $iuu < $sad; $i++) {
    $item = explode('::',$adv[$i]);
    $item[2]=trim($item[2]);
    print "<td style='text-align:center;'><a target=_blank href='$item[2]'><img src='$item[0]' alt='$item[1]'><br/>$item[1]</a></td>";
    }
    ?>
    </tr></table>
    Изменить цифру в переменной $c на необходимое количество тизеров в выводимом блоке.
    Текстовый файл tizer.txt, который необходимо разместить в корне сайта, заполняем данными по ниже приведенному шаблону, данные для каждого определенного тизера должны располагаться на своей строке:
    Код:
    http://URL_КАРТИНКИ.jpg::Заголовок поста::http://URL_ПОСТА
    В предоставленном скрипте тизеры в рекламном блоке будут располагаться горизонтально, для вертикального расположения - переместить открывающий и закрывающий теги TR внутрь кавычек последнего куска php кода (print).

    1. Создал файл PHP, вставил в него код, и закинул в /engine/modules/
    2. Создал текстовый файл tizer.txt и закинул его в корень папки
    3. В шаблоне вставил тег {include file=«engine/modules/exchanger.php»}
    Однако на сайте этот тег выводится просто текстом. Что я сделал не так?

    Версия DLE: 9.3
     
  4. wendel

    wendel Создатель

    Регистр.:
    6 ноя 2011
    Сообщения:
    12
    Симпатии:
    7
    Накидал код:

    engine/modules/tizer.php

    PHP:
    <?php
     
    $tizerFiles 
    = array(
        
    'tizer1.txt',
        
    'tizer2.txt',
    );
     
    foreach ( 
    $tizerFiles as $tizerFile )
    {
        
    $tizerList fileROOT_DIR '/' $tizerFile );
        
    $cookieName md5$tizerFile );
        
    $tizerCookie = ( isset( $_COOKIE[$cookieName] ) ) ? $_COOKIE[$cookieName] : FALSE;
        
    $tizerCount count$tizerList );
     
        while ( 
    true )
        {
            
    $rand "" rand(1,$tizerCount)-"";
            if ( 
    $rand !== $tizerCookie )
            {
                
    setCookie$cookieName$rand );
                
    $data explode'::'$tizerList[$rand] );
                echo 
    '<div><a href="' $data[2] . '" target="_blank" title="' $data[1] . '"><img src="' $data[0] . '"></a></div>';
                break;
            }
        }
    }
    Корневая директория:

    tizer1,2.txt

    Код:
    http://картинка::Заголовок поста 1::http://google.com
    http://картинка::Заголовок поста 2::http://google.com
    
    В шаблоне:

    {include file="engine/modules/tizer.php"}
     
    Горбушка нравится это.
  5. GLOOMY

    GLOOMY Постоялец

    Регистр.:
    24 авг 2009
    Сообщения:
    71
    Симпатии:
    6
    Подключил, и чуть не положил сервер.
    Использование процессора дошло до 79%, хостеры хотели заблокировать аккаунт. Когда убрал, все стало спокойно.

    Ну и пока сервер глючил, я успел заметить что "::Заголовок поста 1::" идет просто как title к картинке, а нужно чтобы выводилось ссылкой под картинкой. Т.е. чтобы и картинка была кликабельна, и дополнительно ссылка с заголовком поста снизу.

    P.S. tizer1.txt и tizer2.txt выводят информеры для разных сайтов?
     
  6. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    884
    Симпатии:
    540
    жёстко. Код
    Код:
      $rand = "" . rand(1,$tizerCount)-1 . "";
            if ( $rand !== $tizerCookie )
    Никогда не выполнится и соответственно получаем вечный цикл.

    + то ты говоришь что нужно выводить строго попорядку, то сам пишешь - rand типо в случайном. При случайном никакие куки не нужны. Просто берём функцию $data = explode( '::', $tizerList[array_rand($tizerList)] );
    и получаем случайный тизер. Цикл while ( true )
    {
    ...
    }
    не нужен/
    Чтобы была нормальная ссылка
    echo '<div><a href="' . $data[2] . '" target="_blank" title="' . $data[1] . '"><img src="' . $data[0] . '"></a> ';
    echo ' <a href="' . $data[2] . '" target="_blank" > ' . $data[1] . '</a></div>';
     
    GLOOMY2009 нравится это.
  7. wendel

    wendel Создатель

    Регистр.:
    6 ноя 2011
    Сообщения:
    12
    Симпатии:
    7
    Скрипт сделан с расчетом на то, что для каждого сайта можно и больше 2 тизеров добавить и более 2 сайтов ( 1 .txt файл = 1 сайт ) + тизеры не повторяются после обновления страницы. Цикл while в данном случае чтобы избежать повторов. Попробуйте так, проблем быть не должно:

    PHP:
    <?php
     
    define
    'ROOT_DIR'dirname(__FILE__) );
     
    $tizerFiles = array(
        
    'tizer1.txt',
        
    'tizer2.txt',
    );
     
    foreach ( 
    $tizerFiles as $tizerFile )
    {
        
    $tizerList fileROOT_DIR '/' $tizerFile );
        
    $cookieName md5$tizerFile );
        
    $tizerCookie = ( isset( $_COOKIE[$cookieName] ) and $_COOKIE[$cookieName] ) ? (string)$_COOKIE[$cookieName] : "999999";
     
        
    $tizerCount count$tizerList );
     
        while ( 
    true )
        {
            
    $rand "" rand(1,$tizerCount)-"";
     
            if ( 
    $rand !== $tizerCookie )
            {
                
    setCookie$cookieName$rand );
                
    $data explode'::'$tizerList[$rand] );
                echo 
    '<div><a href="' $data[2] . '" target="_blank" title="' $data[1] . '"><img src="' $data[0] . '"></a> ';
    echo 
    '<a href="' $data[2] . '" target="_blank" > ' $data[1] . '</a></div>';
                break;
            }
        }
    }
    Проблем с бесконечным циклом не наблюдаю.

    KillDead, можно и так но мы не ищем легких путей :)

    $rand = "" . rand(1,$tizerCount)-1 . "";
    if ( $rand !== $tizerCookie )
    Выполнится, $tizerCookie от 0-количество тизеров, $rand - 0-количество тизеров, по вашему 100% вероятность что они всегда совпадают? По вашему "0" !== "1" не выполнится??
     
  8. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    884
    Симпатии:
    540
    Да, извиняюсь. Обратил внимание на сравнение типов, странное приведение ранд к строке, почему то подумал что сравнение будет === , которое не будет выполнено) Тогда не понятно где вечный цикл. Только если 1 тизер он сделал или если file( ROOT_DIR . '/' . $tizerFile ); огроменный.
     
  9. GLOOMY

    GLOOMY Постоялец

    Регистр.:
    24 авг 2009
    Сообщения:
    71
    Симпатии:
    6
    Ну проблема и была в бесконечном цикле, смотрел access.log.
    Одна новость для одного IP была показана раз 50, затем сайт выдавал 503, а после включалась защита от DDoS.

    По поводу тизеров, я создал только tizer1.txt для проверки, и него вписал:
    Код:
    http://site.ru/advert/exchanger/pic1.jpg::анкор::http://site.ru/
    http://site.ru/advert/exchanger/pic2.jpg::анкор::http://site.ru/
    Может из-за того что не было tizer2.txt пошел цикл... Попробую Перейти по ссылке, позже отпишусь.
     
  10. wendel

    wendel Создатель

    Регистр.:
    6 ноя 2011
    Сообщения:
    12
    Симпатии:
    7
    PHP:
    <?php
     
    $tizerFiles 
    = array(
        
    'tizer1.txt',
        
    'tizer2.txt',
    );
     
    foreach ( 
    $tizerFiles as $tizerFile )
    {
        if ( 
    is_fileROOT_DIR '/' $tizerFile ) ) {
    $tizerList fileROOT_DIR '/' $tizerFile );
    $cookieName md5$tizerFile );
    $tizerCookie = ( isset( $_COOKIE[$cookieName] ) and $_COOKIE[$cookieName] ) ? (string)$_COOKIE[$cookieName] : "999999";
     
    $tizerCount count$tizerList );
     
    if ( 
    $tizerCount
    {
    while ( 
    true )
    {
    $rand "" rand(1,$tizerCount)-"";
     
    if ( 
    $rand !== $tizerCookie )
    {
    setCookie$cookieName$rand );
    $data explode'::'$tizerList[$rand] );
    echo 
    '<div><a href="' $data[2] . '" target="_blank" title="' $data[1] . '"><img src="' $data[0] . '"></a> ';
    echo 
    '<a href="' $data[2] . '" target="_blank" > ' $data[1] . '</a></div>';
    break;
    }
    }
    }
        }
    }
    Вот пробуй этот код, в том забыл убрать константу ROOT_DIR т.к в dle она уже определена и выдаст ошибку + добавил проверку на существование файла из массива.