diff --git a/app/code/Magento/GiftMessageGraphQl/Model/Resolver/Cart/GiftMessage.php b/app/code/Magento/GiftMessageGraphQl/Model/Resolver/Cart/GiftMessage.php
index c317221fb6ef7..2ce51c8bbf19d 100644
--- a/app/code/Magento/GiftMessageGraphQl/Model/Resolver/Cart/GiftMessage.php
+++ b/app/code/Magento/GiftMessageGraphQl/Model/Resolver/Cart/GiftMessage.php
@@ -66,7 +66,7 @@ public function resolve(
array $args = null
) {
if (!isset($value['model'])) {
- throw new GraphQlInputException(__('"model" value should be specified'));
+ throw new GraphQlInputException(__('"model" value must be specified'));
}
$cart = $value['model'];
diff --git a/app/code/Magento/GiftMessageGraphQl/Model/Resolver/Cart/Item/GiftMessage.php b/app/code/Magento/GiftMessageGraphQl/Model/Resolver/Cart/Item/GiftMessage.php
new file mode 100644
index 0000000000000..a9a8e682612cc
--- /dev/null
+++ b/app/code/Magento/GiftMessageGraphQl/Model/Resolver/Cart/Item/GiftMessage.php
@@ -0,0 +1,97 @@
+itemRepository = $itemRepository;
+ $this->giftMessageHelper = $giftMessageHelper;
+ }
+
+ /**
+ * Return information about Gift message for item cart
+ *
+ * @param Field $field
+ * @param ContextInterface $context
+ * @param ResolveInfo $info
+ * @param array|null $value
+ * @param array|null $args
+ *
+ * @return array|Value|mixed
+ * @throws GraphQlInputException
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ */
+ public function resolve(
+ Field $field,
+ $context,
+ ResolveInfo $info,
+ array $value = null,
+ array $args = null
+ ) {
+ if (!isset($value['model'])) {
+ throw new GraphQlInputException(__('"model" value must be specified'));
+ }
+
+ $quoteItem = $value['model'];
+
+ if (!$this->giftMessageHelper->isMessagesAllowed('items', $quoteItem)) {
+ return null;
+ }
+
+ if (!$this->giftMessageHelper->isMessagesAllowed('item', $quoteItem)) {
+ return null;
+ }
+
+ try {
+ $giftItemMessage = $this->itemRepository->get($quoteItem->getQuoteId(), $quoteItem->getItemId());
+ } catch (LocalizedException $e) {
+ throw new GraphQlInputException(__('Can\'t load cart item'));
+ }
+
+ if (!isset($giftItemMessage)) {
+ return null;
+ }
+
+ return [
+ 'to' => $giftItemMessage->getRecipient() ?? '',
+ 'from' => $giftItemMessage->getSender() ?? '',
+ 'message'=> $giftItemMessage->getMessage() ?? ''
+ ];
+ }
+}
diff --git a/app/code/Magento/GiftMessageGraphQl/README.md b/app/code/Magento/GiftMessageGraphQl/README.md
index fa2e02116b66c..d73a058e0db9c 100644
--- a/app/code/Magento/GiftMessageGraphQl/README.md
+++ b/app/code/Magento/GiftMessageGraphQl/README.md
@@ -1,3 +1,3 @@
# GiftMessageGraphQl
-**GiftMessageGraphQl** provides information about gift messages for cart, cart items, order and order items.
+**GiftMessageGraphQl** provides information about gift messages for carts, cart items, orders and order items.
diff --git a/app/code/Magento/GiftMessageGraphQl/etc/graphql/di.xml b/app/code/Magento/GiftMessageGraphQl/etc/graphql/di.xml
new file mode 100644
index 0000000000000..bce5b7063e6b9
--- /dev/null
+++ b/app/code/Magento/GiftMessageGraphQl/etc/graphql/di.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+ - sales/gift_options/allow_order
+ - sales/gift_options/allow_items
+
+
+
+
diff --git a/app/code/Magento/GiftMessageGraphQl/etc/schema.graphqls b/app/code/Magento/GiftMessageGraphQl/etc/schema.graphqls
index f14c812a9a5f3..ad18054abca13 100644
--- a/app/code/Magento/GiftMessageGraphQl/etc/schema.graphqls
+++ b/app/code/Magento/GiftMessageGraphQl/etc/schema.graphqls
@@ -1,20 +1,47 @@
# Copyright © Magento, Inc. All rights reserved.
# See COPYING.txt for license details.
+type StoreConfig {
+ allow_order : String @doc(description: "The value of the Allow Gift Messages on Order Level option")
+ allow_items : String @doc(description: "The value of the Allow Gift Messages for Order Items option")
+}
+
type Cart {
gift_message: GiftMessage @resolver (class: "\\Magento\\GiftMessageGraphQl\\Model\\Resolver\\Cart\\GiftMessage") @doc(description: "The entered gift message for the cart")
}
-type SalesItemInterface {
- gift_message: GiftMessage @doc(description: "The entered gift message for the order item")
+type SimpleCartItem {
+ gift_message: GiftMessage @resolver (class: "\\Magento\\GiftMessageGraphQl\\Model\\Resolver\\Cart\\Item\\GiftMessage") @doc(description: "The entered gift message for the cart item")
}
-type CustomerOrder {
- gift_message: GiftMessage @resolver (class: "\\Magento\\GiftMessageGraphQl\\Model\\Resolver\\Order\\GiftMessage") @doc(description: "The entered gift message for the order")
+type ConfigurableCartItem {
+ gift_message: GiftMessage @resolver (class: "\\Magento\\GiftMessageGraphQl\\Model\\Resolver\\Cart\\Item\\GiftMessage") @doc(description: "The entered gift message for the cart item")
+}
+
+type BundleCartItem {
+ gift_message: GiftMessage @resolver (class: "\\Magento\\GiftMessageGraphQl\\Model\\Resolver\\Cart\\Item\\GiftMessage") @doc(description: "The entered gift message for the cart item")
+}
+
+type GiftMessage @doc(description: "Contains the text of a gift message, its sender, and recipient") {
+ to: String! @doc(description: "Recipient name")
+ from: String! @doc(description: "Sender name")
+ message: String! @doc(description: "Gift message text")
+}
+
+input CartItemUpdateInput {
+ gift_message: GiftMessageInput @doc(description: "Gift message details for the cart item")
}
-type GiftMessage {
- to: String! @doc(description: "Recepient name")
+input GiftMessageInput @doc(description: "Contains the text of a gift message, its sender, and recipient") {
+ to: String! @doc(description: "Recipient name")
from: String! @doc(description: "Sender name")
message: String! @doc(description: "Gift message text")
}
+
+type SalesItemInterface {
+ gift_message: GiftMessage @doc(description: "The entered gift message for the order item")
+}
+
+type CustomerOrder {
+ gift_message: GiftMessage @resolver (class: "\\Magento\\GiftMessageGraphQl\\Model\\Resolver\\Order\\GiftMessage") @doc(description: "The entered gift message for the order")
+}
diff --git a/app/code/Magento/QuoteGraphQl/Model/CartItem/DataProvider/UpdateCartItems.php b/app/code/Magento/QuoteGraphQl/Model/CartItem/DataProvider/UpdateCartItems.php
new file mode 100644
index 0000000000000..c2e94b215956e
--- /dev/null
+++ b/app/code/Magento/QuoteGraphQl/Model/CartItem/DataProvider/UpdateCartItems.php
@@ -0,0 +1,157 @@
+cartItemRepository = $cartItemRepository;
+ $this->updateCartItem = $updateCartItem;
+ $this->itemRepository = $itemRepository;
+ $this->giftMessageHelper = $giftMessageHelper;
+ $this->giftMessageFactory = $giftMessageFactory;
+ }
+
+ /**
+ * Process cart items
+ *
+ * @param Quote $cart
+ * @param array $items
+ *
+ * @throws GraphQlInputException
+ * @throws LocalizedException
+ * @SuppressWarnings(PHPMD.CyclomaticComplexity)
+ * @SuppressWarnings(PHPMD.NPathComplexity)
+ */
+ public function processCartItems(Quote $cart, array $items): void
+ {
+ foreach ($items as $item) {
+ if (empty($item['cart_item_id'])) {
+ throw new GraphQlInputException(__('Required parameter "cart_item_id" for "cart_items" is missing.'));
+ }
+
+ $itemId = (int)$item['cart_item_id'];
+ $customizableOptions = $item['customizable_options'] ?? [];
+ $cartItem = $cart->getItemById($itemId);
+
+ if ($cartItem && $cartItem->getParentItemId()) {
+ throw new GraphQlInputException(__('Child items may not be updated.'));
+ }
+
+ if (count($customizableOptions) === 0 && !isset($item['quantity'])) {
+ throw new GraphQlInputException(__('Required parameter "quantity" for "cart_items" is missing.'));
+ }
+
+ $quantity = (float)$item['quantity'];
+
+ if ($quantity <= 0.0) {
+ $this->cartItemRepository->deleteById((int)$cart->getId(), $itemId);
+ } else {
+ $this->updateCartItem->execute($cart, $itemId, $quantity, $customizableOptions);
+ }
+
+ if (!empty($item['gift_message'])) {
+ try {
+ if (!$this->giftMessageHelper->isMessagesAllowed('items', $cartItem)) {
+ continue;
+ }
+ if (!$this->giftMessageHelper->isMessagesAllowed('item', $cartItem)) {
+ continue;
+ }
+
+ /** @var MessageInterface $giftItemMessage */
+ $giftItemMessage = $this->itemRepository->get($cart->getEntityId(), $itemId);
+
+ if (empty($giftItemMessage)) {
+ /** @var MessageInterface $giftMessage */
+ $giftMessage = $this->giftMessageFactory->create();
+ $this->updateGiftMessageForItem($cart, $giftMessage, $item, $itemId);
+ continue;
+ }
+ } catch (LocalizedException $exception) {
+ throw new GraphQlInputException(__('Gift Message cannot be updated.'));
+ }
+
+ $this->updateGiftMessageForItem($cart, $giftItemMessage, $item, $itemId);
+ }
+ }
+ }
+
+ /**
+ * Update Gift Message for Quote item
+ *
+ * @param Quote $cart
+ * @param MessageInterface $giftItemMessage
+ * @param array $item
+ * @param int $itemId
+ *
+ * @throws GraphQlInputException
+ */
+ private function updateGiftMessageForItem(Quote $cart, MessageInterface $giftItemMessage, array $item, int $itemId)
+ {
+ try {
+ $giftItemMessage->setRecipient($item['gift_message']['to']);
+ $giftItemMessage->setSender($item['gift_message']['from']);
+ $giftItemMessage->setMessage($item['gift_message']['message']);
+ $this->itemRepository->save($cart->getEntityId(), $giftItemMessage, $itemId);
+ } catch (LocalizedException $exception) {
+ throw new GraphQlInputException(__('Gift Message cannot be updated'));
+ }
+ }
+}
diff --git a/app/code/Magento/QuoteGraphQl/Model/Resolver/UpdateCartItems.php b/app/code/Magento/QuoteGraphQl/Model/Resolver/UpdateCartItems.php
index fa90f08e4b553..005baaad0e1e5 100644
--- a/app/code/Magento/QuoteGraphQl/Model/Resolver/UpdateCartItems.php
+++ b/app/code/Magento/QuoteGraphQl/Model/Resolver/UpdateCartItems.php
@@ -14,53 +14,43 @@
use Magento\Framework\GraphQl\Exception\GraphQlNoSuchEntityException;
use Magento\Framework\GraphQl\Query\ResolverInterface;
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
-use Magento\Quote\Api\CartItemRepositoryInterface;
use Magento\Quote\Api\CartRepositoryInterface;
-use Magento\Quote\Model\Quote;
use Magento\QuoteGraphQl\Model\Cart\GetCartForUser;
-use Magento\QuoteGraphQl\Model\Cart\UpdateCartItem;
+use Magento\QuoteGraphQl\Model\CartItem\DataProvider\UpdateCartItems as UpdateCartItemsProvider;
/**
* @inheritdoc
*/
class UpdateCartItems implements ResolverInterface
{
- /**
- * @var UpdateCartItem
- */
- private $updateCartItem;
-
/**
* @var GetCartForUser
*/
private $getCartForUser;
/**
- * @var CartItemRepositoryInterface
+ * @var CartRepositoryInterface
*/
- private $cartItemRepository;
+ private $cartRepository;
/**
- * @var CartRepositoryInterface
+ * @var UpdateCartItemsProvider
*/
- private $cartRepository;
+ private $updateCartItems;
/**
- * @param GetCartForUser $getCartForUser
- * @param CartItemRepositoryInterface $cartItemRepository
- * @param UpdateCartItem $updateCartItem
+ * @param GetCartForUser $getCartForUser
* @param CartRepositoryInterface $cartRepository
+ * @param UpdateCartItemsProvider $updateCartItems
*/
public function __construct(
GetCartForUser $getCartForUser,
- CartItemRepositoryInterface $cartItemRepository,
- UpdateCartItem $updateCartItem,
- CartRepositoryInterface $cartRepository
+ CartRepositoryInterface $cartRepository,
+ UpdateCartItemsProvider $updateCartItems
) {
$this->getCartForUser = $getCartForUser;
- $this->cartItemRepository = $cartItemRepository;
- $this->updateCartItem = $updateCartItem;
$this->cartRepository = $cartRepository;
+ $this->updateCartItems = $updateCartItems;
}
/**
@@ -71,6 +61,7 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value
if (empty($args['input']['cart_id'])) {
throw new GraphQlInputException(__('Required parameter "cart_id" is missing.'));
}
+
$maskedCartId = $args['input']['cart_id'];
if (empty($args['input']['cart_items'])
@@ -78,13 +69,13 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value
) {
throw new GraphQlInputException(__('Required parameter "cart_items" is missing.'));
}
- $cartItems = $args['input']['cart_items'];
+ $cartItems = $args['input']['cart_items'];
$storeId = (int)$context->getExtensionAttributes()->getStore()->getId();
$cart = $this->getCartForUser->execute($maskedCartId, $context->getUserId(), $storeId);
try {
- $this->processCartItems($cart, $cartItems);
+ $this->updateCartItems->processCartItems($cart, $cartItems);
$this->cartRepository->save($cart);
} catch (NoSuchEntityException $e) {
throw new GraphQlNoSuchEntityException(__($e->getMessage()), $e);
@@ -98,39 +89,4 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value
],
];
}
-
- /**
- * Process cart items
- *
- * @param Quote $cart
- * @param array $items
- * @throws GraphQlInputException
- * @throws LocalizedException
- */
- private function processCartItems(Quote $cart, array $items): void
- {
- foreach ($items as $item) {
- if (empty($item['cart_item_id'])) {
- throw new GraphQlInputException(__('Required parameter "cart_item_id" for "cart_items" is missing.'));
- }
- $itemId = (int)$item['cart_item_id'];
- $customizableOptions = $item['customizable_options'] ?? [];
-
- $cartItem = $cart->getItemById($itemId);
- if ($cartItem && $cartItem->getParentItemId()) {
- throw new GraphQlInputException(__('Child items may not be updated.'));
- }
-
- if (count($customizableOptions) === 0 && !isset($item['quantity'])) {
- throw new GraphQlInputException(__('Required parameter "quantity" for "cart_items" is missing.'));
- }
- $quantity = (float)$item['quantity'];
-
- if ($quantity <= 0.0) {
- $this->cartItemRepository->deleteById((int)$cart->getId(), $itemId);
- } else {
- $this->updateCartItem->execute($cart, $itemId, $quantity, $customizableOptions);
- }
- }
- }
}
diff --git a/app/code/Magento/QuoteGraphQl/composer.json b/app/code/Magento/QuoteGraphQl/composer.json
index 0652d39b5f426..25f089cf75a62 100644
--- a/app/code/Magento/QuoteGraphQl/composer.json
+++ b/app/code/Magento/QuoteGraphQl/composer.json
@@ -13,7 +13,8 @@
"magento/module-customer-graph-ql": "*",
"magento/module-sales": "*",
"magento/module-directory": "*",
- "magento/module-graph-ql": "*"
+ "magento/module-graph-ql": "*",
+ "magento/module-gift-message": "*"
},
"suggest": {
"magento/module-graph-ql-cache": "*"
diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/GiftMessage/Cart/Item/GiftMessageTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/GiftMessage/Cart/Item/GiftMessageTest.php
new file mode 100644
index 0000000000000..fa0909d556b3a
--- /dev/null
+++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/GiftMessage/Cart/Item/GiftMessageTest.php
@@ -0,0 +1,89 @@
+getMaskedQuoteIdByReservedOrderId = $objectManager->get(GetMaskedQuoteIdByReservedOrderId::class);
+ }
+
+ /**
+ * @magentoConfigFixture default_store sales/gift_options/allow_items 0
+ * @magentoApiDataFixture Magento/GiftMessage/_files/guest/quote_with_item_message.php
+ * @throws NoSuchEntityException
+ * @throws Exception
+ */
+ public function testGiftMessageCartForItemNotAllow()
+ {
+ $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_guest_order_with_gift_message');
+ foreach ($this->requestCartResult($maskedQuoteId)['cart']['items'] as $item) {
+ self::assertArrayHasKey('gift_message', $item);
+ self::assertNull($item['gift_message']);
+ }
+ }
+
+ /**
+ * @magentoConfigFixture default_store sales/gift_options/allow_items 1
+ * @magentoApiDataFixture Magento/GiftMessage/_files/guest/quote_with_item_message.php
+ * @throws NoSuchEntityException
+ * @throws Exception
+ */
+ public function testGiftMessageCartForItem()
+ {
+ $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_guest_order_with_gift_message');
+ foreach ($this->requestCartResult($maskedQuoteId)['cart']['items'] as $item) {
+ self::assertArrayHasKey('gift_message', $item);
+ self::assertArrayHasKey('to', $item['gift_message']);
+ self::assertArrayHasKey('from', $item['gift_message']);
+ self::assertArrayHasKey('message', $item['gift_message']);
+ }
+ }
+
+ /**
+ * @param string $quoteId
+ *
+ * @return array|bool|float|int|string
+ * @throws Exception
+ */
+ private function requestCartResult(string $quoteId)
+ {
+ $query = <<graphQlQuery($query);
+ }
+}
diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/UpdateCartItemsTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/UpdateCartItemsTest.php
index a17bc1aa3821a..0a22f3ca9721c 100644
--- a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/UpdateCartItemsTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/UpdateCartItemsTest.php
@@ -7,8 +7,9 @@
namespace Magento\GraphQl\Quote\Guest;
-use Magento\Quote\Model\QuoteFactory;
+use Exception;
use Magento\Catalog\Api\ProductRepositoryInterface;
+use Magento\Quote\Model\QuoteFactory;
use Magento\Quote\Model\QuoteIdToMaskedQuoteIdInterface;
use Magento\Quote\Model\ResourceModel\Quote as QuoteResource;
use Magento\TestFramework\Helper\Bootstrap;
@@ -273,6 +274,81 @@ private function getCartQuery(string $maskedQuoteId)
}
}
}
+QUERY;
+ }
+
+ /**
+ * @magentoConfigFixture default_store sales/gift_options/allow_items 0
+ * @magentoApiDataFixture Magento/GiftMessage/_files/guest/quote_with_item_message.php
+ * @throws Exception
+ */
+ public function testUpdateGiftMessageCartForItemNotAllow()
+ {
+ $query = $this->getUpdateGiftMessageQuery();
+ foreach ($this->graphQlMutation($query)['updateCartItems']['cart']['items'] as $item) {
+ self::assertNull($item['gift_message']);
+ }
+ }
+
+ /**
+ * @magentoConfigFixture default_store sales/gift_options/allow_items 1
+ * @magentoApiDataFixture Magento/GiftMessage/_files/guest/quote_with_item_message.php
+ * @throws Exception
+ */
+ public function testUpdateGiftMessageCartForItem()
+ {
+ $query = $this->getUpdateGiftMessageQuery();
+ foreach ($this->graphQlMutation($query)['updateCartItems']['cart']['items'] as $item) {
+ self::assertArrayHasKey('gift_message', $item);
+ self::assertSame('Alex', $item['gift_message']['to']);
+ self::assertSame('Mike', $item['gift_message']['from']);
+ self::assertSame('Best regards.', $item['gift_message']['message']);
+ }
+ }
+
+ private function getUpdateGiftMessageQuery()
+ {
+ $quote = $this->quoteFactory->create();
+ $this->quoteResource->load($quote, 'test_guest_order_with_gift_message', 'reserved_order_id');
+ $maskedQuoteId = $this->quoteIdToMaskedId->execute((int)$quote->getId());
+ $itemId = (int)$quote->getItemByProduct($this->productRepository->get('simple'))->getId();
+
+ return <<requireDataFixture('Magento/Catalog/_files/products.php');
+
+/** @var ObjectManagerInterface $objectManager */
+$objectManager = Bootstrap::getObjectManager();
+
+/** @var QuoteResource $quote */
+$quote = $objectManager->create(QuoteResource::class);
+
+/** @var Quote $quoteModel */
+$quoteModel = $objectManager->create(Quote::class);
+$quoteModel->setData(['store_id' => 1, 'is_active' => 1, 'is_multi_shipping' => 0]);
+$quote->save($quoteModel);
+
+/** @var ProductRepositoryInterface $productRepository */
+$productRepository = $objectManager->create(ProductRepositoryInterface::class);
+$product = $productRepository->get('simple');
+
+$quoteModel->setReservedOrderId('test_guest_order_with_gift_message')
+ ->addProduct($product, 1);
+$quoteModel->collectTotals();
+$quote->save($quoteModel);
+
+/** @var MessageResource $message */
+$message = $objectManager->create(MessageResource::class);
+
+/** @var Message $message */
+$messageModel = $objectManager->create(Message::class);
+
+$messageModel->setSender('John Doe');
+$messageModel->setRecipient('Jane Roe');
+$messageModel->setMessage('Gift Message Text');
+$message->save($messageModel);
+
+$quoteModel->getItemByProduct($product)->setGiftMessageId($messageModel->getId());
+$quote->save($quoteModel);
+
+/** @var QuoteIdMaskResource $quoteIdMask */
+$quoteIdMask = Bootstrap::getObjectManager()
+ ->create(QuoteIdMaskFactory::class)
+ ->create();
+
+/** @var QuoteIdMask $quoteIdMaskModel */
+$quoteIdMaskModel = $objectManager->create(QuoteIdMask::class);
+
+$quoteIdMaskModel->setQuoteId($quoteModel->getId());
+$quoteIdMaskModel->setDataChanges(true);
+$quoteIdMask->save($quoteIdMaskModel);
diff --git a/dev/tests/integration/testsuite/Magento/GiftMessage/_files/guest/quote_with_item_message_rollback.php b/dev/tests/integration/testsuite/Magento/GiftMessage/_files/guest/quote_with_item_message_rollback.php
new file mode 100644
index 0000000000000..9c215cb432b45
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/GiftMessage/_files/guest/quote_with_item_message_rollback.php
@@ -0,0 +1,32 @@
+get(Registry::class);
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', true);
+$objectManager = Bootstrap::getObjectManager();
+$quote = $objectManager->create(Quote::class);
+$quote->load('test_guest_order_with_gift_message', 'reserved_order_id');
+$message = $objectManager->create(Message::class);
+$product = $objectManager->create(Product::class);
+foreach ($quote->getAllItems() as $item) {
+ $message->load($item->getGiftMessageId());
+ $message->delete();
+ $sku = $item->getSku();
+ $product->load($product->getIdBySku($sku));
+ if ($product->getId()) {
+ $product->delete();
+ }
+}
+$quote->delete();
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', false);