Beispiel #1
0
 /**
  * Prepares the XML-SQL Query
  *
  * @param  boolean  $allFields
  * @return XmlQuery
  */
 protected function &_prepareXmlSqlQuery($allFields = true)
 {
     $xmlsql = new XmlQuery($this->_db, $this->table, $this->_pluginParams);
     if ($allFields === false) {
         // in case of complex where, we might still need the joins and AS values:
         foreach ($this->_filterPossibilitesArray as $value) {
             // <filters><filter> (preprocessed xml above)
             if (!$this->isValueEmpty($value['internalvalue'])) {
                 /** @var SimpleXMLElement[] $value */
                 $where = $value['xml']->getElementByPath('data/where');
                 /** @var array $value */
                 if ($where) {
                     $allFields = true;
                     break;
                 }
             }
         }
     }
     if ($allFields) {
         $xmlsql->process_fields($this->listFieldsRows);
         // <fields><field> fields
         // now check for orderings :
         if ($this->listFieldsRows) {
             foreach ($this->listFieldsRows->children() as $field) {
                 /** @var $field SimpleXMLElement */
                 $orderinggroups = $field->getElementByPath('orderinggroups');
                 /** @var $orderinggroups SimpleXMLElement|null */
                 if ($orderinggroups) {
                     foreach ($orderinggroups->children() as $group) {
                         /** @var $group SimpleXMLElement */
                         if ($group->getName() == 'ordering') {
                             if (count($group->children()) > 0) {
                                 $xmlsql->process_field($group);
                             }
                         }
                     }
                 }
             }
         }
     } else {
         if ($this->listFieldsRows) {
             $fieldsToProcess = array();
             if ($this->search) {
                 // search string defined: we need to process the corresponding fields:
                 foreach ($this->quicksearchfields->children() as $searchField) {
                     /** @var $searchField SimpleXMLElement */
                     if ($searchField->getName() == 'field') {
                         $searchFieldName = $searchField->attributes('name');
                         if ($searchFieldName) {
                             $fieldsToProcess[$searchFieldName] = true;
                         }
                     }
                 }
             }
             if ($this->orderby) {
                 // orderby string defined: we need to process the corresponding fields:
                 foreach ($this->orderbyfields->children() as $orderField) {
                     /** @var SimpleXMLElement $orderField */
                     if ($orderField->getName() == 'field') {
                         $orderFieldName = $orderField->attributes('name');
                         if ($orderFieldName) {
                             $fieldsToProcess[$orderFieldName] = true;
                         }
                     } elseif ($orderField->getName() == 'ordergroup') {
                         foreach ($orderField->children() as $orderGroup) {
                             if ($orderGroup->getName() == 'field') {
                                 $orderFieldName = $orderGroup->attributes('name');
                                 if ($orderFieldName) {
                                     $fieldsToProcess[$orderFieldName] = true;
                                 }
                             }
                         }
                     }
                 }
             }
             foreach ($this->_filterPossibilitesArray as $value) {
                 // <filters><filter> (preprocessed xml above)
                 if (!$this->isValueEmpty($value['internalvalue'])) {
                     // filtering defined, need to process field:
                     if (is_array($value['valuefield'])) {
                         foreach ($value['valuefield'] as $valueField) {
                             $fieldsToProcess[$valueField] = true;
                         }
                     } else {
                         $fieldsToProcess[$value['valuefield']] = true;
                     }
                 }
             }
             foreach (array_keys($fieldsToProcess) as $fName) {
                 $selectField = $this->listFieldsRows->getChildByNameAttr('field', 'name', $fName);
                 if ($selectField) {
                     $xmlsql->process_field($selectField);
                 } else {
                     // trying to assume it's in the main table...
                     // most times it's ok: no error: trigger_error( sprintf( 'TableBrowser: Notice: trying to select field '%s' which is not in the fields list at main level.', $fName ), E_USER_NOTICE );
                 }
             }
         }
     }
     $xmlsql->process_orderby($this->orderbyfields, $this->orderby);
     // <orderby><field> fields
     $xmlsql->process_search_string($this->quicksearchfields, $this->search);
     // <quicksearch><field> fields
     $xmlsql->process_where($this->whereColumns);
     // <where><column> fields
     $xmlsql->process_groupby($this->groupbyfields);
     // <groupby><field> fields
     foreach ($this->_filterPossibilitesArray as $value) {
         // <filters><filter> (preprocessed xml above)
         if (!$this->isValueEmpty($value['internalvalue'])) {
             $this->_filtered = true;
             if ($value['valuetype']) {
                 $valueType = $value['valuetype'];
             } else {
                 if (strpos($value['basetype'], ':') === false) {
                     $valueType = 'xml:' . $value['basetype'];
                 } else {
                     $valueType = $value['basetype'];
                 }
             }
             $xmlsql->process_filter($value['xml'], $value, $valueType);
             /*
             				$where				=	$value['xml']->getElementByPath( 'data/where');
             				if ( $where ) {
             					$saveReverse	=	$xmlsql->setReverse( true );
             					// $Tdata		=	$value['xml']->getElementByPath( 'data/where');
             					// $xmlsql->process_data( $Tdata );
             					$xmlsql->process_where( $where, $value );
             					$xmlsql->setReverse( $saveReverse );
             				} else {
             					$joinkeys		=	$value['xml']->getElementByPath( 'data/joinkeys');
             					if ( $joinkeys ) {
             						$data		=	$value['xml']->getElementByPath( 'data');
             						$xmlsql->changeJoinType( $data->attributes( 'name' ), $joinkeys->attributes( 'type' ) );
             					} else {
             						$xmlsql->addWhere( $value['valuefield'], $value['operator'], $value['internalvalue'], $valueType );
             					}
             				}
             */
         }
     }
     return $xmlsql;
 }