通过Joomla从特定类别中提取文章! 3.0模块

时间:2013-09-10 17:41:35

标签: php joomla content-management-system joomla-extensions joomla3.0

这是一个场景,让我开始说任何帮助都是神派,我已经克隆了Joomla里面的Article Category模块!基本上将所有articles_category更改为breed_articles(为了我的目的)。这工作正常,我被困在模块代码中的哪个位置我可以定义一个特定的类别来从中提取文章。

我知道我可以在后端执行此操作,但我正在以动态的方式按类别提取文章,并且需要在模块代码中定义类别。话虽如此,我还需要通过slug而不是id来拉出类别。

我一直在寻找模块中的helper.php文件,我相信我在那里正确的道路上。我试过替换一些东西并跟踪代码,但我对Joomla不太熟悉!

helper.php

$com_path = JPATH_SITE.'/components/com_content/';
require_once $com_path.'router.php';
require_once $com_path.'helpers/route.php';

JModelLegacy::addIncludePath($com_path . '/models', 'ContentModel');

abstract class modBreedArticlesHelper
{
public static function getList(&$params)
{
    // Get an instance of the generic articles model
    $articles = JModelLegacy::getInstance('Articles', 'ContentModel', array('ignore_request' => true));

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

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

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

    // Prep for Normal or Dynamic Modes
    $mode = $params->get('mode', 'normal');
    switch ($mode)
    {
        case 'dynamic':
            $option = $app->input->get('option');
            $view = $app->input->get('view');
            if ($option === 'com_content') {
                switch($view)
                {
                    case 'category':
                        $catids = array($app->input->getInt('id'));
                        break;
                    case 'categories':
                        $catids = array($app->input->getInt('id'));
                        break;
                    case 'article':
                        if ($params->get('show_on_article_page', 1)) {
                            $article_id = $app->input->getInt('id');
                            $catid = $app->input->getInt('catid');

                            if (!$catid) {
                                // Get an instance of the generic article model
                                $article = JModelLegacy::getInstance('Article', 'ContentModel', array('ignore_request' => true));

                                $article->setState('params', $appParams);
                                $article->setState('filter.published', 1);
                                $article->setState('article.id', (int) $article_id);
                                $item = $article->getItem();

                                $catids = array($item->catid);
                            }
                            else {
                                $catids = array($catid);
                            }
                        }
                        else {
                            // Return right away if show_on_article_page option is off
                            return;
                        }
                        break;

                    case 'featured':
                    default:
                        // Return right away if not on the category or article views
                        return;
                }
            }
            else {
                // Return right away if not on a com_content page
                return;
            }

            break;

        case 'normal':
        default:
            $catids = $params->get('catid');
            $articles->setState('filter.category_id.include', (bool) $params->get('category_filtering_type', 1));
            break;
    }

    // Category filter
    if ($catids) {
        if ($params->get('show_child_category_articles', 0) && (int) $params->get('levels', 0) > 0) {
            // Get an instance of the generic categories model
            $categories = JModelLegacy::getInstance('Categories', 'ContentModel', array('ignore_request' => true));
            $categories->setState('params', $appParams);
            $levels = $params->get('levels', 1) ? $params->get('levels', 1) : 9999;
            $categories->setState('filter.get_children', $levels);
            $categories->setState('filter.published', 1);
            $categories->setState('filter.access', $access);
            $additional_catids = array();

            foreach($catids as $catid)
            {
                $categories->setState('filter.parentId', $catid);
                $recursive = true;
                $items = $categories->getItems($recursive);

                if ($items)
                {
                    foreach($items as $category)
                    {
                        $condition = (($category->level - $categories->getParent()->level) <= $levels);
                        if ($condition) {
                            $additional_catids[] = $category->id;
                        }

                    }
                }
            }

            $catids = array_unique(array_merge($catids, $additional_catids));
        }

        $articles->setState('filter.category_id', $catids);
    }

    // Ordering
    $articles->setState('list.ordering', $params->get('article_ordering', 'a.ordering'));
    $articles->setState('list.direction', $params->get('article_ordering_direction', 'ASC'));

    // New Parameters
    $articles->setState('filter.featured', $params->get('show_front', 'show'));
    $articles->setState('filter.author_id', $params->get('created_by', ""));
    $articles->setState('filter.author_id.include', $params->get('author_filtering_type', 1));
    $articles->setState('filter.author_alias', $params->get('created_by_alias', ""));
    $articles->setState('filter.author_alias.include', $params->get('author_alias_filtering_type', 1));
    $excluded_articles = $params->get('excluded_articles', '');

    if ($excluded_articles) {
        $excluded_articles = explode("\r\n", $excluded_articles);
        $articles->setState('filter.article_id', $excluded_articles);
        $articles->setState('filter.article_id.include', false); // Exclude
    }

    $date_filtering = $params->get('date_filtering', 'off');
    if ($date_filtering !== 'off') {
        $articles->setState('filter.date_filtering', $date_filtering);
        $articles->setState('filter.date_field', $params->get('date_field', 'a.created'));
        $articles->setState('filter.start_date_range', $params->get('start_date_range', '1000-01-01 00:00:00'));
        $articles->setState('filter.end_date_range', $params->get('end_date_range', '9999-12-31 23:59:59'));
        $articles->setState('filter.relative_date', $params->get('relative_date', 30));
    }

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

    $items = $articles->getItems();

    // Display options
    $show_date = $params->get('show_date', 0);
    $show_date_field = $params->get('show_date_field', 'created');
    $show_date_format = $params->get('show_date_format', 'Y-m-d H:i:s');
    $show_category = $params->get('show_category', 0);
    $show_hits = $params->get('show_hits', 0);
    $show_author = $params->get('show_author', 0);
    $show_introtext = $params->get('show_introtext', 0);
    $introtext_limit = $params->get('introtext_limit', 100);

    // Find current Article ID if on an article page
    $option = $app->input->get('option');
    $view = $app->input->get('view');

    if ($option === 'com_content' && $view === 'article') {
        $active_article_id = $app->input->getInt('id');
    }
    else {
        $active_article_id = 0;
    }

    // Prepare data for display using display options
    foreach ($items as &$item)
    {
        $item->slug = $item->id.':'.$item->alias;
        $item->catslug = $item->catid ? $item->catid .':'.$item->category_alias : $item->catid;

        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
        {
            $app  = JFactory::getApplication();
            $menu = $app->getMenu();
            $menuitems = $menu->getItems('link', 'index.php?option=com_users&view=login');
            if (isset($menuitems[0]))
            {
                $Itemid = $menuitems[0]->id;
            }
            elseif ($app->input->getInt('Itemid') > 0)
            {
                // Use Itemid from requesting page only if there is no existing menu
                $Itemid = $app->input->getInt('Itemid');
            }

            $item->link = JRoute::_('index.php?option=com_users&view=login&Itemid='.$Itemid);
        }

        // Used for styling the active article
        $item->active = $item->id == $active_article_id ? 'active' : '';

        $item->displayDate = '';
        if ($show_date) {
            $item->displayDate = JHTML::_('date', $item->$show_date_field, $show_date_format);
        }

        if ($item->catid) {
            $item->displayCategoryLink = JRoute::_(ContentHelperRoute::getCategoryRoute($item->catid));
            $item->displayCategoryTitle = $show_category ? '<a href="'.$item->displayCategoryLink.'">'.$item->category_title.'</a>' : '';
        }
        else {
            $item->displayCategoryTitle = $show_category ? $item->category_title : '';
        }

        $item->displayHits = $show_hits ? $item->hits : '';
        $item->displayAuthorName = $show_author ? $item->author : '';
        if ($show_introtext) {
            $item->introtext = JHtml::_('content.prepare', $item->introtext, '', 'mod_articles_category.content');
            $item->introtext = self::_cleanIntrotext($item->introtext);
        }
        $item->displayIntrotext = $show_introtext ? self::truncate($item->introtext, $introtext_limit) : '';
        $item->displayReadmore = $item->alternative_readmore;

    }

    return $items;
}

public static function _cleanIntrotext($introtext)
{
    $introtext = str_replace('<p>', ' ', $introtext);
    $introtext = str_replace('</p>', ' ', $introtext);
    $introtext = strip_tags($introtext, '<a><em><strong>');

    $introtext = trim($introtext);

    return $introtext;
}

/**
* Method to truncate introtext
*
* The goal is to get the proper length plain text string with as much of
* the html intact as possible with all tags properly closed.
*
* @param string   $html       The content of the introtext to be truncated
* @param integer  $maxLength  The maximum number of charactes to render
*
* @return  string  The truncated string
*/
public static function truncate($html, $maxLength = 0)
{
    $baseLength = strlen($html);
    $diffLength = 0;

    // First get the plain text string. This is the rendered text we want to end up with.
    $ptString = JHtml::_('string.truncate', $html, $maxLength, $noSplit = true, $allowHtml = false);

    for ($maxLength; $maxLength < $baseLength;)
    {
        // Now get the string if we allow html.
        $htmlString = JHtml::_('string.truncate', $html, $maxLength, $noSplit = true, $allowHtml = true);

        // Now get the plain text from the html string.
        $htmlStringToPtString = JHtml::_('string.truncate', $htmlString, $maxLength, $noSplit = true, $allowHtml = false);

        // If the new plain text string matches the original plain text string we are done.
        if ($ptString == $htmlStringToPtString)
        {
            return $htmlString;
        }
        // Get the number of html tag characters in the first $maxlength characters
        $diffLength = strlen($ptString) - strlen($htmlStringToPtString);

        // Set new $maxlength that adjusts for the html tags
        $maxLength += $diffLength;
        if ($baseLength <= $maxLength || $diffLength <= 0)
        {
            return $htmlString;
        }
    }
    return $html;
}

public static function groupBy($list, $fieldName, $article_grouping_direction, $fieldNameToKeep = null)
{
    $grouped = array();

    if (!is_array($list)) {
        if ($list == '') {
            return $grouped;
        }

        $list = array($list);
    }

    foreach($list as $key => $item)
    {
        if (!isset($grouped[$item->$fieldName])) {
            $grouped[$item->$fieldName] = array();
        }

        if (is_null($fieldNameToKeep)) {
            $grouped[$item->$fieldName][$key] = $item;
        }
        else {
            $grouped[$item->$fieldName][$key] = $item->$fieldNameToKeep;
        }

        unset($list[$key]);
    }

    $article_grouping_direction($grouped);

    return $grouped;
}

public static function groupByDate($list, $type = 'year', $article_grouping_direction, $month_year_format = 'F Y')
{
    $grouped = array();

    if (!is_array($list)) {
        if ($list == '') {
            return $grouped;
        }

        $list = array($list);
    }

    foreach($list as $key => $item)
    {
        switch($type)
        {
            case 'month_year':
                $month_year = JString::substr($item->created, 0, 7);

                if (!isset($grouped[$month_year])) {
                    $grouped[$month_year] = array();
                }

                $grouped[$month_year][$key] = $item;
                break;

            case 'year':
            default:
                $year = JString::substr($item->created, 0, 4);

                if (!isset($grouped[$year])) {
                    $grouped[$year] = array();
                }

                $grouped[$year][$key] = $item;
                break;
        }

        unset($list[$key]);
    }

    $article_grouping_direction($grouped);

    if ($type === 'month_year') {
        foreach($grouped as $group => $items)
        {
            $date = new JDate($group);
            $formatted_group = $date->format($month_year_format);
            $grouped[$formatted_group] = $items;
            unset($grouped[$group]);
        }
    }

    return $grouped;
}

}

1 个答案:

答案 0 :(得分:0)

看起来我的问题确实与我正在进行的项目有关。如果有人碰巧发现这个或想要完成类似的事情,请继续阅读。

决定使用JDatabase查询完成我正在做的事情。要使用类别别名检索文章,我查询数据库以将我提供查询的别名与类别ID相匹配。然后加入内容表以获取文章信息。

您可以在此处找到制作正确JDatabase查询所需的所有信息:http://docs.joomla.org/Accessing_the_database_using_JDatabase