سبحان مولایی
3 سال پیش توسط سبحان مولایی مطرح شد
12 پاسخ

استفاده از select2 در livewire

سلام دوستان.
من دارم از لایووایر و کتابخانه spatie/laravel-permission استفاده می کنم می خواهم از کتابخانه select2 استفاده کنم تا نقش های کاربر را انتخاب کنم اما مشکلی که دارم این هست که قبل از انتخاب نقش به این شکل نمایش داده می شود.

اما بعد از انتخاب به این شکل در می اید.
توضیح تصویر رو وارد کنید

کد های component:

class Create extends Component
{
    use WithFileUploads;

    public $user = ['name' => '','email' => '','avatar' => '','password' => '','national_code' => ''];
    public $user_roles = [];

    public function render()
    {
        return view('livewire.admin.users.create',['roles' => Role::pluck('name','id')]);
    }

    protected $rules = [
        'user.avatar' => 'required|file|image',
        'user.name' => 'required|string|min:3',
        'user.email' => 'required|email|unique:users,email',
        'user.password' => 'required|min:6',
        'user.national_code' => 'required|min:10'
    ];

    public function submit()
    {
        $this->validate();
        $this->user['password'] = \Hash::make($this->user['password']);
        $user = User::create($this->user);
        $user->save();
        $user->updateProfilePhoto($this->user['avatar']);
        $name = $user->name;
        $user->syncRoles($this->user_roles);

        return $this->redirect(route('admin.users.index'));
    }
}

کدهای blade :

                <div class="form-group">
                    <label for="roles">نقش ها</label>
                    <select class="form-control" id="roles" multiple wire:model="user_roles" data-placeholder="یک نقش را انتخاب کنید" style="width: 100%;text-align: right" >
                        @foreach($roles as $id => $role)
                            <option value="{{ $id }}">{{ $role }}</option>
                        @endforeach
                    </select>
                    @error('roles') <span class="error text-danger">{{ $message }}</span> @enderror
                </div>

@hesammousavi
@mohaligateway
@juza66
@ali.bayat


ثبت پرسش جدید
سبحان مولایی
تخصص : برنامه‌نویس وب: Python ::...
@websaz 3 سال پیش مطرح شد
2

ممنون راه حل رو پیدا کردم .
بعد از select شدن ایتم component رفرش می شد در نتیجه select2 از بین می رفت. الان با استفاده از هوک بعد از رفرش دوباره select2 را فعال می کنم.
@juza66


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 3 سال پیش آپدیت شد
1

اگر از wire:ignore روی اون فیلدت select استفاده کنی مشکل حل نمیشه؟! روی div اصلیش بذاری چی؟!


سبحان مولایی
تخصص : برنامه‌نویس وب: Python ::...
@websaz 3 سال پیش مطرح شد
0

وقتی از wire:ignore روی فیلد select استفاده می کنم فیلد بعد از انتخاب یک ایتم کلا select hide می شود.
@juza66


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 3 سال پیش مطرح شد
سبحان مولایی
تخصص : برنامه‌نویس وب: Python ::...
@websaz 3 سال پیش آپدیت شد
0

از مطالب همان سایت استفاده کردم

این هم قسمت جاواسکریپت

@push('scripts')
    <script>
        $(document).ready(() => {
            $('#roles').select2()
            $('#roles').on('change', function (e) {
                var data = $('#roles').select2("val");
            @this.set('user_roles', data);
            });
        })
    </script>
@endpush

@juza66


سبحان مولایی
تخصص : برنامه‌نویس وب: Python ::...
@websaz 3 سال پیش مطرح شد
2

ممنون راه حل رو پیدا کردم .
بعد از select شدن ایتم component رفرش می شد در نتیجه select2 از بین می رفت. الان با استفاده از هوک بعد از رفرش دوباره select2 را فعال می کنم.
@juza66


سعید ولی پور
@svalipoor7292 2 سال پیش آپدیت شد
0

سلام
میشه نمونه کدتون رو به اشتراک بذارید
با تشکر


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 2 سال پیش آپدیت شد
0

سلام ممنون میشم اگر راه حلتون رو در اختیار قرار بدید
من با wire:model روی select2 نتونستم کار کنم
به جاش از event ها استفاده کردم و با تغییر مقدار select2 از سمت front یک emit انجام دادم و توی کامپوننت هم یک listener قرار دادم و مقدار پاس داده شده بهش رو آبدیت کردم

    document.addEventListener('DOMContentLoaded',()=>{
        $(document).on('change','.select2',function (){
            Livewire.emit('categoryChanged',$(this).val())
        })
    })
    protected $listeners=[
        'categoryChanged'
    ];

    public function categoryChanged($id)
    {
        $this->category->category_id=$id;
    }

سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 2 سال پیش آپدیت شد
0

سلام محمدرضا جان به شکل زیر انجام میشه ، اگر توی یک div شما یک wire:ignore قرار بدی و توش از از سلکت 2 استفاده کنی، میتونی با کدهای جیکوری اطلاعات رو سمت بک اند کامپونت ارسال کنی. روش شما هم جالب بود.

کدهای html کامپونت

<div class="col-md-12" wire:ignore>
                    <select class="form-select select2" id="ProductID">
                      <option value="">کالا را انتخاب کنید</option>
                      @foreach($products as $product)
                        <option value="{{ $product->id }}">{{ $product->name }}</option>
                      @endforeach
                    </select>
                </div>

کد جیکوری

$('.select2').on('change', function (e) {
            var data = $('#ProductID').select2("val");
            @this.set('productId', data);
        });

توی بک اند هم فقط کافیه متغییر productId رو تعریف کنی و نیازی به listeners و فاکشن اجرا کننده ش نداری

public $productId

توضیح تصویر رو وارد کنید

کدهای جیکوری رو میتونی بهینه تر بنویسی اینو کدها برای یکسال پیش هستند :)


Mohammad reza Golshahi
تخصص : Go - Python
@golshahimohammadreza 2 سال پیش آپدیت شد
0

یک راه حل دیگه که کد کمتری هم داره بع این صورت هستش که پارمتر تو فرم ارسال بشه :

   <"form wire:submit.prevent="store({'categories_id' : $('select[name=categories_id]').select2('val')} >
</form>

سهیل رضایی
@rezaesoheil 2 سال پیش آپدیت شد
0

با alpine من این طوری استفاده میکنم و خوب جواب داده تا الان
model که به کامپوننت پاس داده شده میتونه entangle('yoouVar') یا entangle('yourVar').defer
باشه که توی blade به کامپوننت پاس میدید

export default (model) => ({
    model,
    init() {
        this.initSelect();

        Livewire.hook('message.received', (message, component) => {
            $(this.$el).select2('destroy')
        })

        Livewire.hook('message.processed', (message, component) => {
            this.initSelect();
        })
    },
    initSelect() {
        const el = $(this.$el).select2({
            allowClear: false,
            language: translations,
            dropdownParent: $(this.$el).parent(),
        })

        $(el).on('change', () => {
            var data = $(el).select2("val");
            this.model = data;
        })
    }
})

let translations = {
    errorLoading: function () {
        return "امکان بارگذاری نتایج وجود ندارد."
    }, inputTooLong: function (n) {
        return "لطفاً " + (n.input.length - n.maximum) + " کاراکتر را حذف نمایید"
    }, inputTooShort: function (n) {
        return "لطفاً تعداد " + (n.minimum - n.input.length) + " کاراکتر یا بیشتر وارد نمایید"
    }, loadingMore: function () {
        return "در حال بارگذاری نتایج بیشتر..."
    }, maximumSelected: function (n) {
        return "شما تنها می‌توانید " + n.maximum + " آیتم را انتخاب نمایید"
    }, noResults: function () {
        return "هیچ نتیجه‌ای یافت نشد"
    }, searching: function () {
        return "در حال جستجو..."
    }, removeAllItems: function () {
        return "همه موارد را حذف کنید"
    }
}

کیارش مالکی
تخصص : Backend developer
@nader.register 1 سال پیش آپدیت شد
0

سلام وقت بخیر.

یک FullPageComponent ساختم و داخل صفحه blade اون یک کامپوننت دیگه لایور وایر استفاده کردم و داخل اون یک select2 استفاده کردم برای نمایش استان. که وقتی روی اون کلیک شد بره و شهرشم رو load کنه.

حالا مشکل اینجاست که وقتی من رو select شهر ها کلیک می کنم هیچ اطلاعاتی ارسال نمی شه و بعد پستی در این رابطه خوندم.لینکش این زیره
لینک

خب من تو این پروژه layout توی بخش FullPageComponent هم تعریف شده و کامپوننت select2 هم layout نداره. پس طبق بحث بالا نمی تونم از

@push('scripts')

استفاده کنم. و نمی تونم کد رو درستش کنم.
راهنماییم کنید چی که کنم واقعا


نوب
تخصص : کدنویس نوب :)
@yk5742g 1 سال پیش مطرح شد
0

@websaz
سلام
میشه کدی که select2 را توی لایووایر درست نشون میده را برام بزاری اینجا ؟
من دارم از select های وابسته استفاده میکنم و وقتی که شرط جاری میشه و میخواد select2 بیاد اون را به صورت select معمولی نشون میده بعد
از updated و dehyrate هم استفاده کردم نشد.
تشکر


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام