sarga/packages/Webkul/Attribute/src/Repositories/AttributeRepository.php

131 lines
3.3 KiB
PHP
Raw Normal View History

2018-07-17 13:28:34 +00:00
<?php
namespace Webkul\Attribute\Repositories;
use Webkul\Core\Eloquent\Repository;
use Webkul\Attribute\Repositories\AttributeOptionRepository;
use Illuminate\Container\Container as App;
/**
* Attribute Reposotory
*
* @author Jitendra Singh <jitendra@webkul.com>
* @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
*/
class AttributeRepository extends Repository
{
/**
* AttributeOptionRepository object
*
* @var array
*/
protected $attributeOption;
/**
* Create a new controller instance.
*
* @param Webkul\Attribute\Repositories\AttributeOptionRepository $attributeOption
* @return void
*/
public function __construct(AttributeOptionRepository $attributeOption, App $app)
{
$this->attributeOption = $attributeOption;
parent::__construct($app);
}
/**
* Specify Model class name
*
* @return mixed
*/
function model()
{
return 'Webkul\Attribute\Models\Attribute';
}
/**
* @param array $data
* @return mixed
*/
public function create(array $data)
{
2018-08-17 05:48:21 +00:00
$data = $this->validateUserInput($data);
2018-07-27 06:22:12 +00:00
$options = isset($data['options']) ? $data['options'] : [];
unset($data['options']);
2018-07-17 13:28:34 +00:00
$attribute = $this->model->create($data);
2018-07-27 06:22:12 +00:00
if(in_array($attribute->type, ['select', 'multiselect', 'checkbox']) && count($options)) {
foreach ($options as $option) {
2018-07-17 13:28:34 +00:00
$attribute->options()->create($option);
}
}
return $attribute;
}
/**
* @param array $data
* @param $id
* @param string $attribute
* @return mixed
*/
public function update(array $data, $id, $attribute = "id")
{
2018-08-17 05:48:21 +00:00
$data = $this->validateUserInput($data);
2018-07-17 13:28:34 +00:00
$attribute = $this->findOrFail($id);
$attribute->update($data);
$previousOptionIds = $attribute->options()->pluck('id');
2018-08-09 04:35:13 +00:00
if(in_array($attribute->type, ['select', 'multiselect', 'checkbox'])) {
2018-07-17 13:28:34 +00:00
if(isset($data['options'])) {
foreach ($data['options'] as $optionId => $optionInputs) {
if (str_contains($optionId, 'option_')) {
$attribute->options()->create($optionInputs);
} else {
2018-07-27 06:22:12 +00:00
if(is_numeric($index = $previousOptionIds->search($optionId))) {
2018-07-17 13:28:34 +00:00
$previousOptionIds->forget($index);
}
$this->attributeOption->update($optionInputs, $optionId);
}
}
}
}
foreach ($previousOptionIds as $optionId) {
$this->attributeOption->delete($optionId);
}
return $attribute;
}
2018-08-17 05:48:21 +00:00
/**
* @param array $data
* @return array
*/
public function validateUserInput($data)
{
if($data['is_configurable']) {
$data['value_per_channel'] = $data['value_per_locale'] = 0;
}
if(!in_array($data['type'], ['select', 'multiselect', 'price'])) {
$data['is_filterable'] = 0;
}
return $data;
}
/**
* @return array
*/
public function getFilterAttributes()
{
return $this->model->filterableAttributes()->get();
}
2018-07-17 13:28:34 +00:00
}