add: full multi-tenancy control
This commit is contained in:
234
packages/Webkul/Core/src/Repositories/CoreConfigRepository.php
Executable file
234
packages/Webkul/Core/src/Repositories/CoreConfigRepository.php
Executable file
@@ -0,0 +1,234 @@
|
||||
<?php
|
||||
|
||||
namespace Webkul\Core\Repositories;
|
||||
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Support\Facades\Event;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Str;
|
||||
use Webkul\Core\Contracts\CoreConfig;
|
||||
use Webkul\Core\Eloquent\Repository;
|
||||
|
||||
class CoreConfigRepository extends Repository
|
||||
{
|
||||
/**
|
||||
* Specify model class name.
|
||||
*/
|
||||
public function model(): string
|
||||
{
|
||||
return CoreConfig::class;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the configuration title.
|
||||
*/
|
||||
protected function getTranslatedTitle(mixed $configuration): string
|
||||
{
|
||||
if (
|
||||
method_exists($configuration, 'getTitle')
|
||||
&& ! is_null($configuration->getTitle())
|
||||
) {
|
||||
return trans($configuration->getTitle());
|
||||
}
|
||||
|
||||
if (
|
||||
method_exists($configuration, 'getName')
|
||||
&& ! is_null($configuration->getName())
|
||||
) {
|
||||
return trans($configuration->getName());
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Get children and fields.
|
||||
*/
|
||||
protected function getChildrenAndFields(mixed $configuration, string $searchTerm, array $path, array &$results): void
|
||||
{
|
||||
if (
|
||||
method_exists($configuration, 'getChildren')
|
||||
|| method_exists($configuration, 'getFields')
|
||||
) {
|
||||
$children = $configuration->haveChildren()
|
||||
? $configuration->getChildren()
|
||||
: $configuration->getFields();
|
||||
|
||||
$tempPath = array_merge($path, [[
|
||||
'key' => $configuration->getKey() ?? null,
|
||||
'title' => $this->getTranslatedTitle($configuration),
|
||||
]]);
|
||||
|
||||
$results = array_merge($results, $this->search($children, $searchTerm, $tempPath));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Search configuration.
|
||||
*
|
||||
* @param array $items
|
||||
*/
|
||||
public function search(Collection $items, string $searchTerm, array $path = []): array
|
||||
{
|
||||
$results = [];
|
||||
|
||||
foreach ($items as $configuration) {
|
||||
$title = $this->getTranslatedTitle($configuration);
|
||||
|
||||
if (
|
||||
stripos($title, $searchTerm) !== false
|
||||
&& count($path)
|
||||
) {
|
||||
$queryParam = $path[1]['key'] ?? $configuration->getKey();
|
||||
|
||||
$results[] = [
|
||||
'title' => implode(' > ', [...Arr::pluck($path, 'title'), $title]),
|
||||
'url' => route('admin.configuration.index', Str::replace('.', '/', $queryParam)),
|
||||
];
|
||||
}
|
||||
|
||||
$this->getChildrenAndFields($configuration, $searchTerm, $path, $results);
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create core configuration.
|
||||
*/
|
||||
public function create(array $data): void
|
||||
{
|
||||
unset($data['_token']);
|
||||
|
||||
$preparedData = [];
|
||||
|
||||
foreach ($data as $method => $fieldData) {
|
||||
$recursiveData = $this->recursiveArray($fieldData, $method);
|
||||
|
||||
foreach ($recursiveData as $fieldName => $value) {
|
||||
if (
|
||||
is_array($value)
|
||||
&& isset($value['delete'])
|
||||
) {
|
||||
$coreConfigValues = $this->model->where('code', $fieldName)->get();
|
||||
|
||||
if ($coreConfigValues->isNotEmpty()) {
|
||||
foreach ($coreConfigValues as $coreConfig) {
|
||||
if (! empty($coreConfig['value'])) {
|
||||
Storage::delete($coreConfig['value']);
|
||||
}
|
||||
|
||||
parent::delete($coreConfig['id']);
|
||||
}
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($recursiveData as $fieldName => $value) {
|
||||
if (is_array($value)) {
|
||||
foreach ($value as $key => $val) {
|
||||
$fieldNameWithKey = $fieldName.'.'.$key;
|
||||
|
||||
$coreConfigValues = $this->model->where('code', $fieldNameWithKey)->get();
|
||||
|
||||
if (request()->hasFile($fieldNameWithKey)) {
|
||||
$val = request()->file($fieldNameWithKey)->store('configuration');
|
||||
}
|
||||
|
||||
if ($coreConfigValues->isNotEmpty()) {
|
||||
foreach ($coreConfigValues as $coreConfig) {
|
||||
if (request()->hasFile($fieldNameWithKey)) {
|
||||
Storage::delete($coreConfig['value']);
|
||||
}
|
||||
|
||||
parent::update(['code' => $fieldNameWithKey, 'value' => $val], $coreConfig->id);
|
||||
}
|
||||
} else {
|
||||
parent::create(['code' => $fieldNameWithKey, 'value' => $val]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (request()->hasFile($fieldName)) {
|
||||
$value = request()->file($fieldName)->store('configuration');
|
||||
}
|
||||
|
||||
$preparedData[] = [
|
||||
'code' => $fieldName,
|
||||
'value' => $value,
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (! empty($preparedData)) {
|
||||
foreach ($preparedData as $dataItem) {
|
||||
$coreConfigValues = $this->model->where('code', $dataItem['code'])->get();
|
||||
|
||||
if ($coreConfigValues->isNotEmpty()) {
|
||||
foreach ($coreConfigValues as $coreConfig) {
|
||||
parent::update($dataItem, $coreConfig->id);
|
||||
}
|
||||
} else {
|
||||
parent::create($dataItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Event::dispatch('core.configuration.save.after');
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursive array.
|
||||
*/
|
||||
public function recursiveArray(array $formData, string $method): array
|
||||
{
|
||||
static $data = [];
|
||||
|
||||
static $recursiveArrayData = [];
|
||||
|
||||
foreach ($formData as $form => $formValue) {
|
||||
$value = $method.'.'.$form;
|
||||
|
||||
if (is_array($formValue)) {
|
||||
$dim = $this->countDim($formValue);
|
||||
|
||||
if ($dim > 1) {
|
||||
$this->recursiveArray($formValue, $value);
|
||||
} elseif ($dim == 1) {
|
||||
$data[$value] = $formValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($data as $key => $value) {
|
||||
$field = core()->getConfigField($key);
|
||||
|
||||
if ($field) {
|
||||
$recursiveArrayData[$key] = $value;
|
||||
} else {
|
||||
foreach ($value as $key1 => $val) {
|
||||
$recursiveArrayData[$key.'.'.$key1] = $val;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $recursiveArrayData;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return dimension of the array.
|
||||
*/
|
||||
public function countDim(array|string $array): int
|
||||
{
|
||||
if (is_array(reset($array))) {
|
||||
$return = $this->countDim(reset($array)) + 1;
|
||||
} else {
|
||||
$return = 1;
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
}
|
||||
21
packages/Webkul/Core/src/Repositories/CountryRepository.php
Executable file
21
packages/Webkul/Core/src/Repositories/CountryRepository.php
Executable file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace Webkul\Core\Repositories;
|
||||
|
||||
use Prettus\Repository\Traits\CacheableRepository;
|
||||
use Webkul\Core\Eloquent\Repository;
|
||||
|
||||
class CountryRepository extends Repository
|
||||
{
|
||||
use CacheableRepository;
|
||||
|
||||
/**
|
||||
* Specify Model class name
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function model()
|
||||
{
|
||||
return 'Webkul\Core\Contracts\Country';
|
||||
}
|
||||
}
|
||||
21
packages/Webkul/Core/src/Repositories/CountryStateRepository.php
Executable file
21
packages/Webkul/Core/src/Repositories/CountryStateRepository.php
Executable file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace Webkul\Core\Repositories;
|
||||
|
||||
use Prettus\Repository\Traits\CacheableRepository;
|
||||
use Webkul\Core\Eloquent\Repository;
|
||||
|
||||
class CountryStateRepository extends Repository
|
||||
{
|
||||
use CacheableRepository;
|
||||
|
||||
/**
|
||||
* Specify Model class name
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function model()
|
||||
{
|
||||
return 'Webkul\Core\Contracts\CountryState';
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user