Version: 1.1.0, by Mooff
Developer Last Online: Nov 2013
Category: vBulletin CMS Widgets -
Version: 4.1.4
Rating:
Released: 07-17-2011
Last Update: 07-18-2011
Installs: 146
Additional Files
No support by the author.
Based on the Nivo Slider - all credit for slider awesomeness goes to them.
vB4 implementation goes to me.
What it is:
A slider for cms articles, it gets the articles via database, uses (if possible) the previewimage there and resizes it to slider size *update 1.1.0 cropping function included.
Livedemo on a Big Board (>2.000.000 posts)
the nivo slider on our site is customized to fit our heavily customized cms. Default look of this addon is shown in the picture below
facts about the nivo slider
Quote:
Originally Posted by nivo slider homepage
- ~ 600.000 downloads
- 16 transition effects
- a ton of options
- different available themes
- ...
Installation
upload all files (attached zip file) in the folder where you do need them - this has to be the same folder you will set via $slider_img_filepath (see picture)
create a new php-widget and insert the following code:
Code:
// DEBUG MODUS !
$debug_modus = false;
if($debug_modus === false)
{
ob_start();
}
//nivo slider - uf - vb.org version
//set these values as you need them:
//your slider folder - has to be read and writeable
//folder where all slider files are saved
$slider_img_filepath = 'external/unitedforum/slider/';
//picture width and height !same as in the CSS FILE!
$maxwidth = 650;
$maxheight = 250;
//do you want images without previewimage to be shown? slider is using the fallback then
$show_articles_without_image = false;
//picture shown if your articles has no previewpicture
$fallback_img = $slider_img_filepath . 'uf_fallback_slider.png';
//hardcoded maximum is 20 - if you want more just ask
$number_of_articles_shown = 10;
//lengh in characters of the article descriptions
$description_length = 95;
//stretch picture or crop them? false = strechting (default) true = cropping (beta)
$crop = false;
//Debug Messages
if($debug_modus)
{
echo "<span style='color:red;'>DEBUG MODE is ON! </span><br />";
echo "slider_img_filepath: $slider_img_filepath <br />";
echo "width: $maxwidth height: $maxheight <br />";
echo "Strech or Crop? $crop <br />";
echo "show_articles_without_image: ";
var_dump($show_articles_without_image);
echo " <br />";
echo "fallback_img: $fallback_img <br />";
echo "#img: $number_of_articles_shown <br />";
echo "description_length: $description_length <br />";
echo 'directory ' . DIR . '<br />';
}
$article_type = vb_Types::instance()->getContentTypeID("vBCms_Article");
$time = TIMENOW;
if(!extension_loaded('gd'))
{
echo '<span style="color:red">Error occurred:</span> Your System does not support the GD-Libary. Please install the GD-Libary.<br />';
}
$article_get = vB::$db->query_read('
SELECT
article.pagetext,
article.previewimage,
node.url,
node.publishdate,
node.parentnode,
parentnode.url AS parenturl,
thread.replycount,
info.title,
node.nodeid,
GROUP_CONCAT( category.category )
FROM
'.TABLE_PREFIX.'cms_article AS article INNER JOIN
'.TABLE_PREFIX.'cms_node AS node
ON (node.contentid = article.contentid AND node.contenttypeid = ' . vb::$db->sql_prepare($article_type) .') INNER JOIN
'.TABLE_PREFIX.'cms_nodeinfo AS info
ON info.nodeid = node.nodeid INNER JOIN
'.TABLE_PREFIX.'cms_node AS parentnode
ON parentnode.nodeid = node.parentnode LEFT JOIN
'.TABLE_PREFIX.'thread AS thread ON thread.threadid = info.associatedthreadid LEFT JOIN
'.TABLE_PREFIX.'cms_nodecategory AS nodecategory ON nodecategory.nodeid = node.nodeid LEFT JOIN
'.TABLE_PREFIX.'cms_category AS category ON nodecategory.categoryid = category.categoryid
WHERE
node.setpublish = 1 AND
node.publishdate > '. vb::$db->sql_prepare($time) .' -34560000 AND
node.publishdate < '. vb::$db->sql_prepare($time) .'
GROUP BY node.nodeid
ORDER BY node.publishdate
DESC LIMIT 20');
$database_articles = array();
/* my version of sorting the articles via relevance - i'll keep it in case someone is interested*/
while($article = vB::$db->fetch_array($article_get))
{
$article['value'] = ( 5 - ($time - $article['publishdate'] ) / 86400 ) * ( 5 - ($time - $article['publishdate'] ) / 86400 ) * ( 5 - ($time - $article['publishdate'] ) / 86400 ) + (10 * $article['replycount']);
$database_articles[] = $article;
}
foreach($database_articles as $c => $key)
{
$sort_value[] = $key['value'];
}
array_multisort($sort_value, SORT_DESC, $database_articles);
//
$i = 0;
$section_array = array();
$featured_articles = array();
foreach($database_articles AS $article)
{
$section_array[$article['parentnode']]++;
$categories = explode(',' , $article['GROUP_CONCAT( category.category )']);
if($show_articles_without_image == true OR $article['previewimage'])
{
if($section_array[$article['parentnode']] < 50 AND $i < $number_of_articles_shown)
{
if($debug_modus == true OR !file_exists($slider_img_filepath . 'slide_' . $article['nodeid'] . '.jpg'))
{
//rebuild image to the height and width we want in the slider
//called sprite since i got the code from our sprite addon :P
$sprite = imagecreatetruecolor($maxwidth, $maxheight);
if(is_resource($sprite) AND $article['previewimage'] )
{
$imageinfo = getimagesize($article['previewimage']);
if(is_array($imageinfo))
{
$image = null;
switch($imageinfo[2])
{
case IMAGETYPE_PNG:
$image = imagecreatefrompng($article['previewimage']);
break;
case IMAGETYPE_GIF:
$image = imagecreatefromgif($article['previewimage']);
break;
case IMAGETYPE_JPEG:
$image = imagecreatefromjpeg($article['previewimage']);
break;
default:
echo '<span style="color:red">Error occurred:</span> Unknown image format. ' . $article['previewimage']. '<br />';
break;
}
if(!is_resource($image))
{
//resiziing did not work - we are using the fallback image.
echo '<span style="color:red">Error occurred:</span> imagecreation failed. ' . $article['previewimage']. '<br />';
$article['previewimage'] = $fallback_img;
}
else
{
$img_width = $imageinfo[0];
$img_height = $imageinfo[1];
if($crop == false)
{
imagecopyresampled($sprite, $image, 0, 0, 0, 0, $maxwidth, $maxheight, $img_width, $img_height );
imagedestroy($image);
}
else
{
//cropping
$ratiox = $maxheight / $img_height ;
$ratioy = $maxwidth / $img_width ;
$new_height = $img_height;
$new_width = $img_width;
if ($maxheight > $img_height OR $maxwidth > $img_width)
{
if($ratiox > $ratioy)
{
$new_height = round($img_height * $ratiox);
$new_width = round($img_width * $ratiox);
}
else
{
$new_height = round($img_height * $ratioy);
$new_width = round($img_width * $ratioy);
}
}
$cropx = $new_height - $maxheight;
$cropy = $new_width - $maxwidth;
imagecopyresampled($sprite, $image, 0, 0, 0, 0, $new_width, $new_height, $img_width, $img_height);
imagedestroy($image);
}
$img_filepath = $slider_img_filepath . 'slide_' . $article['nodeid'] . '.jpg';
$success = imagejpeg($sprite, DIR . ($img_filepath[0] != DIRECTORY_SEPARATOR ? DIRECTORY_SEPARATOR : '') . $img_filepath);
imagedestroy($sprite);
if($success)
{
$article['previewimage'] = $img_filepath;
}
else
{
$img_filepath = DIR . ($img_filepath[0] != DIRECTORY_SEPARATOR ? DIRECTORY_SEPARATOR : '') . $img_filepath;
echo '<span style="color:red">Error occurred:</span> imagejpeg failed. ' . $article['previewimage']. '<br />
directory: '. $img_filepath ;
$article['previewimage'] = $fallback_img;
}
}
}
else
{
//resiziing did not work - we are using the fallback image.
echo '<span style="color:red">Error occurred:</span> picture is not readable.' . $article['previewimage']. '<br /> ';
$article['previewimage'] = $fallback_img;
}
}
else
{
//resiziing did not work - we are using the fallback image.
echo '<span style="color:red">Warning:</span> article has no previewimage or sprite is no ressource. ' . $article['previewimage']. '<br />';
$article['previewimage'] = $fallback_img;
}
}
else
{
//we already have the image, no need to resize or crop anything
$article['previewimage'] = $slider_img_filepath . 'slide_' . $article['nodeid'] . '.jpg';
}
/*remove everything from the previewtext - html and bb. I do not want bold or colored text there. Cut to a decent length.*/
$article['pagetext'] = strip_bbcode($article['pagetext'], true, true, false, true, false);
$article['previewtext'] = strip_tags($article['pagetext'], '<a>');
$len = $description_length;
if ( strlen($article['previewtext']) > $len )
{
$article['previewtext'] = substr( $article['previewtext'] , 0 , strrpos( substr( $article['previewtext'], 0, $len), ' ' ));
}
$i++;
//Build Array
$article_neu = array();
$article_neu['description'] = '<h2 style="font-weight:bold; font-size: 14px">'. $article['title'].'</h2><span>'. $article['previewtext'] .'</span> <a href="/content.php?r=' . $article['nodeid'] . '-' . $article['url'] . '">read on</a>';
$article_neu['htmlcaptionname'] = 'htmlcaption' . $article['nodeid'] ;
$article_neu['picture'] = '<a href="/content.php?r=' . $article['nodeid'] . '-' . $article['url'] . '"><img src="'.$article['previewimage'].'" alt="" title="#htmlcaption'. $article['nodeid'] . '" /></a>';
$featured_articles[] = $article_neu;
}
}
}
//Randomize Array
//shuffle($featured_articles);
//Debug Messages
if($debug_modus)
{
echo '#articles - featured and databasepull ';
var_dump(count($featured_articles));
var_dump(count($database_articles));
}
$output_bits = '
<link rel="stylesheet" href="' .$slider_img_filepath. 'nivo-slider.css" type="text/css" media="screen" />
<link rel="stylesheet" href="' .$slider_img_filepath. 'nivo-slider_uf_theme.css" type="text/css" media="screen" />
<div style="height:' . $maxheight . 'px;">
<div id="wrapper">
<div class="slider-wrapper theme-uf">
<div class="ribbon"></div>
<div id="slider" class="nivoSlider">';
foreach($featured_articles AS $article)
{
$output_bits .= $article['picture'];
}
$output_bits .= '
</div>';
foreach($featured_articles AS $article)
{
$output_bits .= '<div id="' . $article['htmlcaptionname'] . '" class="nivo-html-caption">' . $article['description'] .'</div>';
}
$output_bits .= '
</div>
</div>
<script type="text/javascript" src="' .$slider_img_filepath. 'jquery-1.6.1.min.js"></script>
<script type="text/javascript" src="' .$slider_img_filepath. 'jquery.nivo.slider.pack.js"></script>
<script type="text/javascript">
$(window).load(function() {
$("#slider").nivoSlider();
});
</script>
</div>
';
$output = $output_bits;
if($debug_modus === false)
{
ob_end_clean();
}
set refresh time to something big!
save - add the widget to your layout - enjoy
Custom settings:
At the top of the php-widget code you can see the following:
Code:
// DEBUG MODUS !
$debug_modus = false;
if($debug_modus === false)
{
ob_start();
}
//nivo slider - uf - vb.org version
//set these values as you need them:
//your slider folder - has to be read and writeable
//folder where all slider files are saved
$slider_img_filepath = 'external/unitedforum/slider/';
//picture width and height !same as in the CSS FILE!
$maxwidth = 650;
$maxheight = 250;
//do you want images without previewimage to be shown? slider is using the fallback then
$show_articles_without_image = false;
//picture shown if your articles has no previewpicture
$fallback_img = $slider_img_filepath . 'uf_fallback_slider.png';
//hardcoded maximum is 20 - if you want more just ask
$number_of_articles_shown = 5;
//lengh in characters of the article descriptions
$description_length = 95;
If you change $maxwidth and $maxheight you need to edit the nivo-slider_uf_theme.css file, here:
Code:
.theme-uf #slider {
margin:0px auto 0 auto;
width:650px; /* Make sure your images are the same size */
height:250px; /* Make sure your images are the same size */
}
Width and height have to be the same value in your php-widget and in the css file.
In additon to these settings i also included a "value/relevance function". Meaning the slider doesn't show your latest 5 articles, but instead weights them based on age and comments.
As older an article is the less likely it will show up in the slider.
More comments make it more likely.
This behaviour can be easily changed. I didn't include an if condition cause every board has different needs and i don't know whats best for you.
In addition conditions like "articles just from this section - or these sections, or this category, with a minimum of 10 posts" can be included via one single if condition. Again, i don't know what your board needs or what your category names are.
You can also modify the preview length (more words, less words), the preview style (color fontsize, fontweight .... Again different forums different needs. It's highly customizable.
Support:
Support and requests for the slider itself should be asked here http://nivo.dev7studios.com/
Same goes for different slider themes - a lot is possible, even thumbnails - again this is part of the nivo slider and not the vb4 implementation.
If you have any questions regarding the settings - or want different settings (which have to do with vb4) - ask, and i'll try to come up with some code // show you where you have to put what.
Slider not working. No idea why?
You will find a FAQ in the first comment, which will be kept up to date: FAQ
The widget here is completely free. No charge, no branding.
But, we do not mind donations either. If you want to give us something. Since we are advertising free and fan based we are happy about every small donation.
( On Forumhome bottom right paypal button: http://www.united-forum.de/forum.php )
<a href="http://www.bordersdown.net/" target="_blank">http://www.bordersdown.net/</a> << My slider has changed to showing the 2nd article first.... Weird eh? I haven't changed the slider code, so can I assume I should be really worried about my database?
Can anyone give me any pointers to see why this is happening please?
http://www.bordersdown.net/ << My slider has changed to showing the 2nd article first.... Weird eh? I haven't changed the slider code, so can I assume I should be really worried about my database?
Can anyone give me any pointers to see why this is happening please?
I know weird. It also stopped working for me, I just noticed
Nice site btw. Only if VB4 would look this good out of the box
included a "cache" system for pictures which solves a browser cacheing issue and speeds up the slider (on second image creation) -- added some FAQ questions
included a bit more debug messages
new crop function (beta stadium) included
Also 3 new FAQ questions concerning the "cache" system.
@warzone sys
this addon is for the vbcms, not for the vba
@charlesr
the slider uses a value function. If the second article has more comments it can overtake the first one.
@The Rocketeer
please go through the faq and use the debug mode. With the information you have given me i would guess you installed another addon with a jquery file?
This is an awesome mod, and I'm totally hoping I can integrate it into my Header for the entire site. Do you think you could help make this possible? This is where I go wrong:
1- I am trying to put the php code into a plugin, but I'm having trouble figuring out how to make a custom hook to call it when I want.
2-I'm testing by having it load on parse_templates, but that results in this error code:
Code:
Fatal error: Class 'vb_Types' not found in /home/user/mydomain.com/includes/class_bootstrap.php(426) : eval()'d code on line 82
I tried switching out that line for the $article_type = 18; in the part of this thread where you helped GamersChallenge, but, it just threw up another error. My coding skills aren't good enough I suspect.
If I could make this work globally it would be amazing
@The Rocketeer
please go through the faq and use the debug mode. With the information you have given me i would guess you installed another addon with a jquery file?
hey mooff, this is the error we are getting. I dont understand why because we didnt change or install anything! it just started to happen last week.
Quote:
DEBUG MODE is ON!
slider_img_filepath: frontpage_nivo_slider/
width: 650 height: 250
show_articles_without_image:
fallback_img: frontpage_nivo_slider/uf_fallback_slider.png
#img: 10
description_length: 95
Warning: getimagesize() [function.getimagesize]: URL file-access is disabled in the server configuration
thanks mooff, I have contacted them but after doing some research it seems its caused by the latest upgrade from php 4? I think this mod might need to be edited to be able to work with the latest php version that has the url file access disabled? have a look here - http://www.learnphponline.com/errors...-configuration