CORREÇÃO DE TODAS AS DATAS NO MAGENTO 2.1.9

De Tek-System Wiki
Ir para navegação Ir para pesquisar

1) Instale o modulo a seguir

https://github.com/mmularski/magento2-locale-date-time

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);
            }
            
            ...............