Commit 13e55acb authored by Tino Goratsch's avatar Tino Goratsch Committed by GitHub

feature/seo-aliases (#45)

* minor usability improvements for the URI alias suggest

* refactored the SEO form fields so that other modules are less dependent of the SEO module's concrete implementation

* the ModelSaveEvent can now receive the raw post data too (alongside the already filtered post data)

* reworked the saving of the URI aliases to use the core.model.after_save event

* updated the changelog

* reworked the uri alias generation of the gallery picture to use the gallery.model.gallery.after_save event
parent ecc3fc5f
...@@ -48,66 +48,70 @@ abstract class AbstractModel ...@@ -48,66 +48,70 @@ abstract class AbstractModel
} }
/** /**
* @param array $columnData * @param array $rawData
* @param null|int $entryId * @param null|int $entryId
* @return bool|int * @return bool|int
*/ */
public function save(array $columnData, $entryId = null) public function save(array $rawData, $entryId = null)
{ {
$columnData = $this->prepareData($columnData); $filteredData = $this->prepareData($rawData);
$this->dispatchBeforeSaveEvent($this->repository, $columnData, $entryId); $this->dispatchBeforeSaveEvent($this->repository, $entryId, $filteredData, $rawData);
if ($entryId === null) { if ($entryId === null) {
$result = $this->repository->insert($columnData); $result = $this->repository->insert($filteredData);
if ($result !== false) { if ($result !== false) {
$entryId = $result; $entryId = $result;
} }
} else { } else {
$result = $this->repository->update($columnData, $entryId); $result = $this->repository->update($filteredData, $entryId);
} }
$this->dispatchAfterSaveEvent($this->repository, $columnData, $entryId); $this->dispatchAfterSaveEvent($this->repository, $entryId, $filteredData, $rawData);
return $result; return $result;
} }
/** /**
* @param AbstractRepository $repository * @param AbstractRepository $repository
* @param array $data
* @param int|null|array $entryId * @param int|null|array $entryId
* @param array $filteredData
* @param array $rawData
*/ */
protected function dispatchBeforeSaveEvent(AbstractRepository $repository, array $data, $entryId) protected function dispatchBeforeSaveEvent(
{ AbstractRepository $repository,
$this->dispatchEvent('core.model.before_save', $data, $entryId); $entryId,
array $filteredData,
array $rawData
) {
$this->dispatchEvent('core.model.before_save', $entryId, $filteredData, $rawData);
$this->dispatchEvent( $this->dispatchEvent(
static::EVENT_PREFIX . '.model.' . $repository::TABLE_NAME . '.before_save', static::EVENT_PREFIX . '.model.' . $repository::TABLE_NAME . '.before_save', $entryId, $filteredData
$data,
$entryId
); );
} }
/** /**
* @param string $eventName * @param string $eventName
* @param array $data
* @param int|null|array $entryId * @param int|null|array $entryId
* @param array $filteredData
* @param array $rawData
*/ */
protected function dispatchEvent($eventName, array $data, $entryId) protected function dispatchEvent($eventName, $entryId, array $filteredData = [], array $rawData = [])
{ {
$this->eventDispatcher->dispatch( $this->eventDispatcher->dispatch(
$eventName, $eventName,
new ModelSaveEvent(static::EVENT_PREFIX, $data, $entryId) new ModelSaveEvent(static::EVENT_PREFIX, $filteredData, $rawData, $entryId)
); );
} }
/** /**
* @param array $data * @param array $rawData
* @return array * @return array
*/ */
protected function prepareData(array $data) protected function prepareData(array $rawData)
{ {
return $this->dataProcessor->processColumnData($data, $this->getAllowedColumns()); return $this->dataProcessor->processColumnData($rawData, $this->getAllowedColumns());
} }
/** /**
...@@ -117,16 +121,19 @@ abstract class AbstractModel ...@@ -117,16 +121,19 @@ abstract class AbstractModel
/** /**
* @param AbstractRepository $repository * @param AbstractRepository $repository
* @param array $data
* @param int|null|array $entryId * @param int|null|array $entryId
* @param array $filteredData
* @param array $rawData
*/ */
protected function dispatchAfterSaveEvent(AbstractRepository $repository, array $data, $entryId) protected function dispatchAfterSaveEvent(
{ AbstractRepository $repository,
$this->dispatchEvent('core.model.after_save', $data, $entryId); $entryId,
array $filteredData,
array $rawData
) {
$this->dispatchEvent('core.model.after_save', $entryId, $filteredData, $rawData);
$this->dispatchEvent( $this->dispatchEvent(
static::EVENT_PREFIX . '.model.' . $repository::TABLE_NAME . '.after_save', static::EVENT_PREFIX . '.model.' . $repository::TABLE_NAME . '.after_save', $entryId, $filteredData
$data,
$entryId
); );
} }
...@@ -142,15 +149,9 @@ abstract class AbstractModel ...@@ -142,15 +149,9 @@ abstract class AbstractModel
$entryId = [$entryId]; $entryId = [$entryId];
} }
$this->dispatchEvent('core.model.before_delete', $entryId);
$this->dispatchEvent( $this->dispatchEvent(
'core.model.before_delete', static::EVENT_PREFIX . '.model.' . $repository::TABLE_NAME . '.before_delete', $entryId
[],
$entryId
);
$this->dispatchEvent(
static::EVENT_PREFIX . '.model.' . $repository::TABLE_NAME . '.before_delete',
[],
$entryId
); );
$affectedRows = 0; $affectedRows = 0;
...@@ -158,15 +159,9 @@ abstract class AbstractModel ...@@ -158,15 +159,9 @@ abstract class AbstractModel
$affectedRows += (int)$this->repository->delete($item); $affectedRows += (int)$this->repository->delete($item);
} }
$this->dispatchEvent('core.model.before_delete', $entryId);
$this->dispatchEvent( $this->dispatchEvent(
'core.model.before_delete', static::EVENT_PREFIX . '.model.' . $repository::TABLE_NAME . '.after_delete', $entryId
[],
$entryId
);
$this->dispatchEvent(
static::EVENT_PREFIX . '.model.' . $repository::TABLE_NAME . '.after_delete',
[],
$entryId
); );
return $affectedRows; return $affectedRows;
......
...@@ -53,18 +53,18 @@ abstract class AbstractNestedSetModel extends AbstractModel ...@@ -53,18 +53,18 @@ abstract class AbstractNestedSetModel extends AbstractModel
} }
/** /**
* @param array $columnData * @param array $rawData
* @param int|null $entryId * @param int|null $entryId
* @return bool|int * @return bool|int
*/ */
public function save(array $columnData, $entryId = null) public function save(array $rawData, $entryId = null)
{ {
$columnData = $this->prepareData($columnData); $filteredData = $this->prepareData($rawData);
$this->dispatchBeforeSaveEvent($this->repository, $columnData, $entryId); $this->dispatchBeforeSaveEvent($this->repository, $entryId, $filteredData, $rawData);
if ($entryId === null) { if ($entryId === null) {
$result = $this->insertOperation->execute($columnData, $columnData['parent_id']); $result = $this->insertOperation->execute($filteredData, $rawData['parent_id']);
if ($result !== false) { if ($result !== false) {
$entryId = $result; $entryId = $result;
...@@ -72,13 +72,13 @@ abstract class AbstractNestedSetModel extends AbstractModel ...@@ -72,13 +72,13 @@ abstract class AbstractNestedSetModel extends AbstractModel
} else { } else {
$result = $this->editOperation->execute( $result = $this->editOperation->execute(
$entryId, $entryId,
$columnData['parent_id'], $filteredData['parent_id'],
isset($columnData['block_id']) ? $columnData['block_id'] : 0, isset($filteredData['block_id']) ? $filteredData['block_id'] : 0,
$columnData $filteredData
); );
} }
$this->dispatchAfterSaveEvent($this->repository, $columnData, $entryId); $this->dispatchAfterSaveEvent($this->repository, $entryId, $filteredData, $rawData);
return $result; return $result;
} }
...@@ -95,15 +95,9 @@ abstract class AbstractNestedSetModel extends AbstractModel ...@@ -95,15 +95,9 @@ abstract class AbstractNestedSetModel extends AbstractModel
$entryId = [$entryId]; $entryId = [$entryId];
} }
$this->dispatchEvent('core.model.before_delete', $entryId);
$this->dispatchEvent( $this->dispatchEvent(
'core.model.before_delete', static::EVENT_PREFIX . '.model.' . $repository::TABLE_NAME . '.before_delete', $entryId
[],
$entryId
);
$this->dispatchEvent(
static::EVENT_PREFIX . '.model.' . $repository::TABLE_NAME . '.before_delete',
[],
$entryId
); );
$affectedRows = 0; $affectedRows = 0;
...@@ -111,15 +105,9 @@ abstract class AbstractNestedSetModel extends AbstractModel ...@@ -111,15 +105,9 @@ abstract class AbstractNestedSetModel extends AbstractModel
$affectedRows += (int)$this->deleteOperation->execute($item); $affectedRows += (int)$this->deleteOperation->execute($item);
} }
$this->dispatchEvent('core.model.before_delete', $entryId);
$this->dispatchEvent( $this->dispatchEvent(
'core.model.before_delete', static::EVENT_PREFIX . '.model.' . $repository::TABLE_NAME . '.after_delete', $entryId
[],
$entryId
);
$this->dispatchEvent(
static::EVENT_PREFIX . '.model.' . $repository::TABLE_NAME . '.after_delete',
[],
$entryId
); );
return $affectedRows; return $affectedRows;
......
...@@ -18,22 +18,28 @@ class ModelSaveEvent extends Event ...@@ -18,22 +18,28 @@ class ModelSaveEvent extends Event
/** /**
* @var array * @var array
*/ */
private $data; private $filteredData;
/** /**
* @var int|null * @var int|null
*/ */
private $entryId; private $entryId;
/**
* @var array
*/
private $rawData;
/** /**
* ModelSaveEvent constructor. * ModelSaveEvent constructor.
* @param string $moduleName * @param string $moduleName
* @param array $data * @param array $filteredData
* @param array $rawData
* @param int|null|array $entryId * @param int|null|array $entryId
*/ */
public function __construct($moduleName, array $data, $entryId) public function __construct($moduleName, array $filteredData, array $rawData, $entryId)
{ {
$this->moduleName = $moduleName; $this->moduleName = $moduleName;
$this->data = $data; $this->filteredData = $filteredData;
$this->rawData = $rawData;
$this->entryId = $entryId; $this->entryId = $entryId;
} }
...@@ -50,7 +56,15 @@ class ModelSaveEvent extends Event ...@@ -50,7 +56,15 @@ class ModelSaveEvent extends Event
*/ */
public function getData() public function getData()
{ {
return $this->data; return $this->filteredData;
}
/**
* @return array
*/
public function getRawData()
{
return $this->rawData;
} }
/** /**
...@@ -66,6 +80,6 @@ class ModelSaveEvent extends Event ...@@ -66,6 +80,6 @@ class ModelSaveEvent extends Event
*/ */
public function isDeleteStatement() public function isDeleteStatement()
{ {
return count($this->data) === 0 && is_array($this->entryId); return count($this->filteredData) === 0 && is_array($this->entryId);
} }
} }
...@@ -10,7 +10,6 @@ use ACP3\Core; ...@@ -10,7 +10,6 @@ use ACP3\Core;
use ACP3\Core\Controller\AbstractAdminAction; use ACP3\Core\Controller\AbstractAdminAction;
use ACP3\Modules\ACP3\Articles; use ACP3\Modules\ACP3\Articles;
use ACP3\Modules\ACP3\Menus; use ACP3\Modules\ACP3\Menus;
use ACP3\Modules\ACP3\Seo\Helper\UriAliasManager;
/** /**
* Class AbstractFormAction * Class AbstractFormAction
...@@ -26,10 +25,6 @@ abstract class AbstractFormAction extends AbstractAdminAction ...@@ -26,10 +25,6 @@ abstract class AbstractFormAction extends AbstractAdminAction
* @var \ACP3\Modules\ACP3\Menus\Helpers\ManageMenuItem * @var \ACP3\Modules\ACP3\Menus\Helpers\ManageMenuItem
*/ */
protected $manageMenuItemHelper; protected $manageMenuItemHelper;
/**
* @var \ACP3\Modules\ACP3\Seo\Helper\UriAliasManager
*/
protected $uriAliasManager;
/** /**
* AbstractFormAction constructor. * AbstractFormAction constructor.
...@@ -57,14 +52,6 @@ abstract class AbstractFormAction extends AbstractAdminAction ...@@ -57,14 +52,6 @@ abstract class AbstractFormAction extends AbstractAdminAction
return $this; return $this;
} }
/**
* @param \ACP3\Modules\ACP3\Seo\Helper\UriAliasManager $uriAliasManager
*/
public function setUriAliasManager(UriAliasManager $uriAliasManager)
{
$this->uriAliasManager = $uriAliasManager;
}
/** /**
* @param array $formData * @param array $formData
* @param int $articleId * @param int $articleId
...@@ -89,23 +76,6 @@ abstract class AbstractFormAction extends AbstractAdminAction ...@@ -89,23 +76,6 @@ abstract class AbstractFormAction extends AbstractAdminAction
} }
} }
/**
* @param array $formData
* @param int $articleId
*/
protected function insertUriAlias(array $formData, $articleId)
{
if ($this->uriAliasManager) {
$this->uriAliasManager->insertUriAlias(
sprintf(Articles\Helpers::URL_KEY_PATTERN, $articleId),
$formData['alias'],
$formData['seo_keywords'],
$formData['seo_description'],
(int)$formData['seo_robots']
);
}
}
/** /**
* @param int $currentValue * @param int $currentValue
* @return array * @return array
......
...@@ -9,7 +9,6 @@ namespace ACP3\Modules\ACP3\Articles\Controller\Admin\Index; ...@@ -9,7 +9,6 @@ namespace ACP3\Modules\ACP3\Articles\Controller\Admin\Index;
use ACP3\Core; use ACP3\Core;
use ACP3\Modules\ACP3\Articles; use ACP3\Modules\ACP3\Articles;
use ACP3\Modules\ACP3\Menus; use ACP3\Modules\ACP3\Menus;
use ACP3\Modules\ACP3\Seo\Helper\MetaFormFields;
/** /**
* Class Create * Class Create
...@@ -29,10 +28,6 @@ class Create extends AbstractFormAction ...@@ -29,10 +28,6 @@ class Create extends AbstractFormAction
* @var Menus\Helpers\MenuItemFormFields * @var Menus\Helpers\MenuItemFormFields
*/ */
protected $menuItemFormFieldsHelper; protected $menuItemFormFieldsHelper;
/**
* @var \ACP3\Modules\ACP3\Seo\Helper\MetaFormFields
*/
protected $metaFormFieldsHelper;
/** /**
* @var Articles\Model\ArticlesModel * @var Articles\Model\ArticlesModel
*/ */
...@@ -59,14 +54,6 @@ class Create extends AbstractFormAction ...@@ -59,14 +54,6 @@ class Create extends AbstractFormAction
$this->formTokenHelper = $formTokenHelper; $this->formTokenHelper = $formTokenHelper;
} }
/**
* @param \ACP3\Modules\ACP3\Seo\Helper\MetaFormFields $metaFormFieldsHelper
*/
public function setMetaFormFieldsHelper(MetaFormFields $metaFormFieldsHelper)
{
$this->metaFormFieldsHelper = $metaFormFieldsHelper;
}
/** /**
* @param \ACP3\Modules\ACP3\Menus\Helpers\MenuItemFormFields $menuItemFormFieldsHelper * @param \ACP3\Modules\ACP3\Menus\Helpers\MenuItemFormFields $menuItemFormFieldsHelper
* *
...@@ -97,9 +84,10 @@ class Create extends AbstractFormAction ...@@ -97,9 +84,10 @@ class Create extends AbstractFormAction
return [ return [
'options' => $this->fetchOptions(), 'options' => $this->fetchOptions(),
'SEO_FORM_FIELDS' => $this->metaFormFieldsHelper ? $this->metaFormFieldsHelper->formFields() : [],
'form' => array_merge($defaults, $this->request->getPost()->all()), 'form' => array_merge($defaults, $this->request->getPost()->all()),
'form_token' => $this->formTokenHelper->renderFormToken() 'form_token' => $this->formTokenHelper->renderFormToken(),
'SEO_URI_PATTERN' => Articles\Helpers::URL_KEY_PATTERN,
'SEO_ROUTE_NAME' => ''
]; ];
} }
...@@ -116,8 +104,6 @@ class Create extends AbstractFormAction ...@@ -116,8 +104,6 @@ class Create extends AbstractFormAction
$formData['user_id'] = $this->user->getUserId(); $formData['user_id'] = $this->user->getUserId();
$articleId = $this->articlesModel->save($formData); $articleId = $this->articlesModel->save($formData);
$this->insertUriAlias($formData, $articleId);
$this->createOrUpdateMenuItem($formData, $articleId); $this->createOrUpdateMenuItem($formData, $articleId);
return $articleId; return $articleId;
......
...@@ -9,7 +9,6 @@ namespace ACP3\Modules\ACP3\Articles\Controller\Admin\Index; ...@@ -9,7 +9,6 @@ namespace ACP3\Modules\ACP3\Articles\Controller\Admin\Index;
use ACP3\Core; use ACP3\Core;
use ACP3\Modules\ACP3\Articles; use ACP3\Modules\ACP3\Articles;
use ACP3\Modules\ACP3\Menus; use ACP3\Modules\ACP3\Menus;
use ACP3\Modules\ACP3\Seo\Helper\MetaFormFields;
/** /**
* Class Edit * Class Edit
...@@ -33,10 +32,6 @@ class Edit extends AbstractFormAction ...@@ -33,10 +32,6 @@ class Edit extends AbstractFormAction
* @var Menus\Helpers\MenuItemFormFields * @var Menus\Helpers\MenuItemFormFields
*/ */
protected $menuItemFormFieldsHelper; protected $menuItemFormFieldsHelper;
/**
* @var \ACP3\Modules\ACP3\Seo\Helper\MetaFormFields
*/
protected $metaFormFieldsHelper;
/** /**
* @var Articles\Model\ArticlesModel * @var Articles\Model\ArticlesModel
*/ */
...@@ -63,14 +58,6 @@ class Edit extends AbstractFormAction ...@@ -63,14 +58,6 @@ class Edit extends AbstractFormAction
$this->articlesModel = $articlesModel; $this->articlesModel = $articlesModel;
} }
/**
* @param \ACP3\Modules\ACP3\Seo\Helper\MetaFormFields $metaFormFieldsHelper
*/
public function setMetaFormFieldsHelper(MetaFormFields $metaFormFieldsHelper)
{
$this->metaFormFieldsHelper = $metaFormFieldsHelper;
}
/** /**
* @param \ACP3\Modules\ACP3\Menus\Helpers\MenuItemFormFields $menuItemFormFieldsHelper * @param \ACP3\Modules\ACP3\Menus\Helpers\MenuItemFormFields $menuItemFormFieldsHelper
* *
...@@ -114,11 +101,10 @@ class Edit extends AbstractFormAction ...@@ -114,11 +101,10 @@ class Edit extends AbstractFormAction
return [ return [
'options' => $this->fetchOptions($id), 'options' => $this->fetchOptions($id),
'SEO_FORM_FIELDS' => $this->metaFormFieldsHelper
? $this->metaFormFieldsHelper->formFields(sprintf(Articles\Helpers::URL_KEY_PATTERN, $id))
: [],
'form' => array_merge($article, $this->request->getPost()->all()), 'form' => array_merge($article, $this->request->getPost()->all()),
'form_token' => $this->formTokenHelper->renderFormToken() 'form_token' => $this->formTokenHelper->renderFormToken(),
'SEO_URI_PATTERN' => Articles\Helpers::URL_KEY_PATTERN,
'SEO_ROUTE_NAME' => sprintf(Articles\Helpers::URL_KEY_PATTERN, $id)
]; ];
} }
...@@ -141,7 +127,6 @@ class Edit extends AbstractFormAction ...@@ -141,7 +127,6 @@ class Edit extends AbstractFormAction
$formData['user_id'] = $this->user->getUserId(); $formData['user_id'] = $this->user->getUserId();
$result = $this->articlesModel->save($formData, $articleId); $result = $this->articlesModel->save($formData, $articleId);
$this->insertUriAlias($formData, $articleId);
$this->createOrUpdateMenuItem($formData, $articleId); $this->createOrUpdateMenuItem($formData, $articleId);
return $result; return $result;
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
{include file="asset:Menus/Partials/create_menu_item.tpl"} {include file="asset:Menus/Partials/create_menu_item.tpl"}
{/if} {/if}
</div> </div>
{event name="seo.layout.render_form_fields" SEO_FORM_FIELDS=$SEO_FORM_FIELDS} {event name="seo.layout.render_form_fields" uri_pattern=$SEO_URI_PATTERN path=$SEO_ROUTE_NAME}
</div> </div>
</div> </div>
{include file="asset:System/Partials/form_group.submit.tpl" form_token=$form_token back_url={uri args="acp/articles"}} {include file="asset:System/Partials/form_group.submit.tpl" form_token=$form_token back_url={uri args="acp/articles"}}
......
...@@ -10,8 +10,6 @@ services: ...@@ -10,8 +10,6 @@ services:
calls: calls:
- ['setManageMenuItemHelper', ['@?menus.helpers.managemenuitem']] - ['setManageMenuItemHelper', ['@?menus.helpers.managemenuitem']]
- ['setMenuItemFormFieldsHelper', ['@?menus.helpers.menuitemformfields']] - ['setMenuItemFormFieldsHelper', ['@?menus.helpers.menuitemformfields']]
- ['setMetaFormFieldsHelper', ['@?seo.helper.meta_form_fields']]
- ['setUriAliasManager', ['@?seo.helper.uri_alias_manager']]
articles.controller.admin.index.delete: articles.controller.admin.index.delete:
class: ACP3\Modules\ACP3\Articles\Controller\Admin\Index\Delete class: ACP3\Modules\ACP3\Articles\Controller\Admin\Index\Delete
...@@ -31,8 +29,6 @@ services: ...@@ -31,8 +29,6 @@ services:
- ['setManageMenuItemHelper', ['@?menus.helpers.managemenuitem']] - ['setManageMenuItemHelper', ['@?menus.helpers.managemenuitem']]
- ['setMenuItemFormFieldsHelper', ['@?menus.helpers.menuitemformfields']] - ['setMenuItemFormFieldsHelper', ['@?menus.helpers.menuitemformfields']]
- ['setMenuItemRepository', ['@?menus.model.menuitemrepository']] - ['setMenuItemRepository', ['@?menus.model.menuitemrepository']]
- ['setMetaFormFieldsHelper', ['@?seo.helper.meta_form_fields']]
- ['setUriAliasManager', ['@?seo.helper.uri_alias_manager']]
articles.controller.admin.index.index: articles.controller.admin.index.index:
class: ACP3\Modules\ACP3\Articles\Controller\Admin\Index\Index class: ACP3\Modules\ACP3\Articles\Controller\Admin\Index\Index
......
...@@ -10,8 +10,6 @@ use ACP3\Core; ...@@ -10,8 +10,6 @@ use ACP3\Core;
use ACP3\Core\Controller\AbstractAdminAction; use ACP3\Core\Controller\AbstractAdminAction;
use ACP3\Modules\ACP3\Categories; use ACP3\Modules\ACP3\Categories;
use ACP3\Modules\ACP3\Files; use ACP3\Modules\ACP3\Files;
use ACP3\Modules\ACP3\Seo\Helper\MetaFormFields;
use ACP3\Modules\ACP3\Seo\Helper\UriAliasManager;
/** /**
* Class AbstractFormAction * Class AbstractFormAction
...@@ -23,14 +21,6 @@ abstract class AbstractFormAction extends AbstractAdminAction ...@@ -23,14 +21,6 @@ abstract class AbstractFormAction extends AbstractAdminAction
* @var \ACP3\Modules\ACP3\Categories\Helpers * @var \ACP3\Modules\ACP3\Categories\Helpers
*/ */
protected $categoriesHelpers; protected $categoriesHelpers;
/**
* @var \ACP3\Modules\ACP3\Seo\Helper\MetaFormFields
*/
protected $metaFormFieldsHelper;
/**
* @var \ACP3\Modules\ACP3\Seo\Helper\UriAliasManager
*/
protected $uriAliasManager;
/** /**
* @var \ACP3\Core\Helpers\Forms * @var \ACP3\Core\Helpers\Forms
*/ */
...@@ -54,22 +44,6 @@ abstract class AbstractFormAction extends AbstractAdminAction ...@@ -54,22 +44,6 @@ abstract class AbstractFormAction extends AbstractAdminAction
$this->categoriesHelpers = $categoriesHelpers; $this->categoriesHelpers = $categoriesHelpers;
} }
/**
* @param \ACP3\Modules\ACP3\Seo\Helper\MetaFormFields $metaFormFieldsHelper
*/
public function setMetaFormFieldsHelper(MetaFormFields $metaFormFieldsHelper)
{
$this->metaFormFieldsHelper = $