Giter Site home page Giter Site logo

kylekatarnls / vicopo Goto Github PK

View Code? Open in Web Editor NEW
27.0 5.0 5.0 128 KB

API HTTP et Script pour trouver les villes à partir d'un code postal et code postaux à partir d'une ville

Home Page: https://vicopo.selfbuild.fr

License: MIT License

JavaScript 80.98% Ruby 4.22% Python 3.99% PHP 4.41% HTML 6.41%
postal ville city code javascript jquery jquery-plugin jquery-ajax api

vicopo's Introduction

API HTTP et Script pour trouver les villes à partir d'un code postal et code postaux à partir d'une ville

Vicopo est un moyen léger et rapide rechercher une ville française et implémenter des propositions à la volée, l'autocomplétion d'un champ de ville ou de code postal et la conversion de l'un vers l'autre.

https://vicopo.selfbuild.fr/

Utilisation

Afficher les villes possibles dans une liste

<input id="ville" placeholder="Entrez un code postal ou une ville" autocomplete="off" size="50">
<ul>
  <li data-vicopo="#ville">
    <strong data-vicopo-code-postal></strong>
    <span data-vicopo-ville></span>
  </li>
</ul>

Placez le code ci-dessus n'importe où sur votre page, et insérez le script après jQuery (par exemple avant </body>) :

<script
  src="https://code.jquery.com/jquery-3.5.1.min.js"
  integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0="
  crossorigin="anonymous"></script>
<script src="vicopo.min.js"></script>

Voir la démonstration

Ajoutez l'attribut data-vicopo à un élément et passez-lui en paramètre un sélecteur qui pointera vers un champ(<input>, <select> ou <textarea>). Quand la valeur du champs change, l'élément sera duppliqué autant de fois qu'il y a de villes commençant par la valeur tapée ou dont le code postal commence par la valeur tapée (la recherche commence à partir de 2 caractères tapés).

À l'intérieur de ces éléments, les balises portant les attributs data-vicopo-code-postal, data-vicopo-ville seront respectivement pourvus du code postal et de la ville. Si ces balises sont des champs, utilisez data-vicopo-val-code-postal et data-vicopo-val-ville pour que les informations soient assignées en tant que valeur.

Compléter le champ avec le premier nom de ville trouvé

$('#ville').keyup(function (e) {
  if(e.keyCode == 13) {
    var $ville = $(this);
    $.vicopo($ville.val(), function (input, cities) {
      if(input == $ville.val() && cities[0]) {
        $ville.val(cities[0].city).vicopoTargets().vicopoClean();
      }
    });
    e.preventDefault();
    e.stopPropagation();
  }
});

Voir la démonstration

Lors de l'appui sur Entrée, on récupère la première ville et on l'applique comme nouvelle valeur du champ.

L'ajout optionnel de .vicopoTargets().vicopoClean() permet d'effacer la liste de suggestions.

Récupérer les villes au fur et à mesure de la saisie

$('#recherche').vicopo(function (cities) {
  if(cities.length) {
    $('#ville').val(cities[0].city);
    $('#code').val(cities[0].code);
  } else {
    $('#ville').val('');
    $('#code').val('');
  }
  $('#count').val(cities.length + ' villes trouvées');
});

Les méthodes .vicopo(), .codePostal() et .ville() appliquées à un élément jQuery permettent de récupérer dans une variable le résultat de la recherche à chaque lettre saisie dans le champ.

Utilisation sans champs de saisie

$('#cp').click(function () {
  $.ville('strasbourg', function (input, cities) {
    $('#cp-result').text(cities[0].code);
  });
});
$('#villes').click(function () {
  $.ville('des', function (input, cities) {
    $('#villes-result').text(cities.map(function (entry) {
      return entry.city;
    }).join(', '));
  });
});

Voir la démonstration

Les méthodes $.vicopo(), $.codePostal() et $.ville() prennent en premier paramètre le code postal ou la ville (partiel ou entier) recherché et en second paramètre une fonction de callback appelée avec le terme recherché en premier paramètre, les villes trouvées en second et en troisième 'code' pour une recherche de code postal ou 'city' pour une recherche de ville.

API HTTP brute au fomart JSON (par défaut)

Protocole URL
HTTP http://vicopo.selfbuild.fr/cherche/680
HTTPS https://vicopo.selfbuild.fr/cherche/680
{
    "input": "680",
    "cities": [
        {
            "code": 68040,
            "city": "INGERSHEIM"
        },
        {
            "code": 68000,
            "city": "COLMAR"
        }
    ]
}

Plugin node.js

Vicopo est disponible sous node.js directement via require('vicopo') :

var ville = 'Lille';
var vicopo = require('vicopo')('http');
vicopo(ville, function (err, cities) {
    if (err) {
        throw err;
    } else {
        console.log(cities);
    }
});

Plus d'options sur https://vicopo.selfbuild.fr/

vicopo's People

Contributors

kylekatarnls avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

vicopo's Issues

Code postal town not exist

Hello,

There is a postal code that does not return a city. Yet this city exists with this zip code number.
Can you add this city.

21605 Sennecey-lès-Dijon France

Thank you

API Down

Bonjour, j'utilise votre API pour un de mes sites web mais actuellement l'api ne fonctionne plus, j'ai toujours une erreur 500,
Êtes-vous au courant ?

Cela est-il permanant ou non ?

Cordialement Guillaume Launay

Code database

Bonjour,

la liste des codes postaux <-> nom de la commune est associée à quelle base de données ?
On fait une vérification des champs saisis avec apicarto et jquery.validate() de la manière suivante :
jQuery.validator.addMethod("villeValidator", function(value, element) { let valid = false; elements = value.split(' - '); console.log(elements); $.ajax({ url : https://apicarto.ign.fr/api/codes-postaux/communes/${elements[0]}`,
type : 'GET',
dataType : 'json',
async: false,
success : function(response) {
response.forEach(ville => {
if (ville.libelleAcheminement == elements[1]) {
console.log("OK")
valid = true;
}
})
}
});
return valid;
});`

Ça fonctionne bien avec les noms simples, mais avec les noms composé le formulaire ne se valide pas.
L'hypothèse est la différence entre le nom de commune dans la base vicopo et celui dans la base apicarto.
A-t-on un autre moyen d'empêcher la validation du champ tant qu'il n'est pas conforme à une association codepostal - ville existante ?
Merci pour votre aide !

1er exemple

Je souhaite utiliser votre 1er exemple de http://vicopo.selfbuild.fr/
Hélas, comme il n'est pas expliqué (et c'est le seul), j'ai beaucoup de difficultés à le mettre en place.
Pourriez-vous donner la marche à suivre?
Merci d'avance

Pas de résultats avec codes postaux Corse

Bonjour,
Quand je recherche via un code postal Corse (par exemple 20000 pour Ajaccio ou 20200 pour Batia) je n'ai aucun résultat.
Par contre la recherche par ville fonctionne, j'ai bien les codes postaux qui sont retournés.
Il y a donc un soucis avec tous les codes postaux de la Corse.

Merci

Bug sous Safari

Bonjour,
J'utilise le code suivant, il fonctionne sur Chrome et Firefox, mais pas sur Safari vous avez une idée ?

<script src="http://vicopo.selfbuild.fr/api.min.js"></script>
    <!-- Custom styles for this template -->

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

    <script>
        function test() {
            var re = new RegExp('^[0-9]{5}\\s[a-zA-Z-]{2,}$');
            var salut = document.getElementById("ville").value;
            var codeetville = document.getElementById("ville").value;
            if (salut.match(re) != null) {
                var espace = " ";
                var arrayOfStrings = codeetville.split(espace);
                for (var i = 0; i < arrayOfStrings.length; i++) {
                    var requestURL = 'https://vicopo.selfbuild.fr/cherche/' + arrayOfStrings[1];
                    var request = new XMLHttpRequest();
                    request.open('GET', requestURL);
                    request.responseType = 'json';
                    request.send();
                    request.onload = function () {
                        var superHeroes = request.response;
                        console.log(superHeroes);
                        if (arrayOfStrings[1] === undefined) {
                            alert("La ville n'est pas bien renseigné (CP Nom)");
                        }
                        else {


                            var dd = superHeroes['cities'][0]["code"].number;
                            var ff = arrayOfStrings[0].number;
                            if (ff === dd) {
                                document.getElementById("zip").value = salut.substr(0, 5);

                                if (document.getElementById('exampleCheck1').checked) {
                                    document.getElementById('submit').disabled = '';
                                }
                                else {
                                    document.getElementById('submit').disabled = 'disabled';
                                }
                            }
                            else {

                            }
                        }
                    }
                }
            }
            else {
                alert("La ville n'est pas bien renseigné (CP Nom)");
            }
        }


    </script>

Le code du champ :

<label>Ville</label>
                <input id="ville" class="form-control" list="list_ville" type="text" autocomplete="off">

                <datalist id="list_ville">
                    <option value="enter" disabled>Entrez le nom ou de CP de votre ville</option>
                    <option data-vicopo="#ville">
                        <a data-vicopo-code-postal> </a>&nbsp;<a data-vicopo-ville></a></option>

                </datalist>

Merci d'avance
Nicolas

Rentrer une ville avec clique gauche au lieu d'entrée

Bonjour,

J'aimerais valider la ville avec un clique gauche sur la ville souhaitée, plutôt que devoir appuyer sur entrée et sélectionner la première ville.

Y a t-il un moyen simple d'implémenter cela? Je pense que beaucoup d'utilisateurs pourraient être intéressés.

Merci beaucoup!

Liste toujours visible sur edit

Salut,
j'ai un soucis avec la liste :

  • fonctionne parfaitement lors de la création de mon entité
  • lorsque j’édite mon entité adresse, la liste apparait sur la page à l'ouverture, alors que je ne suis pas entré dans le champ cp ou ville
{{ form_row(form.cp) }}
<div id="output">
   <ul class="list-group list-group-flush mb-3" style="margin-top: -1rem !important;">
      <li data-vicopo="#etablissement_ville, #etablissement_cp" data-vicopo-click='{"#etablissement_cp": "code", "#etablissement_ville":"ville"}' class="list-group-item cursor-pointer">
         <strong data-vicopo-code-postal></strong>
         <span data-vicopo-ville></span>
      </li>
   </ul>
</div>
{{ form_row(form.ville) }}

Problème cp qui retourne erreur

Bonjour et merci pour cette api.

Je me suis rendu compte que depuis quelque jours, quand je rentre un CP ça me renvoi un résultat "erreur". Egalement aussi sur votre site https://vicopo.selfbuild.fr/ concernant la partie "Remplir le champ au clic sur un des choix "

Cordialement

Yoann

Afficher liste des villes dans un select

Bonjour,

Je souhaiterais afficher la liste des communes issues d'un input text dans un champ select et pouvoir ainsi choisir la commune désiré si il y en a plusieurs.

J'arrive seulement a obtenir autant de option que de ville éxistante, mais je n'arrive pas a afficher le nom + C.P des villes.

<input id="ville" placeholder="Entrez un code postal ou une ville" autocomplete="off" size="50"> <select> <option data-vicopo="#ville" data-vicopo-val-ville> <strong data-vicopo-val-code-postal></strong> <span data-vicopo-val-ville></span> </option> </select>

(Mon exemple est très loin d'être propre mais il s'approche de ce que je veux)

Avez vous une solution ?
Merci d'avance !

HTTPS non sécurisé

Bonjour,
Tout d'abord merci pour ton travaille, ton API est très utile est très facile à mettre en place. Mais j'ai un problème, ton certificat https n'est plus valide du coup je ne peux pas intégrer l'API à mon site ... J'aimerais savoir si tu pouvais le renouveler (Let's on crypt le fait gratuitement).

Merci d'avance pour ta réponse.

Je ne trouve pas certaines villes

Bonjour,

Je viens de constater que je ne trouve pas Brest ( 29200) :
Y a t'il quelque chose que je fais mal ?

Https://vicopo.selfbuild.fr/code/29200 -> {"input":"29200","cities":[]}

https://vicopo.selfbuild.fr/cherche/brest -> {"input":"brest","cities":[{"code":27350,"city":"BRESTOT"}]}

https://vicopo.selfbuild.fr/cherche/292 ->
{"input":"292","cities":[{"code":29260,"city":"LANARVILY"},{"code":29260,"city":"PLOUIDER"},{"code":29260,"city":"LOC BREVALAIRE"},{"code":29260,"city":"TREGARANTEC"},{"code":29260,"city":"PLOUDANIEL"},{"code":29260,"city":"KERNILIS"},{"code":29260,"city":"ST FREGANT"},{"code":29260,"city":"ST MEEN"},{"code":29260,"city":"LESNEVEN"},{"code":29260,"city":"LE FOLGOET"},{"code":29260,"city":"KERNOUES"},{"code":29250,"city":"SANTEC"},{"code":29250,"city":"ST POL DE LEON"},{"code":29250,"city":"PLOUGOULM"},{"code":29250,"city":"SIBIRIL"},{"code":29280,"city":"PLOUZANE"},{"code":29280,"city":"LOCMARIA PLOUZANE"},{"code":29253,"city":"ILE DE BATZ"},{"code":29290,"city":"GUIPRONVEL"},{"code":29290,"city":"ST RENAN"},{"code":29290,"city":"LANRIVOARE"},{"code":29290,"city":"TREOUERGAT"},{"code":29290,"city":"MILIZAC"},{"code":29246,"city":"POULLAOUEN"},{"code":29270,"city":"ST HERNIN"},{"code":29270,"city":"CLEDEN POHER"},{"code":29270,"city":"KERGLOFF"},{"code":29270,"city":"CARHAIX PLOUGUER"},{"code":29270,"city":"MOTREFF"},{"code":29270,"city":"PLOUNEVEZEL"},{"code":29233,"city":"CLEDER"},{"code":29252,"city":"PLOUEZOC H"},{"code":29241,"city":"LOCQUIREC"},{"code":29242,"city":"OUESSANT"},{"code":29217,"city":"TREBABU"},{"code":29217,"city":"PLOUGONVELIN"}]}

Cdt

Site https://vicopo.selfbuild.fr/ down

Bonjour,

Tout d'abord merci pour votre travail et cette excellente API.

Malheureusement, depuis ce matin j'ai l'impression que le site est HS (timeout). Est ce du à une éventuelle maintenance ?

Merci encore,

Intervention en cours chez notre fournisseur VPS

L'API de Vicopo hébergée chez OVH connait actuellement une panne comme tous les services hébergés dans le même data-center. OVH a connaissance de l'incident, nous allons surveiller son déroulement et reporter ici les évolutions au fur et à mesure.

Je suis navré de cet incident et vous prie de nous en excuser.

La liste des villes ne s'affiche pas

Bonjour,
la liste des villes ne s'affiche pas, voici ma configuration:

  • J'ai téléchargé la dernière version de jQuery et copié le fichier jquerry-3.1.1.js dans mon répertoire de travail.
  • J'ai téléchargé l'API VICOPO et copié le fichier api.js dans mon répertoire de travail.
  • J'ai créé ce fichier HTML : test7.html.txt , j'ai ajouté le (.txt) pour l'attacher à ce message.

J'ai testé sans succès sur deux navigateurs : Chrome 55 et Firefox 51. Mon système est : Ubuntu 16.04 (64 bits). Je précise que la démo en ligne fonctionne parfaitement sur ces deux navigateurs.

Communes nouvelles

Bonjour,

Est-il prévu une mise à jour de votre base avec les communes nouvelles ?
Merci

Bartiff

saint / st

Bonjour, cette api est extra.
Je suis débutant en prog. Je ne sais pas s'il serait possible de l'améliorer en permettant de rechercher les ville Saint-Truc pour renvoyer St-Truc.
Actuellement la recherche de ville qui commence par Saint ne fonctionne pas, il faut entrer St.
Encore merci

Probleme pour mon formulaire

Bonjour,

Je viens de découvrir vicopo et celà m'interesse beaucoup, mais j'ai un soucis pour appliquer l'exemple classique en remplaceant ul+li par un select et des option (je souhaite faire un formulaire d'inscription).
Le soucis se situe au niveau de l'affichage, comment afficher les noms des villes sans utiliser le span data-vicopo-ville ? Merci d'avance !

No 'Access-Control-Allow-Origin' header is present on the requested resource

Bonjour,
Je ne sais pas si tu t'occupes encore de ton API, mais depuis peu, j'ai des problemes de CORS blocked, sais tu d'ou peux venir ce problème?

Access to XMLHttpRequest at 'https://www.selfbuild.fr/vicopo?code=77' from origin 'https://couvre-feu.netlify.app' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Voici le lien de la page ou j'ai implémenté ton API:
https://couvre-feu.netlify.app/newuser

[feature] API add fields

Hello,

Can you add in your public API, the INSEE city number and gps coordinates ? You can download these data here.

Page avec plusieurs champs CP + ville

Bonjour,

Tout d'abord, merci pour ce super projet!
Ce n'est pas vraiment un problème mais plus un blocage de ma part.
J'ai un formulaire avec plusieurs fois le duo CP + ville. (En fait l'utilisateur peut rentrer plusieurs adresses en cliquant sur un bouton qui à chaque fois va créer un set de champs: adresse, cp, ville...)
J'ai fait en sorte que le premier duo CP + ville utilise bien les id #city et #code et pas de soucis.
Pour les autres, j'ai fait en sorte qu'ils soient:
#city1 - #code1
#city2 - #code2
....

En partant du script de la démo, je n'arrive pas à modifier la partie suivant qui si j'ai bien compris va faire les requêtes:

$.each(['code' + thisid, 'city' + thisid], function (i, _name) {
    _name_req = _name.substring(0, 4); 
    console.log(_name + " - " + _name_req);
    var _input = $('#' + _name).on('keyup', function () {
        var _val = _input.val();
        if (_val.length > 1) {
            _cache[_name] = _cache[_name] || {};
            if (_cache[_name][_val]) {
                _done(_cache[_name][_val]);
            }
            var _data = {};
            _data[_name] = _val;
            $.getJSON(_host, _data, function (_answear) {
                _cache[_name_req][_answear.input] = _answear.cities;
                if (_input.val() == _answear.input) {
                    _done(_answear.cities);
                }
            });
        }
    });
});

Comment utiliser Vicopo et sa propre base de données ?

Bonjour,
je vousdrais utiliser ma propre base de villes et code postaux (communes).
Comment faire ?
Je ne suis pas en PDO.

Merci

Ma table :

-- Structure de la table communes`

CREATE TABLE IF NOT EXISTS communes (
dc int(1) NOT NULL DEFAULT '0',
clieu varchar(10) NOT NULL DEFAULT '',
reg int(3) NOT NULL DEFAULT '0',
nreg varchar(100) NOT NULL DEFAULT '',
dpt char(3) NOT NULL DEFAULT '',
ndpt varchar(100) NOT NULL DEFAULT '',
com varchar(5) NOT NULL DEFAULT '0',
arr int(2) NOT NULL DEFAULT '0',
cant int(3) NOT NULL DEFAULT '0',
epci int(9) NOT NULL DEFAULT '0',
conj int(2) NOT NULL DEFAULT '0',
cp varchar(5) NOT NULL DEFAULT '',
ncom varchar(100) NOT NULL DEFAULT '',
ancom varchar(255) NOT NULL DEFAULT '',
pop int(9) NOT NULL DEFAULT '0',
popmaj int(9) NOT NULL DEFAULT '0',
alti int(4) NOT NULL DEFAULT '0',
longitude varchar(20) NOT NULL DEFAULT '0.000000000000000',
latitude varchar(20) NOT NULL DEFAULT '0.000000000000000',
surf float(8,2) NOT NULL DEFAULT '0.00'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Contenu de la table communes

INSERT INTO communes (dc, clieu, reg, nreg, dpt, ndpt, com, arr, cant, epci, conj, cp, ncom, ancom, pop, popmaj, alti, longitude, latitude, surf) VALUES
(0, '0', 121, 'Rhône-Alpes', '01', 'Ain', '01001', 2, 10, 240100644, 5, '01400', 'Abergement-Clémenciat', 'l''Abergement-Clémenciat', 818, 787, 257, '4.9191670417786009', '46.15222167968799', 15.70),
(0, '0', 121, 'Rhône-Alpes', '01', 'Ain', '01002', 1, 1, 240100883, 5, '01640', 'Abergement-de-Varey', 'l''Abergement-de-Varey', 201, 207, 367, '5.4238891601562997', '46.007778167725', 9.14),
(0, '1', 121, 'Rhône-Alpes', '01', 'Ain', '01004', 1, 1, 240100883, 1, '01500', 'Ambérieu-en-Bugey', 'Ambérieu-en-Bugey', 13131, 13350, 247, '5.3488888740539995', '45.956111907959006', 24.51),
(0, '0', 121, 'Rhône-Alpes', '01', 'Ain', '01005', 2, 30, 240100735, 1, '01330', 'Ambérieux-en-Dombes', 'Ambérieux-en-Dombes', 1581, 1592, 293, '4.9041671752930007', '45.996112823486008', 16.06),
(0, '0', 121, 'Rhône-Alpes', '01', 'Ain', '01006', 1, 4, 240100354, 1, '01300', 'Ambléon', 'Ambléon', 125, 120, 400, '5.6022219657898003', '45.7502784729', 6.03),
(0, '0', 121, 'Rhône-Alpes', '01', 'Ain', '01007', 1, 1, 240100883, 1, '01500', 'Ambronay', 'Ambronay', 2368, 2328, 250, '5.3594441413878995', '46.008056640625007', 33.64);`

L'api retourne systématiquement 00000 ERREUR

Bonjour,
J'utilise l'api sur plusieurs sites et sur certains d'entres eux j'ai systématiquement le retour 00000 ERREUR depuis le début de semaine. Y a t-il eu des changements sur le serveur qui provoquent ce dysfonctionnement sur ces sites là?

La ville de Carnon n'apparaît pas

Bonjour,

Lors d'une recherche avec le code postal 34280, la ville de CARNON n'apparaît pas.
Pour ce code postal, il n'y a que LA GRANDE-MOTTE qui est retrouvé.

Cordialement,

Certificat SSL expiré

Bonjour et merci tout d'abord pour ce super boulot.

Le certificat Let's Encrypt est expiré, du coup les appels à partir d'un site https échouent.

image

Requête avec ville au nom composé

Bonjour, serait-il possible d'adapter les recherches de ville lorsque le nom est composé ?
Par exemple si je prend la ville Le Crotoy ou Le Grand-Quevilly, on à plus l'habitude de faire des recherches avec Crotoy ou Grand-Quevilly, seulement dans ce cas là rien est affiché, serait-il donc possible d'adapter la requête pour rechercher même lorsque le nom de la ville est composé ?

Merci d'avance ! :)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.