Festlegen eines anderen Titels und Metatitels für eine Seite

7

Ich erstelle eine einfache Seite in meiner Magento 2-Instanz.
Im Controller für diese Seite versuche ich, einen Titel für die Seite und einen Metatitel festzulegen, der unterschiedlich sein sollte.
Aber das kann ich nicht.
Meine Layoutdatei für die Aktion ist fast leer:

<page layout="1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
    </body>

</page>

und meine Controller-Aktion sieht folgendermaßen aus:

namespace [Namespace]\[Module]\Controller\[Entity];

use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;

class Index extends Action
{
    protected $resultPageFactory;
    public function __construct(
        Context $context,
        PageFactory $resultPageFactory
    ) {
        parent::__construct($context);
        $this->resultPageFactory = $resultPageFactory;
    }
    public function execute()
    {
        $resultPage = $this->resultPageFactory->create();
        $resultPage->getConfig()->getTitle()->set('Something');
    }
}

Das Ergebnis ist folgendes:

Der Metatitel ist jedoch der gleiche wie der Titel ( Something).
Ändern der Leitung in der Steuerung:

$resultPage->getConfig()->getTitle()->set('Something');

zu

$resultPage->getConfig()->getTitle()->set('Something else');  

führt dazu, dass der Titel (H1-Tag) und der Metatitel in geändert werden something else.

Wie kann ich einer Seite einen anderen Metatitel und einen anderen Titel (h1-Tag) zuweisen?

Marius
quelle

Antworten:

13

Auf diese Weise habe ich verschiedene Metatitel und Seitenüberschriften erhalten. Ich habe folgenden Code in meiner Blockklasse:

public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,
    \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
    \Magento\Framework\View\Page\Config $pageConfig,
    $data = array()
) {
    $this->_scopeConfig = $scopeConfig; 
    $this->_pageConfig = $pageConfig;   

    parent::__construct($context, $data);
}

 /**
 * Prepare global layout
 *
 * @return $this
 */
protected function _prepareLayout()
{
    $this->_pageConfig->addBodyClass('advance-sitemap');

    if($this->getSeoTitle())
        $this->_pageConfig->getTitle()->set('Meta Title');

    if($this->getMetaKeywords())        
        $this->_pageConfig->setKeywords('Meta Keywords');

    if($this->getMetaDescription())         
        $this->_pageConfig->setDescription('Meta Description');

    $pageMainTitle = $this->getLayout()->getBlock('page.main.title');
    if ($pageMainTitle) {
        $pageMainTitle->setPageTitle('Page Heading Title');
    }

    return parent::_prepareLayout();
}

[EDIT by OP]
Sie können den Seitentitel auch über den Controller wie folgt einstellen:

$resultPage = $this->resultPageFactory->create();
$pageMainTitle = $resultPage->getLayout()->getBlock('page.main.title');
if ($pageMainTitle && $pageMainTitle instanceof \Magento\Theme\Block\Html\Title) {
    $pageMainTitle->setPageTitle('Page title here');
}
//rest of the code here.
Pankaj Pareek
quelle
1
Ich weiß nicht, ob das Festlegen des Seitentitels in einem Inhaltsblock die beste Idee ist, aber Ihre Antwort hat mich in die richtige Richtung gebracht. Das Festlegen des Seitentitels im page.main.titleBlock funktioniert auch in Controllern. Vielen Dank.
Marius
Hallo, danke, dass du das geteilt hast. Würde es Ihnen etwas ausmachen, den gesamten Code in Ihrer Antwort (Ist es Main.php?; ..Layout.xml; template.phtml) zu teilen, den Sie dafür verwendet haben? Ich kann mich irgendwie nicht reproduzieren / ich sehe in meinem Fall kein Ergebnis. Das wäre super toll!
eskaliert
0

Was ist mit:

$resultPage->getConfig()->getMetadata()->setMetadata('title', 'Something else');

für Metatitel.

belfort1
quelle
es funktioniert nicht ->getMetadata()Gibt ein Array zurück, sodass ich setMetadatadas Ergebnis nicht aufrufen kann . Das Entfernen getMetadataaus der Zeile führt nur zu einem Fehler Object of class Magento\Framework\View\Page\Title could not be converted to string.
Marius
Mit setMetadata () können Sie benutzerdefinierte Meta-Eigenschaften wie $ resultPage-> getConfig () -> getMetadata () -> setMetadata ('meta_title', 'Something else') festlegen.
Jaimin Parikh
@JaiminParikh. Sie können die beiden Aufrufe nicht verketten, getMetadata()->setMetadatada getMetadataein Array zurückgegeben wird und Sie keine Methode aus einem Array aufrufen können. Ich habe dies im obigen Kommentar erklärt. Aber ich habe es versucht $resultPage->getConfig()->setMetadata('meta_title', 'Something else');und es gibt keine Änderung. Ich denke, das funktioniert nicht, weil <meta name="title"...die Seite nicht gerendert ist. Der Titel wird wie folgt wiedergegeben:<title>...</title>
Marius
@Marius ja ich irre mich dabei. aber mit $ resultPage-> getConfig () -> setMetadata ('meta_title', 'Something else'); , t erstellt ein neues Meta-Tag mit dem Namen "meta_title" und ist nicht nützlich.
Jaimin Parikh
0

Ich habe mich gerade für eine neue benutzerdefinierte Erweiterung versucht, es funktioniert für mich:

public function execute() {
    $resultPage = $this->resultPageFactory->create();
    // Handling page title
    $resultPage->getLayout()->getBlock('page.main.title')->setPageTitle('Page title here');
    // Handling meta_title, meta_description and meta_keywords
    $resultPage->getConfig()->getTitle()->set("Title");
    $resultPage->getConfig()->setDescription("Description");
    $resultPage->getConfig()->setKeywords("Key Words");
    return $resultPage;
}

Es sollte den Job machen!

rou6e
quelle
Wo hast du das hinzugefügt?
Jibin George
In der
execute