96 lines
2.5 KiB
PHP
96 lines
2.5 KiB
PHP
|
<?php
|
||
|
|
||
|
/*
|
||
|
* This file is part of the Symfony package.
|
||
|
*
|
||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||
|
*
|
||
|
* For the full copyright and license information, please view the LICENSE
|
||
|
* file that was distributed with this source code.
|
||
|
*/
|
||
|
|
||
|
namespace Symfony\Component\Console\Question;
|
||
|
|
||
|
/**
|
||
|
* Represents a choice question.
|
||
|
*
|
||
|
* @author Fabien Potencier <fabien@symfony.com>
|
||
|
*/
|
||
|
class ChoiceQuestion extends Question
|
||
|
{
|
||
|
private $choices;
|
||
|
private $multiselect = false;
|
||
|
private $prompt = ' > ';
|
||
|
private $errorMessage = 'Value "%s" is invalid';
|
||
|
|
||
|
public function __construct($question, array $choices, $default = null)
|
||
|
{
|
||
|
parent::__construct($question, $default);
|
||
|
|
||
|
$this->choices = $choices;
|
||
|
$this->setValidator($this->getDefaultValidator());
|
||
|
$this->setAutocompleter(array_keys($choices));
|
||
|
}
|
||
|
|
||
|
public function getChoices()
|
||
|
{
|
||
|
return $this->choices;
|
||
|
}
|
||
|
|
||
|
public function setMultiselect($multiselect)
|
||
|
{
|
||
|
$this->multiselect = $multiselect;
|
||
|
}
|
||
|
|
||
|
public function getPrompt()
|
||
|
{
|
||
|
return $this->prompt;
|
||
|
}
|
||
|
|
||
|
public function setPrompt($prompt)
|
||
|
{
|
||
|
$this->prompt = $prompt;
|
||
|
}
|
||
|
|
||
|
public function setErrorMessage($errorMessage)
|
||
|
{
|
||
|
$this->errorMessage = $errorMessage;
|
||
|
}
|
||
|
|
||
|
private function getDefaultValidator()
|
||
|
{
|
||
|
$choices = $this->choices;
|
||
|
$errorMessage = $this->errorMessage;
|
||
|
$multiselect = $this->multiselect;
|
||
|
|
||
|
return function ($selected) use ($choices, $errorMessage, $multiselect) {
|
||
|
// Collapse all spaces.
|
||
|
$selectedChoices = str_replace(' ', '', $selected);
|
||
|
|
||
|
if ($multiselect) {
|
||
|
// Check for a separated comma values
|
||
|
if (!preg_match('/^[a-zA-Z0-9_-]+(?:,[a-zA-Z0-9_-]+)*$/', $selectedChoices, $matches)) {
|
||
|
throw new \InvalidArgumentException(sprintf($errorMessage, $selected));
|
||
|
}
|
||
|
$selectedChoices = explode(',', $selectedChoices);
|
||
|
} else {
|
||
|
$selectedChoices = array($selected);
|
||
|
}
|
||
|
|
||
|
$multiselectChoices = array();
|
||
|
foreach ($selectedChoices as $value) {
|
||
|
if (empty($choices[$value])) {
|
||
|
throw new \InvalidArgumentException(sprintf($errorMessage, $value));
|
||
|
}
|
||
|
array_push($multiselectChoices, $value);
|
||
|
}
|
||
|
|
||
|
if ($multiselect) {
|
||
|
return $multiselectChoices;
|
||
|
}
|
||
|
|
||
|
return $selected;
|
||
|
};
|
||
|
}
|
||
|
}
|