PHP joomla在com_content中获取元数据

时间:2016-02-18 15:42:45

标签: php joomla metadata facebook-opengraph opengraph

我正在尝试访问我制作的文章中的元数据。该文章显示在名为News->网站新闻的菜单项下,该菜单项是博客布局。从博客视图(和其他区域)转到文章的链接,我似乎无法访问元数据信息。

我对com_content中的所有类别使用view.html的覆盖。

我这样做的原因是我可以根据他们的描述控制每个文章,类别和菜单(我想我做菜单)OG标签。图像部分是因为在元数据下的后端我添加了一个字段来选择你想要的图像。我的代码恢复到$ configuration文件中设置的内容,这取决于你硬代码放在那里的内容。无论如何,我的代码似乎只是在OG中向我显示配置文件中的变量,除了标题。

我的代码类似于以下内容: //(lol)所有代码都在og tags的区域。

<?php

/ ** * @package Joomla.Site * @subpackage com_content * @copyright版权所有(C)2005 - 2014 Open Source Matters,Inc。保留所有权利。 * @license GNU通用公共许可证版本2或更高版本;见LICENSE.txt * / 定义(&#39; _JEXEC&#39;)或死亡; / ** *内容组件的HTML视图类* * @package Joomla.Site * @subpackage com_content * @since 1.5 * / class ContentViewCategory扩展了JViewLegacy

{
protected $state;
protected $items;
protected $category;
protected $children;
protected $pagination;
protected $lead_items = array();
protected $intro_items = array();
protected $link_items = array();
protected $columns = 1;
function display($tpl = null)
    {
    $app = JFactory::getApplication();
    $user = JFactory::getUser();

    // Get some data from the models

    $state = $this->get('State');
    $params = $state->params;
    $items = $this->get('Items');
    $category = $this->get('Category');
    $children = $this->get('Children');
    $parent = $this->get('Parent');
    $pagination = $this->get('Pagination');

    // Check for errors.

    if (count($errors = $this->get('Errors')))
        {
        JError::raiseError(500, implode("\n", $errors));
        return false;
        }

    if ($category == false)
        {
        return JError::raiseError(404, JText::_('JGLOBAL_CATEGORY_NOT_FOUND'));
        }

    if ($parent == false)
        {
        return JError::raiseError(404, JText::_('JGLOBAL_CATEGORY_NOT_FOUND'));
        }

    // Setup the category parameters.

    $cparams = $category->getParams();
    $category->params = clone ($params);
    $category->params->merge($cparams);

    // Check whether category access level allows access.

    $user = JFactory::getUser();
    $groups = $user->getAuthorisedViewLevels();
    if (!in_array($category->access, $groups))
        {
        return JError::raiseError(403, JText::_('JERROR_ALERTNOAUTHOR'));
        }

    // PREPARE THE DATA
    // Get the metrics for the structural page layout.

    $numLeading = $params->def('num_leading_articles', 1);
    $numIntro = $params->def('num_intro_articles', 4);
    $numLinks = $params->def('num_links', 4);

    // Compute the article slugs and prepare introtext (runs content plugins).

    for ($i = 0, $n = count($items); $i < $n; $i++)
        {
        $item = & $items[$i];
        $item->slug = $item->alias ? ($item->id . ':' . $item->alias) : $item->id;

        // No link for ROOT category

        if ($item->parent_alias == 'root')
            {
            $item->parent_slug = null;
            }

        $item->catslug = $item->category_alias ? ($item->catid . ':' . $item->category_alias) : $item->catid;
        $item->event = new stdClass();
        $dispatcher = JDispatcher::getInstance();

        // Old plugins: Ensure that text property is available

        if (!isset($item->text))
            {
            $item->text = $item->introtext;
            }

        JPluginHelper::importPlugin('content');
        $results = $dispatcher->trigger('onContentPrepare', array(
            'com_content.category', &$item, &$this->params,
            0
        ));

        // Old plugins: Use processed text as introtext

        $item->introtext = $item->text;
        $results = $dispatcher->trigger('onContentAfterTitle', array(
            'com_content.category', &$item, &$item->params,
            0
        ));
        $item->event->afterDisplayTitle = trim(implode("\n", $results));
        $results = $dispatcher->trigger('onContentBeforeDisplay', array(
            'com_content.category', &$item, &$item->params,
            0
        ));
        $item->event->beforeDisplayContent = trim(implode("\n", $results));
        $results = $dispatcher->trigger('onContentAfterDisplay', array(
            'com_content.category', &$item, &$item->params,
            0
        ));
        $item->event->afterDisplayContent = trim(implode("\n", $results));
        }

    // Check for layout override only if this is not the active menu item
    // If it is the active menu item, then the view and category id will match

    $active = $app->getMenu()->getActive();
    if ((!$active) || ((strpos($active->link, 'view=category') === false) || (strpos($active->link, '&id=' . (string)$category->id) === false)))
        {

        // Get the layout from the merged category params

        if ($layout = $category->params->get('category_layout'))
            {
            $this->setLayout($layout);
            }
        }

    // At this point, we are in a menu item, so we don't override the layout

    elseif (isset($active->query['layout']))
        {

        // We need to set the layout from the query in case this is an alternative menu item (with an alternative layout)

        $this->setLayout($active->query['layout']);
        }

    // For blog layouts, preprocess the breakdown of leading, intro and linked articles.
    // This makes it much easier for the designer to just interrogate the arrays.

    if (($params->get('layout_type') == 'blog') || ($this->getLayout() == 'blog'))
        {
        $max = count($items);

        // The first group is the leading articles.

        $limit = $numLeading;
        for ($i = 0; $i < $limit && $i < $max; $i++)
            {
            $this->lead_items[$i] = & $items[$i];
            }

        // The second group is the intro articles

         . $limit = $numLeading + $numIntro;

        // Order articles across, then down (or single column mode)

        for ($i = $numLeading; $i < $limit && $i < $max; $i++)
            {
            $this->intro_items[$i] = & $items[$i];
            }

        $this->columns = max(1, $params->def('num_columns', 1));
        $order = $params->def('multi_column_order', 1);
        if ($order == 0 && $this->columns > 1)
            {

            // call order down helper

            $this->intro_items = ContentHelperQuery::orderDownColumns($this->intro_items, $this->columns);
            }

        $limit = $numLeading + $numIntro + $numLinks;

        // The remainder are the links.

        for ($i = $numLeading + $numIntro; $i < $limit && $i < $max; $i++)
            {
            $this->link_items[$i] = & $items[$i];
            }
        }

    $children = array(
        $category->id => $children
    );

    // Escape strings for HTML output

    $this->pageclass_sfx = htmlspecialchars($params->get('pageclass_sfx'));
    $this->maxLevel = $params->get('maxLevel', -1);
    $this->assignRef('state', $state);
    $this->assignRef('items', $items);
    $this->assignRef('category', $category);
    $this->assignRef('children', $children);
    $this->assignRef('params', $params);
    $this->assignRef('parent', $parent);
    $this->assignRef('pagination', $pagination);
    $this->assignRef('user', $user);
    $this->_prepareDocument();
    parent::display($tpl);
    }

/**      * Prepares the document     */
protected
function _prepareDocument()
    {
    $app = JFactory::getApplication();
    $menus = $app->getMenu();
    $pathway = $app->getPathway();
    $title = null;

    // Because the application sets a default page title,
    // we need to get it from the menu item itself

    $menu = $menus->getActive();
    if ($menu)
        {
        $this->params->def('page_heading', $this->params->get('page_title', $menu->title));
        }
      else
        {
        $this->params->def('page_heading', JText::_('JGLOBAL_ARTICLES'));
        }

    $id = (int)@$menu->query['id'];
    if ($menu && ($menu->query['option'] != 'com_content' || $menu->query['view'] == 'article' || $id != $this->category->id))
        {
        $path = array(
            array(
                'title' => $this->category->title,
                'link' => ''
            )
        );
        $category = $this->category->getParent();
        while (($menu->query['option'] != 'com_content' || $menu->query['view'] == 'article' || $id != $category->id) && $category->id > 1)
            {
            $path[] = array(
                'title' => $category->title,
                'link' => ContentHelperRoute::getCategoryRoute($category->id)
            );
            $category = $category->getParent();
            }

        $path = array_reverse($path);
        foreach($path as $item)
            {
            $pathway->addItem($item['title'], $item['link']);
            }
        }

    $title = $this->params->get('page_title', '');
    if (empty($title))
        {
        $title = $app->getCfg('sitename');
        }
    elseif ($app->getCfg('sitename_pagetitles', 0) == 1)
        {
        $title = JText::sprintf('JPAGETITLE', $app->getCfg('sitename') , $title);
        }
    elseif ($app->getCfg('sitename_pagetitles', 0) == 2)
        {
        $title = JText::sprintf('JPAGETITLE', $title, $app->getCfg('sitename'));
        }

    $this->document->setTitle($title);
    $this->document->setTitle($title);

    // #####################ADDS OG TAGS##############################

    $this->document->addCustomTag('<meta property="og:site_name" content="ClearLove" />');
    $this->document->addCustomTag('<meta property="og:title" content="' . $title . '" />');
    $this->document->addCustomTag('<meta property="og:url" content="' . JURI::current() . '" />');
    if ($this->category->ogimages)
        {
        $ogimages = $this->category->ogimages;
        }
    elseif (!$this->category->ogimages && $this->params->get('menu-meta_ogimages'))
        {
        $ogimages = $this->params->get("menu-meta_ogimages");
        }
    elseif ($app->getCfg("ogimages"))
        {
        $ogimages = $app->getCfg("ogimages");
        }

    // #####################ADDS OG TAGS FOR DESC##############################

    if ($this->category->metadesc)
        {
        $this->document->setDescription($this->category->metadesc);
        $this->document->addCustomTag('<meta property="og:description" content="' . $this->category->metadesc . '" />');
        }
    elseif (!$this->category->metadesc && $this->params->get('menu-meta_description'))
        {
        $this->document->setDescription($this->params->get('menu-meta_description'));
        $this->document->addCustomTag('<meta property="og:description" content="' . $this->params->get("menu-meta_description") . '" />');
        }
    elseif ($app->getCfg("MetaDesc"))
        {
        $this->document->addCustomTag('<meta property="og:description" content="' . $app->getCfg("MetaDesc") . '" />');
        }

    // #####################ADDS OG TAGS FOR IMAGE##############################

    if (!preg_match("/http:\/\//", $ogimages) && !("www." == substr($ogimages, 0, 4)) && $ogimages)
        {
        $ogimages = 'http://www.clearlove.ca/' . $ogimages;
        }

    if ($ogimages)
        {
        $ogimage_atribs = getimagesize($ogimages);
        $this->document->addCustomTag('<meta property="og:image" content="' . $ogimages . '" />');
        $this->document->addCustomTag('<meta property="og:image:type" content="' . image_type_to_mime_type($ogimage_atribs[2]) . '" />');
        $this->document->addCustomTag('<meta property="og:image:width" content="' . $ogimage_atribs[0] . '" />');
        $this->document->addCustomTag('<meta property="og:image:height" content="' . $ogimage_atribs[1] . '" />');
        }

    // #####################DONE ADDING TAGS##############################

    if ($this->category->metakey)
        {
        $this->document->setMetadata('keywords', $this->category->metakey);
        }
    elseif (!$this->category->metakey && $this->params->get('menu-meta_keywords'))
        {
        $this->document->setMetadata('keywords', $this->params->get('menu-meta_keywords'));
        }

    if ($this->params->get('robots'))
        {
        $this->document->setMetadata('robots', $this->params->get('robots'));
        }

    if ($app->getCfg('MetaAuthor') == '1')
        {
        $this->document->setMetaData('author', $this->category->getMetadata()->get('author'));
        }

    $mdata = $this->category->getMetadata()->toArray();
    foreach($mdata as $k => $v)
        {
        if ($v)
            {
            $this->document->setMetadata($k, $v);
            }
        }

    // Add feed links

    if ($this->params->get('show_feed_link', 1))
        {
        $link = '&format=feed&limitstart=';
        $attribs = array(
            'type' => 'application/rss+xml',
            'title' => 'RSS 2.0'
        );
        $this->document->addHeadLink(JRoute::_($link . '&type=rss') , 'alternate', 'rel', $attribs);
        $attribs = array(
            'type' => 'application/atom+xml',
            'title' => 'Atom 1.0'
        );
        $this->document->addHeadLink(JRoute::_($link . '&type=atom') , 'alternate', 'rel', $attribs);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

不确定这是否是您想要听到的内容,但是:如果您想在视图中添加opengraph-data,最好在插件中进行操作。存在这样做的插件(如Easy open graph),也许研究他们如何解决这个问题以获得如何做到这一点的想法。