/**
  * Gets rootline of a table downwards
  *
  * @param string $theTable: Database table
  * @param string $parentField: Database field to check with third parameter
  * @param mixed $uids: Uids of (different) parents
  * @return string An rootline array
  *
  */
 public static function getRootLineUpwards($theTable, $parentField, $uids)
 {
     if (!is_array($uids)) {
         $uids = tx_cpsdevlib_div::explode($uids);
     }
     $rootLine = array();
     foreach ($uids as $uid) {
         $result = t3lib_BEfunc::getRecordsByField($theTable, 'uid', $uid);
         $rL = array();
         if (count($result)) {
             $rL = self::getRootLineUpwards($theTable, $parentField, $result[0][$parentField]);
         }
         $rootLine[$uid] = $rL;
     }
     return $rootLine;
 }
 function renderTree()
 {
     t3lib_div::loadTCA($this->fieldConfig['foreign_table']);
     $orderBy = $GLOBALS['TCA'][$this->fieldConfig['foreign_table']]['ctrl']['sortby'] ? $this->fieldConfig['foreign_table'] . '.' . $GLOBALS['TCA'][$this->fieldConfig['foreign_table']]['ctrl']['sortby'] : substr($GLOBALS['TCA'][$this->fieldConfig['foreign_table']]['ctrl']['default_sortby'], 9);
     $treeViewObj = t3lib_div::makeInstance('tx_cpstcatree_treeview');
     $treeViewObj->thisScript = 'class.tx_cpstcatree.php';
     $treeViewObj->title = $GLOBALS['LANG']->sL($GLOBALS['TCA'][$this->fieldConfig['foreign_table']]['ctrl']['title']);
     $treeViewObj->treeName = $this->table . '_' . $this->field . '_tree';
     $treeViewObj->table = $this->fieldConfig['foreign_table'];
     // Set parent field of table
     if (isset($this->fieldConfig['treeViewParentField'])) {
         $this->parentField = $this->fieldConfig['treeViewParentField'];
     } else {
         $this->parentField = $GLOBALS['TCA'][$this->fieldConfig['foreign_table']]['ctrl']['treeParentField'];
     }
     if (!$this->parentField) {
         $this->parentField = 'pid';
     }
     $treeViewObj->parentField = $this->parentField;
     $treeViewObj->parentField = $this->parentField;
     // Set select fields
     $treeViewObj->fieldArray = array('uid');
     $treeViewObj->addField($GLOBALS['TCA'][$treeViewObj->table]['ctrl']['label']);
     if (isset($GLOBALS['TCA'][$treeViewObj->table]['ctrl']['label_alt'])) {
         $treeViewObj->addField($GLOBALS['TCA'][$treeViewObj->table]['ctrl']['label_alt']);
     }
     $treeViewObj->tceFormsTable = $this->table;
     if ($this->table == 'tt_content') {
         $treeViewObj->tceFormsField = $this->field . ',' . $this->fieldConfig['piFlexFormSheet'] . ',' . $this->fieldConfig['piFlexFormLang'] . ',' . $this->fieldConfig['piFlexFormValue'] . ',' . $this->row['CType'] . ',' . $this->row['list_type'];
     } else {
         $treeViewObj->tceFormsField = $this->field;
     }
     $treeViewObj->tceFormsRecID = $this->row['uid'];
     $treeViewObj->ext_IconMode = '0';
     $treeViewObj->treeView = $this->fieldConfig['treeView'];
     $treeViewObj->expandable = $this->fieldConfig['expandable'];
     $treeViewObj->expandFirst = $this->fieldConfig['expandFirst'];
     $treeViewObj->expandAll = $this->fieldConfig['expandAll'];
     $treeViewObj->ignorePermsClause = $this->fieldConfig['ignorePermsClause'];
     // Get TSconfig
     $TSconfig = t3lib_BEfunc::getTCEFORM_TSconfig($this->table, $this->row);
     // Get TSconfig for field
     if ($this->table == 'tt_content') {
         $fieldTSconfig = t3lib_TCEforms::setTSconfig($this->table, $this->row);
         $fieldTSconfig = $fieldTSconfig['pi_flexform'][$this->row['list_type'] . '.'][$this->field . '.'];
     } else {
         $fieldTSconfig = t3lib_TCEforms::setTSconfig($this->table, $this->row, $this->field);
     }
     $clause = '';
     // removeItems
     if (isset($fieldTSconfig['removeItems'])) {
         $this->removeItems = tx_cpsdevlib_div::toListArray(tx_cpsdevlib_db::getRootLineDownwards($treeViewObj->table, $treeViewObj->parentField, $fieldTSconfig['removeItems']), '', 1, 1, 1);
     }
     // keepItems
     if (isset($fieldTSconfig['keepItems'])) {
         $this->keepItems = tx_cpsdevlib_div::toListArray($fieldTSconfig['keepItems']);
         if (count($this->removeItems)) {
             // If items were removed from list check keepItems to add back
             foreach ($this->keepItems as $value) {
                 if (($key = array_search($value, $this->removeItems)) !== false) {
                     unset($this->removeItems[$key]);
                     // Get rootline upwards to restore parent items
                     $rL = tx_cpsdevlib_div::toListArray(tx_cpsdevlib_db::getRootLineUpwards($treeViewObj->table, 'pid', $value), '', 1, 1, 1);
                     foreach ($rL as $v) {
                         if (($k = array_search($v, $this->removeItems)) !== false) {
                             $treeViewObj->TCEforms_nonSelectableItemsArray[] = $v;
                             unset($this->removeItems[$k]);
                         }
                     }
                 }
             }
         } else {
             // If just keepItems is set only show selected
             if (count($this->keepItems)) {
                 $clause = ' AND ' . $treeViewObj->table . '.uid IN (' . implode(',', $this->keepItems) . ')';
             }
         }
     }
     if (count($this->removeItems)) {
         $clause = ' AND ' . $treeViewObj->table . '.uid NOT IN (' . implode(',', $this->removeItems) . ')';
     }
     // hideItems
     if (isset($fieldTSconfig['hideItems'])) {
         $this->hideItems = tx_cpsdevlib_div::toListArray($fieldTSconfig['hideItems']);
         $treeViewObj->TCEforms_nonSelectableItemsArray = array_merge($treeViewObj->TCEforms_nonSelectableItemsArray, $this->hideItems);
     }
     // Add foreign_table_where
     if ($this->fieldConfig['foreign_table_where']) {
         // Remove ORDER BY part if present
         if (strpos(strtolower($this->fieldConfig['foreign_table_where']), 'order by') !== false) {
             $ftWhere = substr($this->fieldConfig['foreign_table_where'], 0, strpos(strtolower($this->fieldConfig['foreign_table_where']), 'order by'));
         } else {
             $ftWhere = $this->fieldConfig['foreign_table_where'];
         }
         // Replace record maker in foreign_table_where
         if (strstr($ftWhere, '###REC_FIELD_')) {
             $ftWhereParts = explode('###REC_FIELD_', $ftWhere);
             foreach ($ftWhereParts as $key => $value) {
                 if ($key) {
                     $ftWhereSubpart = explode('###', $value, 2);
                     if (substr($ftWhereParts[0], -1) === '\'' && $ftWhereSubpart[1][0] === '\'') {
                         $ftWhereParts[$key] = $GLOBALS['TYPO3_DB']->quoteStr($TSconfig['_THIS_ROW'][$ftWhereSubpart[0]], $treeViewObj->table) . $ftWhereSubpart[1];
                     } else {
                         $ftWhereParts[$key] = $GLOBALS['TYPO3_DB']->fullQuoteStr($TSconfig['_THIS_ROW'][$ftWhereSubpart[0]], $treeViewObj->table) . $ftWhereSubpart[1];
                     }
                 }
             }
             $ftWhere = implode('', $ftWhereParts);
         }
         // Replace special marker in foreign_table_where
         $ftWhere = str_replace('###CURRENT_PID###', intval($TSconfig['_CURRENT_PID']), $ftWhere);
         $ftWhere = str_replace('###THIS_UID###', intval($TSconfig['_THIS_UID']), $ftWhere);
         $ftWhere = str_replace('###THIS_CID###', intval($TSconfig['_THIS_CID']), $ftWhere);
         $ftWhere = str_replace('###STORAGE_PID###', intval($TSconfig['_STORAGE_PID']), $ftWhere);
         $ftWhere = str_replace('###SITEROOT###', intval($TSconfig['_SITEROOT']), $ftWhere);
         $ftWhere = str_replace('###PAGE_TSCONFIG_ID###', intval($TSconfig[$this->field]['PAGE_TSCONFIG_ID']), $ftWhere);
         $ftWhere = str_replace('###PAGE_TSCONFIG_IDLIST###', $GLOBALS['TYPO3_DB']->cleanIntList($TSconfig[$this->field]['PAGE_TSCONFIG_IDLIST']), $ftWhere);
         $ftWhere = str_replace('###PAGE_TSCONFIG_STR###', $GLOBALS['TYPO3_DB']->quoteStr($TSconfig[$this->field]['PAGE_TSCONFIG_STR'], $this->fieldConfig['foreign_table']), $ftWhere);
         $clause .= ' ' . trim($ftWhere);
     }
     // Hook to manipulate clause
     $parameter = array('clause' => &$clause, 'treeViewObj' => &$treeViewObj);
     tx_cpsdevlib_div::callHookObjects('cps_tcatree', 'changeClauseHook', $parameter, $this);
     $treeViewObj->init($clause, $orderBy);
     $treeViewObj->TCEforms_itemFormElName = $this->itemFormElName;
     if ($this->table == $this->fieldConfig['foreign_table']) {
         $treeViewObj->TCEforms_nonSelectableItemsArray[] = $this->row['uid'];
     }
     $treeViewObj->TCEforms_selectedItemsArray = $this->selectedItems;
     $treeViewObj->selectedItemsArrayParents = $this->getItemRootline($this->selectedItems);
     $treeContent = $treeViewObj->getBrowsableTree();
     return $treeContent;
 }
 /**
  * @test
  * @depends checkStringToListArray
  * @dataProvider testQueryStringToArrayDataProvider
  * @param string $removeKeys
  * @param string $theSeparator
  * @param string $equalChar
  * @param string $altSeparators
  * @param array $expectedReturnArray
  */
 public function checkQueryStringToArray($removeKeys, $theSeparator, $equalChar, $altSeparators, $expectedReturnArray)
 {
     $this->assertEquals($expectedReturnArray, tx_cpsdevlib_div::queryStringToArray(str_replace('+', $altSeparators, str_replace('=', $equalChar, str_replace('&', $theSeparator, str_replace('&', '+', $this->fixture['testQueryString'])))), $removeKeys, $theSeparator, $equalChar, $altSeparators));
 }