it-blaster / redirect-bundle
Auxiliary Symfony2 bundle. Perenapravlenie from the pages of the old site to the new site page.
Installs: 96
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 6
Forks: 0
Open Issues: 0
Type:symfony-bundle
Requires
- propel/propel: ~2.0@dev
- propel/propel-bundle: >=1.4
- sonata-project/propel-admin-bundle: >=1.0
- symfony/symfony: >=2.2
This package is not auto-updated.
Last update: 2024-10-26 16:46:58 UTC
README
Вспомогательный бандл для работы с редиректами на сайте. Если у вас был старый сайт, а теперь вы переехали на новый сайт, написанный на symfony 2, и вы хотите чтобы по старым ссылкам открывались страницы нового сайта, то этот бандл для вас.
Installation
Добавьте ItBlasterRedirectBundle в composer.json
:
{ "require": { "it-blaster/redirect-bundle": "dev-master" }, }
Теперь запустите композер, чтобы скачать бандл командой:
$ php composer.phar update it-blaster/redirect-bundle
Композер установит бандл в папку проекта vendor/it-blaster/redirect-bundle
.
Далее подключите бандл в ядре AppKernel.php
:
<?php // app/AppKernel.php public function registerBundles() { $bundles = array( // ... new ItBlaster\RedirectBundle\ItBlasterRedirectBundle(), ); }
Use redirect in models
С помощью RedirectBundle редиректы можно добавлять в формы редактирования сущностей. Для этого необходимо:
- указать в файле
config.yml
параметрit_blaster_redirect.use_model
it_blaster_redirect: locales: ['ru', 'en','uk','cs'] use_model: true
- подключить бихейвор
RedirectBehavior
вconfig.yml
propel: ... behaviors: ... it_blaster_redirect: ItBlaster\RedirectBundle\Behavior\RedirectBehavior
- в файле
schema.yml
добавить бихейворit_blaster_redirect
к описанию молели:
<table name="news" description="Новости"> <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true" /> <column name="title" type="varchar" required="true" primaryString="true" /> <column name="alias" type="varchar" required="true" /> <column name="date" type="date" required="true" /> <column name="short_desc" type="longvarchar" /> <column name="full_desc" type="longvarchar" /> <column name="active" type="boolean" /> <behavior name="i18n"> <parameter name="i18n_columns" value="title, short_desc, full_desc" /> </behavior> <behavior name="it_blaster_redirect" > <parameter name="i18n" value="false" /> </behavior> </table> <table name="news_i18n" description="Новости. Языковые версии"> <behavior name="it_blaster_redirect" > <parameter name="i18n" value="true" /> </behavior> </table>
Use Redirect
Для начала необходимо переопределить контроллер 404 ошибки. Для этого в файле config.yml
twig: exception_controller: AppMainBundle:Layout:showException
Далее в методе showException контроллера Layout перед тем как отдать 404-страницу проверяем есть ли текущий адрес в таблице редиректов:
public function showExceptionAction(Request $request, FlattenException $exception, DebugLoggerInterface $logger = null) { $redirect = $this->oldRedirect($request, $exception); if ($redirect) { return $this->redirect($redirect); } ... } /** * Если ссылка пользователя ведёт на старый сайт, редиректим на новый сайт * * @param Request $request * @param FlattenException $exception */ protected function oldRedirect(Request $request, FlattenException $exception) { $redirect_object = RedirectQuery::create() ->filterByOldUrl('%'.$request->getUri().'%', \Criteria::LIKE) ->findOne(); if ($redirect_object) { //ща средиректим return $redirect_object->getNewUrl(); //адрес на указанную ссылку } }
Если у вас стоит параметр use_model: true
, то в операторе if ($redirect_object) {
необходимо добавить проверку if ($redirect_object->getNewUrl()) {
. Если этот оператор не выполняется, то смотреть на поля model
, object_id
и пытаться средиректить на страницу объекта. Например:
protected function oldRedirect(Request $request, FlattenException $exception) { $redirect_object = RedirectQuery::create() ->filterByOldUrl('%'.$request->getUri().'%', \Criteria::LIKE) ->findOne(); if ($redirect_object) { //ща средиректим if ($redirect_object->getNewUrl()) { return $redirect_object->getNewUrl(); //адрес на указанную ссылку } else { $model = $redirect_object->getModel(); $object_id = $redirect_object->getObjectId(); if ($model && $object_id) { $route_name = false; $route_params = array(); switch ($model) { case 'news_i18n': $object = NewsQuery::create()->findOneById($object_id); if ($object) { $route_name = 'news-item'; $route_params = array('alias'=>$object->getAlias()); } break; ... } if ($route_name) { return $this->generateUrl($route_name, $route_params); //адрес на объект } } } } return false; }
Credits
It-Blaster it-blaster@yandex.ru