Download the PHP package awkwardideas/laravel_cities without Composer
On this page you can find all versions of the php package awkwardideas/laravel_cities. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download awkwardideas/laravel_cities
More information about awkwardideas/laravel_cities
Files in awkwardideas/laravel_cities
Package laravel_cities
Short Description Seed all countries/cities from geonames.org database. Searchable DB tree, ready to use API & a bonus vue.js component!
License MIT
Homepage https://github.com/awkwardideas/laravel_cities.git
Informations about the package laravel_cities
Forked from igaster/laravel_cities
Introduction
- Deploy and use geonames.org (ex MaxCDN) database locally to query countries/cities
- Includes latitude/longitude
- Optimized DB tree structure for searching and traversing the tree.
- Provides an Eloquent model (geo) with multiple query-scopes to help you build your queries.
- Exposes a simple API that you can use to create AJAX calls. (Eg search while typing etc).
- A sample vue.js component that that can be inserted into your forms and provides a UI to pick a location
What you dont get:
- geoIP & Postalcodes (not included in free sets)
- Map elements smaller than "3rd Administration Division" (=Cities)
Instructions
- Install with copmoser. Run:
composer require awkwardideas/laravel_cities
-
Add Service Provider in app.php:
- Create a folder
geo
into app's storage folder ('\storage\geo'). Download & unzip "hieararcy.txt" & "allCountries.txt" from geonames.org (http://download.geonames.org/export/dump)
[Tip] Quick script to download on your remote server with:
- Migrate and Seed. Run:
Note: If you don't want all the countries, you can download only country specific files (eg US.txt) and import each one of them with:
Seed with custom data
Create a json file with custom data at storage\geo
and run the following command to pick a file to seed:
If an item exists in the DB (based on the 'id' value), then it will be updated else a new entry will be inserted. For example the following json file will rename United States
to USA
and it will add a child item (set by the parent_id value)
Please note that adding new items to the DB will reindex ALL items to rebuild the tree structure. Please be patient...
An example file is provided: countryNames.json which updates the official country names with a most popular simplified version.
Tip: You can get a json representation from the DB by quering the API (see below)
Geo Model:
You can use AwkwardIdeas\LaravelCities\Geo
Model to access the database. List of available properties:
Visit http://www.geonames.org > Info, for a more detailed description.
Usage
Searching:
Traverse tree
Check Hierarchy Relations:
Query scopes (Use them to Build custom queries)
If you need more functionality you can extend AwkwardIdeas\LaravelCities\Geo
model and add your methods.
HTTP API
This package defines some API routes that can be used to query the DB through simple HTTP requests. To use them insert in your routes file:
For example if you insert them in your routes\api.php
(recommended) then the following URLs will be registered:
URL Endpoind (GET) | Description | Returns (JSON) |
---|---|---|
api/geo/search/{name}/{parent-id?} | Search items containing 'name', (and belong to parent-id) | Collection |
api/geo/item/{id} | Get item by id | Geo |
api/geo/items/{ids} | Get multiple items by ids (comma seperated list) | Collection |
api/geo/children/{id} | Get children of item | Collection |
api/geo/parent/{id} | Get parent of item | Geo |
api/geo/country/{code} | get country by two-letter code | Geo |
api/geo/countries | list of countries | Collection |
The response is always a JSON representation of either a Geo class or a Collection.
To reduce bandwith, all Geo model attributes will be returned except from alternames
, left
, right
and depth
. You can change this behavior by passing an optional parameter on any request:
URL Params (aplly to all routes) | Description | Example |
---|---|---|
fields=field1,field2 | Returns only the specified attributes | api/geo/countries?fields=id,name |
fields=all | Returns all attributes | api/geo/countries?fields=all |
Vue Component
A Vue component is shipped with this package that plugs into the provided API and provides an interactive way to pick a location through a series of steps. Sorry, no live demo yet, just some screenshots:
Step 1: Select your location. Drop down lists loads asynchronous:
Step 2: Reached to a destination. Path is displayed and button to edit selection:
Step 3: On form submition several fields are beeing submited:
Usage Guide
Assuming that you are using Webpack to compile your assets, and you have included vue-app.js
:
Add in your application
In your main vue-app.js file add the component declaration:
Vue.component('geo-select', require('RELATIVE_PATH_TO/vendor/awkwardideas/laravel_cities/src/vue/geo-select.vue'));
Alternative you may publish the component with
artisan vendor:publish --provider="AwkwardIdeas\LaravelCities\GeoServiceProvider"
Component will be exported at /resources/LaravelCities/geo-select.vue
so that you can make modifications...
If you choose to do the exported component, make sure you register it in the vue-app.js file with
Vue.component('geo-select', require('RELATIVE_PATH_TO/resources/LaravelCities/geo-select.vue'));
Compile compoment
npm run dev
(or npm run production
)
Use in blade files
Example:
The following inputs will be submited:
- geo-id
- geo-name
- geo-long
- geo-lat
- geo-country
- geo-country-code