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

GLOOMY

Постоялец
Регистрация
24 Авг 2009
Сообщения
91
Реакции
16
Дорогие друзья!

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

Сама задача состоит так:
  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>
Однако данный код не подошел, так как ссылки и картинки он крутит рандомно, так же ссылки открываются в родительском окне. Вторая же причина в том, что под тизерами еще нужно сделать ссылки с анкорами, если их вписать под кодом в шаблон вручную, то придется для двух сайтов вешать два кода.

Помогите решить задачу. Заранее всем очень благодарен!
 
чтобы открывал в новом онке сделай
<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>')
 
Что-то я запутался совсем, где что менять...

В общем нарыл я другой способ на 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
 
Накидал код:

engine/modules/tizer.php

PHP:
<?php
 
$tizerFiles = array(
    'tizer1.txt',
    'tizer2.txt',
);
 
foreach ( $tizerFiles as $tizerFile )
{
    $tizerList = file( ROOT_DIR . '/' . $tizerFile );
    $cookieName = md5( $tizerFile );
    $tizerCookie = ( isset( $_COOKIE[$cookieName] ) ) ? $_COOKIE[$cookieName] : FALSE;
    $tizerCount = count( $tizerList );
 
    while ( true )
    {
        $rand = "" . rand(1,$tizerCount)-1 . "";
        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"}
 
Подключил, и чуть не положил сервер.
Использование процессора дошло до 79%, хостеры хотели заблокировать аккаунт. Когда убрал, все стало спокойно.

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

P.S. tizer1.txt и tizer2.txt выводят информеры для разных сайтов?
 
жёстко. Код
Код:
  $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>';
 
Скрипт сделан с расчетом на то, что для каждого сайта можно и больше 2 тизеров добавить и более 2 сайтов ( 1 .txt файл = 1 сайт ) + тизеры не повторяются после обновления страницы. Цикл while в данном случае чтобы избежать повторов. Попробуйте так, проблем быть не должно:

PHP:
<?php
 
define( 'ROOT_DIR', dirname(__FILE__) );
 
$tizerFiles = array(
    'tizer1.txt',
    'tizer2.txt',
);
 
foreach ( $tizerFiles as $tizerFile )
{
    $tizerList = file( ROOT_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)-1 . "";
 
        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" не выполнится??
 
$rand = "" . rand(1,$tizerCount)-1 . "";
if ( $rand !== $tizerCookie )
Выполнится, $tizerCookie от 0-количество тизеров, $rand - 0-количество тизеров, по вашему 100% вероятность что они всегда совпадают? По вашему "0" !== "1" не выполнится??

Да, извиняюсь. Обратил внимание на сравнение типов, странное приведение ранд к строке, почему то подумал что сравнение будет === , которое не будет выполнено) Тогда не понятно где вечный цикл. Только если 1 тизер он сделал или если file( ROOT_DIR . '/' . $tizerFile ); огроменный.
 
Тогда не понятно где вечный цикл. Только если 1 тизер он сделал или если file( ROOT_DIR . '/' . $tizerFile ); огроменный.
Ну проблема и была в бесконечном цикле, смотрел 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 пошел цикл... Попробую Для просмотра ссылки Войди или Зарегистрируйся, позже отпишусь.
 
PHP:
<?php
 
$tizerFiles = array(
    'tizer1.txt',
    'tizer2.txt',
);
 
foreach ( $tizerFiles as $tizerFile )
{
    if ( is_file( ROOT_DIR . '/' . $tizerFile ) ) {
$tizerList = file( ROOT_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)-1 . "";
 
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 она уже определена и выдаст ошибку + добавил проверку на существование файла из массива.
 
Назад
Сверху