Rewrites whois admin module to match current SLAED coding standards: typed functions, single-quoted strings, and modern navigation API.
Core changes:
- Navigation (modules/whois/admin/index.php):
- Replace whois_navi() / func_get_args() with typed navi()
- Switch to getAdminTabs() and name=whois&op= URL scheme
- All handler functions:
- Add void return type declarations
- Replace double-quoted strings with single-quoted throughout
- Replace list() with [] destructuring in fetchrow loops
- Replace $admin_file with $afile
Benefits: - Consistent style with other modernized admin modules - Cleaner navigation registration via getAdminTabs()
Technical notes: - Copyright year updated to 2026 - No functional logic changes; all CRUD operations preserved
Rewrites voting admin module to align with the current SLAED admin architecture: typed functions, modern API calls, and clean URL routing.
Core changes:
- Navigation (modules/voting/admin/index.php):
- Replace voting_navi() / func_get_args() pattern with typed navi()
- Use getAdminTabs() and name=voting&op= URL scheme
- All handler functions:
- Add void return type declarations
- Replace $admin_file with $afile, tpl_eval() with setTemplateBasic()
- Replace double-quoted heredoc style with single-quoted strings
- Replace list() with [] destructuring in fetchrow loops
- Admin links:
- Update op=voting_add/delete to name=voting&op=add/delete throughout
Benefits: - Consistent with other modernized admin modules - Typed API reduces silent failures from wrong argument types - URL routing aligned with new op-based dispatch scheme
Technical notes: - Copyright year updated to 2026 - No functional logic changes; all CRUD operations preserved
UNIQUE KEY mid_modul_uid (mid, modul, uid) blocked all guest votes after the first one, because all guests share uid=0. The application already enforces one-vote-per-IP in PHP; the DB key now mirrors that.
Core changes:
- Schema for fresh installs (setup/sql/table.sql):
- Drop UNIQUE KEY mid_modul_uid (mid, modul, uid)
- Add UNIQUE KEY mid_modul_host (mid, modul, host)
- Migration for 6.2 > 6.3 upgrade (setup/sql/table_update6_3.sql):
- Same key replacement applied to the ALTER TABLE block
- Setup wizard (setup/index.php):
- Append deduplication DELETE and key migration queries to update6_3 branch
- DELETE removes duplicate (mid, modul, host) rows keeping earliest id
- ALTER TABLE DROP INDEX IF EXISTS mid_modul_uid (safe if already absent)
- ALTER TABLE ADD UNIQUE KEY mid_modul_host
- Fix unused $key => $val in language() foreach loop
- getInfo() output added to report migration result in the UI
Benefits: - Multiple guests from different IPs can now vote in the same poll - DB-level uniqueness still enforces one vote per IP per item per module - Race-condition protection preserved via $inserted guard (see prev commit)
Technical notes: - host column is VARCHAR(45), covers both IPv4 and IPv6 - PHP duplicate check logic (by host for guests, by uid for users) unchanged - Migration is idempotent: IF EXISTS prevents error on already-applied runs
The voting list page exposed raw $stitle in HTML attribute and JS onclick context, and fetched an unused column from the database.
Core changes:
- voting() (modules/voting/index.php):
- Apply htmlspecialchars($stitle, ENT_QUOTES) in title="" attribute
Apply htmlspecialchars($stitle, ENT_QUOTES) in JS DelCheck() argument to prevent apostrophes from breaking the inline event handler string
- Remove unused 'questions' column from SELECT and list() destructuring
- Remove unused $confv from global declaration in view()
- Replace foreach ($langlist as $key => $val) with $val only
Benefits: - Eliminates attribute-injection risk for admin-authored titles with quotes - Prevents JS syntax error in moderator delete confirmation for special chars - Reduces SELECT payload by one unused column
Technical notes: - $stitle is already HTML-entity encoded at save time via save_text() - htmlspecialchars() adds a second encoding layer safe for attribute context - Behavior preserved; no template or route changes
Previously, if the INSERT into _rating failed (e.g. due to a DB constraint violation), code continued and updated vote counters anyway, causing silent count inflation across all rating-enabled modules.
Core changes:
- Rating function (core/system.php):
- Capture sql_query() result into $inserted
- Wrap all module UPDATE statements and update_points() calls in if ($inserted)
- SELECT + echo ajax_rating() still runs to return current state to client
- avoting_save() (core/system.php):
- Same guard applied to the voting-specific INSERT path
- Vote answer array update and update_points(42) skipped on INSERT fail
- getVoting() result still returned so UI shows current results
Benefits: - Vote counters stay consistent with actual _rating table rows - Eliminates data corruption on duplicate-key or race-condition failures - getVoting() / ajax_rating() always return a response, preserving UX
Technical notes: - sql_query() returns false on PDOException (caught internally) and logs - Fix covers both rating() and avoting_save() code paths - No schema changes in this commit
The admin basic item template used positional array references (\$arg[1] through \$arg[10]) which were fragile and hard to read. Replaces them with descriptive named tokens matching the keys passed by setTemplateBasic().
Core changes:
- Placeholder rename (templates/admin/basic.html):
- \$arg[2] → {%id%}
- \$arg[3] → {%title%}
- \$arg[4] → {%text%}
- \$arg[5] → {%post%}
- \$arg[6] → {%date%}
- \$arg[7] → {%reads%}
- \$arg[8] → {%comm%}
- \$arg[9] → {%rating%}
- \$arg[10] → {%admin%}
- \$arg[1] → {%ctitle%}
Benefits: - Template is self-documenting; field purpose visible without cross-referencing PHP - Named tokens decouple template from positional argument order - Consistent with the named-token convention used in other templates
Technical notes: - Requires setTemplateBasic() callers to pass named-key arrays - No HTML structure changed; layout identical
Converts the sitemap public module to current SLAED PHP conventions: 4-space indentation, single-quoted strings, void return type, SITEMAP_DIR constant for file resolution, and updated template helpers.
Core changes:
- Code style (modules/sitemap/index.php):
- Tabs → 4-space indentation throughout
- Double-quoted strings → single-quoted
- sitemap() → sitemap(): void
- File path (modules/sitemap/index.php):
Hardcoded 'config/sitemap/sitemap.txt' → SITEMAP_DIR.'/sitemap.txt' * Resolves via constant, independent of working directory
- Template helpers (modules/sitemap/index.php):
- tpl_eval('title', ...) → setTemplateBasic('title', ['title' => ...])
- tpl_eval('open/close') → setTemplateBasic('open/close')
- tpl_warn() → setTemplateWarning()
- Switch style (modules/sitemap/index.php):
- Multiline switch/case → compact single-line form
- Removed closing ?>
Benefits: - Consistent style with other modernized public modules - File path resolved via constant rather than implicit cwd
Technical notes: - Behavior unchanged; pure refactor - Copyright year updated to 2026
Cleans up the sitemap admin module: replaces $aroute with $afile, uses the SITEMAP_DIR constant for file paths, adds a null-check for fopen(), passes the $legacy parameter to getAdminTabs(), and guards file_get_contents() with is_readable().
Core changes:
- Global variable (modules/sitemap/admin/index.php):
- $aroute → $afile in all functions (sitemap, xsl, xslsave, conf, confsave)
- File path hardening (modules/sitemap/admin/index.php):
- Hardcoded 'sitemap.xsl' → SITEMAP_DIR.'/sitemap.xsl'
- file_get_contents() → is_readable() guard before read
fopen() now checked for false before entering while loop * fclose() moved inside the if-block to prevent warning on null handle
- Navigation fix (modules/sitemap/admin/index.php):
- $legacy parameter now forwarded correctly to getAdminTabs()
Benefits: - Eliminates $aroute global; consistent with other modernized modules - Prevents PHP warnings from fopen() failure on missing XML files - File paths resolved via constant rather than implicit cwd
Technical notes: - Behavior unchanged; pure refactor and hardening - fopen() suppression (@) retained from original for non-critical read
Rewrites the shop admin module with current SLAED conventions: short op-aligned function names, $afile instead of $admin_file, inline $conf['shop'] access instead of global $confs, and unified template API.
Core changes:
- Navigation (modules/shop/admin/index.php):
- shop_navi() → navi() with typed int + string parameters
- Function renames (modules/shop/admin/index.php):
- shop_clients() → clients()
- shop_clients_act() → clientsact()
- shop_clients_add() → clientsadd()
- shop_clients_save() → clientssave()
- shop_clients_delete() → clientsdel(int $id)
- shop_products() → products()
- shop_products_add() → productsadd()
- shop_products_save() → productssave()
- shop_products_admin() → productsadmin(int|array $id, string $vtyp)
- shop_partners() → partners()
- shop_partners_act() → partnersact()
- shop_partners_add() → partnersadd()
- shop_partners_save() → partnerssave()
- shop_partners_delete() → partnersdel(int $id)
- shop_partners_details() → partnersdetails()
- shop_export() → exportdata()
- shop_conf() → conf()
- shop_conf_save() → save()
- shop_info() → info()
- New: shop() — main listing function
- Global variable cleanup (modules/shop/admin/index.php):
- $admin_file → $afile
- $confs → $conf['shop'] with null-coalesce defaults
- tpl_eval() → setTemplateBasic()
- while (list()) → while ([]) destructuring
Benefits: - Eliminates deprecated $confs global and panel() call - Consistent naming aligned with router op values - Template API unified with other modernized modules
Technical notes: - Behavior unchanged; pure refactor - Copyright year updated to 2026
The adm_info() call in info() was passing the numeric flag as the second argument and the module name as the third. The function signature expects (flag, module, ...) — swap restores correct info-panel rendering.
Core changes:
- Argument order fix (modules/rss/admin/index.php):
adm_info(1, 0, 'rss') → adm_info(1, 'rss', 0) * Second arg is module name, third is language fallback flag
Benefits: - Info panel now loads the correct rss module documentation - Aligns with the adm_info() signature used in all other modules
Technical notes: - Single-line change; no other logic affected





