将分页添加到第 3 方模块 (OT-MiniNewsModule)

Posted

技术标签:

【中文标题】将分页添加到第 3 方模块 (OT-MiniNewsModule)【英文标题】:Adding Pagination to a 3rd party module (OT-MiniNewsModule) 【发布时间】:2012-09-24 22:34:51 【问题描述】:

我目前正在尝试修改一个几乎可以完美满足我的要求但缺少分页的模块。我似乎无法掌握应该如何为其添加分页;大多数 JPagination 示例假设我可以访问查询,但在这个模块(使用 JFactory、JmoduleHelper 和 JModel)中,我没有看到查询以添加限制等。

mod_otmininews.php

//No direct access!
defined('_JEXEC') or die;

// Include the syndicate functions only once
require_once dirname(__FILE__).DS.'helper.php';

$doc = &JFactory::getDocument();
$doc->addStyleSheet(JURI::base().'/modules/mod_otmininews/css/layout.css');

$list = modOtMiniNewsHelper::getList($params);
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx'));

require JModuleHelper::getLayoutPath('mod_otmininews', $params->get('layout', 'default'));

helper.php

//No direct access!
defined('_JEXEC') or die;

require_once JPATH_SITE.'/components/com_content/helpers/route.php';

jimport('joomla.application.component.model');

JModel::addIncludePath(JPATH_SITE.'/components/com_content/models');

abstract class modOtMiniNewsHelper

public static function getList(&$params)

    // Get the dbo
    $db = JFactory::getDbo();

    // Get an instance of the generic articles model
    $model = JModel::getInstance('Articles', 'ContentModel', array('ignore_request' => true));

    // Set application parameters in model
    $app = JFactory::getApplication();
    $appParams = $app->getParams();
    $model->setState('params', $appParams);

    // Set the filters based on the module params
    $model->setState('list.start', 0);
    $model->setState('list.limit', (int) $params->get('count', 3));
    $model->setState('filter.published', 1);

    // Access filter
    $access = !JComponentHelper::getParams('com_content')->get('show_noauth');
    $authorised = JAccess::getAuthorisedViewLevels(JFactory::getUser()->get('id'));
    $model->setState('filter.access', $access);

    // Category filter
    $model->setState('filter.category_id', $params->get('catid', array()));

    // User filter
    $userId = JFactory::getUser()->get('id');
    switch ($params->get('user_id'))
    
        case 'by_me':
            $model->setState('filter.author_id', (int) $userId);
            break;
        case 'not_me':
            $model->setState('filter.author_id', $userId);
            $model->setState('filter.author_id.include', false);
            break;

        case '0':
            break;

        default:
            $model->setState('filter.author_id', (int) $params->get('user_id'));
            break;
    

    // Filter by language
    $model->setState('filter.language',$app->getLanguageFilter());

    //  Featured switch
    switch ($params->get('show_featured'))
    
        case '1':
            $model->setState('filter.featured', 'only');
            break;
        case '0':
            $model->setState('filter.featured', 'hide');
            break;
        default:
            $model->setState('filter.featured', 'show');
            break;
    

    // Set ordering
    $order_map = array(
        'm_dsc' => 'a.modified DESC, a.created',
        'mc_dsc' => 'CASE WHEN (a.modified = '.$db->quote($db->getNullDate()).') THEN a.created ELSE a.modified END',
        'c_dsc' => 'a.created',
        'p_dsc' => 'a.publish_up',
        'h_dsc' =>  'a.hits',
    );
    $ordering = JArrayHelper::getValue($order_map, $params->get('ordering'), 'a.publish_up');
    $dir = 'DESC';

    $model->setState('list.ordering', $ordering);
    $model->setState('list.direction', $dir);

    $items = $model->getItems();

    foreach ($items as &$item) 
        $item->slug = $item->id.':'.$item->alias;
        $item->catslug = $item->catid.':'.$item->category_alias;

        if ($access || in_array($item->access, $authorised))
        
            // We know that user has the privilege to view the article
            $item->link = JRoute::_(ContentHelperRoute::getArticleRoute($item->slug, $item->catslug));
        
        else 
            $item->link = JRoute::_('index.php?option=com_user&view=login');
        
        //$item->title = htmlspecialchars( $item->title );
        $item->content= strip_tags(preg_replace('/<img([^>]+)>/i',"",$item->introtext));
        $item->content = substr($item->content, 0, $params->get('introtext_limit'));

        preg_match_all('/img.+src="([^"]+)"/i', $item->introtext, $matches);
        if(empty($matches[1][0]))
            $item->images="";
        else
            $item->images= $matches [1] [0];
        

        //Show thumbnails
        if($params->get('showthumbnails')==1)
            if($item->images == "")
                $item->thumbnail = '<img src="'.$params->get('directory_thumbdefault').'"    />';
            else
                $item->thumbnail = '<img src="' .$item->images.'"    />'  ;    //show images
            
        
        $item->created_date = $item->created; 
    
    return $items;


所有这些代码都创建了一个供

使用的数组

default.php

    defined('_JEXEC') or die;
?>

<div class="ot_news">
    <div class="ot_news_i">


        <?php 
        $count = 0;
        foreach ($list as $item) :  ?>
        <?php $count++; ?>
        <div class="ot_items <?php echo ($params->get('count') == $count)?'last-item':''; ?>">
            <!-- Show thumbnails -->
            <?php if($params->get('showthumbnails') == 1)?>
                <div class="ot_thumbs"  style="width:<?php echo $params->get('thumbwidth')?>px; height:<?php echo $params->get('thumbheight')?>px;">
                     <?php if($params->get('enablelinkthumb') == 1) ?>
                            <a href="<?php echo $item->link; ?>"><?php echo $item->thumbnail ;?></a>
                    <?php  else  ?>
                            <?php echo $item->thumbnail?>
                     <?php ?>
                </div>
            <?php  else  ?>
                <?php echo ''; ?>
            <?php  ?>
            <!-- End -->
             <!-- Show Titles -->
            <div class="ot_articles">
                <?php if($params->get('showtitle') == 1)  ?>
                    <div class="ot_title">
                     <?php if($params->get('enablelinktitle') == 1)  ?>
                         <a href="<?php echo $item->link; ?>" class="title"><?php echo $item->title; ?></a>
                    <?php else?>
                        <span class="title"><?php echo $item->title; ?></span>
                   <?php ?>
                   </div>
               <?php  ?>
                <!-- Show Created Date -->
               <?php
                   if ($params->get('show_date') == 1)  
                    echo '<p class="createddate"><span class="ot_date">'; 
                    $date = $item->created_date;
                    echo JHTML::_('date', $date, $params->get( 'date_format' ));
                    echo '</span></p>'; 
                
               ?>
               <!-- Show Content -->
                <div class="ot_content"><?php echo $item->content; ?></div>
                <!-- Show Readmore -->
                 <?php if($params->get('readmore') == 1) ?>
                <div class="ot_readmore"><a href="<?php echo $item->link; ?>" class="ot_readm"><?php echo JText::_('READMORE') ?></a></div>
                <?php else ?>
                    <?php echo ''; ?>
                <?php  ?>
            </div>
        </div>
        <div class="spaces"></div>
        <?php endforeach; ?>


    </div>
</div>
<div class="ot-mini-news"><?php echo JText::_('ABOUT_OT_MINI_NEWS'); ?></div>

只使用一个 for each 来显示带有照片链接和描述的项目。

如您所见,我完全不知道在哪里添加分页代码,我怀疑他们甚至使用其中的一部分进行显示(我在 helper.php 文件中看到了一个 getlist 函数。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

http://docs.joomla.org/Using_JPagination_in_your_component 这是一个非常有用的文档——即使这是一个模块,而 wiki 页面正在将它用于一个组件。

$db =& JFactory::getDBO();
$lim    = $mainframe->getUserStateFromRequest("$option.limit", 'limit', 14, 'int'); //I guess getUserStateFromRequest is for session or different reasons
$lim0   = JRequest::getVar('limitstart', 0, '', 'int');
$db->setQuery('SELECT SQL_CALC_FOUND_ROWS x, y, z FROM jos_content WHERE x',$lim0, $lim);
$rL=&$db->loadAssocList();
if (empty($rL)) $jAp->enqueueMessage($db->getErrorMsg(),'error'); return;     
else 
////Here the beauty starts
$db->setQuery('SELECT FOUND_ROWS();');  //no reloading the query! Just asking for total without limit
jimport('joomla.html.pagination');
$pageNav = new JPagination( $db->loadResult(), $lim0, $lim );
foreach($rL as $r) 
//your display code here

echo $pageNav->getListFooter(  ); //Displays a nice footer

您可以在他们的代码中看到,虽然他们确实使用了 db 结果,但分页并不“依赖”查询。只有来自它的结果。因此,对于$db-&gt;loadResult(),例如,您可以使用 php count forumla 来查看模块生成的数组中有多少行。在您的情况下,计算$items 的数量。 foreach 命令仍然是你所拥有的。只有foreach($rL as $r) 对应于现有的foreach($items as $item)。因此,您没有如您所见的数据库查询这一事实 - 实际上不应该是一个问题!

所以你想要的代码是这样的:

global $option; //If Joomla 1.5
global $mainframe; //If Joomla 2.5
$option = JRequest::getCmd('option') //If Joomla 2.5
$mainframe = JFactory::getApplication(); //If Joomla 2.5
$lim    = $mainframe->getUserStateFromRequest("$option.limit", 'limit', 14, 'int'); //I guess getUserStateFromRequest is for session or different reasons
$lim0   = JRequest::getVar('limitstart', 0, '', 'int');
if (empty($items)) 
    $app->enqueueMessage($db->getErrorMsg(),'error');
    return;
 else 
    jimport('joomla.html.pagination');
    $pageNav = new JPagination( count($list), $lim0, $lim );
    foreach($list as $item) 
     //wrap in your code here that you had in the foreach already

echo $pageNav->getListFooter(  ); //Displays a nice footer

确保根据您使用的是 Joomla 1.5 还是 2.5,删除前两行之一,但 应该 工作。

【讨论】:

所以基本上我应该用您发布的代码“包装”foreach 代码? (对不起,我还不能给你投票,但你的代表还不够多!) 别担心!看看更新的答案。将与您相关的代码放入第二个代码框中。一旦您删除了不需要的代码(在第 1 行和第 2 行注释为 Joomla 1.5 和 2.5)并且您已将代码放入 foreach() 语句中,希望应该可以工作! 非常感谢......我会尽快尝试! 我尝试运行代码,但由于没有 if 的“else ”而出现错误...我尝试查看第一个代码 sn-p 和第二个代码以查看我是否可以自己修复它,但我失去了它并不好笑。 哎呀。所以我猜你尝试在初始 if 语句中添加 ... if (empty($rL)) $jAp->enqueueMessage($db->getErrorMsg(),'error'); return; 在 else 语句之前?那是做什么的?

以上是关于将分页添加到第 3 方模块 (OT-MiniNewsModule)的主要内容,如果未能解决你的问题,请参考以下文章

使用管道将分页添加到 dataflowjob 中的 Bigquery 查询

将分页添加到 asp 转发器功能 ASP.Net

HTML DOM 使用循环将分页的 XML 文件合并为单个文件

有没有办法将分页器控件附加到扩展库中的 dynamicViewPanel?

将分页 UICollectionView 高度调整为当前可见的 UICollectionViewCell

将分页从“react-js-pagination”转换为“react-bootstrap”分页