|
|
|
| Добрый день! Хочу вставить в тело статьи контексную рекламу гугл адсенс (после 5 абзаца информационной статьи или по-середине статьи), но никак не могу понять как это сделать. Прошерстив поисковики нашла только разные плагины для движков вордпрес и джумла.
пожалуйста, помогите мне в решении этой проблемы.
текст на страницу выводится из базы данных вот так:
<?
printf ("
<h1>%s</h1>
<div><img src='%s'>
<div ><p>%s</p></div></div>
<p>Автор:%s</p>
",$myrow["title"],$myrow["mini_img"],$myrow["text"],$myrow["author"]);
?>
|
вот код рекламного блока
<script type="text/javascript"><!--
google_ad_client = "...";
/* pod_img */
google_ad_slot = "...";
google_ad_width = 125;
google_ad_height = 125;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
|
заранее спасибо всем отозвавшимся!!! | |
|
|
|
|
|
|
|
для: hitball
(29.03.2013 в 19:52)
| | Ну а где "середина" в этом, что вы представили (printf...)? Или как у вас выводится 5 абзацев? | |
|
|
|
|
|
|
|
для: confirm
(29.03.2013 в 20:30)
| | <div ><p>%s</p></div></div>
$myrow["text"]
за вывод текста отвечает вот эти строки выделеные жирным
p.s. спасибо, что отозвались! | |
|
|
|
|
|
|
|
для: hitball
(29.03.2013 в 20:38)
| | Это понятно, я не об этом. Вот ваш html-код:
<h1>Тут будет заголовок</h1>
Далее в элемент загружается некий текст
<div>
<img> картинка
<div > опять разметка
<p>И тут текст</p>
</div>
</div>
<p>Автор</p>
Вы в середину <p>И тут текст</p> пытаетесь вставить? Или 5 абзацев это значит через пять <h1>Тут будет заголовок</h1>?
Если первое, то что же у вас в базе храниться? Элемент Р это и есть параграф, а значит у вас в базе должен уже быть html-содержимое (параграфы) и выводить их надо циклом и не в параграф как у вас, а в DIV, и цикле определять место вставки. Если же у вас текст в базе, то не понятно как он у вас будет отображаться,
Если второе, значит в цикле определять достигнута ли середина, или 5 параграфов.
Покажите как вы вывод результата запроса осуществляете, а то не понять, что и куда. | |
|
|
|
|
|
|
|
для: confirm
(29.03.2013 в 20:52)
| | Вы в середину <p>И тут текст</p> пытаетесь вставить?
да
в базе есть таблица с колонками заголовок (это то, что выводится в h1 (название графы title)) и текст (название графым text) - тело самой статьи с html версткой <p>
Вот в теле самой статьи я и хочу вставить рекламный код | |
|
|
|
|
|
|
|
для: hitball
(29.03.2013 в 21:00)
| | Ну если у вас в базе уже html то зачем же вы ее в параграф вставляете, какой смысл в этом?
<p>Тут вывод, а обрамляющиего его теги параграфа удалить.</p>
Придется ту часть информации, которая заключена в параграфы ($myrow["text"]), разбить на массив (по закрывающему тегу параграфа), и осуществлять вывод их в цикле, закрывая каждый параграф. Вне цикла установить счетчик по которому можно будет определить достижение середины (для цикла for не обязательно). А середину узнать легко, достаточно разделить число элементов массива полученного после разбиения параграфов, округлив это значение. | |
|
|
|
|
|
|
|
для: confirm
(29.03.2013 в 21:10)
| | title - это ведь название статьи. параграфы (абзацы и h2, h3) у меня только в столбце title. я, наверное, как-то не так все объяснила(
у меня в базе уже около 1,5 тыс статей... | |
|
|
|
|
|
|
|
для: hitball
(29.03.2013 в 23:05)
| | Значит поясните куда вставить надо, я вас об этом изначально спросил.
Ну вы же не между 1500 статьями вставить хотите так ведь? ) Наверное же разбив какую-то статью, так?
1. Ваш print() выводит именно статью?
2. Переменная $myrow["text"] содержит параграфы этой статьи?
3. Значит надо найти середину $myrow["text"] и вставить в нее JS-код? | |
|
|
|
|
|
|
|
для: confirm
(29.03.2013 в 23:24)
| | >Значит поясните куда вставить надо, я вас об этом изначально спросил.
простите(
>1. Ваш print() выводит именно статью?
да, верно
>2. Переменная $myrow["text"] содержит параграфы этой статьи?
здесь содержится тело статьи обрамленное тегами <p>, <h2>, <h3>,<br>
>3. Значит надо найти середину $myrow["text"] и вставить в нее JS-код?
да | |
|
|
|
|
|
|
|
для: hitball
(29.03.2013 в 23:33)
| | Ну я вам и показал как это сделать. Мне трудно советовать вам как выгоднее разбить ваше содержимое пополам, так как содержится тело статьи обрамленное тегами <p>, <h2>, <h3>,<br> не дает представления о содержимом.
Тег BR вообще ничего не обрамляет, это одиночный тег. Если у вас в статье, например, заголовки H2 или H3 делят ее на части, и таких частей несколько, то можно разбить ее на массив по этим тегам. А можно по параграфам (по закрывающему тегу (</p>), как показано ниже.
В любом случае затем поступаем так как я и показал ниже - разбиваем этот массив на две части и в середину добавляем JS-код. Различие будет только в теге по которому implode() будет объединять эти части массива в строки - это должен быть тег на который вы разбивали текст. | |
|
|
|
|
|
|
|
для: hitball
(29.03.2013 в 21:00)
| | Если вам так нравится printf(), то перед его использованием выполните:
<?
$myrow["text"] = explode('</p>', $myrow["text"]);
$myrow["text"] = array_chunk($myrow["text"], round(count($myrow["text"])/2));
$myrow["text"] = implode('</p>', $myrow["text"][0]).'</p><script type="text/javascript"><!--
google_ad_client = "...";
/* pod_img */
google_ad_slot = "...";
google_ad_width = 125;
google_ad_height = 125;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>'.implode('</p>', $myrow["text"][1]).'</p>';
|
Но лучше в данном случае отказаться от нее и сделать так:
<?
$myrow["text"] = explode('</p>', $myrow["text"]);
$myrow["text"] = array_chunk($myrow["text"], round(count($myrow["text"])/2));
?>
<h1><?=$myrow["title"]?></h1>
<div><img src='<?=$myrow["mini_img"]?>' />
<div >
<?=implode('</p>', $myrow["text"][0])?>
</p><script type="text/javascript"><!--
google_ad_client = "...";
/* pod_img */
google_ad_slot = "...";
google_ad_width = 125;
google_ad_height = 125;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<?=implode('</p>', $myrow["text"][1])?>
</p>
</div></div>
<p><?=$myrow["author"]?></p>
| Краткая запись <?=...?> возможна, если разрешены короткие php-теги (short_open_tag), или если у вас версия РНР 5.4.0, начиная с ней такая запись доступна всегда, независимо от разрешения коротких тегов. | |
|
|
|
|
|
|
|
для: confirm
(29.03.2013 в 21:40)
| | Благодарю за код, под свои нужды сделал такой и все работает:
<?
$myrow["text"] = explode('</p>', $myrow["text"]);
$myrow["text"] = array_chunk($myrow["text"], round(count($myrow["text"])/2));
?>
<?=implode('</p>', $myrow["text"][0])?>
</p>
<center> <?php include ("blocks/gogle.php"); ?> </center>
<?=implode('</p>', $myrow["text"][1])?>
</p>
|
Очень бы хотелось размещать код не в середине статьи, а после определенного абзаца. Подскажите, пожалуйста, как это сделать? | |
|
|
|
|
|
|
|
для: bond007
(24.01.2015 в 00:02)
| | Не разбивать массив пополам (array_chunk), а брать его срезы (array_slice) - первый от начала и по элемент, после которого необходимо разместить блок, а второй срез начиная с этого элемента + 1.
<?
$delim = 4; //номер блока после которого подключение
$myrow["text"] = explode('</p>', $myrow["text"]);
echo implode('</p>', array_slice($myrow["text"], 0, $delim)) . '</p>' .
include ("blocks/gogle.php") .
implode('</p>', array_slice($myrow["text"], $delim)) . '</p>';
|
Не используйте таких конструкций:
?>
<?=implode('</p>', $myrow["text"][0])?>
|
Используйте короткий тег для вставки, там где он читаем и логичен.
А вообще на этот вопрос нужно смотреть несколько шире, нежели explode/insert/implode.
Первое - это результатом чего является html-код, которому при выводе требуется трепанация?
Второе - это чем является вставляемый в текст код, величиной постоянной или определяемой конфигурацией?
Если html-код в базе, это результат "ручного труда" посредством того же визуального редактора, то для гибкого управления выводом, желательно иметь не просто редактор, а редактор "вшитый" в управление сайтом. То есть этот редактор, это не стандартно-банальное форматирование текста и вставка чего либо, а вставка именно ресурсов сайта, ссылок на именно на ресурсы сайта, список которых динамичен также, как и само содержимое.
Понятное дело, что такого готового редактора вы не найдете, и если такой требуется, то нужно будет готовый редактор доводить до ума под свои задачи, а это нужны знания и клиентских языков.
Можно поступить и иначе
Текст, который при выводе дополняется или компонуется со вставками кода, или просто html-конструкций, при занесении его в базу не должен быть "плоским" - уже на стадии его формирования должна быть возможность разбить его на части, при этом, если html-вывод этого текста, это всего лишь добавления тега параграфа, то необходимости добавлять этот тег непосредственно при записи в базу нет. Разбить текст на параграфы можно и при выводе его из базы под двойному переводу строки.
В общем - все что мы будем добавлять в базу в качестве будущего содержания html-страницы, должно контролироваться нами поэлементно:
а) заголовки - кроме их текста еще их размер (h1, h2 ... h5), а если требуется, то и указания имени класса, определяющего стиль заголовка на странице;
б) содержание - это не "плоский по длине текст", а его фрагменты, положение которых можно менять (ранжирование);
в) вставки - код, который можно вставить и который также можно ранжировать относительно содержания, либо это html-вставки, которые можно выбрать из списка;
г) ссылки - можно выбрать из списка адрес ссылки на текущий документ (если он редактируется, иначе на имеющиеся) как непосредственно на него, так и на якоря внутри документа.
Чтобы это реализовать нужно ведь совсем не многое - это "правильную" структуру документа в базе, а именно:
а) идентификатор (поле с автоинкрементом) определяющее документ;
б) идентификатор родителя - раздел которому принадлежит документ;
в) номер блока в пределах документа - определяет ранжирование (собственно сортировку, порядок) блока внутри документа;
г) заголовок - текст заголовка;
д) размер - размер определяющий html тег заголовка, от 1 до 5;
е) содержание - блок содержания, это либо текст, либо вставка, которая является или исполняемым кодом, или html-заготовками, на которые можно указать по списку, значением которого могут быть либо ID таких включений, либо их имена;
ж) тип блока - для текстовых блоков определяющих содержание, это указывает на то, что данный тип можно редактировать, подвергать преобразованиям при выводе (например, htmlspecialchars), а для блоков исполняемых выводить как есть, и всякие преобразования запрещены.
Реализация ввода
Все просто, согласно списка структуры данных, это:
1) В простейшем случае это поле с кнопками позволяющее перемещать блок в форме (ранжирование, сортировка, перемещает строку таблицы, которая описывает/содержит все параметр блока/поля формы), а если решать с применением HTML5, то уже есть и готовое - drag and drop. Но как бы это не решалось, сервер получит порядок следования блоков на странице, который надо или записать или обновить в базе.
2) Текстовое поле - текст заголовка.
3) Поле select - html-размер заголовка.
4) Textarea - поле содержания. Если разбивать текст на блоки, а значит эти блоки в конечном итоге будут иметь некий фиксированный максимальный размер, то есть возможность хранить в базе его в поле VARCHAR, что выгоднее нежели попусту использовать TEXT.
5) Тип number или список под ENUM - тип блока как описано выше.
7) Удаление - при редактировании имеющегося блока, это его удаление, а для вновь добавляемого, это удаление полей из формы описывающей этот блок.
8) Кнопка - Добавить блок. Добавление нового блока, номер которого в базе при добавлении/обновлении клиент получает при получении этой формы, и определяется как последний номер автоинкремента, который будет применен к записи (во вновь создаваемом документе его получит первый по ранжиру блок).
Вывод
Все просто:
1) при выводе сперва выводится текст заголовка, который обрамляется тегом H указанного размера. Мало того, это же тег определяет и якорь на странице. Для этого тегу H добавляется атрибут id, имя которого можно определить переменной/константой (второе предпочтительнее, если вывод, это функция), например hs- с подстановкой идентификатора блока, то есть получим на странице: id=hs-1, id=hs-2..., и ссылки на них: ?doc=5#hs-8. Поставить перекрестные ссылки на якоря в документах тоже не сложно, для этого достаточно при выводе формы получить список документов группированных по родителю (optiongroup для select), и идентификаторы им принадлежащие (options для optiongroup в select). Сформировать ссылку при этом можно хотя бы при помощи BB-тегов, что не сложно.
2) Далее блоки текста по ранжиру, при этом включения ранее определенные будут там, где они определены, а исполняемый код во включениях будет выполнять предписанную им задачу.
Понятно, что таким образом можно включать в текст и графику в любое место будущего содержания, без всякого визуального редактора - нужно лишь добавить ввод параметров для такой вставки, это обтекание текстом, отступы, размер. А при приеме формы сервером сохранить изображение, связав его с идентификатором блока, и добавив тег IMG с прописанными параметрами и добавленным путем в текст блока-хозяина.
Вот и все. | |
|
|
|
|
|
|
|
для: confirm
(24.01.2015 в 03:55)
| | Большое спасибо за подробный ответ, но почему-то с таким кодом выводится пустая страница (все элементы присутствуют, но пропадает сам текст статьи). Я не программист и данную задачу хотелось бы решить быстро, не особо вдаваясь в подробности, т.к. в будущем эти знания скорее всего не пригодятся. Я могу подробнее описать свою ситуацию, возможно это поможет понять почему с последним вариантов кода выводится пустая страница.
Итак, на сайте множество статей. в каждой статье есть множество абзацев, все с тегами <p></p>. Текст статьи выводится данным кодом:
<?php echo $myrow['text']; ?>
|
Хотелось бы вставлять рекламный код после определенного количества абзацев. С кодом, который я приводил в предыдущем сообщении все работает хорошо - реклама встает по центру статьи, а с вашим вариантом текст статьи почему-то перестает загружаться. | |
|
|
|
|
|
|
|
для: bond007
(24.01.2015 в 13:05)
| | Да это не мой вариант, а ваш, описанный функциями РНР. Если ничего не выводится, значит где-то у вас допущена ошибка. Выполните этот пример отдельно:
<?
$delim = 3;
$insert = '<p>BLOCK</p>';
$text = '<p>A</p><p>B</p><p>C</p><p>D</p><p>F</p><p>G</p><p>H</p>';
$text = explode('</p>', $text);
echo implode('</p>', array_slice($text, 0, $delim)) . '</p>' .
$insert .
implode('</p>', array_slice($text, $delim)) . '</p>';
|
Все выводится, и абзац с текстом BLOCK будет включен в вывод как указано, после 3 параграфа. | |
|
|
|
|
|
|
|
для: confirm
(24.01.2015 в 19:22)
| | Здравствуйте! Если логи сервера выдают ошибку
PHP Notice: Undefined offset: 1 in /var/www/.../view_articles.php on line 134
PHP Warning: implode(): Invalid arguments passed in /var/www..../view_articles.php on line 134
а на линии 134 как раз этот кусок
<?=implode('</p>', $myrow["text"][1])?>
|
из кода
<?
$myrow["text"] = explode('</p>', $myrow["text"]);
$myrow["text"] = array_chunk($myrow["text"], round(count($myrow["text"])/2));
?>
<?=implode('</p>', $myrow["text"][0])?>
</p>
<center> <?php include ("blocks/gogle.php"); ?> </center>
<?=implode('</p>', $myrow["text"][1])?>
</p>
|
как это исправить? | |
|
|
|
|
|
|
|
для: hitball
(12.09.2017 в 11:27)
| | Сообщение гласит о том, что в массиве $myrow["text"] указанного смещения $myrow["text"][1], а значит и implode не может быть выполнено. То есть после разбиения массива array_chunk($myrow["text"], .... в нем всего один элемент. Проверять нужно. | |
|
|
|
|
|
|
|
для: confirm
(12.09.2017 в 14:15)
| | Добрый день! Все ношусь с этой проблемой.
Сервер в логах выдает эту ошибку
PHP Notice: Undefined offset: 1 in view_articles.php on line 134
PHP Warning: implode(): Invalid arguments passed in /view_articles.php on line 134
|
после чего выбивает сайт по ERR_CONNECTION_TIMED_OUT
думаю, что это может быть из-за большого обращения посетителей к этой странице. Может такое быть?
И я совершенно не знаю как это исправить и сделать проверку! | |
|
|
|
|
|
|
|
для: hitball
(20.09.2017 в 11:00)
| | Что носится то, причина в том, что не существует элемента под индексом 1 в массиве $myrow["text"], попытка обращения которому в 134 строке - $myrow["text"][1].
Проверяйте, что такое $myrow["text"]? С чего вдруг $myrow["text"][1]? | |
|
|
|
|
|
|
|
для: confirm
(20.09.2017 в 11:57)
| | я думала, что мы так делили текст на несколько частей
<?
$myrow["text"] = explode('</p>', $myrow["text"]);
$myrow["text"] = array_chunk($myrow["text"], round(count($myrow["text"])/2));
?>
<h1><?=$myrow["title"]?></h1>
<div><img src='<?=$myrow["mini_img"]?>' />
<div >
<?=implode('</p>', $myrow["text"][0])?>
</p><script type="text/javascript"><!--
google_ad_client = "...";
/* pod_img */
google_ad_slot = "...";
google_ad_width = 125;
google_ad_height = 125;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<?=implode('</p>', $myrow["text"][1])?>
</p>
</div></div>
<p><?=$myrow["author"]?></p>
|
| |
|
|
|
|
|
|
|
для: hitball
(20.09.2017 в 13:15)
| | Да, помню, речь была о разбиении текста по тегу параграфа. Но вы же пишите, что код строки 134, это:
<?=implode('</p>', $myrow["text"][1])?>
|
Где не разбиение, а обратная операция и вывод. Более того, если настройками подавлен вывод предупреждений, то интерпретатор примет значение несуществующей переменной равное null и в данном случае ничего не выведет.
Вы же пишите, что работа вообще заканчивается крахом (предупреждения не страшны, но они могут быть предпосылками дальнейших проблем, а по сему в режиме отладки вывод их должен быть включен).
Либо вы ошиблись строкой, либо массив $myrow["text"] имеет один элемент (согласно сообщению), а значит это
<?=implode('</p>', $myrow["text"][1])?>
нелогичный подход. Проанализируйте что получаете в $myrow["text"] простым выводом на экран. | |
|
|
|
|
|
|
|
для: confirm
(20.09.2017 в 14:52)
| | вывод на экран идеальный - текст делится по абзацам и выводится реклама. Если бы не глянула в логи, никогда бы не подумала, что там ошибка | |
|
|
|
|
|
|
|
для: hitball
(20.09.2017 в 16:44)
| | Вы не смотрите на то, что на странице, вы проанализируйте, что получаете после разбиения массива на части (array_chunk) и у вас гарантировано нет элемента с индексом 1 в нем. А так как в логах, это не ошибки, тем более не фатальные, то что есть в этом массиве будет выедено, чего нет - нет. Вот вам и кажется, что все Ок, чего еще надо.
PHP Notice: Undefined offset: 1 in view_articles.php on line 134
PHP Примечание: неопределенное смещение: 1 в view_articles.php в строке 134
(то есть нет в указанном массиве элемента к которому ссылаются)
PHP Warning: implode(): Invalid arguments passed in /view_articles.php on line 134
PHP Warning: implode (): неверные аргументы, переданные в /view_articles.php в строке 134
(то есть функция implode ожидает массив, а ей передается иное)
Учитесь выявлять причины, и самые простейшие для этого элементы инструменты, это echo, print_r, var_dump "сомнительных" переменных. | |
|
|
|
|
|
|
|
для: confirm
(29.03.2013 в 21:40)
| | confirm, огромное вам человеческое спасибо через четыре года! только сейчас заметила ваш ответ! Тогда так и не решила вопрос, а сегодня пришлось снова им занятся и единственное место где нашла ответ - это здесь! СПАСИБИЩЕ!!! | |
|
|
|
|