phpBB3: Last Post Subject on Board Index

This is a modification you can find easily in the Knowledge Base section on the phpBB website. However, I have made some slight alterations to the template edit, as well as increased the number of characters allowed for the subject to be displayed. Keep in mind that I only use proSilver-based styles, and so the smaller 10-character limit is more suitable for subSilber-based styles. On top of that, the difference in template changes are specifically for proSilver-based styles as well, and would not work for subSilver.

A sample of how the subject will look on the board index.phpBB3: Last Post Subject on Board Index

The link to the original mod article is here.

#
#—-[ OPEN ]———————————————————–
#

includes/functions_display.php

#
#—-[ FIND ]———————————————————–
#

			'LAST_POST_SUBJECT'		=> censor_text($last_post_subject),

#
#—-[ REPLACE WITH ]—————————————————
#

			'LAST_POST_SUBJECT'		=> (utf8_strlen(censor_text($last_post_subject)) > 30) ? utf8_substr(censor_text($last_post_subject), 0, 30) . '...' : censor_text($last_post_subject),

#
#—-[ OPEN ]———————————————————–
#

styles/prosilver/template/forumlist_body.html

#
#—-[ FIND ]———————————————————–
#

						<!-- IF forumrow.U_UNAPPROVED_TOPICS --><a href="{forumrow.U_UNAPPROVED_TOPICS}">{UNAPPROVED_IMG}</a><!-- ENDIF -->
						<!-- IF forumrow.LAST_POST_TIME --><dfn>{L_LAST_POST}</dfn> {L_POST_BY_AUTHOR} {forumrow.LAST_POSTER_FULL}
						<!-- IF not S_IS_BOT --><a href="{forumrow.U_LAST_POST}">{LAST_POST_IMG}</a> <!-- ENDIF --><br />{forumrow.LAST_POST_TIME}<!-- ELSE -->{L_NO_POSTS}<br />&nbsp;<!-- ENDIF --></span>

#
#—-[ REPLACE WITH ]—————————————————
#

						<!-- IF forumrow.U_UNAPPROVED_TOPICS --><a href="{forumrow.U_UNAPPROVED_TOPICS}">{UNAPPROVED_IMG}</a><!-- ENDIF -->
						<!-- IF forumrow.LAST_POST_TIME --><a href="{forumrow.U_LAST_POST}">{forumrow.LAST_POST_SUBJECT}</a><dfn>{L_LAST_POST}</dfn>
						<br />{forumrow.LAST_POST_TIME} {L_POST_BY_AUTHOR} {forumrow.LAST_POSTER_FULL}
						<!-- ELSE -->{L_NO_POSTS}<br />&nbsp;<!-- ENDIF --></span>

phpBB3: Auto-Resize Avatar

It makes no sense to me why the phpBB developers haven’t already included this functionality in phpBB by default, as the SMF board developers have done. But one great thing about SMF over phpBB is that after installing, you can simply set the dimension requirements for avatars and users who attempt to use larger images have those images resized to within the boundaries set on the board. Well, there is a mod for phpBB that allows it to do the same thing. Though the mod is listed as abandoned on the phpBB mod database, the mod still works well.

The mod was put together by Michal Poltyn. I have simply adjusted tabs and spaces to make the code more presentable to fit more neatly in the phpBB functions that are edited.

#
#—-[ OPEN ]———————————————————–
#

includes/function_upload.php

#
#—-[ FIND ]———————————————————–
#

		if (!$this->upload->valid_dimensions($this))
		{
				$this->error[] = sprintf($user->lang[$this->upload->error_prefix . 'WRONG_SIZE'], $this->upload->min_width, $this->upload->min_height, $this->upload->max_width, //$this->upload->max_height, $this->width, $this->height);

			return false;
		}
		return true;
	}

#
#—-[ REPLACE WITH ]—————————————————
#

		if (!$this->upload->valid_dimensions($this))
   		{
      			$valid = $this->create_thumb();
      			if (!$valid)
      			{
         			$this->error[] = sprintf($user->lang[$this->upload->error_prefix . 'WRONG_SIZE'], $this->upload->min_width, $this->upload->min_height, $this->upload->max_width, $this->upload->max_height, $this->width, $this->height);
         			return false;
      			}
   		}

   		return true;
	}

	/**
	* Create a thumb if uploaded image is too big.
	* This function was based mainly on MediaWiki's thumbnail creating process
	* and create_thumbnail function in functions_posting.php
	* @source MediaWiki
	*/
	function create_thumb()
	{
   		global $config;

   		if ($this->width > $this->height) 
   		{
      			$thumb_width = $this->upload->max_width;
      			$thumb_height = $this->height*($this->upload->max_height/$this->width);
   		}
   		else if ($this->width < $this->height) 
   		{
      			$thumb_width = $this->width*($this->upload->max_width/$this->height);
      			$thumb_height = $this->upload->max_height;
   		}
   		else /* $this->width == $this->height */
   		{
      			$thumb_width = $this->upload->max_width;
      			$thumb_height = $this->upload->max_height;
   		}

   		// Only use imagemagick if defined and the passthru function not disabled
   		if ($config['img_imagick'] && function_exists('passthru'))
   		{
      			$quality = '';
      			$sharpen = '';
      			$frame = '';
      			$animation = '';
      			if ( $this->mimetype == 'image/jpeg' )
      			{
         			$quality = '-quality 80'; // 80%
         			/** Reduction in linear dimensions below which sharpening will be enabled */
         			if ( ( $thumb_width + $thumb_height ) / ( $this->width + $this->height ) < 0.85 )
         			{
            				$sharpen = '-sharpen 0x0.4';
         			}
      			}
      			else if ($this->mimetype == 'image/png')
      			{
         			$quality = '-quality 95'; // zlib 9, adaptive filtering
      			}
      			else if ($this->mimetype == 'image/gif')
      			{
         			/**
          			* Force thumbnailing of animated GIFs above this size to a single
          			* frame instead of an animated thumbnail. ImageMagick seems to
          			* get real unhappy and doesn't play well with resource limits. 
          			* Defaulting to 1 megapixel (1000x1000)
          			*/
         			if($this->width * $this->height > 1.0e6)
         			{
            				// Extract initial frame only
            				$frame = '[0]';
         			}
         			else
         			{
            				// Coalesce is needed to scale animated GIFs properly (MediaWiki bug 1017).
            				$animation = ' -coalesce ';
         			}
      			}
      			# Specify white background color, will be used for transparent images
      			# in Internet Explorer/Windows instead of default black.

      			# Note, we specify "-size {$this->width}" and NOT "-size {$this->width}x{$this->height}".
      			# It seems that ImageMagick has a bug wherein it produces thumbnails of
      			# the wrong size in the second case.

      			if (substr($config['img_imagick'], -1) !== '/')
      			{
         			$config['img_imagick'] .= '/';
      			}
      			$cmd  = 
         			escapeshellcmd($config['img_imagick']) . 'convert' . ((defined('PHP_OS') && preg_match('#^win#i', PHP_OS)) ? '.exe' : '') .
         			" {$quality} -background white -size {$this->width} ".
         			escapeshellarg($this->destination_file . $frame) .
         			$animation .
         			// For the -resize option a "!" is needed to force exact size,
         			// or ImageMagick may decide your ratio is wrong and slice off
         			// a pixel.
         			' -thumbnail ' . escapeshellarg( "{$thumb_width}x{$thumb_height}!" ) .
         			" -depth 8 $sharpen " .
         			escapeshellarg($this->destination_file) . ' 2>&1';

      			@passthru($cmd);

      			// after converting let's check the file dimensions again
      			if (($this->image_info = @getimagesize($this->destination_file)) !== false)
      			{
         			$this->width = $this->image_info[0]; // the _real_ width
         			$this->height = $this->image_info[1]; // the _real_ height
         			if ($this->upload->valid_dimensions($this)) 
         			{
            				return true;
         			}
      			}
   		}
   		if (extension_loaded('gd'))
   		{
      			/* This code is greatly based on MediaWiki's thumbnail generation process */
      			$typemap = array(
         			'image/gif'          => array( 'imagecreatefromgif',  'palette',   'imagegif'  ),
         			'image/jpeg'         => array( 'imagecreatefromjpeg', 'truecolor', array( __CLASS__, 'imagejpegwrapper' ) ),
         			'image/png'          => array( 'imagecreatefrompng',  'bits',      'imagepng'  ),
         			'image/vnd.wap.wbmp' => array( 'imagecreatefromwbmp', 'palette',   'imagewbmp'  ),
         			'image/xbm'          => array( 'imagecreatefromxbm',  'palette',   'imagexbm'  ),
      			);
      			if (!isset( $typemap[$this->mimetype] ))
      			{
         			return false;
      			}

      			list($loader, $color_style, $save_type) = $typemap[$this->mimetype];

      			if (!function_exists($loader))
      			{
         			return false;
      			}
      			$src_image = call_user_func( $loader, $this->destination_file );
      			$thumb = imagecreatetruecolor($thumb_width, $thumb_height);

      			// Initialise the destination image to transparent instead of
      			// the default solid black, to support PNG and GIF transparency nicely
      			$background = imagecolorallocate( $thumb, 0, 0, 0 );
      			imagecolortransparent( $thumb, $background );
      			imagealphablending( $thumb, false );

      			if( $color_style == 'palette' ) {
         			// Don't resample for paletted GIF images.
         			// It may just uglify them, and completely breaks transparency.
         			imagecopyresized( $thumb, $src_image,
            			0,0,0,0,
            			$thumb_width, $thumb_height, $this->width, $this->height );
      			} else {
         			imagecopyresampled( $thumb, $src_image,
            			0,0,0,0,
            			$thumb_width, $thumb_height, $this->width, $this->height );
      			}

			imagesavealpha( $thumb, true );

      			call_user_func( $save_type, $thumb, $this->destination_file );
      			imagedestroy($thumb);
      			imagedestroy($src_image);
      			$this->width = $thumb_width;
      			$this->height = $thumb_height;
      			return true;
   		}
   		return false;
	}

	static function imagejpegwrapper( $dst_image, $thumb_path ) {
   		imageinterlace( $dst_image );
   		imagejpeg( $dst_image, $thumb_path, 95 );
	}

 

phpFreeChat and phpBB3: Better Group Identifying

When comparing all of the free or open-source software available for providing chat on a website that I have seen so far, I have personally found phpFreeChat to be one of the more impressive options. Though a new version is in the works (2.x), the first branch (1.x) is the most stable and contains the most features as of this moment.

Of those features:

  • the ability for anyone to create rooms (if enabled)
  • op status for administrating, as well as the ability to identify chatters by their credentials from various other site software (such as phpBB)
  • an assortment of theme options that are included, as well as the ability to customize with your own
  • private messaging

I don’t need to explain a great deal about phpFreeChat. You can learn almost anything you need to know about it from its official website and forums. However, what I did not find there and thought useful is a better way to identify chatters for granting op status based on their phpBB group(s). I typically use phpBB as a board in most scenarios.

Here is a copy of the basic chat setup from the phpFreeChat website for integrating with phpBB and using its user information for chatters:

<?php
define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : '../';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
require($phpbb_root_path . 'common.' . $phpEx);

// Start session management
$user->session_begin();
$auth->acl($user->data);
$user->setup();

if ($user->data['user_id'] == ANONYMOUS)
{
	login_box('', $user->lang['LOGIN']);
}
?>
<?php

require_once dirname(__FILE__)."/src/phpfreechat.class.php";
$params = array();
$params["title"] = "Quick chat";
$params["nick"] = $user->data['username_clean']; 
$params['firstisadmin'] = false;
if ($user->data['group_id'] == 4 OR $user->data['group_id'] == 5) // Admins and Moderators
{
$params["isadmin"] = true; // Do what you want cause a pirate is free, you are a pirate ;)
}

$params["serverid"] = md5(__FILE__); // calculate a unique id for this chat
$params["debug"] = false;
$chat = new phpFreeChat( $params );

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
 <head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  <title>Chicken Talk Chat Room</title>  
 </head>
 <body>
<div class="content">
  <?php $chat->printChat(); ?>
</div>

</body></html>

I have highlighted the lines that grant op status based on the user’s board group.

The method I now use was found by searching the phpBB boards for a way to determine whether a user is in a particular group. You may think this is what is already done in the phpFreeChat example of using phpBB to identify chatters to grant op status above, but what is actually being done there is the chat script is determining if one of the groups being checked is the user’s primary group. Because group assignment is an important way to identify a board user’s main role, it is not uncommon for users to be in multiple groups so that they can access multiple functions. For example, a particular user may be a board administrator, but his primary group is support – because that is his main function on the board. In this case, in order for the user to get op status in the chat, you would have to have the check be looking for the support group, because that is the group ID that will be seen here since it is the user’s primary group. Even though the admin group is being checked, only one group ID is being passed for the user in this case, and it is the user’s primary group only.

For the method that I prefer, follow these steps:

  1. Require the includes/functions_user.php file.
    Find: 

    require($phpbb_root_path . 'common.' . $phpEx);

    and add the following after it:

    require($phpbb_root_path . 'includes/functions_user.' . $phpEx);
  2. Use the group_memberships() function to identify an array of all of the user’s assigned groups.
    Find: 

    if ($user->data['group_id'] == 4 OR $user->data['group_id'] == 5) // Admins and Moderators
    {
    $params["isadmin"] = true; // Do what you want cause a pirate is free, you are a pirate ;)
    }

    and replace it with the following:

    if (group_memberships(array(4,5),$user->data['user_id'],true))
    {
       $params["isadmin"] = true; // Do what you want cause a pirate is free, you are a pirate ;)
    }

As that example is now, it is still only checking for the Administrator and Global moderator groups. However, you can add a group ID to the array within the parentheses and it will check for that group as well. Unlike the original method, this check will pass so long as the user is within one of the listed groups – not requiring the group to be the user’s primary group.

Also, if you wish to not require chatters to be registered and logged in on your board, you can do the following to allow guest chatting:

  1. Find:
    if ($user->data['user_id'] == ANONYMOUS)
    {
    	login_box('', $user->lang['LOGIN']);
    }

    and replace it with the following:

    $RequireLogin = false; // if true, will require chatter to be logged in on the phpBB board 
    if ($user->data['user_id'] == ANONYMOUS)
    {
       if($RequireLogin)
       {
          login_box('', $user->lang['LOGIN']);
       }
    }

    Changing $RequireLogin to true will allow you to quickly revert back to requiring registeration and login without having to replace code again.

  2. Find:
    $params["nick"] = $user->data['username_clean'];

    and replace it with the following:

    if ($user->data['user_id'] != ANONYMOUS) $params["nick"] = $user->data['username_clean']; // phpBB nick used

    If this isn’t done and the $RequireLogin variable is set to false, the guest will be given the nick ANONYMOUS. Otherwise, they are either prompted for a nick upon loading the chat or given a randomly generated guest nick – depending on your phpFreeChat configuration for that.