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

سلام
فرض کنید که شما یک فرمی ساختید که داخلش فیلد چک باکس دارید. حالا داخل همین فیلد چک باکس چندین گزینه برای انتخاب کاربر قرار دارید. اما میخواید که کاربر فقط بتونه مثلا از این 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: سمت چپش هم اسم فرمتون رو نوشته. آیدی فرم که تا اینجا پیدا شد.
برای پیدا کردن آیدی فیلد هم توی همون صفحه ویرایش گر فرم با موس برید روی فیلد چک باکس ، حالا میبینید که بالای فیلد سمت چپ، نوشته چک باکس : شماره فیلد : … خب شماره فیلد همون آیدی فیلد هست. آیدی فیلد هم که ازینجا پیدا شد.

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

5/5 - (1 امتیاز)

20 پاسخ

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

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

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

    1. سلام .
      خواهش .
      باید همون الگو رو تکرار کنید :

      new GFLimitCheckboxes(1, array(

      2 => array(
      'min' => 3,
      'max' => 4
      )
      ,
      5 => array(
      'min' => 6,
      'max' => 7
      )

      ));

      بجای 5 آیدی اون یکی چک باکس و بجای 6 و 7 باید مقدار حداقل و حداکثر رو وارد کنید .

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

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

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

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

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

جدیدترین مقالات