summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Search/Form/FormsBuilder.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Search/Form/FormsBuilder.php')
-rw-r--r--www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Search/Form/FormsBuilder.php358
1 files changed, 358 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Search/Form/FormsBuilder.php b/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Search/Form/FormsBuilder.php
new file mode 100644
index 00000000..35ea47d6
--- /dev/null
+++ b/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Search/Form/FormsBuilder.php
@@ -0,0 +1,358 @@
+<?php
+
+namespace SMW\MediaWiki\Search\Form;
+
+use Html;
+use RuntimeException;
+use SMW\Message;
+use Title;
+use WebRequest;
+
+/**
+ * @private
+ *
+ * @license GNU GPL v2+
+ * @since 3.0
+ *
+ * @author mwjames
+ */
+class FormsBuilder {
+
+ /**
+ * @var WebRequest
+ */
+ private $request;
+
+ /**
+ * @var FormsFactory
+ */
+ private $formsFactory;
+
+ /**
+ * @var OpenForm
+ */
+ private $openForm;
+
+ /**
+ * @var CustomForm
+ */
+ private $customForm;
+
+ /**
+ * @var string
+ */
+ private $defaultForm = '';
+
+ /**
+ * @var []
+ */
+ private $formList = [];
+
+ /**
+ * @var []
+ */
+ private $preselectNsList = [];
+
+ /**
+ * @var []
+ */
+ private $hiddenNsList = [];
+
+ /**
+ * @var []
+ */
+ private $parameters = [];
+
+ /**
+ * @var []
+ */
+ private $termPrefixes = [];
+
+ /**
+ * @since 3.0
+ *
+ * @param WebRequest $request
+ * @param FormsFactory $formsFactory
+ */
+ public function __construct( WebRequest $request, FormsFactory $formsFactory ) {
+ $this->request = $request;
+ $this->formsFactory = $formsFactory;
+ }
+
+ /**
+ * @since 3.0
+ *
+ * @return []
+ */
+ public function getParameters() {
+ return $this->parameters;
+ }
+
+ /**
+ * @since 3.0
+ *
+ * @param string $form
+ *
+ * @return string
+ */
+ public static function toLowerCase( $key ) {
+ return strtolower( str_replace( [ ' ' ], [ '' ], $key ) );
+ }
+
+ /**
+ * @since 3.0
+ *
+ * @return []
+ */
+ public function getTermPrefixes() {
+ return $this->termPrefixes;
+ }
+
+ /**
+ * @since 3.0
+ *
+ * @return []
+ */
+ public function getHiddenNsList() {
+ return $this->hiddenNsList;
+ }
+
+ /**
+ * @since 3.0
+ *
+ * @return []
+ */
+ public function getPreselectNsList() {
+
+ $activeForm = $this->request->getVal( 'smw-form', $this->defaultForm );
+
+ if ( $activeForm === null ) {
+ return [];
+ }
+
+ $activeForm = self::toLowerCase( $activeForm );
+
+ if ( isset( $this->preselectNsList[$activeForm] )) {
+ return $this->preselectNsList[$activeForm];
+ }
+
+ return [];
+ }
+
+ /**
+ * @since 3.0
+ *
+ * @return string
+ */
+ public function buildFormList() {
+
+ $list = [];
+ $name = '';
+ $value = '';
+
+ foreach ( $this->formList as $k => $options ) {
+
+ if ( $k === '' ) {
+ continue;
+ }
+
+ if ( $options['selected'] ) {
+ $name = $options['name'];
+ $value = $k;
+ }
+
+ $list[] = [ 'id' => $k, 'name' => $options['name'], 'desc' => $options['name'] ];
+ }
+
+ return Html::rawElement(
+ 'button',
+ [
+ 'type' => 'button',
+ 'id' => 'smw-search-forms',
+ 'class' => 'smw-selectmenu-button is-disabled',
+ 'title' => Message::get( 'smw-search-profile-extended-section-form', Message::TEXT, Message::USER_LANGUAGE ),
+ 'name' => 'smw-form',
+ 'value' => $value,
+ 'data-list' => json_encode( $list ),
+ 'data-nslist' => json_encode( $this->preselectNsList )
+ ],
+ $name === '' ? 'Form' : $name
+ ) . Html::rawElement(
+ 'input',
+ [
+ 'type' => 'hidden',
+ 'name' => 'smw-form',
+ 'value' => $value,
+ ]
+ );
+ }
+
+ /**
+ * @since 3.0
+ *
+ * @param array $data
+ *
+ * @return string
+ */
+ public function buildForm( array $data ) {
+
+ if ( !isset( $data['forms'] ) ) {
+ throw new RuntimeException( "Missing forms definition" );
+ }
+
+ if ( isset( $data['default_form'] ) ) {
+ $this->defaultForm = self::toLowerCase( $data['default_form'] );
+ }
+
+ if ( isset( $data['term_parser']['prefix'] ) ) {
+ $this->termPrefixes = $data['term_parser']['prefix'];
+ }
+
+ $activeForm = $this->request->getVal( 'smw-form', $this->defaultForm );
+
+ $divider = "<div class='divider' style='display:none;'></div>";
+
+ if ( $activeForm !== null && $activeForm !== '' ) {
+ $divider = "<div class='divider'></div>";
+ }
+
+ $this->formList = [];
+ $this->preselectNsList = [];
+ $this->parameters = [];
+
+ if ( $activeForm === null || $activeForm === '' ) {
+ $forms = [ '' => '' ] + $data['forms'];
+ } else {
+ $forms = $data['forms'];
+ }
+
+ $formDefinitions = [];
+
+ if ( $this->openForm === null ) {
+ $this->openForm = $this->formsFactory->newOpenForm( $this->request );
+ }
+
+ if ( $this->customForm === null ) {
+ $this->customForm = $this->formsFactory->newCustomForm( $this->request );
+ }
+
+ ksort( $forms );
+
+ foreach ( $forms as $name => $definition ) {
+ $formDefinitions[] = $this->form_fields( $data, $activeForm, $name, $definition );
+ }
+
+ if ( isset( $data['namespaces']['preselect'] ) && is_array( $data['namespaces']['preselect'] ) ) {
+ $this->preselect_namespaces( $data['namespaces']['preselect'] );
+ }
+
+ if ( isset( $data['namespaces']['hidden'] ) && is_array( ) ) {
+ $this->hidden_namespaces( $data['namespaces']['hidden'] );
+ }
+
+ if ( isset( $data['namespaces']['hide'] ) && is_array( $data['namespaces']['hide'] ) ) {
+ $this->hidden_namespaces( $data['namespaces']['hide'] );
+ }
+
+ return $divider . Html::rawElement(
+ 'div',
+ [
+ 'id' => 'smw-form-definitions',
+ 'class' => 'is-disabled'
+ ],
+ implode( '', $formDefinitions )
+ );
+ }
+
+ private function form_fields( $data, $activeForm, $name, $definition ) {
+
+ // Short form, URL query conform
+ $s = self::toLowerCase( $name );
+ $this->formList[$s] = [ 'name' => $name, 'selected' => $activeForm === $s ];
+
+ if ( !is_array( $definition ) ) {
+ return;
+ }
+
+ $description = '';
+ $isActiveForm = $s === $activeForm;
+
+ if ( isset( $data['descriptions'] ) ) {
+ $description = $this->findDescription( $data['descriptions'], $name, $isActiveForm );
+ }
+
+ if ( $s === 'open' ) {
+ $this->openForm->isActiveForm( $isActiveForm );
+ $fields = $this->openForm->makeFields();
+ $this->parameters = array_merge( $this->parameters, $this->openForm->getParameters() );
+ } else {
+ $this->customForm->isActiveForm( $isActiveForm );
+ $fields = $this->customForm->makeFields( $definition );
+ $this->parameters = array_merge( $this->parameters, $this->customForm->getParameters() );
+ }
+
+ return Html::rawElement(
+ 'div',
+ [
+ 'id' => "smw-form-{$s}",
+ 'class' => 'smw-fields'
+ ],
+ $description . $fields
+ );
+ }
+
+ private function preselect_namespaces( $preselect ) {
+ foreach ( $preselect as $k => $values ) {
+ $k = self::toLowerCase( $k );
+ $this->preselectNsList[$k] = [];
+
+ foreach ( $values as $ns ) {
+ if ( is_string( $ns ) && defined( $ns ) ) {
+ $this->preselectNsList[$k][] = constant( $ns );
+ }
+
+ if ( is_numeric( $ns ) ) {
+ $this->preselectNsList[$k][] = $ns;
+ }
+ }
+ }
+ }
+
+ private function hidden_namespaces( $hidden ) {
+ foreach ( $hidden as $ns ) {
+ if ( is_string( $ns ) && defined( $ns ) ) {
+ $this->hiddenNsList[] = constant( $ns );
+ }
+
+ if ( is_numeric( $ns ) ) {
+ $this->hiddenNsList[] = $ns;
+ }
+ }
+ }
+
+ private function findDescription( $descriptions, $name, $isActiveForm ) {
+
+ if ( !isset( $descriptions[$name] ) ) {
+ return '';
+ }
+
+ $display = $isActiveForm ? 'inline-block' : 'none';
+
+ // Simple text, or is it message-key?
+ if ( Message::exists( $descriptions[$name] ) ) {
+ $description = Message::get( $descriptions[$name], Message::PARSE, Message::USER_LANGUAGE );
+ } else{
+ $description = $descriptions[$name];
+ }
+
+ return Html::rawElement(
+ 'div',
+ [
+ 'class' => 'smw-form-description',
+ 'style' => "display:$display;"
+ ],
+ $description
+ );
+ }
+
+}