$data['entity_type']];
if (isset($data['quick_add'])) {
$conditions['quick_add'] = 1;
}
$attributes = $this->attributeRepository->where($conditions)->get();
}
foreach ($attributes as $attribute) {
$typeColumn = $this->model::$attributeTypeFields[$attribute->type];
if ($attribute->type === 'boolean') {
$data[$attribute->code] = isset($data[$attribute->code]) && $data[$attribute->code] ? 1 : 0;
}
if (! array_key_exists($attribute->code, $data)) {
continue;
}
if ($attribute->type === 'price'
&& isset($data[$attribute->code])
&& $data[$attribute->code] === ''
) {
$data[$attribute->code] = null;
}
if ($attribute->type === 'date' && $data[$attribute->code] === '') {
$data[$attribute->code] = null;
}
if ($attribute->type === 'multiselect' || $attribute->type === 'checkbox') {
$data[$attribute->code] = implode(',', $data[$attribute->code]);
}
if ($attribute->type === 'email' || $attribute->type === 'phone') {
$data[$attribute->code] = $this->sanitizeEmailAndPhone($data[$attribute->code]);
}
if ($attribute->type === 'image' || $attribute->type === 'file') {
$data[$attribute->code] = $data[$attribute->code] instanceof UploadedFile
? $data[$attribute->code]->store($data['entity_type'].'/'.$data['entity_id'])
: null;
}
$attributeValue = $this->findOneWhere([
'entity_type' => $data['entity_type'],
'entity_id' => $data['entity_id'],
'attribute_id' => $attribute->id,
]);
if (! $attributeValue) {
$this->create([
'entity_type' => $data['entity_type'],
'entity_id' => $data['entity_id'],
'attribute_id' => $attribute->id,
$typeColumn => $data[$attribute->code],
]);
} else {
$this->update([
$typeColumn => $data[$attribute->code],
], $attributeValue->id);
if ($attribute->type == 'image' || $attribute->type == 'file') {
if ($attributeValue->text_value) {
Storage::delete($attributeValue->text_value);
}
}
}
}
}
/**
* Is value unique.
*
* @param int $entityId
* @param string $entityType
* @param Attribute $attribute
* @param string $value
* @return bool
*/
public function isValueUnique($entityId, $entityType, $attribute, $value)
{
$query = $this->resetScope()->model
->where('attribute_id', $attribute->id)
->where('entity_type', $entityType)
->where('entity_id', '!=', $entityId);
/**
* If the attribute type is email or phone, check the JSON value.
*/
if (in_array($attribute->type, ['email', 'phone'])) {
$query->whereJsonContains($this->model::$attributeTypeFields[$attribute->type], [['value' => $value]]);
} else {
$query->where($this->model::$attributeTypeFields[$attribute->type], $value);
}
return $query->get()->count() ? false : true;
}
/**
* Removed null values from email and phone fields.
*
* @param array $data
* @return array
*/
public function sanitizeEmailAndPhone($data)
{
foreach ($data as $key => $row) {
if (is_null($row['value'])) {
unset($data[$key]);
}
}
return $data;
}
/**
* Replace placeholders with values
*/
public function getAttributeLabel(mixed $value, mixed $attribute)
{
switch ($attribute?->type) {
case 'price':
$label = core()->formatBasePrice($value);
break;
case 'boolean':
$label = $value ? 'Yes' : 'No';
break;
case 'select':
case 'radio':
case 'lookup':
if ($attribute->lookup_type) {
$option = $this->attributeRepository->getLookUpEntity($attribute->lookup_type, $value);
} else {
$option = $attribute->options->where('id', $value)->first();
}
$label = $option?->name;
break;
case 'multiselect':
case 'checkbox':
if ($attribute->lookup_type) {
$options = $this->attributeRepository->getLookUpEntity($attribute->lookup_type, explode(',', $value));
} else {
$options = $attribute->options->whereIn('id', explode(',', $value));
}
$optionsLabels = [];
foreach ($options as $key => $option) {
$optionsLabels[] = $option->name;
}
$label = implode(', ', $optionsLabels);
break;
case 'email':
case 'phone':
if (! is_array($value)) {
break;
}
$optionsLabels = [];
foreach ($value as $item) {
$optionsLabels[] = $item['value'].' ('.$item['label'].')';
}
$label = implode(', ', $optionsLabels);
break;
case 'address':
if (
! $value
|| ! count(array_filter($value))
) {
break;
}
$label = $value['address'].'
'
.$value['postcode'].' '.$value['city'].'
'
.core()->state_name($value['state']).'
'
.core()->country_name($value['country']).'
';
break;
case 'date':
if ($value) {
$label = Carbon::parse($value)->format('D M d, Y');
} else {
$label = null;
}
break;
case 'datetime':
if ($value) {
$label = Carbon::parse($value)->format('D M d, Y H:i A');
} else {
$label = null;
}
break;
default:
if ($value instanceof Carbon) {
$label = $value->format('D M d, Y H:i A');
} else {
$label = $value;
}
break;
}
return $label ?? null;
}
}