diff --git a/app/code/Magento/Bundle/Block/Adminhtml/Order/Create/Sidebar.php b/app/code/Magento/Bundle/Block/Adminhtml/Order/Create/Sidebar.php new file mode 100644 index 0000000000000000000000000000000000000000..12a3d48d20c4bf596652cdd1635bfe27584cef67 --- /dev/null +++ b/app/code/Magento/Bundle/Block/Adminhtml/Order/Create/Sidebar.php @@ -0,0 +1,51 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Bundle\Block\Adminhtml\Order\Create; + +class Sidebar +{ + /** + * Get item qty + * + * @param \Magento\Sales\Block\Adminhtml\Order\Create\Sidebar\AbstractSidebar $subject + * @param callable $proceed + * @param \Magento\Framework\DataObject $item + * + * @return string + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function aroundGetItemQty( + \Magento\Sales\Block\Adminhtml\Order\Create\Sidebar\AbstractSidebar $subject, + \Closure $proceed, + \Magento\Framework\DataObject $item + ) { + if ($item->getProduct()->getTypeId() == \Magento\Bundle\Model\Product\Type::TYPE_CODE) { + return ''; + } + return $proceed($item); + } + + /** + * Check whether product configuration is required before adding to order + * + * @param \Magento\Sales\Block\Adminhtml\Order\Create\Sidebar\AbstractSidebar $subject + * @param callable $proceed + * @param string $productType + * + * @return bool + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function aroundIsConfigurationRequired( + \Magento\Sales\Block\Adminhtml\Order\Create\Sidebar\AbstractSidebar $subject, + \Closure $proceed, + $productType + ) { + if ($productType == \Magento\Bundle\Model\Product\Type::TYPE_CODE) { + return true; + } + return $proceed($productType); + } +} diff --git a/app/code/Magento/Bundle/Model/Product/Type.php b/app/code/Magento/Bundle/Model/Product/Type.php index 65742f76f261fc8d391bc992d7d56db848307148..2270f6cb149eb9dc14c15bc097824673cad24bc8 100644 --- a/app/code/Magento/Bundle/Model/Product/Type.php +++ b/app/code/Magento/Bundle/Model/Product/Type.php @@ -19,6 +19,11 @@ use Magento\Framework\Pricing\PriceCurrencyInterface; */ class Type extends \Magento\Catalog\Model\Product\Type\AbstractType { + /** + * Product type + */ + const TYPE_CODE = 'bundle'; + /** * Product is composite * diff --git a/app/code/Magento/Bundle/etc/adminhtml/di.xml b/app/code/Magento/Bundle/etc/adminhtml/di.xml index 0270ff9164b5980aa8c6b8b62c32bcea0e21a628..91970a4cdd9f3a145faff60f4d877bcba563ceda 100644 --- a/app/code/Magento/Bundle/etc/adminhtml/di.xml +++ b/app/code/Magento/Bundle/etc/adminhtml/di.xml @@ -9,6 +9,9 @@ <type name="Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper"> <plugin name="Bundle" type="Magento\Bundle\Controller\Adminhtml\Product\Initialization\Helper\Plugin\Bundle" sortOrder="60" /> </type> + <type name="Magento\Sales\Block\Adminhtml\Order\Create\Sidebar\AbstractSidebar"> + <plugin name="Bundle" type="Magento\Bundle\Block\Adminhtml\Order\Create\Sidebar" sortOrder="200"/> + </type> <type name="Magento\Catalog\Model\Product\CopyConstructor\Composite"> <arguments> <argument name="constructors" xsi:type="array"> diff --git a/app/code/Magento/Catalog/Ui/Component/ColumnFactory.php b/app/code/Magento/Catalog/Ui/Component/ColumnFactory.php index 58de2b262c8ab7489b6f37691e592484dd7d624b..ab061a2c756c3a5a4eb5aa312312459e163720a1 100644 --- a/app/code/Magento/Catalog/Ui/Component/ColumnFactory.php +++ b/app/code/Magento/Catalog/Ui/Component/ColumnFactory.php @@ -55,6 +55,9 @@ class ColumnFactory 'dataType' => $this->getDataType($attribute), 'add_field' => true, 'visible' => $attribute->getIsVisibleInGrid(), + 'filter' => ($attribute->getIsFilterableInGrid()) + ? $this->getFilterType($attribute->getFrontendInput()) + : null, ], $config); if ($attribute->usesSource()) { @@ -92,4 +95,17 @@ class ColumnFactory ? $this->dataTypeMap[$attribute->getFrontendInput()] : $this->dataTypeMap['default']; } + + /** + * Retrieve filter type by $frontendInput + * + * @param string $frontendInput + * @return string + */ + protected function getFilterType($frontendInput) + { + $filtersMap = ['date' => 'dateRange']; + $result = array_replace_recursive($this->dataTypeMap, $filtersMap); + return isset($result[$frontendInput]) ? $result[$frontendInput] : $result['default']; + } } diff --git a/app/code/Magento/CustomerImportExport/Model/Import/Customer.php b/app/code/Magento/CustomerImportExport/Model/Import/Customer.php index ef92b5194c5d004e1fbbaa8bc4b86f0c14a78292..513c2a703b5d439ac5df946d9129af9cbce44819 100644 --- a/app/code/Magento/CustomerImportExport/Model/Import/Customer.php +++ b/app/code/Magento/CustomerImportExport/Model/Import/Customer.php @@ -377,7 +377,9 @@ class Customer extends AbstractCustomer $attributeParameters = $this->_attributes[$attributeCode]; if ('select' == $attributeParameters['type']) { - $value = $attributeParameters['options'][strtolower($value)]; + $value = isset($attributeParameters['options'][strtolower($value)]) + ? $attributeParameters['options'][strtolower($value)] + : 0; } elseif ('datetime' == $attributeParameters['type']) { $value = (new \DateTime())->setTimestamp(strtotime($value)); $value = $value->format(\Magento\Framework\Stdlib\DateTime::DATETIME_PHP_FORMAT); diff --git a/app/code/Magento/Newsletter/Model/Queue/TransportBuilder.php b/app/code/Magento/Newsletter/Model/Queue/TransportBuilder.php index 7ee8fc1c9f6aad5c28d8dd2e1f67f355ad23af8e..781c181eb903a4d6216a4da6fb0ca1ab6d6a3412 100644 --- a/app/code/Magento/Newsletter/Model/Queue/TransportBuilder.php +++ b/app/code/Magento/Newsletter/Model/Queue/TransportBuilder.php @@ -5,6 +5,8 @@ */ namespace Magento\Newsletter\Model\Queue; +use Magento\Email\Model\AbstractTemplate; + class TransportBuilder extends \Magento\Framework\Mail\Template\TransportBuilder { /** @@ -26,17 +28,30 @@ class TransportBuilder extends \Magento\Framework\Mail\Template\TransportBuilder return $this; } + /** + * @param AbstractTemplate $template + * @return void + */ + protected function setTemplateFilter(AbstractTemplate $template) + { + if (isset($this->templateData['template_filter'])) { + $template->setTemplateFilter($this->templateData['template_filter']); + } + } + /** * @inheritdoc */ protected function prepareMessage() { + /** @var AbstractTemplate $template */ $template = $this->getTemplate()->setData($this->templateData); + $this->setTemplateFilter($template); $this->message->setMessageType( \Magento\Framework\Mail\MessageInterface::TYPE_HTML )->setBody( - $template->getProcessedTemplate() + $template->getProcessedTemplate($this->templateVars) )->setSubject( $template->getSubject() ); diff --git a/app/code/Magento/Newsletter/Model/Template/Filter.php b/app/code/Magento/Newsletter/Model/Template/Filter.php index 43a68d085bbf9a1b079f8751d5a5d52a99b910ff..0a2abbcacfd6ce468b345f20d841f337ef168dcf 100644 --- a/app/code/Magento/Newsletter/Model/Template/Filter.php +++ b/app/code/Magento/Newsletter/Model/Template/Filter.php @@ -11,7 +11,7 @@ */ namespace Magento\Newsletter\Model\Template; -class Filter extends \Magento\Widget\Model\Template\Filter +class Filter extends \Magento\Widget\Model\Template\FilterEmulate { /** * Generate widget HTML if template variables are assigned diff --git a/app/code/Magento/Newsletter/Test/Unit/Model/Queue/TransportBuilderTest.php b/app/code/Magento/Newsletter/Test/Unit/Model/Queue/TransportBuilderTest.php index 52a501f9ef3b6b15fd72079266db9629fef8fa98..dd7ff0eac5fb90056221ad1c244dc8ba69992f97 100644 --- a/app/code/Magento/Newsletter/Test/Unit/Model/Queue/TransportBuilderTest.php +++ b/app/code/Magento/Newsletter/Test/Unit/Model/Queue/TransportBuilderTest.php @@ -32,11 +32,13 @@ class TransportBuilderTest extends \Magento\Framework\Mail\Test\Unit\Template\Tr $messageType = MessageInterface::TYPE_HTML, $bodyText = '<h1>Html message</h1>' ) { + $filter = $this->getMock('Magento\Email\Model\Template\Filter', [], [], '', false); $data = [ 'template_subject' => 'Email Subject', 'template_text' => $bodyText, 'template_styles' => 'Styles', 'template_type' => $templateType, + 'template_filter' => $filter, ]; $vars = ['reason' => 'Reason', 'customer' => 'Customer']; $options = ['area' => 'frontend', 'store' => 1]; @@ -52,8 +54,14 @@ class TransportBuilderTest extends \Magento\Framework\Mail\Test\Unit\Template\Tr $this->returnSelf() ); $template->expects($this->once())->method('getSubject')->will($this->returnValue('Email Subject')); - $template->expects($this->once())->method('getProcessedTemplate')->will($this->returnValue($bodyText)); $template->expects($this->once())->method('setData')->with($this->equalTo($data))->will($this->returnSelf()); + $template->expects($this->once()) + ->method('getProcessedTemplate') + ->with($vars) + ->will($this->returnValue($bodyText)); + $template->expects($this->once()) + ->method('setTemplateFilter') + ->with($filter); $this->templateFactoryMock->expects( $this->once() diff --git a/app/code/Magento/Newsletter/Test/Unit/Model/Template/FilterTest.php b/app/code/Magento/Newsletter/Test/Unit/Model/Template/FilterTest.php new file mode 100644 index 0000000000000000000000000000000000000000..c099b048f07ad7c42d6c31e8fc7b50c4db65c864 --- /dev/null +++ b/app/code/Magento/Newsletter/Test/Unit/Model/Template/FilterTest.php @@ -0,0 +1,128 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Newsletter\Test\Unit\Model\Template; + +class FilterTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Newsletter\Model\Template\Filter + */ + protected $filter; + + /** + * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $storeManager; + + /** + * @var \Magento\Framework\App\State|\PHPUnit_Framework_MockObject_MockObject + */ + protected $appState; + + public function setUp() + { + $scopeConfig = $this->getMockForAbstractClass( + '\Magento\Framework\App\Config\ScopeConfigInterface', + [], + '', + false + ); + $this->storeManager = $this->getMockForAbstractClass( + '\Magento\Store\Model\StoreManagerInterface', + [], + '', + false + ); + $logger = $this->getMockForAbstractClass('\Psr\Log\LoggerInterface', [], '', false); + $layout = $this->getMockForAbstractClass('\Magento\Framework\View\LayoutInterface', [], '', false); + $urlModel = $this->getMockForAbstractClass('\Magento\Framework\UrlInterface', [], '', false); + $string = $this->getMock('\Magento\Framework\Stdlib\StringUtils', [], [], '', false); + $escaper = $this->getMock('\Magento\Framework\Escaper', [], [], '', false); + $assetRepo = $this->getMock('\Magento\Framework\View\Asset\Repository', [], [], '', false); + $coreVariableFactory = $this->getMock('\Magento\Variable\Model\VariableFactory', ['create'], [], '', false); + $layoutFactory = $this->getMock('\Magento\Framework\View\LayoutFactory', ['create'], [], '', false); + $this->appState = $this->getMock('\Magento\Framework\App\State', [], [], '', false); + $emogrifier = $this->getMock('\Pelago\Emogrifier', [], [], '', false); + $configVariables = $this->getMock('\Magento\Email\Model\Source\Variables', [], [], '', false); + $widgetResource = $this->getMock('\Magento\Widget\Model\ResourceModel\Widget', [], [], '', false); + $widget = $this->getMock('\Magento\Widget\Model\Widget', [], [], '', false); + + $this->filter = new \Magento\Newsletter\Model\Template\Filter( + $string, + $logger, + $escaper, + $assetRepo, + $scopeConfig, + $coreVariableFactory, + $this->storeManager, + $layout, + $layoutFactory, + $this->appState, + $urlModel, + $emogrifier, + $configVariables, + $widgetResource, + $widget + ); + + } + + public function testWidgetDirective() + { + $subscriber = $this->getMock('\Magento\Newsletter\Model\Subscriber', [], [], '', false); + $this->filter->setVariables(['subscriber' => $subscriber]); + + $construction = '{{widget type="\Magento\Cms\Block\Widget\Page\Link" page_id="1"}}'; + + $store = $this->getMockForAbstractClass('Magento\Store\Api\Data\StoreInterface', [], '', false); + $store->expects($this->once()) + ->method('getId') + ->willReturn(1); + $this->storeManager->expects($this->once()) + ->method('getStore') + ->willReturn($store); + $this->appState->expects($this->once()) + ->method('emulateAreaCode') + ->with( + 'frontend', + [$this->filter, 'generateWidget'], + [ + [ + 1 => $construction, + 2 => 'type="\Magento\Cms\Block\Widget\Page\Link" page_id="1" store_id ="1"' + ] + ] + ) + ->willReturn( + '<div class="widget block block-cms-link-inline"> + <a href="http://magento.test/"> + <span>Home page</span> + </a> + </div>' + ); + + $this->filter->widgetDirective([ + 1 => $construction, + 2 => 'type="\Magento\Cms\Block\Widget\Page\Link" page_id="1"' + ]); + } + + public function testWidgetDirectiveWithoutRequiredVariable() + { + $construction = '{{widget type="\Magento\Cms\Block\Widget\Page\Link" page_id="1"}}'; + + $this->storeManager->expects($this->never()) + ->method('getStore'); + $result = $this->filter->widgetDirective( + [ + 0 => $construction, + 1 => 'type="\Magento\Cms\Block\Widget\Page\Link" page_id="1"' + ] + ); + + $this->assertEquals($construction, $result); + } +}