add: full multi-tenancy control

This commit is contained in:
Cauê Faleiros
2026-02-02 15:31:15 -03:00
commit c6ec92802b
1711 changed files with 258106 additions and 0 deletions

View File

@@ -0,0 +1,175 @@
<?php
namespace Webkul\Attribute\Traits;
use Webkul\Attribute\Models\AttributeValueProxy;
use Webkul\Attribute\Repositories\AttributeRepository;
trait CustomAttribute
{
/**
* @var array
*/
public static $attributeTypeFields = [
'text' => 'text_value',
'textarea' => 'text_value',
'price' => 'float_value',
'boolean' => 'boolean_value',
'select' => 'integer_value',
'multiselect' => 'text_value',
'checkbox' => 'text_value',
'email' => 'json_value',
'address' => 'json_value',
'phone' => 'json_value',
'lookup' => 'integer_value',
'datetime' => 'datetime_value',
'date' => 'date_value',
'file' => 'text_value',
'image' => 'text_value',
];
/**
* Get the attribute values that owns the entity.
*/
public function attribute_values()
{
return $this->morphMany(AttributeValueProxy::modelClass(), 'entity');
}
/**
* Get an attribute from the model.
*
* @param string $key
* @return mixed
*/
public function getAttribute($key)
{
if (! method_exists(static::class, $key) && ! isset($this->attributes[$key])) {
if (isset($this->id)) {
$this->attributes[$key] = '';
$attribute = app(AttributeRepository::class)->getAttributeByCode($key);
$this->attributes[$key] = $this->getCustomAttributeValue($attribute);
return $this->getAttributeValue($key);
}
}
return parent::getAttribute($key);
}
/**
* @return array
*/
public function attributesToArray()
{
$attributes = parent::attributesToArray();
$hiddenAttributes = $this->getHidden();
if (isset($this->id)) {
$customAttributes = $this->getCustomAttributes();
foreach ($customAttributes as $attribute) {
if (in_array($attribute->code, $hiddenAttributes) && isset($this->attributes[$attribute->code])) {
continue;
}
$attributes[$attribute->code] = $this->getCustomAttributeValue($attribute);
}
}
return $attributes;
}
/**
* Check in loaded family attributes.
*
* @return object
*/
public function getCustomAttributes()
{
static $attributes;
if ($attributes) {
return $attributes;
}
return $attributes = app(AttributeRepository::class)->where('entity_type', $this->getTable())->get();
}
/**
* Get an product attribute value.
*
* @return mixed
*/
public function getCustomAttributeValue($attribute)
{
if (! $attribute) {
return;
}
$attributeValue = $this->attribute_values->where('attribute_id', $attribute->id)->first();
return $attributeValue[self::$attributeTypeFields[$attribute->type]] ?? null;
}
/**
* Create a new instance of the given model.
*
* @param array $attributes
* @return Collection
*/
public function getLookUpAttributes($attributes)
{
$attributes = app(AttributeRepository::class)->scopeQuery(function ($query) use ($attributes) {
return $query->distinct()
->where('type', 'lookup')
->where('entity_type', request('entity_type'))
->whereIn('code', array_keys($attributes, '', false));
})->get();
return $attributes;
}
/**
* Create a new instance of the given model.
*
* @param array $attributes
* @param bool $exists
* @return static
*/
public function newInstance($attributes = [], $exists = false)
{
// $attributes = $this->getLookUpAttributes($attributes);
// Play with data here
return parent::newInstance($attributes, $exists);
}
/**
* Fill the model with an array of attributes.
*
* @return $this
*
* @throws \Illuminate\Database\Eloquent\MassAssignmentException
*/
public function fill(array $attributes)
{
// Play with data here
return parent::fill($attributes);
}
// Delete model's attribute values
public static function boot()
{
parent::boot();
static::deleting(function ($entity) {
$entity->attribute_values()->delete();
});
}
}