晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。   林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。   见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝)   既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。   南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。 .
Prv8 Shell
Server : Apache
System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64
User : rainic ( 1014)
PHP Version : 7.4.33
Disable Function : exec,passthru,shell_exec,system
Directory :  /home/stando/www/wp-content/plugins/persian-gravity-forms/includes/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //home/stando/www/wp-content/plugins/persian-gravity-forms/includes/class-deprecated.php
<?php if ( ! defined( 'ABSPATH' ) ) {
	exit;
}
/*
 * @deprecated
 * this methods are used in Gateway->charts
 * will be deleted completely in some next updates
 * */
if ( ! class_exists( 'GFParsi' ) ) :

	class GFParsi {

		public static function better_noDuplicate_hook( $version ) {
			if ( version_compare( $version, '1.9.19', '>' ) ) {
				add_filter( 'gform_is_duplicate', array( __CLASS__, 'better_noDuplicate_1_9_19' ), 10, 4 );
			} else {
				add_filter( 'gform_is_duplicate', array( __CLASS__, 'better_noDuplicate_old' ), 10, 4 );
			}
		}

		public static function better_noDuplicate_1_9_19( $count, $form_id, $field, $value ) {
			global $wpdb;

			$lead_detail_table_name = GFFormsModel::get_lead_details_table_name();
			$lead_table_name        = GFFormsModel::get_lead_table_name();
			$sql_comparison         = 'ld.value = %s';

			switch ( GFFormsModel::get_input_type( $field ) ) {
				case 'time':
					$value = sprintf( "%02d:%02d %s", $value[0], $value[1], $value[2] );
					break;
				case 'date':
					$value = GFFormsModel::prepare_date( $field->dateFormat, $value );
					break;
				case 'number':
					$value = GFCommon::clean_number( $value, $field->numberFormat );
					break;
				case 'phone':
					$value          = str_replace( array( ')', '(', '-', ' ' ), '', $value );
					$sql_comparison = 'replace( replace( replace( replace( ld.value, ")", "" ), "(", "" ), "-", "" ), " ", "" ) = %s';
					break;
				case 'email':
					$value = is_array( $value ) ? rgar( $value, 0 ) : $value;
					break;
			}

			$inner_sql_template = "SELECT %s as input, ld.lead_id
									FROM {$lead_detail_table_name} ld
									INNER JOIN {$lead_table_name} l ON l.id = ld.lead_id\n";


			$inner_sql_template .= "WHERE l.form_id=%d AND ld.form_id=%d
									AND ld.field_number between %s AND %s
									AND status='active'
									AND (payment_status IS NULL OR LOWER(payment_status) IN ('', 'approved', 'approve', 'completed', 'complete', 'actived', 'active', 'paid'))
									AND {$sql_comparison}";

			$sql = "SELECT count(DISTINCT input) AS match_count FROM ( ";

			$inner_sql   = '';
			$input_count = 1;
			if ( is_array( $field->get_entry_inputs() ) ) {
				$input_count = sizeof( $field->inputs );
				foreach ( $field->inputs as $input ) {
					$union     = empty( $inner_sql ) ? '' : ' UNION ALL ';
					$inner_sql .= $union . $wpdb->prepare( $inner_sql_template, $input['id'], $form_id, $form_id, $input['id'] - 0.0001, $input['id'] + 0.0001, $value[ $input['id'] ], $value[ $input['id'] ] );
				}
			} else {
				$inner_sql = $wpdb->prepare( $inner_sql_template, $field->id, $form_id, $form_id, doubleval( $field->id ) - 0.0001, doubleval( $field->id ) + 0.0001, $value, $value );
			}

			$sql .= $inner_sql . "
					) as count
					GROUP BY lead_id
					ORDER BY match_count DESC";

			$count = gf_apply_filters( array(
				'gform_is_duplicate_better',
				$form_id
			), $wpdb->get_var( $sql ), $form_id, $field, $value );

			return $count != null && $count >= $input_count;
		}

		public static function better_noDuplicate_old( $count, $form_id, $field, $value ) {

			global $wpdb;

			$lead_detail_table_name = GFFormsModel::get_lead_details_table_name();
			$lead_table_name        = GFFormsModel::get_lead_table_name();
			$lead_detail_long       = GFFormsModel::get_lead_details_long_table_name();
			$is_long                = ! is_array( $value ) && strlen( $value ) > GFORMS_MAX_FIELD_LENGTH - 10;

			$sql_comparison = $is_long ? '( ld.value = %s OR ldl.value = %s )' : 'ld.value = %s';

			switch ( GFFormsModel::get_input_type( $field ) ) {
				case 'time':
					$value = sprintf( "%02d:%02d %s", $value[0], $value[1], $value[2] );
					break;
				case 'date':
					$value = GFFormsModel::prepare_date( $field->dateFormat, $value );
					break;
				case 'number':
					$value = GFCommon::clean_number( $value, $field->numberFormat );
					break;
				case 'phone':
					$value          = str_replace( array( ')', '(', '-', ' ' ), '', $value );
					$sql_comparison = 'replace( replace( replace( replace( ld.value, ")", "" ), "(", "" ), "-", "" ), " ", "" ) = %s';
					break;
				case 'email':
					$value = is_array( $value ) ? rgar( $value, 0 ) : $value;
					break;
			}

			$inner_sql_template = "SELECT %s as input, ld.lead_id
									FROM {$lead_detail_table_name} ld
									INNER JOIN {$lead_table_name} l ON l.id = ld.lead_id\n";

			if ( $is_long ) {
				$inner_sql_template .= "INNER JOIN {$lead_detail_long} ldl ON ldl.lead_detail_id = ld.id\n";
			}

			$inner_sql_template .= "WHERE l.form_id=%d AND ld.form_id=%d
									AND ld.field_number between %s AND %s
									AND status='active'
									AND (payment_status IS NULL OR LOWER(payment_status) IN ('', 'approved', 'approve', 'completed', 'complete', 'actived', 'active', 'paid'))
									AND {$sql_comparison}";

			$sql = "SELECT count(DISTINCT input) AS match_count FROM ( ";

			$inner_sql   = '';
			$input_count = 1;
			if ( is_object( $field ) && is_array( $field->get_entry_inputs() ) ) {
				$input_count = sizeof( $field->inputs );
				foreach ( $field->inputs as $input ) {
					$union     = empty( $inner_sql ) ? '' : ' UNION ALL ';
					$inner_sql .= $union . $wpdb->prepare( $inner_sql_template, $input['id'], $form_id, $form_id, $input['id'] - 0.0001, $input['id'] + 0.0001, $value[ $input['id'] ], $value[ $input['id'] ] );
				}
			} else {
				$inner_sql = $wpdb->prepare( $inner_sql_template, $field->id, $form_id, $form_id, doubleval( $field->id ) - 0.0001, doubleval( $field->id ) + 0.0001, $value, $value );
			}

			$sql .= $inner_sql . "
					) as count
					GROUP BY lead_id
					ORDER BY match_count DESC";

			$count = gf_apply_filters( 'gform_is_duplicate_better', $form_id, $wpdb->get_var( $sql ), $form_id, $field, $value );

			return $count != null && $count >= $input_count;
		}

		public static function get_base_url() {
			return plugins_url( '', dirname( __FILE__ ) );
		}

		public static function get_mysql_tz_offset() {

			$time_zone_orig = $time_zone = get_option( 'gmt_offset' );

			$prefix    = intval( $time_zone ) > 0 ? '+' : '-';
			$time_zone = abs( $time_zone ) * 3600;
			$time_zone = gmdate( 'H:i', $time_zone );
			$time_zone = $prefix . $time_zone;

			$today = date( 'Y-m-d H:i:s' );
			$date  = new DateTime( $today );

			$tzn = abs( $time_zone_orig ) * 3600;
			$tzh = intval( gmdate( 'H', $tzn ) );
			$tzm = intval( gmdate( 'i', $tzn ) );
			try {
				if ( intval( $time_zone_orig ) < 0 ) {
					$date->sub( new DateInterval( 'P0DT' . $tzh . 'H' . $tzm . 'M' ) );
				} else {
					$date->add( new DateInterval( 'P0DT' . $tzh . 'H' . $tzm . 'M' ) );
				}
			} catch ( Exception $e ) {
				return array( 'tz' => $time_zone, 'today' => time() );
			}
			$today = $date->format( 'Y-m-d H:i:s' );
			$today = strtotime( $today );

			return array( 'tz' => $time_zone, 'today' => $today );
		}
	}
endif;


if ( ! class_exists( 'GFParsi_MelliCode' ) ) :

	class GFParsi_MelliCode {

		private $field = array();

		public function __construct() {

			if ( GFPersian_Core::_option( 'national_id', '1' ) != '1' ) {
				return;
			}

			if ( is_admin() ) {
				add_filter( 'gform_add_field_buttons', array( $this, 'button' ) );
				add_filter( 'gform_field_type_title', array( $this, 'title' ) );
				add_filter( 'gform_editor_js_set_default_values', array( $this, 'label' ) );
				add_action( 'gform_editor_js', array( $this, 'settings' ) );
				add_action( 'gform_field_standard_settings', array( $this, 'standard_settings' ), 10, 2 );
				add_filter( 'gform_tooltips', array( $this, 'tooltips' ) );
				add_filter( 'gform_admin_pre_render', array( $this, 'admin_conditional_logic' ) );
			}

			add_action( 'gform_field_input', array( $this, 'input' ), 10, 5 );
			add_action( 'gform_field_css_class', array( $this, 'classes' ), 10, 3 );
			add_action( 'gform_pre_submission', array( $this, 'pre_submission' ) );
			add_filter( 'gform_field_content', array( $this, 'city' ), 10, 5 );
			add_filter( 'gform_field_validation', array( $this, 'validator' ), 10, 4 );
			add_action( 'wp_footer', array( $this, 'js' ) );
			add_action( 'gform_enqueue_scripts', array( $this, 'external_js' ), 10, 2 );
		}

		public function button( $field_groups ) {
			foreach ( $field_groups as &$group ) {
				if ( $group["name"] == "gf_persian_fields" ) {
					$group["fields"][] = array(
						"class"   => "button",
						"value"   => 'کد ملی',
						"onclick" => "StartAddField('mellicart');"
					);

				}
			}

			return $field_groups;
		}

		public function title( $type ) {
			if ( $type == 'mellicart' ) {
				return 'کد ملی';
			}

			return $type;
		}

		public function label() {
			?>
            case "mellicart" :
            field.label = 'کد ملی';
            break;
			<?php
		}

		public function classes( $classes, $field, $form ) {
			if ( $field["type"] == "mellicart" ) {
				$classes .= " gform_melli_code";
			}

			return $classes;
		}

		public function tooltips( $tooltips ) {
			$tooltips['gform_melli_code_city']       = '<h6>نمایش لحظه ای شهر از روی کد ملی </h6>نمایش شهر و پیغام زیر فیلد کد ملی بعد از پر شدن فیلد . تذکر : در صورتی که این گزینه را فعال نمایید ،ممکن است فراخوانی شهر های ایران با توجه به زیاد بودن آنها سبب سنگین شدن صفحه گردد.';
			$tooltips['gform_melli_code_seperate']   = '<h6>جدا سازی ارقام</h6>در صورتی که این گزینه را فعال نمایید ، پس از پر شدن فیلد کد ملی ، <strong>در صورتی که کد ملی وارد شده صحیح تشخصی داده شود</strong> ؛ کد ملی به صورت زیر در خواهد آمد و در غیر این صورت علی صحیح نبودن کد ملی زیر فیلد نمایش داده خواهد شد :<br>xxx-xxxxxx-x';
			$tooltips['gform_melli_code_abnormal']   = 'با توجه به اینکه کد ملی فقط باید به صورت عدد باشد ، در صورتی که کاراکتری غیر از عدد وارد شده باشد پیغام خطا نمایش داده خواهد شد .<br/>پیغام پیشفرض : کد ملی فقط باید به صورت عدد وارد شود .';
			$tooltips['gform_melli_code_len']        = 'با توجه به اینکه کد ملی می بایست 10 رقمی باشد اگر تعداد رقم وارد شده ، اشتباه باشد پیغام خطا نمایش داده خواهد شد .<br>پیغام پیشفرض : کد ملی می بایست 10 رقمی باشد . تنها در صورتی مجاز به استفاده از کد های 8 یا 9 رقمی هستید که ارقام سمت چپ 0 باشند .';
			$tooltips['gform_melli_code_dup']        = 'در صورتی که از تب وِیژگی تیک گزینه بدون تکرار را زده باشید ؛ بعد از پر شدن فرم و زدن دکمه ارسال پیغامی مبتنی بر تکراری بودن کد ملی نمایش داده خواهد شد . <br/>پیغام پیشفرض : این کد ملی توسط فرد دیگری ثبت شده است .';
			$tooltips['gform_melli_code_noStandard'] = 'در صورتی که کد ملی وارد شده مطابق با الگوریتم کشور نباشد پیغام خطا نمایش داده خواهد شد .<br/>پیغام پیشفرض : کد ملی وارد شده مطابق با استانداردهای کشور نمی باشد .';

			return $tooltips;
		}

		public function input( $input, $field, $value, $lead_id, $form_id ) {

			if ( $field["type"] == "mellicart" ) {

				$is_admin       = is_admin();
				$is_frontend    = ! $is_admin;
				$is_form_editor = ( $is_admin && GFForms::get( 'view' ) != 'entry' );
				$is_entry_page  = ( $is_admin && GFForms::get( 'view' ) == 'entry' );

				if ( ! $is_admin && ( RGFormsModel::get_input_type( $field ) == 'adminonly_hidden' ) ) {
					return '';
				}

				$field_id = $field["id"];
				$form_id  = $is_admin && empty( $form_id ) ? rgget( "id" ) : $form_id;

				$disabled_text = ( $is_admin && rgget( 'view' ) != 'entry' ) ? "disabled='disabled'" : '';

				$size         = rgar( $field, "size" );
				$class_suffix = GFForms::get( 'view' ) == 'entry' ? '_admin' : '';
				$class        = $size . $class_suffix;

				$html5_attributes = '';

				$tabindex = GFCommon::get_tabindex();


				//$this->get_conditional_logic_event( 'keyup' )  //text or radio
				//$this->get_conditional_logic_event( 'change' ) //select
				//$this->get_conditional_logic_event( 'click' )	 // checkbox or radio
				//note : radio has keyup and click
				$logic_event = ! $is_form_editor && ! $is_entry_page ? $field->get_conditional_logic_event( 'keyup' ) : '';

				$input = '<div class="ginput_container ginput_container_text ginput_container_melli_code">';
				$input .= '<input onblur="melli_code_' . $field_id . '(this);" name="input_' . $field_id . '" id="input_' . $form_id . '_' . $field_id . '" type="text" value="' . esc_attr( $value ) . '" class="melli_code ' . esc_attr( $size ) . '" ' . $tabindex . ' ' . $logic_event . ' ' . $html5_attributes . ' ' . $disabled_text . '/>';
				$input .= '</div>';

				if ( $is_frontend ) {
					$input .= '<span class="city melli_code" id="ir_national_id_location_' . $field_id . '"></span>';
				}

			}

			return $input;
		}

		public function settings() { ?>
            <script type='text/javascript'>
                fieldSettings["mellicart"] = ".placeholder_setting, .input_mask_setting, .label_placement_setting, .prepopulate_field_setting, .conditional_logic_field_setting, .label_setting, .admin_label_setting, .size_setting, .rules_setting, .visibility_setting, .duplicate_setting, .default_value_setting, .description_setting, .css_class_setting, .mellicart_setting";
                jQuery(document).bind("gform_load_field_settings", function (event, field, form) {
                    jQuery("#field_mellicart").attr("checked", field["field_mellicart"] == true);
                    jQuery("#field_mellicart_sp").attr("checked", field["field_mellicart_sp"] == true);
                    jQuery("#field_mellicart_sp1").val(field["field_mellicart_sp1"]);
                    jQuery("#field_mellicart_sp2").val(field["field_mellicart_sp2"]);
                    jQuery("#field_mellicart_sp3").val(field["field_mellicart_sp3"]);
                    jQuery("#field_mellicart_sp4").val(field["field_mellicart_sp4"]);
                });
            </script>
			<?php
		}


		public function admin_conditional_logic( $form ) {

			if ( GFCommon::is_entry_detail() ) {
				return $form;
			}

			echo "<script type='text/javascript'>" .
			     " gform.addFilter('gform_is_conditional_logic_field', function (isConditionalLogicField, field) {" .
			     "     return field.type == 'mellicart' ? true : isConditionalLogicField;" .
			     '	});' .
			     "	gform.addFilter('gform_conditional_logic_operators', function (operators, objectType, fieldId) {" .
			     '		var targetField = GetFieldById(fieldId);' .
			     "		if (targetField && targetField['type'] == 'mellicart') {" .
			     "			operators = {'is':'is','isnot':'isNot', '>':'greaterThan', '<':'lessThan', 'contains':'contains', 'starts_with':'startsWith', 'ends_with':'endsWith'};" .
			     '		}' .
			     '		return operators;' .
			     '	});' .
			     '</script>';

			return $form;
		}

		public function standard_settings( $position, $form_id ) {

			if ( $position == 50 ) { ?>

                <li class="mellicart_setting field_setting">

                    <input type="checkbox" id="field_mellicart"
                           onclick="SetFieldProperty('field_mellicart', this.checked);"/>
                    <label for="field_mellicart" class="inline">
                        نمایش شهر بر اساس کد ملی
						<?php gform_tooltip( "gform_melli_code_city" ); ?>
                    </label>


                    <br/>
                    <input type="checkbox" id="field_mellicart_sp"
                           onclick="SetFieldProperty('field_mellicart_sp', this.checked);"/>
                    <label for="field_mellicart_sp" class="inline">
                        جداسازی خودکار ارقام توسط خط فاصله
						<?php gform_tooltip( "gform_melli_code_seperate" ); ?>
                    </label>
                    <br/>


                    <br/>
                    <label for="field_mellicart_sp1">
                        پیغام زمانی که مقدار وارد شده شامل کاراکتر غیر عددی باشد
						<?php gform_tooltip( "gform_melli_code_abnormal" ); ?>
                    </label>
                    <input type="text" class="fieldwidth-3" id="field_mellicart_sp1" size="35"
                           onkeyup="SetFieldProperty('field_mellicart_sp1', this.value);"/>
                    <br/>


                    <br/>
                    <label for="field_mellicart_sp2">
                        پیغام زمانیکه تعداد ارقام وارد شده استاندارد نباشد
						<?php gform_tooltip( "gform_melli_code_len" ); ?>
                    </label>
                    <input type="text" class="fieldwidth-3" id="field_mellicart_sp2" size="35"
                           onkeyup="SetFieldProperty('field_mellicart_sp2', this.value);"/>
                    <br/>


                    <br/>
                    <label for="field_mellicart_sp3">
                        پیغام زمانیکه کد ملی وارد شده قبلا ثبت شده باشد
						<?php gform_tooltip( "gform_melli_code_dup" ); ?>
                    </label>
                    <input type="text" class="fieldwidth-3" id="field_mellicart_sp3" size="35"
                           onkeyup="SetFieldProperty('field_mellicart_sp3', this.value);"/>
                    <br/>


                    <br/>
                    <label for="field_mellicart_sp4">
                        پیغام زمانیکه کد ملی وارد شده مطابق با الگوی ملی نباشد
						<?php gform_tooltip( "gform_melli_code_noStandard" ); ?>
                    </label>
                    <input type="text" class="fieldwidth-3" id="field_mellicart_sp4" size="35"
                           onkeyup="SetFieldProperty('field_mellicart_sp4', this.value);"/>
                    <br/>


                </li>
				<?php
			}
		}


		public function pre_submission( $form ) {

			$mellicart_fields = GFCommon::get_fields_by_type( $form, array( 'mellicart' ) );

			foreach ( (array) $mellicart_fields as $field ) {

				$input_name  = "input_{$field['id']}";
				$input_value = ! rgempty( $input_name ) ? rgpost( $input_name ) : '';

				if ( ! empty( $input_value ) ) {

					if ( strlen( $input_value ) == 8 ) {
						$_POST["input_{$field['id']}"] = '00' . $input_value;
					} elseif ( strlen( $input_value ) == 9 ) {
						$_POST["input_{$field['id']}"] = '0' . $input_value;
					} else {
						$_POST["input_{$field['id']}"] = $input_value;
					}
				}
			}
		}

		public function city( $content, $field, $value, $lead_id, $form_id ) {

			if ( $field['type'] == 'mellicart' ) {
				if ( ! is_admin() ) {
					$this->field[] = $field;
				}
			}

			return $content;
		}

		public function external_js( $form, $ajax ) {

			$melli_code = GFCommon::get_fields_by_type( $form, array( 'mellicart' ) );

			foreach ( (array) $melli_code as $field ) {

				$is_seperate = rgar( $field, 'field_mellicart_sp' );
				$is_seperate = ! empty( $is_seperate ) ? $is_seperate : false;

				$show_city = rgar( $field, 'field_mellicart' );
				$show_city = ! empty( $show_city ) ? $show_city : false;

				if ( $show_city || $is_seperate ) {
					wp_register_script( 'gform_mellicode', GF_PERSIAN_URL . 'assets/js/national_id.min.js', array(), GF_PERSIAN_VERSION, false );
					wp_enqueue_script( 'gform_mellicode' );
					break;
				}
			}
		}

		public function js() {

			$fields = $this->field;

			if ( empty( $fields ) ) {
				return;
			}

			foreach ( (array) $fields as $field ) {

				$is_seperate = rgar( $field, 'field_mellicart_sp' );
				$is_seperate = ! empty( $is_seperate ) && $is_seperate ? 1 : 0;

				$show_city = rgar( $field, 'field_mellicart' );
				$show_city = ! empty( $show_city ) && $show_city ? 1 : 0;

				if ( ! $show_city && ! $is_seperate ) { ?>
                    <script type="text/javascript">
                        function melli_code_<?php echo $field['id']; ?> (melli_code) {
                        }
                    </script>
					<?php
				} else {

					$message1 = rgar( $field, 'field_mellicart_sp1' );
					$message1 = ! empty( $message1 ) ? $message1 : 'کد ملی فقط باید به صورت عدد وارد شود .';

					$message2 = rgar( $field, 'field_mellicart_sp2' );
					$message2 = ! empty( $message2 ) ? $message2 : 'کد ملی می بایست 10 رقمی باشد .';

					$message3 = rgar( $field, 'field_mellicart_sp4' );
					$message3 = ! empty( $message3 ) ? $message3 : 'کد ملی وارد شده مطابق با استانداردهای کشور نمی باشد .';
					?>

                    <script type="text/javascript">
                        function melli_code_<?php echo $field['id']; ?> (melli_code) {
                            var field_id = "<?php echo $field['id'] ?>";
                            var message1 = "<?php echo $message1 ?>";
                            var message2 = "<?php echo $message2 ?>";
                            var message3 = "<?php echo $message3 ?>";
                            var show_city = <?php echo $show_city ?>;
                            var is_seperate = <?php echo $is_seperate ?>;
                            GFPersian_National_ID_Handler(melli_code, field_id, message1, message2, message3, is_seperate, show_city);
                            jQuery(melli_code).trigger('change');
                        }
                    </script>

					<?php
				}
			}
		}

		public function is_valid( $melli_code = '' ) {

			if ( ! empty( $melli_code ) ) {

				$_melli_code = $melli_code;

				if ( strlen( $melli_code ) == 8 ) {
					$_melli_code = '00' . $melli_code;
				}

				if ( strlen( $melli_code ) == 9 ) {
					$_melli_code = '0' . $melli_code;
				}

				$pre_check = array(
					'0000000000',
					'1111111111',
					'2222222222',
					'3333333333',
					'4444444444',
					'5555555555',
					'6666666666',
					'7777777777',
					'8888888888',
					'9999999999',
					'0123456789',
				);

				if ( in_array( $_melli_code, $pre_check ) ) {
					return 2;
				}

				if ( ! is_numeric( $melli_code ) ) {
					return 4;
				}

				$melli_code = (string) preg_replace( '/[^0-9]/', '', $melli_code );

				if ( strlen( $melli_code ) > 10 || strlen( $melli_code ) < 8 ) {
					return 3;
				}

				$melli_code = $_melli_code;

				$list_code = str_split( $melli_code );
				$last      = (int) $list_code[9];
				unset( $list_code[9] );

				$i   = 10;
				$sum = 0;
				foreach ( $list_code as $key => $val ) {
					$sum += intval( $val ) * $i;
					$i --;
				}

				$mod = (int) $sum % 11;

				if ( $mod >= 2 ) {
					$mod = 11 - $mod;
				}
				if ( $mod != $last ) {
					return 2;
				} else {
					return 1;
				}
			}

			return false;
		}


		public function validator( $result, $value, $form, $field ) {

			if ( $field["type"] == 'mellicart' ) {

				$melli_code = ! empty( $value ) ? str_replace( '-', '', $value ) : '';

				$is_valid = $this->is_valid( $melli_code );

				if ( $is_valid == 4 ) {
					$message            = rgar( $field, 'field_mellicart_sp1' );
					$result['message']  = ! empty( $message ) ? $message : 'کد ملی فقط باید به صورت عدد وارد شود .';
					$result['is_valid'] = false;

					return $result;
				}

				if ( $is_valid == 3 ) {
					$message            = rgar( $field, 'field_mellicart_sp2' );
					$result['message']  = ! empty( $message ) ? $message : 'کد ملی می بایست 10 رقمی باشد . تنها در صورتی مجاز به استفاده از کد های 8 یا 9 رقمی هستید که ارقام سمت چپ 0 باشند .';
					$result['is_valid'] = false;

					return $result;
				}

				if ( $is_valid == 2 ) {
					$message            = rgar( $field, 'field_mellicart_sp4' );
					$result['message']  = ! empty( $message ) ? $message : 'کد ملی وارد شده مطابق با استانداردهای کشور نمی باشد .';
					$result['is_valid'] = false;

					return $result;
				}

				if ( $field['noDuplicates'] ) {

					if ( strlen( $melli_code ) == 8 ) {
						$melli_code = '00' . $melli_code;
					}

					if ( strlen( $melli_code ) == 9 ) {
						$melli_code = '0' . $melli_code;
					}

					if ( RGFormsModel::is_duplicate( $form['id'], $field, $melli_code ) ) {
						$message            = rgar( $field, 'field_mellicart_sp3' );
						$result['message']  = ! empty( $message ) ? $message : 'این کد ملی توسط فرد دیگری ثبت شده است .';
						$result['is_valid'] = false;

						return $result;
					}
				}
			}

			return $result;
		}
	}

endif;

haha - 2025