Fix: Картинки в ответах + toggleCorrect иконка

 store/update используют $request->file() для загрузки
 toggleCorrect работает с icon.classList вместо innerHTML
 Исправлено наследование цвета иконки от кнопки

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
mirivlad 2026-03-27 11:54:48 +08:00
parent eefd5fc5da
commit be1ba308c9
3 changed files with 20 additions and 11 deletions

View File

@ -53,6 +53,9 @@ class QuestionController extends Controller
'ordering_items' => 'nullable|array', 'ordering_items' => 'nullable|array',
]); ]);
// Получаем картинки из request напрямую (не через validate)
$answersImages = $request->input('answers', []);
// Проверка что есть хотя бы текст или картинка в ответах // Проверка что есть хотя бы текст или картинка в ответах
if ($validated['type'] === 'multiple_choice' && !empty($validated['answers'])) { if ($validated['type'] === 'multiple_choice' && !empty($validated['answers'])) {
$hasValidAnswer = false; $hasValidAnswer = false;
@ -79,14 +82,14 @@ class QuestionController extends Controller
// Ответы для multiple_choice // Ответы для multiple_choice
if ($validated['type'] === 'multiple_choice' && !empty($validated['answers'])) { if ($validated['type'] === 'multiple_choice' && !empty($validated['answers'])) {
foreach ($validated['answers'] as $answer) { foreach ($validated['answers'] as $index => $answer) {
$hasText = !empty($answer['text']); $hasText = !empty($answer['text']);
$hasImage = !empty($answer['image']); $hasImage = $request->hasFile("answers.$index.image");
if ($hasText || $hasImage) { if ($hasText || $hasImage) {
$imagePath = null; $imagePath = null;
if ($hasImage) { if ($hasImage) {
$imagePath = $answer['image']->store('questions/answers', 'public'); $imagePath = $request->file("answers.$index.image")->store('questions/answers', 'public');
} }
$question->answers()->create([ $question->answers()->create([
'answer_text' => $hasText ? $answer['text'] : null, 'answer_text' => $hasText ? $answer['text'] : null,
@ -189,14 +192,14 @@ class QuestionController extends Controller
// Ответы // Ответы
if ($validated['type'] === 'multiple_choice' && !empty($validated['answers'])) { if ($validated['type'] === 'multiple_choice' && !empty($validated['answers'])) {
$question->answers()->delete(); $question->answers()->delete();
foreach ($validated['answers'] as $answer) { foreach ($validated['answers'] as $index => $answer) {
$hasText = !empty($answer['text']); $hasText = !empty($answer['text']);
$hasImage = !empty($answer['image']); $hasImage = $request->hasFile("answers.$index.image");
if ($hasText || $hasImage) { if ($hasText || $hasImage) {
$imagePath = null; $imagePath = null;
if ($hasImage) { if ($hasImage) {
$imagePath = $answer['image']->store('questions/answers', 'public'); $imagePath = $request->file("answers.$index.image")->store('questions/answers', 'public');
} }
$question->answers()->create([ $question->answers()->create([
'answer_text' => $hasText ? $answer['text'] : null, 'answer_text' => $hasText ? $answer['text'] : null,

View File

@ -150,14 +150,17 @@ function removeAnswer(btn) { btn.parentElement.remove(); }
function toggleCorrect(btn) { function toggleCorrect(btn) {
const inputGroup = btn.parentElement; const inputGroup = btn.parentElement;
const hidden = inputGroup.querySelector('input[type="hidden"][name*="is_correct"]'); const hidden = inputGroup.querySelector('input[type="hidden"][name*="is_correct"]');
const icon = btn.querySelector('i');
if (hidden.value === '0') { if (hidden.value === '0') {
hidden.value = '1'; hidden.value = '1';
btn.innerHTML = '<i class="bi bi-check-circle-fill text-success"></i>'; icon.classList.remove('bi-circle');
icon.classList.add('bi-check-circle-fill');
btn.classList.remove('btn-outline-success'); btn.classList.remove('btn-outline-success');
btn.classList.add('btn-success'); btn.classList.add('btn-success');
} else { } else {
hidden.value = '0'; hidden.value = '0';
btn.innerHTML = '<i class="bi bi-circle"></i>'; icon.classList.remove('bi-check-circle-fill');
icon.classList.add('bi-circle');
btn.classList.remove('btn-success'); btn.classList.remove('btn-success');
btn.classList.add('btn-outline-success'); btn.classList.add('btn-outline-success');
} }

View File

@ -176,14 +176,17 @@ function removeAnswer(btn) { btn.parentElement.remove(); }
function toggleCorrect(btn) { function toggleCorrect(btn) {
const inputGroup = btn.parentElement; const inputGroup = btn.parentElement;
const hidden = inputGroup.querySelector('input[type="hidden"][name*="is_correct"]'); const hidden = inputGroup.querySelector('input[type="hidden"][name*="is_correct"]');
const icon = btn.querySelector('i');
if (hidden.value === '0') { if (hidden.value === '0') {
hidden.value = '1'; hidden.value = '1';
btn.innerHTML = '<i class="bi bi-check-circle-fill text-success"></i>'; icon.classList.remove('bi-circle');
icon.classList.add('bi-check-circle-fill');
btn.classList.remove('btn-outline-success'); btn.classList.remove('btn-outline-success');
btn.classList.add('btn-success'); btn.classList.add('btn-success');
} else { } else {
hidden.value = '0'; hidden.value = '0';
btn.innerHTML = '<i class="bi bi-circle"></i>'; icon.classList.remove('bi-check-circle-fill');
icon.classList.add('bi-circle');
btn.classList.remove('btn-success'); btn.classList.remove('btn-success');
btn.classList.add('btn-outline-success'); btn.classList.add('btn-outline-success');
} }