Downloads
Stars
Version
Using this package, you can use spatial fields in Laravel Nova.
🚀 If you find this project interesting, please consider supporting me on the open source journey
composer require mostafaznv/nova-map-field
php artisan vendor:publish --provider="Mostafaznv\NovaMapField\NovaMapFieldServiceProvider"
<?php
return new class extends Migration
{
public function up()
{
Schema::create('locations', function (Blueprint $table) {
$table->id();
$table->string('title', 150);
$table->point('location')->nullable();
$table->polygon('area')->nullable();
$table->multiPolygon('areas')->nullable();
$table->timestamps();
});
}
};
HasSpatialColumns
trait to model<?php
namespace App\Models;
use Mostafaznv\NovaMapField\Traits\HasSpatialColumns;
class Location extends Model
{
use HasSpatialColumns;
}
<?php
namespace App\Models;
use MatanYadaev\EloquentSpatial\Objects\MultiPolygon;
use MatanYadaev\EloquentSpatial\Objects\Point;
use MatanYadaev\EloquentSpatial\Objects\Polygon;
class Location extends Model
{
use HasSpatialColumns;
protected $casts = [
'location' => Point::class,
'area' => Polygon::class,
'areas' => MultiPolygon::class
];
}
<?php
namespace App\Nova\Resources;
use Mostafaznv\NovaMapField\Fields\MapMultiPolygonField;
use Mostafaznv\NovaMapField\Fields\MapPointField;
use Mostafaznv\NovaMapField\Fields\MapPolygonField;
class Location extends Resource
{
public function fields(Request $request): array
{
return [
MapPointField::make('location'),
MapPolygonField::make('area'),
MapMultiPolygonField::make('areas'),
];
}
}
method | Arguments | description |
---|---|---|
defaultLatitude | latitude float |
Specifies latitude of map on page load |
defaultLongitude | longitude float |
Specifies longitude of map on page load |
zoom | zoom integer |
Specifies default map zoom |
withoutZoomControl | status bool default: true |
Specifies whether zoom in/out button should display on map or not |
withoutZoomSlider | status bool default: true |
Specifies whether zoom slider should display on map or not |
withFullScreenControl | status bool default: true |
Specifies whether full screen button should display on map or not |
mapHeight | height integer default: 400 |
Map's height |
hideDetailButton | status bool default: true |
Specifies whether Show Details button should appear on detail pages or not |
markerIcon | icon integer available: 1, 2, 3 |
Marker icon |
withSearchBox | boolean |
Specifies whether map has search box or not |
searchProvider | provider MapSearchProvider |
|
searchProviderApiKey | apiKey string |
Specifies api key for search provider, if needed |
withAutocompleteSearch | status bool default: true |
Specifies whether search results should load immediately or not |
searchAutocompleteMinLength | minLength int |
Specifies the minimum number of characters to trigger search action |
searchAutocompleteTimeout | timeout int |
Specifies the minimum number of ms to wait before triggering search action |
searchLanguage | language string |
Specifies preferable language |
searchPlaceholder | placeholder string |
|
searchBoxType | type MapSearchBoxType |
Using this item, you can specify type of search box (button, or text-field |
searchResultLimit | limit int |
Specifies limit of results |
searchResultKeepOpen | status boolean |
Specifies whether the results keep opened |
requiredOnCreate | status bool default: true |
Makes field required on creation |
requiredOnUpdate | status bool default: true |
Makes field required on update |
Method | Type | Default | Description |
---|---|---|---|
default-latitude | bool | 0 | Default latitude of map |
default-longitude | bool | 0 | Default longitude of map |
zoom | int | 12 | Default zoom of map |
controls.zoom-control | bool | true | Specifies if map should display zoom controls (zoom in/out buttons) or not |
controls.zoom-slider | bool | true | Specifies if map should display zoom slider or not |
controls.full-screen-control | bool | false | Specifies if map should display full screen button or not |
map-height | int | 400 | Specifies map height |
icon | int | 1 | Specifies marker icon. available values: 1, 2, 3 |
show-detail-button | bool | true | Specifies whether Show Details button should appear on detail pages or not |
search.enable | bool | true | Using this item, you can toggle displaying search box on maps |
search.provider | MapSearchProvider | OSM | Specifies search provider available providers: OSM, MAPQUEST, PHOTON, PELIAS, BING, OPENCAGE |
search.api-key | string | '' | Specifies API key if required |
search.autocomplete | boolean | false | Using this item, you can toggle autocomplete feature for search box |
search.autocomplete-min-length | int | 2 | The minimum number of characters to trigger search |
search.autocomplete-timeout | int | 200 | The minimum number of ms to wait before triggering search action |
search.language | string | en-US | Specifies preferable language |
search.placeholder | string | Search for an address | Specifies placeholder for text input |
search.box-type | MapSearchBoxType | TEXT_FIELD | Specifies type of search box. available types: BUTTON, TEXT_FIELD |
search.limit | int | 5 | Specifies limit of results |
search.keep-open | boolean | false | Specifies whether the results keep opened |
This package uses Laravel Eloquent Spatial under the hood. to use columns and querying them over the application, please read Laravel Eloquent Spatial documentation
<?php
namespace App\Nova\Resources;
use App\Nova\Resource;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Text;
use App\Models\Location as Model;
use Mostafaznv\NovaMapField\DTOs\MapSearchBoxType;
use Mostafaznv\NovaMapField\DTOs\MapSearchProvider;
use Mostafaznv\NovaMapField\Fields\MapPointField;
class Location extends Resource
{
public static string $model = Model::class;
public function fields(Request $request): array
{
return [
ID::make()->sortable(),
Text::make('Title')
->sortable()
->rules('required', 'max:255'),
MapPointField::make(trans('Location'), 'location')
->defaultLatitude(35.6978527)
->defaultLongitude(51.4037269)
->zoom(14)
->withoutZoomControl()
->withoutZoomSlider()
->withFullScreenControl()
->mapHeight(360)
->hideDetailButton(false)
->markerIcon(3)
->searchProvider(MapSearchProvider::OSM())
->searchProviderApiKey('api-key')
->withAutocompleteSearch()
->searchAutocompleteMinLength(4)
->searchAutocompleteTimeout(500)
->searchLanguage('fa-IR')
->searchPlaceholder('Placeholder ...')
->searchBoxType(MapSearchBoxType::BUTTON())
->searchResultLimit(3)
->searchResultKeepOpen(true)
->required()
->requiredOnCreate()
->requiredOnUpdate()
->stacked(),
];
}
}
🚀 If you find this project interesting, please consider supporting me on the open source journey
This software is released under The MIT License (MIT).