Files
2017-11-14 15:04:59 +01:00

129 lines
4.5 KiB
PHP
Executable File

<?php
namespace Mageplaza\Seo\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Event\Observer;
class Markup implements ObserverInterface
{
/**
* @param \Magento\Framework\Event\Observer $observer
*/
public function execute(Observer $observer)
{
/* @var \Magento\Framework\View\LayoutInterface $layout */
$layout = $observer->getEvent()->getLayout();
$action = $observer->getEvent()->getFullActionName();
/**
* Add Canonical tag
*/
$headBlock = $this->getBlock('head.additional', $layout);
if ($headBlock != false) {
$afterBodyStartContainer = $this->renderContainer('after.body.start', $layout);
$afterBodyStartContainer = str_replace([' ', "\n"], ['', ''], $afterBodyStartContainer);
/**
* Add rich snippets organization
*/
$subString = '<scripttype="application/ld+json">{"@context":"http://schema.org","@type":"Organization"';
if (!$afterBodyStartContainer || strpos($afterBodyStartContainer, $subString) === false) {
$layout->addBlock('\Mageplaza\Seo\Block\Richsnippets\Organization', 'mageplaza_seo_organization', 'head.additional', '');
}
/**
* Add rich snippets sitename, sitelinks
*/
$subString = '<scripttype="application/ld+json">{"@context":"http://schema.org","@type":"WebSite"';
if (!$afterBodyStartContainer || strpos($afterBodyStartContainer, $subString) === false) {
$layout->addBlock('\Mageplaza\Seo\Block\Sitelinks', 'mageplaza_seo_sitelinks', 'head.additional', '');
}
/**
* Add markup data to specify action
*/
switch ($action) {
case 'catalog_category_view':
$headBlock->addChild(
'mageplaza_seo_open_graph',
'\Mageplaza\Seo\Block\Page\Head\Category',
['template' => 'opengraph/category.phtml']
);
break;
case 'catalog_category_view_type_default':
$headBlock->addChild(
'mageplaza_seo_open_graph',
'\Mageplaza\Seo\Block\Page\Head\Category',
['template' => 'opengraph/category.phtml']
);
break;
case 'cms_page_view':
$headBlock->addChild(
'mageplaza_seo_open_graph',
'\Mageplaza\Seo\Block\Page\Head\Page',
['template' => 'opengraph/cms.phtml']
);
break;
case 'catalog_product_view':
$headBlock->addChild(
'mageplaza_seo_open_graph',
'\Mageplaza\Seo\Block\Page\Head\Product',
['template' => 'opengraph/product.phtml']
);
/**
* Add rich snippet product
*/
$layout->addBlock(
'\Mageplaza\Seo\Block\Richsnippets\Product',
'mageplaza_seo_richsnippets_product',
'head.additional',
''
);
break;
}
}
}
/**
* Get block by name
*
* @param string $name
* @param \Magento\Framework\View\LayoutInterface $layout
* @return \Magento\Framework\View\Element\AbstractBlock|bool
*/
public function getBlock($name, $layout)
{
$blocks = $layout->getAllBlocks();
return isset($blocks[$name]) ? $blocks[$name] : false;
}
/**
* Get block by name
*
* @param string $name
* @param \Magento\Framework\View\LayoutInterface $layout
* @return string
*/
public function renderContainer($name, $layout)
{
$html = '';
$children = $layout->getChildNames($name);
foreach ($children as $child) {
$html .= $layout->renderElement($child);
}
return $html;
}
protected $logger;
public function __construct(\Psr\Log\LoggerInterface $logger)
{
$this->logger = $logger;
}
}