PHP joomla在com_内容中获取元数据

PHP joomla在com_内容中获取元数据,php,joomla,metadata,facebook-opengraph,Php,Joomla,Metadata,Facebook Opengraph,我正在尝试访问我写的一篇文章中的元数据。文章显示在一个名为“新闻->网站新闻”的菜单项下,这是一个博客布局。从博客视图(和其他区域)转到文章的链接,我似乎无法访问元数据信息 我正在对com_内容中的所有类别使用view.html覆盖 我这样做的原因是,我可以根据它们的描述控制每一篇文章、类别和菜单(我想我做了菜单)OG标记。图像部分是因为在元数据下的后端,我添加了一个字段来选择所需的图像。我的代码将根据硬代码放在$configuration文件中的内容恢复到$configuration文件中设置

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

我正在对com_内容中的所有类别使用view.html覆盖

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

对于类别,我的代码如下所示: //(lol)所有代码都在显示og标记的区域中

<?php

不确定这是否是您想要听到的,但是:如果您想将opengraph数据添加到视图中,您最好使用插件。有一些插件就是这样做的(比如),也许可以研究他们是如何解决这个问题的,以获得如何解决这个问题的想法

{
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);
        }
    }
}