116 lines
2.9 KiB
PHP
116 lines
2.9 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
function h(mixed $value): string
|
|
{
|
|
return htmlspecialchars((string) $value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
|
|
}
|
|
|
|
function env_value(string $key, string $fallback = ''): string
|
|
{
|
|
$serverValue = $_SERVER[$key] ?? null;
|
|
if (is_string($serverValue) && trim($serverValue) !== '') {
|
|
return $serverValue;
|
|
}
|
|
|
|
$envValue = getenv($key);
|
|
if (is_string($envValue) && trim($envValue) !== '') {
|
|
return $envValue;
|
|
}
|
|
|
|
return $fallback;
|
|
}
|
|
|
|
function site_project_name(string $fallback = 'Portfolio'): string
|
|
{
|
|
return env_value('PROJECT_NAME', $fallback);
|
|
}
|
|
|
|
function site_project_description(string $fallback = 'Personal portfolio website.'): string
|
|
{
|
|
return env_value('PROJECT_DESCRIPTION', $fallback);
|
|
}
|
|
|
|
function base_url(): string
|
|
{
|
|
$https = $_SERVER['HTTPS'] ?? '';
|
|
$scheme = (!empty($https) && $https !== 'off') ? 'https' : 'http';
|
|
$host = $_SERVER['HTTP_HOST'] ?? 'localhost';
|
|
|
|
return $scheme . '://' . $host;
|
|
}
|
|
|
|
function set_flash(array $flash): void
|
|
{
|
|
$_SESSION['flash'] = $flash;
|
|
}
|
|
|
|
function pull_flash(): ?array
|
|
{
|
|
if (!isset($_SESSION['flash']) || !is_array($_SESSION['flash'])) {
|
|
return null;
|
|
}
|
|
|
|
$flash = $_SESSION['flash'];
|
|
unset($_SESSION['flash']);
|
|
|
|
return $flash;
|
|
}
|
|
|
|
function set_old_form(array $values): void
|
|
{
|
|
$_SESSION['old_form'] = $values;
|
|
}
|
|
|
|
function pull_old_form(): array
|
|
{
|
|
if (!isset($_SESSION['old_form']) || !is_array($_SESSION['old_form'])) {
|
|
return [];
|
|
}
|
|
|
|
$values = $_SESSION['old_form'];
|
|
unset($_SESSION['old_form']);
|
|
|
|
return $values;
|
|
}
|
|
|
|
|
|
function text_length(string $value): int
|
|
{
|
|
return function_exists('mb_strlen') ? mb_strlen($value) : strlen($value);
|
|
}
|
|
|
|
function text_slice(string $value, int $length): string
|
|
{
|
|
return function_exists('mb_substr') ? mb_substr($value, 0, $length) : substr($value, 0, $length);
|
|
}
|
|
|
|
function text_excerpt(string $value, int $length = 100): string
|
|
{
|
|
if (function_exists('mb_strimwidth')) {
|
|
return mb_strimwidth($value, 0, $length, '…');
|
|
}
|
|
|
|
return strlen($value) > $length ? substr($value, 0, max(0, $length - 1)) . '…' : $value;
|
|
}
|
|
|
|
function ensure_contact_requests_table(PDO $pdo): void
|
|
{
|
|
$pdo->exec(<<<'SQL'
|
|
CREATE TABLE IF NOT EXISTS contact_requests (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
name VARCHAR(120) NOT NULL,
|
|
email VARCHAR(190) NOT NULL,
|
|
company VARCHAR(150) NULL,
|
|
project_type VARCHAR(80) NULL,
|
|
budget VARCHAR(80) NULL,
|
|
message TEXT NOT NULL,
|
|
status VARCHAR(30) NOT NULL DEFAULT 'new',
|
|
source_url VARCHAR(255) NULL,
|
|
ip_address VARCHAR(45) NULL,
|
|
user_agent VARCHAR(255) NULL,
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
|
SQL);
|
|
}
|