Как предусмотреть вставку рекламного блока посредине статьи?

Главные вкладки

Аватар пользователя qwert123 qwert123 22 ноября 2015 в 7:22

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

Комментарии

Аватар пользователя tlito tlito 22 ноября 2015 в 8:05

https://www.drupal.org/project/insert_block тут вы сможете вставлять токен в тексте.
если вам надо не заботясь, то надо делать hook_node_view_alter() и с помощью регулярных выражений для поля body находить место, куда вы хотите вставить блок (динамически отобразить), например, можно после двух абзацей то есть так:

<p>...</p> <p>..</p> сюда
для этого вам понадобится функция рендера блока, обозначенная тут
https://www.drupal.org/node/1032068
и, конечно, знание функции preg_replace(). все это в хуке в template.php tehemename_node_view_alter()
а для вставки рекламы между тизерами можно так
между 7и8 и 15и16 тизерами выводим эдсенс так: (если у вас по 10 тизеров, то не используйте второе условие if)

<?php /*adsense block 7 */
if ( !$page && ($id == || $id == 16)) {
  
$block block_load('block'7); //7-id блока с рекламой
  
$block _block_render_blocks(array($block));
  
$block_build _block_get_renderable_array($block);
  echo 
drupal_render($block_build);
}  
//echo "nid: ".$node->nid;
?>

-- этот код надо в начало файла node.tpl.php поместить

Аватар пользователя qwert123 qwert123 22 ноября 2015 в 17:45

tlito wrote:
https://www.drupal.org/project/insert_block тут вы сможете вставлять токен в тексте.

Благодарю за подробный ответ! Т.к. сайт только создается, то подойдет Insert Block. Правда смущает dev версия...

Только я не могу понять, хуже или лучше использовать этот модуль с точки зрения производительности и безопасности по сравнению с выводом php снипета "...php print render..." конкретного блока в теле ноды при добавлении статьи? При том что возможность использовать ввод php в редакторе будет только у роли админа и никто посторонний доступ к такой возможности не получит (ну еще роль менеджера, в котором уверен).

Аватар пользователя tlito tlito 22 ноября 2015 в 18:24

token не самый медленный, но дает свой вклад в торможение друпала.
чистый пхп без использования друпал функций - самый быстрый
пхп с использованием друпал функций - немного медленее
и гораздо медленнее ставить новый модуль и тем более который анализирует текст и ищет токены - это очень медленно, хотя не будет заметно взгляду

Аватар пользователя qwert123 qwert123 22 ноября 2015 в 19:24

т.е. insert_block это худший вариант с точки зрения производительности? А как насчет str_replace если использовать? Тогда никакой php в редакторе не нужен, просто в редакторе писать фразу "-reklama-" например, а ее потом заменять на рекламный код с помощью str_replace... Вот здесь подобный способ описан, но для dle http://www.inforeks.ru/cms/75-vstavka-reklamy-dle.html

Аватар пользователя tlito tlito 22 ноября 2015 в 19:55

да, самый медленный, и то что вы предложили - так оптимальнее. можете использовать обычные хтмл-скобки комментариев <!-- adv -->

Аватар пользователя qwert123 qwert123 23 ноября 2015 в 11:06

а возможно будет, если метод str_replace использовать, показывать рекламу в зависимости от роли юзера? Как это делать объяснять не нужно, просто на будущее спрашиваю возможно ли впринципе. Потому что по сравнению с insert_block это единственный минус для меня, блок то можно показывать в зависимости от роли...

Аватар пользователя tlito tlito 23 ноября 2015 в 13:30

можно. использование друпал функций возможно если вы пишете хук на пхп.
если вы это не осилите https://api.drupal.org/api/drupal/modules!user!user.module/function/user...
то вот пример
http://drupal.stackexchange.com/questions/15390/check-if-a-user-has-a-role

<?php// Load the currently logged in user.
global $user;

// Check if the user has the 'editor' role.
if (in_array('editor', $user->roles)) {
  // do fancy stuff
}?>

Аватар пользователя qwert123 qwert123 23 ноября 2015 в 14:35

блин начал делать и такой еще возник вопрос - если в html коде страницы не отображается добавленная запись <!-- adv -->, значит ли что и рекламный блок не будет отображаться? Как сделать чтобы отображалась запись я знаю - добавлю в filtered html разрешенный тег <!--  -->. Но просто я подумал может и без этого будет работать - при трансформации записи <!-- adv --> в рекламный блок, блок уже будет проходить и отображаться...

P.S. лучше конечно взять и проверить, но просто писать функцию str replace я буду в будущем с программистом, через пару месяцев, а щас надо пока правильно вставлять.

Аватар пользователя Niklan Niklan 23 ноября 2015 в 17:18

Хоспади, что вам тут насоветовали.

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

Если вы хотите вставлять в середину содержимого, тут единственное верное решение - написать свой фильтр. Пишется он при помощи hook_filter_info()

Далее дело фантазии, как вы будете искать "центр". Либо как предложили, введете какое-то условное обозначение что тут должна быть реклама, и заменять при помощи pre_replace() на рекламный код. Но в таком случае вам придется писать эти "условные обозначения" в тексте. Либо анализировать, допустим, кол-во <p>, делить на 2 и вставлять после данного элемента на автоматике, это намного гибче, если вы захотите немного сменить алгоритм в будущем.

Вот вам набросок-пример с заменой, отталкивайтесь от него. И не забуьте включить данный фильтр в нужном формате ввода.

<?php
/**
 * Implements hook_filter_info().
 */
function MYMODULE_filter_info() {
  
// Объявляем наш фильтр.
  
$filters['adv_in_content'] = array(
    
'title' => 'Реклама в содержимом',
    
'description' => 'Вставляет рекламу в содержимое на место {{ adv }}',
    
'process callback' => '_MYMODULE_filter_adv_in_content_process',
  );
  return 
$filters;
}

/**
 * Обработчик фильтра для вставки рекламы.
 */
function _MYMODULE_filter_adv_in_content_process($text$filter) {
  
$text str_replace('{{ adv }}''Реклама...'$text);
  return 
$text;
}
?>
Аватар пользователя adubovskoy adubovskoy 23 ноября 2015 в 16:02

ага, только на http://dru.io есть рейтинг доверия к ответам и плохие советы видно. а тут боль и унижение надо пройти, если толкового ответа нет или не знаешь какое решение выбрать.

Аватар пользователя adubovskoy adubovskoy 23 ноября 2015 в 16:47

Это тут при чем? Растет. К текущему топику какое отношение? Пошутил на тему - получай контраргументацию. Вы человек полезный, шутить любите)