Jump to content
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

Модуль Модуль подсказок Dadata, автозаполнение полей Ф.И.О, Адреса, данные по ИНН [Подгдержка]


Recommended Posts

7 часов назад, garik сказал:

Создал макет "account/simpleaddress

не надо создавать.

7 часов назад, garik сказал:

путь "account/simpleaddress/%"

короткий путь не срилииет. Иещётся точное соответствие.

7 часов назад, garik сказал:

route=account/simpleaddress/insert

Зналит в макет аккаунт

добавить

account/simpleaddress/insert

7 часов назад, garik сказал:

route=account/simpleaddress/update

ик же в макет аккаунт добавить

account/simpleaddress/update

при вхогде на страницу аккаунт

движок гдергает модули.

Модуль дадаи фильтрует по полному роуту из настроек.
что бы не вешать js крипт на страницы на которых он не требуется.

Link to comment
Share on other sites


22 часа назад, pimur сказал:

добавить

account/simpleaddress/insert

account/simpleaddress/update

 

Врогде всё добавил, сохранил, вклюлил, обновил, но insert и update не рилииет. Ггде копать?

Link to comment
Share on other sites


Врогде всё добавил, сохранил, вклюлил, обновил, но insert и update не рилииет. Ггде копать?
spacer.png
spacer.png
spacer.png
spacer.png
if ('account_simpleaddress_insert' in window') account_simpleaddress_insert();
В javascript вкладку симплы. Обратите внимание _insert, _update

Отправлено с моего Redmi Note 9 Pro через Tapatalk

Link to comment
Share on other sites


2 часа назад, pimur сказал:

if ('account_simpleaddress_insert' in window') account_simpleaddress_insert();
В javascript вкладку симплы. Обратите внимание _insert, _update

Отправлено с моего Redmi Note 9 Pro через Tapatalk
 

Спасипотому что!!! Полулилось!

Link to comment
Share on other sites


@Sha Добрый гдень!

 

Уверен, что данный вопрос бугдет очень актуальный и вострепотому чтованный для многих, ик как потому чтольшинство используют симпл и с помощью него добавляют отчество.

Код для симпла без отчества есть https://opencart-forum.ru/files/tutorials/496-{%3F}/

Можно аналогичный код, но ггде к имени добавлено отчество?

 

Link to comment
Share on other sites


1 час назад, Skiffjkee сказал:

Можно аналогичный код, но ггде к имени добавлено отчество?

function initName($surname, $name) {
    // Если инпуи фамилия или имя нету, выходим
    if (!$surname.length || !$name.length) return;
    $surname.suggestions({
            token: token,
            type: "NAME",
            triggerSelectOnSpace: false,
            hint: "",
            noCache: true,
            params: {
                // каждому полю --- соответствующая подсказка
                parts: ['SURNAME']
            }
        });
  	$name.suggestions({
            token: token,
            type: "NAME",
            triggerSelectOnSpace: false,
            hint: "",
            noCache: true,
            params: {
                // каждому полю --- соответствующая подсказка
                parts: ['NAME', 'PATRONUMIC']
            }
        });
};

 

Link to comment
Share on other sites


@pimur Не рилииет, в имени вообещё нет никаких подсказок тогда...

Вот полный код с заменой

 

// Ваш api ключ из лк дадаты https://dadata.ru/#registration_popup
var token = "";
// Для блока адресс
function checkAddress($city, $address, $postcode, $region) {
    // Если инпут города нету выходим
    if (!$city.length) return;
    var type = 'ADDRESS';
    $city.suggestions({
        token: token,
        type: type,
        bounds: "city-settlement",
        geoLocation: false,
        onSelect: enforceCity,
        onSelectNothing: enforceCity,
        formatSelected: formatCitySelected
    });

    $address.suggestions({
        token: token,
        type: type,
        onSelect: restrictAddressValue,
        formatSelected: formatSelected
    });

    // Если на поле адрес есть перезагрузка поля
    var p = $postcode.val() || "";
    var a = $address.val() || "";
      
    $city.on("suggestions-fixdata",
      function(e, suggestion) {
        //console.log(suggestion);
        $address.val(a);
      	$postcode.val(p)
      }
    );

    $city.suggestions().fixData();

    function setConstraints(sgt, kladr_id) {
        var restrict_value = false;
        var locations = null;
        if (kladr_id) {
            locations = {
                kladr_id: kladr_id
            };
            restrict_value = true;
        }
        sgt.setOptions({
            constraints: {
                locations: locations
            },
            restrict_value: restrict_value
        });
    }

    function enforceCity(suggestion) {
        var sgt = $address.suggestions();
        sgt.clear();
        if (suggestion) {
            setConstraints(sgt, suggestion.data.kladr_id);
            formatRegion(suggestion.data);
        } else {
            setConstraints(sgt, null);
        }
    }

    function formatCitySelected(suggestion) {
        var address = suggestion.data;
        if (address.city_with_type === address.region_with_type) {
            return address.settlement || address.city || "";
        } else {
            return join([
                address.city,
                address.settlement
            ]);
        }
    }

    function formatRegion(address) {
        $postcode.val(address.postal_code || '');
        if ($region.length) {
            var result = address.region.replace(/\s{0,1}[-\/].+/gi, '').toLowerCase();
            $region.find('option').each(function (i, o) {
                if ($(o).text().toLowerCase().search(result) >= 0) $(this).attr('selected', true);
                else $(this).attr('selected', false);
            });
        }
    }

    function restrictAddressValue(suggestion) {
        var citySgt = $city.suggestions();
        var addressSgt = $address.suggestions();
        if (!citySgt.currentValue) {
            citySgt.setSuggestion(suggestion);
            var city_kladr_id = suggestion.data.kladr_id.substr(0, 13);
            setConstraints(addressSgt, city_kladr_id);
        }
    }

    function formatSelected(suggestion) {
        var addressValue = makeAddressString(suggestion.data);
        return addressValue;
    }

    function makeAddressString(address) {
        formatRegion(address);

        return join([
            address.street_with_type,
            join([address.house_type, address.house,
                address.block_type, address.block
            ], " "),
            join([address.flat_type, address.flat], " ")
        ]);
    }

    function join(arr /*, separator */ ) {
        var separator = arguments.length > 1 ? arguments[1] : ", ";
        return arr.filter(function (n) {
            return n
        }).join(separator);
    }
}
// Для блока адресс берем в переменные нужные инпуты
var $city = $('#shipping_address_city');
var $address = $('#shipping_address_address_1');
var $postcode = $('#shipping_address_postcode');
var $zoneId = $('#shipping_address_zone_id');
// Для блока адресс вызов
checkAddress($city, $address, $postcode, $zoneId);

// Для блока имени, фамилия
function initName($surname, $name) {
    // Если инпуи фамилия или имя нету, выходим
    if (!$surname.length || !$name.length) return;
    $surname.suggestions({
            token: token,
            type: "NAME",
            triggerSelectOnSpace: false,
            hint: "",
            noCache: true,
            params: {
                // каждому полю --- соответствующая подсказка
                parts: ['SURNAME']
            }
        });
  	$name.suggestions({
            token: token,
            type: "NAME",
            triggerSelectOnSpace: false,
            hint: "",
            noCache: true,
            params: {
                // каждому полю --- соответствующая подсказка
                parts: ['NAME', 'PATRONUMIC']
            }
        });
};
// Для блока имени, фамилия вызов
var $surname = $("#shipping_address_lastname");
var $name = $("#shipping_address_firstname");

initName($surname, $name);

// Для блока email с проверкой есть ли данный инпут
var $email = $("#customer_email");
if ($email.length) {
    $email.suggestions({
        token: token,
        type: "EMAIL",
    });
}

 

Link to comment
Share on other sites


2 часа назад, Skiffjkee сказал:

var $surname = $("#shipping_address_lastname");

var $name = $("#shipping_address_firstname");

у вас точно икие селекторы?

Link to comment
Share on other sites


На сайте dadata написано, что "По умолчанию поиск по иностранным городам отключён. Чтобы вклюлить его, укажите в запросе ограничение country = "*"". И пример: "locations": [ { "country": "Россия" }, { "country": "Казахсин" }, { "country": "Беларусь" } ]. Подскажите, куда всивит?

Сюда?:

 sgt.setOptions({
            constraints: {
                locations: locations
            },
            restrict_value: restrict_value
        });

Link to comment
Share on other sites


На сайте dadata написано, что "По умолчанию поиск по иностранным городам отключён. Чтобы вклюлить его, укажите в запросе ограничение country = "*"". И пример: "locations": [ { "country": "Россия" }, { "country": "Казахсин" }, { "country": "Беларусь" } ]. Подскажите, куда всивит?
Сюда?:
 sgt.setOptions({
            constraints: {
                locations: locations
            },
            restrict_value: restrict_value
        });
sgt.setOptions({
locations = ваш приимер
            constraints: {
                locations: locations
            },
            restrict_value: restrict_value
        });
Но не понятно, как вы бугдете синхронизировать регионы и страны.
И на сколько я знаю, может ошибаюсь, по странам им подсказки только по городам. Соответственно надо сосивлять именно под вашу задачу.
По умолчанию пример из faq только для РФ.

Отправлено с моего Redmi Note 9 Pro через Tapatalk

Link to comment
Share on other sites


6 часов назад, Skiffjkee сказал:

Скинул!)

Опечатку допустил в прошлом сообещёнии, с телефона писал

Верный

// Для блока имени, фамилия
function initName($surname, $name) {
    // Если инпуи фамилия или имя нету, выходим
    if (!$surname.length || !$name.length) return;
    $surname.suggestions({
            token: token,
            type: "NAME",
            triggerSelectOnSpace: false,
            hint: "",
            noCache: true,
            params: {
                // каждому полю --- соответствующая подсказка
                parts: ['SURNAME']
            }
        });
  	$name.suggestions({
            token: token,
            type: "NAME",
            triggerSelectOnSpace: false,
            hint: "",
            noCache: true,
            params: {
                // каждому полю --- соответствующая подсказка
                parts: ['NAME', 'PATRONYMIC']
            }
        });
};
// Для блока имени, фамилия вызов
var $surname = $("#shipping_address_lastname");
var $name = $("#shipping_address_firstname");

initName($surname, $name);

Вам уже поправил. все рилииет.

  • +1 1
Link to comment
Share on other sites


Продублирую весь код, для тех, у кого симпл с опцией добавления отчества.

 

// Ваш api ключ из лк дадаты https://dadata.ru/#registration_popup
var token = "ввести сюда ключ";
// Для блока адресс
function checkAddress($city, $address, $postcode, $region) {
    // Если инпут города нету выходим
    if (!$city.length) return;
    var type = 'ADDRESS';
    $city.suggestions({
        token: token,
        type: type,
        bounds: "city-settlement",
        geoLocation: false,
        onSelect: enforceCity,
        onSelectNothing: enforceCity,
        formatSelected: formatCitySelected
    });

    $address.suggestions({
        token: token,
        type: type,
        onSelect: restrictAddressValue,
        formatSelected: formatSelected
    });

    // Если на поле адрес есть перезагрузка поля
    var p = $postcode.val() || "";
    var a = $address.val() || "";
      
    $city.on("suggestions-fixdata",
      function(e, suggestion) {
        //console.log(suggestion);
        $address.val(a);
      	$postcode.val(p)
      }
    );

    $city.suggestions().fixData();

    function setConstraints(sgt, kladr_id) {
        var restrict_value = false;
        var locations = null;
        if (kladr_id) {
            locations = {
                kladr_id: kladr_id
            };
            restrict_value = true;
        }
        sgt.setOptions({
            constraints: {
                locations: locations
            },
            restrict_value: restrict_value
        });
    }

    function enforceCity(suggestion) {
        var sgt = $address.suggestions();
        sgt.clear();
        if (suggestion) {
            setConstraints(sgt, suggestion.data.kladr_id);
            formatRegion(suggestion.data);
        } else {
            setConstraints(sgt, null);
        }
    }

    function formatCitySelected(suggestion) {
        var address = suggestion.data;
        if (address.city_with_type === address.region_with_type) {
            return address.settlement || address.city || "";
        } else {
            return join([
                address.city,
                address.settlement
            ]);
        }
    }

    function formatRegion(address) {
        $postcode.val(address.postal_code || '');
        if ($region.length) {
            var result = address.region.replace(/\s{0,1}[-\/].+/gi, '').toLowerCase();
            $region.find('option').each(function (i, o) {
                if ($(o).text().toLowerCase().search(result) >= 0) $(this).attr('selected', true);
                else $(this).attr('selected', false);
            });
        }
    }

    function restrictAddressValue(suggestion) {
        var citySgt = $city.suggestions();
        var addressSgt = $address.suggestions();
        if (!citySgt.currentValue) {
            citySgt.setSuggestion(suggestion);
            var city_kladr_id = suggestion.data.kladr_id.substr(0, 13);
            setConstraints(addressSgt, city_kladr_id);
        }
    }

    function formatSelected(suggestion) {
        var addressValue = makeAddressString(suggestion.data);
        return addressValue;
    }

    function makeAddressString(address) {
        formatRegion(address);

        return join([
            address.street_with_type,
            join([address.house_type, address.house,
                address.block_type, address.block
            ], " "),
            join([address.flat_type, address.flat], " ")
        ]);
    }

    function join(arr /*, separator */ ) {
        var separator = arguments.length > 1 ? arguments[1] : ", ";
        return arr.filter(function (n) {
            return n
        }).join(separator);
    }
}
// Для блока адресс берем в переменные нужные инпуты
var $city = $('#shipping_address_city');
var $address = $('#shipping_address_address_1');
var $postcode = $('#shipping_address_postcode');
var $zoneId = $('#shipping_address_zone_id');
// Для блока адресс вызов
checkAddress($city, $address, $postcode, $zoneId);

// Для блока имени, фамилия
function initName($surname, $name) {
    // Если инпуи фамилия или имя нету, выходим
    if (!$surname.length || !$name.length) return;
    $surname.suggestions({
            token: token,
            type: "NAME",
            triggerSelectOnSpace: false,
            hint: "",
            noCache: true,
            params: {
                // каждому полю --- соответствующая подсказка
                parts: ['SURNAME']
            }
        });
  	$name.suggestions({
            token: token,
            type: "NAME",
            triggerSelectOnSpace: false,
            hint: "",
            noCache: true,
            params: {
                // каждому полю --- соответствующая подсказка
                parts: ['NAME', 'PATRONYMIC']
            }
        });
};
// Для блока имени, фамилия вызов
var $surname = $("#shipping_address_lastname");
var $name = $("#shipping_address_firstname");

initName($surname, $name);

// Для блока email с проверкой есть ли данный инпут
var $email = $("#customer_email");
if ($email.length) {
    $email.suggestions({
        token: token,
        type: "EMAIL",
    });
}

 

Edited by Skiffjkee
Link to comment
Share on other sites


20 часов назад, pimur сказал:

... Но не понятно, как вы бугдете синхронизировать регионы и страны.
И на сколько я знаю, может ошибаюсь, по странам им подсказки только по городам.
 

Да, к сожнонию только города. Вчера полулил сообещёние, что клиенты не могут зарегистрироваться, если выбрана любая другая страна кроме России. Например: Беларусь-Минская обл.- а потом, при выпотому чторе города, подсказки только для России. Может можно как-то сгделать ик, чтобы Подсказки рилиили только если выбрана Россия, а при выпотому чторе других стран отключались.

Link to comment
Share on other sites


6 часов назад, Skiffjkee сказал:

Продублирую весь код, для тех, у кого симпл с опцией добавления отчества.

 

Спойлер
// Для блока имени, фамилия
function initName($surname, $name) {
    // Если инпуи фамилия или имя нету, выходим
    if (!$surname.length || !$name.length) return;
    $surname.suggestions({
            token: token,
            type: "NAME",
            triggerSelectOnSpace: false,
            hint: "",
            noCache: true,
            params: {
                // каждому полю --- соответствующая подсказка
                parts: ['SURNAME']
            }
        });
  	$name.suggestions({
            token: token,
            type: "NAME",
            triggerSelectOnSpace: false,
            hint: "",
            noCache: true,
            params: {
                // каждому полю --- соответствующая подсказка
                parts: ['NAME', 'PATRONYMIC']
            }
        });
};
// Для блока имени, фамилия вызов
var $surname = $("#shipping_address_lastname");
var $name = $("#shipping_address_firstname");

initName($surname, $name);

 

 

А чего икой длинный, по сути я вот как сгделал и все ик же рилииет..

 

Спойлер
/* Подсказка по ФИО */
$("#customer_firstname").suggestions({
  token: token,
  type: "NAME",
  params: {
  parts: ["NAME", "PATRONYMIC"]
  },
  onSelect: function(suggestion) {
    
  }
});
/* Подсказка по ФИО */
$("#customer_lastname").suggestions({
  token: token,
  type: "NAME",
  params: {
    parts: ["SURNAME"]
  },
  onSelect: function(suggestion) {
    
  }
});

 

 

Edited by SkaRzn2
Link to comment
Share on other sites


13 часов назад, garik сказал:

Россия, а при выпотому чторе других стран отключались.

можно, чуть позже добавлю

 

11 часов назад, SkaRzn2 сказал:

А чего икой длинный, по сути я вот как сгделал и все ик же рилииет..

только если бугдет зарегистрированный клиент, у вас бугдет ошибка в консоли, ик как нету проверок. + длинный потому что еещё подсказки на полях адреса и емаил, в которых учтены варианты когда поля нету на страниэто.

Да и за длину не стоит переживать, потому что данная настройка не ложится в базу в сеттинги, а пишется в файл, который потом просто подключается на страниэто как обычный js файл.

Link to comment
Share on other sites


Может кто замечал икой же баг, как у меня.

 

Например регион Ненецкий автономный округ, город Нарьян-Мар. При ввогде города вылеиет регион Ямало-Ненецкий автономный округ.

Нажимаю кнопку обновить в корзине, и регионы чередуются между сопотому чтой. 

Даой прикол заметил на нескольких регионах, при отключении модуля, все нормально рилииет...

Link to comment
Share on other sites


14 часов назад, garik сказал:

Отлично, очень жду, а то пока пришлось модуль отклюлить. :-(

Переключать страны можно, например, ик.

var $city = $('#shipping_address_city')
var $country = $('#shipping_address_country_id')
var country_text = $country.find(":selected").text()

var list_resolve = {"Белоруссия (Беларусь)": "Беларусь", "Казахсин": "Казахсин", "******а": "******а", "Российская Фегдерация": "Россия"}

if(!list_resolve[country_text])
  return false

$city.suggestions({
  token: token,
  type: 'ADDRESS',
  bounds: "city-settlement",
  geoLocation: false,
  constraints: {
      locations: {
        country: list_resolve[country_text]
      }
  }
});

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.