Skip to content

Commit

Permalink
[FIX] Refactor code.
Browse files Browse the repository at this point in the history
  • Loading branch information
Seiger committed Aug 9, 2024
1 parent 246f34e commit 237b4ba
Show file tree
Hide file tree
Showing 12 changed files with 402 additions and 170 deletions.
6 changes: 3 additions & 3 deletions composer.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "seiger/smultisite",
"license": "GPL-3.0",
"type": "EvolutionCMS-Plugin",
"type": "evolutioncms-plugin",
"description": "Evocms package Multisite Tools for Evolution CMS.",
"keywords": ["evocms", "evolution-cms", "multisite"],
"authors": [
Expand All @@ -11,7 +11,7 @@
}
],
"require": {
"php": "^8"
"php": "^8.1"
},
"autoload": {
"psr-4": {
Expand All @@ -31,4 +31,4 @@
"scripts": {
"post-autoload-dump": []
}
}
}
4 changes: 2 additions & 2 deletions lang/en/global.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,16 @@
'configure_icon' => 'fa fa-sliders',
'default_domain' => 'Default domain:',
'default_domain_help' => 'The domain name is configured in the Site System Configuration, Site tab. This domain will be used if the incoming request does not match any of the following.',
'description' => 'Setting up additional site domains.',
'domain' => 'Domain host:',
'domain_help' => 'Enter a domain host without protocol.',
'domain_on' => 'Enable domain:',
'domain_on_help' => 'If the domain is disabled, access to the pages of this domain will be prohibited.',
'description' => 'Setting up additional site domains.',
'empty_field' => 'the field must not be empty.',
'hide_from_tree' => 'Hide in the resource tree:',
'hide_from_tree_help' => 'If this box is checked, domain resources will not be displayed in the resource tree.',
'icon' => 'fa fa-dice-d20',
'must_be_dis-active' => 'to hide, the domain must be disabled.',
'not_saved' => 'Not saved.',
'title' => 'Multisite',
];
];
4 changes: 2 additions & 2 deletions lang/ru/global.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,16 @@
'configure_icon' => 'fa fa-sliders',
'default_domain' => 'Домен по умолчанию:',
'default_domain_help' => 'Название домена настраивается в Системной конфигурации сайта, таб Сайт. Этот домен будет задействован, если входной запрос не отвечает ни одному из тех, что приведены ниже.',
'description' => 'Настройка дополнительных доменов сайта.',
'domain' => 'Доменное имя:',
'domain_help' => 'Укажите доменное имя без протокола.',
'domain_on' => 'Включить домен:',
'domain_on_help' => 'Если домен выключен, то доступ к страницам этого домена будет запрещен.',
'description' => 'Настройка дополнительных доменов сайта.',
'empty_field' => 'поле не должно быть пустым.',
'hide_from_tree' => 'Спрятать в дереве ресурсов:',
'hide_from_tree_help' => 'Если это поле будет отмечено, то ресурсы домена не будут отражены в дереве ресурсов.',
'icon' => 'fa fa-dice-d20',
'must_be_dis-active' => 'чтобы спрятать, домен домен должен быть выключен.',
'not_saved' => 'Не сохранено.',
'title' => 'Мультисайт',
];
];
2 changes: 1 addition & 1 deletion lang/uk/global.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@
'configure_icon' => 'fa fa-sliders',
'default_domain' => 'Домен типово:',
'default_domain_help' => 'Назва домену налаштовується в Системній кофігурації сайту, таб Сайт. Цей домен буде задіяно, якщо вхідний запит не відповідає жодному з тих, що наведено нижче.',
'description' => 'Налаштування додаткових доменів сайту.',
'domain' => 'Доменне ім`я:',
'domain_help' => 'Вкажіть доменне ім`я без протоколу.',
'domain_on' => 'Ввімкнути домен:',
'domain_on_help' => 'Якщо домен вимкнено, то доступ до сторінок цього домену буде заборонено.',
'description' => 'Налаштування додаткових доменів сайту.',
'empty_field' => 'поле не має бути порожнім.',
'hide_from_tree' => 'Приховати в дереві ресурсів:',
'hide_from_tree_help' => 'Якщо це поле буде відмічено, то ресурси домену не буде відображено в дереві ресурсів.',
Expand Down
227 changes: 153 additions & 74 deletions src/Controllers/sMultisiteController.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,117 +17,196 @@ public function index()
return $this->view('index');
}

/**
* Update domain settings
*
* @return \Illuminate\Http\RedirectResponse
*/
public function update()
{
$refresh = false;
$newDomains = request()->input('new-domains', []);
$existingDomains = request()->input('domains', []);
$this->processNewDomains($newDomains);
$this->updateExistingDomains($existingDomains);
$_SESSION['sMultisite.refresh'] = true;
return header("Location: " . \Seiger\sMultisite\Facades\sMultisite::route('sMultisite.index'));
}

if (request()->has('new-domains') && is_array(request()->input('new-domains', [])) && count(request()->input('new-domains', []))) {
foreach (request()->input('new-domains', []) as $item) {
$item = is_array($item) ? implode('-', $item) : $item;
$item = trim($item, 'https://');
$item = trim($item, 'http://');
$item = trim($item, '/');
$find = sMultisite::whereDomain($item)->first();
if (!$find) {
// Base resource
$resource = new SiteContent();
$resource->pagetitle = $item;
$resource->content = 'https://'.$item;
$resource->type = 'reference';
$resource->parent = 0;
$resource->alias_visible = 0;
$resource->richtext = 0;
$resource->published = 1;
$resource->isfolder = 1;
$resource->hidemenu = 1;
$resource->save();

// Home resource
$homepage = new SiteContent();
$homepage->pagetitle = 'Homepage';
$homepage->published = 1;
$homepage->parent = $resource->id;
$homepage->save();

// Domain
$domain = new sMultisite();
$domain->domain = $item;
$domain->key = $this->validateKey($item);
$domain->resource = $resource->id;
$domain->site_start = $homepage->id;
$domain->error_page = $homepage->id;
$domain->unauthorized_page = $homepage->id;
$domain->save();
}
/**
* Process new domains and save them
*
* @param array $domains
* @return bool
*/
private function processNewDomains(array $domains): bool
{
$refresh = false;
foreach ($domains as $item) {
$item = $this->sanitizeDomain($item);
if (!$this->domainExists($item)) {
$this->createDomainResources($item);
}
}
return $refresh;
}

if (request()->has('domains') && is_array(request()->input('domains', [])) && count(request()->input('domains', []))) {
foreach (request()->input('domains', []) as $id => $item) {
if (is_array($item) && count($item)) {
$domain = sMultisite::find($id);
if ($domain) {
foreach ($item as $name => $value) {
$domain->{$name} = $value;
}
$domain->update();

if (is_array($domain->getChanges()) && isset($domain->getChanges()['hide_from_tree'])) {
$refresh = true;
}
}
/**
* Update existing domain settings
*
* @param array $domains
* @return bool
*/
private function updateExistingDomains(array $domains): bool
{
$refresh = false;
foreach ($domains as $id => $item) {
if (is_array($item) && $domain = sMultisite::find($id)) {
if ($item['key'] != 'default') {
$item['active'] = intval($item['active'] ?? 0);
$item['hide_from_tree'] = intval($item['hide_from_tree'] ?? 0);
}
$domain->update($item);
if (isset($domain->getChanges()['hide_from_tree'])) {
$refresh = true;
}
}
}
return $refresh;
}

if ($refresh) {
return header("Location: /".MGR_DIR."/index.php?a=7&r=10");
} else {
return back();
}
/**
* Create resources for a new domain
*
* @param string $item
*/
private function createDomainResources(string $item): void
{
$resource = new SiteContent();
$resource->fill([
'pagetitle' => $item,
'content' => 'https://' . $item,
'type' => 'reference',
'parent' => 0,
'alias_visible' => 0,
'richtext' => 0,
'published' => 1,
'isfolder' => 1,
'hidemenu' => 1,
]);
$resource->save();

$homepage = new SiteContent();
$homepage->fill([
'pagetitle' => 'Homepage',
'published' => 1,
'parent' => $resource->id,
]);
$homepage->save();

$domain = new sMultisite();
$domain->fill([
'domain' => $item,
'key' => $this->validateKey($item),
'resource' => $resource->id,
'site_name' => 'Evolution CMS website',
'site_start' => $homepage->id,
'error_page' => $homepage->id,
'unauthorized_page' => $homepage->id,
]);
$domain->save();
}

/**
* Check if a domain already exists
*
* @param string $item
* @return bool
*/
private function domainExists(string $item): bool
{
return sMultisite::whereDomain($item)->exists();
}

/**
* Sanitize domain input
*
* @param mixed $item
* @return string
*/
private function sanitizeDomain($item): string
{
// Convert array to string if needed
$item = is_array($item) ? implode('-', $item) : $item;

// Remove protocols and trailing slashes
$item = preg_replace(['/^(https?:\/\/)/'], '', $item);

return trim($item, '/');
}

/**
* Validate and generate a unique key for a domain
*
* @param string $string
* @param int $id
* @return string
*/
private function validateKey(string $string = '', int $id = 0): string
{
$alias = $this->generateAlias($string);
$existingAliases = sMultisite::where('s_multisites.id', '<>', $id)
->pluck('key')
->toArray();

return $this->resolveAliasConflict($alias, $existingAliases);
}

/**
* Alias validation
* Generate a slug-like alias from the domain string
*
* @param $data
* @param string $table
* @param string $string
* @return string
*/
private function validateKey($string = '', $id = 0): string
private function generateAlias(string $string): string
{
if (trim($string)) {
$alias = explode('.', $string);
// array_pop($string);
array_pop($alias); // Here we are passing the $alias array, not the $string
$alias = Str::slug(trim(implode('', $alias)));
} else {
$alias = $id;
array_pop($alias);
return Str::slug(trim(implode('', $alias)));
}
return '';
}

$aliases = sMultisite::where('s_multisites.id', '<>', $id)->get('key')->pluck('key')->toArray();

if (in_array($alias, $aliases)) {
/**
* Resolve alias conflicts by appending a numeric suffix
*
* @param string $alias
* @param array $existingAliases
* @return string
*/
private function resolveAliasConflict(string $alias, array $existingAliases): string
{
if (in_array($alias, $existingAliases)) {
$cnt = 1;
$tempAlias = $alias;
while (in_array($tempAlias, $aliases)) {
while (in_array($tempAlias, $existingAliases)) {
$tempAlias = $alias . $cnt;
$cnt++;
}
$alias = $tempAlias;
return $tempAlias;
}
return $alias;
}

/**
* Display render
* Render a view with optional data
*
* @param string $tpl
* @param array $data
* @return View
*/
public function view(string $tpl, array $data = [])
{
return View::make('sMultisite::'.$tpl, $data);
return View::make('sMultisite::' . $tpl, $data);
}
}
6 changes: 5 additions & 1 deletion src/Facades/sMultisite.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
/**
* Class sMultisite
*
* Facade for accessing the sMultisite service.
*
* @package Seiger\sMultisite
* @mixin \Seiger\sMultisite\sMultisite
*/
Expand All @@ -13,10 +15,12 @@ class sMultisite extends Facade
/**
* Get the registered name of the component.
*
* This method should return the name of the component being accessed by the facade.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'sMultisite';
}
}
}
Loading

0 comments on commit 237b4ba

Please sign in to comment.