SimplePortal

Customization => Custom Coding => Topic started by: Nigel on April 30, 2009, 10:35:08 AM

Title: Modify BoardNews Block
Post by: Nigel on April 30, 2009, 10:35:08 AM
Hi,

I'm wondering if there a way I can copy and modify the code used for the default news (BoardNews) block on SP?
Because the layout and contents of this block is perfect for my site. Unfortunately  since I'd like to gather news data from different Boards I needed to create a PHP block and the results were not even close to the default SP news block  :|

This is what I got so far:
Code: [Select]
   global $scripturl, $db_prefix, $txt, $settings, $modSettings, $context;
   global $smcFunc, $return, $color_profile, $func;

   loadLanguage('Stats');

  $boards =4;
   $limit = 5;
   $start = 0;
   $length = 250;
   $avatars = 1;

   $limit = max(0, $limit);
   $start = max(0, $start);

   // Make sure guests can see this board.
   $request = db_query("
      SELECT ID_BOARD
      FROM {$db_prefix}boards
      WHERE " . ($boards === null ? '' : "ID_BOARD = $boards
         AND ") . "FIND_IN_SET(-1, memberGroups)
      LIMIT 1", __FILE__, __LINE__);
   if (mysql_num_rows($request) == 0)
   {
      echo $txt['smf_news_error2'];
      return false;
   }
   list ($boards) = mysql_fetch_row($request);
   mysql_free_result($request);

   // Load the message icons - the usual suspects.
   $stable_icons = array('xx', 'thumbup', 'thumbdown', 'exclamation', 'question', 'lamp', 'smiley', 'angry', 'cheesy', 'grin', 'sad', 'wink', 'moved', 'recycled', 'wireless');
   $icon_sources = array();
   foreach ($stable_icons as $icon)
      $icon_sources[$icon] = 'images_url';

   // Find the post ids.
   $request = db_query("
      SELECT ID_FIRST_MSG
      FROM {$db_prefix}topics
      WHERE ID_BOARD = $boards
      ORDER BY ID_FIRST_MSG DESC
      LIMIT $start, $limit", __FILE__, __LINE__);
   $posts = array();
   while ($row = mysql_fetch_assoc($request))
      $posts[] = $row['ID_FIRST_MSG'];
   mysql_free_result($request);

   if (empty($posts))
      return array();

   // Find the posts.
   $request = db_query("
      SELECT
         m.icon, m.subject, m.body, IFNULL(mem.realName, m.posterName) AS posterName, m.posterTime,
         t.numReplies, t.numViews, t.ID_TOPIC, m.ID_MEMBER, m.smileysEnabled, m.ID_MSG, t.locked, mem.avatar, a.ID_ATTACH, a.attachmentType, a.filename
      FROM ({$db_prefix}topics AS t, {$db_prefix}messages AS m)
         LEFT JOIN {$db_prefix}members AS mem ON (mem.ID_MEMBER = m.ID_MEMBER)
         LEFT JOIN {$db_prefix}attachments AS a ON (a.ID_MEMBER = m.ID_MEMBER)
      WHERE t.ID_FIRST_MSG IN (" . implode(', ', $posts) . ")
         AND m.ID_MSG = t.ID_FIRST_MSG
      ORDER BY t.ID_FIRST_MSG DESC
      LIMIT " . count($posts), __FILE__, __LINE__);
   $return = array();
   $colorids = array();
   while ($row = mysql_fetch_assoc($request))
   {
      //on html replace the length... to prevent style errors... normal only admin can use this so this is the admin fault! Boardnews
      $oldlength = $length;
      if(stripos($row['body'], '[html]') !== false) {
         $length = strrpos(strtolower($row['body']), '[/html]')+7;
      }

      // If we want to limit the length of the post.
      if (!empty($length) && $func['strlen']($row['body']) > $length)
      {
         $row['body'] = $func['substr']($row['body'], 0, $length);

         // The first space or line break. (<br />, etc.)
         $cutoff = max(strrpos($row['body'], ' '), strrpos($row['body'], '<'));

         if ($cutoff !== false)
            $row['body'] = $func['substr']($row['body'], 0, $cutoff);
         $row['body'] .= '...';
      }
     
      //So is there a unclosed bbc near the end try to truncate them
      if(strrpos($row['body'], '[') > strrpos($row['body'], ']')) {
         $row['body'] = $func['substr']($row['body'], 0, strrpos($row['body'], '['));
         $row['body'] .= '...';
      }

      $row['body'] = parse_bbc($row['body'], $row['smileysEnabled'], $row['ID_MSG']);

      //Fix the the html fix for admins back to an normal way =).
      if($oldlength != $length)
         $length = $oldlength;

      // Check if the topic icon exists.
      if (!isset($icon_sources[$row['icon']]))
         $icon_sources[$row['icon']] = file_exists($settings['theme_dir'] . '/images/post/' . $row['icon'] . '.gif') ? 'images_url' : 'default_images_url';
     
      if (stristr($row['avatar'], 'http://') && !empty($modSettings['avatar_check_size']))
      {
         $sizes = url_image_size($row['avatar']);

         // Does your avatar still fit the maximum size?
         if ($modSettings['avatar_action_too_large'] == 'option_refuse' && is_array($sizes) && (($sizes[0] > $modSettings['avatar_max_width_external'] && !empty($modSettings['avatar_max_width_external'])) || ($sizes[1] > $modSettings['avatar_max_height_external'] && !empty($modSettings['avatar_max_height_external']))))
         {
            // Fix it permanently!
            $row['avatar'] = '';
            updateMemberData($row['ID_MEMBER'], array('avatar' => '\'\''));
         }
      }

      // Check that this message icon is there...
      if (empty($modSettings['messageIconChecks_disable']) && !isset($icon_sources[$row['icon']]))
         $icon_sources[$row['icon']] = file_exists($settings['theme_dir'] . '/images/post/' . $row['icon'] . '.gif') ? 'images_url' : 'default_images_url';

      censorText($row['subject']);
      censorText($row['body']);
     
      //Collect the color ids :)
      if(!empty($row['ID_MEMBER']))
         $colorids[$row['ID_MEMBER']] = $row['ID_MEMBER'];

      $return[] = array(
         'id' => $row['ID_TOPIC'],
         'message_id' => $row['ID_MSG'],
         'icon' => '<img src="' . $settings[$icon_sources[$row['icon']]] . '/post/' . $row['icon'] . '.gif" align="middle" alt="' . $row['icon'] . '" border="0" />',
         'subject' => $row['subject'],
         'time' => timeformat($row['posterTime']),
         'timeyear' => timeformat($row['posterTime'], '%d %b %y'),
         'timeday' => timeformat($row['posterTime'], '%H:%M:%S'),
         'timestamp' => forum_time(true, $row['posterTime']),
         'views' => $row['numViews'],
         'body' => $row['body'],
         'href' => $scripturl . '?topic=' . $row['ID_TOPIC'] . '.0',
         'link' => '<a href="' . $scripturl . '?topic=' . $row['ID_TOPIC'] . '.0">' . $row['numReplies'] . ' ' . ($row['numReplies'] == 1 ? $txt['smf_news_1'] : $txt['smf_news_2']) . '</a>',
         'replies' => $row['numReplies'],
         'comment_href' => !empty($row['locked']) ? '' : $scripturl . '?action=post;topic=' . $row['ID_TOPIC'] . '.' . $row['numReplies'] . ';num_replies=' . $row['numReplies'],
         'comment_link' => !empty($row['locked']) ? '' : '<a href="' . $scripturl . '?action=post;topic=' . $row['ID_TOPIC'] . '.' . $row['numReplies'] . ';num_replies=' . $row['numReplies'] . '">' . $txt['smf_news_3'] . '</a>',
         'new_comment' => !empty($row['locked']) ? '' : '<a href="' . $scripturl . '?action=post;topic=' . $row['ID_TOPIC'] . '.' . $row['numReplies'] . '">' . $txt['smf_news_3'] . '</a>',
         'poster' => array(
            'id' => $row['ID_MEMBER'],
            'name' => $row['posterName'],
            'href' => !empty($row['ID_MEMBER']) ? $scripturl . '?action=profile;u=' . $row['ID_MEMBER'] : '',
            'link' => !empty($row['ID_MEMBER']) ? '<a href="' . $scripturl . '?action=profile;u=' . $row['ID_MEMBER'] . '">' . $row['posterName'] . '</a>' : $row['posterName']
         ),
         'locked' => !empty($row['locked']),
         'is_last' => false,
         'avatar' => array(
            'name' => $row['avatar'],
            'image' => $row['avatar'] == '' ? ($row['ID_ATTACH'] > 0 ? '<img src="' . (empty($row['attachmentType']) ? $scripturl . '?action=dlattach;attach=' . $row['ID_ATTACH'] . ';type=avatar' : $modSettings['custom_avatar_url'] . '/' . $row['filename']) . '" alt="" class="avatar" border="0" />' : '') : (stristr($row['avatar'], 'http://') ? '<img src="' . $row['avatar'] . '" alt="" class="avatar" border="0" />' : '<img src="' . $modSettings['avatar_url'] . '/' . htmlspecialchars($row['avatar']) . '" alt="" class="avatar" border="0" />'),
            'href' => $row['avatar'] == '' ? ($row['ID_ATTACH'] > 0 ? (empty($row['attachmentType']) ? $scripturl . '?action=dlattach;attach=' . $row['ID_ATTACH'] . ';type=avatar' : $modSettings['custom_avatar_url'] . '/' . $row['filename']) : '') : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar']),
            'url' => $row['avatar'] == '' ? '' : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar']),
         ),
      );
   }
   mysql_free_result($request);

   if (empty($return))
      return $return;

   $return[count($return) - 1]['is_last'] = true;
   
   //Give some colors to the nice poster links :)   
   if(!empty($colorids) && sp_loadColors($colorids) !== false)
      foreach($return as $k => $p)
         if(!empty($color_profile[$p['poster']['id']]['link']))
            $return[$k]['poster']['link'] = $color_profile[$p['poster']['id']]['link'];

   echo '
      <table cellpadding="0" cellspacing="0" border="0" width="100%">';

   foreach ($return as $news)
   {
      echo '
         <tr>
            <td>', $avatars && $news['avatar']['name'] !== null && !empty($news['avatar']['href']) ? '
               <img src="' . $news['avatar']['href'] . '" alt="' . $news['poster']['name'] . '" width="30" style="float: right;" />' : '', '
               <div>
                  <div style="float: left; padding-right: 5px;"><a href="', $news['href'], '">', $news['icon'], '</a></div>
                  <b><a href="', $news['href'], '">', $news['subject'], '</a></b>
                  <div class="smalltext">', $news['time'], ' ', $txt[525], ' ', $news['poster']['link'], '</div>
                  <div class="post" style="padding: 2ex 0;">', $news['body'], '</div>
                  ', $news['link'], $news['locked'] ? '' : ' | ' . $news['comment_link'], '
               </div>
            </td>
         </tr>';

      if (!$news['is_last'])
         echo '
         <tr>
            <td>
               <hr style="margin: 2ex 0;" width="100%" />
            </td>
         </tr>';
      }

      echo '
      </table>';

Any help on this?
Title: Re: Modify BoardNews Block
Post by: necrit on April 30, 2009, 03:48:18 PM
I stumbled on that too.  check this out as i figured it out with a modified script block from elsewhere.

http://simpleportal.net/index.php?topic=2132.0
SimplePortal 2.3.8 © 2008-2024, SimplePortal