Elenna |
08-14-2012 01:54 AM |
I'm not sure if this has been mentioned before, but I adapted code from this site to make it crop your Slider image from the direct center of the article image.
I really can't give support for this, since I barely managed to figure it out myself, but if you DO give it a try, let us know if it works!
PHP 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 = 'slider/';
//picture width and height !same as in the CSS FILE! - was 650 $maxwidth = 385; $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 . 'Fallback.jpg';
//hardcoded maximum is 20 - if you want more just ask $number_of_articles_shown = 10; //lengh in characters of the article descriptions - was 95 $description_length = 50;
//stretch picture or crop them? false = strechting (default) true = cropping (beta) $crop = true;
//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'] ) { if(substr($article['previewimage'],0,10) == 'attachment') { $article['previewimage'] = 'http://uat.echoesoftyria.com/' . $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); } }
$x_mid = $new_width/2; //horizontal middle - NEW CODE $y_mid = $new_height/2; //vertical middle - NEW CODE
// WAS $cropx = $new_height - $maxheight // WAS $cropy = $new_width - $maxwidth
// WAS: imagecopyresampled($sprite, $image, 0, 0, 0, 0, $new_width, $new_height, $img_width, $img_height); imagecopyresampled($sprite, $image, 0, 0, ($x_mid-($maxwidth/2)), ($y_mid-($maxheight/2)), $img_width, $img_height, $img_width, $img_height); // NEW CODE 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(); }
|