/**
  * @param array $arr1 First array
  * @param array $arr2 Second array
  * @return array Merged result.
  */
 public function array_merge(array $arr1, array $arr2)
 {
     /** @noinspection PhpDeprecationInspection PhpUndefinedClassInspection */
     return t3lib_div::array_merge($arr1, $arr2);
 }
	/**
	 * Search for a title in a certain PID
	 *
	 * @param	integer		Page id in which to search subpages matching title
	 * @param	string		Title to search for
	 * @return	array		First entry is uid, second entry is the row selected, including information about the page as a mount point.
	 * @access private
	 * @see searchTitle()
	 */
	function searchTitle_searchPid($searchPid, $title) {

		// List of "pages" fields to traverse for a "directory title" in the speaking URL (only from RootLine!!):
		$segTitleFieldList = $this->conf['segTitleFieldList'] ? $this->conf['segTitleFieldList'] : TX_REALURL_SEGTITLEFIELDLIST_DEFAULT;
		$selList = t3lib_div::uniqueList('uid,pid,doktype,mount_pid,mount_pid_ol,tx_realurl_exclude,' . $segTitleFieldList);
		$segTitleFieldArray = t3lib_div::trimExplode(',', $segTitleFieldList, 1);

		// page select object - used to analyse mount points.
		$sys_page = t3lib_div::makeInstance('t3lib_pageSelect');

		// Build an array with encoded values from the segTitleFieldArray of the subpages
		// First we find field values from the default language
		// Pages are selected in menu order and if duplicate titles are found the first takes precedence!
		$titles = array(); // array(title => uid);
		$exclude = array();
		$uidTrack = array();
		$result = $GLOBALS['TYPO3_DB']->exec_SELECTquery($selList, 'pages',
						'pid=' . intval($searchPid) .
						' AND deleted=0 AND doktype!=255', '', 'sorting');
		while (($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($result))) {

			// Mount points:
			$mount_info = $sys_page->getMountPointInfo($row['uid'], $row);
			if (is_array($mount_info)) {
				// There is a valid mount point.
				if ($mount_info['overlay']) {
					// Overlay mode: Substitute WHOLE record:
					$result2 = $GLOBALS['TYPO3_DB']->exec_SELECTquery($selList, 'pages',
									'uid=' . intval($mount_info['mount_pid']) .
									' AND deleted=0 AND doktype!=255');
					$mp_row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($result2);
					if (is_array($mp_row)) {
						$row = $mp_row;
					}
					else {
						unset($row); // If the mount point could not be fetched, unset the row
					}
				}
				$row['_IS_MOUNTPOINT'] = $mount_info;
			}

			// Collect titles from selected row:
			if (is_array($row)) {
				if ($row['tx_realurl_exclude']) {
					// segment is excluded
					$exclude[] = $row;
				}
				// Process titles. Note that excluded segments are also searched
				// otherwise they will never be found
				$uidTrack[$row['uid']] = $row;
				foreach ($segTitleFieldArray as $fieldName) {
					if ($row[$fieldName]) {
						$encodedTitle = $this->encodeTitle($row[$fieldName]);
						if (!isset($titles[$fieldName][$encodedTitle])) {
							$titles[$fieldName][$encodedTitle] = $row['uid'];
						}
					}
				}
			}
		}
		$GLOBALS['TYPO3_DB']->sql_free_result($result);

		// We have to search the language overlay too, if: a) the language isn't the default (0), b) if it's not set (-1)
		$uidTrackKeys = array_keys($uidTrack);
		foreach ($uidTrackKeys as $l_id) {
			$result = $GLOBALS['TYPO3_DB']->exec_SELECTquery(TX_REALURL_SEGTITLEFIELDLIST_PLO,
					'pages_language_overlay', 'pid=' . intval($l_id) . ' AND deleted=0');
			while (($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($result))) {
				foreach ($segTitleFieldArray as $fieldName) {
					if ($row[$fieldName]) {
						$encodedTitle = $this->encodeTitle($row[$fieldName]);
						if (!isset($titles[$fieldName][$encodedTitle])) {
							$titles[$fieldName][$encodedTitle] = $l_id;
						}
					}
				}
			}
			$GLOBALS['TYPO3_DB']->sql_free_result($result);
		}

		// Merge titles:
		$segTitleFieldArray = array_reverse($segTitleFieldArray); // To observe the priority order...
		$allTitles = array();
		foreach ($segTitleFieldArray as $fieldName) {
			if (is_array($titles[$fieldName])) {
				$allTitles = t3lib_div::array_merge($allTitles, $titles[$fieldName]);
			}
		}

		// Return:
		$encodedTitle = $this->encodeTitle($title);
		if (isset($allTitles[$encodedTitle])) {
			return array($allTitles[$encodedTitle], $uidTrack[$allTitles[$encodedTitle]], false);
		}
		return array(false, false, $exclude);
	}
 /**
  * Overview About Sitemaps
  */
 public function indexAction()
 {
     $pages = $this->getBasePages();
     $providers = t3lib_div::trimExplode(',', $this->settings['provider'], TRUE);
     $nodes = array();
     foreach ($providers as $provider) {
         $provider = Tx_GoogleServices_Service_SitemapProvider::getProvider($provider);
         $providerNodes = $provider->getRecords(intval($this->settings['startpoint']), $pages, $this);
         $nodes = t3lib_div::array_merge($nodes, $providerNodes);
     }
     $this->prepareAndAssignNodes($nodes);
 }
Example #4
1
 /**
  * Adds items to the ->MOD_MENU array. Used for the function menu selector.
  *
  * @return    void
  */
 function menuConfig()
 {
     global $LANG;
     $this->MOD_MENU = array('users' => array('-1' => $LANG->getLL('loggedInUsers'), '0' => $LANG->getLL('notLoggedIn'), '' => '------------------------------'), 'mode' => array('-1' => $LANG->getLL('allTime'), '1' => $LANG->getLL('byTime')));
     foreach (t3lib_BEfunc::getRecordsByField('fe_users', 1, 1) as $user) {
         $this->MOD_MENU['users'][$user['uid']] = $user['username'];
     }
     parent::menuConfig();
     $set = t3lib_div::_GP('SET');
     if ($set['time']) {
         $dateFrom = strtotime($set['time']['from']);
         $dateTo = strtotime($set['time']['to']);
         $set['time']['from'] = $dateFrom > 0 ? date('d.m.Y', $dateFrom) : '';
         $set['time']['to'] = $dateTo > 0 ? date('d.m.Y', $dateTo) : '';
         $mergedSettings = t3lib_div::array_merge($this->MOD_SETTINGS, $set);
         $GLOBALS['BE_USER']->pushModuleData($this->MCONF['name'], $mergedSettings);
         $this->MOD_SETTINGS = $mergedSettings;
     }
 }
 /**
  * Actions for flex form element (move, delete)
  *
  * @param	array		&$valueArrayToRemoveFrom: by reference
  * @param	array		$deleteCMDS: ...	 *
  * @return	void
  */
 function _ACTION_FLEX_FORMdata(&$valueArray, $actionCMDs)
 {
     if (is_array($valueArray) && is_array($actionCMDs)) {
         foreach ($actionCMDs as $key => $value) {
             if ($key == '_ACTION') {
                 // First, check if there are "commands":
                 if (current($actionCMDs[$key]) !== "") {
                     asort($actionCMDs[$key]);
                     $newValueArray = array();
                     foreach ($actionCMDs[$key] as $idx => $order) {
                         if (substr($idx, 0, 3) == "ID-") {
                             $idx = $this->newIndexMap[$idx];
                         }
                         if ($order != "DELETE") {
                             // Just one reflection here: It is clear that when removing elements from a flexform, then we will get lost files unless we act on this delete operation by traversing and deleting files that were referred to.
                             $newValueArray[$idx] = $valueArray[$idx];
                         }
                         unset($valueArray[$idx]);
                     }
                     $valueArray = t3lib_div::array_merge($newValueArray, $valueArray);
                 }
             } elseif (is_array($actionCMDs[$key]) && isset($valueArray[$key])) {
                 $this->_ACTION_FLEX_FORMdata($valueArray[$key], $actionCMDs[$key]);
             }
         }
     }
 }
 /**
  * Ajax handler for the "suggest" feature in TCEforms.
  *
  * @param array $params The parameters from the AJAX call
  * @param TYPO3AJAX $ajaxObj The AJAX object representing the AJAX call
  * @return void
  */
 public function processAjaxRequest($params, &$ajaxObj)
 {
     // get parameters from $_GET/$_POST
     $search = t3lib_div::_GP('value');
     $table = t3lib_div::_GP('table');
     $field = t3lib_div::_GP('field');
     $uid = t3lib_div::_GP('uid');
     $pageId = t3lib_div::_GP('pid');
     t3lib_div::loadTCA($table);
     // If the $uid is numeric, we have an already existing element, so get the
     // TSconfig of the page itself or the element container (for non-page elements)
     // otherwise it's a new element, so use given id of parent page (i.e., don't modify it here)
     if (is_numeric($uid)) {
         if ($table == 'pages') {
             $pageId = $uid;
         } else {
             $row = t3lib_BEfunc::getRecord($table, $uid);
             $pageId = $row['pid'];
         }
     }
     $TSconfig = t3lib_BEfunc::getPagesTSconfig($pageId);
     $queryTables = array();
     $foreign_table_where = '';
     $wizardConfig = $GLOBALS['TCA'][$table]['columns'][$field]['config']['wizards']['suggest'];
     if (isset($GLOBALS['TCA'][$table]['columns'][$field]['config']['allowed'])) {
         $queryTables = t3lib_div::trimExplode(',', $GLOBALS['TCA'][$table]['columns'][$field]['config']['allowed']);
     } elseif (isset($GLOBALS['TCA'][$table]['columns'][$field]['config']['foreign_table'])) {
         $queryTables = array($GLOBALS['TCA'][$table]['columns'][$field]['config']['foreign_table']);
         $foreign_table_where = $GLOBALS['TCA'][$table]['columns'][$field]['config']['foreign_table_where'];
         // strip ORDER BY clause
         $foreign_table_where = trim(preg_replace('/ORDER[[:space:]]+BY.*/i', '', $foreign_table_where));
     }
     $resultRows = array();
     // fetch the records for each query table. A query table is a table from which records are allowed to
     // be added to the TCEForm selector, originally fetched from the "allowed" config option in the TCA
     foreach ($queryTables as $queryTable) {
         t3lib_div::loadTCA($queryTable);
         // if the table does not exist, skip it
         if (!is_array($GLOBALS['TCA'][$queryTable]) || !count($GLOBALS['TCA'][$queryTable])) {
             continue;
         }
         $config = (array) $wizardConfig['default'];
         if (is_array($wizardConfig[$queryTable])) {
             $config = t3lib_div::array_merge_recursive_overrule($config, $wizardConfig[$queryTable]);
         }
         // merge the configurations of different "levels" to get the working configuration for this table and
         // field (i.e., go from the most general to the most special configuration)
         if (is_array($TSconfig['TCEFORM.']['suggest.']['default.'])) {
             $config = t3lib_div::array_merge_recursive_overrule($config, $TSconfig['TCEFORM.']['suggest.']['default.']);
         }
         if (is_array($TSconfig['TCEFORM.']['suggest.'][$queryTable . '.'])) {
             $config = t3lib_div::array_merge_recursive_overrule($config, $TSconfig['TCEFORM.']['suggest.'][$queryTable . '.']);
         }
         // use $table instead of $queryTable here because we overlay a config
         // for the input-field here, not for the queried table
         if (is_array($TSconfig['TCEFORM.'][$table . '.'][$field . '.']['suggest.']['default.'])) {
             $config = t3lib_div::array_merge_recursive_overrule($config, $TSconfig['TCEFORM.'][$table . '.'][$field . '.']['suggest.']['default.']);
         }
         if (is_array($TSconfig['TCEFORM.'][$table . '.'][$field . '.']['suggest.'][$queryTable . '.'])) {
             $config = t3lib_div::array_merge_recursive_overrule($config, $TSconfig['TCEFORM.'][$table . '.'][$field . '.']['suggest.'][$queryTable . '.']);
         }
         //process addWhere
         if (!isset($config['addWhere']) && $foreign_table_where) {
             $config['addWhere'] = $foreign_table_where;
         }
         if (isset($config['addWhere'])) {
             $config['addWhere'] = strtr(' ' . $config['addWhere'], array('###THIS_UID###' => intval($uid), '###CURRENT_PID###' => intval($pageId)));
         }
         // instantiate the class that should fetch the records for this $queryTable
         $receiverClassName = $config['receiverClass'];
         if (!class_exists($receiverClassName)) {
             $receiverClassName = 't3lib_TCEforms_Suggest_DefaultReceiver';
         }
         $receiverObj = t3lib_div::makeInstance($receiverClassName, $queryTable, $config);
         $params = array('value' => $search);
         $rows = $receiverObj->queryTable($params);
         if (empty($rows)) {
             continue;
         }
         $resultRows = t3lib_div::array_merge($resultRows, $rows);
         unset($rows);
     }
     $listItems = array();
     if (count($resultRows) > 0) {
         // traverse all found records and sort them
         $rowsSort = array();
         foreach ($resultRows as $key => $row) {
             $rowsSort[$key] = $row['text'];
         }
         asort($rowsSort);
         $rowsSort = array_keys($rowsSort);
         // Limit the number of items in the result list
         $maxItems = $config['maxItemsInResultList'] ? $config['maxItemsInResultList'] : 10;
         $maxItems = min(count($resultRows), $maxItems);
         // put together the selector entry
         for ($i = 0; $i < $maxItems; $i++) {
             $row = $resultRows[$rowsSort[$i]];
             $rowId = $row['table'] . '-' . $row['uid'] . '-' . $table . '-' . $uid . '-' . $field;
             $listItems[] = '<li' . ($row['class'] != '' ? ' class="' . $row['class'] . '"' : '') . ' id="' . $rowId . '" style="' . $row['style'] . '">' . $row['text'] . '</li>';
         }
     }
     if (count($listItems) > 0) {
         $list = implode('', $listItems);
     } else {
         $list = '<li class="suggest-noresults"><i>' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:labels.noRecordFound') . '</i></li>';
     }
     $list = '<ul class="' . $this->cssClass . '-resultlist">' . $list . '</ul>';
     $ajaxObj->addContent(0, $list);
 }
    /**
     * Send an email notification to users in workspace
     *
     * @param array $stat Workspace access array (from t3lib_userauthgroup::checkWorkspace())
     * @param integer $stageId New Stage number: 0 = editing, 1= just ready for review, 10 = ready for publication, -1 = rejected!
     * @param string $table Table name of element (or list of element names if $id is zero)
     * @param integer $id Record uid of element (if zero, then $table is used as reference to element(s) alone)
     * @param string $comment User comment sent along with action
     * @param t3lib_TCEmain $tcemainObj TCEmain object
     * @param string $notificationAlternativeRecipients Comma separated list of recipients to notificate instead of be_users selected by sys_workspace, list is generated by workspace extension module
     * @return void
     */
    protected function notifyStageChange(array $stat, $stageId, $table, $id, $comment, t3lib_TCEmain $tcemainObj, $notificationAlternativeRecipients = FALSE)
    {
        $workspaceRec = t3lib_BEfunc::getRecord('sys_workspace', $stat['uid']);
        // So, if $id is not set, then $table is taken to be the complete element name!
        $elementName = $id ? $table . ':' . $id : $table;
        if (is_array($workspaceRec)) {
            // Get the new stage title from workspaces library, if workspaces extension is installed
            if (t3lib_extMgm::isLoaded('workspaces')) {
                $stageService = t3lib_div::makeInstance('Tx_Workspaces_Service_Stages');
                $newStage = $stageService->getStageTitle((int) $stageId);
            } else {
                // TODO: CONSTANTS SHOULD BE USED - tx_service_workspace_workspaces
                // TODO: use localized labels
                // Compile label:
                switch ((int) $stageId) {
                    case 1:
                        $newStage = 'Ready for review';
                        break;
                    case 10:
                        $newStage = 'Ready for publishing';
                        break;
                    case -1:
                        $newStage = 'Element was rejected!';
                        break;
                    case 0:
                        $newStage = 'Rejected element was noticed and edited';
                        break;
                    default:
                        $newStage = 'Unknown state change!?';
                        break;
                }
            }
            if ($notificationAlternativeRecipients == false) {
                // Compile list of recipients:
                $emails = array();
                switch ((int) $stat['stagechg_notification']) {
                    case 1:
                        switch ((int) $stageId) {
                            case 1:
                                $emails = $this->getEmailsForStageChangeNotification($workspaceRec['reviewers']);
                                break;
                            case 10:
                                $emails = $this->getEmailsForStageChangeNotification($workspaceRec['adminusers'], TRUE);
                                break;
                            case -1:
                                #								$emails = $this->getEmailsForStageChangeNotification($workspaceRec['reviewers']);
                                #								$emails = array_merge($emails,$this->getEmailsForStageChangeNotification($workspaceRec['members']));
                                // List of elements to reject:
                                $allElements = explode(',', $elementName);
                                // Traverse them, and find the history of each
                                foreach ($allElements as $elRef) {
                                    list($eTable, $eUid) = explode(':', $elRef);
                                    $rows = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows('log_data,tstamp,userid', 'sys_log', 'action=6 and details_nr=30
											AND tablename=' . $GLOBALS['TYPO3_DB']->fullQuoteStr($eTable, 'sys_log') . '
											AND recuid=' . intval($eUid), '', 'uid DESC');
                                    // Find all implicated since the last stage-raise from editing to review:
                                    foreach ($rows as $dat) {
                                        $data = unserialize($dat['log_data']);
                                        $emails = t3lib_div::array_merge($emails, $this->getEmailsForStageChangeNotification($dat['userid'], TRUE));
                                        if ($data['stage'] == 1) {
                                            break;
                                        }
                                    }
                                }
                                break;
                            case 0:
                                $emails = $this->getEmailsForStageChangeNotification($workspaceRec['members']);
                                break;
                            default:
                                $emails = $this->getEmailsForStageChangeNotification($workspaceRec['adminusers'], TRUE);
                                break;
                        }
                        break;
                    case 10:
                        $emails = $this->getEmailsForStageChangeNotification($workspaceRec['adminusers'], TRUE);
                        $emails = t3lib_div::array_merge($emails, $this->getEmailsForStageChangeNotification($workspaceRec['reviewers']));
                        $emails = t3lib_div::array_merge($emails, $this->getEmailsForStageChangeNotification($workspaceRec['members']));
                        break;
                }
            } else {
                $emails = array();
                foreach ($notificationAlternativeRecipients as $emailAddress) {
                    $emails[] = array('email' => $emailAddress);
                }
            }
            // prepare and then send the emails
            if (count($emails)) {
                // Path to record is found:
                list($elementTable, $elementUid) = explode(':', $elementName);
                $elementUid = intval($elementUid);
                $elementRecord = t3lib_BEfunc::getRecord($elementTable, $elementUid);
                $recordTitle = t3lib_BEfunc::getRecordTitle($elementTable, $elementRecord);
                if ($elementTable == 'pages') {
                    $pageUid = $elementUid;
                } else {
                    t3lib_BEfunc::fixVersioningPid($elementTable, $elementRecord);
                    $pageUid = $elementUid = $elementRecord['pid'];
                }
                // fetch the TSconfig settings for the email
                // old way, options are TCEMAIN.notificationEmail_body/subject
                $TCEmainTSConfig = $tcemainObj->getTCEMAIN_TSconfig($pageUid);
                // these options are deprecated since TYPO3 4.5, but are still
                // used in order to provide backwards compatibility
                $emailMessage = trim($TCEmainTSConfig['notificationEmail_body']);
                $emailSubject = trim($TCEmainTSConfig['notificationEmail_subject']);
                // new way, options are
                // pageTSconfig: tx_version.workspaces.stageNotificationEmail.subject
                // userTSconfig: page.tx_version.workspaces.stageNotificationEmail.subject
                $pageTsConfig = t3lib_BEfunc::getPagesTSconfig($pageUid);
                $emailConfig = $pageTsConfig['tx_version.']['workspaces.']['stageNotificationEmail.'];
                $markers = array('###RECORD_TITLE###' => $recordTitle, '###RECORD_PATH###' => t3lib_BEfunc::getRecordPath($elementUid, '', 20), '###SITE_NAME###' => $GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'], '###SITE_URL###' => t3lib_div::getIndpEnv('TYPO3_SITE_URL') . TYPO3_mainDir, '###WORKSPACE_TITLE###' => $workspaceRec['title'], '###WORKSPACE_UID###' => $workspaceRec['uid'], '###ELEMENT_NAME###' => $elementName, '###NEXT_STAGE###' => $newStage, '###COMMENT###' => $comment, '###USER_REALNAME###' => $tcemainObj->BE_USER->user['realName'], '###USER_USERNAME###' => $tcemainObj->BE_USER->user['username']);
                // sending the emails the old way with sprintf(),
                // because it was set explicitly in TSconfig
                if ($emailMessage && $emailSubject) {
                    t3lib_div::deprecationLog('This TYPO3 installation uses Workspaces staging notification by setting the TSconfig options "TCEMAIN.notificationEmail_subject" / "TCEMAIN.notificationEmail_body". Please use the more flexible marker-based options tx_version.workspaces.stageNotificationEmail.message / tx_version.workspaces.stageNotificationEmail.subject');
                    $emailSubject = sprintf($emailSubject, $elementName);
                    $emailMessage = sprintf($emailMessage, $markers['###SITE_NAME###'], $markers['###SITE_URL###'], $markers['###WORKSPACE_TITLE###'], $markers['###WORKSPACE_UID###'], $markers['###ELEMENT_NAME###'], $markers['###NEXT_STAGE###'], $markers['###COMMENT###'], $markers['###USER_REALNAME###'], $markers['###USER_USERNAME###'], $markers['###RECORD_PATH###'], $markers['###RECORD_TITLE###']);
                    // filter out double email addresses
                    $emailRecipients = array();
                    foreach ($emails as $recip) {
                        $emailRecipients[$recip['email']] = $recip['email'];
                    }
                    $emailRecipients = implode(',', $emailRecipients);
                    // Send one email to everybody
                    t3lib_div::plainMailEncoded($emailRecipients, $emailSubject, $emailMessage);
                } else {
                    // send an email to each individual user, to ensure the
                    // multilanguage version of the email
                    $emailHeaders = $emailConfig['additionalHeaders'];
                    $emailRecipients = array();
                    // an array of language objects that are needed
                    // for emails with different languages
                    $languageObjects = array($GLOBALS['LANG']->lang => $GLOBALS['LANG']);
                    // loop through each recipient and send the email
                    foreach ($emails as $recipientData) {
                        // don't send an email twice
                        if (isset($emailRecipients[$recipientData['email']])) {
                            continue;
                        }
                        $emailSubject = $emailConfig['subject'];
                        $emailMessage = $emailConfig['message'];
                        $emailRecipients[$recipientData['email']] = $recipientData['email'];
                        // check if the email needs to be localized
                        // in the users' language
                        if (t3lib_div::isFirstPartOfStr($emailSubject, 'LLL:') || t3lib_div::isFirstPartOfStr($emailMessage, 'LLL:')) {
                            $recipientLanguage = $recipientData['lang'] ? $recipientData['lang'] : 'default';
                            if (!isset($languageObjects[$recipientLanguage])) {
                                // a LANG object in this language hasn't been
                                // instantiated yet, so this is done here
                                /** @var $languageObject language */
                                $languageObject = t3lib_div::makeInstance('language');
                                $languageObject->init($recipientLanguage);
                                $languageObjects[$recipientLanguage] = $languageObject;
                            } else {
                                $languageObject = $languageObjects[$recipientLanguage];
                            }
                            if (t3lib_div::isFirstPartOfStr($emailSubject, 'LLL:')) {
                                $emailSubject = $languageObject->sL($emailSubject);
                            }
                            if (t3lib_div::isFirstPartOfStr($emailMessage, 'LLL:')) {
                                $emailMessage = $languageObject->sL($emailMessage);
                            }
                        }
                        $emailSubject = t3lib_parseHtml::substituteMarkerArray($emailSubject, $markers, '', TRUE, TRUE);
                        $emailMessage = t3lib_parseHtml::substituteMarkerArray($emailMessage, $markers, '', TRUE, TRUE);
                        // Send an email to the recipient
                        t3lib_div::plainMailEncoded($recipientData['email'], $emailSubject, $emailMessage, $emailHeaders);
                    }
                    $emailRecipients = implode(',', $emailRecipients);
                }
                $tcemainObj->newlog2('Notification email for stage change was sent to "' . $emailRecipients . '"', $table, $id);
            }
        }
    }
 /**
  * Will select all fe_groups records that the current fe_user is member of - and which groups are also allowed in the current domain.
  * It also accumulates the TSconfig for the fe_user/fe_groups in ->TSdataArray
  *
  * @return	integer		Returns the number of usergroups for the frontend users (if the internal user record exists and the usergroup field contains a value)
  */
 function fetchGroupData()
 {
     $this->TSdataArray = array();
     $this->userTS = array();
     $this->userTSUpdated = 0;
     $this->groupData = array('title' => array(), 'uid' => array(), 'pid' => array());
     // Setting default configuration:
     $this->TSdataArray[] = $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultUserTSconfig'];
     // get the info data for auth services
     $authInfo = $this->getAuthInfoArray();
     if ($this->writeDevLog) {
         if (is_array($this->user)) {
             t3lib_div::devLog('Get usergroups for user: '******'tslib_feUserAuth');
         } else {
             t3lib_div::devLog('Get usergroups for "anonymous" user', 'tslib_feUserAuth');
         }
     }
     $groupDataArr = array();
     // use 'auth' service to find the groups for the user
     $serviceChain = '';
     $subType = 'getGroups' . $this->loginType;
     while (is_object($serviceObj = t3lib_div::makeInstanceService('auth', $subType, $serviceChain))) {
         $serviceChain .= ',' . $serviceObj->getServiceKey();
         $serviceObj->initAuth($subType, array(), $authInfo, $this);
         $groupData = $serviceObj->getGroups($this->user, $groupDataArr);
         if (is_array($groupData) && count($groupData)) {
             $groupDataArr = t3lib_div::array_merge($groupDataArr, $groupData);
             // Keys in $groupData should be unique ids of the groups (like "uid") so this function will override groups.
         }
         unset($serviceObj);
     }
     if ($this->writeDevLog and $serviceChain) {
         t3lib_div::devLog($subType . ' auth services called: ' . $serviceChain, 'tslib_feUserAuth');
     }
     if ($this->writeDevLog and !count($groupDataArr)) {
         t3lib_div::devLog('No usergroups found by services', 'tslib_feUserAuth');
     }
     if ($this->writeDevLog and count($groupDataArr)) {
         t3lib_div::devLog(count($groupDataArr) . ' usergroup records found by services', 'tslib_feUserAuth');
     }
     // use 'auth' service to check the usergroups if they are really valid
     foreach ($groupDataArr as $groupData) {
         // by default a group is valid
         $validGroup = TRUE;
         $serviceChain = '';
         $subType = 'authGroups' . $this->loginType;
         while (is_object($serviceObj = t3lib_div::makeInstanceService('auth', $subType, $serviceChain))) {
             $serviceChain .= ',' . $serviceObj->getServiceKey();
             $serviceObj->initAuth($subType, array(), $authInfo, $this);
             if (!$serviceObj->authGroup($this->user, $groupData)) {
                 $validGroup = FALSE;
                 if ($this->writeDevLog) {
                     t3lib_div::devLog($subType . ' auth service did not auth group: ' . t3lib_div::arrayToLogString($groupData, 'uid,title'), 'tslib_feUserAuth', 2);
                 }
                 break;
             }
             unset($serviceObj);
         }
         unset($serviceObj);
         if ($validGroup) {
             $this->groupData['title'][$groupData['uid']] = $groupData['title'];
             $this->groupData['uid'][$groupData['uid']] = $groupData['uid'];
             $this->groupData['pid'][$groupData['uid']] = $groupData['pid'];
             $this->groupData['TSconfig'][$groupData['uid']] = $groupData['TSconfig'];
         }
     }
     if (count($this->groupData) && count($this->groupData['TSconfig'])) {
         // TSconfig: collect it in the order it was collected
         foreach ($this->groupData['TSconfig'] as $TSdata) {
             $this->TSdataArray[] = $TSdata;
         }
         $this->TSdataArray[] = $this->user['TSconfig'];
         // Sort information
         ksort($this->groupData['title']);
         ksort($this->groupData['uid']);
         ksort($this->groupData['pid']);
     }
     return count($this->groupData['uid']) ? count($this->groupData['uid']) : 0;
 }
		'), '199' => array('showitem' => 'doktype;;2;;1-1-1, hidden, title,
			--div--;LLL:EXT:cms/locallang_tca.xml:pages.tabs.options,
				TSconfig;;6;nowrap;5-5-5, storage_pid;;7,
			--div--;LLL:EXT:cms/locallang_tca.xml:pages.tabs.extended,
		'), '254' => array('showitem' => 'doktype;;2;;1-1-1, hidden, title;LLL:EXT:lang/locallang_general.xml:LGL.title,
			--div--;LLL:EXT:cms/locallang_tca.xml:pages.tabs.files,
				media,
			--div--;LLL:EXT:cms/locallang_tca.xml:pages.tabs.options,
				TSconfig;;6;nowrap;5-5-5, storage_pid;;7, module,
			--div--;LLL:EXT:cms/locallang_tca.xml:pages.tabs.extended,
		'), '255' => array('showitem' => 'doktype;;2;;1-1-1, hidden, title,
			--div--;LLL:EXT:cms/locallang_tca.xml:pages.tabs.extended,
		'));
// Merging palette settings:
// t3lib_div::array_merge() MUST be used - otherwise the keys will be re-numbered!
$TCA['pages']['palettes'] = t3lib_div::array_merge($TCA['pages']['palettes'], array('1' => array('showitem' => 'starttime, endtime, extendToSubpages'), '2' => array('showitem' => 'layout, lastUpdated, newUntil, no_search'), '3' => array('showitem' => 'alias, target, no_cache, cache_timeout'), '5' => array('showitem' => 'author, author_email', 'canNotCollapse' => 1)));
// if the compat version is less than 4.2, pagetype 2 ("Advanced")
// and pagetype 5 ("Not in menu") are added to TCA.
if (!t3lib_div::compat_version('4.2')) {
    // Merging in CMS doktypes
    array_splice($TCA['pages']['columns']['doktype']['config']['items'], 2, 0, array(array('LLL:EXT:cms/locallang_tca.xml:pages.doktype.I.0', '2', 'i/pages.gif'), array('LLL:EXT:cms/locallang_tca.xml:pages.doktype.I.3', '5', 'i/pages_notinmenu.gif')));
    // setting the doktype 1 ("Standard") to show less fields
    $TCA['pages']['types'][1] = array('showitem' => 'doktype;;2;;1-1-1, hidden, nav_hide, title;;3;;2-2-2, subtitle,
				--div--;LLL:EXT:cms/locallang_tca.xml:pages.tabs.access,
					starttime, endtime, fe_group, extendToSubpages,
				--div--;LLL:EXT:cms/locallang_tca.xml:pages.tabs.options,
					TSconfig;;6;nowrap;4-4-4, storage_pid;;7, l18n_cfg,
				--div--;LLL:EXT:cms/locallang_tca.xml:pages.tabs.extended,
		');
    // adding doktype 2 ("Advanced")
    $TCA['pages']['types'][2] = array('showitem' => 'doktype;;2;;1-1-1, hidden, nav_hide, title;;3;;2-2-2, subtitle, nav_title,
 /**
  * main method which controls the data flow and outputs the addresses
  *
  * @param	string	$content: content string, empty
  * @param	array	$conf: configuration array with TS configuration
  * @return	string	the processed addresses
  */
 function main($content, $conf)
 {
     $this->init($conf);
     $content = '';
     $singleSelection = $this->getSingleRecords();
     $groupSelection = $this->getRecordsFromGroups();
     // merge both arrays so that we do not have any duplicates
     $addresses = t3lib_div::array_merge($singleSelection, $groupSelection);
     $templateCode = $this->getTemplate();
     // apply sorting
     if ($this->conf['sortByColumn'] === 'singleSelection' && count($groupSelection) === 0) {
         // we want to sort by single selection and only have single record selection
         $sortedAdressesUid = explode(',', $this->conf['singleSelection']);
         $sortedAddresses = array();
         foreach ($sortedAdressesUid as $uid) {
             $sortedAddresses[] = $addresses[$uid];
         }
         $addresses = $sortedAddresses;
     } else {
         // if sortByColumn was set to singleSelection, but we don't have a single selection, switch to default column "name"
         if ($this->conf['sortByColumn'] === 'singleSelection') {
             $this->conf['sortByColumn'] = 'name';
         }
         // sorting the addresses by any other field
         $sortBy = array();
         foreach ($addresses as $k => $v) {
             $sortBy[$k] = $this->normalizeSortingString($v[$this->conf['sortByColumn']]);
         }
         array_multisort($sortBy, $this->conf['sortOrder'], $addresses);
     }
     // limit output to max listMaxItems addresses
     if ((int) $this->conf['listMaxItems'] > 0) {
         $addresses = array_slice($addresses, 0, (int) $this->conf['listMaxItems']);
     }
     // output
     foreach ($addresses as $address) {
         if (!empty($address)) {
             $markerArray = $this->getItemMarkerArray($address);
             $subpartArray = $this->getSubpartArray($templateCode, $markerArray, $address);
             $addressContent = $this->cObj->substituteMarkerArrayCached($templateCode, $markerArray, $subpartArray);
             $wrap = $this->conf['templates.'][$this->conf['templateName'] . '.']['wrap'];
             $content .= $this->cObj->wrap($addressContent, $wrap);
             $content .= chr(10) . chr(10);
         }
     }
     $templateAllWrap = $this->conf['templates.'][$this->conf['templateName'] . '.']['allWrap'];
     $content = $this->cObj->wrap($content, $templateAllWrap);
     $overallWrap = $this->conf['wrap'];
     $content = $this->cObj->wrap($content, $overallWrap);
     return $this->pi_wrapInBaseClass($content);
 }
 /**
  * Return the CloudCarousel for chgallery (Experimental)
  * 
  * @param $content
  * @param $conf
  */
 function getCloudCarousel($content, $conf)
 {
     require_once t3lib_extMgm::extPath('imagecarousel') . 'pi2/class.tx_imagecarousel_pi2.php';
     $obj = t3lib_div::makeInstance('tx_imagecarousel_pi2');
     if ($conf['contentKey']) {
         $obj->setContentKey($conf['contentKey']);
     } else {
         $obj->setContentKey($obj->extKey . '_' . $this->cObj->data['uid']);
     }
     $obj->conf = t3lib_div::array_merge($GLOBALS['TSFE']->tmpl->setup['plugin.']['tx_imagecarousel_pi2.'], $conf);
     $obj->cObj = $this->cObj;
     $obj->type = 'chgallery';
     $return_string = $obj->parseTemplate('', true);
     return $content;
 }
 /**
  * add localized page records to a cache/globalArray
  * This is much faster than requesting the DB for each tt_content-record
  *
  * @param array $pageRow
  * @return void
  */
 public function addLocalizedPagesToCache($pageRow)
 {
     // create entry in cachedPageRecods for default language
     $this->cachedPageRecords[0][$pageRow['uid']] = $pageRow;
     // create entry in cachedPageRecods for additional languages, skip default language 0
     foreach ($this->sysLanguages as $sysLang) {
         if ($sysLang[1] > 0) {
             if (TYPO3_VERSION_INTEGER >= 7000000) {
                 list($pageOverlay) = \TYPO3\CMS\Backend\Utility\BackendUtility::getRecordsByField('pages_language_overlay', 'pid', $pageRow['uid'], 'AND sys_language_uid=' . intval($sysLang[1]));
             } else {
                 list($pageOverlay) = t3lib_BEfunc::getRecordsByField('pages_language_overlay', 'pid', $pageRow['uid'], 'AND sys_language_uid=' . intval($sysLang[1]));
             }
             if ($pageOverlay) {
                 if (TYPO3_VERSION_INTEGER >= 7000000) {
                     $this->cachedPageRecords[$sysLang[1]][$pageRow['uid']] = \TYPO3\CMS\Core\Utility\GeneralUtility::array_merge($pageRow, $pageOverlay);
                 } else {
                     $this->cachedPageRecords[$sysLang[1]][$pageRow['uid']] = t3lib_div::array_merge($pageRow, $pageOverlay);
                 }
             }
         }
     }
 }
Example #13
0
 /**
  * Adds items to the ->MOD_MENU array. Used for the function menu selector.
  *
  * @return	void
  */
 function menuConfig()
 {
     // Load the list of values that can be used as filters (filters are used only when all entries are being displayed)
     $this->getLogFilters();
     $this->MOD_MENU = array('function' => array('showlog' => $GLOBALS['LANG']->getLL('showlog'), 'cleanup' => $GLOBALS['LANG']->getLL('cleanup')), 'logrun' => array('1000' => $GLOBALS['LANG']->getLL('latest_run'), '25' => $GLOBALS['LANG']->getLL('latest_25'), '50' => $GLOBALS['LANG']->getLL('latest_50'), '100' => $GLOBALS['LANG']->getLL('latest_100'), '-1' => $GLOBALS['LANG']->getLL('all_entries')), 'autorefresh' => 0, 'page' => 0, 'expandAllExtraData' => 0, 'sword' => '');
     $this->MOD_MENU['logrun'] = t3lib_div::array_merge($this->recentRuns, $this->MOD_MENU['logrun']);
     // If the clear button has been clicked, empty all filters
     if (!empty($this->setVars['clear'])) {
         $this->selectedFilters = array();
         $GLOBALS['BE_USER']->pushModuleData('selectedFilters', $this->selectedFilters);
     } else {
         if (isset($this->setVars['filters'])) {
             $storedData = $GLOBALS['BE_USER']->getModuleData('selectedFilters');
             if (isset($storedData)) {
                 $this->selectedFilters = array_merge($storedData, $this->setVars['filters']);
             } else {
                 $this->selectedFilters = $this->setVars['filters'];
             }
             $GLOBALS['BE_USER']->pushModuleData('selectedFilters', $this->selectedFilters);
         } else {
             $this->selectedFilters = $GLOBALS['BE_USER']->getModuleData('selectedFilters');
         }
     }
     parent::menuConfig();
 }
 /**
  * get meta information from a file using the metaExtract service
  *
  * @param	string		file with absolut path
  * @param	array		file meta information which should be extended
  * @return	array		file meta information
  * @todo what about using services in a chain?
  */
 function getFileMetaInfo($pathname, $meta)
 {
     global $TYPO3_CONF_VARS;
     $TX_DAM = $GLOBALS['T3_VAR']['ext']['dam'];
     $conf = array();
     $conf['wantedCharset'] = $this->getWantedCharset();
     if (is_file($pathname) && is_readable($pathname)) {
         $fileType = $meta['fields']['file_type'];
         if ($this->setup['useInternalMediaTypeList']) {
             // get media type from file type
             $meta['fields']['media_type'] = $TX_DAM['file2mediaCode'][$fileType];
             //  or from mime type
             $meta['fields']['media_type'] = $meta['fields']['media_type'] ? $meta['fields']['media_type'] : tx_dam::convert_mediaType($meta['fields']['file_mime_type']);
         } else {
             $meta['fields']['media_type'] = tx_dam::convert_mediaType($meta['fields']['file_mime_type']);
         }
         $mediaType = tx_dam::convert_mediaType($meta['fields']['media_type']);
         // find a service for that file type
         if (!is_object($serviceObj = t3lib_div::makeInstanceService('metaExtract', $fileType))) {
             // find a global service for that media type
             $serviceObj = t3lib_div::makeInstanceService('metaExtract', $mediaType . ':*');
         }
         if (is_object($serviceObj)) {
             $serviceObj->setInputFile($pathname, $fileType);
             $conf['meta'] = $meta;
             if ($serviceObj->process('', '', $conf) > 0 and is_array($svmeta = $serviceObj->getOutput())) {
                 $meta = t3lib_div::array_merge_recursive_overrule($meta, $svmeta);
             }
             $serviceObj->__destruct();
             unset($serviceObj);
         }
         // make simple image size detection if not yet done
         if ($meta['fields']['media_type'] == TXDAM_mtype_image and intval($meta['fields']['hpixels']) == 0) {
             $imgsize = $this->getImageDimensions($pathname, $meta);
             $meta = t3lib_div::array_merge_recursive_overrule($meta, $imgsize);
         }
         $metaExtractServices = array();
         $extraServiceTypes = array();
         if (!isset($meta['fields']['meta']['EXIF']) and !$meta['exif_done']) {
             $metaExtractServices[TXDAM_mtype_image][] = 'image:exif';
         }
         if (!isset($meta['fields']['meta']['IPTC']) and !$meta['iptc_done'] and (!isset($meta['fields']['meta']['XMP']) and !$meta['xmp_done'])) {
             $metaExtractServices[TXDAM_mtype_image][] = 'image:iptc';
         }
         if ($extraServiceTypes) {
             $metaExtractServices[TXDAM_mtype_image] = t3lib_div::array_merge($metaExtractServices[TXDAM_mtype_image], implode(', ', $extraServiceTypes));
         }
         // TODO should be possible to register other services too?!
         // read exif, iptc data
         if (is_array($metaExtractServices[$meta['fields']['media_type']])) {
             foreach ($metaExtractServices[$meta['fields']['media_type']] as $subType) {
                 if ($serviceObj = t3lib_div::makeInstanceService('metaExtract', $subType)) {
                     $serviceObj->setInputFile($pathname, $fileType);
                     $conf['meta'] = $meta;
                     if ($serviceObj->process('', '', $conf) > 0 and is_array($svmeta = $serviceObj->getOutput())) {
                         $meta = t3lib_div::array_merge_recursive_overrule($meta, $svmeta);
                     }
                     $serviceObj->__destruct();
                     unset($serviceObj);
                 }
             }
         }
         // convert extra meta data to xml
         if (is_array($meta['fields']['meta'])) {
             // content in array is expected as utf-8 because of xml functions
             $meta['fields']['meta'] = $this->array2xml($meta['fields']['meta']);
         }
         // If no title then the file-name is set as title. This will raise the hits considerably if the search matches the document name.
         if ($meta['fields']['title'] == '') {
             $meta['fields']['title'] = $this->makeTitleFromFilename($meta['fields']['file_name']);
         }
         $meta['fields']['keywords'] = $this->listBeautify($meta['fields']['keywords']);
     }
     if ($this->writeDevLog) {
         t3lib_div::devLog('getFileMetaInfo()', 'tx_dam_indexing', 0, $meta);
     }
     return $meta;
 }