Как правильно вложить модальный компонент?

У меня проблема. Я пытаюсь создать модальное окно для отчетов, которое динамически обслуживает как комментарии, так и сообщения, поэтому нет необходимости создавать несколько модальных окон. Я создал один компонент для отчетов, который будет обслуживать оба типа отчетов, но мне сложно обеспечить, чтобы для данного типа открывалось только одно модальное окно, либо для публикации, либо для комментария. В настоящее время оба модальных окна открываются одновременно — когда я отправляю одно, открывается и другое. Я могу пожаловаться как на публикацию, так и на комментарий в одном представлении. Однако я хочу, чтобы модальное окно открывалось только для определенного типа. Я даже пробовал создать два модальных окна с разными действиями, но это тоже не помогло. Что касается сохранения данных в базе данных, то все работает нормально. Вопрос не связан с этим. Меня больше беспокоит процесс внешнего интерфейса: как открывать модальное окно отдельно для каждого компонента в зависимости от того, что щелкает пользователь, а не открытие обоих окон одновременно. Спасибо вам за вашу помощь.

Это мой компонент report.blade.php, который является модальным и имеет функциональность.

<?php

use Livewire\Volt\Component;
use App\Models\Post;
use App\Models\Report;
use Mary\Traits\Toast;
use Illuminate\Database\Eloquent\Model;

new class extends Component {
    use Toast;
    protected $listeners = ['openReportModal'];

    public Model $model;
    public $reportableType;
    public $reportableId;

    public bool $report_modal = false;
    public array $selectedReports = [];

    public function mount(Model $model): void
    {
        $this->model = $model;
        $this->reportable_type = $model->reportable_type;
        $this->reportable_id = $model->reportable_id;
    }

    public function openReportModal($params)
    {
        $this->reportable_id = $params['id'];
        $this->reportable_type = $params['type'];
        $this->report_modal = true;
    }

    public function reportTypes()
    {
        $reportTypes = [
            'Spam' => 'Spam',
            'Nepřístojný' => 'Nepřístojný obsah',
            'Urážlivý' => 'Urážlivý',
            'Jiné' => 'Jiné',
        ];
        return $reportTypes;
    }
    public function report(): void
    {
        if (auth()->check()) {
            $selectedReports = $this->selectedReports;

            if (empty($selectedReports)) {
                $this->error('Vyberte prosím alespoň jeden typ reportu.');
                return;
            }

            $reportData = [
                'user_id' => auth()->user()->id,
                'reportable_id' => $this->model->id,
                'reportable_type' => class_basename($this->model),
            ];

            foreach ($selectedReports as $reportType) {
                switch ($reportType) {
                    case 'Spam':
                        $reportData['spam'] = true;
                        break;
                    case 'Nepřístojný':
                        $reportData['inappropriate'] = true;
                        break;
                    case 'Urážlivý':
                        $reportData['offensive'] = true;
                        break;
                    case 'Jiné':
                        $reportData['other'] = true;
                        break;
                }
            }

            $report = new Report($reportData);
            $report->save();
            $this->reset(['report_modal', 'selectedReports']);

            $objectType = $this->model instanceof Post ? 'Příspěvek' : 'Komentář';
            $this->success("$objectType byl nahlášen.");
        }
    }
}; ?>

<div>
    <x-modal wire:model = "report_modal" title = "Nahlášení" subtitle = "Pokud je komentář nevhodný, můžete ho zde nahlásit"
        separator>
        <form wire:submit.prevent = "report">
            @foreach ($this->reportTypes() as $key => $reportType)
                <div class = "flex items-center justify-left mb-2">
                    <input type = "checkbox" id = "{{ $key }}" wire:model = "selectedReports" value = "{{ $key }}"
                        class = "mr-2">
                    <label for = "{{ $key }}">{{ $reportType }}</label>
                </div>
            @endforeach
            <x-slot name = "actions">
                <x-button label = "Cancel" @click = "$wire.report_modal = false" />
                <x-button label = "Confirm" @click = "$wire.report" class = "btn-primary" type = "submit" />
            </x-slot>
        </form>
    </x-modal>


</div>



Это карточка комментариев, где я вызываю модальное окно

public function openReportModal(){
        $this->dispatch('openReportModal', ['id' => $this->comment->id, 'type' => get_class($this->comment)]);

    }

<x-slot:menu>
            <x-dropdown right>
                <x-slot name = "trigger">
                    <x-button icon = "o-ellipsis-vertical" class = "btn-sm btn-ghost btn-circle" />
                </x-slot>
                @if (auth()->check())
                    <x-menu-item title = "Nahlásit" icon = "m-shield-exclamation" @click = "$wire.openReportModal"
                        class = "text-error" />
                @endif
                @if ($comment->author->isMyself())
                    <x-menu-item title = "Editace" icon = "o-pencil" @click = "$wire.editing = true" />
                    <x-menu-item title = "Smazat" icon = "o-trash" wire:click = "delete({{ $comment->id }})"
                        class = "text-error" />
                @endif
            </x-dropdown>

        </x-slot:menu>

        <livewire:reports.reports :model = "$comment" :reportable_type = "$comment->reportable_type" :reportable_id = "$comment->reportable_id"/>



Это компонент пост-шоу, где я также вызываю отчеты.

 public function openReportModal(){
        $this->dispatch('openReportModal', ['id' => $this->post->id, 'type' => 'Post']);
    }

@if ($post->author->isMyself())
            <div>
                @if (! $post->archived_at)
                    <x-button label = "Archivovat" wire:click = "archive" icon = "o-archive-box" class = "btn-sm btn-ghost" />
                    <x-button label = "Editace" link = "/posts/{{ $post->id }}/edit" icon = "o-pencil" class = "btn-sm btn-ghost" />
                    <x-button label = "Nahlásit" icon = "m-shield-exclamation" @click = "$wire.openReportModal" class = "btn-sm btn-error" />

                    <x-button label = "Smazat" wire:click = "delete({{ $post->id }})" icon = "o-trash" class = "btn-sm btn-error " />
                    @else
                    <x-button label = "Unarchive" wire:click = "unarchive" icon = "o-archive-box" class = "btn-sm btn-ghost" />
                @endif
            </div>
        @endif

    <livewire:reports.reports :model = "$post" :reportable_type = "$post->reportable_type" :reportable_id = "$post->reportable_id"/>


Я даже не помню всего, что пробовал, но мне нужно иметь одно динамическое модальное окно для нескольких моделей. Однако, когда я нахожусь на веб-странице и у меня есть одно сообщение и два комментария, модальное окно открывается три раза... кажется, для каждого объекта.

Не могли бы вы также предоставить свой код для компонента лезвия <x-modal>? Функция openReportModal, похоже, показывает каждый экземпляр <x-modal> независимо от типа отчета. Вероятно, вам потребуется реализовать какую-то функцию условного скрытия/показа в зависимости от типа, чтобы гарантировать отображение только соответствующего модального окна.

kylepg 23.05.2024 18:07

@kylepg Это компонент из библиотеки MaryUI здесь -> github.com/robsontenorio/mary/blob/main/src/View/Components/‌​…

JayVch 23.05.2024 18:09

Похоже, видимость модального компонента обрабатывается x-data = "{open: @entangle($attributes->wire('model')).live }" в строке 34. В вашей реализации $report_modal — это значение, используемое для $attributes->wire('model') (wire:model = "report_modal"). Для $report_modal установлено значение true для всех модальных окон, поскольку все они прослушивают одно и то же событие браузера (openReportModal). Вы можете добавить проверку в функцию прослушивателя openReportModal(), чтобы убедиться, что передаваемый в событии type соответствует типу этого экземпляра компонента (а не общему $this->report_modal = true).

kylepg 23.05.2024 20:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
3
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решение: Похоже, что видимость модального компонента обеспечивается x-data = "{open: @entangle($attributes->wire('model')).live }" в строке 34.

В вашей реализации $report_modal — это значение, используемое для $attributes->wire('model') (wire:model = "report_modal"). Для всех модальных окон $report_modal установлено значение true, поскольку все они прослушивают одно и то же событие браузера (openReportModal).

Вы можете добавить проверку в функцию прослушивателя openReportModal(), чтобы убедиться, что тип, передаваемый в событии, соответствует типу этого экземпляра компонента (а не универсальному $this->report_modal = true).

Другие вопросы по теме