mirror of
https://codeberg.org/PostERG/xamxam.git
synced 2026-05-06 19:19:19 +02:00
formulaire: default interne, unpublished, contact toggle, settings section
This commit is contained in:
@@ -809,21 +809,24 @@ class Database {
|
||||
/**
|
||||
* Find or create an author
|
||||
*/
|
||||
public function findOrCreateAuthor($name, $email = null) {
|
||||
public function findOrCreateAuthor($name, $email = null, bool $showContact = false) {
|
||||
$stmt = $this->pdo->prepare("SELECT id FROM authors WHERE name = ?");
|
||||
$stmt->execute([$name]);
|
||||
$author = $stmt->fetch();
|
||||
|
||||
if ($author) {
|
||||
if ($email && $email !== '') {
|
||||
$updateStmt = $this->pdo->prepare("UPDATE authors SET email = ? WHERE id = ?");
|
||||
$updateStmt->execute([$email, $author['id']]);
|
||||
$updateStmt = $this->pdo->prepare("UPDATE authors SET email = ?, show_contact = ? WHERE id = ?");
|
||||
$updateStmt->execute([$email, $showContact ? 1 : 0, $author['id']]);
|
||||
} else {
|
||||
$updateStmt = $this->pdo->prepare("UPDATE authors SET show_contact = ? WHERE id = ?");
|
||||
$updateStmt->execute([$showContact ? 1 : 0, $author['id']]);
|
||||
}
|
||||
return $author['id'];
|
||||
}
|
||||
|
||||
$stmt = $this->pdo->prepare("INSERT INTO authors (name, email) VALUES (?, ?)");
|
||||
$stmt->execute([$name, $email]);
|
||||
$stmt = $this->pdo->prepare("INSERT INTO authors (name, email, show_contact) VALUES (?, ?, ?)");
|
||||
$stmt->execute([$name, $email, $showContact ? 1 : 0]);
|
||||
return $this->pdo->lastInsertId();
|
||||
}
|
||||
|
||||
@@ -1048,6 +1051,77 @@ class Database {
|
||||
return $stmt->fetchAll();
|
||||
}
|
||||
|
||||
// ========================================================================
|
||||
// SITE SETTINGS
|
||||
// ========================================================================
|
||||
|
||||
/**
|
||||
* Get a single site setting value by key. Returns $default if not found.
|
||||
*/
|
||||
public function getSetting(string $key, string $default = ''): string {
|
||||
$stmt = $this->pdo->prepare("SELECT value FROM site_settings WHERE key = ? LIMIT 1");
|
||||
$stmt->execute([$key]);
|
||||
$row = $stmt->fetch();
|
||||
return $row ? (string) $row['value'] : $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all site settings as an associative array [ key => value ].
|
||||
*/
|
||||
public function getAllSettings(): array {
|
||||
$stmt = $this->pdo->query("SELECT key, value FROM site_settings");
|
||||
$rows = $stmt->fetchAll();
|
||||
$out = [];
|
||||
foreach ($rows as $r) {
|
||||
$out[$r['key']] = $r['value'];
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
|
||||
/**
|
||||
* Upsert a site setting.
|
||||
*/
|
||||
public function setSetting(string $key, string $value): void {
|
||||
$this->pdo->prepare(
|
||||
"INSERT INTO site_settings (key, value, updated_at)
|
||||
VALUES (?, ?, CURRENT_TIMESTAMP)
|
||||
ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = CURRENT_TIMESTAMP"
|
||||
)->execute([$key, $value]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return access types that are enabled in the add-thesis form,
|
||||
* filtered by site_settings toggles.
|
||||
* 'Libre' (id=1) is excluded unless access_type_libre_enabled = '1'.
|
||||
* 'Interne' (id=2) is excluded unless access_type_interne_enabled = '1'.
|
||||
* 'Interdit' (id=3) is excluded unless access_type_interdit_enabled = '1'.
|
||||
*/
|
||||
public function getEnabledFormAccessTypes(): array {
|
||||
$settings = $this->getAllSettings();
|
||||
$all = $this->getAccessTypes();
|
||||
$map = [
|
||||
'Libre' => $settings['access_type_libre_enabled'] ?? '0',
|
||||
'Interne' => $settings['access_type_interne_enabled'] ?? '1',
|
||||
'Interdit' => $settings['access_type_interdit_enabled'] ?? '1',
|
||||
];
|
||||
return array_values(array_filter($all, fn($at) => ($map[$at['name']] ?? '0') === '1'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the show_contact flag for the first author of a thesis.
|
||||
*/
|
||||
public function setAuthorShowContact(int $thesisId, bool $show): void {
|
||||
$stmt = $this->pdo->prepare(
|
||||
"UPDATE authors SET show_contact = ?
|
||||
WHERE id = (
|
||||
SELECT author_id FROM thesis_authors
|
||||
WHERE thesis_id = ?
|
||||
ORDER BY author_order LIMIT 1
|
||||
)"
|
||||
);
|
||||
$stmt->execute([$show ? 1 : 0, $thesisId]);
|
||||
}
|
||||
|
||||
// ========================================================================
|
||||
// JURY METHODS
|
||||
// ========================================================================
|
||||
@@ -1439,7 +1513,8 @@ class Database {
|
||||
foreach ($authors as $index => $author) {
|
||||
$name = trim($author['name'] ?? '');
|
||||
if ($name === '') continue;
|
||||
$authorId = $this->findOrCreateAuthor($name, $author['email'] ?? null);
|
||||
$showContact = !empty($author['show_contact']);
|
||||
$authorId = $this->findOrCreateAuthor($name, $author['email'] ?? null, $showContact);
|
||||
$stmt->execute([$thesisId, $authorId, $index + 1]);
|
||||
}
|
||||
}
|
||||
@@ -1453,8 +1528,10 @@ class Database {
|
||||
orientation_id, ap_program_id, finality_id,
|
||||
synopsis, file_size_info,
|
||||
baiu_link, license_id,
|
||||
access_type_id,
|
||||
is_published,
|
||||
submitted_at
|
||||
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
|
||||
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, CURRENT_TIMESTAMP)
|
||||
");
|
||||
|
||||
$stmt->execute([
|
||||
@@ -1469,6 +1546,7 @@ class Database {
|
||||
!empty($data['file_size_info']) ? $data['file_size_info'] : null,
|
||||
!empty($data['baiu_link']) ? $data['baiu_link'] : null,
|
||||
isset($data['license_id']) ? $data['license_id'] : null,
|
||||
isset($data['access_type_id']) ? (int)$data['access_type_id'] : 2, // default: Interne
|
||||
]);
|
||||
|
||||
$thesisId = (int)$this->pdo->lastInsertId();
|
||||
|
||||
@@ -70,12 +70,13 @@ class ThesisCreateController
|
||||
public function loadFormData(): array
|
||||
{
|
||||
return [
|
||||
'orientations' => $this->db->getAllOrientations(),
|
||||
'apPrograms' => $this->db->getAllAPPrograms(),
|
||||
'finalityTypes' => $this->db->getAllFinalityTypes(),
|
||||
'languages' => $this->db->getAllLanguages(),
|
||||
'formatTypes' => $this->db->getAllFormatTypes(),
|
||||
'licenseTypes' => $this->db->getAllLicenseTypes(),
|
||||
'orientations' => $this->db->getAllOrientations(),
|
||||
'apPrograms' => $this->db->getAllAPPrograms(),
|
||||
'finalityTypes' => $this->db->getAllFinalityTypes(),
|
||||
'languages' => $this->db->getAllLanguages(),
|
||||
'formatTypes' => $this->db->getAllFormatTypes(),
|
||||
'licenseTypes' => $this->db->getAllLicenseTypes(),
|
||||
'enabledAccessTypes' => $this->db->getEnabledFormAccessTypes(),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -107,7 +108,7 @@ class ThesisCreateController
|
||||
$data = $this->validateAndSanitise($post);
|
||||
|
||||
// ── 2. Find / create author ───────────────────────────────────────────
|
||||
$authorId = $this->db->findOrCreateAuthor($data['auteurName'], $data['mail'] ?: null);
|
||||
$authorId = $this->db->findOrCreateAuthor($data['auteurName'], $data['mail'] ?: null, $data['showContact']);
|
||||
error_log("ThesisCreateController: author ID $authorId");
|
||||
|
||||
// ── 3–4. DB writes in a transaction ───────────────────────────────────
|
||||
@@ -125,6 +126,7 @@ class ThesisCreateController
|
||||
'file_size_info' => $data['durationInfo'],
|
||||
'baiu_link' => $data['lien'],
|
||||
'license_id' => $data['licenseId'],
|
||||
'access_type_id' => $data['accessTypeId'],
|
||||
'author_id' => $authorId,
|
||||
]);
|
||||
|
||||
@@ -192,7 +194,8 @@ class ThesisCreateController
|
||||
'Nom/Prénom/Pseudo'
|
||||
);
|
||||
|
||||
$mail = !empty($post['mail']) ? $this->sanitiseString($post['mail']) : '';
|
||||
$mail = !empty($post['mail']) ? $this->sanitiseString($post['mail']) : '';
|
||||
$showContact = !empty($post['contact_public']) ? true : false;
|
||||
|
||||
$annee = filter_var($post['année'] ?? '', FILTER_VALIDATE_INT);
|
||||
if ($annee === false || $annee < 2000 || $annee > ((int) date('Y') + 1)) {
|
||||
@@ -265,6 +268,12 @@ class ThesisCreateController
|
||||
|
||||
$licenseId = filter_var($post['license_id'] ?? '', FILTER_VALIDATE_INT) ?: null;
|
||||
|
||||
// Access type — must be one of the enabled types; default 2 (Interne)
|
||||
$accessTypeId = filter_var($post['access_type_id'] ?? '', FILTER_VALIDATE_INT);
|
||||
if ($accessTypeId === false || $accessTypeId <= 0) {
|
||||
$accessTypeId = 2; // Interne
|
||||
}
|
||||
|
||||
// External link (optional)
|
||||
$lien = '';
|
||||
if (!empty($post['lien'])) {
|
||||
@@ -275,10 +284,10 @@ class ThesisCreateController
|
||||
}
|
||||
|
||||
return compact(
|
||||
'auteurName', 'mail', 'annee', 'orientationId', 'apProgramId',
|
||||
'auteurName', 'mail', 'showContact', 'annee', 'orientationId', 'apProgramId',
|
||||
'finalityId', 'titre', 'subtitle', 'synopsis', 'durationInfo',
|
||||
'juryMembers', 'keywords', 'languageIds', 'formatIds',
|
||||
'licenseId', 'lien'
|
||||
'licenseId', 'lien', 'accessTypeId'
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -91,22 +91,28 @@ class ThesisEditController
|
||||
$currentAccessTypeId = $rawRow['access_type_id'] ?? null;
|
||||
$currentContextNote = $rawRow['context_note'] ?? '';
|
||||
|
||||
// Author contact info (from view)
|
||||
$currentAuthorEmail = $thesis['author_email'] ?? '';
|
||||
$currentAuthorShowContact = (bool)($thesis['author_show_contact'] ?? false);
|
||||
|
||||
return [
|
||||
'thesis' => $thesis,
|
||||
'currentLanguages' => $currentLanguages,
|
||||
'currentFormats' => $currentFormats,
|
||||
'jury' => $jury,
|
||||
'orientations' => $orientations,
|
||||
'apPrograms' => $apPrograms,
|
||||
'finalityTypes' => $finalityTypes,
|
||||
'languages' => $languages,
|
||||
'formatTypes' => $formatTypes,
|
||||
'licenseTypes' => $licenseTypes,
|
||||
'accessTypes' => $accessTypes,
|
||||
'currentLicenseId' => $currentLicenseId,
|
||||
'currentAccessTypeId' => $currentAccessTypeId,
|
||||
'currentContextNote' => $currentContextNote,
|
||||
'pageTitle' => 'Éditer TFE - ' . htmlspecialchars($thesis['title']),
|
||||
'thesis' => $thesis,
|
||||
'currentLanguages' => $currentLanguages,
|
||||
'currentFormats' => $currentFormats,
|
||||
'jury' => $jury,
|
||||
'orientations' => $orientations,
|
||||
'apPrograms' => $apPrograms,
|
||||
'finalityTypes' => $finalityTypes,
|
||||
'languages' => $languages,
|
||||
'formatTypes' => $formatTypes,
|
||||
'licenseTypes' => $licenseTypes,
|
||||
'accessTypes' => $accessTypes,
|
||||
'currentLicenseId' => $currentLicenseId,
|
||||
'currentAccessTypeId' => $currentAccessTypeId,
|
||||
'currentContextNote' => $currentContextNote,
|
||||
'currentAuthorEmail' => $currentAuthorEmail,
|
||||
'currentAuthorShowContact' => $currentAuthorShowContact,
|
||||
'pageTitle' => 'Éditer TFE - ' . htmlspecialchars($thesis['title']),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -162,13 +168,15 @@ class ThesisEditController
|
||||
|
||||
// ── 2. Authors ────────────────────────────────────────────────────
|
||||
$authorsRaw = trim($post['auteurice'] ?? '');
|
||||
$showContact = !empty($post['contact_public']);
|
||||
$authorEntries = [];
|
||||
if ($authorsRaw !== '') {
|
||||
foreach (array_map('trim', explode(',', $authorsRaw)) as $i => $name) {
|
||||
if ($name !== '') {
|
||||
$authorEntries[] = [
|
||||
'name' => $name,
|
||||
'email' => $i === 0 ? ($post['mail'] ?? null) : null,
|
||||
'name' => $name,
|
||||
'email' => $i === 0 ? ($post['mail'] ?? null) : null,
|
||||
'show_contact' => $i === 0 ? $showContact : false,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user