This is seo components for Nette Framework which uses Doctrine2. It's allows you control these things:
- Google analytics
- Google webmaster tools
- Auto generated sitemap.xml
- robots.txt
- meta tags (title, keywords, description and robots)
- SEO friendly URLs
The best way to install brabijan/nette-seo-components is using Composer:
$ composer require brabijan/nette-seo-components:@dev
Then you have to register extension in config.neon
.
extensions:
- Brabijan\SeoComponents\DI\SeoExtension
You have to insert following lines to your BasePresenter and use components in your @layout.latte
(typically MetaTags to <head>
and GoogleAnalytics before </body>
tag)
/** @var \Brabijan\SeoComponents\Components\MetaTagsFactory @inject */
public $metaTagsFactory;
/** @var \Brabijan\SeoComponents\Components\GoogleAnalyticsFactory @inject */
public $googleAnalyticsFactory;
public function createComponentMetaTags()
{
return $this->metaTagsFactory->create();
}
public function createComponentGoogleAnalytics()
{
return $this->googleAnalyticsFactory->create();
}
For proper generating sitemap.xml or setting up target meta data we have to create list of application targets. Let's have PagesManager for example. If we want to use it as application target list, implement ITargetSectionProvider on it.
<?php
namespace App\Model\Pages;
use Brabijan\SeoComponents\DI\ITargetSectionProvider;
use Brabijan\SeoComponents\Router\Target;
class PagesManager extends Object implements ITargetSectionProvider {
/**
* @return Page
*/
public function getPagesList()
{
// return ...;
}
/**
* @return TargetSection
*/
public function getTargetSection()
{
$section = new TargetSection("Pages");
foreach ($this->getPagesList() as $page) {
$section->addTarget($page->name, new Target("Page", "show", $page->id));
}
return $section;
}
}
and register it in your config.neon
services
-
class: App\Model\Pages\PageManager
tags: [ Brabijan.seo.targetSectionProvider ]
Library contains few forms in namespace Brabijan\SeoComponents\Forms
, which you can use for set up Google Analytics, Google Webmaster tools and robots.txt.
In class Brabijan\SeoComponents\Forms\Controls\SeoContainer you can find container, which allows you to set up meta tags and url directly in your forms. Above we have example with pages, and now we're continue in it.
<?php
namespace App\AdminModule\Components;
use App\Model\Pages\Page;
use App\Model\Pages\PageManager;
use Brabijan\SeoComponents\Forms\Controls;
use Brabijan\SeoComponents\Router\Target;
use Nette\Application\UI\Form;
use Nette;
class SetPageForm extends Nette\Object
{
/** @var PageManager */
private $pageManager;
/** @var Controls\SeoContainerFactory */
private $seoContainerFactory;
/** @var Page */
private $page;
public function __construct(PageFacade $pageManager, Controls\SeoContainerFactory $seoContainerFactory)
{
$this->pageManager = $pageManager;
$this->seoContainerFactory = $seoContainerFactory;
}
public function setPage(Page $page)
{
$this->page = $page;
}
public function create()
{
$form = new Form();
$form->addGroup($this->page ? "Edit page" : "Add page");
$form->addText("name", "Name:");
$form->addTextArea("content", "Content:");
$seoGroup = $form->addGroup("SEO");
$form['seoComponents'] = $this->seoContainerFactory->create($seoGroup);
$form->addGroup();
$form->addSubmit("send", $this->page ? "Edit page" : "Add page");
$form->onSuccess[] = $this->processForm;
if ($this->page) {
$form->setDefaults(array(
"name" => $this->page->name,
"content" => $this->page->content,
));
}
return $form;
}
public function processForm(Form $form)
{
$values = $form->values;
$page = $this->page ? $this->page : new Page();
$page->name = $values->name;
$page->content = $values->content;
$this->pageManager->save($page);
/** @var Controls\SeoContainer $seoComponents */
$seoComponents = $form['seoComponents'];
$seoComponents->setTarget(new Target("Page", "show", $page->id));
$seoComponents->saveChanges();
}
}
There is component Brabijan\SeoComponents\Components\SetTarget. It's used for global settings all application targets. Use it anywhere in your administration.
/** @var SetTargetFactory @inject */
public $setTargetFactory;
public function createComponentSetTarget()
{
return $this->setTargetFactory->create();
}