Как выделить аннотацию (тизер) из тела ноды и вынести ее в отдельную переменную?

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

Аватар пользователя alex_ros alex_ros 24 марта 2010 в 17:07

Я начинающий друпаллер, поэтому у меня есть может быть простой вопрос...

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

Если выделить аннотацию в отдельную переменную у меня получилось благодаря фунции tеmplate_preprocess_node. То удалить аннотацию из тела ноды красиво и безболезненно не получается.

Вот собственно код:

<?php  
if ($variables['page'] == TRUE) {
  
$node node_load($variables['nid']);
  
$pos strpos($node->body'
<!--break-->
'
);
  if (
$pos !== 0) {
    
$body_wo_teaser substr($node->body,$pos+12);
    
$variables['my_teaser'] = check_markup($node->teaser$node->formatFALSE);
    
$variables['content'] = $body_wo_teaser;
    }
?>

Выполнение этого кода $variables['content'] = $body_wo_teaser; перетирает темизированный уже вывод, исзечает картинка (поле ноды), которая уже включена (не знаю где). Таким образом анонс из тела ноды надо исключать где-то до темизации, где не знаю. Помогите кто знает!

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

Комментарии

Аватар пользователя alex_ros alex_ros 27 марта 2010 в 20:23

нет, уточняю, создан тип ноды в которой имеется поле для картинки (модуль imagefield), так вот, эта картинка уже включена в $variables['node'] и ее нет еще в ноде загруженной с помощью node_load.

Аватар пользователя alex_ros alex_ros 30 марта 2010 в 0:06

Итак я нашел решение, не знаю насколько удачное, но все работает как я и хотел...

1. Пришлось делать свой простейший модуль и переопределить функцию modulename_nodeapi:

<?php
function body_wo_teaser_nodeapi(&$node$op$a3 NULL$a4 NULL){
    
    if (
$op=='load') {
        
        
$delimiter '<!--break-->';
        
        
$delimiter_pos strpos($node->body,$delimiter);
        
        if (
$delimiter_pos !== 0) {
            
$body_pos $delimiter_pos strlen($delimiter) + 2// +2 поправка на \r\n...
            
$body_only substr($node->body,$body_pos); // получили только тело документа без анонса...
            
$node->teaser_only $node->teaser// создали аннонс в отдельной переменной...
            
$node->body $body_only// установили тело документа без анонса.
            

        
        }

}

?>

2. В своей теме в файл template.php я переопределил функцию template_preprocess_node следующим образом:

<?php
function template_preprocess_node(&$variables) {
  
  if (
$variables['page'] == TRUE) {
      
$node node_load($variables['nid']);
      
$variables['teaser_only'] = check_markup($node->teaser_only$node->formatFALSE);  
      }
  else 
$variables['teaser_only'] = '';

  }

?>

3. В своей теме в файле node.tpl.php добавить строку:

<?php print $picture; ?>
<div class="art-teaser"><?php echo $teaser_only; ?></div>
<?php echo $content; ?>

4. В файле stylus.css вставить класс стиля:

.art-teaser p
{
font-weight: bold;
margin: 10px 0;
}

p.s. Собственно чего я этим добился:

1. При выводе документа, я могу кастомизировать с помощью стилей вывод анонса (мне необходимо было его выделять жирным шрифтом);
2. И я его хотел разместить в моем случае в следующем порядке: заголовок, дата создания и автор, анонс, картинка и собственно тело документа.

Аватар пользователя alex_ros alex_ros 30 марта 2010 в 18:22

Вся проблема решилась еще проще (пункт 1(см. выше) можно вычеркнуть), следующим образом:

<?php
function template_preprocess_node(&$variables) {
  
  if (
$variables['page'] == TRUE) {
    
$node node_load($variables['nid']);
    
$teaser_only check_markup($node->teaser$node->formatFALSE);
    
$variables['teaser_only'] = $teaser_only;
    
$content_wo_teaser str_replace($teaser_only,'',$variables['content']);
    
$variables['content'] = $content_wo_teaser;
    }
  else {
    
$variables['teaser_only'] = '';   
    }
}
?>

Никакого модуля писать не надо :-))).