У меня задача вставить не в уже существующие статьи, а предусмотреть на будущее, я сейчас их добавляю и есть возможность делать запись специальную в статье, с помощью которой потом можно будет вывести в этом месте рекламный блок. Подскажите наиболее безопасный и правильный способ с точки зрения нагрузки?
Комментарии
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 == 8 || $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 поместить
Благодарю за подробный ответ! Т.к. сайт только создается, то подойдет Insert Block. Правда смущает dev версия...
Только я не могу понять, хуже или лучше использовать этот модуль с точки зрения производительности и безопасности по сравнению с выводом php снипета "...php print render..." конкретного блока в теле ноды при добавлении статьи? При том что возможность использовать ввод php в редакторе будет только у роли админа и никто посторонний доступ к такой возможности не получит (ну еще роль менеджера, в котором уверен).
token не самый медленный, но дает свой вклад в торможение друпала.
чистый пхп без использования друпал функций - самый быстрый
пхп с использованием друпал функций - немного медленее
и гораздо медленнее ставить новый модуль и тем более который анализирует текст и ищет токены - это очень медленно, хотя не будет заметно взгляду
т.е. insert_block это худший вариант с точки зрения производительности? А как насчет str_replace если использовать? Тогда никакой php в редакторе не нужен, просто в редакторе писать фразу "-reklama-" например, а ее потом заменять на рекламный код с помощью str_replace... Вот здесь подобный способ описан, но для dle http://www.inforeks.ru/cms/75-vstavka-reklamy-dle.html
да, самый медленный, и то что вы предложили - так оптимальнее. можете использовать обычные хтмл-скобки комментариев <!-- adv -->
благодарю!
а возможно будет, если метод str_replace использовать, показывать рекламу в зависимости от роли юзера? Как это делать объяснять не нужно, просто на будущее спрашиваю возможно ли впринципе. Потому что по сравнению с insert_block это единственный минус для меня, блок то можно показывать в зависимости от роли...
можно. использование друпал функций возможно если вы пишете хук на пхп.
если вы это не осилите 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
}?>
спасибо!
блин начал делать и такой еще возник вопрос - если в html коде страницы не отображается добавленная запись
<!-- adv -->
, значит ли что и рекламный блок не будет отображаться? Как сделать чтобы отображалась запись я знаю - добавлю в filtered html разрешенный тег<!-- -->
. Но просто я подумал может и без этого будет работать - при трансформации записи<!-- adv -->
в рекламный блок, блок уже будет проходить и отображаться...P.S. лучше конечно взять и проверить, но просто писать функцию str replace я буду в будущем с программистом, через пару месяцев, а щас надо пока правильно вставлять.
Хоспади, что вам тут насоветовали.
Есть дельные советы но в кучу соберите в виде модуля, и получите что хотите.
Если вы хотите вставлять в середину содержимого, тут единственное верное решение - написать свой фильтр. Пишется он при помощи 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;
}
?>
ага, только на http://dru.io есть рейтинг доверия к ответам и плохие советы видно. а тут боль и унижение надо пройти, если толкового ответа нет или не знаешь какое решение выбрать.
да как будете писать всякое "про адептов" так и ждите...
Это тут при чем? Растет. К текущему топику какое отношение? Пошутил на тему - получай контраргументацию. Вы человек полезный, шутить любите)
Саша твой рейтинг доверия в постоянной коленно-локтевой позе. Хулиган это зло.
спасибо!