[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Изменить материал через определенное время
vital
Вобщем, Дизайнер вставяет в шаблон конструкцию вида <?=show_changed_text();?> В это места вставляется текст. Фишка в том, что после прошествия $time времени, это текст должен менятся. Вроде не сложно..
У меня родилось следующее.

function write_time()
{
$h = fopen("time.inc","w");
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[0];
$tstart = $mtime;
fwrite($h,strval($tstart));
}
===========
if (!file_exists("time.inc"))
{
write_time();
}
$tstart=intval(file_get_contents("time.inc"));
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[0];
$tend = $mtime;
if (($tend-$tstart)>$time)
{
write_time();
// действия
}else{
//дейстивя
}

т.е. создается файл в к-й записываем время. Потом от него отнимаем текущее, если > $time то в файл записываем новое время.. Но.. не работает=)
В разных моих поптыках изменения, текст либо менялся при каждом просмотре, либо не менялся вообще. т.е. интервал никак не соблюдался..
пс. Сама ф-я выглядит так(мб в ней ошибка?).

function show_changed_text($lenght=150,$go=false)
{

if (!file_exists("time.inc"))
{
write_time();
}

global $number,$cwords;
static $add;
$data = file_get_contents("kontent.txt");
$data = preg_replace("'\s+'"," ",$data);
$data_len = strlen($data);

$tstart=intval(file_get_contents("time.inc"));
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[0];
$tend = $mtime;
echo ceil($tend-$tstart);
if (ceil($tend-$tstart)>$time) //Если прошло больше $time сек, то выводим текст из другого места
{
write_time();
$from = $step*$number+rand(0,1000)+$add; //стартовый символ
$from = min(max(0,$data_len-$lenght),$from);
}else{ // Если меньше - то выводим изначальный
$from = $step*$number+$add;
$from = min(max(0,$data_len-$lenght),$from);
}
//все что ниже с временем не связано..
$step = $data_len/$cwords;
$data = substr($data,$from,$lenght);
$add+=$lenght;
if(!$add===false)
{
$go--;
global $keyword;
$l = 0;
if(preg_match_all("'((.{".$go."})(\S*))\s'si",$data,$arr))
{
static $z;
global $keyword,$hglght;
$l = strlen(join($arr[1]));
foreach ($arr[1] as $part)
{
$addon[] = $part;
$addon[] = sprintf($hglght[$z%count($hglght)],$keyword);
$z++;
}
}

$addon[] = substr($data,$l);
$data = join(" ",$addon);

}
return $data;
}




Спустя 59 минут, 50 секунд (24.12.2009 - 01:23) twin написал(а):
Посмотри на эту функцию. filemtime()
С ней твой код можно раз в 10 ужать. А там и разобраться проще будет.

Спустя 1 час, 5 минут, 54 секунды (24.12.2009 - 02:29) vital написал(а):
Да ну. Какая разница получать содержимое файла=дату или дату изменения файла(тем более, что этот файл нужно каждый раз изменять)? я вас не понял не много..

Спустя 56 минут, 47 секунд (24.12.2009 - 03:25) twin написал(а):
Цитата
Да ну.

Ну да.
    $period = 10;
$time = @filemtime('time.inc');

if(!$time || $time < time() - $period)
{
file_put_contents('time.inc', 1);
echo 'Ай.';
}
else
{
echo 'Ой.';
}


А вот теперь можно понять, почему не работает. Он работает, просто новый текст появится только после первого (кем бы то нибыло) посещения страницы и тут же сменится обратно. Если нужно сменить его навсегда, то нужна другая логика. Хотя бы в тот же файл записать и считывать потом оттуда.

Кстати, один из редких случаев, когда оправдано применение собаки. smile.gif


Спустя 1 час, 57 минут, 28 секунд (24.12.2009 - 05:23) vital написал(а):
Подскажите тогда пожалуйста, как грамотнее реализовать.

Спустя 26 минут, 26 секунд (24.12.2009 - 05:49) twin написал(а):
Я не понял задачи. Вот смотри. Если тебе нужно при при первом посещении страницы вывести одно значение. а через n секунд другое, то это одно. Но второе значение останется навсегда. Если тебе нужно после второго посещения продержать второе значение некоторое время, а потом сменить его опять на первое, то это другая задача.
Из твоего кода и объяснений ничего не понятно. Сформулируй задачу четко и наверняка сам поймешь как сделать.

Спустя 8 часов, 44 минуты, 7 секунд (24.12.2009 - 14:33) vital написал(а):
Так. Пробую сформулировать четко=)
Итак. В шаблон вставляется ф-я show_changed_text();
Она выводит какой-то кусок текстового файла. Но через каждые $time минут, она должна возвращать разный кусок текста. Причем, нужно сделать на основе ф-и(=> сохранить ее функциональность)
function show_text($lenght=150,$go=false)
{
global $number,$cwords;
static $add;
$data = file_get_contents("kontent.txt");
$data = preg_replace("'\s+'"," ",$data);
$data_len = strlen($data);
$step = $data_len/$cwords;
$from = $step*$number+$add;
$from = min(max(0,$data_len-$lenght),$from);
$data = substr($data,$from,$lenght);
$add+=$lenght;
if(!$add===false)
{


$go--;
global $keyword;
$l = 0;
if(preg_match_all("'((.{".$go."})(\S*))\s'si",$data,$arr))
{
static $z;
global $keyword,$hglght;
$l = strlen(join($arr[1]));
foreach ($arr[1] as $part)
{
$addon[] = $part;
$addon[] = sprintf($hglght[$z%count($hglght)],$keyword);
$z++;
}
}

$addon[] = substr($data,$l);

$data = join(" ",$addon);


}
return $data;
}

Т.е выдаваемый ею текст, должен меняться через нек-е время(а не каждый раз при вызове). Я думал просто менять стартовый символ(с которого в файле начинается считывание текста)

Спустя 1 минута, 21 секунда (24.12.2009 - 14:35) vital написал(а):
ПС. Спасибо за терпение)

Спустя 31 минута, 6 секунд (24.12.2009 - 15:06) twin написал(а):
Разный кусок, это имеется ввиду следующий? Мне просто некогда вникать в код. Если следующий, то тебе нужно запоминать в файл не время, а позицию, с которой читать этот кусок. А ориентироваться на время изменения файла.

Спустя 3 часа, 44 минуты, 28 секунд (24.12.2009 - 18:50) vital написал(а):
Цитата (twin @ 24.12.2009 - 12:06)
не время, а позицию, с которой читать этот кусок. А ориентироваться на время изменения файла.

Ну да. Как-то так..

Спустя 58 минут, 16 секунд (24.12.2009 - 19:48) twin написал(а):
Ну дык сообразишь сам или помочь?

Спустя 39 минут, 55 секунд (24.12.2009 - 20:28) vital написал(а):
Сейчас покажу, что наваял. Просьба подправить. Заказчик рвет и мечет((


Оригинал
function show_text($lenght=150,$go=false)
{
global $number,$cwords;
static $add;
$data = file_get_contents("kontent.txt");
$data = preg_replace("'\s+'"," ",$data);
$data_len = strlen($data);
$step = $data_len/$cwords;
$from = $step*$number+$add;
$from = min(max(0,$data_len-$lenght),$from);
$data = substr($data,$from,$lenght);
$add+=$lenght;
if(!$add===false)
{


$go--;
global $keyword;
$l = 0;
if(preg_match_all("'((.{".$go."})(\S*))\s'si",$data,$arr))
{
static $z;
global $keyword,$hglght;
$l = strlen(join($arr[1]));
foreach ($arr[1] as $part)
{
$addon[] = $part;
$addon[] = sprintf($hglght[$z%count($hglght)],$keyword);
$z++;
}
}

$addon[] = substr($data,$l);

$data = join(" ",$addon);


}
return $data;
}


Моя ф-я:
function show_changed_text($lenght=150,$go=false)
{

global $number,$cwords;
static $add;
$data = file_get_contents("kontent.txt");
$data = preg_replace("'\s+'"," ",$data);
$data_len = strlen($data);
$step = $data_len/$cwords;

if (!file_exists("time.inc"))
{
$h=fopen("time.inc","w");
fwrite($h,1);
fclose($h);
}
$time = @filemtime("time.inc");
if($time < (time() - $period))
{
$from = $step*$number+$add;
$from = min(max(0,$data_len-$lenght),$from);
$add+=$lenght;
$h=fopen('time.inc','w');
fwrite($h,$from);
fclose($h);
}
else
{
$from = file_get_contents("time.inc");
$from = min(max(0,$data_len-$lenght),$from);
}

$data = substr($data,$from,$lenght);
if(!$add===false)
{
$go--;
global $keyword;
$l = 0;
if(preg_match_all("'((.{".$go."})(\S*))\s'si",$data,$arr))
{
static $z;
global $keyword,$hglght;
$l = strlen(join($arr[1]));
foreach ($arr[1] as $part)
{
$addon[] = $part;
$addon[] = sprintf($hglght[$z%count($hglght)],$keyword);
$z++;
}
}

$addon[] = substr($data,$l);
$data = join(" ",$addon);

}
return $data;
}


Ошибок не выдает, но текст не меняется. Что-то не то в логике(

Спустя 3 минуты, 9 секунд (24.12.2009 - 20:32) vital написал(а):
ПС.
$period объявлена в другом файле, в который этот подключается инклудом.

Спустя 33 минуты, 11 секунд (24.12.2009 - 21:05) twin написал(а):
А по русски ты можешь объяснить, что именно нужно. Есть файл с текстом, что дальше надо сделать? Из твоего кода нифига не понятно. Его разбирать надо три дня.

Спустя 32 минуты, 5 секунд (24.12.2009 - 21:37) vital написал(а):
Цитата (twin @ 24.12.2009 - 18:05)
Есть файл с текстом, что дальше надо сделать?


Вывести из него кусок текста. Там фиг знает как вычисляемым. Но через $time времени - выводить другой. т.к. содержание страницы каждые н времени будет менятся.
По коду ясно, что $from - символ с которого начинается считывание. Я его и меняю.. теоритически.

Спустя 42 минуты, 26 секунд (24.12.2009 - 22:19) twin написал(а):
А зачем тебе символ? Ну шаг и запоминай сразу. Я так толком и не понял ничего. И вот это fopen() нафига? Под 4 пыхапэ чтоли делаешь...
Я бы давно написал бы тебе код, если бы понял, что нужно.

Спустя 15 минут, 37 секунд (24.12.2009 - 22:35) vital написал(а):
Короче. Файл kontent.txt.
Из него через на странице функция выводит рандомно кусок текста. Каждые $time минут кусок должен быть другой. На все остальное пофиг..

Спустя 9 минут, 15 секунд (24.12.2009 - 22:44) twin написал(а):
О Боже... И всего то...
    $step = 50;
$period = 10;

$data = file_get_contents("kontent.txt");
$data = preg_replace("'\s+'"," ",$data);
$data_len = strlen($data);

$time = @filemtime('time.inc');

if(!$time || $time < time() - $period)
file_put_contents('time.inc', rand(0, $data_len - $step));

$pos = file_get_contents('time.inc');

echo substr($data, $pos, $step);

Спустя 1 минута, 25 секунд (24.12.2009 - 22:46) vital написал(а):
Цитата
О Боже... И всего то...

да не, это было не все.. Я упростил.

Спустя 2 минуты, 11 секунд (24.12.2009 - 22:48) twin написал(а):
Ну дык ты сначала задачу нормально обрисуй. Прежде всего для себя. А так и меня запутал и сам запутался.

Спустя 29 минут, 34 секунды (24.12.2009 - 23:17) vital написал(а):
Ладно, спасибо.

Спустя 29 минут, 9 секунд (24.12.2009 - 23:46) vital написал(а):
Вот и не работает( Текст меняется при каждом просмотре, а не через интервал времени.

Спустя 5 часов, 56 минут, 20 секунд (25.12.2009 - 05:43) twin написал(а):
Мой скрипт не работает???? Я еще раз проверил. Все норм. Что то ты не так делаешь.

Спустя 1 час, 56 минут, 32 секунды (25.12.2009 - 07:39) vital написал(а):
Действительно я. Не написал global в функции. Извините)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.