birzha/plugins/rainlab/location/behaviors/LocationModel.php

115 lines
2.6 KiB
PHP

<?php namespace RainLab\Location\Behaviors;
use RainLab\Location\Models\State;
use RainLab\Location\Models\Country;
use System\Classes\ModelBehavior;
/**
* Location model extension
*
* Adds Country and State relations to a model
*
* Usage:
*
* In the model class definition:
*
* public $implement = ['RainLab.Location.Behaviors.LocationModel'];
*
*/
class LocationModel extends ModelBehavior
{
/**
* Constructor
*/
public function __construct($model)
{
parent::__construct($model);
$guarded = $model->getGuarded();
if (count($guarded) === 1 && $guarded[0] === '*') {
$model->addFillable([
'country',
'country_id',
'country_code',
'state',
'state_id',
'state_code'
]);
}
$model->belongsTo['country'] = ['RainLab\Location\Models\Country'];
$model->belongsTo['state'] = ['RainLab\Location\Models\State'];
}
public function getCountryOptions()
{
return Country::getNameList();
}
public function getStateOptions()
{
return State::getNameList($this->model->country_id);
}
/**
* Sets the "country" relation with the code specified, model lookup used.
* @param string $code
*/
public function setCountryCodeAttribute($code)
{
if (!$country = Country::whereCode($code)->first()) {
return;
}
$this->model->country = $country;
}
/**
* Sets the "state" relation with the code specified, model lookup used.
* @param string $code
*/
public function setStateCodeAttribute($code)
{
if (!$state = State::whereCode($code)->first()) {
return;
}
$this->model->state = $state;
}
/**
* Mutator for "country_code" attribute.
* @return string
*/
public function getCountryCodeAttribute()
{
return $this->model->country ? $this->model->country->code : null;
}
/**
* Mutator for "state_code" attribute.
* @return string
*/
public function getStateCodeAttribute()
{
return $this->model->state ? $this->model->state->code : null;
}
/**
* Ensure an integer value is set, otherwise nullable.
*/
public function setCountryIdAttribute($value)
{
$this->model->attributes['country_id'] = $value ?: null;
}
/**
* Ensure an integer value is set, otherwise nullable.
*/
public function setStateIdAttribute($value)
{
$this->model->attributes['state_id'] = $value ?: null;
}
}