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

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

به این post امتیاز دهید

‏20 نظرات

  • Author's gravatar
    هادی ۱۴ام اسفند ۱۳۹۳ , ۹:۳۲ ب٫ظ

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

    ممنون

    • Author's gravatar
      گرویتی فرم پارسی ۱۵ام اسفند ۱۳۹۳ , ۱:۵۰ ق٫ظ

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

  • Author's gravatar
    هادی ۱۵ام اسفند ۱۳۹۳ , ۲:۰۷ ب٫ظ

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

    ممنون

    • Author's gravatar
      گرویتی فرم پارسی ۱۵ام اسفند ۱۳۹۳ , ۲:۴۰ ب٫ظ

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

      • Author's gravatar
        هادی ۱۵ام اسفند ۱۳۹۳ , ۳:۲۲ ب٫ظ

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

        • Author's gravatar
          گرویتی فرم پارسی ۱۵ام اسفند ۱۳۹۳ , ۳:۳۳ ب٫ظ

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

          • Author's gravatar
            هادی ۱۵ام اسفند ۱۳۹۳ , ۳:۵۰ ب٫ظ

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

          • Author's gravatar
            گرویتی فرم پارسی ۱۵ام اسفند ۱۳۹۳ , ۳:۵۸ ب٫ظ

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

  • Author's gravatar
    امیر ۱۵ام اسفند ۱۳۹۳ , ۳:۴۴ ب٫ظ

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

    • Author's gravatar
      گرویتی فرم پارسی ۱۵ام اسفند ۱۳۹۳ , ۳:۵۶ ب٫ظ

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

      new GFLimitCheckboxes(1, array(

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

      ));

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

  • Author's gravatar
    مجتبی فرحزاد ۲۶ام بهمن ۱۳۹۴ , ۴:۵۷ ب٫ظ

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

    • Author's gravatar
      گرویتی فرم پارسی ۲۹ام بهمن ۱۳۹۴ , ۴:۰۲ ب٫ظ

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

  • Author's gravatar
    مجتبی ۲۶ام بهمن ۱۳۹۴ , ۹:۵۶ ب٫ظ

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

  • Author's gravatar
    وحید ۱۳ام فروردین ۱۳۹۵ , ۲:۲۰ ب٫ظ

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

    • Author's gravatar
      گرویتی فرم پارسی ۱۵ام فروردین ۱۳۹۵ , ۸:۲۱ ب٫ظ

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

  • Author's gravatar
    وحید ۱۸ام فروردین ۱۳۹۵ , ۱:۳۰ ب٫ظ

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

    • Author's gravatar
      گرویتی فرم پارسی ۱۹ام فروردین ۱۳۹۵ , ۲:۲۳ ب٫ظ

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

  • Author's gravatar
    Rahimi ۲۷ام تیر ۱۳۹۶ , ۹:۴۹ ب٫ظ

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

    • Author's gravatar
      گرویتی فرم پارسی ۲۹ام تیر ۱۳۹۶ , ۱:۰۱ ق٫ظ

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

دیدگاه بسته است