str_replace в модуле token

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

Аватар пользователя kv4 kv4 1 апреля 2014 в 18:44

Привет!

Возникла проблема, может кто-то поможет разрешить.

Есть вот такой код

<?php
  $text 
"[block:views:test-test_bxslider] [block:user:online] [block:node:recent]";
  
  
$tokens = array('[block:views:test-test_bxslider]''[block:user:online]''[block:node:recent]');
  
$values = array('html-1''html-2''html-3');

  foreach(

$tokens as $key => $token){
    
$text str_replace($token$values[$key], $text);
  }
?>

'html-1', 'html-2', 'html-3' - подразумевается какая-то разметка.

В прикреплённом файле разметка для [block:views:test-test_bxslider]

Так вот, первая же замена заменяет просто всё содержимое $text.

Причем, это происходит не всегда. Если в качестве заменителя использовать простой текст (не html) то все в порядке, и даже с некоторым HTML всё работает. Но вот конкретно с тем, что я приложил (в прикреплённом файле) и некоторыми другими вариантами, содержимое заменятся просто всё целиком.

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

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

<div class="row">
    <div class="col-md-4">[block:views:test-block-0]</div>
    <div class="col-md-4">[block:views:test-block-1]</div>
    <div class="col-md-4">[block:views:test-block-2]</div>
</div>

Реализовал hook_token_info() и hook_tokens() в своём модуле, подключил Token Filter
Должно бы работать, но не работает.

Собственно код приведённый выше, это изменённый кусок из

<?php
function token_replace($text, array $data = array(), array $options = array()) {
  
$text_tokens token_scan($text);
  if (empty(
$text_tokens)) {
    return 
$text;
  }

  

$replacements = array();
  foreach (
$text_tokens as $type => $tokens) {
    
$replacements += token_generate($type$tokens$data$options);
    if (!empty(
$options['clear'])) {
      
$replacements += array_fill_keys($tokens'');
    }
  }

  

// Optionally alter the list of replacement values.
  
if (!empty($options['callback']) && function_exists($options['callback'])) {
    
$function $options['callback'];
    
$function($replacements$data$options);
  }

  

$tokens array_keys($replacements);
  
$values array_values($replacements);

  return 

str_replace($tokens$values$text);
}
?>

Понятно, что вопрос не имеет прямого отношения к Drupal, но всё же может есть идеи...

Спасибо.

ВложениеРазмер
Иконка простого текстового файла html.txt7.83 КБ