'checkmatrix' => 'HTMLCheckMatrix',
'cloner' => 'HTMLFormFieldCloner',
'autocompleteselect' => 'HTMLAutoCompleteSelectField',
+ 'date' => 'HTMLDateTimeField',
+ 'time' => 'HTMLDateTimeField',
+ 'datetime' => 'HTMLDateTimeField',
// HTMLTextField will output the correct type="" attribute automagically.
// There are about four zillion other HTML5 input types, like range, but
// we don't use those at the moment, so no point in adding all of them.
protected $mFieldTree;
protected $mShowReset = false;
protected $mShowSubmit = true;
- protected $mSubmitFlags = [ 'constructive', 'primary' ];
+ protected $mSubmitFlags = [ 'primary', 'progressive' ];
protected $mShowCancel = false;
protected $mCancelTarget;
switch ( $displayFormat ) {
case 'vform':
- $reflector = new ReflectionClass( 'VFormHTMLForm' );
- return $reflector->newInstanceArgs( $arguments );
+ return ObjectFactory::constructClassInstance( VFormHTMLForm::class, $arguments );
case 'ooui':
- $reflector = new ReflectionClass( 'OOUIHTMLForm' );
- return $reflector->newInstanceArgs( $arguments );
+ return ObjectFactory::constructClassInstance( OOUIHTMLForm::class, $arguments );
default:
- $reflector = new ReflectionClass( 'HTMLForm' );
- $form = $reflector->newInstanceArgs( $arguments );
+ /** @var HTMLForm $form */
+ $form = ObjectFactory::constructClassInstance( HTMLForm::class, $arguments );
$form->setDisplayFormat( $displayFormat );
return $form;
}
$this->mFieldTree = $loadedDescriptor;
}
+ /**
+ * @param string $fieldname
+ * @return bool
+ */
+ public function hasField( $fieldname ) {
+ return isset( $this->mFlatFields[$fieldname] );
+ }
+
+ /**
+ * @param string $fieldname
+ * @return HTMLFormField
+ * @throws DomainException on invalid field name
+ */
+ public function getField( $fieldname ) {
+ if ( !$this->hasField( $fieldname ) ) {
+ throw new DomainException( __METHOD__ . ': no field named ' . $fieldname );
+ }
+ return $this->mFlatFields[$fieldname];
+ }
+
/**
* Set format in which to display the form
*
$this->getOutput()->addModuleStyles( 'mediawiki.htmlform.styles' );
$html = ''
- . $this->getErrors( $submitResult )
+ . $this->getErrorsOrWarnings( $submitResult, 'error' )
+ . $this->getErrorsOrWarnings( $submitResult, 'warning' )
. $this->getHeaderText()
. $this->getBody()
. $this->getHiddenFields()
*
* @param string|array|Status $errors
*
+ * @deprecated since 1.28, use getErrorsOrWarnings() instead
+ *
* @return string
*/
public function getErrors( $errors ) {
- if ( $errors instanceof Status ) {
- if ( $errors->isOK() ) {
- $errorstr = '';
+ wfDeprecated( __METHOD__ );
+ return $this->getErrorsOrWarnings( $errors, 'error' );
+ }
+
+ /**
+ * Returns a formatted list of errors or warnings from the given elements.
+ *
+ * @param string|array|Status $elements The set of errors/warnings to process.
+ * @param string $elementsType Should warnings or errors be returned. This is meant
+ * for Status objects, all other valid types are always considered as errors.
+ * @return string
+ */
+ public function getErrorsOrWarnings( $elements, $elementsType ) {
+ if ( !in_array( $elementsType, [ 'error', 'warning' ], true ) ) {
+ throw new DomainException( $elementsType . ' is not a valid type.' );
+ }
+ $elementstr = false;
+ if ( $elements instanceof Status ) {
+ list( $errorStatus, $warningStatus ) = $elements->splitByErrorType();
+ $status = $elementsType === 'error' ? $errorStatus : $warningStatus;
+ if ( $status->isGood() ) {
+ $elementstr = '';
} else {
- $errorstr = $this->getOutput()->parse( $errors->getWikiText() );
+ $elementstr = $this->getOutput()->parse(
+ $status->getWikiText()
+ );
}
- } elseif ( is_array( $errors ) ) {
- $errorstr = $this->formatErrors( $errors );
- } else {
- $errorstr = $errors;
+ } elseif ( is_array( $elements ) && $elementsType === 'error' ) {
+ $elementstr = $this->formatErrors( $elements );
+ } elseif ( $elementsType === 'error' ) {
+ $elementstr = $elements;
}
- return $errorstr
- ? Html::rawElement( 'div', [ 'class' => 'error' ], $errorstr )
+ return $elementstr
+ ? Html::rawElement( 'div', [ 'class' => $elementsType ], $elementstr )
: '';
}