mirror of
https://github.com/slawkens/myaac.git
synced 2025-09-14 20:43:34 +02:00
Compare commits
54 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
50d649dbde | ||
![]() |
6c568fd36a | ||
![]() |
fa6b6aa153 | ||
![]() |
ae639d65b0 | ||
![]() |
35e2483de8 | ||
![]() |
bbf923e1a6 | ||
![]() |
211b6ea698 | ||
![]() |
6d156ae080 | ||
![]() |
a5b3940e59 | ||
![]() |
dbf73d0b61 | ||
![]() |
65696f63e3 | ||
![]() |
6341093578 | ||
![]() |
d25c71857f | ||
![]() |
7dcb5c4a1f | ||
![]() |
ff1723b756 | ||
![]() |
1a5771ad51 | ||
![]() |
6fac883659 | ||
![]() |
4a6896b446 | ||
![]() |
0852fba6f0 | ||
![]() |
9239a4f419 | ||
![]() |
00fe1adc15 | ||
![]() |
c2f55791c0 | ||
![]() |
464492d826 | ||
![]() |
887b5068ad | ||
![]() |
4c5cc8b573 | ||
![]() |
529bdcf016 | ||
![]() |
3e3f4bb5a5 | ||
![]() |
aa52df6e2e | ||
![]() |
3b31915c22 | ||
![]() |
1c6cda4df9 | ||
![]() |
cf51f7aa8d | ||
![]() |
ed89b99cd1 | ||
![]() |
9d7fc98e1e | ||
![]() |
f646856e20 | ||
![]() |
f97f8cbe87 | ||
![]() |
3da3e62c5b | ||
![]() |
d5dd7297b5 | ||
![]() |
73de93a561 | ||
![]() |
ae1161d770 | ||
![]() |
4455964db4 | ||
![]() |
84870dbf2d | ||
![]() |
329153fda6 | ||
![]() |
4b6024dc45 | ||
![]() |
28fef952f8 | ||
![]() |
4fda4f643b | ||
![]() |
19686725dc | ||
![]() |
a73fb1003e | ||
![]() |
b46ddb43d0 | ||
![]() |
de468a8dcd | ||
![]() |
ea51ad27c3 | ||
![]() |
d2a4748a59 | ||
![]() |
a1ed209591 | ||
![]() |
34321613d6 | ||
![]() |
19b290feb7 |
6
.github/workflows/cypress.yml
vendored
6
.github/workflows/cypress.yml
vendored
@@ -1,9 +1,9 @@
|
||||
name: Cypress
|
||||
on:
|
||||
pull_request:
|
||||
branches: [master]
|
||||
branches: [main]
|
||||
push:
|
||||
branches: [master]
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
cypress:
|
||||
@@ -35,7 +35,7 @@ jobs:
|
||||
- name: Checkout MyAAC
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: master
|
||||
ref: main
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
|
4
.github/workflows/phplint.yml
vendored
4
.github/workflows/phplint.yml
vendored
@@ -1,9 +1,9 @@
|
||||
name: PHP Linting
|
||||
on:
|
||||
pull_request:
|
||||
branches: [master]
|
||||
branches: [main]
|
||||
push:
|
||||
branches: [master]
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
phplint:
|
||||
|
4
.github/workflows/phpstan.yml
vendored
4
.github/workflows/phpstan.yml
vendored
@@ -2,9 +2,9 @@ name: "PHPStan"
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [master]
|
||||
branches: [main]
|
||||
push:
|
||||
branches: [master]
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
tests:
|
||||
|
@@ -1,5 +1,65 @@
|
||||
# Changelog
|
||||
|
||||
## [1.3.3 - 04.04.2025]
|
||||
|
||||
### Fixed
|
||||
* Fix uninstall plugin when plugin is disabled (https://github.com/slawkens/myaac/commit/6c568fd36a271270684fc412ccd556b230273a6d)
|
||||
|
||||
### Changed
|
||||
* Display more useful info when error parsing config.lua (https://github.com/slawkens/myaac/commit/fa6b6aa153ffc131e0d1631a4dcd9012a5850c2e)
|
||||
|
||||
### Other
|
||||
* Small adjustments (https://github.com/slawkens/myaac/commit/35e2483de86e295bdf089cceffa25842eeb2e34c, https://github.com/slawkens/myaac/commit/ae639d65b0bfa491e747e907e2ebc77f83f47981)
|
||||
|
||||
## [1.3.2 - 01.04.2025]
|
||||
|
||||
### Fixed
|
||||
* Fix debugBar/admin panel menu when using custom base_dir (https://github.com/slawkens/myaac/commit/65696f63e3aac02ff952ea81279e7cb2fa7570fb)
|
||||
|
||||
### Changed
|
||||
* Settings: Show/hide IP Ban Protection options depending on the value (enabled/disabled) (https://github.com/slawkens/myaac/commit/dbf73d0b61b45601ae95e51b23c051c2704169c5)
|
||||
* Do not require init.php in cache:clear command (https://github.com/slawkens/myaac/commit/d25c71857f767834239bbffacd00fdc671adb157)
|
||||
|
||||
## [1.3.1 - 19.03.2025]
|
||||
|
||||
### Fixed
|
||||
* Fixed migrate:run command (https://github.com/slawkens/myaac/commit/1a5771ad51e595fe13368a0721b059c4ecefb17d)
|
||||
|
||||
### Changed
|
||||
* Small adjustments (https://github.com/slawkens/myaac/commit/6fac883659f581baac1361826d046410156f1e58, https://github.com/slawkens/myaac/commit/4a6896b4469968b9904292734cf6c14ba5eeef14)
|
||||
|
||||
## [1.3 - 10.03.2025]
|
||||
|
||||
### Changed
|
||||
* Use latest outfit-images host from @gesior (https://github.com/slawkens/myaac/commit/529bdcf016dd0f9dffbc34d81f99a046a9ddb70d)
|
||||
* Change monster link to $_GET ?name= (https://github.com/slawkens/myaac/commit/4c5cc8b573b2b3e7ec00a22b7ede30a68083a924)
|
||||
|
||||
### Fixed
|
||||
* Fixed house links (https://github.com/slawkens/myaac/commit/887b5068ad11c4cdab614afd34525caba785ce13)
|
||||
* Fixed long title on headline.php (https://github.com/slawkens/myaac/commit/3e3f4bb5a514158ec8777684ca6c7f1c2a37bed5)
|
||||
* Fixed menu colors once again, plus add !important tag (https://github.com/slawkens/myaac/commit/aa52df6e2ec92cafc25b655ae907bf2e1746d9cc)
|
||||
* Fix: add possibility to remove all menu items in admin panel (https://github.com/slawkens/myaac/commit/00fe1adc15ea7646596d755f6e6e1f7854ffc1d5, https://github.com/slawkens/myaac/commit/9239a4f4198c3ad260802ac3b47e9c41b80b754e)
|
||||
|
||||
## [1.2 - 09.02.2025]
|
||||
|
||||
### Added
|
||||
* Twig session(key) function + reworked session functions to accept multi-array like in Laravel (https://github.com/slawkens/myaac/commit/b46ddb43d03ef7e5fc34e555e92e856bdc905691)
|
||||
* add template_name to twig variables (https://github.com/slawkens/myaac/commit/ae1161d77050bda181802b4496c9de920a7bb1bc)
|
||||
* add HOOK_INIT, executed just after $hooks are loaded (https://github.com/slawkens/myaac/commit/19686725dc810f63a07f049f82c66cf336d90ca6)
|
||||
|
||||
### Changed
|
||||
* settings: password input hide/show, enable Save button only if changes has been made, save settings in transaction (https://github.com/slawkens/myaac/commit/4fda4f643b60a151179e5dd4f04912fb2618d98f, https://github.com/slawkens/myaac/commit/28fef952f857b79d64bc7495ffa5e1999e68e192, https://github.com/slawkens/myaac/commit/4b6024dc451accadb6c469fa282a9a764c1c0a81)
|
||||
* rework menus: Different categories can have different colors + Option to reset menus (https://github.com/slawkens/myaac/commit/73de93a561f6b13111e019075724357d8a617249, https://github.com/slawkens/myaac/commit/3da3e62c5b12390d75de9b3320729bcca6e0b458)
|
||||
|
||||
### Fixed
|
||||
* highscores: Fix online status + vocation for TFS 0.x (https://github.com/slawkens/myaac/commit/ea51ad27c38be88d86514cb979bb394fcfbef1f0)
|
||||
* clear cache button in admin bar needed to be clicked twice until it worked (https://github.com/slawkens/myaac/commit/ea51ad27c38be88d86514cb979bb394fcfbef1f0)
|
||||
* HOOK_STARTUP location (https://github.com/slawkens/myaac/commit/a73fb1003ee3f812cf182d1834d65f08e6f60d1f)
|
||||
* if vocation name has more words (https://github.com/slawkens/myaac/commit/9d7fc98e1e0a96b59ecc1a7c39800a64445db364)
|
||||
|
||||
### Updated
|
||||
* Bump twig/twig from 3.18.0 to 3.19.0 (#284)
|
||||
|
||||
## [1.1 - 27.01.2025]
|
||||
|
||||
### Changed
|
||||
@@ -10,7 +70,7 @@
|
||||
|
||||
### Fixed
|
||||
* general fixes in the tibiacom template menus, better support for custom menus
|
||||
* make functions_custom.php optional
|
||||
* make functions_custom.php optional (https://github.com/slawkens/myaac/commit/dc2b5afd9980984e2b259c9fc99f2ade46f70a5a)
|
||||
* error in CLI, where BASE_URL is not defined (https://github.com/slawkens/myaac/commit/4d749b881582f64b5a46196dbbb5ee8097127f03)
|
||||
* hook ACCOUNT_LOGIN_BEFORE_ACCOUNT location (https://github.com/slawkens/myaac/commit/669c447fca8643ce56d9ef8c1374ec647c780998)
|
||||
|
2
CREDITS
2
CREDITS
@@ -1,3 +1,3 @@
|
||||
* Gesior.pl (2007 - 2008)
|
||||
* Slawkens (2009 - 2023)
|
||||
* Slawkens (2009 - 2025)
|
||||
* Contributors listed in CONTRIBUTORS.txt
|
||||
|
12
README.md
12
README.md
@@ -10,12 +10,12 @@ Official website: https://my-aac.org
|
||||
[](https://discord.gg/2J39Wus)
|
||||
[](https://github.com/slawkens/myaac/issues?q=is%3Aissue+is%3Aclosed)
|
||||
|
||||
| Version | Status | Branch | Requirements |
|
||||
|:--------|:-----------------------|:--------|:---------------|
|
||||
| **1.x** | **Active development** | develop | **PHP >= 8.1** |
|
||||
| 0.9.x | Not developed anymore | 0.9 | PHP >= 7.2.5 |
|
||||
| 0.8.x | Active support | master | PHP >= 7.2.5 |
|
||||
| 0.7.x | End Of Life | 0.7 | PHP >= 5.3.3 |
|
||||
| Version | Status | Branch | Requirements |
|
||||
|:--------|:-----------------------|:-------|:---------------|
|
||||
| **1.x** | **Active development** | master | **PHP >= 8.1** |
|
||||
| 0.9.x | Not developed anymore | 0.9 | PHP >= 7.2.5 |
|
||||
| 0.8.x | Active support | 0.8 | PHP >= 7.2.5 |
|
||||
| 0.7.x | End Of Life | 0.7 | PHP >= 5.3.3 |
|
||||
|
||||
### Requirements
|
||||
|
||||
|
@@ -7,7 +7,7 @@ $hooks->register('debugbar_admin_head_end', HOOK_ADMIN_HEAD_END, function ($para
|
||||
return;
|
||||
}
|
||||
|
||||
$debugBarRenderer = $debugBar->getJavascriptRenderer();
|
||||
$debugBarRenderer = $debugBar->getJavascriptRenderer(BASE_URL . 'vendor/maximebf/debugbar/src/DebugBar/Resources/');
|
||||
echo $debugBarRenderer->renderHead();
|
||||
});
|
||||
$hooks->register('debugbar_admin_body_end', HOOK_ADMIN_BODY_END, function ($params) {
|
||||
@@ -17,6 +17,6 @@ $hooks->register('debugbar_admin_body_end', HOOK_ADMIN_BODY_END, function ($para
|
||||
return;
|
||||
}
|
||||
|
||||
$debugBarRenderer = $debugBar->getJavascriptRenderer();
|
||||
$debugBarRenderer = $debugBar->getJavascriptRenderer(BASE_URL . 'vendor/maximebf/debugbar/src/DebugBar/Resources/');
|
||||
echo $debugBarRenderer->render();
|
||||
});
|
||||
|
@@ -27,11 +27,11 @@ $pluginThemes = Plugins::getThemes();
|
||||
if (isset($_POST['template'])) {
|
||||
$template = $_POST['template'];
|
||||
|
||||
if (isset($_POST['menu'])) {
|
||||
$post_menu = $_POST['menu'];
|
||||
$post_menu_link = $_POST['menu_link'];
|
||||
$post_menu_blank = $_POST['menu_blank'];
|
||||
$post_menu_color = $_POST['menu_color'];
|
||||
if (isset($_POST['save'])) {
|
||||
$post_menu = $_POST['menu'] ?? [];
|
||||
$post_menu_link = $_POST['menu_link'] ?? [];
|
||||
$post_menu_blank = $_POST['menu_blank'] ?? [];
|
||||
$post_menu_color = $_POST['menu_color'] ?? [];
|
||||
if (count($post_menu) != count($post_menu_link)) {
|
||||
echo 'Menu count is not equal menu links. Something went wrong when sending form.';
|
||||
return;
|
||||
@@ -59,11 +59,7 @@ if (isset($_POST['template'])) {
|
||||
}
|
||||
}
|
||||
|
||||
$cache = Cache::getInstance();
|
||||
if ($cache->enabled()) {
|
||||
$cache->delete('template_menus');
|
||||
}
|
||||
|
||||
onTemplateMenusChange();
|
||||
success('Saved at ' . date('H:i'));
|
||||
}
|
||||
|
||||
@@ -82,38 +78,48 @@ if (isset($_POST['template'])) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (isset($_GET['reset_colors'])) {
|
||||
if (isset($config['menu_default_color'])) {
|
||||
Menu::where('template', $template)->update(['color' => str_replace('#', '', $config['menu_default_color'])]);
|
||||
success('Colors has been reset.');
|
||||
}
|
||||
else {
|
||||
warning('There is no default color defined, cannot reset colors.');
|
||||
}
|
||||
}
|
||||
|
||||
if (!isset($config['menu_categories'])) {
|
||||
echo "No menu categories set in template config.php.<br/>This template doesn't support dynamic menus.";
|
||||
return;
|
||||
}
|
||||
|
||||
if (isset($_GET['reset_colors'])) {
|
||||
foreach ($config['menu_categories'] as $id => $options) {
|
||||
$color = $options['default_links_color'] ?? ($config['menu_default_links_color'] ?? ($config['menu_default_color'] ?? '#ffffff'));
|
||||
Menu::where('template', $template)->where('category', $id)->update(['color' => str_replace('#', '', $color)]);
|
||||
}
|
||||
|
||||
onTemplateMenusChange();
|
||||
success('Colors has been reset at ' . date('H:i'));
|
||||
}
|
||||
|
||||
if (isset($_GET['reset_menus'])) {
|
||||
$configMenus = config('menus');
|
||||
if (isset($configMenus)) {
|
||||
Plugins::installMenus($template, config('menus'), true);
|
||||
|
||||
onTemplateMenusChange();
|
||||
success('Menus has been reset at ' . date('H:i'));
|
||||
}
|
||||
else {
|
||||
error("This template don't support reinstalling menus.");
|
||||
}
|
||||
}
|
||||
|
||||
$title = 'Menus - ' . $template;
|
||||
|
||||
$canResetColors = isset($config['menu_default_color']) || isset($config['menu_default_links_color']);
|
||||
foreach ($config['menu_categories'] as $id => $options) {
|
||||
if (isset($options['default_links_color'])) {
|
||||
$canResetColors = true;
|
||||
}
|
||||
}
|
||||
|
||||
$twig->display('admin.menus.header.html.twig', [
|
||||
'template' => $template,
|
||||
'canResetColors' => $canResetColors
|
||||
]);
|
||||
?>
|
||||
<div align="center" class="text-center">
|
||||
<p class="note">You are editing: <?= $template ?><br/><br/>
|
||||
Hint: You can drag menu items.<br/>
|
||||
Hint: Add links to external sites using: <b>http://</b> or <b>https://</b> prefix.<br/>
|
||||
Not all templates support blank and colorful links.
|
||||
</p>
|
||||
<?php if (isset($config['menu_default_color'])) {?>
|
||||
<form method="post" action="?p=menus&reset_colors" onsubmit="return confirm('Do you really want to reset colors?');">
|
||||
<?php csrf(); ?>
|
||||
<input type="hidden" name="template" value="<?php echo $template ?>"/>
|
||||
<button type="submit" class="btn btn-danger">Reset Colors to default</button>
|
||||
</form>
|
||||
<br/>
|
||||
<?php } ?>
|
||||
</div>
|
||||
<?php
|
||||
$menus = Menu::query()
|
||||
->select('name', 'link', 'blank', 'color', 'category', 'ordering')
|
||||
@@ -129,7 +135,7 @@ if (isset($_POST['template'])) {
|
||||
<form method="post" id="menus-form" action="?p=menus">
|
||||
<?php csrf(); ?>
|
||||
<input type="hidden" name="template" value="<?php echo $template ?>"/>
|
||||
<button type="submit" class="btn btn-info">Save</button><br/><br/>
|
||||
<button type="submit" name="save" class="btn btn-info">Save</button><br/><br/>
|
||||
<div class="row">
|
||||
<?php foreach ($config['menu_categories'] as $id => $cat): ?>
|
||||
<div class="col-md-12 col-lg-6">
|
||||
@@ -143,12 +149,13 @@ if (isset($_POST['template'])) {
|
||||
if (isset($menus[$id])) {
|
||||
$i = 0;
|
||||
foreach ($menus[$id] as $menu):
|
||||
$color = (empty($menu['color']) ? ($cat['default_links_color'] ?? ($config['menu_default_links_color'] ?? ($config['menu_default_color'] ?? '#ffffff'))) : '#' . $menu['color']);
|
||||
?>
|
||||
<li class="ui-state-default" id="list-<?php echo $id ?>-<?php echo $i ?>"><label>Name:</label> <input type="text" name="menu[<?php echo $id ?>][]" value="<?php echo escapeHtml($menu['name']); ?>"/>
|
||||
<label>Link:</label> <input type="text" name="menu_link[<?php echo $id ?>][]" value="<?php echo $menu['link'] ?>"/>
|
||||
<input type="hidden" name="menu_blank[<?php echo $id ?>][]" value="0"/>
|
||||
<label><input class="blank-checkbox" type="checkbox" <?php echo($menu['blank'] == 1 ? 'checked' : '') ?>/><span title="Open in New Window">New Window</span></label>
|
||||
<input class="color-picker" type="text" name="menu_color[<?php echo $id ?>][]" value="<?php echo (empty($menu['color']) ? ($config['menu_default_color'] ?? '#ffffff') : $menu['color']); ?>"/>
|
||||
<input class="color-picker" type="text" name="menu_color[<?php echo $id ?>][]" value="<?php echo $color; ?>"/>
|
||||
<a class="remove-button" id="remove-button-<?php echo $id ?>-<?php echo $i ?>"><i class="fas fa-trash"></a></i></li>
|
||||
<?php $i++; $last_id[$id] = $i;
|
||||
endforeach;
|
||||
@@ -161,7 +168,7 @@ if (isset($_POST['template'])) {
|
||||
</div>
|
||||
<div class="row pb-2">
|
||||
<div class="col-md-12">
|
||||
<button type="submit" class="btn btn-info">Save</button>
|
||||
<button type="submit" name="save" class="btn btn-info">Save</button>
|
||||
<?php
|
||||
echo '<button type="button" class="btn btn-danger float-right" value="Cancel" onclick="window.location = \'' . ADMIN_URL . '?p=menus\';"><i class="fas fa-cancel"></i> Cancel</button>';
|
||||
?>
|
||||
@@ -172,7 +179,6 @@ if (isset($_POST['template'])) {
|
||||
$twig->display('admin.menus.js.html.twig', array(
|
||||
'menus' => $menus,
|
||||
'last_id' => $last_id,
|
||||
'menu_default_color' => $config['menu_default_color'] ?? '#ffffff'
|
||||
));
|
||||
?>
|
||||
<?php
|
||||
@@ -194,3 +200,11 @@ if (isset($_POST['template'])) {
|
||||
'templates' => $templates
|
||||
));
|
||||
}
|
||||
|
||||
function onTemplateMenusChange(): void
|
||||
{
|
||||
$cache = Cache::getInstance();
|
||||
if ($cache->enabled()) {
|
||||
$cache->delete('template_menus');
|
||||
}
|
||||
}
|
||||
|
@@ -26,7 +26,7 @@
|
||||
if (version_compare(phpversion(), '8.1', '<')) die('PHP version 8.1 or higher is required.');
|
||||
|
||||
const MYAAC = true;
|
||||
const MYAAC_VERSION = '1.1';
|
||||
const MYAAC_VERSION = '1.3.3';
|
||||
const DATABASE_VERSION = 43;
|
||||
const TABLE_PREFIX = 'myaac_';
|
||||
define('START_TIME', microtime(true));
|
||||
|
18
composer.lock
generated
18
composer.lock
generated
@@ -2637,16 +2637,16 @@
|
||||
},
|
||||
{
|
||||
"name": "twig/twig",
|
||||
"version": "v3.18.0",
|
||||
"version": "v3.19.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/twigphp/Twig.git",
|
||||
"reference": "acffa88cc2b40dbe42eaf3a5025d6c0d4600cc50"
|
||||
"reference": "d4f8c2b86374f08efc859323dbcd95c590f7124e"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/twigphp/Twig/zipball/acffa88cc2b40dbe42eaf3a5025d6c0d4600cc50",
|
||||
"reference": "acffa88cc2b40dbe42eaf3a5025d6c0d4600cc50",
|
||||
"url": "https://api.github.com/repos/twigphp/Twig/zipball/d4f8c2b86374f08efc859323dbcd95c590f7124e",
|
||||
"reference": "d4f8c2b86374f08efc859323dbcd95c590f7124e",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -2701,7 +2701,7 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/twigphp/Twig/issues",
|
||||
"source": "https://github.com/twigphp/Twig/tree/v3.18.0"
|
||||
"source": "https://github.com/twigphp/Twig/tree/v3.19.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -2713,7 +2713,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-12-29T10:51:50+00:00"
|
||||
"time": "2025-01-29T07:06:14+00:00"
|
||||
},
|
||||
{
|
||||
"name": "voku/portable-ascii",
|
||||
@@ -2910,7 +2910,7 @@
|
||||
],
|
||||
"aliases": [],
|
||||
"minimum-stability": "stable",
|
||||
"stability-flags": {},
|
||||
"stability-flags": [],
|
||||
"prefer-stable": false,
|
||||
"prefer-lowest": false,
|
||||
"platform": {
|
||||
@@ -2921,6 +2921,6 @@
|
||||
"ext-xml": "*",
|
||||
"ext-dom": "*"
|
||||
},
|
||||
"platform-dev": {},
|
||||
"plugin-api-version": "2.6.0"
|
||||
"platform-dev": [],
|
||||
"plugin-api-version": "2.3.0"
|
||||
}
|
||||
|
@@ -31,11 +31,11 @@ require_once 'common.php';
|
||||
require_once SYSTEM . 'functions.php';
|
||||
|
||||
$uri = $_SERVER['REQUEST_URI'];
|
||||
if(false !== strpos($uri, 'index.php')) {
|
||||
if(str_contains($uri, 'index.php')) {
|
||||
$uri = str_replace_first('/index.php', '', $uri);
|
||||
}
|
||||
|
||||
if(0 === strpos($uri, '/')) {
|
||||
if(str_starts_with($uri, '/')) {
|
||||
$uri = str_replace_first('/', '', $uri);
|
||||
}
|
||||
|
||||
@@ -76,6 +76,8 @@ require_once SYSTEM . 'status.php';
|
||||
$twig->addGlobal('config', $config);
|
||||
$twig->addGlobal('status', $status);
|
||||
|
||||
$hooks->trigger(HOOK_STARTUP);
|
||||
|
||||
// backward support for gesior
|
||||
if(setting('core.backward_support')) {
|
||||
define('INITIALIZED', true);
|
||||
@@ -117,8 +119,6 @@ if(setting('core.backward_support')) {
|
||||
|
||||
require_once SYSTEM . 'router.php';
|
||||
|
||||
$hooks->trigger(HOOK_STARTUP);
|
||||
|
||||
// anonymous usage statistics
|
||||
// sent only when user agrees
|
||||
if(setting('core.anonymous_usage_statistics')) {
|
||||
|
@@ -1,6 +1,6 @@
|
||||
server {
|
||||
listen 80;
|
||||
root /home/otserv/www/public;
|
||||
root /var/www/html;
|
||||
index index.php;
|
||||
server_name your-domain.com;
|
||||
|
||||
|
@@ -22,7 +22,7 @@ if [ $1 = "prepare" ]; then
|
||||
mkdir -p tmp
|
||||
|
||||
# get myaac from git archive
|
||||
git archive --format zip --output tmp/myaac.zip master
|
||||
git archive --format zip --output tmp/myaac.zip main
|
||||
|
||||
cd tmp/ || exit
|
||||
|
||||
|
@@ -121,7 +121,7 @@ function getPlayerLink($name, $generate = true, bool $colored = false): string
|
||||
|
||||
function getMonsterLink($name, $generate = true): string
|
||||
{
|
||||
$url = BASE_URL . (setting('core.friendly_urls') ? '' : 'index.php/') . 'monsters/' . urlencode($name);
|
||||
$url = BASE_URL . (setting('core.friendly_urls') ? '' : 'index.php/') . 'monsters?name=' . urlencode($name);
|
||||
|
||||
if(!$generate) return $url;
|
||||
return generateLink($url, $name);
|
||||
@@ -129,16 +129,14 @@ function getMonsterLink($name, $generate = true): string
|
||||
|
||||
function getHouseLink($name, $generate = true): string
|
||||
{
|
||||
if(is_numeric($name))
|
||||
{
|
||||
if(is_numeric($name)) {
|
||||
$house = House::find(intval($name), ['name']);
|
||||
if ($house) {
|
||||
$name = $house->name;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$url = BASE_URL . (setting('core.friendly_urls') ? '' : 'index.php/') . 'houses/' . urlencode($name);
|
||||
$url = BASE_URL . (setting('core.friendly_urls') ? '' : 'index.php/') . 'houses?name=' . urlencode($name);
|
||||
|
||||
if(!$generate) return $url;
|
||||
return generateLink($url, $name);
|
||||
@@ -984,31 +982,29 @@ function load_config_lua($filename)
|
||||
continue;
|
||||
}
|
||||
$tmp_exp = explode('=', $line, 2);
|
||||
if(strpos($line, 'dofile') !== false)
|
||||
{
|
||||
if(str_contains($line, 'dofile')) {
|
||||
$delimiter = '"';
|
||||
if(strpos($line, $delimiter) === false)
|
||||
if(!str_contains($line, $delimiter)) {
|
||||
$delimiter = "'";
|
||||
}
|
||||
|
||||
$tmp = explode($delimiter, $line);
|
||||
$result = array_merge($result, load_config_lua($config['server_path'] . $tmp[1]));
|
||||
}
|
||||
else if(count($tmp_exp) >= 2)
|
||||
{
|
||||
else if(count($tmp_exp) >= 2) {
|
||||
$key = trim($tmp_exp[0]);
|
||||
if(0 !== strpos($key, '--'))
|
||||
{
|
||||
if(!str_starts_with($key, '--')) {
|
||||
$value = trim($tmp_exp[1]);
|
||||
if(strpos($value, '--') !== false) {// found some deep comment
|
||||
if(str_contains($value, '--')) {// found some deep comment
|
||||
$value = preg_replace('/--.*$/i', '', $value);
|
||||
}
|
||||
|
||||
if(is_numeric($value))
|
||||
$result[$key] = (float) $value;
|
||||
elseif(in_array(@$value[0], array("'", '"')) && in_array(@$value[strlen($value) - 1], array("'", '"')))
|
||||
$result[$key] = (string) substr(substr($value, 1), 0, -1);
|
||||
$result[$key] = substr(substr($value, 1), 0, -1);
|
||||
elseif(in_array($value, array('true', 'false')))
|
||||
$result[$key] = ($value === 'true') ? true : false;
|
||||
$result[$key] = $value === 'true';
|
||||
elseif(@$value[0] === '{') {
|
||||
// arrays are not supported yet
|
||||
// just ignore the error
|
||||
@@ -1016,12 +1012,19 @@ function load_config_lua($filename)
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach($result as $tmp_key => $tmp_value) // load values definied by other keys, like: dailyFragsToBlackSkull = dailyFragsToRedSkull
|
||||
foreach($result as $tmp_key => $tmp_value) { // load values defined by other keys, like: dailyFragsToBlackSkull = dailyFragsToRedSkull
|
||||
$value = str_replace($tmp_key, $tmp_value, $value);
|
||||
$ret = @eval("return $value;");
|
||||
if((string) $ret == '' && trim($value) !== '""') // = parser error
|
||||
{
|
||||
throw new RuntimeException('ERROR: Loading config.lua file. Line <b>' . ($ln + 1) . '</b> of LUA config file is not valid [key: <b>' . $key . '</b>]');
|
||||
}
|
||||
|
||||
try {
|
||||
$ret = eval("return $value;");
|
||||
}
|
||||
catch (Throwable $e) {
|
||||
throw new RuntimeException('ERROR: Loading config.lua file. Line: ' . ($ln + 1) . ' - Unable to parse value "' . $value . '" - ' . $e->getMessage());
|
||||
}
|
||||
|
||||
if((string) $ret == '' && trim($value) !== '""') {
|
||||
throw new RuntimeException('ERROR: Loading config.lua file. Line ' . ($ln + 1) . ' is not valid [key: ' . $key . ']');
|
||||
}
|
||||
$result[$key] = $ret;
|
||||
}
|
||||
@@ -1030,8 +1033,7 @@ function load_config_lua($filename)
|
||||
}
|
||||
}
|
||||
|
||||
$result = array_merge($result, isset($config['lua']) ? $config['lua'] : array());
|
||||
return $result;
|
||||
return array_merge($result, $config['lua'] ?? []);
|
||||
}
|
||||
|
||||
function str_replace_first($search,$replace, $subject) {
|
||||
@@ -1057,17 +1059,36 @@ function get_browser_real_ip() {
|
||||
|
||||
return '0';
|
||||
}
|
||||
function setSession($key, $data): void {
|
||||
$_SESSION[setting('core.session_prefix') . $key] = $data;
|
||||
function setSession($key, $value = null): void {
|
||||
if (!is_array($key)) {
|
||||
$key = [$key => $value];
|
||||
}
|
||||
|
||||
foreach ($key as $arrayKey => $arrayValue) {
|
||||
if (is_null($arrayValue)) {
|
||||
unsetSession($arrayKey);
|
||||
}
|
||||
else {
|
||||
$_SESSION[setting('core.session_prefix') . $arrayKey] = $arrayValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
function getSession($key) {
|
||||
$key = setting('core.session_prefix') . $key;
|
||||
return $_SESSION[$key] ?? false;
|
||||
return $_SESSION[setting('core.session_prefix') . $key] ?? null;
|
||||
}
|
||||
function unsetSession($key): void {
|
||||
unset($_SESSION[setting('core.session_prefix') . $key]);
|
||||
}
|
||||
|
||||
function session($key): mixed {
|
||||
if (is_array($key)) {
|
||||
setSession($key);
|
||||
return null;
|
||||
}
|
||||
|
||||
return getSession($key);
|
||||
}
|
||||
|
||||
function csrf(bool $return = false): string {
|
||||
return CsrfToken::create($return);
|
||||
}
|
||||
@@ -1107,10 +1128,6 @@ function getTopPlayers($limit = 5, $skill = 'level') {
|
||||
$columns[] = 'lookaddons';
|
||||
}
|
||||
|
||||
if ($db->hasColumn('players', 'online')) {
|
||||
$columns[] = 'online';
|
||||
}
|
||||
|
||||
return Player::query()
|
||||
->select($columns)
|
||||
->withOnlineStatus()
|
||||
|
@@ -50,6 +50,7 @@ $cache = Cache::getInstance();
|
||||
global $hooks;
|
||||
$hooks = new Hooks();
|
||||
$hooks->load();
|
||||
$hooks->trigger(HOOK_INIT);
|
||||
|
||||
// twig
|
||||
require_once SYSTEM . 'twig.php';
|
||||
|
@@ -443,19 +443,19 @@ class OTS_Account extends OTS_Row_DAO implements IteratorAggregate, Countable
|
||||
throw new E_OTS_NotLoaded();
|
||||
}
|
||||
|
||||
$configFreePremium = configLua('freePremium');
|
||||
if(isset($configFreePremium) && getBoolean($configFreePremium)) {return -1;}
|
||||
|
||||
if(isset($this->data['premium_ends_at']) || isset($this->data['premend'])) {
|
||||
$col = isset($this->data['premium_ends_at']) ? 'premium_ends_at' : 'premend';
|
||||
$ret = ceil(($this->data[$col] - time()) / (24 * 60 * 60));
|
||||
return $ret > 0 ? $ret : 0;
|
||||
return max($ret, 0);
|
||||
}
|
||||
|
||||
if($this->data['premdays'] == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
global $config;
|
||||
if(isset($config['lua']['freePremium']) && getBoolean($config['lua']['freePremium'])) return -1;
|
||||
|
||||
if($this->data['premdays'] == self::GRATIS_PREMIUM_DAYS){
|
||||
return self::GRATIS_PREMIUM_DAYS;
|
||||
}
|
||||
@@ -1011,7 +1011,7 @@ class OTS_Account extends OTS_Row_DAO implements IteratorAggregate, Countable
|
||||
public function logAction($action)
|
||||
{
|
||||
$ip = get_browser_real_ip();
|
||||
if(strpos($ip, ":") === false) {
|
||||
if(!str_contains($ip, ":")) {
|
||||
$ipv6 = '0';
|
||||
}
|
||||
else {
|
||||
|
@@ -14,12 +14,12 @@ $account_logged = new OTS_Account();
|
||||
|
||||
// stay-logged with sessions
|
||||
$current_session = getSession('account');
|
||||
if($current_session !== false)
|
||||
if($current_session)
|
||||
{
|
||||
$account_logged->load($current_session);
|
||||
if($account_logged->isLoaded() && $account_logged->getPassword() == getSession('password')
|
||||
//&& (!isset($_SESSION['admin']) || admin())
|
||||
&& (getSession('remember_me') !== false || getSession('last_visit') > time() - 15 * 60)) { // login for 15 minutes if "remember me" is not used
|
||||
&& (getSession('remember_me') || getSession('last_visit') > time() - 15 * 60)) { // login for 15 minutes if "remember me" is not used
|
||||
$logged = true;
|
||||
}
|
||||
else {
|
||||
|
@@ -21,9 +21,9 @@ $settingHighscoresCountryBox = setting('core.highscores_country_box');
|
||||
if(config('account_country') && $settingHighscoresCountryBox)
|
||||
require SYSTEM . 'countries.conf.php';
|
||||
|
||||
$list = $_GET['list'] ?? 'experience';
|
||||
$list = urldecode($_GET['list'] ?? 'experience');
|
||||
$page = $_GET['page'] ?? 1;
|
||||
$vocation = $_GET['vocation'] ?? 'all';
|
||||
$vocation = urldecode($_GET['vocation'] ?? 'all');
|
||||
|
||||
if(!is_numeric($page) || $page < 1 || $page > PHP_INT_MAX) {
|
||||
$page = 1;
|
||||
@@ -234,10 +234,6 @@ foreach($highscores as $id => &$player)
|
||||
$player['experience'] = number_format($player['experience']);
|
||||
}
|
||||
|
||||
if(!$settingHighscoresVocation) {
|
||||
unset($player['vocation']);
|
||||
}
|
||||
|
||||
$player['link'] = getPlayerLink($player['name'], false);
|
||||
$player['flag'] = getFlagImage($player['country']);
|
||||
if($settingHighscoresOutfit) {
|
||||
|
@@ -30,11 +30,11 @@ $state = '';
|
||||
$order = '';
|
||||
$type = '';
|
||||
|
||||
if(isset($_GET['page']) && $_GET['page'] == 'view' && isset($_REQUEST['house']))
|
||||
if(isset($_REQUEST['name']))
|
||||
{
|
||||
$beds = array("", "one", "two", "three", "fourth", "fifth");
|
||||
$houseName = $_REQUEST['house'];
|
||||
$houseId = (Validator::number($_REQUEST['house']) ? $_REQUEST['house'] : -1);
|
||||
$houseName = urldecode($_REQUEST['name']);
|
||||
$houseId = (Validator::number($_REQUEST['name']) ? $_REQUEST['name'] : -1);
|
||||
$selectHouse = $db->query('SELECT * FROM ' . $db->tableName('houses') . ' WHERE ' . $db->fieldName('name') . ' LIKE ' . $db->quote($houseName) . ' OR `id` = ' . $db->quote($houseId));
|
||||
|
||||
$house = array();
|
||||
@@ -187,7 +187,7 @@ if(isset($_POST['town']) && isset($_POST['state']) && isset($_POST['order']) &&
|
||||
$houseRent = 'Free';
|
||||
}
|
||||
|
||||
$houses[] = array('owner' => $owner, 'name' => $house['name'], 'size' => ($hasTilesColumn ? $house['tiles'] : $house['size']), 'rent' => $house['rent'], 'rentedBy' => $houseRent);
|
||||
$houses[] = array('owner' => $owner, 'name' => $house['name'], 'size' => ($hasTilesColumn ? $house['tiles'] : $house['size']), 'rent' => $house['rent'], 'rentedBy' => $houseRent, 'link' => getHouseLink($house['name'], false));
|
||||
}
|
||||
|
||||
$housesSearch = true;
|
||||
|
@@ -100,7 +100,7 @@ function getColorByPercent($percent)
|
||||
|
||||
if(!$logged)
|
||||
{
|
||||
echo 'You are not logged in. <a href="?subtopic=accountmanagement&redirect=' . BASE_URL . urlencode('?subtopic=polls') . '">Log in</a> to vote in polls.<br /><br />';
|
||||
echo 'You are not logged in. <a href="' . getLink('account/manage') . '?redirect=' . BASE_URL . urlencode('?subtopic=polls') . '">Log in</a> to vote in polls.<br /><br />';
|
||||
return;
|
||||
}
|
||||
|
||||
|
@@ -39,10 +39,10 @@ return [
|
||||
|
||||
[['GET', 'POST'], 'guilds/{guild:string}', 'guilds/show.php'],
|
||||
|
||||
['GET', 'highscores/{list:alphanum}/{vocation:alphanum}/{page:int}', 'highscores.php'],
|
||||
['GET', 'highscores/{list:alphanum}/{page:int}', 'highscores.php'],
|
||||
['GET', 'highscores/{list:alphanum}/{vocation:alphanum}', 'highscores.php'],
|
||||
['GET', 'highscores/{list:alphanum}', 'highscores.php'],
|
||||
['GET', 'highscores/{list:string}/{vocation:string}/{page:int}', 'highscores.php'],
|
||||
['GET', 'highscores/{list:string}/{page:int}', 'highscores.php'],
|
||||
['GET', 'highscores/{list:string}/{vocation:string}', 'highscores.php'],
|
||||
['GET', 'highscores/{list:string}', 'highscores.php'],
|
||||
/*
|
||||
'/^polls\/[0-9]+\/?$/' => array('subtopic' => 'polls', 'id' => '$1'),
|
||||
'/^spells\/[A-Za-z0-9-_%]+\/[A-Za-z0-9-_]+\/?$/' => array('subtopic' => 'spells', 'vocation' => '$1', 'order' => '$2'),
|
||||
|
@@ -348,7 +348,7 @@ return [
|
||||
],
|
||||
'database_password' => [
|
||||
'name' => 'Database Password',
|
||||
'type' => 'text',
|
||||
'type' => 'password',
|
||||
'default' => '',
|
||||
'show_if' => [
|
||||
'database_overwrite', '=', 'true'
|
||||
@@ -1403,7 +1403,7 @@ Sent by MyAAC,<br/>
|
||||
'name' => 'Outfit Images URL',
|
||||
'type' => 'text',
|
||||
'desc' => 'Set to animoutfit.php for animated outfit',
|
||||
'default' => 'https://outfit-images.ots.me/outfit.php',
|
||||
'default' => 'https://outfit-images.ots.me/latest/outfit.php',
|
||||
],
|
||||
'outfit_images_wrong_looktypes' => [
|
||||
'name' => 'Outfit Images Wrong Looktypes',
|
||||
@@ -1622,14 +1622,20 @@ Sent by MyAAC,<br/>
|
||||
'name' => 'Login Attempts Limit',
|
||||
'type' => 'number',
|
||||
'desc' => 'Number of incorrect login attempts before banning the IP',
|
||||
'default' => 5, // Ajuste conforme necessário
|
||||
'default' => 5,
|
||||
'show_if' => [
|
||||
'account_login_ipban_protection', '=', 'true'
|
||||
]
|
||||
],
|
||||
|
||||
'account_login_ban_time' => [
|
||||
'name' => 'Ban Time (Minutes)',
|
||||
'type' => 'number',
|
||||
'desc' => 'Time in minutes the IP will be banned after exceeding login attempts',
|
||||
'default' => 30, // Ajuste conforme necessário
|
||||
'default' => 30,
|
||||
'show_if' => [
|
||||
'account_login_ipban_protection', '=', 'true'
|
||||
]
|
||||
],
|
||||
],
|
||||
'callbacks' => [
|
||||
|
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace MyAAC\Commands;
|
||||
|
||||
use MyAAC\Hooks;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Console\Style\SymfonyStyle;
|
||||
@@ -16,7 +17,10 @@ class CacheClearCommand extends Command
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output): int
|
||||
{
|
||||
require SYSTEM . 'init.php';
|
||||
global $hooks;
|
||||
$hooks = new Hooks();
|
||||
$hooks->load();
|
||||
$hooks->trigger(HOOK_INIT);
|
||||
|
||||
$io = new SymfonyStyle($input, $output);
|
||||
|
||||
|
@@ -4,6 +4,7 @@ namespace MyAAC\Commands;
|
||||
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Console\Style\SymfonyStyle;
|
||||
|
||||
@@ -16,7 +17,8 @@ class MigrateRunCommand extends Command
|
||||
->addArgument('id',
|
||||
InputArgument::IS_ARRAY | InputArgument::REQUIRED,
|
||||
'Id or ids of migration(s)'
|
||||
);
|
||||
)
|
||||
->addOption('down', 'd', InputOption::VALUE_NONE, 'Down');;
|
||||
}
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output): int
|
||||
@@ -41,8 +43,10 @@ class MigrateRunCommand extends Command
|
||||
}
|
||||
}
|
||||
|
||||
$down = $input->getOption('down') ?? false;
|
||||
|
||||
foreach ($ids as $id) {
|
||||
$this->executeMigration($id, $io);
|
||||
$this->executeMigration($id, $io, !$down);
|
||||
}
|
||||
|
||||
return Command::SUCCESS;
|
||||
@@ -52,13 +56,24 @@ class MigrateRunCommand extends Command
|
||||
return file_exists(SYSTEM . 'migrations/' . $id . '.php');
|
||||
}
|
||||
|
||||
private function executeMigration($id, $io): void
|
||||
private function executeMigration($id, $io, $_up = true): void
|
||||
{
|
||||
global $db;
|
||||
|
||||
$db->revalidateCache();
|
||||
|
||||
require SYSTEM . 'migrations/' . $id . '.php';
|
||||
$io->success('Migration ' . $id . ' successfully executed');
|
||||
if ($_up) {
|
||||
if (isset($up)) {
|
||||
$up();
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (isset($down)) {
|
||||
$down();
|
||||
}
|
||||
}
|
||||
|
||||
$io->success('Migration ' . $id . ' successfully executed' . ($_up ? '' : ' (downgrade)'));
|
||||
}
|
||||
}
|
||||
|
@@ -49,8 +49,8 @@ class Player extends Model {
|
||||
public function getVocationNameAttribute()
|
||||
{
|
||||
$vocation = $this->vocation;
|
||||
if (isset($this->promotion)) {
|
||||
$vocation *= $this->promotion;
|
||||
if (isset($this->promotion) && $this->promotion > 0) {
|
||||
$vocation += ($this->promotion * setting('core.vocations_amount'));
|
||||
}
|
||||
|
||||
return config('vocations')[$vocation] ?? 'Unknown';
|
||||
@@ -80,11 +80,17 @@ class Player extends Model {
|
||||
$query->where($column, 0);
|
||||
}
|
||||
|
||||
public function scopeWithOnlineStatus($query) {
|
||||
public function scopeWithOnlineStatus($query)
|
||||
{
|
||||
global $db;
|
||||
$query->when($db->hasTable('players_online'), function ($query) {
|
||||
$query->with('onlineTable');
|
||||
});
|
||||
if ($db->hasColumn('players', 'online')) {
|
||||
$query->addSelect('online');
|
||||
}
|
||||
else {
|
||||
$query->when($db->hasTable('players_online'), function ($query) {
|
||||
$query->with('onlineTable');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public function getOutfitUrlAttribute() {
|
||||
|
@@ -675,26 +675,41 @@ class Plugins {
|
||||
|
||||
public static function uninstall($plugin_name): bool
|
||||
{
|
||||
$isDisabled = self::existDisabled($plugin_name);
|
||||
if($isDisabled) {
|
||||
self::enable($plugin_name);
|
||||
}
|
||||
|
||||
$revertEnable = function() use ($isDisabled, $plugin_name) {
|
||||
if($isDisabled) {
|
||||
self::disable($plugin_name);
|
||||
}
|
||||
};
|
||||
|
||||
$filename = BASE . 'plugins/' . $plugin_name . '.json';
|
||||
if(!file_exists($filename)) {
|
||||
self::$error = 'Plugin ' . $plugin_name . ' does not exist.';
|
||||
$revertEnable();
|
||||
return false;
|
||||
}
|
||||
|
||||
$string = file_get_contents($filename);
|
||||
$plugin_info = json_decode($string, true);
|
||||
if(!$plugin_info) {
|
||||
self::$error = 'Cannot load plugin info ' . $plugin_name . '.json';
|
||||
$revertEnable();
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!isset($plugin_info['uninstall'])) {
|
||||
self::$error = "Plugin doesn't have uninstall options defined. Skipping...";
|
||||
$revertEnable();
|
||||
return false;
|
||||
}
|
||||
|
||||
$success = true;
|
||||
foreach($plugin_info['uninstall'] as $file) {
|
||||
if(strpos($file, '/') === 0) {
|
||||
if(str_starts_with($file, '/')) {
|
||||
$success = false;
|
||||
self::$error = "You cannot use absolute paths (starting with slash - '/'): " . $file;
|
||||
break;
|
||||
@@ -726,6 +741,7 @@ class Plugins {
|
||||
return true;
|
||||
}
|
||||
|
||||
$revertEnable();
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@@ -72,24 +72,32 @@ class Settings implements \ArrayAccess
|
||||
}
|
||||
}
|
||||
|
||||
$this->errors = [];
|
||||
ModelsSettings::where('name', $pluginName)->delete();
|
||||
foreach ($values as $key => $value) {
|
||||
$errorMessage = '';
|
||||
if (isset($settings['settings'][$key]['callbacks']['beforeSave']) && !$settings['settings'][$key]['callbacks']['beforeSave']($key, $value, $errorMessage)) {
|
||||
$this->errors[] = $errorMessage;
|
||||
continue;
|
||||
}
|
||||
global $db;
|
||||
|
||||
try {
|
||||
$db->beginTransaction();
|
||||
|
||||
$this->errors = [];
|
||||
ModelsSettings::where('name', $pluginName)->delete();
|
||||
foreach ($values as $key => $value) {
|
||||
$errorMessage = '';
|
||||
if (isset($settings['settings'][$key]['callbacks']['beforeSave']) && !$settings['settings'][$key]['callbacks']['beforeSave']($key, $value, $errorMessage)) {
|
||||
$this->errors[] = $errorMessage;
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
ModelsSettings::create([
|
||||
'name' => $pluginName,
|
||||
'key' => $key,
|
||||
'value' => $value
|
||||
]);
|
||||
} catch (\PDOException $error) {
|
||||
$this->errors[] = 'Error while saving setting (' . $pluginName . ' - ' . $key . '): ' . $error->getMessage();
|
||||
}
|
||||
|
||||
$db->commit();
|
||||
} catch (\Exception $error) {
|
||||
$db->rollBack();
|
||||
$this->errors[] = 'Error while saving settings (' . $pluginName . ')<br/>' . $error->getMessage();
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->clearCache();
|
||||
@@ -247,7 +255,15 @@ class Settings implements \ArrayAccess
|
||||
$min = $max = $step = '';
|
||||
}
|
||||
|
||||
if ($setting['type'] === 'password') {
|
||||
echo '<div class="input-group" id="show-hide-' . $key . '">';
|
||||
}
|
||||
|
||||
echo '<input class="form-control" type="' . $setting['type'] . '" name="settings[' . $key . ']" value="' . ($settingsDb[$key] ?? ($setting['default'] ?? '')) . '" id="' . $key . '"' . $min . $max . $step . '/>';
|
||||
|
||||
if ($setting['type'] === 'password') {
|
||||
echo '<div class="input-group-append input-group-text"><a href=""><i class="fas fa-eye-slash" ></i></a></div></div>';
|
||||
}
|
||||
}
|
||||
|
||||
else if($setting['type'] === 'textarea') {
|
||||
|
@@ -5,6 +5,7 @@ const SKILL_BALANCE = -2;
|
||||
|
||||
$i = 0;
|
||||
|
||||
define('HOOK_INIT', ++$i);
|
||||
define('HOOK_STARTUP', ++$i);
|
||||
define('HOOK_BEFORE_PAGE', ++$i);
|
||||
define('HOOK_AFTER_PAGE', ++$i);
|
||||
@@ -96,7 +97,7 @@ define('HOOK_CACHE_CLEAR', ++$i);
|
||||
define('HOOK_INSTALL_FINISH', ++$i);
|
||||
define('HOOK_INSTALL_FINISH_END', ++$i);
|
||||
|
||||
const HOOK_FIRST = HOOK_STARTUP;
|
||||
const HOOK_FIRST = HOOK_INIT;
|
||||
define('HOOK_LAST', $i);
|
||||
|
||||
function is_sub_dir($path = NULL, $parent_folder = BASE): bool|string
|
||||
|
@@ -41,7 +41,7 @@ if(setting('core.template_allow_change'))
|
||||
}
|
||||
else {
|
||||
$template_session = getSession('template');
|
||||
if ($template_session !== false) {
|
||||
if ($template_session) {
|
||||
if (!preg_match("/[^A-z0-9_\-]/", $template_session)) {
|
||||
$template_name = $template_session;
|
||||
}
|
||||
@@ -133,6 +133,7 @@ if($forumSetting != '')
|
||||
$template['link_forum'] = "<a href='" . $forumSetting . "' target='_blank'>";
|
||||
}
|
||||
|
||||
$twig->addGlobal('template_name', $template_name);
|
||||
$twig->addGlobal('template_path', $template_path);
|
||||
if($twig_loader) {
|
||||
$twig_loader->prependPath(BASE . $template_path);
|
||||
@@ -152,17 +153,40 @@ function get_template_menus(): array
|
||||
return $result->toArray();
|
||||
});
|
||||
|
||||
$menus = array();
|
||||
$configMenuCategories = config('menu_categories');
|
||||
$configMenuDefaultColor = config('menu_default_links_color') ?? config('menu_default_color');
|
||||
|
||||
$menus = [];
|
||||
foreach($result as $menu) {
|
||||
$link_full = strpos(trim($menu['link']), 'http') === 0 ? $menu['link'] : getLink($menu['link']);
|
||||
$menus[$menu['category']][] = array('name' => $menu['name'], 'link' => $menu['link'], 'link_full' => $link_full, 'blank' => $menu['blank'] == 1, 'target_blank' => ($menu['blank'] == 1 ? ' target="blank"' : ''), 'color' => $menu['color']);
|
||||
if (empty($menu['link'])) {
|
||||
$menu['link'] = 'news';
|
||||
}
|
||||
|
||||
$link_full = (str_starts_with(trim($menu['link']), 'http') ? $menu['link'] : getLink($menu['link']));
|
||||
$target_blank = ($menu['blank'] == 1 ? ' target="blank"' : '');
|
||||
|
||||
$color = (empty($menu['color']) ? ($configMenuCategories[$menu['category']]['default_links_color'] ?? ($configMenuDefaultColor ?? '')) : $menu['color']);
|
||||
|
||||
$color = str_replace('#', '', $color);
|
||||
|
||||
if (in_array('#' . $color, [$configMenuCategories[$menu['category']]['default_links_color'] ?? '', $configMenuDefaultColor])) {
|
||||
$color = '';
|
||||
}
|
||||
|
||||
$style_color = (empty($color) ? '' : 'style="color: #' . $color . ' !important"');
|
||||
|
||||
$menus[$menu['category']][] = [
|
||||
'name' => $menu['name'],
|
||||
'link' => $menu['link'], 'link_full' => $link_full,
|
||||
'blank' => $menu['blank'] == 1, 'target_blank' => $target_blank,
|
||||
'color' => $color, 'style_color' => $style_color,
|
||||
];
|
||||
}
|
||||
|
||||
$new_menus = array();
|
||||
$new_menus = [];
|
||||
/**
|
||||
* @var array $configMenuCategories
|
||||
*/
|
||||
$configMenuCategories = config('menu_categories');
|
||||
if($configMenuCategories === null) {
|
||||
return [];
|
||||
}
|
||||
|
@@ -110,7 +110,7 @@ html { margin-top: 32px !important; }
|
||||
<form method="post" action="{{ constant('ADMIN_URL') }}?p=dashboard">
|
||||
{{ csrf() }}
|
||||
<input type="hidden" name="clear_cache" value="1" />
|
||||
<a class="ab-item" href="#" onclick="confirm('Are you sure that you want to clear cache?') && $(this).closest('form').submit()" title="Clear Cache">Clear Cache</a>
|
||||
<a class="ab-item" href="javascript:void(0);" onclick="confirm('Are you sure that you want to clear cache?') && $(this).closest('form').submit()" title="Clear Cache">Clear Cache</a>
|
||||
</form>
|
||||
</li>
|
||||
</ul>
|
||||
|
31
system/templates/admin.menus.header.html.twig
Normal file
31
system/templates/admin.menus.header.html.twig
Normal file
@@ -0,0 +1,31 @@
|
||||
<div align="center" class="text-center">
|
||||
<p class="note">You are editing: {{ template }}<br/><br/>
|
||||
Hint: You can drag menu items.<br/>
|
||||
Hint: Add links to external sites using: <b>http://</b> or <b>https://</b> prefix.<br/>
|
||||
Not all templates support blank and colorful links.
|
||||
</p>
|
||||
<div class="row text-center">
|
||||
<div class="col-md-2 col-sm-1"></div>
|
||||
<div class="col-md-8 col-sm-10">
|
||||
<div class="row justify-content-center">
|
||||
{% if config('menus') is not null %}
|
||||
<form method="post" action="?p=menus&reset_menus" onsubmit="return confirm('Do you really want to reset menus?');">
|
||||
{{ csrf() }}
|
||||
<input type="hidden" name="template" value="{{ template }}"/>
|
||||
<button type="submit" class="btn btn-danger">Reset Menus to default</button>
|
||||
</form>
|
||||
<br/>
|
||||
{% endif %}
|
||||
{% if canResetColors %}
|
||||
<form method="post" action="?p=menus&reset_colors" onsubmit="return confirm('Do you really want to reset colors?');">
|
||||
{{ csrf() }}
|
||||
<input type="hidden" name="template" value="{{ template }}"/>
|
||||
<button type="submit" class="btn btn-warning" style="margin-left: 20px">Reset Colors to default</button>
|
||||
</form>
|
||||
<br/>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-2 col-sm-1"></div>
|
||||
</div>
|
||||
</div>
|
@@ -1,31 +1,41 @@
|
||||
<link type="text/css" rel="stylesheet" href="{{ constant('BASE_URL') }}tools/ext/jquery-ui/themes/base/jquery-ui.min.css">
|
||||
<script>
|
||||
var last_id = [];
|
||||
let last_id = [];
|
||||
let colors = [];
|
||||
|
||||
{% for cat, menu in menus %}
|
||||
last_id[{{ cat }}] = {{ last_id[cat] }};
|
||||
{% endfor %}
|
||||
$(function () {
|
||||
$(".sortable").sortable();
|
||||
$(".sortable").disableSelection();
|
||||
|
||||
$(".remove-button").click(function () {
|
||||
{% set menuDefaultLinksColor = config('menu_default_links_color') %}
|
||||
{% for cat, options in config('menu_categories') %}
|
||||
colors[{{ cat }}] = '{{ options['default_links_color'] ?? (menuDefaultLinksColor ?? config('menu_default_color')) }}';
|
||||
{% endfor %}
|
||||
|
||||
$(function () {
|
||||
const $sortable = $(".sortable");
|
||||
$sortable.sortable();
|
||||
$sortable.disableSelection();
|
||||
|
||||
$(".remove-button").on('click', function () {
|
||||
var id = $(this).attr("id");
|
||||
$('#list-' + id.replace('remove-button-', '')).remove();
|
||||
});
|
||||
|
||||
$(".add-button").click(function () {
|
||||
$(".add-button").on('click', function () {
|
||||
var cat = $(this).attr("id").replace('add-button-', '');
|
||||
var id = last_id[cat];
|
||||
last_id[cat]++;
|
||||
$('#sortable-' + cat).append('<li class="ui-state-default" id="list-' + cat + '-' + id + '"><label>Name:</label> <input type="text" name="menu[' + cat + '][]" value=""/> <label>Link:</label> <input type="text" name="menu_link[' + cat + '][]" value=""/><input type="hidden" name="menu_blank[' + cat + '][]" value="0" /> <label><input class="blank-checkbox" type="checkbox"/><span title="Open in New Window">New Window</span></label> <input class="color-picker" type="text" name="menu_color[' + cat + '][]" value="{{ menu_default_color }}" /><a class="remove-button" id="remove-button-' + cat + '-' + id + '"><i class="fas fa-trash"></i></a></li>'); //add input bo
|
||||
$('#remove-button-' + cat + '-' + id).click(function () {
|
||||
const color = colors[cat];
|
||||
$('#sortable-' + cat).append('<li class="ui-state-default" id="list-' + cat + '-' + id + '"><label>Name:</label> <input type="text" name="menu[' + cat + '][]" value=""/> <label>Link:</label> <input type="text" name="menu_link[' + cat + '][]" value=""/><input type="hidden" name="menu_blank[' + cat + '][]" value="0" /> <label><input class="blank-checkbox" type="checkbox"/><span title="Open in New Window">New Window</span></label> <input class="color-picker" type="text" name="menu_color[' + cat + '][]" value="#' + color + '" /> <a class="remove-button" id="remove-button-' + cat + '-' + id + '"><i class="fas fa-trash"></i></a></li>'); //add input bo
|
||||
$('#remove-button-' + cat + '-' + id).on('click', function () {
|
||||
$('#list-' + $(this).attr("id").replace('remove-button-', '')).remove();
|
||||
});
|
||||
|
||||
initialiceSpectrum();
|
||||
initializeSpectrum();
|
||||
});
|
||||
|
||||
$("#menus-form").submit(function (e) {
|
||||
$("#menus-form").on('submit', function (e) {
|
||||
$('.blank-checkbox:not(:checked)').each(function (i, obj) {
|
||||
$(obj).parent().prev().val("off");
|
||||
});
|
||||
@@ -52,11 +62,11 @@
|
||||
<script type="text/javascript" src="{{ constant('BASE_URL') }}tools/js/spectrum.js"></script>
|
||||
<link type="text/css" rel="stylesheet" href="{{ constant('BASE_URL') }}tools/css/spectrum.css"/>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function () {
|
||||
initialiceSpectrum();
|
||||
$(function () {
|
||||
initializeSpectrum();
|
||||
});
|
||||
|
||||
function initialiceSpectrum() {
|
||||
function initializeSpectrum() {
|
||||
$(".color-picker").spectrum({
|
||||
preferredFormat: "hex",
|
||||
showInput: true,
|
||||
|
@@ -80,7 +80,26 @@
|
||||
}
|
||||
});
|
||||
|
||||
$('#settings').submit(function(e) {
|
||||
const noChangesText = "No changes has been made";
|
||||
|
||||
$('form')
|
||||
.each(function(){
|
||||
$(this).data('serialized', $(this).serialize())
|
||||
})
|
||||
.on('change input', function(){
|
||||
const disable = $(this).serialize() === $(this).data('serialized');
|
||||
$(this)
|
||||
.find('input:submit, button:submit')
|
||||
.prop('disabled', disable)
|
||||
.prop('title', disable ? noChangesText : '')
|
||||
;
|
||||
})
|
||||
.find('input:submit, button:submit')
|
||||
.prop('disabled', true)
|
||||
.prop('title', noChangesText)
|
||||
;
|
||||
|
||||
$('#settings').on('submit', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
$.ajax({
|
||||
@@ -94,6 +113,13 @@
|
||||
duration: 3000,
|
||||
escapeMarkup: false,
|
||||
}).showToast();
|
||||
|
||||
let $settings = $('#settings');
|
||||
$settings.data('serialized', $settings.serialize());
|
||||
$settings
|
||||
.find('input:submit, button:submit')
|
||||
.prop('disabled', true)
|
||||
.prop('title', noChangesText);
|
||||
},
|
||||
error : function(response) {
|
||||
Toastify({
|
||||
@@ -109,3 +135,27 @@
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
{% for key, value in settings %}
|
||||
{% if value.type == 'password' %}
|
||||
$(function () {
|
||||
$('#show-hide-{{ key}} a').on('click', function(event) {
|
||||
event.preventDefault();
|
||||
|
||||
const $showHideIcon = $('#show-hide-{{ key}} i');
|
||||
const $showHideInput = $('#show-hide-{{ key }} input');
|
||||
if($showHideInput.attr('type') === 'text'){
|
||||
$showHideInput.attr('type', 'password');
|
||||
$showHideIcon.addClass('fa-eye-slash');
|
||||
$showHideIcon.removeClass('fa-eye');
|
||||
}else if($showHideInput.attr("type") === 'password'){
|
||||
$showHideInput.attr('type', 'text');
|
||||
$showHideIcon.removeClass('fa-eye-slash');
|
||||
$showHideIcon.addClass('fa-eye');
|
||||
}
|
||||
});
|
||||
});
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</script>
|
||||
|
@@ -114,7 +114,7 @@
|
||||
{% else %}
|
||||
<b>Before you can create a guild you must login.</b>
|
||||
<br/>
|
||||
<form action="?subtopic=accountmanagement&redirect={{ getLink('guilds') }}" method="post">
|
||||
<form action="{{ getLink('account/manage') }}?redirect={{ getLink('guilds') }}" method="post">
|
||||
{{ csrf() }}
|
||||
{% include('buttons.login.html.twig') %}
|
||||
</form>
|
||||
|
@@ -215,7 +215,7 @@
|
||||
<tbody>
|
||||
<tr>
|
||||
{% if not logged %}
|
||||
<form action="?subtopic=accountmanagement&redirect={{ getGuildLink(guild_name|url_encode, false) }}" method="post">
|
||||
<form action="{{ getLink('account/manage') }}?redirect={{ getGuildLink(guild_name|url_encode, false) }}" method="post">
|
||||
{{ csrf() }}
|
||||
<td>
|
||||
{{ include('buttons.login.html.twig') }}
|
||||
|
@@ -9,19 +9,17 @@
|
||||
<td>
|
||||
<label for="skillFilter">Choose a Skill</label>
|
||||
<select onchange="location = this.value;" id="skillFilter">
|
||||
{% set i = 0 %}
|
||||
{% for link, name in types %}
|
||||
<option value="{{ getLink('highscores') }}/{{ link }}{% if vocation is not null %}/{{ vocation }}{% endif %}" class="size_xs" {% if list is not null and list == link %}selected{% endif %}>{{ name }}</option>
|
||||
<option value="{{ getLink('highscores') }}/{{ link|urlencode }}{% if vocation is not null %}/{{ vocation|lower|urlencode }}{% endif %}" class="size_xs" {% if list is not null and list == link %}selected{% endif %}>{{ name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
<label for="vocationFilter">Choose a vocation</label>
|
||||
<select onchange="location = this.value;" id="vocationFilter">
|
||||
<option value="{{ getLink('highscores') }}/{{ list }}" class="size_xs">[ALL]</option>
|
||||
{% set i = 0 %}
|
||||
<option value="{{ getLink('highscores') }}/{{ list|urlencode }}" class="size_xs">[ALL]</option>
|
||||
{% for i in 0..config.vocations_amount %}
|
||||
<option value="{{ getLink('highscores') }}/{{ list }}/{{ config.vocations[i]|lower }}" class="size_xs" {% if vocationId is not null and vocationId == i %}selected{% endif %}>{{ config.vocations[i]}}</option>
|
||||
<option value="{{ getLink('highscores') }}/{{ list|urlencode }}/{{ config.vocations[i]|lower|urlencode }}" class="size_xs" {% if vocationId is not null and vocationId == i %}selected{% endif %}>{{ config.vocations[i]}}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</td>
|
||||
@@ -105,7 +103,7 @@
|
||||
<tr bgcolor="{{ config.lightborder }}">
|
||||
<td>
|
||||
{% for link, name in types %}
|
||||
<a href="{{ getLink('highscores') }}/{{ link }}{% if vocation is not null %}/{{ vocation }}{% endif %}" class="size_xs">{{ name }}</a><br/>
|
||||
<a href="{{ getLink('highscores') }}/{{ link|urlencode }}{% if vocation is not null %}/{{ vocation|urlencode }}{% endif %}" class="size_xs">{{ name }}</a><br/>
|
||||
{% endfor %}
|
||||
</td>
|
||||
</tr>
|
||||
@@ -118,9 +116,9 @@
|
||||
</tr>
|
||||
<tr bgcolor="{{ config.lightborder }}">
|
||||
<td>
|
||||
<a href="{{ getLink('highscores') }}/{{ list }}" class="size_xs">[ALL]</a><br/>
|
||||
<a href="{{ getLink('highscores') }}/{{ list|urlencode }}" class="size_xs">[ALL]</a><br/>
|
||||
{% for i in 0..config.vocations_amount %}
|
||||
<a href="{{ getLink('highscores') }}/{{ list }}/{{ config.vocations[i]|lower }}" class="size_xs">{{ config.vocations[i]}}</a><br/>
|
||||
<a href="{{ getLink('highscores') }}/{{ list|urlencode }}/{{ config.vocations[i]|lower|urlencode }}" class="size_xs">{{ config.vocations[i]}}</a><br/>
|
||||
{% endfor %}
|
||||
</td>
|
||||
</tr>
|
||||
|
@@ -56,10 +56,9 @@ the search criteria and start a new search.
|
||||
</td>
|
||||
|
||||
<td>
|
||||
<form action="{{ getLink('houses/view') }}" method="post">
|
||||
<input type="hidden" name="house" value="{{ house.name }}">
|
||||
<a href="{{ house.link }}">
|
||||
{{ include('buttons.view.html.twig') }}
|
||||
</form>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
|
@@ -140,6 +140,11 @@ $function = new TwigFunction('csrfToken', function () {
|
||||
});
|
||||
$twig->addFunction($function);
|
||||
|
||||
$function = new TwigFunction('session', function ($key) {
|
||||
return session($key);
|
||||
});
|
||||
$twig->addFunction($function);
|
||||
|
||||
$filter = new TwigFilter('urlencode', function ($s) {
|
||||
return urlencode($s);
|
||||
});
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<?php
|
||||
$config['menu_default_color'] = '#ffffff';
|
||||
$config['menu_default_links_color'] = '#ffffff';
|
||||
|
||||
$config['menu_categories'] = array(
|
||||
MENU_CATEGORY_NEWS => array('id' => 'news', 'name' => 'Latest News'),
|
||||
@@ -8,3 +8,5 @@ $config['menu_categories'] = array(
|
||||
MENU_CATEGORY_LIBRARY => array('id' => 'library', 'name' => 'Library'),
|
||||
MENU_CATEGORY_SHOP => array('id' => 'shops', 'name' => 'Shop')
|
||||
);
|
||||
|
||||
$config['menus'] = require __DIR__ . '/menus.php';
|
||||
|
@@ -42,8 +42,6 @@ defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
<div id="mainsubmenu">
|
||||
<?php
|
||||
$default_menu_color = "ffffff";
|
||||
|
||||
foreach($menus as $category => $menu) {
|
||||
if(!isset($menus[$category])) {
|
||||
continue;
|
||||
@@ -54,8 +52,8 @@ defined('MYAAC') or die('Direct access not allowed!');
|
||||
$size = count($menus[$category]);
|
||||
$i = 0;
|
||||
|
||||
foreach($menus[$category] as $menu) {
|
||||
echo '<a href="' . $menu['link_full'] . '"' . ($menu['blank'] ? ' target="_blank"' : '') . ' style="color: #' . (strlen($menu['color']) == 0 ? $default_menu_color : $menu['color']) . ';">' . $menu['name'] . '</a>';
|
||||
foreach($menus[$category] as $link) {
|
||||
echo '<a href="' . $link['link_full'] . '" ' . $link['target_blank'] . ' ' . $link['style_color'] . '>' . $link['name'] . '</a>';
|
||||
|
||||
if(++$i != $size) {
|
||||
echo '<span class="separator"></span>';
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<?php
|
||||
$config['menu_default_color'] = '#ffffff';
|
||||
$config['menu_default_links_color'] = '#ffffff';
|
||||
|
||||
$config['menu_categories'] = array(
|
||||
MENU_CATEGORY_NEWS => array('id' => 'news', 'name' => 'Latest News'),
|
||||
@@ -9,3 +9,5 @@ $config['menu_categories'] = array(
|
||||
MENU_CATEGORY_LIBRARY => array('id' => 'library', 'name' => 'Library'),
|
||||
MENU_CATEGORY_SHOP => array('id' => 'shops', 'name' => 'Shop')
|
||||
);
|
||||
|
||||
$config['menus'] = require __DIR__ . '/menus.php';
|
||||
|
@@ -7,7 +7,7 @@ if(strlen($text) > 100) // max limit
|
||||
putenv('GDFONTPATH=' . __DIR__);
|
||||
|
||||
// create image
|
||||
$image = imagecreatetruecolor(250, 28);
|
||||
$image = imagecreatetruecolor(600, 28);
|
||||
|
||||
// make the background transparent
|
||||
imagecolortransparent($image, imagecolorallocate($image, 0, 0, 0));
|
||||
|
@@ -372,19 +372,13 @@ foreach($config['menu_categories'] as $id => $cat) {
|
||||
</span>
|
||||
<div id='<?php echo $cat['id']; ?>_Submenu' class='Submenu'>
|
||||
<?php
|
||||
$default_menu_color = "ffffff";
|
||||
|
||||
foreach($menus[$id] as $category => $menu) {
|
||||
if (empty($menu['link'])) {
|
||||
$menu['link'] = 'news';
|
||||
}
|
||||
$link_color = '#' . (strlen($menu['color']) == 0 ? $default_menu_color : $menu['color']);
|
||||
?>
|
||||
<a href='<?php echo $menu['link_full']; ?>'<?= $menu['target_blank']?>>
|
||||
<div id='submenu_<?php echo str_replace('/', '_', $menu['link']); ?>' class='Submenuitem' onMouseOver='MouseOverSubmenuItem(this)' onMouseOut='MouseOutSubmenuItem(this)' style="color: <?php echo $link_color; ?>;">
|
||||
<div id='submenu_<?php echo str_replace('/', '_', $menu['link']); ?>' class='Submenuitem' onMouseOver='MouseOverSubmenuItem(this)' onMouseOut='MouseOutSubmenuItem(this)' >
|
||||
<div class='LeftChain' style='background-image:url(<?php echo $template_path; ?>/images/general/chain.gif);'></div>
|
||||
<div id='ActiveSubmenuItemIcon_<?php echo str_replace('/', '_', $menu['link']); ?>' class='ActiveSubmenuItemIcon' style='background-image:url(<?php echo $template_path; ?>/images/menu/icon-activesubmenu.gif);'></div>
|
||||
<div class='SubmenuitemLabel' style="color: <?php echo $link_color; ?>;"><?php echo $menu['name']; ?></div>
|
||||
<div class='SubmenuitemLabel' <?php echo $menu['style_color']; ?>><?php echo $menu['name']; ?></div>
|
||||
<div class='RightChain' style='background-image:url(<?php echo $template_path; ?>/images/general/chain.gif);'></div>
|
||||
</div>
|
||||
</a>
|
||||
|
Reference in New Issue
Block a user