گرویتی فرم

محدود کردن تعداد انتخاب چک باکس ها

تاریخ: چهارشنبه 4 مارس 2015

دسته بندی:  آموزش

تعداد نظر: ۲۰

تعداد بازدید: ۴۴۶۹


سلام
فرض کنید که شما یک فرمی ساختید که داخلش فیلد چک باکس دارید. حالا داخل همین فیلد چک باکس چندین گزینه برای انتخاب کاربر قرار دارید. اما میخواید که کاربر فقط بتونه مثلا از این 20 تا گزینه فقط 8 تا رو تیک بزنه. یا مثلا حتما حداقل 3 گزینه رو انتخاب کنه.

بازم گرویتی فرم با توجه به انعطافی که داره این مشکل رو حل کرده. ولی اگه یه درصد هم احساس میکنید که شخص مبتدی ای هستید بی خیال این آموزش بشید.

برای این کار باید کد زیر رو داخل فانکشن قالب تون قرار دارید.
قبل از هر کاری از پوشه قالبتون داخل هاست یک کپی بگیرید واسه اطمینان.
فایل functions.php قالب رو باز کنید و برید دقیقا خط آخرش.
خوب دقت کنید که خط آخرش آیا علائم <? وجود داره یا نه.
اگه وجود نداشت که هیچی ولی اگه داشت حذفش کنید. دقت کنید که فقط همین عبارت که شامل یک علامت کوچکتر بزرگتری و یک علامت سوال هست رو حذف کنید نه چیز دیگه رو. حالا دقیقا بعدش کد زیر رو اضافه کنید.

class GFLimitCheckboxes {
 
    private $form_id;
    private $field_limits;
    private $output_script;
 
    function __construct($form_id, $field_limits) {
 
        $this->form_id = $form_id;
        $this->field_limits = $this->set_field_limits($field_limits);
 
        add_filter("gform_pre_render_$form_id", array(&$this, 'pre_render'));
        add_filter("gform_validation_$form_id", array(&$this, 'validate'));
 
    }
 
    function pre_render($form) {
 
        $script = '';
        $output_script = false;
 
        foreach($form['fields'] as $field) {
 
            $field_id = $field['id'];
            $field_limits = $this->get_field_limits($field['id']);
 
            if( !$field_limits                                          // if field limits not provided for this field
                || RGFormsModel::get_input_type($field) != 'checkbox'   // or if this field is not a checkbox
                || !isset($field_limits['max'])        // or if 'max' is not set for this field
                )
                continue;
 
            $output_script = true;
            $max = $field_limits['max'];
            $selectors = array();
 
            foreach($field_limits['field'] as $checkbox_field) {
                $selectors[] = "#field_{$form['id']}_{$checkbox_field} .gfield_checkbox input:checkbox";
            }
 
            $script .= "jQuery(\"" . implode(', ', $selectors) . "\").checkboxLimit({$max});";
 
        }
 
        GFFormDisplay::add_init_script($form['id'], 'limit_checkboxes', GFFormDisplay::ON_PAGE_RENDER, $script);
 
        if($output_script):
            ?>
 
            <script type="text/javascript">
            jQuery(document).ready(function($) {
                $.fn.checkboxLimit = function(n) {
 
                    var checkboxes = this;
 
                    this.toggleDisable = function() {
 
                        // if we have reached or exceeded the limit, disable all other checkboxes
                        if(this.filter(':checked').length >= n) {
                            var unchecked = this.not(':checked');
                            unchecked.prop('disabled', true);
                        }
                        // if we are below the limit, make sure all checkboxes are available
                        else {
                            this.prop('disabled', false);
                        }
 
                    }
 
                    // when form is rendered, toggle disable
                    checkboxes.bind('gform_post_render', checkboxes.toggleDisable());
 
                    // when checkbox is clicked, toggle disable
                    checkboxes.click(function(event) {
 
                        checkboxes.toggleDisable();
 
                        // if we are equal to or below the limit, the field should be checked
                        return checkboxes.filter(':checked').length <= n;
                    });
 
                }
            });
            </script>
 
            <?php
        endif;
 
        return $form;
    }
 
    function validate($validation_result) {
 
        $form = $validation_result['form'];
        $checkbox_counts = array();
 
        // loop through and get counts on all checkbox fields (just to keep things simple)
        foreach($form['fields'] as $field) {
 
            if( RGFormsModel::get_input_type($field) != 'checkbox' )
                continue;
 
            $field_id = $field['id'];
            $count = 0;
 
            foreach($_POST as $key => $value) {
                if(strpos($key, "input_{$field['id']}_") !== false)
                    $count++;
            }
 
            $checkbox_counts[$field_id] = $count;
 
        }
 
        // loop through again and actually validate
        foreach($form['fields'] as &$field) {
 
            if(!$this->should_field_be_validated($form, $field))
                continue;
 
            $field_id = $field['id'];
            $field_limits = $this->get_field_limits($field_id);
 
            $min = isset($field_limits['min']) ? $field_limits['min'] : false;
            $max = isset($field_limits['max']) ? $field_limits['max'] : false;
 
            $count = 0;
            foreach($field_limits['field'] as $checkbox_field) {
                $count += rgar($checkbox_counts, $checkbox_field);
            }
 
            if($count < $min) {
                $field['failed_validation'] = true;
                $field['validation_message'] = sprintf( _n('You must select at least %s item.', 'You must select at least %s items.', $min), $min );
                $validation_result['is_valid'] = false;
            }
            else if($count > $max) {
                $field['failed_validation'] = true;
                $field['validation_message'] = sprintf( _n('You may only select %s item.', 'You may only select %s items.', $max), $max );
                $validation_result['is_valid'] = false;
            }
 
        }
 
        $validation_result['form'] = $form;
 
        return $validation_result;
    }
 
    function should_field_be_validated($form, $field) {
 
        if( $field['pageNumber'] != GFFormDisplay::get_source_page( $form['id'] ) )
            return false;
 
        // if no limits provided for this field
        if( !$this->get_field_limits($field['id']) )
            return false;
 
        // or if this field is not a checkbox
        if( RGFormsModel::get_input_type($field) != 'checkbox' )
            return false;
 
        // or if this field is hidden
        if( RGFormsModel::is_field_hidden($form, $field, array()) )
            return false;
 
        return true;
    }
 
    function get_field_limits($field_id) {
 
        foreach($this->field_limits as $key => $options) {
            if(in_array($field_id, $options['field']))
                return $options;
        }
 
        return false;
    }
 
    function set_field_limits($field_limits) {
 
        foreach($field_limits as $key => &$options) {
 
            if(isset($options['field'])) {
                $ids = is_array($options['field']) ? $options['field'] : array($options['field']);
            } else {
                $ids = array($key);
            }
 
            $options['field'] = $ids;
 
        }
 
        return $field_limits;
    }
 
}

تا اینجای کار ما یه کد کلی قرار دادیم که این قابلیت رو به گرویتی فرم اعمال کنه اما در مرحله بعدی باید بهش بگیم که دقیقا واسه کدوم فرم و کدوم فیلد باید این دستورات اعمال بشه.
خب حالا دقیقا زیر کد بالا، کد زیر رو قرار بدید:

new GFLimitCheckboxes(1, array(
    2 => array(
        'min' => 3,
        'max' => 4
        )
));

بجای عدد 1 باید آیدی فرمتون رو قرار بدید. بجای عدد 2 باید آیدی فیلدتون رو بزارید. بجای عدد 3 باید حداقل تعداد گزینه هایی که باید تیک بخورند و بجای عدد 4 هم باید حداکثر مقدارش رو انتخاب کنید.

اما اگه نمیدونید چطوری باید آیدی فرم و فیلدتون رو پیدا کنید به صورت زیر عمل کنید:
به منوی فرم ها برید و فرم مورد نظرتون رو انتخاب کنید تا ویرایش بشه. در صفحه ویرایشگر فرم بالای صفحه سمت راست، دقیقا زیر عبارت ویرایشگر فرم نوشته ID: سمت چپش هم اسم فرمتون رو نوشته. آیدی فرم که تا اینجا پیدا شد.
برای پیدا کردن آیدی فیلد هم توی همون صفحه ویرایش گر فرم با موس برید روی فیلد چک باکس ، حالا میبینید که بالای فیلد سمت چپ، نوشته چک باکس : شماره فیلد : … خب شماره فیلد همون آیدی فیلد هست. آیدی فیلد هم که ازینجا پیدا شد.

خب دیگه کار تمومه.


۲۰ دیدگاه برای این محصول ثبت شده است!

comment

هادی

پنجشنبه ۱۴ اسفند ۱۳۹۳

سلام چطور میشه وقتی افزونه فارسی ساز نصبه، یک فرم انگلیسی و چپ به راست ساخت؟ ممنون

comment

گرویتی فرم پارسی

جمعه ۱۵ اسفند ۱۳۹۳

سلام . کلا فارسی ساز هم نصب نباشه بازم راست به چپه چون اصلا ما کاری با خروجی فرم نداشتیم . اون از قالبتون ارث بری میکنه . اما حالا اگه میخواید فرم چپ به راست بشه باید از طریق css این کار بکنید که اگه بلد نیستید لینک فرم رو بذارید تا کد css اش رو براتون بذارم .

comment

هادی

جمعه ۱۵ اسفند ۱۳۹۳

سلام وقتی که فارسی ساز غیر فعال هست از قالب ارث بری می کنه، اما زمانی که فارسی ساز رو فعال میکنم همه فرم ها راست به چپ میشن. لینک فرم: http://homapour.com/en/general-immigration-form/ ممنون

comment

گرویتی فرم پارسی

جمعه ۱۵ اسفند ۱۳۹۳

سلام وقتی فارسی ساز فعال نیست تو زبان فارسی سایت راست به چپه و تو زبان انگلیسی سایت چپ به راست ؟ یا در هر دو زبان یک صورته ؟

comment

هادی

جمعه ۱۵ اسفند ۱۳۹۳

سلام بله دقیقا زمانی که فارسی ساز فعال نیست در زبان فارسی سایت، فرم راست به چپه و در زبان انگلیسی سایت، فرم چپ به راست.

comment

گرویتی فرم پارسی

جمعه ۱۵ اسفند ۱۳۹۳

سلام . به نسخه 1.4.2 بروز رسانی کنید . اگه رفع نشده بود دسترسی بدید بررسی کنم .

comment

هادی

جمعه ۱۵ اسفند ۱۳۹۳

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

comment

گرویتی فرم پارسی

جمعه ۱۵ اسفند ۱۳۹۳

خواهش میکنم دوست عزیز.

comment

امیر

جمعه ۱۵ اسفند ۱۳۹۳

سلام دوست عزیز. ممنون از آموزشت. من اگه بخوام توی یک فرم که چند تا فیلد چک باکس داره، برای همه یا چند فیلد چک باکس، محدودیت انتخاب بگذارم چه کنم؟

comment

گرویتی فرم پارسی

جمعه ۱۵ اسفند ۱۳۹۳

سلام . خواهش . باید همون الگو رو تکرار کنید : new GFLimitCheckboxes(1, array( 2 => array( 'min' => 3, 'max' => 4 ) , 5 => array( 'min' => 6, 'max' => 7 ) )); بجای 5 آیدی اون یکی چک باکس و بجای 6 و 7 باید مقدار حداقل و حداکثر رو وارد کنید .

comment

مجتبی فرحزاد

دوشنبه ۲۶ بهمن ۱۳۹۴

با سلام چه جوری میشه توی فیلد تاریخ محدودیت انتخاب ایجاد کرد مثلا تاریخ امروز بگیره و امکان انتخاب دو روز بعد رو نداشته باشه و یکسری محدودیت های دیگه مثل این افزونه : http://gravitywiz.com/documentation/gp-limit-dates با تشکر

comment

گرویتی فرم پارسی

پنجشنبه ۲۹ بهمن ۱۳۹۴

سلام . فعلا با تاریخ شمسی نمیشه . برای میلادی هم توی همون سایت چند تا اموزش تو قسمت blog هست .

comment

مجتبی

دوشنبه ۲۶ بهمن ۱۳۹۴

در مورد محدود کردن تاریخ و محدود کردن انتخاب تاریخ توی گرویتی فرم پلاگینی وجود داره مثلا کاربر تاریخ خاص و یا رنج خاصی از تاریخ ها رو انتخاب کنه یا روزهای تعطیل غرفعال بشن

comment

گرویتی فرم پارسی

پنجشنبه ۲۹ بهمن ۱۳۹۴

برای میلادی سایت http://gravitywiz.com چند مورد اموزشی گذاشته . شمسی فعلا خیر .

comment

وحید

جمعه ۱۳ فروردین ۱۳۹۵

سلام نمیدونم با کامپوننت ار اس فروم جوملا کار کردید یا نه ، برای اینکه تعداد انتخاب چک باکس محدود بشه مثلا به 3تا چه کدی رو باید اضافه کرد ، کدی که بالاتر گفتید در کامپوننت کار نمیکنه

comment

گرویتی فرم پارسی

یکشنبه ۱۵ فروردین ۱۳۹۵

سلام . خیر جوملا در فیلد کاری بنده نیستش .

comment

وحید

چهارشنبه ۱۸ فروردین ۱۳۹۵

درباره سوال قبلی ، کاری با جوملا ندارم ، چطور میشه برای فیلد چک باکس ، محدودیت انتخاب گذاشت مثلا از 20تا گزینه حداکثر 3 گزینه رو بشه انتخاب کرد

comment

گرویتی فرم پارسی

پنجشنبه ۱۹ فروردین ۱۳۹۵

سلام خب همین آموزش داره مورد مد نظر شما رو میگه .

comment

Rahimi

سه شنبه ۲۷ تیر ۱۳۹۶

با سلام برای کدی که گذاشتین برای این که زمانی که چند فیلد جداگانه رادیو باتن داریم و میخوایم از بین سه فیلد چک باکس که به نوعی در گروههای جداگانه هستن کلا از 5 رادیو باتن جداگانه فقط 2 تا از 5 تا قابل انتخاب باشن این کد بالا آیا جواب میده؟ و یه سوال دیگه اینکه چطور میشه امکان عدم انتخاب رو وقتی روی یک رادیو باتن انتخاب شده میزنیم ، اعمال بشه ممنون میشم اگر کمک کنید خیلی نیاز دارم

comment

گرویتی فرم پارسی

پنجشنبه ۲۹ تیر ۱۳۹۶

سلام برای اینکه کسی نتونه عدم انتخاب رادیو باتن رو انجام بده باید تیک ضروری رو توی تب عمومی همون فیلد بزنید. این کد مخصوص چک باکس هست و روی مورد موردنظر شما جوابگو نیست.


ارسال نظر برای این مطلب غیرفعال شده است.