سلام
فرض کنید که شما یک فرمی ساختید که داخلش فیلد چک باکس دارید. حالا داخل همین فیلد چک باکس چندین گزینه برای انتخاب کاربر قرار دارید. اما میخواید که کاربر فقط بتونه مثلا از این 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: سمت چپش هم اسم فرمتون رو نوشته. آیدی فرم که تا اینجا پیدا شد.
برای پیدا کردن آیدی فیلد هم توی همون صفحه ویرایش گر فرم با موس برید روی فیلد چک باکس ، حالا میبینید که بالای فیلد سمت چپ، نوشته چک باکس : شماره فیلد : … خب شماره فیلد همون آیدی فیلد هست. آیدی فیلد هم که ازینجا پیدا شد.
خب دیگه کار تمومه.
20 پاسخ
سلام
چطور میشه وقتی افزونه فارسی ساز نصبه، یک فرم انگلیسی و چپ به راست ساخت؟
ممنون
سلام .
کلا فارسی ساز هم نصب نباشه بازم راست به چپه چون اصلا ما کاری با خروجی فرم نداشتیم . اون از قالبتون ارث بری میکنه . اما حالا اگه میخواید فرم چپ به راست بشه باید از طریق css این کار بکنید که اگه بلد نیستید لینک فرم رو بذارید تا کد css اش رو براتون بذارم .
سلام
وقتی که فارسی ساز غیر فعال هست از قالب ارث بری می کنه، اما زمانی که فارسی ساز رو فعال میکنم همه فرم ها راست به چپ میشن.
لینک فرم:
http://homapour.com/en/general-immigration-form/
ممنون
سلام
وقتی فارسی ساز فعال نیست تو زبان فارسی سایت راست به چپه و تو زبان انگلیسی سایت چپ به راست ؟
یا در هر دو زبان یک صورته ؟
سلام
بله دقیقا زمانی که فارسی ساز فعال نیست در زبان فارسی سایت، فرم راست به چپه و در زبان انگلیسی سایت، فرم چپ به راست.
سلام .
به نسخه 1.4.2 بروز رسانی کنید . اگه رفع نشده بود دسترسی بدید بررسی کنم .
سلام
کاملا درست شد.
ممنون که انقدر سریع مشکل رو برطرف کردید.
خواهش میکنم دوست عزیز.
سلام دوست عزیز. ممنون از آموزشت.
من اگه بخوام توی یک فرم که چند تا فیلد چک باکس داره، برای همه یا چند فیلد چک باکس، محدودیت انتخاب بگذارم چه کنم؟
سلام .
خواهش .
باید همون الگو رو تکرار کنید :
new GFLimitCheckboxes(1, array(
2 => array(
'min' => 3,
'max' => 4
)
,
5 => array(
'min' => 6,
'max' => 7
)
));
بجای 5 آیدی اون یکی چک باکس و بجای 6 و 7 باید مقدار حداقل و حداکثر رو وارد کنید .
با سلام چه جوری میشه توی فیلد تاریخ محدودیت انتخاب ایجاد کرد مثلا تاریخ امروز بگیره و امکان انتخاب دو روز بعد رو نداشته باشه و یکسری محدودیت های دیگه مثل این افزونه :
http://gravitywiz.com/documentation/gp-limit-dates
با تشکر
سلام . فعلا با تاریخ شمسی نمیشه . برای میلادی هم توی همون سایت چند تا اموزش تو قسمت blog هست .
در مورد محدود کردن تاریخ و محدود کردن انتخاب تاریخ توی گرویتی فرم پلاگینی وجود داره
مثلا کاربر تاریخ خاص و یا رنج خاصی از تاریخ ها رو انتخاب کنه یا روزهای تعطیل غرفعال بشن
برای میلادی سایت http://gravitywiz.com چند مورد اموزشی گذاشته . شمسی فعلا خیر .
سلام نمیدونم با کامپوننت ار اس فروم جوملا کار کردید یا نه ، برای اینکه تعداد انتخاب چک باکس محدود بشه مثلا به 3تا چه کدی رو باید اضافه کرد ، کدی که بالاتر گفتید در کامپوننت کار نمیکنه
سلام . خیر جوملا در فیلد کاری بنده نیستش .
درباره سوال قبلی ، کاری با جوملا ندارم ، چطور میشه برای فیلد چک باکس ، محدودیت انتخاب گذاشت مثلا از 20تا گزینه حداکثر 3 گزینه رو بشه انتخاب کرد
سلام
خب همین آموزش داره مورد مد نظر شما رو میگه .
با سلام
برای کدی که گذاشتین برای این که زمانی که چند فیلد جداگانه رادیو باتن داریم و میخوایم از بین سه فیلد چک باکس که به نوعی در گروههای جداگانه هستن کلا از 5 رادیو باتن جداگانه فقط 2 تا از 5 تا قابل انتخاب باشن این کد بالا آیا جواب میده؟
و یه سوال دیگه اینکه چطور میشه امکان عدم انتخاب رو وقتی روی یک رادیو باتن انتخاب شده میزنیم ، اعمال بشه
ممنون میشم اگر کمک کنید خیلی نیاز دارم
سلام
برای اینکه کسی نتونه عدم انتخاب رادیو باتن رو انجام بده باید تیک ضروری رو توی تب عمومی همون فیلد بزنید.
این کد مخصوص چک باکس هست و روی مورد موردنظر شما جوابگو نیست.