I need to specify a prefix static string for all URLs of my Products and Categories. Just like Wordpress Woocommerce permalinks. For example all of Categories should have product-category prefix in their URL: Cat One: domain.com/product-category/cat-one Cat Two (child of 'Cat One'): domain.com/product-category/cat-one/cat-two and all of Products should have product URL prefix, no matter what their Category is: Product One: domain.com/product/product-one Product Two: domain.com/product/product-two I tried to do this solution, but It's for 3 years ago and not working in Magento 2. Also this extension is for Magento 1.x as you see. By the way, I'm using Magento 2.1.9 with PHP 7.0.22 and XAMPP 3.2.2. Thanks.
... View more
See more ideas labeled with:
Create 3 Terms and Conditions for checkout process. By default Magento is listing the terms one after other based on their ID's. As it is now the only way to re-position the terms is editing the database. Please allow this modification in Backend.
... View more
See more ideas labeled with:
When we do a bulk update for product/categories, partial indexers start the data indexing process in the background (when using the index on schedule mode). We need to wait for those indexing process to complete to see the product/category updates on the front-end. For an admin user, there is no way to check the state of the indexing process, ex: % completed, error encountered etc. This is a suggestion to include an admin area to visualize the state of the partial indexing processes, so admin users don't need to contact devs to check the state of the indexers by querying DB.
... View more
See more ideas labeled with:
Given we have to jump through so many hoops regarding caching systems such as Varnish etc to get any kind of decent performance, the least a default installation could do would be to make it automatically optimise with mod_pagespeed. Magento installations are the only sites I run where I have to turn it off completely. The problem seems to be knockout.js. Can only imagine how fast a site with both caching and optimised html would be. More info: https://groups.google.com/forum/#!topic/mod-pagespeed-discuss/FtdyLTVPRLc
... View more
See more ideas labeled with:
Similar to #9582 - we should eliminate the complicated necessary inheritance for creating Imports and Exports that plug-in to DataFlow
... View more
Feature request from amenk, posted on GitHub Oct 18, 2015
I can't activate the PickUp method in the backend.
I think it is missing in
https://github.com/magento/magento2/blob/develop/app/code/Magento/OfflineShipping/etc/adminhtml/system.xml
... View more
Feature request from brobie, posted on GitHub Apr 01, 2017
From the Magento Hackathon 2017 (https://github.com/magento-hackathon/Imagine2017/issues/23):
As a customer I should be able to create complex filters using the layered navigation so that I can find what I'm looking for quicker.
Note:
example use case a customer sets category = "shoe', sets color to be both 'brown' and 'black'; results should be filtered as if category = shoe and color in ('brown','black).
AC:
Update behavior of selections within a filterset to be the same as an 'or' of those filterset selections
Update behavior when items are selected among multiple filtersets so that filter sets are 'and' ed together
... View more
Feature request from Igloczek, posted on GitHub Apr 01, 2017
Running ESLint against M2 codebase reports lots of errors:
lib dir - 82090 problems
vendor dir - 37266 problems
pub/static/frontend/Magento/blank - 96870 problems
This linter is not used on CI. Unfortunately current grunt implementation doesn't work too, so for now I'll stick with ESLint CLI command.
... View more
Feature request from ldusan84, posted on GitHub Jul 12, 2017
When creating a custom grid using UI components, the "Store" column can be created like this:
<column name="store_id" class="Magento\Store\Ui\Component\Listing\Column\Store">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>
<item name="sortable" xsi:type="boolean">false</item>
<item name="label" xsi:type="string" translate="true">Store View</item>
</item>
</argument>
</column>
Where the class attribute value is the column renderer.
The Magento\Store\Ui\Component\Listing\Column\Store column renderer works correctly for the cases where the entity can belong to multiple store views such cms block, cms page, etc.
If you want your entity to belong to only one store view you need to use Magento\Search\Ui\Component\Listing\Column\StoreView as Magento\Store\Ui\Component\Listing\Column\Store doesn't work correctly in that case (shows blank for all store views).
I think that Magento\Search\Ui\Component\Listing\Column\StoreView belongs to the Store module instead of Search module.
There shouldn't be a need to have an additional dependency to Search module just to get the store view column renderer.
The naming can also be improved, maybe Magento\Store\Ui\Component\Listing\Column\MultipleStoreView and Magento\Store\Ui\Component\Listing\Column\SingleStoreView
Hope it makes sense.
... View more
Feature request from thatguynz, posted on GitHub Aug 01, 2017
Preconditions
Magento 2.1.7
Steps to reproduce
Create a number of simple products - each with decimals enabled
Create a new bundled product and add the simple products to it as Bundled Items
Try to set default quantity of Bundled Items to a decimal value
Expected result
Default quantity of bundled item should enter fine as a decimal (as it used to in Magento 1.9) and allow Product Bundle to be saved
Actual result
Error message is displayed directly below default quantity box (attached) "Please enter a valid number in this field." and product bundle can not be saved.
... View more
Status:
Investigating
Submitted on
08-22-2017
08:29 AM
Submitted by
apiuser
on
08-22-2017
08:29 AM
Feature request from astorm, posted on GitHub Nov 17, 2016
Preconditions
Install a Magento 2.1.x system.
PHP/MySQL version irrelevant
Steps to reproduce
Run the following javascript code on Magento's home page via any means you like
`requirejs(['Magento_Checkout/js/model/url-builder'],function(){});
Expected result
Code runs without errors
Actual result
Code produces url-builder.js:12 Uncaught TypeError: Cannot read property 'storeCode' of undefined(…) error
This is one specific example of a more widespread problem. Many of Magento 2's RequireJS modules have a dependency on a global window.checkoutConfig object. This renders these modules unusable anywhere other than the Magento checkout pages.
If Magento's hewing closely to the the implicit guidelines they've set for themselves and their third party partners and independent open source developers working with the platform, this checkout configuration should be passed in to the RequireJS programs via an x-magento-init script.
You can see a list of these global dependencies with the following unix command line (replace vendor/magento with wherever your components are)
$ find vendor/magento/ -name '*.js' | xargs grep 'window\.checkoutConfig'
vendor/magento//module-braintree/view/frontend/web/js/view/payment/adapter.js: return window.checkoutConfig.payment[this.getCode()].clientToken;
vendor/magento//module-braintree/view/frontend/web/js/view/payment/braintree.js: var config = window.checkoutConfig.payment,
vendor/magento//module-braintree/view/frontend/web/js/view/payment/method-renderer/cc-form.js: validator.setConfig(window.checkoutConfig.payment[this.getCode()]);
vendor/magento//module-braintree/view/frontend/web/js/view/payment/method-renderer/cc-form.js: return window.checkoutConfig.payment[this.getCode()].hasFraudProtection;
vendor/magento//module-braintree/view/frontend/web/js/view/payment/method-renderer/cc-form.js: return window.checkoutConfig.payment[this.getCode()].environment;
vendor/magento//module-braintree/view/frontend/web/js/view/payment/method-renderer/cc-form.js: return window.checkoutConfig.payment[this.getCode()].kountMerchantId;
vendor/magento//module-braintree/view/frontend/web/js/view/payment/method-renderer/hosted-fields.js: return window.checkoutConfig.payment[this.getCode()].ccVaultCode;
vendor/magento//module-braintree/view/frontend/web/js/view/payment/method-renderer/paypal.js: return window.checkoutConfig.payment[this.getCode()].title;
vendor/magento//module-braintree/view/frontend/web/js/view/payment/method-renderer/paypal.js: return window.checkoutConfig.payment[this.getCode()].locale;
vendor/magento//module-braintree/view/frontend/web/js/view/payment/method-renderer/paypal.js: return window.checkoutConfig.payment[this.getCode()].isAllowShippingAddressOverride;
vendor/magento//module-braintree/view/frontend/web/js/view/payment/method-renderer/paypal.js: return window.checkoutConfig.payment[this.getCode()].merchantName;
vendor/magento//module-braintree/view/frontend/web/js/view/payment/method-renderer/paypal.js: return window.checkoutConfig.payment[this.getCode()].paymentAcceptanceMarkSrc;
vendor/magento//module-braintree/view/frontend/web/js/view/payment/validator-handler.js: return window.checkoutConfig.payment;
vendor/magento//module-checkout/view/frontend/web/js/action/redirect-on-success.js: redirectUrl: window.checkoutConfig.defaultSuccessPageUrl,
vendor/magento//module-checkout/view/frontend/web/js/model/checkout-data-resolver.js: if (!availableRate && window.checkoutConfig.selectedShippingMethod) {
vendor/magento//module-checkout/view/frontend/web/js/model/checkout-data-resolver.js: selectShippingMethodAction(window.checkoutConfig.selectedShippingMethod);
vendor/magento//module-checkout/view/frontend/web/js/model/new-customer-address.js: countryId: (addressData.country_id) ? addressData.country_id : window.checkoutConfig.defaultCountryId,
vendor/magento//module-checkout/view/frontend/web/js/model/new-customer-address.js: : window.checkoutConfig.defaultRegionId,
vendor/magento//module-checkout/view/frontend/web/js/model/new-customer-address.js: postcode: addressData.postcode ? addressData.postcode : window.checkoutConfig.defaultPostcode,
vendor/magento//module-checkout/view/frontend/web/js/model/postcode-validator.js: var patterns = window.checkoutConfig.postCodes[countryId];
vendor/magento//module-checkout/view/frontend/web/js/model/quote.js: var quoteData = window.checkoutConfig.quoteData;
vendor/magento//module-checkout/view/frontend/web/js/model/quote.js: var basePriceFormat = window.checkoutConfig.basePriceFormat;
vendor/magento//module-checkout/view/frontend/web/js/model/quote.js: var priceFormat = window.checkoutConfig.priceFormat;
vendor/magento//module-checkout/view/frontend/web/js/model/quote.js: var storeCode = window.checkoutConfig.storeCode;
vendor/magento//module-checkout/view/frontend/web/js/model/quote.js: var totalsData = window.checkoutConfig.totalsData;
vendor/magento//module-checkout/view/frontend/web/js/model/quote.js: return window.checkoutConfig.quoteItemData;
vendor/magento//module-checkout/view/frontend/web/js/model/shipping-rates-validation-rules.js: checkoutConfig = window.checkoutConfig;
vendor/magento//module-checkout/view/frontend/web/js/model/shipping-rates-validator.js: var checkoutConfig = window.checkoutConfig,
vendor/magento//module-checkout/view/frontend/web/js/model/step-navigator.js: window.location.href = window.checkoutConfig.pageNotFoundUrl;
vendor/magento//module-checkout/view/frontend/web/js/model/step-navigator.js: window.location = window.checkoutConfig.checkoutUrl + "#" + code;
vendor/magento//module-checkout/view/frontend/web/js/model/step-navigator.js: window.location = window.checkoutConfig.checkoutUrl + "#" + code;
vendor/magento//module-checkout/view/frontend/web/js/model/url-builder.js: storeCode: window.checkoutConfig.storeCode,
vendor/magento//module-checkout/view/frontend/web/js/view/authentication.js: var checkoutConfig = window.checkoutConfig;
vendor/magento//module-checkout/view/frontend/web/js/view/billing-address.js: if (window.checkoutConfig.reloadOnBillingAddress) {
vendor/magento//module-checkout/view/frontend/web/js/view/billing-address.js: if (window.checkoutConfig.reloadOnBillingAddress) {
vendor/magento//module-checkout/view/frontend/web/js/view/billing-address.js: if (window.checkoutConfig.reloadOnBillingAddress) {
vendor/magento//module-checkout/view/frontend/web/js/view/form/element/email.js: forgotPasswordUrl: window.checkoutConfig.forgotPasswordUrl,
vendor/magento//module-checkout/view/frontend/web/js/view/payment.js: paymentService.setPaymentMethods(methodConverter(window.checkoutConfig.paymentMethods));
vendor/magento//module-checkout/view/frontend/web/js/view/payment.js: return window.checkoutConfig.formKey;
vendor/magento//module-checkout/view/frontend/web/js/view/summary/item/details/thumbnail.js: var imageData = window.checkoutConfig.imageData;
vendor/magento//module-checkout-agreements/view/frontend/web/js/model/agreement-validator.js: var checkoutConfig = window.checkoutConfig,
vendor/magento//module-checkout-agreements/view/frontend/web/js/model/agreements-assigner.js: var agreementsConfig = window.checkoutConfig.checkoutAgreements;
vendor/magento//module-checkout-agreements/view/frontend/web/js/view/checkout-agreements.js: var checkoutConfig = window.checkoutConfig,
vendor/magento//module-offline-payments/view/frontend/web/js/view/payment/method-renderer/banktransfer-method.js: return window.checkoutConfig.payment.instructions[this.item.method];
vendor/magento//module-offline-payments/view/frontend/web/js/view/payment/method-renderer/cashondelivery-method.js: return window.checkoutConfig.payment.instructions[this.item.method];
vendor/magento//module-offline-payments/view/frontend/web/js/view/payment/method-renderer/checkmo-method.js: return window.checkoutConfig.payment.checkmo.mailingAddress;
vendor/magento//module-offline-payments/view/frontend/web/js/view/payment/method-renderer/checkmo-method.js: return window.checkoutConfig.payment.checkmo.payableTo;
vendor/magento//module-payment/view/frontend/web/js/view/payment/cc-form.js: return window.checkoutConfig.payment.ccform.availableTypes[this.getCode()];
vendor/magento//module-payment/view/frontend/web/js/view/payment/cc-form.js: return window.checkoutConfig.payment.ccform.icons.hasOwnProperty(type) ?
vendor/magento//module-payment/view/frontend/web/js/view/payment/cc-form.js: window.checkoutConfig.payment.ccform.icons[type]
vendor/magento//module-payment/view/frontend/web/js/view/payment/cc-form.js: return window.checkoutConfig.payment.ccform.months[this.getCode()];
vendor/magento//module-payment/view/frontend/web/js/view/payment/cc-form.js: return window.checkoutConfig.payment.ccform.years[this.getCode()];
vendor/magento//module-payment/view/frontend/web/js/view/payment/cc-form.js: return window.checkoutConfig.payment.ccform.hasVerification[this.getCode()];
vendor/magento//module-payment/view/frontend/web/js/view/payment/cc-form.js: return window.checkoutConfig.payment.ccform.hasSsCardType[this.getCode()];
vendor/magento//module-payment/view/frontend/web/js/view/payment/cc-form.js: return window.checkoutConfig.payment.ccform.cvvImageUrl[this.getCode()];
vendor/magento//module-payment/view/frontend/web/js/view/payment/cc-form.js: return window.checkoutConfig.payment.ccform.ssStartYears[this.getCode()];
vendor/magento//module-payment/view/frontend/web/js/view/payment/iframe.js: return window.checkoutConfig.payment.iframe.source[this.getCode()];
vendor/magento//module-payment/view/frontend/web/js/view/payment/iframe.js: return window.checkoutConfig.payment.iframe.controllerName[this.getCode()];
vendor/magento//module-payment/view/frontend/web/js/view/payment/iframe.js: return window.checkoutConfig.payment.iframe.placeOrderUrl[this.getCode()];
vendor/magento//module-payment/view/frontend/web/js/view/payment/iframe.js: return window.checkoutConfig.payment.iframe.cgiUrl[this.getCode()];
vendor/magento//module-payment/view/frontend/web/js/view/payment/iframe.js: return window.checkoutConfig.payment.iframe.saveOrderUrl[this.getCode()];
vendor/magento//module-payment/view/frontend/web/js/view/payment/iframe.js: return window.checkoutConfig.payment.iframe.dateDelim[this.getCode()];
vendor/magento//module-payment/view/frontend/web/js/view/payment/iframe.js: return window.checkoutConfig.payment.iframe.cardFieldsMap[this.getCode()];
vendor/magento//module-payment/view/frontend/web/js/view/payment/iframe.js: return window.checkoutConfig.payment.iframe.expireYearLength[this.getCode()];
vendor/magento//module-payment/view/frontend/web/js/view/payment/iframe.js: return window.checkoutConfig.payment.iframe.timeoutTime[this.getCode()];
vendor/magento//module-paypal/view/frontend/web/js/view/payment/method-renderer/iframe-methods.js: return this.isInAction() ? window.checkoutConfig.payment.paypalIframe.actionUrl[this.getCode()] : '';
vendor/magento//module-paypal/view/frontend/web/js/view/payment/method-renderer/paypal-billing-agreement.js: return window.checkoutConfig.payment.paypalBillingAgreement.transportName;
vendor/magento//module-paypal/view/frontend/web/js/view/payment/method-renderer/paypal-billing-agreement.js: return window.checkoutConfig.payment.paypalBillingAgreement.agreements;
vendor/magento//module-paypal/view/frontend/web/js/view/payment/method-renderer/paypal-express-abstract.js: return window.checkoutConfig.payment.paypalExpress.paymentAcceptanceMarkHref;
vendor/magento//module-paypal/view/frontend/web/js/view/payment/method-renderer/paypal-express-abstract.js: return window.checkoutConfig.payment.paypalExpress.paymentAcceptanceMarkSrc;
vendor/magento//module-paypal/view/frontend/web/js/view/payment/method-renderer/paypal-express-abstract.js: return window.checkoutConfig.payment.paypalExpress.billingAgreementCode[this.item.method];
vendor/magento//module-paypal/view/frontend/web/js/view/payment/method-renderer/paypal-express-abstract.js: window.checkoutConfig.payment.paypalExpress.redirectUrl[quote.paymentMethod().method]
vendor/magento//module-paypal/view/frontend/web/js/view/payment/paypal-payments.js: var isContextCheckout = window.checkoutConfig.payment.paypalExpress.isContextCheckout,
vendor/magento//module-paypal/view/frontend/web/js/view/payment/paypal-payments.js: config: window.checkoutConfig.payment.paypalExpress.inContextConfig
vendor/magento//module-paypal/view/frontend/web/js/view/review/actions/iframe.js: return this.isInAction() ? window.checkoutConfig.payment.paypalIframe.actionUrl[this.getCode()] : '';
vendor/magento//module-persistent/view/frontend/web/js/view/remember-me.js: var persistenceConfig = window.checkoutConfig.persistenceConfig;
vendor/magento//module-shipping/view/frontend/web/js/model/config.js: return window.checkoutConfig.shippingPolicy
vendor/magento//module-tax/view/frontend/web/js/view/checkout/cart/totals/tax.js: var isFullTaxSummaryDisplayed = window.checkoutConfig.isFullTaxSummaryDisplayed,
vendor/magento//module-tax/view/frontend/web/js/view/checkout/cart/totals/tax.js: isZeroTaxDisplayed = window.checkoutConfig.isZeroTaxDisplayed;
vendor/magento//module-tax/view/frontend/web/js/view/checkout/shipping_method/price.js: isDisplayShippingPriceExclTax: window.checkoutConfig.isDisplayShippingPriceExclTax,
vendor/magento//module-tax/view/frontend/web/js/view/checkout/shipping_method/price.js: isDisplayShippingBothPrices: window.checkoutConfig.isDisplayShippingBothPrices,
vendor/magento//module-tax/view/frontend/web/js/view/checkout/summary/grand-total.js: isFullTaxSummaryDisplayed: window.checkoutConfig.isFullTaxSummaryDisplayed || false,
vendor/magento//module-tax/view/frontend/web/js/view/checkout/summary/grand-total.js: isTaxDisplayedInGrandTotal: window.checkoutConfig.includeTaxInGrandTotal || false,
vendor/magento//module-tax/view/frontend/web/js/view/checkout/summary/item/details/subtotal.js: var displayPriceMode = window.checkoutConfig.reviewItemPriceDisplayMode || 'including';
vendor/magento//module-tax/view/frontend/web/js/view/checkout/summary/shipping.js: var displayMode = window.checkoutConfig.reviewShippingDisplayMode;
vendor/magento//module-tax/view/frontend/web/js/view/checkout/summary/subtotal.js: var displaySubtotalMode = window.checkoutConfig.reviewTotalsDisplayMode;
vendor/magento//module-tax/view/frontend/web/js/view/checkout/summary/tax.js: var isTaxDisplayedInGrandTotal = window.checkoutConfig.includeTaxInGrandTotal;
vendor/magento//module-tax/view/frontend/web/js/view/checkout/summary/tax.js: var isFullTaxSummaryDisplayed = window.checkoutConfig.isFullTaxSummaryDisplayed;
vendor/magento//module-tax/view/frontend/web/js/view/checkout/summary/tax.js: var isZeroTaxDisplayed = window.checkoutConfig.isZeroTaxDisplayed;
vendor/magento//module-usps/view/frontend/web/js/model/shipping-rates-validator.js: var checkoutConfig = window.checkoutConfig;
vendor/magento//module-vault/view/frontend/web/js/view/payment/method-renderer/vault.js: return window.checkoutConfig.payment.ccform.icons.hasOwnProperty(type) ?
vendor/magento//module-vault/view/frontend/web/js/view/payment/method-renderer/vault.js: window.checkoutConfig.payment.ccform.icons[type]
vendor/magento//module-vault/view/frontend/web/js/view/payment/vault-enabler.js: return typeof window.checkoutConfig.vault[this.paymentCode] !== 'undefined' &&
vendor/magento//module-vault/view/frontend/web/js/view/payment/vault-enabler.js: window.checkoutConfig.vault[this.paymentCode]['is_enabled'] === true;
vendor/magento//module-vault/view/frontend/web/js/view/payment/vault.js: _.each(window.checkoutConfig.payment.vault, function (config, index) {
vendor/magento//module-weee/view/frontend/web/js/view/checkout/summary/item/price/row_excl_tax.js: if (!window.checkoutConfig.getIncludeWeeeFlag) {
vendor/magento//module-weee/view/frontend/web/js/view/checkout/summary/item/price/row_excl_tax.js: if (window.checkoutConfig.getIncludeWeeeFlag) {
vendor/magento//module-weee/view/frontend/web/js/view/checkout/summary/item/price/row_incl_tax.js: if (!window.checkoutConfig.getIncludeWeeeFlag) {
vendor/magento//module-weee/view/frontend/web/js/view/checkout/summary/item/price/row_incl_tax.js: if (window.checkoutConfig.getIncludeWeeeFlag) {
vendor/magento//module-weee/view/frontend/web/js/view/checkout/summary/item/price/weee.js: return window.checkoutConfig.isDisplayPriceWithWeeeDetails;
vendor/magento//module-weee/view/frontend/web/js/view/checkout/summary/item/price/weee.js: return window.checkoutConfig.isDisplayFinalPrice;
vendor/magento//module-weee/view/frontend/web/js/view/checkout/summary/weee.js: isIncludedInSubtotal: window.checkoutConfig.isIncludedInSubtotal,
... View more
Feature request from gputignano, posted on GitHub Aug 14, 2017
Tested on a blank installation of Magento 2.2 RC1.8.
When I create a new configurable product SKU field is mandatory but I think it is mandatory only for simple products.
... View more
Feature request from mynameismud, posted on GitHub Jun 20, 2017
Preconditions
v2.1.3
You need a standard Paypal account
You need a Payflow Pro account also
NOTE: It appears that ANY two Paypal types of accounts would suffice for this test. This is a general issue with validation in Ipn.php, not an issue specific to these two methods.
Steps to reproduce
Enable Paypal Express Checkout and process a payment using it
Disable Paypal Express Checkout
Enable Payflow Pro and process a payment using it
Create a credit memo for the Paypal Express Checkout payment via Magento Admin or log into paypal.com and process a refund directly there
Expected result
Paypal should send the IPN and it should pass validation then trigger appropriate business logic.
Actual result
In Ipn.php, line 110, the validation logic checks to see if the payment method is both active AND available. It seems that this should ONLY check isMethodAvailable. In cases where the merchant swaps out payment methods (in our case we changed from Paypal to Payflow Pro), the merchant still needs to be able to process reference transactions against older payments originated with the now-inactive method.
It might be preferable to make the validation more specific and only perform this check against AUTH and SALE transactions. Then refunds, etc would be excluded from the check.
Example from exceptions.log:
[2017-06-15 23:26:36] main.CRITICAL: Exception: Method "paypal_express" is not available. in /var/www/.../vendor/magento/module-paypal/Model/Ipn.php:124
... View more
One of the biggest complaints we get from customers is the generic error message "An error occurred on the server. Please try again", that displays in the checkout when their credit card cannot be accepted. Usually there's an issue where the billing and shipping address or zip code doesn't match, so the card is not accepted. The problem is the error message states there is "an error on the server" which leads them to believe there is something wrong with the website-when that is not the case, there is something wrong with what they've inputted. Another type of generic message like "We could not place this order, please call (store's phone number) to complete" would work infinitely better. Even better, would be a way to customize your own error message in the checkout right in the admin panel. Overall I think this simple change would help the customer understand that the order could not be processed, but there isn't a problem with the website or server.
... View more
See more ideas labeled with:
Google Adwords add ability to provide transaction-specific conversion values in your conversion tracking tag . See https://github.com/magento/magento2/issues/6708
... View more
See more ideas labeled with:
It would be very helpful if customers had the ability to write order comments when they go through the checkout process on the front end.
... View more
See more ideas labeled with:
Our website like many, many others charges customer credit cards when they order therefore automatically creating an Invoice. Our customers can change their order before shipment so we need ability to edit the Invoice in exactly the same way as editing an Order. To take this one step farther, it would also be nice if the original Total Price could be tracked so that when the Invoice is edited, the delta charge/refund amount is shown and can be charged or refunded to the credit card.
... View more
See more ideas labeled with:
Bumped into this one yesterday. At our company we like to use semantic correct names for our attribute codes. With middle- to larger sized shops these names tend te be somewhat longer. Attribute codes in Magento 2 are not allowed to be longer than 30 characters. Can anyone explain to me what's the reason behind this? Is there a technical one? Or is it just that someone thought at some time "30 characters ought to be enough for anyone"? I'd really like to know.
... View more
I think we can divide Repository interfaces into multiple interfaces.so Extension providers don't need to provide implementation for all methods in interfaces. interface CustomerRepositorySaveInterface
{
/**
* Create or update a customer.
*
* @param \Magento\Customer\Api\Data\CustomerInterface $customer
* @param string $passwordHash
* @return \Magento\Customer\Api\Data\CustomerInterface
* @throws \Magento\Framework\Exception\InputException If bad input is provided
* @throws \Magento\Framework\Exception\State\InputMismatchException If the provided email is already used
* @throws \Magento\Framework\Exception\LocalizedException
*/
public function save(\Magento\Customer\Api\Data\CustomerInterface $customer, $passwordHash = null);
}
interface CustomerRepositoryGetInterface
{
/**
* Retrieve customer.
*
* @param string $email
* @param int|null $websiteId
* @return \Magento\Customer\Api\Data\CustomerInterface
* @throws \Magento\Framework\Exception\NoSuchEntityException If customer with the specified email does not exist.
* @throws \Magento\Framework\Exception\LocalizedException
*/
public function get($email, $websiteId = null);
/**
* Get customer by customer ID.
*
* @param int $customerId
* @return \Magento\Customer\Api\Data\CustomerInterface
* @throws \Magento\Framework\Exception\NoSuchEntityException If customer with the specified ID does not exist.
* @throws \Magento\Framework\Exception\LocalizedException
*/
public function getById($customerId);
/**
* Retrieve customers which match a specified criteria.
*
* This call returns an array of objects, but detailed information about each object’s attributes might not be
* included. See http://devdocs.magento.com/codelinks/attributes.html#CustomerRepositoryInterface to determine
* which call to use to get detailed information about all attributes for an object.
*
* @param \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria
* @return \Magento\Customer\Api\Data\CustomerSearchResultsInterface
* @throws \Magento\Framework\Exception\LocalizedException
*/
public function getList(\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria);
}
interface CustomerRepositoryDeleteInterface
{
/**
* Delete customer.
*
* @param \Magento\Customer\Api\Data\CustomerInterface $customer
* @return bool true on success
* @throws \Magento\Framework\Exception\LocalizedException
*/
public function delete(\Magento\Customer\Api\Data\CustomerInterface $customer);
/**
* Delete customer by ID.
*
* @param int $customerId
* @return bool true on success
* @throws \Magento\Framework\Exception\NoSuchEntityException
* @throws \Magento\Framework\Exception\LocalizedException
*/
public function deleteById($customerId);
}
class CustomerRepository implements \Magento\Customer\Api\CustomerRepositorySaveInterface,\Magento\Customer\Api\CustomerRepositoryGetInterface,\Magento\Customer\Api\CustomerRepositoryDeleteInterface
{
}
... View more
See more ideas labeled with: