'button', 'data-rahkar-pick-list' => '', ], '', 'search' ); } $buttons .= Ui::button( __( 'بررسی کد', 'rahkar-toolkit' ), 'secondary', [ 'type' => 'button', 'data-rahkar-pick-check' => '', ], '', 'check' ); return sprintf( '
%s
', esc_attr( $gatewayId ), esc_attr( $inputId ), esc_attr( $varId ), $autocheck ? '1' : '', $buttons, Ui::select( '', [ '' => __( 'در حال خواندن…', 'rahkar-toolkit' ) ], '', [ 'data-rahkar-pick-select' => '' ] ) ); } /** * The first enabled gateway that can read patterns, for fields that are not * tied to one gateway — a notification event's pattern. */ public static function defaultGateway(): string { foreach ( Gateways::enabled() as $driver ) { if ( $driver instanceof PatternLookupDriver ) { return $driver->id(); } } return ''; } /** * Forget a gateway's cached list — its credentials just changed. * * @param string $gatewayId Gateway id. */ public static function flush( string $gatewayId ): void { delete_transient( self::cacheKey( $gatewayId ) ); } /** * Answer the picker's requests: `list` or `lookup`. * * @internal AJAX callback. */ public static function handleAjax(): void { check_ajax_referer( self::NONCE, 'nonce' ); if ( ! current_user_can( Menu::CAPABILITY ) ) { wp_send_json_error( [ 'message' => __( 'شما اجازه این کار را ندارید.', 'rahkar-toolkit' ) ], 403 ); } $gatewayId = isset( $_POST['gateway'] ) ? sanitize_key( wp_unslash( $_POST['gateway'] ) ) : ''; $op = isset( $_POST['op'] ) ? sanitize_key( wp_unslash( $_POST['op'] ) ) : ''; $driver = Gateways::available()[ $gatewayId ] ?? null; if ( 'list' === $op && $driver instanceof PatternListDriver ) { $refresh = ! empty( $_POST['refresh'] ); $cached = $refresh ? false : get_transient( self::cacheKey( $gatewayId ) ); if ( is_array( $cached ) ) { wp_send_json_success( [ 'patterns' => $cached ] ); } $patterns = $driver->listPatterns(); if ( is_string( $patterns ) ) { wp_send_json_error( [ 'message' => $patterns ] ); } $rows = array_map( static fn( PatternInfo $pattern ): array => $pattern->toArray(), $patterns ); set_transient( self::cacheKey( $gatewayId ), $rows, self::CACHE_TTL ); wp_send_json_success( [ 'patterns' => $rows ] ); } if ( 'lookup' === $op && $driver instanceof PatternLookupDriver ) { $code = isset( $_POST['code'] ) ? sanitize_text_field( wp_unslash( $_POST['code'] ) ) : ''; if ( '' === trim( $code ) ) { wp_send_json_error( [ 'message' => __( 'کد الگو را وارد کنید.', 'rahkar-toolkit' ) ] ); } $pattern = $driver->lookupPattern( $code ); if ( is_string( $pattern ) ) { wp_send_json_error( [ 'message' => $pattern ] ); } wp_send_json_success( [ 'pattern' => $pattern->toArray() ] ); } wp_send_json_error( [ 'message' => __( 'این درگاه خواندن الگو را پشتیبانی نمی‌کند.', 'rahkar-toolkit' ) ] ); } /** * Queue the script and its settings, once. */ private static function enqueue(): void { if ( self::$enqueued ) { return; } self::$enqueued = true; wp_enqueue_script( 'rahkar-wp-patterns', RAHKAR_WP_URL . 'assets/dist/admin-patterns.js', [], RAHKAR_WP_VERSION, true ); wp_add_inline_script( 'rahkar-wp-patterns', 'window.rahkarPatterns=' . wp_json_encode( [ 'ajaxUrl' => admin_url( 'admin-ajax.php' ), 'action' => self::ACTION, 'nonce' => wp_create_nonce( self::NONCE ), 'i18n' => [ 'choose' => __( 'یک الگو انتخاب کنید…', 'rahkar-toolkit' ), 'refresh' => __( '↻ خواندن دوباره از پنل', 'rahkar-toolkit' ), 'loading' => __( 'در حال خواندن…', 'rahkar-toolkit' ), 'empty' => __( 'هیچ الگوی پیامکی در این پنل نیست.', 'rahkar-toolkit' ), 'failed' => __( 'ارتباط برقرار نشد. دوباره تلاش کنید.', 'rahkar-toolkit' ), 'noCode' => __( 'اول کد الگو را وارد کنید.', 'rahkar-toolkit' ), 'text' => __( 'متن:', 'rahkar-toolkit' ), 'variables' => __( 'متغیرها:', 'rahkar-toolkit' ), 'status' => __( 'وضعیت:', 'rahkar-toolkit' ), 'none' => __( 'بدون متغیر', 'rahkar-toolkit' ), 'inactive' => __( 'این الگو هنوز تأیید نشده؛ پیامکی با آن ارسال نمی‌شود.', 'rahkar-toolkit' ), 'varFilled' => __( 'نام متغیر هم پر شد.', 'rahkar-toolkit' ), 'varPick' => __( 'این الگو چند متغیر دارد؛ کدام‌یک مقدار را می‌گیرد؟', 'rahkar-toolkit' ), 'unsaved' => __( 'برای اعمال، فرم را ذخیره کنید.', 'rahkar-toolkit' ), ], ], JSON_UNESCAPED_UNICODE ) . ';', 'before' ); } /** * Transient key for a gateway's list. * * @param string $gatewayId Gateway id. */ private static function cacheKey( string $gatewayId ): string { return 'rahkar_wp_patterns_' . $gatewayId; } }