| <?php |
| /** |
| * File containing the ezcConsoleQuestionDialog class. |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| * @package ConsoleTools |
| * @version //autogentag// |
| * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved. |
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 |
| * @filesource |
| */ |
| |
| /** |
| * Dialog class to ask a simple question. |
| * This dialog outputs a certain string to the user and requests a line of |
| * input. This is commonly used to ask questions like "Do you want to proceed?" |
| * and retrieve an answer like "y" for yes or "n" for no. |
| * |
| * The behaviour of this dialog is defined by an instance of |
| * {@link ezcConsoleQuestionDialogOptions}. |
| * |
| * @package ConsoleTools |
| * @version //autogen// |
| * |
| * @property ezcConsoleQuestionDialogOptions $options |
| * Options for the dialog. |
| * @property ezcConsoleOutput $output |
| * Output object for displaying the dialog. |
| */ |
| class ezcConsoleQuestionDialog implements ezcConsoleDialog |
| { |
| |
| /** |
| * Dialog result |
| * |
| * @var mixed |
| */ |
| protected $result; |
| |
| /** |
| * Properties |
| * |
| * @var array |
| */ |
| protected $properties = array( |
| "options" => null, |
| "output" => null, |
| ); |
| |
| /** |
| * Creates a new question dialog. |
| * Creates a new menu dialog to be displayed to the user. All behaviour is |
| * defined through the $options parameter. The $output parameter is used to |
| * display the dialog in the {@link display()} method. |
| * |
| * @param ezcConsoleOutput $output Output object. |
| * @param ezcConsoleQuestionDialogOptions $options Options. |
| * @return void |
| */ |
| public function __construct( ezcConsoleOutput $output, ezcConsoleQuestionDialogOptions $options = null ) |
| { |
| $this->output = $output; |
| $this->options = $options === null ? new ezcConsoleQuestionDialogOptions() : $options; |
| } |
| |
| /** |
| * Returns if the dialog retrieved a valid result. |
| * If a valid result has already been received, this method returns true, |
| * otherwise false. |
| * |
| * @return bool If a valid result was retrieved. |
| */ |
| public function hasValidResult() |
| { |
| return $this->result !== null; |
| } |
| |
| /** |
| * Returns the result retrieved. |
| * If no valid result was retreived, yet, this method should throw an |
| * ezcConsoleNoValidDialogResultException. |
| * |
| * If no valid result was retreived, yet, this method throws an |
| * ezcConsoleNoValidDialogResultException. Use {@link hasValidResult()} to |
| * avoid this. |
| * |
| * @return mixed The retreived result. |
| * |
| * @throws ezcDialogNoValidResultException |
| * if this method is called without a valid result being retrieved |
| * by the object. Use {@link hasValidResult()} to avoid this |
| * exception. |
| */ |
| public function getResult() |
| { |
| if ( $this->result === null ) |
| { |
| throw new ezcConsoleNoValidDialogResultException(); |
| } |
| return $this->result; |
| } |
| |
| /** |
| * Displays the dialog and retreives a value from the user. |
| * Displays the dialog and retreives the desired answer from the user. If |
| * the a valid result is retrieved, it can be obtained using {@link |
| * getResult()}. The method {@link hasValidResult()} can be used to check |
| * if a valid result is available. |
| * |
| * @return void |
| * @throws ezcConsoleDialogAbortException |
| * if the user closes STDIN using <CTRL>-D. |
| */ |
| public function display() |
| { |
| $this->reset(); |
| |
| $this->output->outputText( |
| $this->options->text . ( $this->options->showResults === true ? " " . $this->options->validator->getResultString() : "" ) . " ", |
| $this->options->format |
| ); |
| $result = $this->options->validator->fixup( ezcConsoleDialogViewer::readLine() ); |
| if ( $this->options->validator->validate( $result ) ) |
| { |
| $this->result = $result; |
| } |
| } |
| |
| /** |
| * Reset the dialog. |
| * Resets a possibly received result and all changes made to the dialog |
| * during {@link display()}. After that, the dialog can be re-used. All |
| * option values are kept. |
| * |
| * @return void |
| */ |
| public function reset() |
| { |
| $this->result = null; |
| } |
| |
| /** |
| * Returns a ready to use yes/no question dialog. |
| * Returns a question dialog, which requests the answers "y" for "yes" or |
| * "n" for "no" from the user. The answer is converted to lower-case. |
| * |
| * <code> |
| * // Would you like to proceed? (y/n) |
| * $dialog = ezcConsoleDialog( $out, "Would you like to proceed?" ); |
| * |
| * // Would you like to proceed? (y/n) [n] |
| * $dialog = ezcConsoleDialog( $out, "Would you like to proceed?", "n" ); |
| * </code> |
| * |
| * @param ezcConsoleOutput $out Output object. |
| * @param string $questionString Question string. |
| * @param string $default "y" or "n", if default value is desired. |
| * @return ezcConsoleQuestionDialog The created dialog. |
| */ |
| public static function YesNoQuestion( ezcConsoleOutput $out, $questionString, $default = null ) |
| { |
| $opts = new ezcConsoleQuestionDialogOptions(); |
| $opts->text = $questionString; |
| $opts->showResults = true; |
| $opts->validator = new ezcConsoleQuestionDialogMappingValidator( |
| array( "y", "n" ), |
| $default, |
| ezcConsoleQuestionDialogCollectionValidator::CONVERT_LOWER, |
| array( |
| 'yes' => 'y', |
| 'no' => 'n', |
| ) |
| ); |
| |
| return new ezcConsoleQuestionDialog( $out, $opts ); |
| } |
| |
| /** |
| * Property read access. |
| * |
| * @throws ezcBasePropertyNotFoundException |
| * If the the desired property is not found. |
| * |
| * @param string $propertyName Name of the property. |
| * @return mixed Value of the property or null. |
| * @ignore |
| */ |
| public function __get( $propertyName ) |
| { |
| if ( array_key_exists( $propertyName, $this->properties ) ) |
| { |
| return $this->properties[$propertyName]; |
| } |
| throw new ezcBasePropertyNotFoundException( $propertyName ); |
| } |
| |
| /** |
| * Property write access. |
| * |
| * @param string $propertyName Name of the property. |
| * @param mixed $propertyValue The value for the property. |
| * |
| * @throws ezcBasePropertyPermissionException |
| * If the property you try to access is read-only. |
| * @throws ezcBasePropertyNotFoundException |
| * If the the desired property is not found. |
| * @ignore |
| */ |
| public function __set( $propertyName, $propertyValue ) |
| { |
| switch ( $propertyName ) |
| { |
| case "options": |
| if ( ( $propertyValue instanceof ezcConsoleQuestionDialogOptions ) === false ) |
| { |
| throw new ezcBaseValueException( |
| $propertyName, |
| ( is_object( $propertyValue ) ? get_class( $propertyValue ) : gettype( $propertyValue ) ), |
| "instance of ezcConsoleQuestionDialogOptions" |
| ); |
| } |
| break; |
| case "output": |
| if ( ( $propertyValue instanceof ezcConsoleOutput ) === false ) |
| { |
| throw new ezcBaseValueException( |
| $propertyName, |
| ( is_object( $propertyValue ) ? get_class( $propertyValue ) : gettype( $propertyValue ) ), |
| "instance of ezcConsoleOutput" |
| ); |
| } |
| break; |
| default: |
| throw new ezcBasePropertyNotFoundException( $propertyName ); |
| } |
| $this->properties[$propertyName] = $propertyValue; |
| } |
| |
| /** |
| * Property isset access. |
| * |
| * @param string $propertyName Name of the property to check. |
| * @return bool If the property exists or not. |
| * @ignore |
| */ |
| public function __isset( $propertyName ) |
| { |
| return array_key_exists( $propertyName, $this->properties ); |
| } |
| } |
| |
| ?> |