| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 | 
							- <?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;
 
- use Symfony\Component\Console\Exception\InvalidArgumentException;
 
- /**
 
-  * 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';
 
-     /**
 
-      * @param string $question The question to ask to the user
 
-      * @param array  $choices  The list of available choices
 
-      * @param mixed  $default  The default answer to return
 
-      */
 
-     public function __construct($question, array $choices, $default = null)
 
-     {
 
-         if (!$choices) {
 
-             throw new \LogicException('Choice question must have at least 1 choice available.');
 
-         }
 
-         parent::__construct($question, $default);
 
-         $this->choices = $choices;
 
-         $this->setValidator($this->getDefaultValidator());
 
-         $this->setAutocompleterValues($choices);
 
-     }
 
-     /**
 
-      * Returns available choices.
 
-      *
 
-      * @return array
 
-      */
 
-     public function getChoices()
 
-     {
 
-         return $this->choices;
 
-     }
 
-     /**
 
-      * Sets multiselect option.
 
-      *
 
-      * When multiselect is set to true, multiple choices can be answered.
 
-      *
 
-      * @param bool $multiselect
 
-      *
 
-      * @return $this
 
-      */
 
-     public function setMultiselect($multiselect)
 
-     {
 
-         $this->multiselect = $multiselect;
 
-         $this->setValidator($this->getDefaultValidator());
 
-         return $this;
 
-     }
 
-     /**
 
-      * Returns whether the choices are multiselect.
 
-      *
 
-      * @return bool
 
-      */
 
-     public function isMultiselect()
 
-     {
 
-         return $this->multiselect;
 
-     }
 
-     /**
 
-      * Gets the prompt for choices.
 
-      *
 
-      * @return string
 
-      */
 
-     public function getPrompt()
 
-     {
 
-         return $this->prompt;
 
-     }
 
-     /**
 
-      * Sets the prompt for choices.
 
-      *
 
-      * @param string $prompt
 
-      *
 
-      * @return $this
 
-      */
 
-     public function setPrompt($prompt)
 
-     {
 
-         $this->prompt = $prompt;
 
-         return $this;
 
-     }
 
-     /**
 
-      * Sets the error message for invalid values.
 
-      *
 
-      * The error message has a string placeholder (%s) for the invalid value.
 
-      *
 
-      * @param string $errorMessage
 
-      *
 
-      * @return $this
 
-      */
 
-     public function setErrorMessage($errorMessage)
 
-     {
 
-         $this->errorMessage = $errorMessage;
 
-         $this->setValidator($this->getDefaultValidator());
 
-         return $this;
 
-     }
 
-     /**
 
-      * Returns the default answer validator.
 
-      *
 
-      * @return callable
 
-      */
 
-     private function getDefaultValidator()
 
-     {
 
-         $choices = $this->choices;
 
-         $errorMessage = $this->errorMessage;
 
-         $multiselect = $this->multiselect;
 
-         $isAssoc = $this->isAssoc($choices);
 
-         return function ($selected) use ($choices, $errorMessage, $multiselect, $isAssoc) {
 
-             // Collapse all spaces.
 
-             $selectedChoices = str_replace(' ', '', $selected);
 
-             if ($multiselect) {
 
-                 // Check for a separated comma values
 
-                 if (!preg_match('/^[^,]+(?:,[^,]+)*$/', $selectedChoices, $matches)) {
 
-                     throw new InvalidArgumentException(sprintf($errorMessage, $selected));
 
-                 }
 
-                 $selectedChoices = explode(',', $selectedChoices);
 
-             } else {
 
-                 $selectedChoices = array($selected);
 
-             }
 
-             $multiselectChoices = array();
 
-             foreach ($selectedChoices as $value) {
 
-                 $results = array();
 
-                 foreach ($choices as $key => $choice) {
 
-                     if ($choice === $value) {
 
-                         $results[] = $key;
 
-                     }
 
-                 }
 
-                 if (\count($results) > 1) {
 
-                     throw new InvalidArgumentException(sprintf('The provided answer is ambiguous. Value should be one of %s.', implode(' or ', $results)));
 
-                 }
 
-                 $result = array_search($value, $choices);
 
-                 if (!$isAssoc) {
 
-                     if (false !== $result) {
 
-                         $result = $choices[$result];
 
-                     } elseif (isset($choices[$value])) {
 
-                         $result = $choices[$value];
 
-                     }
 
-                 } elseif (false === $result && isset($choices[$value])) {
 
-                     $result = $value;
 
-                 }
 
-                 if (false === $result) {
 
-                     throw new InvalidArgumentException(sprintf($errorMessage, $value));
 
-                 }
 
-                 $multiselectChoices[] = (string) $result;
 
-             }
 
-             if ($multiselect) {
 
-                 return $multiselectChoices;
 
-             }
 
-             return current($multiselectChoices);
 
-         };
 
-     }
 
- }
 
 
  |