CORREÇÃO DE TODAS AS DATAS NO MAGENTO 2.1.9
1) Instale o modulo a seguir
2) O modulo deve ser adptado, vá em:
app/code/Divante/LocaleDateTime/Framework/StdLib/DateTime/DateTime/Filter/DateTime.php
3) Adicione a seguinte função para conversão:
public function conversorDeDataBrasileiroParaAmericano($dataBrasileira){ if(isset($dataBrasileira)) { $arrData = explode("/", $dataBrasileira); $dataFormatoAmericano = $arrData[1] . "/" . $arrData[0] . "/" . $arrData[2]; } return $dataFormatoAmericano; }
4) Adicione a chamada da função do try da função filter:
$value = $this->conversorDeDataBrasileiroParaAmericano($value);
Aqui está como deve ficar:
public function filter($value) { try { $value = $this->conversorDeDataBrasileiroParaAmericano($value); $value = new \DateTime($value); return $value->format('Y-m-d'); } catch (\Exception $e) { throw new \Exception("Invalid input date format '$value'"); } }
Na função getDateFormat no segundo comando if troque o comando !isset por empty, a função deverá ficar da seguinte forma:
public function getDateFormat($locale) { $formatter = new \IntlDateFormatter($locale, \IntlDateFormatter::SHORT, \IntlDateFormatter::NONE); if (null === $formatter) { throw new \Exception(intl_get_error_message()); } if (empty(self::DATE_FORMAT_MAPPER[$formatter->getPattern()])) { throw new \Exception( sprintf( 'Could not find correct date format fot selected pattern %s', $formatter->getPattern() ) ); } return self::DATE_FORMAT_MAPPER[$formatter->getPattern()]; }
5) Ali acima todo o modulo de produtos foi corrigido, contudo vamos corrigir o modulo Report, portanto vá até:
vendor/magento/framework/stdlib/datetime/filter/Date.php
E insira a função conversorDeDataBrasileiroParaAmericano do tópico 3.
Dentro do try da função Filter adicione novamente a chamada da função, deverá ficar exatamente como a função filter acima.
Na mesma pasta existe também o arquivo DateTime.php, faça o mesmo procedimento feito acima.
ATÉ AQUI OS MÓDULOS DE CATALOG E REPORT ESTÃO CORRIGIDOS
6) Correção do modulo Marketing
Para corrigir este modulo primeiro temos que alterar a validação do javascript, assim, vá em:
vendor/magento/module-ui/view/base/web/js/lib/validation/rules.js
Altere a função validate-date para:
"validate-date": [ function(value) { console.log("O valor antes eh: " + value); var arrDataIncorreta = value.split("/"); var dataFormatoBrasileiroParaAmericano = arrDataIncorreta[1]+"/"+arrDataIncorreta[0]+"/"+arrDataIncorreta[2]; value = dataFormatoBrasileiroParaAmericano; var test = new Date(value); console.log("O valor depois eh: " + value); return utils.isEmptyNoTrim(value) || !isNaN(test); },$.mage.__('Please enter a valid date. 9') ],
Agora, vamos corrigir o back-end.
7) Para corrigir o back end vá em:
vendor/magento/module-rule/model/AbstractModel.php
8) Adicione novamente a função de conversorDeDataBrasileiroParaAmericano para conversão.
9) Dentro da função validateData nessa mesma classe, adicione o conversor dentro do primeiro if como demonstrado:
... .... public function validateData(\Magento\Framework\DataObject $dataObject) { $result = []; $fromDate = $toDate = null; if ($dataObject->hasFromDate() && $dataObject->hasToDate()) { $fromDate = $dataObject->getFromDate(); $toDate = $dataObject->getToDate(); $fromDate = $this->conversorDeDataBrasileiroParaAmericano($fromDate); $toDate = $this->conversorDeDataBrasileiroParaAmericano($toDate); } if ($fromDate && $toDate) { .... .... ....
10) Adicione também na linha 339 a chamada da função como segue o código de demonstração:
......... } foreach ($data as $k => $v) { $node[$k] = $v; } } } else { /** * Convert dates into \DateTime */ if (in_array($key, ['from_date', 'to_date']) && $value) { $value = $this->conversorDeDataBrasileiroParaAmericano($value); $value = new \DateTime($value); } $this->setData($key, $value); } ...............