WP_CLI\Dispatcher
Subcommand::prompt_args │ private │ WP-CLI 1.0
Interactively prompt the user for input based on defined synopsis and passed arguments.
Метод класса: Subcommand{}
Хуков нет.
Возвращает
Массив.
Использование
// private - только в коде основоного (родительского) класса $result = $this->prompt_args( $args, $assoc_args );
- $args(массив) (обязательный)
- .
- $assoc_args(массив) (обязательный)
- .
Код Subcommand::prompt_args() Subcommand::prompt args WP-CLI 2.13.0-alpha
private function prompt_args( $args, $assoc_args ) {
$synopsis = $this->get_synopsis();
if ( ! $synopsis ) {
return [ $args, $assoc_args ];
}
// To skip the already provided positional arguments, we need to count
// how many we had already received.
$arg_index = 0;
$spec = array_filter(
SynopsisParser::parse( $synopsis ),
function ( $spec_arg ) use ( $args, $assoc_args, &$arg_index ) {
switch ( $spec_arg['type'] ) {
case 'positional':
// Only prompt for the positional arguments that are not
// yet provided, based purely on number.
return $arg_index++ >= count( $args );
case 'generic':
// Always prompt for generic arguments.
return true;
case 'assoc':
case 'flag':
default:
// Prompt for the specific flags that were not provided
// yet, based on name.
return ! isset( $assoc_args[ $spec_arg['name'] ] );
}
}
);
$spec = array_values( $spec );
$prompt_args = WP_CLI::get_config( 'prompt' );
if ( true !== $prompt_args ) {
$prompt_args = explode( ',', $prompt_args );
}
// 'positional' arguments are positional (aka zero-indexed)
// so $args needs to be reset before prompting for new arguments
$args = [];
foreach ( $spec as $key => $spec_arg ) {
// When prompting for specific arguments (e.g. --prompt=user_pass),
// ignore all arguments that don't match.
if ( is_array( $prompt_args ) ) {
if ( 'assoc' !== $spec_arg['type'] ) {
continue;
}
if ( ! in_array( $spec_arg['name'], $prompt_args, true ) ) {
continue;
}
}
$current_prompt = ( $key + 1 ) . '/' . count( $spec ) . ' ';
$default = $spec_arg['optional'] ? '' : false;
// 'generic' permits arbitrary key=value (e.g. [--<field>=<value>] )
if ( 'generic' === $spec_arg['type'] ) {
list( $key_token, $value_token ) = explode( '=', $spec_arg['token'] );
$repeat = false;
do {
if ( ! $repeat ) {
$key_prompt = $current_prompt . $key_token;
} else {
$key_prompt = str_repeat( ' ', strlen( $current_prompt ) ) . $key_token;
}
$key = $this->prompt( $key_prompt, $default );
if ( false === $key ) {
return [ $args, $assoc_args ];
}
if ( $key ) {
$key_prompt_count = strlen( $key_prompt ) - strlen( $value_token ) - 1;
$value_prompt = str_repeat( ' ', $key_prompt_count ) . '=' . $value_token;
$value = $this->prompt( $value_prompt, $default );
if ( false === $value ) {
return [ $args, $assoc_args ];
}
$assoc_args[ $key ] = $value;
$repeat = true;
} else {
$repeat = false;
}
} while ( $repeat );
} else {
$prompt = $current_prompt . $spec_arg['token'];
if ( 'flag' === $spec_arg['type'] ) {
$prompt .= ' (Y/n)';
}
$response = $this->prompt( $prompt, $default );
if ( false === $response ) {
return [ $args, $assoc_args ];
}
if ( $response ) {
switch ( $spec_arg['type'] ) {
case 'positional':
if ( $spec_arg['repeating'] ) {
$response = explode( ' ', $response );
} else {
$response = [ $response ];
}
$args = array_merge( $args, $response );
break;
case 'assoc':
$assoc_args[ $spec_arg['name'] ] = $response;
break;
case 'flag':
if ( 'Y' === strtoupper( $response ) ) {
$assoc_args[ $spec_arg['name'] ] = true;
}
break;
}
}
}
}
return [ $args, $assoc_args ];
}