A joomla CMS rendszer egyik leggyakrabban használt része a kategória megjelenités "blog" formában. Én is gyakran használom ezt a lehetőséget és sokat bosszankodtam két gyakran előforduló probléma miatt:

  • Ha a cikkek introtext -jei nem egyforma hosszúak akkor - több hasábos megjelenítésnél - az oldal képen kisebb-nagyobb üres területek keletkeznek - ami szerintem nagyon csúnya.
  • Ha a cikk publikálók a "readmore" hivatkozást rossz helyre helyezték el (div, p, table vagy más block belsejébe) akkor az egész oldal megjelenítése "szétesik".

A Fenti hibákat igyekszik orvosolni az alábbi Joomla patch.

Joomla 3.4 rendszerben lett tesztelve.

 A patch használja a "screen_width" session változót. responsive oldal készitésénél biztositani kell, hogy ebben az aktuális eszköz megjelenitőjének szélessége legyen pixelben. (a patch akkor is müködik ha nincs ilyen session változó, de ez esetben nem lesz responsive).

lásd: http://robitbt.hu/jm/ingyenes-gnu-gpl-produktumok/101-joomla-kepernyo-szelesseg-elerese-php-scriptbol

 Licensz: GNU/GPL    Szerző: Fogler Tibor     Ez az e-mail-cím a szpemrobotok elleni védelem alatt áll. Megtekintéséhez engedélyeznie kell a JavaScript használatát.

 

components/com_content/views/category/tmpl/blog.php


<?php
/**
 * @package     Joomla.Site
 * @subpackage  com_content
 *
 * @copyright   Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 * 
 * FT.2015.03.01  javitott többhasáboss elrendezés: nincsenek lyukak az
 * intro szövegek között akkor sem ha azon nem egyforma hosszúak.  
 * használt SESSION változó : screen_width
 * rossz helyre betett readmore linkek javitására is kisérletet tesz   
 */
defined('_JEXEC') or die;
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers');
JHtml::_('behavior.caption');
/**
 * gyakori probléma, hogy a readmore link rossz helyen van
 * ezért lezáratlan tag -ek vannak az introtext-ben  
 * ez a funkció a lezáratlan tag -eket lezárja
 * a nyitó - lezáró tagok ileszkedését (tag overdrop) nem vizsgálja, 
 * csak a nyitó - záró tag számszerű egyezését állítja helyre
 */   
function htmlRepair($subject) {
  $pattern = '/<[^>]+>/';
  $stack = array();
  $i = 0;
  $j = 0;
  $talalt = preg_match($pattern,
                       $subject, 
                       $matches, PREG_OFFSET_CAPTURE);
  while (($talalt) & ($j<1000)) {
    $tag = str_replace('<','',$matches[0][0]);
    $tag = str_replace('>','',$tag);
    $tag = trim($tag);
    $i = $i + $matches[0][1] + 1;
    if ($tag[0] == '/') {
      // záró tag pop from stack
      array_pop($stack);
    } else if ($tag[strlen($tag)-1]=='/') {
      // <... /> nincs vele dolgom
    } else {
      // nyitó tag push to stack
      array_push($stack,$tag);
    }
    $j++; 
    $talalt = preg_match($pattern,
                         substr($subject,$i,strlen($subject)), 
                         $matches, PREG_OFFSET_CAPTURE);
  } 
  if (count($stack) > 0) {
    // nyitott tag -ek lezárása
    $subject .= '<!-- htmlPrepare -->';
    for ($i = count($stack)-1; $i>=0; $i--) {
       $w = explode(' ',$stack[$i]);
       $subject .= '</'.$w[0].'>';
    }
    $subject .= '<!-- htmlPrepare -->';
  }
  return $subject;
}
?>
<div class="blog<?php echo $this->pageclass_sfx; ?>" itemscope itemtype="http://schema.org/Blog">
	
  <?php if ($this->params->get('show_page_heading', 1)) : ?>
		<div class="page-header">
			<h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1>
		</div>
	<?php endif; ?>
	<?php if ($this->params->get('show_category_title', 1) or $this->params->get('page_subheading')) : ?>
		<h2> <?php echo $this->escape($this->params->get('page_subheading')); ?>
			<?php if ($this->params->get('show_category_title')) : ?>
				<span class="subheading-category"><?php echo $this->category->title; ?></span>
			<?php endif; ?>
		</h2>
	<?php endif; ?>
	<?php if ($this->params->get('show_cat_tags', 1) && !empty($this->category->tags->itemTags)) : ?>
		<?php $this->category->tagLayout = new JLayoutFile('joomla.content.tags'); ?>
		<?php echo $this->category->tagLayout->render($this->category->tags->itemTags); ?>
	<?php endif; ?>
	<?php if ($this->params->get('show_description', 1) || $this->params->def('show_description_image', 1)) : ?>
		<div class="category-desc clearfix">
			<?php if ($this->params->get('show_description_image') && $this->category->getParams()->get('image')) : ?>
				<img src="/<?php echo $this->category->getParams()->get('image'); ?>" alt="<?php echo htmlspecialchars($this->category->getParams()->get('image_alt')); ?>"/>
			<?php endif; ?>
			<?php if ($this->params->get('show_description') && $this->category->description) : ?>
				<?php echo JHtml::_('content.prepare', $this->category->description, '', 'com_content.category'); ?>
			<?php endif; ?>
		</div>
	<?php endif; ?>
	<?php if (empty($this->lead_items) && empty($this->link_items) && empty($this->intro_items)) : ?>
		<?php if ($this->params->get('show_no_articles', 1)) : ?>
			<p><?php echo JText::_('COM_CONTENT_NO_ARTICLES'); ?></p>
		<?php endif; ?>
	<?php endif; ?>
	<?php $leadingcount = 0; ?>
	<?php if (!empty($this->lead_items)) : ?>
		<div class="items-leading clearfix">
			<?php foreach ($this->lead_items as &$item) : ?>
				<div class="leading-<?php echo $leadingcount; ?><?php echo $item->state == 0 ? ' system-unpublished' : null; ?>"
					itemprop="blogPost" itemscope itemtype="http://schema.org/BlogPosting">
					<?php
					$this->item = & $item;
          $this->item->introtext = htmlrepair($this->item->introtext);
					echo $this->loadTemplate('item');
					?>
				</div>
				<?php $leadingcount++; ?>
			<?php endforeach; ?>
		</div><!-- end items-leading -->
	<?php endif; ?>
	<?php
	$introcount = (count($this->intro_items));
	$counter = 0;
	?>
	<?php if (!empty($this->intro_items)) : ?>
		
    <?php
    
       // kis képernyökön csak egy oszlopba irunk  
       $session = JFactory::getSession();
       $screen_width = $session->get('screen_width');
       if (($screen_width != '') & ($screen_width < 800)) {
          $this->columns = 1;
       }
       $elemek = array(); 
       for ($i=1; $i<=$this->columns; $i++)   
          $elemek[$i] = array();    
       $oszlop = 1;
       foreach ($this->intro_items as $key => &$item) {
         $elemek[$oszlop][] = $key;
         $oszlop++;
         if ($oszlop > $this->columns) $oszlop = 1;
       }
       for ($i=1; $i<=$this->columns; $i++) {
         echo '<div style="float:left; width:'.(100/$this->columns).'%; ">';
         if ($i < $this->columns)
           echo '<div style="margin-right:20px;">';
         else
           echo '<div style="margin-right:0px;">';
         foreach ($elemek[$i] as $elem) {
          $this->item = & $this->intro_items[$elem];
    			echo $this->loadTemplate('item');
         }
         echo '</div>';
         echo '</div>';
       }
       echo '<div style="clear:both"></div>';
    ?>
    
    
    
    <?php /* foreach ($this->intro_items as $key => &$item) : ? >
			<?php $rowcount = ((int) $key % (int) $this->columns) + 1; ? >
			<?php if ($rowcount == 1) : ? >
				<?php $row = $counter / $this->columns; ? >
				<div class="items-row cols-<?php echo (int) $this->columns; ? > <?php echo 'row-' . $row; ? > row-fluid clearfix">
			<?php endif; ? >
      
			<div class="span<?php echo round((12 / $this->columns)); ? >">
				<div class="item column-<?php echo $rowcount; ? ><?php echo $item->state == 0 ? ' system-unpublished' : null; ? >"
					itemprop="blogPost" itemscope itemtype="http://schema.org/BlogPosting">
					<?php
					$this->item = & $item;
					echo $this->loadTemplate('item');
					? >
				</div>
				<!-- end item -->
				<?php $counter++; ? >
			</div><!-- end span -->
			
      <?php if (($rowcount == $this->columns) or ($counter == $introcount)) : ? >
				</div><!-- end row -->
			<?php endif; ? >
		<?php endforeach; */ ?>
	<?php endif; ?>
	<?php if (!empty($this->link_items)) : ?>
		<div class="items-more">
			<?php echo $this->loadTemplate('links'); ?>
		</div>
	<?php endif; ?>
	<?php if (!empty($this->children[$this->category->id]) && $this->maxLevel != 0) : ?>
		<div class="cat-children">
			<?php if ($this->params->get('show_category_heading_title_text', 1) == 1) : ?>
				<h3> <?php echo JTEXT::_('JGLOBAL_SUBCATEGORIES'); ?> </h3>
			<?php endif; ?>
			<?php echo $this->loadTemplate('children'); ?> </div>
	<?php endif; ?>
	<?php if (($this->params->def('show_pagination', 1) == 1 || ($this->params->get('show_pagination') == 2)) && ($this->pagination->get('pages.total') > 1)) : ?>
		<div class="pagination">
			<?php if ($this->params->def('show_pagination_results', 1)) : ?>
				<p class="counter pull-right"> <?php echo $this->pagination->getPagesCounter(); ?> </p>
			<?php endif; ?>
			<?php echo $this->pagination->getPagesLinks(); ?> </div>
	<?php endif; ?>
</div>