diff --git a/app/code/Magento/Catalog/view/frontend/templates/product/view/form.phtml b/app/code/Magento/Catalog/view/frontend/templates/product/view/form.phtml
index 4d7005dfe6cb2..9c5cce7865532 100644
--- a/app/code/Magento/Catalog/view/frontend/templates/product/view/form.phtml
+++ b/app/code/Magento/Catalog/view/frontend/templates/product/view/form.phtml
@@ -22,6 +22,7 @@
+
= $block->getBlockHtml('formkey') ?>
= $block->getChildHtml('form_top') ?>
hasOptions()):?>
diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/configure/product-customer-data.js b/app/code/Magento/Checkout/view/frontend/web/js/view/configure/product-customer-data.js
index d7a81decbadef..9af5201c267e8 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/view/configure/product-customer-data.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/view/configure/product-customer-data.js
@@ -7,10 +7,12 @@ require([
var selectors = {
qtySelector: '#product_addtocart_form [name="qty"]',
- productIdSelector: '#product_addtocart_form [name="product"]'
+ productIdSelector: '#product_addtocart_form [name="product"]',
+ itemIdSelector: '#product_addtocart_form [name="item"]'
},
cartData = customerData.get('cart'),
productId = $(selectors.productIdSelector).val(),
+ itemId = $(selectors.itemIdSelector).val(),
productQty,
productQtyInput,
@@ -40,8 +42,10 @@ require([
return;
}
product = data.items.find(function (item) {
- return item['product_id'] === productId ||
- item['item_id'] === productId;
+ if (item['item_id'] === itemId) {
+ return item['product_id'] === productId ||
+ item['item_id'] === productId;
+ }
});
if (!product) {
diff --git a/app/code/Magento/ConfigurableProduct/view/frontend/web/js/options-updater.js b/app/code/Magento/ConfigurableProduct/view/frontend/web/js/options-updater.js
index a355a3f3ac7c7..37b7c7c41b216 100644
--- a/app/code/Magento/ConfigurableProduct/view/frontend/web/js/options-updater.js
+++ b/app/code/Magento/ConfigurableProduct/view/frontend/web/js/options-updater.js
@@ -7,10 +7,12 @@ define([
var selectors = {
formSelector: '#product_addtocart_form',
- productIdSelector: '#product_addtocart_form [name="product"]'
+ productIdSelector: '#product_addtocart_form [name="product"]',
+ itemIdSelector: '#product_addtocart_form [name="item"]'
},
cartData = customerData.get('cart'),
productId = $(selectors.productIdSelector).val(),
+ itemId = $(selectors.itemIdSelector).val(),
/**
* set productOptions according to cart data from customer-data
@@ -24,8 +26,10 @@ define([
if (!(data && data.items && data.items.length && productId)) {
return false;
}
- changedProductOptions = _.find(data.items, function (item) {
- return item['product_id'] === productId;
+ changedProductOptions = data.items.find(function (item) {
+ if (item['item_id'] === itemId) {
+ return item['product_id'] === productId;
+ }
});
changedProductOptions = changedProductOptions && changedProductOptions.options &&
changedProductOptions.options.reduce(function (obj, val) {
diff --git a/app/code/Magento/Deploy/Console/Command/App/ApplicationDumpCommand.php b/app/code/Magento/Deploy/Console/Command/App/ApplicationDumpCommand.php
index 9d13c97790fa4..4eb965b21d53a 100644
--- a/app/code/Magento/Deploy/Console/Command/App/ApplicationDumpCommand.php
+++ b/app/code/Magento/Deploy/Console/Command/App/ApplicationDumpCommand.php
@@ -12,6 +12,7 @@
use Magento\Framework\Config\File\ConfigFilePool;
use Magento\Framework\Console\Cli;
use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
@@ -20,6 +21,8 @@
*/
class ApplicationDumpCommand extends Command
{
+ const INPUT_CONFIG_TYPES = 'config-types';
+
/**
* @var Writer
*/
@@ -47,10 +50,10 @@ public function __construct(
array $sources,
Hash $configHash = null
) {
- parent::__construct();
$this->writer = $writer;
$this->sources = $sources;
$this->configHash = $configHash ?: ObjectManager::getInstance()->get(Hash::class);
+ parent::__construct();
}
/**
@@ -60,6 +63,13 @@ protected function configure()
{
$this->setName('app:config:dump');
$this->setDescription('Create dump of application');
+
+ $configTypes = array_unique(array_column($this->sources, 'namespace'));
+ $this->addArgument(
+ self::INPUT_CONFIG_TYPES,
+ InputArgument::OPTIONAL | InputArgument::IS_ARRAY,
+ sprintf('Space-separated list of config types or omit to dump all [%s]', implode(', ', $configTypes))
+ );
parent::configure();
}
@@ -74,11 +84,14 @@ protected function configure()
protected function execute(InputInterface $input, OutputInterface $output)
{
$this->groupSourcesByPool();
-
+ $dumpedTypes = [];
foreach ($this->sources as $pool => $sources) {
$dump = [];
$comments = [];
foreach ($sources as $sourceData) {
+ if ($this->skipDump($input, $sourceData)) {
+ continue;
+ }
/** @var ConfigSourceInterface $source */
$source = $sourceData['source'];
$namespace = $sourceData['namespace'];
@@ -95,15 +108,21 @@ protected function execute(InputInterface $input, OutputInterface $output)
null,
$comments
);
+ $dumpedTypes = array_unique($dumpedTypes + array_keys($dump));
if (!empty($comments)) {
$output->writeln($comments);
}
}
+ if (!$dumpedTypes) {
+ $output->writeln('Nothing dumped. Check the config types specified and try again');
+ return Cli::RETURN_FAILURE;
+ }
+
// Generate and save new hash of deployment configuration.
$this->configHash->regenerate();
- $output->writeln('Done.');
+ $output->writeln(sprintf('Done. Config types dumped: %s', implode(', ', $dumpedTypes)));
return Cli::RETURN_SUCCESS;
}
@@ -127,4 +146,20 @@ private function groupSourcesByPool()
$this->sources = $sources;
}
+
+ /**
+ * Check whether the dump source should be skipped
+ *
+ * @param InputInterface $input
+ * @param array $sourceData
+ * @return bool
+ */
+ private function skipDump(InputInterface $input, array $sourceData): bool
+ {
+ $allowedTypes = $input->getArgument(self::INPUT_CONFIG_TYPES);
+ if ($allowedTypes && !in_array($sourceData['namespace'], $allowedTypes)) {
+ return true;
+ }
+ return false;
+ }
}
diff --git a/app/code/Magento/Deploy/Test/Unit/Console/Command/ApplicationDumpCommandTest.php b/app/code/Magento/Deploy/Test/Unit/Console/Command/ApplicationDumpCommandTest.php
index 67c3796e7c6b9..85cae275932fa 100644
--- a/app/code/Magento/Deploy/Test/Unit/Console/Command/ApplicationDumpCommandTest.php
+++ b/app/code/Magento/Deploy/Test/Unit/Console/Command/ApplicationDumpCommandTest.php
@@ -130,7 +130,7 @@ public function testExport()
->method('writeln')
->withConsecutive(
[['system' => 'Some comment message']],
- ['Done.']
+ ['Done. Config types dumped: system']
);
$method = new \ReflectionMethod(ApplicationDumpCommand::class, 'execute');
diff --git a/app/code/Magento/Quote/Model/Quote.php b/app/code/Magento/Quote/Model/Quote.php
index 7741d3b0f7657..536c58861a253 100644
--- a/app/code/Magento/Quote/Model/Quote.php
+++ b/app/code/Magento/Quote/Model/Quote.php
@@ -2389,8 +2389,9 @@ protected function _afterLoad()
{
// collect totals and save me, if required
if (1 == $this->getTriggerRecollect()) {
- $this->collectTotals()->save();
- $this->setTriggerRecollect(0);
+ $this->collectTotals()
+ ->setTriggerRecollect(0)
+ ->save();
}
return parent::_afterLoad();
}
diff --git a/dev/tests/integration/testsuite/Magento/Deploy/Console/Command/App/ApplicationDumpCommandTest.php b/dev/tests/integration/testsuite/Magento/Deploy/Console/Command/App/ApplicationDumpCommandTest.php
index cb40b110f5fc6..5602e77eb702c 100644
--- a/dev/tests/integration/testsuite/Magento/Deploy/Console/Command/App/ApplicationDumpCommandTest.php
+++ b/dev/tests/integration/testsuite/Magento/Deploy/Console/Command/App/ApplicationDumpCommandTest.php
@@ -176,7 +176,7 @@ public function testExecute()
->with(['system' => $comment]);
$outputMock->expects($this->at(1))
->method('writeln')
- ->with('Done.');
+ ->with('Done. Config types dumped: scopes, themes, system, i18n');
/** @var ApplicationDumpCommand command */
$command = $this->objectManager->create(ApplicationDumpCommand::class);
diff --git a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php
index b1843717b0565..2274fde82b818 100644
--- a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php
+++ b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php
@@ -557,6 +557,15 @@ protected function _query($sql, $bind = [])
) {
$retry = true;
$triesCount++;
+
+ /**
+ * _connect() function does not allow port parameter, so put the port back with the host
+ */
+ if (!empty($this->_config['port'])) {
+ $this->_config['host'] = implode(':', [$this->_config['host'], $this->_config['port']]);
+ unset($this->_config['port']);
+ }
+
$this->closeConnection();
$this->_connect();
}