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

سلام .

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

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

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

درباره نویسنده

حنان ابراهیمی ستوده

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

نوشته های مرتبط

18 نظر

    1. حنان ابراهیمی ستوده
      حنان ابراهیمی ستوده

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

      پاسخ
  1. مجتبی

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

    پاسخ
  2. وحید

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

    پاسخ

نظری بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *


7 + 8 =