Chris@0: getOption('answers')) {
Chris@0: $answers = json_decode($answers_raw, TRUE);
Chris@0: if (!is_array($answers)) {
Chris@0: throw new InvalidOptionException('Answers should be encoded in JSON format.');
Chris@0: }
Chris@0: }
Chris@0:
Chris@0: /** @var \Symfony\Component\Console\Helper\QuestionHelper $question_helper */
Chris@0: $question_helper = $this->getHelperSet()->get('question');
Chris@0:
Chris@0: /** @var \DrupalCodeGenerator\Command\GeneratorInterface $command */
Chris@0: $command = $this->getHelperSet()->getCommand();
Chris@0: $directory = $command->getDirectory();
Chris@0:
Chris@0: foreach ($questions as $name => $question) {
Chris@5:
Chris@5: if (in_array($name, $this->askedQuestions)) {
Chris@5: continue;
Chris@5: }
Chris@5: $this->askedQuestions[] = $name;
Chris@5:
Chris@0: /** @var \Symfony\Component\Console\Question\Question $question */
Chris@0: $default_value = $question->getDefault();
Chris@0:
Chris@0: // Make some assumptions based on question name.
Chris@0: if ($default_value === NULL) {
Chris@0: switch ($name) {
Chris@0: case 'name':
Chris@0: $root_directory = basename(Utils::getExtensionRoot($directory) ?: $directory);
Chris@0: $default_value = Utils::machine2human($root_directory);
Chris@0: break;
Chris@0:
Chris@0: case 'machine_name':
Chris@0: $default_value = function (array $vars) use ($directory) {
Chris@0: return Utils::human2machine(isset($vars['name']) ? $vars['name'] : basename($directory));
Chris@0: };
Chris@0: break;
Chris@0: }
Chris@0: }
Chris@0:
Chris@0: // Turn the callback into a value acceptable for Symfony question helper.
Chris@0: if (is_callable($default_value)) {
Chris@0: // Do not treat simple strings as callable because they may match PHP
Chris@0: // builtin functions.
Chris@0: if (!is_string($default_value) || strpos('::', $default_value) !== FALSE) {
Chris@0: $default_value = call_user_func($default_value, $vars);
Chris@0: }
Chris@0: }
Chris@0: // Default value may have tokens.
Chris@0: $default_value = Utils::tokenReplace($default_value, $vars);
Chris@0: $this->setQuestionDefault($question, $default_value);
Chris@0:
Chris@0: if ($answers) {
Chris@0: if (array_key_exists($name, $answers)) {
Chris@0: $answer = $answers[$name];
Chris@4: // Validate provided answer.
Chris@4: if ($validator = $question->getValidator()) {
Chris@4: $validator($answer);
Chris@4: }
Chris@0: // Turn 'yes/no' string into boolean.
Chris@0: if ($question instanceof ConfirmationQuestion && !is_bool($answer)) {
Chris@0: $answer = strcasecmp($answer, 'yes') == 0;
Chris@0: }
Chris@0: }
Chris@0: else {
Chris@0: $answer = $default_value;
Chris@0: }
Chris@0: }
Chris@0: else {
Chris@0: $this->formatQuestionText($question);
Chris@0: $answer = $question_helper->ask($input, $output, $question);
Chris@0: }
Chris@0:
Chris@0: $vars[$name] = $answer;
Chris@0: }
Chris@0:
Chris@0: return $vars;
Chris@0: }
Chris@0:
Chris@0: /**
Chris@0: * Formats question text.
Chris@0: *
Chris@0: * @param \Symfony\Component\Console\Question\Question $question
Chris@0: * The question.
Chris@0: */
Chris@0: protected function formatQuestionText(Question $question) {
Chris@0: $question_text = $question->getQuestion();
Chris@0: $default_value = $question->getDefault();
Chris@0:
Chris@0: $question_text = "\n $question_text";
Chris@0: if (is_bool($default_value)) {
Chris@0: $default_value = $default_value ? 'Yes' : 'No';
Chris@0: }
Chris@0: if ($default_value) {
Chris@0: $question_text .= " [$default_value]";
Chris@0: }
Chris@0: $question_text .= ":";
Chris@0: if ($question instanceof ChoiceQuestion) {
Chris@0: $question->setPrompt(' ➤➤➤ ');
Chris@0: }
Chris@0: else {
Chris@0: $question_text .= "\n ➤ ";
Chris@0: }
Chris@0:
Chris@0: $this->setQuestionText($question, $question_text);
Chris@0: }
Chris@0:
Chris@0: /**
Chris@0: * Normalizes questions.
Chris@0: *
Chris@0: * @param \Symfony\Component\Console\Question\Question[] $questions
Chris@0: * Questions to normalize.
Chris@0: *
Chris@0: * @return \Symfony\Component\Console\Question\Question[]
Chris@0: * Normalized questions
Chris@0: *
Chris@0: * @deprecated
Chris@0: * Use Symfony\Component\Console\Question\Question to define questions.
Chris@0: *
Chris@0: * @codeCoverageIgnore
Chris@0: */
Chris@0: protected function normalizeQuestions(array $questions) {
Chris@0: return array_map(function ($question) {
Chris@0: // Support array syntax.
Chris@0: if (is_array($question)) {
Chris@0: if (count($question) > 2) {
Chris@0: throw new \OutOfBoundsException('The question array is too long.');
Chris@0: }
Chris@0: list($question_text, $default_value) = array_pad($question, 2, NULL);
Chris@0: $question = new Question($question_text, $default_value);
Chris@0: }
Chris@0: return $question;
Chris@0: }, $questions);
Chris@0: }
Chris@0:
Chris@0: }