Drupal агрегаторы и индивидуальный вывод - PullRequest
0 голосов
/ 08 февраля 2011

У меня есть два блока агрегатора Drupal на моей странице, один для канала Twitter, другой для канала блога. Они оба предоставляют информацию немного по-разному.

Я бы хотел, чтобы в ленте блога отображался заголовок, а затем первые 80 символов поста в качестве тизера.

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

Пока у меня есть это:

function mythemename_aggregator_block_item($item, $feed = 0) {

  // Target p, div and images and preg_replace them with nothing
  $tagstoreplace[0] = '/<p>/';
  $tagstoreplace[1] = '/<div(.*?)>(.*?)<\/div>/im';
  $tagstoreplace[2] = '/<img[^>]*>/';

  // Generate output
  $output = '<p class="feed-item-title"><a href="'. check_url($item->link) .'">'. check_plain($item->title) ."</a></p>\n";
  $output .= '<p class="feed-item-description">' . substr(preg_replace($tagstoreplace, '', $item->description),0,80) . '...</p>';
  return $output;
}

Что отлично подходит для моего блога, отлично. Тем не менее, это, очевидно, сократит мой канал Twitter до 80 символов. Я попробовал компромисс из 140 символов, но с html и всем прочим, <a href="..."></a> включен в strlen(), так что это не очень реально, особенно если у меня есть несколько ссылок там, как это сделал бы мой блог Описание тизера слишком длинное.

Итак, наконец, мой вопрос таков: могу ли я настроить вывод в зависимости от того, на какой агрегатный канал я хочу его поставить?

Я думал об этом, получив идентификатор контейнера div на странице, но похоже, что это не пойдет. В идеале я получу такой код:

function mythemename_aggregator_block_item($item, $feed = 0) {

// Target p, div and images and preg_replace them with nothing
$tagstoreplace[0] = '/<p>/';
$tagstoreplace[1] = '/<div(.*?)>(.*?)<\/div>/im';
$tagstoreplace[2] = '/<img[^>]*>/';

// Get feed type
$blog = //something;
$twitter = //something;

// Generate output
if($blog) {
  $output = '<p class="feed-item-title"><a href="'. check_url($item->link) .'">'. check_plain($item->title) ."</a></p>\n";
  $output .= '<p class="feed-item-description">' . substr(preg_replace($tagstoreplace, '', $item->description),0,80) . '...</p>';
}
if($twitter) { $output .= '<p class="feed-item-description">' . $item->description . '</p>'; }

return $output;

Извините за длительность этого вопроса, и спасибо за настойчивость!

1 Ответ

0 голосов
/ 08 февраля 2011

Я понял это. У каждого канала есть фид в $ item-> fid. Мой код теперь читает:

    function mythemename_aggregator_block_item($item, $feed = 0) {

  // Target p, div and images and preg_replace them with nothing
  $tagstoreplace[0] = '/<p>/';
  $tagstoreplace[1] = '/<div(.*?)>(.*?)<\/div>/im';
  $tagstoreplace[2] = '/<img[^>]*>/';

  // Display the external link to the item.
  if($item->fid == '3') {
    $output = '<p class="feed-item-title"><a href="'. check_url($item->link) .'">'. check_plain($item->title) ."</a></p>\n";
    $output .= '<p class="feed-item-description">' . substr(preg_replace($tagstoreplace, '', $item->description),0,80) . '...</p>';
  }
  if($item->fid == '1') {
    $output .= '<p class="feed-item-description">' . preg_replace($tagstoreplace, '', $item->description) . '</p>';
  }
  return $output;
}
...