Đặt tiêu đề và tiêu đề meta khác nhau cho một trang


7

Tôi đang tạo một trang đơn giản trong ví dụ Magento 2 của tôi.
trong trình điều khiển cho trang đó, tôi đang cố gắng đặt tiêu đề cho trang và tiêu đề meta phải khác nhau.
Nhưng tôi không thể làm điều đó.
Tệp bố cục của tôi cho hành động gần như trống rỗng:

<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>

và hành động điều khiển của tôi trông như thế này:

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

Kết quả là thế này:

Nhưng tiêu đề meta giống như tiêu đề ( Something).
Thay đổi dòng trong bộ điều khiển:

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

đến

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

dẫn đến tiêu đề (thẻ H1) và tiêu đề meta thay đổi thành something else.

Làm cách nào tôi có thể đặt tiêu đề meta khác nhau và tiêu đề (thẻ h1) cho một trang

Câu trả lời:


13

Đây là cách tôi quản lý để có được Tiêu đề trang và Tiêu đề trang khác nhau. Tôi có mã dưới đây Trong lớp khối của tôi:

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]
Bạn cũng có thể đặt tiêu đề trang từ bộ điều khiển, như thế này:

$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.

1
Tôi không biết nếu đặt tiêu đề trang từ một khối nội dung là ý tưởng tốt nhất, nhưng câu trả lời của bạn đã giúp tôi đi đúng hướng. Đặt tiêu đề trang trên page.main.titlekhối cũng hoạt động trong bộ điều khiển. Cảm ơn.
Marius

Xin chào, cảm ơn vì đã chia sẻ điều này. Bạn có muốn chia sẻ toàn bộ mã trong câu trả lời của bạn (Có phải Main.php không?; ..Layout.xml; template.phtml) bạn đã sử dụng cho việc này? Tôi bằng cách nào đó không thể sao chép / Tôi không thấy bất kỳ kết quả nào trong trường hợp của tôi. Đó sẽ là siêu tuyệt vời!
eskaliert

0

Những gì về việc sử dụng:

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

cho tiêu đề meta.


nó không hoạt động. ->getMetadata()trả về một mảng để tôi không thể gọi setMetadatakết quả. Và loại bỏ getMetadatakhỏi dòng chỉ dẫn đến một lỗi Object of class Magento\Framework\View\Page\Title could not be converted to string.
Marius

bằng cách sử dụng setMetadata (), bạn có thể đặt thuộc tính meta tùy chỉnh như $ resultPage-> getConfig () -> getMetadata () -> setMetadata ('meta_title', 'Something other');
Jaimin Parikh

@JaiminParikh. Bạn không thể xâu chuỗi 2 cuộc gọi getMetadata()->setMetadatagetMetadatatrả về một mảng và bạn không thể gọi một phương thức từ một mảng. Tôi đã giải thích điều này trong bình luận ở trên. Nhưng tôi đã thử với $resultPage->getConfig()->setMetadata('meta_title', 'Something else');và không có thay đổi. Tôi nghĩ rằng điều này không hoạt động vì không có <meta name="title"...kết xuất trong trang. tiêu đề ám chỉ là<title>...</title>
Marius

@Marius vâng tôi sai ở đó. nhưng bằng cách sử dụng $ resultPage-> getConfig () -> setMetadata ('meta_title', 'Something other'); , t sẽ tạo thẻ meta mới có tên là "meta_title" và nó sẽ không hữu ích.
Jaimin Parikh

0

Chỉ cần thử bản thân một tiện ích mở rộng tùy chỉnh mới, nó hoạt động với tôi:

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

Nó shoud làm công việc!


bạn đã thêm cái này ở đâu?
george jibin

Trong phương thức
exec
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.