'button',
'data-rahkar-pick-list' => '',
],
'',
'search'
);
}
$buttons .= Ui::button(
__( 'بررسی کد', 'rahkar-toolkit' ),
'secondary',
[
'type' => 'button',
'data-rahkar-pick-check' => '',
],
'',
'check'
);
return sprintf(
'
',
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;
}
}