Jump to content
  • 0

Переменное содержимое (текст)


dmifed
 Share

Question

Здравствуйте.

Мне нужно чтобы в одном из блоков (<div>) на странице менялась текстовая информация при каждом обновлении страницы.

Для иллюстрации прилагаю картинку чего хочу добиться.

1. В желтом блоке (<div>) имеется некоторый текст

2. Текст целиком в блок не помещается и последние 1 или 2 слова представляют собой ссылку, которая ведет на страницу, где этот тектст можно прочитать полностью.

3. При каждом обновлении страницы текст рандомно обновляется (например, был про трамваи и ссылка вела на страницу с трамваями, при обновлении или следующем заходе на страницу - про автобусы и ссылка, соответственно, ведет на страницу с автобусами).

4. Каким образом это можно реализовать? Ничего подробно расписывать не надо, если возможно укажите в каком направлении мне изучать материал.

5. На данный момент мне кажется что «рыть» нужно в сторону mysql и на странице с помощью php запрашивать содержимое из базы данных. Или я ошибаюсь и это реализуется другим способом?

Спасибо.

VKSr9WY7.jpg

Edited by dmifed
Link to comment
Share on other sites

22 answers to this question

Recommended Posts

  • 0

dmifed,

Откуда берутся тексты?

Можно делать и на js и на php.

В конечном итоге всё сводится к массиву этих текстов и получению случайного числа, которое будет индексом нужного текста в базе или в массиве.

Link to comment
Share on other sites

  • 0

если текстов немного то можно и js обойтись, иначе используйте php

но вообще php лучше

потому что если вы будете на js писать вам придётся или все тексты загружать вне зависимости от того какой текст будет отображаться

или использовать ajax что для такой простой задачи явно лишнее

другое дело если вы хотите чтобы текст автоматически обновлялся каждые скажем 30 секунд

Edited by CalvinKlein
Link to comment
Share on other sites

  • 0

на php можно так:


<?php
$phrases = "phrases.dat";//файл содержащий фразы
$z = file ($phrases);
$cz = count ($z) -1;
$r = rand (0, $cz);
print $z[$r];
?>

или так:


<?php
$ourfile = fopen("phrases.dat",'r');
for($i = 0; $s = fgets($ourfile,10000); $i++){
if(mt_rand(0,$i) == 0) $line = $s;
}
echo $line;
?>

содержимое файла phrases.dat:

<p>Бла, бла, бла.</p>

<p>Тест, тест, тест.</p>

<p>Кря, кря, кря.</p>

<p>Фу-фу-фу-фу-фу.</p>

<p>Ха-ха-ха-ха-ха.</p>

Link to comment
Share on other sites

  • 0

Откуда берутся тексты?

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

Например.

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

Но на странице про трамваи вставляется целиком текст именно про трамваи, соответственно, не в желтый блок, а в основной (под заголовком)

В конечном итоге всё сводится к массиву этих текстов и получению случайного числа, которое будет индексом нужного текста в базе или в массиве.

Это я понял, но дальше мыслей о том что это проще всего реализовать с помощью php и mysql не продвинулся.

Может есть какой обучающий материал по схожей проблеме, что бы я хотя бы вопросы мог более конкретные задавать/искать?

PS. Я практически не знаю ни javascript, ни php, ни mysql, так что если я пишу совершенно не то, поправьте меня плиз.

PSS. Пока писал в теме появились еще сообщения.

CalvinKlein,

1. Нет текст меняется только при обновлении страницы

2. Текстов много и они большие, поэтому, видимо js отпадает

rus,

Т.е. в вашем способе задача сводится к грубо говоря, созданию в, например, блокноте тектового файла, размеченного тегами и вызову строк при помощи php?

Спасибо за ответы!

Edited by dmifed
Link to comment
Share on other sites

  • 0

rus,

Т.е. в вашем способе задача сводится к грубо говоря, созданию в, например, блокноте тектового файла, размеченного тегами и вызову строк при помощи php?

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

если с mysql, то можно и так:


$rand_text = mysql_query("SELECT * FROM `table` ORDER by RAND() LIMIT 1");
while($view_text = mysql_fetch_array($rand_text)) {
echo '<p>$view_text['text_view_in_table'];</p>';
}

Link to comment
Share on other sites

  • 0

rus,

Т.е. в вашем способе задача сводится к грубо говоря, созданию в, например, блокноте тектового файла, размеченного тегами и вызову строк при помощи php?

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

если с mysql, то можно и так:


$rand_text = mysql_query("SELECT * FROM `table` ORDER by RAND() LIMIT 1");
while($view_text = mysql_fetch_array($rand_text)) {
echo '<p>$view_text['text_view_in_table'];</p>';
}

насчёт вашего mysql запроса: выше на этом форуме была ссылка на хабр, думаю вам стоит почитать

Link to comment
Share on other sites

  • 0

насчёт вашего mysql запроса: выше на этом форуме была ссылка на хабр, думаю вам стоит почитать

да я это давно уже знаю, но ТС ничего не сказал о кол-ве записей в бд, бд ли будет использовано и т.д., он просто спросил, ему привели варианты, при чем с примерами - выбирай!

наше дело направить, а дальше пусть сам выбирает и ищет в заданом векторе.

Link to comment
Share on other sites

  • 0

И снова здравствуйте!)

Вроде бы кое-что получается (текст меняется случайным образом как и планировалось)

На всякий случай приложу код, может я что-то не так сделал...Буду рад комментариям)

//коннектимся к базе
$connect = mysql_connect ('localhost', 'root', '' );
//делаем кодовую страницу виндовс 1251
mysql_query('set names cp1251');
//проверка соединения
if (mysql_select_db('my_db', $connect));
{
//узнаем количество полей в таблице
$number_query = mysql_result(mysql_query("SELECT COUNT(*) FROM tabl_1"),0);
//вычисляем случайное число
$number_field = rand(0, $number_query-1);
//выбираем поле с вычесленным случайным номером
$item = '(SELECT * FROM tabl_1 LIMIT '.$number_field.',1)';
//получаем результат
$text = mysql_query($item);
$text2 = mysql_result($text,0);
echo $text2;
};

Теперь следующая проблема.

Мне нужно чтобы последнее видимое слово в желтом блоке было ссылкой.

Но оно же на другой странице (там где текст полностью) было просто текстом.

Т.е. вопрос как сделать последее видимое слово сделать ссылкой.

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

Понимаю, что из написанного мало что понятно, поэтому картинка:

VTlWo2Cc.jpg

Link to comment
Share on other sites

  • 0


$text2 = mysql_result($text,0);
echo preg_replace("/([^\s]+)$/is", "<a href=\"#ссылка\">$1</a>", $text2, 1);

первое, что пришло на ум, главное чтобы в конце не было пробелов

кстати насколько я понимаю ссылка так же вычисляться скриптом должна?

Edited by CalvinKlein
Link to comment
Share on other sites

  • 0

кстати насколько я понимаю ссылка так же вычисляться скриптом должна?

Да, ссылка должна автоматом назначаться последнему видимому слову.

Т.е. из базы данных в желтый блок вставляется большой кусок текста.

Весь он не помещается, поэтому из-за свойства overflow:hidden то, что не влезло скрывается.

Нужно, чтобы последнее слово которое поместилось в блоке стало ссылкой.

Причем при переходе по ссылке на страницу с полным текстом ссылки на этом слове уже нет.

Edited by dmifed
Link to comment
Share on other sites

  • 0

аааа)

теперь понял я просто думал что у вас из базы загружается не весь текст а только его короткий вариант

вообще это плохо весь текст выводить в html ведь он может быть большой, а его всё равно никто не увидит

насчёт ссылки: можно увидеть структуру таблицы с текстами?

насчёт выделения последнего слова как ссылки думаю надо прикинуть сколько максимум символов помещается в ваш блок и обрезать текст средствами php, а потом выделить последнее слово

Edited by CalvinKlein
Link to comment
Share on other sites

  • 0

теперь понял я просто думал что у вас из базы загружается не весь текст а только его короткий вариант

насчёт выделения последнего слова как ссылки думаю надо прикинуть сколько максимум символов помещается в ваш блок и обрезать текст средствами php, а потом выделить последнее слово

Если в таблицу вставить только короткий вариант текста то поставить ссылку на последнее слово не проблема, т.е. написать в таблице вот так:

Последовала серия боёв в каждом из них северокорейские дивизии пытались перейти реку Нактонган и атаковать обороняющегося противника. 
Успех этих <a href = "5_diviziy.php" class="gray_block_link">атак ...</a>

А в файле 5_diviziy.php разместить текст в html или взять из другой таблицы.

Проблема в этом случае только в том чтобы правильно сделать короткий вариант текста (чтобы последнее слово в блоке не оказывалось где-нибудь в середине)

Link to comment
Share on other sites

  • 0

Проблема в этом случае только в том чтобы правильно сделать короткий вариант текста (чтобы последнее слово в блоке не оказывалось где-нибудь в середине)

я бы всё-таки обрезал текст по кол-ву символов и последнее слово выделил ссылкой


$text = substr( $text, 0, strpos($text, " ", 500) );
$text = preg_replace("/([^\s\r\n]+)[\s\.\r\n]*$/isU", "<a href=\"#ссылка\">$1...</a>", $text, 1);

как-то так, 500 длина в символах по которой вы обрезаете

Edited by CalvinKlein
Link to comment
Share on other sites

  • 0

я бы всё-таки обрезал текст по кол-ву символов и последнее слово выделил ссылкой

Обрезать и выделить с помощью php?

Т.е. алгоритм примерно такой:

1. Отсчитываем n символов.

2. От n-символа в обратную сторону ищем группу символов отделенных пробелами.

3. Делаем эту группу ссылкой.

4. Убиваем все что идет после этой группы символов.

Я правильно вас понял?

PS пока писал не заметил что вы код добавили, так что алгоритм я писал не видя вашего кода если что)

PSS и большое спасибо что помогаете новичку!

Edited by dmifed
Link to comment
Share on other sites

  • 0

мой код начинает поиск пробелов с 500 символов

то есть конечная длина будет чуть больше чем 500

К сожалению, количество символов, помещающихся в блок разное в зависимости от текста. Поэтому я боюсь, что текст в блоке при обрезании определенного количества символов будет выглядеть как на картинке.

За основу я взял самое меньшее количество символов (617) в блоках и отрезал все что осталось за пределами.

Светлый текст соответственно отрезается (я его для наглядности оставил и сделал светлым) и внизу блока остается много пустого места.

Причем если окажется что в блок помещается меньше чем 617 символов, то ссылки не будет вообще видно.

TtatSaBv.jpg

Link to comment
Share on other sites

  • 0

ну можно попытаться расчитать сколько места будет занимать текст исходя из шрифта,

но по-моему было бы проще сделать в бд ещё один столбец для короткого варианта текста

Link to comment
Share on other sites

  • 0

ну можно попытаться расчитать сколько места будет занимать текст исходя из шрифта,

но по-моему было бы проще сделать в бд ещё один столбец для короткого варианта текста

В предыдущей картинке шрифт изпользуется один и тот же (гарнитура, размер, межсимвольные расстояния и проч.) Но в зависимости от длины слов и их взаимного расположения, количество символов в блоке существенно различается, поэтому не думаю, что расчет кол-ва символов сильно поможет в решении проблемы.

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

И все же чтобы закрыть уже этот вопрос хочу уточнить:

При данной постановке задачи (большой текст в блоке со свойством overflow:hidden) не представляется возможным подсчитать сколько именно символов текста являются видимыми в блоке?

Т.е. следующий алгоритм не реализуем

1 Вставляем текст в тестовый блок (блок который идентичен блоку текста, но не виден на экране)

2 Каким нибудь способом считаем количество видимых символов

3 Ищем последнюю группу символов разделенных пробелами и ставим ссылку

4 Убираем оставшиеся символы

5 Вставляем получившийся кусок текста в блок, видимый на экране.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy