Skip to content
This repository has been archived by the owner on Apr 29, 2019. It is now read-only.

Commit

Permalink
Merge pull request #2704 from magento-borg/MAGETWO-91608-seo-url
Browse files Browse the repository at this point in the history
[borg] MAGETWO-91608: SEO-friendly URL for category page not working
  • Loading branch information
cpartica authored Jun 15, 2018
2 parents cf2ee26 + a885464 commit 2910d8b
Show file tree
Hide file tree
Showing 6 changed files with 127 additions and 3 deletions.
25 changes: 22 additions & 3 deletions app/code/Magento/Catalog/Controller/Adminhtml/Category.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\Catalog\Controller\Adminhtml;

use Magento\Store\Model\Store;

/**
* Catalog category controller
*/
Expand Down Expand Up @@ -44,7 +48,7 @@ public function __construct(
protected function _initCategory($getRootInstead = false)
{
$categoryId = $this->resolveCategoryId();
$storeId = (int)$this->getRequest()->getParam('store');
$storeId = $this->resolveStoreId();
$category = $this->_objectManager->create(\Magento\Catalog\Model\Category::class);
$category->setStoreId($storeId);

Expand All @@ -70,7 +74,7 @@ protected function _initCategory($getRootInstead = false)
$this->_objectManager->get(\Magento\Framework\Registry::class)->register('category', $category);
$this->_objectManager->get(\Magento\Framework\Registry::class)->register('current_category', $category);
$this->_objectManager->get(\Magento\Cms\Model\Wysiwyg\Config::class)
->setStoreId($this->getRequest()->getParam('store'));
->setStoreId($storeId);
return $category;
}

Expand All @@ -79,13 +83,28 @@ protected function _initCategory($getRootInstead = false)
*
* @return int
*/
private function resolveCategoryId()
private function resolveCategoryId() : int
{
$categoryId = (int)$this->getRequest()->getParam('id', false);

return $categoryId ?: (int)$this->getRequest()->getParam('entity_id', false);
}

/**
* Resolve store id
*
* Tries to take store id from store HTTP parameter
* @see Store
*
* @return int
*/
private function resolveStoreId() : int
{
$storeId = (int)$this->getRequest()->getParam('store', false);

return $storeId ?: (int)$this->getRequest()->getParam('store_id', Store::DEFAULT_STORE_ID);
}

/**
* Build response for ajax request
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,26 @@
<see selector="{{AdminCategoryBasicFieldSection.FieldError('uid')}}" userInput="This is a required field." stepKey="seeErrorMessage"/>
</actionGroup>


<actionGroup name="switchCategoryStoreView">
<arguments>
<argument name="Store"/>
<argument name="CatName"/>
</arguments>
<amOnPage url="{{AdminCategoryPage.page}}" stepKey="amOnCategoryPage"/>
<waitForPageLoad stepKey="waitForPageLoad1"/>
<click selector="{{AdminCategorySidebarTreeSection.categoryInTree(CatName)}}" stepKey="navigateToCreatedCategory" />
<waitForPageLoad stepKey="waitForPageLoad2"/>
<waitForLoadingMaskToDisappear stepKey="waitForSpinner"/>
<scrollToTopOfPage stepKey="scrollToToggle"/>
<click selector="{{AdminCategoryMainActionsSection.CategoryStoreViewDropdownToggle}}" stepKey="openStoreViewDropDown"/>
<click selector="{{AdminCategoryMainActionsSection.CategoryStoreViewOption(Store)}}" stepKey="selectStoreView"/>
<waitForPageLoad stepKey="waitForPageLoad3"/>
<waitForLoadingMaskToDisappear stepKey="waitForSpinner2"/>
<click selector="{{AdminCategoryMainActionsSection.CategoryStoreViewModalAccept}}" stepKey="selectStoreViewAccept"/>
<waitForPageLoad stepKey="waitForStoreViewChangeLoad"/>
</actionGroup>

<actionGroup name="navigateToCreatedCategory">
<arguments>
<argument name="Category"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,12 @@
<section name="AdminCategoryBasicFieldSection">
<element name="IncludeInMenu" type="checkbox" selector="input[name='include_in_menu']"/>
<element name="includeInMenuLabel" type="text" selector="input[name='include_in_menu']+label"/>
<element name="includeInMenuUseDefault" type="checkbox" selector="input[name='use_default[include_in_menu]']"/>
<element name="EnableCategory" type="checkbox" selector="input[name='is_active']"/>
<element name="enableCategoryLabel" type="text" selector="input[name='is_active']+label"/>
<element name="enableUseDefault" type="checkbox" selector="input[name='use_default[is_active]']"/>
<element name="CategoryNameInput" type="input" selector="input[name='name']"/>
<element name="categoryNameUseDefault" type="checkbox" selector="input[name='use_default[name]']"/>
<element name="ContentTab" type="input" selector="input[name='name']"/>
<element name="FieldError" type="text" selector=".admin__field-error[data-bind='attr: {for: {{field}}}, text: error']" parameterized="true"/>
</section>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,8 @@
<section name="AdminCategoryMainActionsSection">
<element name="SaveButton" type="button" selector=".page-actions-inner #save" timeout="30"/>
<element name="DeleteButton" type="button" selector=".page-actions-inner #delete" timeout="30"/>
<element name="CategoryStoreViewDropdownToggle" type="button" selector="#store-change-button"/>
<element name="CategoryStoreViewOption" type="button" selector="//div[contains(@class, 'store-switcher')]//a[normalize-space()='{{store}}']" parameterized="true"/>
<element name="CategoryStoreViewModalAccept" type="button" selector=".modal-popup.confirm._show .action-accept"/>
</section>
</sections>
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
<section name="AdminCategorySEOSection">
<element name="SectionHeader" type="button" selector="div[data-index='search_engine_optimization']" timeout="30"/>
<element name="UrlKeyInput" type="input" selector="input[name='url_key']"/>
<element name="UrlKeyDefaultValueCheckbox" type="button" selector="input[name='use_default[url_key]']"/>
<element name="UrlKeyRedirectCheckbox" type="button" selector="[data-index='url_key_create_redirect'] input[type='checkbox']"/>
<element name="MetaTitleInput" type="input" selector="input[name='meta_title']"/>
<element name="MetaKeywordsInput" type="textarea" selector="textarea[name='meta_keywords']"/>
<element name="MetaDescriptionInput" type="textarea" selector="textarea[name='meta_description']"/>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-->

<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
<test name="AdminUpdateCategoryStoreUrlKeyTest">
<annotations>
<features value="SEO-friendly URL Key Update"/>
<stories value="Update SEO-friendly URL via the Admin"/>
<title value="SEO-friendly URL should update regardless of scope or redirect change."/>
<description value="SEO-friendly URL should update regardless of scope or redirect change."/>
<severity value="CRITICAL"/>
<testCaseId value="MAGETWO-92338"/>
<group value="category"/>
</annotations>
<after>
<actionGroup ref="DeleteCategory" stepKey="deleteCategory">
<argument name="categoryEntity" value="_defaultCategory"/>
</actionGroup>
<amOnPage url="admin/admin/auth/logout/" stepKey="amOnLogoutPage"/>
</after>

<!-- Create category, change store view to default -->
<actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/>
<amOnPage url="{{AdminCategoryPage.url}}" stepKey="navigateToCategoryPage"/>
<waitForPageLoad stepKey="waitForPageLoad1"/>
<actionGroup ref="CreateCategory" stepKey="createCategory">
<argument name="categoryEntity" value="_defaultCategory"/>
</actionGroup>

<!--Switch to "Default Store View" scope-->
<actionGroup ref="switchCategoryStoreView" stepKey="SwitchStoreView">
<argument name="Store" value="_defaultStore.name"/>
<argument name="CatName" value="_defaultCategory.name"/>
</actionGroup>
<!--See "Use Default Value" checkboxes-->
<seeElement selector="{{AdminCategoryBasicFieldSection.enableUseDefault}}" stepKey="seeUseDefaultEnable"/>
<seeElement selector="{{AdminCategoryBasicFieldSection.includeInMenuUseDefault}}" stepKey="seeUseDefaultMenu"/>
<seeElement selector="{{AdminCategoryBasicFieldSection.categoryNameUseDefault}}" stepKey="seeUseDefaultName"/>
<!-- Update SEO key, uncheck "Create Redirect", confirm in frontend -->
<click selector="{{AdminCategorySEOSection.SectionHeader}}" stepKey="openSeoSection"/>
<uncheckOption selector="{{AdminCategorySEOSection.UrlKeyDefaultValueCheckbox}}" stepKey="uncheckUseDefaultUrlKey"/>
<fillField selector="{{AdminCategorySEOSection.UrlKeyInput}}" userInput="{{_defaultCategory.name_lwr}}-hattest" stepKey="enterURLKey"/>
<uncheckOption selector="{{AdminCategorySEOSection.UrlKeyRedirectCheckbox}}" stepKey="uncheckRedirect1"/>
<click selector="{{AdminCategoryMainActionsSection.SaveButton}}" stepKey="saveCategoryAfterFirstSeoUpdate"/>
<seeElement selector="{{AdminCategoryMessagesSection.SuccessMessage}}" stepKey="assertSuccessMessage"/>
<amOnPage url="" stepKey="goToStorefront"/>
<waitForPageLoad stepKey="waitForFrontendLoad"/>
<click stepKey="clickCategory" selector="{{StorefrontHeaderSection.NavigationCategoryByName(_defaultCategory.name)}}"/>
<see selector="{{StorefrontCategoryMainSection.CategoryTitle}}" userInput="{{_defaultCategory.name}}" stepKey="assertCategoryOnStorefront"/>
<seeInTitle userInput="{{_defaultCategory.name}}" stepKey="seeCategoryNameInTitle"/>
<seeInCurrentUrl stepKey="verifyUrlKey" url="{{_defaultCategory.name_lwr}}-hattest.html"/>

<!-- Update SEO key to original, uncheck "Create Redirect", confirm in frontend, delete category -->
<!--Switch to "Default Store View" scope-->
<actionGroup ref="switchCategoryStoreView" stepKey="SwitchStoreView2">
<argument name="Store" value="_defaultStore.name"/>
<argument name="CatName" value="_defaultCategory.name"/>
</actionGroup>
<click selector="{{AdminCategorySEOSection.SectionHeader}}" stepKey="openSeoSection2"/>
<fillField selector="{{AdminCategorySEOSection.UrlKeyInput}}" userInput="{{_defaultCategory.name_lwr}}" stepKey="enterOriginalURLKey"/>
<uncheckOption selector="{{AdminCategorySEOSection.UrlKeyRedirectCheckbox}}" stepKey="uncheckRedirect2"/>
<click selector="{{AdminCategoryMainActionsSection.SaveButton}}" stepKey="saveCategoryAfterOriginalSeoKey"/>
<seeElement selector="{{AdminCategoryMessagesSection.SuccessMessage}}" stepKey="assertSuccessMessageAfterOriginalSeoKey"/>
<amOnPage url="" stepKey="goToStorefrontAfterOriginalSeoKey"/>
<waitForPageLoad stepKey="waitForFrontendLoadAfterOriginalSeoKey"/>
<click stepKey="clickCategoryAfterOriginalSeoKey" selector="{{StorefrontHeaderSection.NavigationCategoryByName(_defaultCategory.name)}}"/>
<see selector="{{StorefrontCategoryMainSection.CategoryTitle}}" userInput="{{_defaultCategory.name}}" stepKey="assertCategoryOnStorefront2"/>
<seeInTitle userInput="{{_defaultCategory.name}}" stepKey="seeCategoryNameInTitle2"/>
<seeInCurrentUrl stepKey="verifyUrlKeyAfterOriginalSeoKey" url="{{_defaultCategory.name_lwr}}.html"/>
</test>
</tests>

0 comments on commit 2910d8b

Please sign in to comment.