Compare commits

..

7 Commits

Author SHA1 Message Date
Flatlogic Bot
472b1ac730 Mortgage App 2025-12-18 17:31:05 +00:00
Flatlogic Bot
940ae1eda1 Mortgage App 2025-12-18 17:27:42 +00:00
Flatlogic Bot
82b84bcb6c Mortgage App 2025-12-18 16:16:42 +00:00
Flatlogic Bot
49d160d7fb Mortgage App 2025-12-18 15:53:53 +00:00
Flatlogic Bot
9d4b6e4c19 Mortgage App 2025-12-18 15:21:27 +00:00
Flatlogic Bot
1e905f9245 Mortgage App 2025-12-14 19:49:54 +00:00
Flatlogic Bot
cddd17cc44 Mortgage app 2025-12-14 19:20:06 +00:00
16 changed files with 714 additions and 144 deletions

69
admin/create.php Normal file
View File

@ -0,0 +1,69 @@
<?php
session_start();
if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] !== true) {
header('Location: index.php');
exit;
}
require_once __DIR__ . '/../db/config.php';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$title = $_POST['title'] ?? '';
$content = $_POST['content'] ?? '';
if (empty($title) || empty($content)) {
$error = 'Title and content are required';
} else {
$pdo = db();
$stmt = $pdo->prepare('INSERT INTO posts (title, content) VALUES (?, ?)');
$stmt->execute([$title, $content]);
header('Location: dashboard.php');
exit;
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Add New Post</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container">
<a class="navbar-brand" href="dashboard.php">Admin</a>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto">
<li class="nav-item">
<a class="nav-link" href="logout.php">Logout</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container py-5">
<h1>Add New Post</h1>
<?php if (isset($error)): ?>
<div class="alert alert-danger"><?php echo $error; ?></div>
<?php endif; ?>
<form method="post">
<div class="mb-3">
<label for="title" class="form-label">Title</label>
<input type="text" class="form-control" id="title" name="title" required>
</div>
<div class="mb-3">
<label for="content" class="form-label">Content</label>
<textarea class="form-control" id="content" name="content" rows="10" required></textarea>
</div>
<button type="submit" class="btn btn-primary">Save Post</button>
<a href="dashboard.php" class="btn btn-secondary">Cancel</a>
</form>
</div>
</body>
</html>

73
admin/dashboard.php Normal file
View File

@ -0,0 +1,73 @@
<?php
session_start();
if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] !== true) {
header('Location: index.php');
exit;
}
require_once __DIR__ . '/../db/config.php';
$pdo = db();
$stmt = $pdo->query('SELECT * FROM posts ORDER BY created_at DESC');
$posts = $stmt->fetchAll();
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Admin Dashboard</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container">
<a class="navbar-brand" href="#">Admin</a>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto">
<li class="nav-item">
<a class="nav-link" href="logout.php">Logout</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container py-5">
<div class="d-flex justify-content-between align-items-center mb-4">
<h1>Blog Posts</h1>
<a href="create.php" class="btn btn-primary">Add New Post</a>
</div>
<table class="table table-bordered">
<thead>
<tr>
<th>Title</th>
<th>Created At</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<?php if (empty($posts)): ?>
<tr>
<td colspan="3" class="text-center">No posts found.</td>
</tr>
<?php else: ?>
<?php foreach ($posts as $post): ?>
<tr>
<td><?php echo htmlspecialchars($post['title']); ?></td>
<td><?php echo date('F j, Y', strtotime($post['created_at'])); ?></td>
<td>
<a href="edit.php?id=<?php echo $post['id']; ?>" class="btn btn-sm btn-outline-primary">Edit</a>
<a href="delete.php?id=<?php echo $post['id']; ?>" class="btn btn-sm btn-outline-danger" onclick="return confirm('Are you sure you want to delete this post?')">Delete</a>
</td>
</tr>
<?php endforeach; ?>
<?php endif; ?>
</tbody>
</table>
</div>
</body>
</html>

21
admin/delete.php Normal file
View File

@ -0,0 +1,21 @@
<?php
session_start();
if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] !== true) {
header('Location: index.php');
exit;
}
require_once __DIR__ . '/../db/config.php';
if (!isset($_GET['id'])) {
header('Location: dashboard.php');
exit;
}
$pdo = db();
$stmt = $pdo->prepare('DELETE FROM posts WHERE id = ?');
$stmt->execute([$_GET['id']]);
header('Location: dashboard.php');
exit;

85
admin/edit.php Normal file
View File

@ -0,0 +1,85 @@
<?php
session_start();
if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] !== true) {
header('Location: index.php');
exit;
}
require_once __DIR__ . '/../db/config.php';
if (!isset($_GET['id'])) {
header('Location: dashboard.php');
exit;
}
$pdo = db();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$title = $_POST['title'] ?? '';
$content = $_POST['content'] ?? '';
$id = $_GET['id'];
if (empty($title) || empty($content)) {
$error = 'Title and content are required';
} else {
$stmt = $pdo->prepare('UPDATE posts SET title = ?, content = ? WHERE id = ?');
$stmt->execute([$title, $content, $id]);
header('Location: dashboard.php');
exit;
}
} else {
$stmt = $pdo->prepare('SELECT * FROM posts WHERE id = ?');
$stmt->execute([$_GET['id']]);
$post = $stmt->fetch();
if (!$post) {
header('Location: dashboard.php');
exit;
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Edit Post</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container">
<a class="navbar-brand" href="dashboard.php">Admin</a>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto">
<li class="nav-item">
<a class="nav-link" href="logout.php">Logout</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container py-5">
<h1>Edit Post</h1>
<?php if (isset($error)): ?>
<div class="alert alert-danger"><?php echo $error; ?></div>
<?php endif; ?>
<form method="post">
<div class="mb-3">
<label for="title" class="form-label">Title</label>
<input type="text" class="form-control" id="title" name="title" value="<?php echo htmlspecialchars($post['title']); ?>" required>
</div>
<div class="mb-3">
<label for="content" class="form-label">Content</label>
<textarea class="form-control" id="content" name="content" rows="10" required><?php echo htmlspecialchars($post['content']); ?></textarea>
</div>
<button type="submit" class="btn btn-primary">Save Changes</button>
<a href="dashboard.php" class="btn btn-secondary">Cancel</a>
</form>
</div>
</body>
</html>

57
admin/index.php Normal file
View File

@ -0,0 +1,57 @@
<?php
session_start();
// If already logged in, redirect to dashboard
if (isset($_SESSION['loggedin']) && $_SESSION['loggedin'] === true) {
header('Location: dashboard.php');
exit;
}
// Hardcoded password for now
$password = 'password';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_POST['password']) && $_POST['password'] === $password) {
$_SESSION['loggedin'] = true;
header('Location: dashboard.php');
exit;
} else {
$error = 'Invalid password';
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Admin Login</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row justify-content-center">
<div class="col-md-6 mt-5">
<div class="card">
<div class="card-header">
Admin Login
</div>
<div class="card-body">
<?php if (isset($error)): ?>
<div class="alert alert-danger"><?php echo $error; ?></div>
<?php endif; ?>
<form method="post">
<div class="mb-3">
<label for="password" class="form-label">Password</label>
<input type="password" class="form-control" id="password" name="password" required>
</div>
<button type="submit" class="btn btn-primary">Login</button>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
</html>

5
admin/logout.php Normal file
View File

@ -0,0 +1,5 @@
<?php
session_start();
session_destroy();
header('Location: index.php');
exit;

54
assets/css/custom.css Normal file
View File

@ -0,0 +1,54 @@
/* Custom Styles */
body {
font-family: 'Inter', sans-serif;
background-color: #F9FAFB;
color: #111827;
}
h1, h2, h3, h4, h5, h6 {
font-family: 'Poppins', sans-serif;
}
.hero {
background: linear-gradient(45deg, #4F46E5, #14B8A6);
color: white;
padding: 100px 0;
}
.hero h1 {
font-size: 3.5rem;
font-weight: 700;
}
section {
padding: 60px 0;
}
.card {
border: none;
border-radius: 8px;
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
}
.form-control, .btn {
border-radius: 8px;
}
.btn-primary {
background-color: #4F46E5;
border-color: #4F46E5;
}
.btn-primary:hover {
background-color: #4338CA;
border-color: #4338CA;
}
.rounded-circle {
border: 3px solid #4F46E5;
}
#about .lead {
padding-top: 20px;
}

2
assets/js/main.js Normal file
View File

@ -0,0 +1,2 @@
// Future JavaScript functionality will go here.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

79
blog.php Normal file
View File

@ -0,0 +1,79 @@
<?php
require_once 'db/config.php';
$pdo = db();
$stmt = $pdo->query('SELECT * FROM posts ORDER BY created_at DESC');
$posts = $stmt->fetchAll();
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Blog - Ontario Custom Mortgages</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="assets/css/custom.css">
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container">
<a class="navbar-brand" href="/">Ontario Custom Mortgages</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto">
<li class="nav-item"><a class="nav-link" href="/#mortgages">Mortgages</a></li>
<li class="nav-item"><a class="nav-link" href="/#about">About</a></li>
<li class="nav-item"><a class="nav-link" href="/blog.php">Blog</a></li>
<li class="nav-item"><a class="nav-link" href="/#contact">Contact</a></li>
</ul>
</div>
</div>
</nav>
<header class="py-5">
<div class="container text-center">
<h1 class="display-4">Blog</h1>
<p class="lead">News and updates from Ontario Custom Mortgages.</p>
</div>
</header>
<main class="container py-5">
<div class="row">
<?php if (empty($posts)): ?>
<div class="col-12 text-center">
<p>No blog posts yet. Check back soon!</p>
</div>
<?php else: ?>
<?php foreach ($posts as $post): ?>
<div class="col-md-8 offset-md-2 mb-4">
<div class="card">
<div class="card-body">
<h2 class="card-title"><?php echo htmlspecialchars($post['title']); ?></h2>
<p class="card-text"><small class="text-muted">Posted on <?php echo date('F j, Y', strtotime($post['created_at'])); ?></small></p>
<p class="card-text"><?php
if (!empty($post['excerpt'])) {
echo nl2br(htmlspecialchars($post['excerpt']));
} else {
echo nl2br(htmlspecialchars(substr($post['content'], 0, 200))) . '...';
}
?></p>
<a href="post.php?id=<?php echo $post['id']; ?>" class="btn btn-primary">Read More</a>
</div>
</div>
</div>
<?php endforeach; ?>
<?php endif; ?>
</div>
</main>
<footer class="bg-light text-center py-4">
<p>&copy; <?php echo date("Y"); ?> Ontario Custom Mortgages. All Rights Reserved.</p>
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

36
contact.php Normal file
View File

@ -0,0 +1,36 @@
<?php
session_start();
require_once __DIR__ . '/mail/MailService.php';
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Honeypot check
if (!empty($_POST['honeypot'])) {
// This is a bot, redirect with a success message
$_SESSION['success'] = "Thank you for your message! I will get back to you shortly.";
header("Location: index.php#contact");
exit;
}
$name = strip_tags(trim($_POST["name"]));
$email = filter_var(trim($_POST["email"]), FILTER_SANITIZE_EMAIL);
$message = strip_tags(trim($_POST["message"]));
if (empty($name) || empty($message) || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
$_SESSION['error'] = "Please fill out all fields and provide a valid email address.";
header("Location: index.php#contact");
exit;
}
$res = MailService::sendContactMessage($name, $email, $message, 'sgoodwin@northwoodmortgage.com');
if (!empty($res['success'])) {
$_SESSION['success'] = "Thank you for your message! I will get back to you shortly.";
} else {
$_SESSION['error'] = "Sorry, there was an error sending your message. Please try again later.";
error_log("MailService Error: " . ($res['error'] ?? 'Unknown error'));
}
header("Location: index.php#contact");
exit;
}
?>

13
db/migrate.php Normal file
View File

@ -0,0 +1,13 @@
<?php
require_once __DIR__ . '/config.php';
$pdo = db();
$migrations = glob(__DIR__ . '/migrations/*.sql');
foreach ($migrations as $migration) {
$sql = file_get_contents($migration);
$pdo->exec($sql);
echo "Applied migration: " . basename($migration) . "\n";
}

View File

@ -0,0 +1,6 @@
CREATE TABLE IF NOT EXISTS posts (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

View File

@ -0,0 +1 @@
ALTER TABLE posts ADD COLUMN excerpt TEXT;

289
index.php
View File

@ -1,150 +1,151 @@
<?php <?php session_start(); ?>
declare(strict_types=1); <!DOCTYPE html>
@ini_set('display_errors', '1');
@error_reporting(E_ALL);
@date_default_timezone_set('UTC');
$phpVersion = PHP_VERSION;
$now = date('Y-m-d H:i:s');
?>
<!doctype html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8" /> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>New Style</title> <title>Personal Mortgages</title>
<?php <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
// Read project preview data from environment <link rel="preconnect" href="https://fonts.googleapis.com">
$projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? ''; <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
$projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? ''; <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;700&family=Poppins:wght@700&display=swap" rel="stylesheet">
?> <link rel="stylesheet" href="assets/css/custom.css?v=<?php echo time(); ?>">
<?php if ($projectDescription): ?>
<!-- Meta description -->
<meta name="description" content='<?= htmlspecialchars($projectDescription) ?>' />
<!-- Open Graph meta tags -->
<meta property="og:description" content="<?= htmlspecialchars($projectDescription) ?>" />
<!-- Twitter meta tags -->
<meta property="twitter:description" content="<?= htmlspecialchars($projectDescription) ?>" />
<?php endif; ?>
<?php if ($projectImageUrl): ?>
<!-- Open Graph image -->
<meta property="og:image" content="<?= htmlspecialchars($projectImageUrl) ?>" />
<!-- Twitter image -->
<meta property="twitter:image" content="<?= htmlspecialchars($projectImageUrl) ?>" />
<?php endif; ?>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap" rel="stylesheet">
<style>
:root {
--bg-color-start: #6a11cb;
--bg-color-end: #2575fc;
--text-color: #ffffff;
--card-bg-color: rgba(255, 255, 255, 0.01);
--card-border-color: rgba(255, 255, 255, 0.1);
}
body {
margin: 0;
font-family: 'Inter', sans-serif;
background: linear-gradient(45deg, var(--bg-color-start), var(--bg-color-end));
color: var(--text-color);
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
text-align: center;
overflow: hidden;
position: relative;
}
body::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><path d="M-10 10L110 10M10 -10L10 110" stroke-width="1" stroke="rgba(255,255,255,0.05)"/></svg>');
animation: bg-pan 20s linear infinite;
z-index: -1;
}
@keyframes bg-pan {
0% { background-position: 0% 0%; }
100% { background-position: 100% 100%; }
}
main {
padding: 2rem;
}
.card {
background: var(--card-bg-color);
border: 1px solid var(--card-border-color);
border-radius: 16px;
padding: 2rem;
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.1);
}
.loader {
margin: 1.25rem auto 1.25rem;
width: 48px;
height: 48px;
border: 3px solid rgba(255, 255, 255, 0.25);
border-top-color: #fff;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.hint {
opacity: 0.9;
}
.sr-only {
position: absolute;
width: 1px; height: 1px;
padding: 0; margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap; border: 0;
}
h1 {
font-size: 3rem;
font-weight: 700;
margin: 0 0 1rem;
letter-spacing: -1px;
}
p {
margin: 0.5rem 0;
font-size: 1.1rem;
}
code {
background: rgba(0,0,0,0.2);
padding: 2px 6px;
border-radius: 4px;
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
}
footer {
position: absolute;
bottom: 1rem;
font-size: 0.8rem;
opacity: 0.7;
}
</style>
</head> </head>
<body> <body>
<main>
<div class="card"> <nav class="navbar navbar-expand-lg navbar-light bg-light sticky-top">
<h1>Analyzing your requirements and generating your website…</h1> <div class="container">
<div class="loader" role="status" aria-live="polite" aria-label="Applying initial changes"> <a class="navbar-brand" href="/">Ontario Custom Mortgages</a>
<span class="sr-only">Loading…</span> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
</div> <span class="navbar-toggler-icon"></span>
<p class="hint"><?= ($_SERVER['HTTP_HOST'] ?? '') === 'appwizzy.com' ? 'AppWizzy' : 'Flatlogic' ?> AI is collecting your requirements and applying the first changes.</p> </button>
<p class="hint">This page will update automatically as the plan is implemented.</p> <div class="collapse navbar-collapse" id="navbarNav">
<p>Runtime: PHP <code><?= htmlspecialchars($phpVersion) ?></code> — UTC <code><?= htmlspecialchars($now) ?></code></p> <ul class="navbar-nav ms-auto">
</div> <li class="nav-item"><a class="nav-link" href="#intro">Intro</a></li>
</main> <li class="nav-item"><a class="nav-link" href="#mortgages">Mortgages</a></li>
<footer> <li class="nav-item"><a class="nav-link" href="#about">About</a></li>
Page updated: <?= htmlspecialchars($now) ?> (UTC) <li class="nav-item"><a class="nav-link" href="blog.php">Blog</a></li>
</footer> <li class="nav-item"><a class="nav-link" href="#testimonials">Testimonials</a></li>
<li class="nav-item"><a class="nav-link" href="#contact">Contact</a></li>
</ul>
</div>
</div>
</nav>
<header id="intro" class="hero text-center">
<div class="container">
<h1 class="display-4">Welcome to Ontario Custom Mortgages</h1>
<p class="lead">Your expert partner in navigating the mortgage landscape.</p>
<a href="#contact" class="btn btn-light btn-lg">Get In Touch</a>
</div>
</header>
<section id="mortgages" class="container">
<h2 class="text-center mb-4">Mortgages</h2>
<div class="row">
<div class="col-md-4 mb-4">
<div class="card">
<div class="card-body">
<h5 class="card-title">Second mortgages</h5>
<p class="card-text">Starting from as low as $10000 and 4.99%, I have solutions for you.</p>
</div>
</div>
</div>
<div class="col-md-4 mb-4">
<div class="card">
<div class="card-body">
<h5 class="card-title">Reverse mortgages</h5>
<p class="card-text">A reverse mortgage helps Canadians aged 55+ enjoy a more comfortable, stress-free retirement by unlocking up to 55% of their homes value in tax-free cash, with no required monthly mortgage payments and a no negative equity guarantee.</p>
</div>
</div>
</div>
<div class="col-md-4 mb-4">
<div class="card">
<div class="card-body">
<h5 class="card-title">HELOCS</h5>
<p class="card-text">A Home Equity Line of Credit (HELOC) allows a homeowner to borrow against the equity in their home, providing flexible access to funds as needed. It can be used for expenses like renovations, debt consolidation, or emergencies, typically with lower interest rates than unsecured loans, and interest is only paid on the amount borrowed.</p>
</div>
</div>
</div>
</div>
</section>
<section id="about" class="bg-white">
<div class="container">
<h2 class="text-center mb-4">About Me</h2>
<div class="row">
<div class="col-md-4 text-center">
<img src="assets/pasted-20251218-155926-3e104bc6.jpg" alt="A photo of the mortgage agent" class="img-fluid rounded-circle mb-3">
</div>
<div class="col-md-8">
<p class="lead">I am a licensed mortgage agent in Ontario, I specialize in hard to place mortgages, refinancing and reverse mortgages, if you have any questions or your mortgage is coming up for renewal, contact me today</p><p class="lead">-Sean</p>
</div>
</div>
</div>
</section>
<section id="testimonials" class="container">
<h2 class="text-center mb-4">Testimonials</h2>
<div class="row">
<div class="col-md-6 mb-4">
<div class="card">
<div class="card-body">
<p class="card-text">"I have worked with Sean on multiple occasions and I highly recommend working with him. Sean has an amazing attitude, he is calm, reassuring and patient which is so important during stressful mortgage moments. On top of all that he clearly guides you through the process and comes up with the best solutions for your needs. Will continue working with Sean on all my mortgage needs."</p>
<footer class="blockquote-footer">Shealyn</footer>
</div>
</div>
</div>
<div class="col-md-6 mb-4">
<div class="card">
<div class="card-body">
<p class="card-text">"Sean was great to work with! He lead me professionally through the paperwork and red tape associated with this. Would definitely recommend him to my friends and family looking for these services- top notch. Thanks Sean, Drew"</p>
<footer class="blockquote-footer">Drew</footer>
</div>
</div>
</div>
</div>
</section>
<section id="contact" class="bg-white">
<div class="container">
<h2 class="text-center mb-4">Contact Me</h2>
<div class="row justify-content-center">
<div class="col-md-8">
<?php if (isset($_SESSION['success'])): ?>
<div class="alert alert-success"><?php echo $_SESSION['success']; unset($_SESSION['success']); ?></div>
<?php endif; ?>
<?php if (isset($_SESSION['error'])): ?>
<div class="alert alert-danger"><?php echo $_SESSION['error']; unset($_SESSION['error']); ?></div>
<?php endif; ?>
<form action="contact.php" method="post">
<div class="mb-3">
<label for="name" class="form-label">Name</label>
<input type="text" class="form-control" id="name" name="name" required>
</div>
<div class="mb-3">
<label for="email" class="form-label">Email</label>
<input type="email" class="form-control" id="email" name="email" required>
</div>
<div class="mb-3">
<label for="message" class="form-label">Message</label>
<textarea class="form-control" id="message" name="message" rows="5" required></textarea>
</div>
<div style="display:none;">
<label for="honeypot">Leave this field blank</label>
<input type="text" name="honeypot" id="honeypot">
</div>
<button type="submit" class="btn btn-primary">Send Message</button>
</form>
</div>
</div>
</div>
</section>
<footer class="text-center py-4">
<p>&copy; <?php echo date("Y"); ?> Ontario Custom Mortgages. All Rights Reserved.</p>
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<script src="assets/js/main.js?v=<?php echo time(); ?>"></script>
</body> </body>
</html> </html>

68
post.php Normal file
View File

@ -0,0 +1,68 @@
<?php
require_once 'db/config.php';
if (!isset($_GET['id'])) {
header('Location: blog.php');
exit;
}
$pdo = db();
$stmt = $pdo->prepare('SELECT * FROM posts WHERE id = ?');
$stmt->execute([$_GET['id']]);
$post = $stmt->fetch();
if (!$post) {
header('Location: blog.php');
exit;
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?php echo htmlspecialchars($post['title']); ?> - Ontario Custom Mortgages</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="assets/css/custom.css">
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container">
<a class="navbar-brand" href="/">Ontario Custom Mortgages</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto">
<li class="nav-item"><a class="nav-link" href="/#mortgages">Mortgages</a></li>
<li class="nav-item"><a class="nav-link" href="/#about">About</a></li>
<li class="nav-item"><a class="nav-link" href="/blog.php">Blog</a></li>
<li class="nav-item"><a class="nav-link" href="/#contact">Contact</a></li>
</ul>
</div>
</div>
</nav>
<main class="container py-5">
<div class="row">
<div class="col-md-8 offset-md-2">
<h1 class="mb-4"><?php echo htmlspecialchars($post['title']); ?></h1>
<p class="text-muted">Posted on <?php echo date('F j, Y', strtotime($post['created_at'])); ?></p>
<hr>
<div class="post-content">
<?php echo nl2br(htmlspecialchars($post['content'])); ?>
</div>
<hr>
<a href="blog.php" class="btn btn-secondary">Back to Blog</a>
</div>
</div>
</main>
<footer class="bg-light text-center py-4 mt-5">
<p>&copy; <?php echo date("Y"); ?> Ontario Custom Mortgages. All Rights Reserved.</p>
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>