Files
backPRO/templates/articles/show.php
Jacek Pyziak 4d5e220b3c Add BackPRO News theme and update database schema for article tracking
- Introduced a new WordPress theme "BackPRO News" with a lightweight magazine-style design.
- Added columns for tracking retry attempts and timestamps for unpublished/generated articles in the articles table.
- Included remote service metadata fields in the sites table for better management.
- Created log files for image replacements, installer actions, OpenAI article generation, and publishing processes.
- Implemented a dashboard template for site management, including permalink settings and theme installation options.
2026-02-17 20:08:02 +01:00

129 lines
5.2 KiB
PHP

<div class="mb-4">
<a href="/articles" class="text-muted small">&larr; Powrót do listy</a>
<h2 class="mt-2"><?= htmlspecialchars($article['title']) ?></h2>
<div class="d-flex gap-3 text-muted small">
<span><i class="bi bi-globe me-1"></i><?= htmlspecialchars($article['site_name']) ?></span>
<span><i class="bi bi-tag me-1"></i><?= htmlspecialchars($article['topic_name']) ?></span>
<span><i class="bi bi-calendar me-1"></i><?= date('d.m.Y H:i', strtotime($article['created_at'])) ?></span>
<span><i class="bi bi-cpu me-1"></i><?= htmlspecialchars($article['ai_model'] ?? 'N/A') ?></span>
<?php if ((int) ($article['retry_count'] ?? 0) > 0): ?>
<span><i class="bi bi-arrow-repeat me-1"></i>Retry: <?= (int) $article['retry_count'] ?></span>
<?php endif; ?>
<?php if (!empty($article['last_retry_at'])): ?>
<span><i class="bi bi-clock-history me-1"></i>Ostatnia proba: <?= date('d.m.Y H:i', strtotime($article['last_retry_at'])) ?></span>
<?php endif; ?>
<?php if ($article['status'] === 'published'): ?>
<span class="badge bg-success">Opublikowany</span>
<?php elseif ($article['status'] === 'failed'): ?>
<span class="badge bg-danger">Błąd</span>
<?php else: ?>
<span class="badge bg-warning">Wygenerowany</span>
<?php endif; ?>
</div>
</div>
<?php if ($article['status'] === 'failed' && $article['error_message']): ?>
<div class="alert alert-danger">
<strong>Błąd:</strong> <?= htmlspecialchars($article['error_message']) ?>
</div>
<?php endif; ?>
<?php if ($article['wp_post_id'] && !empty($article['site_url'])): ?>
<div class="alert alert-info d-flex justify-content-between align-items-center">
<div>
<i class="bi bi-wordpress me-1"></i>
Post WordPress ID: <strong><?= $article['wp_post_id'] ?></strong>
| <a href="<?= htmlspecialchars($article['site_url']) ?>/?p=<?= $article['wp_post_id'] ?>" target="_blank">Zobacz na stronie</a>
</div>
<div class="d-flex align-items-center gap-2">
<input type="file" id="imageFile" accept="image/jpeg,image/png,image/gif,image/webp" class="form-control form-control-sm" style="max-width: 250px;">
<button class="btn btn-sm btn-outline-warning" id="btnReplaceImage" onclick="replaceImage()" disabled>
<i class="bi bi-upload me-1"></i>Podmień
</button>
</div>
</div>
<?php endif; ?>
<div class="card mb-4">
<div class="card-header">
<h5 class="mb-0">Treść artykułu</h5>
</div>
<div class="card-body article-content">
<?= $article['content'] ?>
</div>
</div>
<?php if (!empty($article['prompt_used'])): ?>
<div class="card mb-4">
<div class="card-header">
<h5 class="mb-0">Prompt użyty do generowania</h5>
</div>
<div class="card-body">
<pre class="mb-0" style="white-space: pre-wrap;"><?= htmlspecialchars($article['prompt_used']) ?></pre>
</div>
</div>
<?php endif; ?>
<?php if ($article['wp_post_id']): ?>
<script>
document.getElementById('imageFile').addEventListener('change', function () {
document.getElementById('btnReplaceImage').disabled = !this.files.length;
});
async function replaceImage() {
var fileInput = document.getElementById('imageFile');
if (!fileInput.files.length) return;
var ok = await backproConfirm(
'Podmienic zdjecie wyrozniajace na WordPressie? Stare zdjecie zostanie usuniete.',
{
title: 'Podmiana zdjecia',
confirmText: 'Podmien',
cancelText: 'Anuluj',
confirmClass: 'btn-warning'
}
);
if (!ok) return;
var btn = document.getElementById('btnReplaceImage');
btn.disabled = true;
btn.innerHTML = '<span class="spinner-border spinner-border-sm me-1"></span>Wgrywanie...';
var formData = new FormData();
formData.append('image', fileInput.files[0]);
fetch('/articles/<?= $article['id'] ?>/replace-image', {
method: 'POST',
headers: { 'X-Requested-With': 'XMLHttpRequest' },
body: formData
})
.then(function (r) { return r.json(); })
.then(function (data) {
if (data.success) {
btn.classList.remove('btn-outline-warning');
btn.classList.add('btn-outline-success');
btn.innerHTML = '<i class="bi bi-check-lg me-1"></i>Podmieniono!';
fileInput.value = '';
backproNotify(data.message || 'Zdjecie zostalo podmienione.', 'success', { delay: 2500 });
setTimeout(function () {
btn.classList.remove('btn-outline-success');
btn.classList.add('btn-outline-warning');
btn.innerHTML = '<i class="bi bi-upload me-1"></i>Podmien';
btn.disabled = true;
}, 3000);
} else {
backproNotify(data.message || 'Blad podmiany zdjecia', 'danger');
btn.disabled = false;
btn.innerHTML = '<i class="bi bi-upload me-1"></i>Podmien';
}
})
.catch(function () {
backproNotify('Blad polaczenia', 'danger');
btn.disabled = false;
btn.innerHTML = '<i class="bi bi-upload me-1"></i>Podmien';
});
}
</script>
<?php endif; ?>