/** * */ protected function compile() { global $objPage; $strFormTemplate = $this->f_form_template; $strDateFormat = $objPage->dateFormat; $arrPageTaxonomy = $this->getPageTaxonomy($objPage->page_taxonomy); $arrFEFields = $this->f_form_fields ? deserialize($this->f_form_fields) : array(); $arrFields = array(); $arrWidgets = array(); $strWidget = ''; $arrActiveOptions = $this->f_active_options ? deserialize($this->f_active_options) : array(); $objAutoComplete = new AutoCompletion(); // model information $strListViewID = $this->f_list_field; $objModule = $this->Database->prepare('SELECT * FROM tl_module WHERE id = ?')->execute($strListViewID)->row(); $strModuleTableName = $objModule['f_select_module']; $strWrapperID = $objModule['f_select_wrapper']; $arrModeSettings = deserialize($objModule['f_display_mode']); $arrModeSettings = is_array($arrModeSettings) ? array_values($arrModeSettings) : array(); if (!$strModuleTableName || !$strWrapperID) { return; } // set fields from db if (is_array($arrFEFields)) { $arrIDs = array(); foreach ($arrFEFields as $strID => $arrFEField) { $arrIDs[] = $strID; } $strPlaceholder = implode(',', array_fill(0, count($arrIDs), '?')); $objFields = $this->Database->prepare('SELECT * FROM tl_fmodules_filters WHERE id IN (' . $strPlaceholder . ')')->execute($arrIDs); if ($objFields->count()) { while ($objFields->next()) { $arrField = $objFields->row(); $arrFields[$arrField['id']] = $arrField; } } // merge field from fe and fields from db $_arrFields = array(); foreach ($arrFEFields as $strID => $arrFEField) { // do not display if field has dependency on other field if ($arrFEField['dependsOn']) { if (!\Input::get($arrFEField['dependsOn'])) { continue; } } $_arrFields[$arrFEField['fieldID']] = $arrFEField; if (is_array($arrFields[$strID])) { foreach ($arrFields[$strID] as $strKey => $strValue) { $_arrFields[$arrFEField['fieldID']][$strKey] = $strValue; } } } // replace fields array $arrFields = $_arrFields; } // generate action attribute $strAction = \Environment::get('request'); if ($this->fm_redirect_source) { $type = $this->fm_redirect_source; if ($type == 'siteID') { $id = $this->fm_redirect_jumpTo; if ($id) { $pageDB = $this->Database->prepare('SELECT * FROM tl_page WHERE id = ?')->execute($id)->row(); } if (!empty($pageDB)) { $strAction = $this->generateFrontendUrl($pageDB); } } if ($type == 'siteURL') { $url = $this->fm_redirect_url; if ($url) { $strAction = $this->replaceInsertTags($url); } } } // get field values $arrActiveFields = array(); $blnStartPoint = true; $arrNotRelateAbleFields = array('orderBy', 'sorting_fields', 'pagination'); foreach ($arrFields as $strFieldID => $arrField) { $strValue = \Input::get($strFieldID) ? \Input::get($strFieldID) : ''; $arrFields[$strFieldID]['value'] = $strValue; $arrFields[$strFieldID]['enable'] = false; $blnIsValue = QueryModel::isValue($strValue); // set labels $arrLabel = $this->setLabels($arrField); $arrFields[$strFieldID]['title'] = $arrLabel[0]; $arrFields[$strFieldID]['description'] = $arrLabel[1]; // set enable if ($blnIsValue) { $arrFields[$strFieldID]['enable'] = true; } // do not set start point if ($this->fm_related_start_point && $blnStartPoint) { $blnStartPoint = false; continue; } // do not set if (in_array($arrField['fieldID'], $arrNotRelateAbleFields)) { continue; } $arrActiveFields[] = $strFieldID; } unset($blnStartPoint); $arrFilteredOptions = array(); if ($this->fm_related_options) { // get only active options $arrQueryData = HelperModel::generateSQLQueryFromFilterArray($arrFields); $strQuery = $arrQueryData['qStr']; $qTextSearch = $arrQueryData['isFulltextSearch'] ? $arrQueryData['$qTextSearch'] : ''; //get text search results $textSearchResults = array(); if ($qTextSearch) { $textSearchResults = QueryModel::getTextSearchResult($qTextSearch, $strModuleTableName, $strWrapperID, $arrQueryData['searchSettings']); } // get only published items $qProtectedStr = ' AND published = "1"'; // preview mode if (HelperModel::previewMode()) { $qProtectedStr = ''; } // get all items $objList = $this->Database->prepare('SELECT * FROM ' . $strModuleTableName . '_data WHERE pid = ' . $strWrapperID . $qProtectedStr . $strQuery)->query(); // filtered options $_arrFilteredOptions = array(); while ($objList->next()) { $arrListItem = $objList->row(); if ($qTextSearch) { if (!$textSearchResults[$arrListItem['id']]) { continue; } } foreach ($arrActiveFields as $strActiveField) { $arrFilteredOptions[$strActiveField] = array(); $arrValues = explode(',', $arrListItem[$strActiveField]); $_arrFilteredOptions[$strActiveField][] = array_values($arrValues); } } // pluck values foreach ($_arrFilteredOptions as $strFieldID => $arrFilteredOption) { $arrFilteredOption = call_user_func_array('array_merge', $arrFilteredOption); $arrFilteredOption = array_unique($arrFilteredOption); $arrFilteredOptions[$strFieldID] = $arrFilteredOption; } } // set options $objWrapper = $this->Database->prepare('SELECT * FROM ' . $strModuleTableName . ' WHERE id = ?')->execute($strWrapperID)->row(); foreach ($arrFields as $strFieldID => $arrField) { if ($arrField['type'] == 'multi_choice' || $arrField['type'] == 'simple_choice') { $arrWrapperOptions = $objWrapper[$strFieldID] ? deserialize($objWrapper[$strFieldID]) : array(); if ($arrField['dataFromTaxonomy'] == '1') { $arrWrapperOptions = $this->getDataFromTaxonomy($objWrapper['select_taxonomy_' . $strFieldID]); } if ($arrField['reactToTaxonomy'] == '1') { $arrWrapperOptions = $this->getDataFromTaxonomyTags($arrField['reactToField'], $objWrapper); } if ($arrWrapperOptions['table'] && !in_array($strFieldID, $arrActiveOptions)) { $arrFields[$strFieldID]['options'] = $this->getDataFromTable($objWrapper[$strFieldID]); } if (is_null($arrWrapperOptions['table']) && !in_array($strFieldID, $arrActiveOptions)) { $arrFields[$strFieldID]['options'] = $arrWrapperOptions; } } // set countries if ($arrField['fieldID'] == 'address_country') { $arrCountries = $this->getCountries(); $arrFields[$strFieldID]['options'] = DiverseFunction::conformOptionsArray($arrCountries); } // geo locator if ($arrField['type'] == 'geo_locator') { if ($arrField['locatorType'] == 'geo_distance') { $arrFields[$strFieldID]['geoDistanceOptions'] = $this->generateGeoDistanceOptions($arrField['geoDistanceOptions']); } } // get options if ($strFieldID && in_array($strFieldID, $arrActiveOptions)) { $results = $objAutoComplete->getAutoCompletion($strModuleTableName, $strWrapperID, $strFieldID, $objPage->dateFormat, $objPage->timeFormat); // taxonomy tags if ($arrField['reactToTaxonomy'] == '1') { $tempResults = array(); $arrValues = $this->getDataFromTaxonomyTags($arrField['reactToField'], $arrField, true); foreach ($results as $result) { if (!in_array($result['value'], $arrValues)) { continue; } $tempResults[] = $result; } $results = $tempResults; unset($tempResults); } $arrFields[$strFieldID]['options'] = is_array($results) ? $results : array(); } if ($this->fm_related_options && is_array($arrFields[$strFieldID]['options'])) { $arrNewOptions = array(); foreach ($arrFields[$strFieldID]['options'] as $intIndex => $arrKeyValue) { if (is_array($arrFilteredOptions[$strFieldID]) && !in_array($arrKeyValue['value'], $arrFilteredOptions[$strFieldID])) { continue; } $arrNewOptions[] = $arrKeyValue; } $arrFields[$strFieldID]['options'] = $arrNewOptions; } // set table name $arrFields[$strFieldID]['tablename'] = !strpos($strModuleTableName, '_data') ? $strModuleTableName . '_data' : $strModuleTableName; // date field if ($arrField['type'] == 'date_field') { $format = $arrField['addTime'] ? $objPage->datimFormat : $strDateFormat; $arrFields[$strFieldID]['format'] = $format; $arrFields[$strFieldID]['operator'] = $this->getOperator(); $arrFields[$strFieldID]['selected_operator'] = \Input::get($strFieldID . '_int'); } // search field (int) if ($arrField['type'] == 'search_field' && $arrField['isInteger'] == '1') { $arrFields[$strFieldID]['operator'] = $this->getOperator(); $arrFields[$strFieldID]['selected_operator'] = \Input::get($strFieldID . '_int'); } // search field if ($arrField['type'] == 'search_field') { //backwards compatible $arrFields[$strFieldID]['auto_complete'] = $arrFields[$strFieldID]['options']; } if ($arrField['type'] == 'toggle_field') { $arrFields[$strFieldID]['showLabel'] = $GLOBALS['TL_LANG']['MSC']['fm_highlight_show']; $arrFields[$strFieldID]['ignoreLabel'] = $GLOBALS['TL_LANG']['MSC']['fm_highlight_ignore']; } $arrFields[$strFieldID]['wrapperID'] = $strWrapperID; $arrFields[$strFieldID]['selected'] = $arrFields[$strFieldID]['value']; // if ($arrField['type'] == 'search_field' && $arrField['isInteger'] == '1') { if (!$arrFields[$strFieldID]['selected'] && !is_null(\Input::get($arrField['fieldID']))) { $arrFields[$strFieldID]['selected'] = ''; } } // if ($arrField['type'] == 'toggle_field' && !$arrFields[$strFieldID]['value']) { $arrFields[$strFieldID]['selected'] = ''; } // set templates $strTemplateName = $this->parseTemplateName($arrField['used_templates']); $arrWidgets[$strFieldID] = array('data' => $arrFields[$strFieldID], 'tpl' => $strTemplateName); } foreach ($arrWidgets as $strFieldID => $arrWidget) { if ($arrWidget['data']['type'] == 'wrapper_field' && $arrWidget['data']['from_field'] && $arrWidget['data']['to_field']) { if ($arrWidget['data']['from_field'] == $arrWidget['data']['to_field']) { $fromFieldData = $arrWidgets[$arrWidget['data']['from_field']]['data']; $arrWidget['data']['title'] = $fromFieldData['title']; $arrWidget['data']['description'] = $fromFieldData['description']; $fromFieldData['operator'] = array('gte' => $GLOBALS['TL_LANG']['MSC']['f_gte']); $fromFieldData['title'] = $GLOBALS['TL_LANG']['MSC']['fm_from_label']; $fromFieldData['description'] = ''; $fromTemplateObj = new \FrontendTemplate($arrWidgets[$arrWidget['data']['from_field']]['tpl']); $fromTemplateObj->setData($fromFieldData); $from_template = $fromTemplateObj->parse(); $arrWidget['data']['from_template'] = $from_template; //to $toFieldData = $arrWidgets[$arrWidget['data']['to_field']]['data']; $toFieldData['fieldID'] = $toFieldData['fieldID'] . '_btw'; $toFieldData['title'] = $GLOBALS['TL_LANG']['MSC']['fm_to_label']; $toFieldData['description'] = ''; $selectValue = \Input::get($toFieldData['fieldID']); if (!is_null($selectValue) && !$selectValue && $toFieldData['type'] != 'date_field') { $selectValue = ''; } $toFieldData['selected'] = $selectValue; $toFieldData['operator'] = array('lte' => $GLOBALS['TL_LANG']['MSC']['f_lte']); $toTemplateObj = new \FrontendTemplate($arrWidgets[$arrWidget['data']['to_field']]['tpl']); $toTemplateObj->setData($toFieldData); $to_template = $toTemplateObj->parse(); $arrWidget['data']['to_template'] = $to_template; } else { // generate from field tpl $fromFieldData = $arrWidgets[$arrWidget['data']['from_field']]['data']; $fromFieldData['operator'] = array('gte' => $GLOBALS['TL_LANG']['MSC']['f_gte']); $fromTemplateObj = new \FrontendTemplate($arrWidgets[$arrWidget['data']['from_field']]['tpl']); $fromTemplateObj->setData($fromFieldData); $from_template = $fromTemplateObj->parse(); $arrWidget['data']['from_template'] = $from_template; // generate to field tpl $toFieldData = $arrWidgets[$arrWidget['data']['to_field']]['data']; $toFieldData['operator'] = array('lte' => $GLOBALS['TL_LANG']['MSC']['f_lte']); $toTemplateObj = new \FrontendTemplate($arrWidgets[$arrWidget['data']['to_field']]['tpl']); $toTemplateObj->setData($toFieldData); $to_template = $toTemplateObj->parse(); $arrWidget['data']['to_template'] = $to_template; } } // sort out fixed field if ($this->sortOutFixedField($strFieldID, $arrModeSettings)) { continue; } // disable inactive fields if (!$arrWidget['data']['active']) { continue; } // if ($arrWidget['data']['overwrite'] == '1') { continue; } // if ($arrPageTaxonomy[$strFieldID] && $arrPageTaxonomy[$strFieldID]['set']['overwrite'] == '1') { continue; } $strWidgetTemplate = new \FrontendTemplate($arrWidget['tpl']); $strWidgetTemplate->setData($arrWidget['data']); $strWidget .= $strWidgetTemplate->parse(); } $strResult = ''; $objTemplate = new \FrontendTemplate($strFormTemplate); $objTemplate->setData(array('widgets' => $strWidget, 'filter' => $GLOBALS['TL_LANG']['MSC']['widget_submit'], 'enableSubmit' => $this->fm_disable_submit)); $strResult .= $objTemplate->parse(); $this->Template->action = $strAction; $this->Template->reset = $GLOBALS['TL_LANG']['MSC']['fm_ff_reset']; $this->Template->cssID = $this->cssID; $this->Template->fields = $strResult; }
/** * return list view * filter allowed */ public function getEntities() { $strTableName = \Input::get('tablename'); $strTableData = $strTableName . '_data'; $strWrapperID = \Input::get('wrapperID'); $dateFormat = \Input::get('dateFormat') ? \Input::get('dateFormat') : \Config::get('dateFormat'); $timeFormat = \Input::get('timeFormat') ? \Input::get('timeFormat') : \Config::get('timeFormat'); $strTemplate = \Input::get('template') ? \Input::get('template') : 'fmodule_teaser'; $this->tablename = $strTableData; $arrResults = []; $arrModuleData = $this->getModule($strTableName, $strWrapperID); $arrFields = $arrModuleData['arrFields']; $fieldWidgets = $arrModuleData['arrWidgets']; $mapFields = $arrModuleData['mapFields']; $arrCleanOptions = $arrModuleData['arrCleanOptions']; if (!$strTableName || !$strWrapperID) { $this->sendFailState("no back end module found"); } if (!$this->Database->tableExists($strTableName)) { $this->sendFailState("no table found"); } // get wrapper $wrapperDB = $this->Database->prepare('SELECT * FROM ' . $strTableName . ' WHERE id = ?')->execute($strWrapperID)->row(); // get fields and create query $qResult = HelperModel::generateSQLQueryFromFilterArray($arrFields); $qStr = $qResult['qStr']; $qTextSearch = $qResult['isFulltextSearch'] ? $qResult['$qTextSearch'] : ''; //get text search results $textSearchResults = array(); if ($qTextSearch) { $textSearchResults = QueryModel::getTextSearchResult($qTextSearch, $strTableName, $strWrapperID, $qResult['searchSettings']); } $addDetailPage = $wrapperDB['addDetailPage']; $rootDB = $this->Database->prepare('SELECT * FROM ' . $strTableName . ' JOIN tl_page ON tl_page.id = ' . $strTableName . '.rootPage WHERE ' . $strTableName . '.id = ?')->execute($strWrapperID)->row(); $qOrderByStr = $this->getOrderBy(); $qProtectedStr = ' AND published = "1"'; // get list $objList = $this->Database->prepare('SELECT * FROM ' . $strTableData . ' WHERE pid = ' . $strWrapperID . $qProtectedStr . $qStr . $qOrderByStr)->query(); $arrItems = array(); while ($objList->next()) { $arrItem = $objList->row(); if (HelperModel::sortOutProtected($arrItem, $this->User->groups)) { continue; } if (!HelperModel::outSideScope($arrItem['start'], $arrItem['stop'])) { continue; } // image $imagePath = $this->generateSingeSrc($objList); if ($imagePath) { $arrItem['singleSRC'] = $imagePath; } if ($arrItem['size']) { $arrItem['size'] = deserialize($arrItem['size']); } if ($arrItem['cssID']) { $arrItem['cssID'] = deserialize($arrItem['cssID']); } if ($arrItem['addGallery'] && $arrItem['multiSRC']) { $objGallery = new GalleryGenerator(); $objGallery->id = $arrItem['id']; $objGallery->sortBy = $arrItem['sortBy']; $objGallery->orderSRC = $arrItem['orderSRC']; $objGallery->metaIgnore = $arrItem['metaIgnore']; $objGallery->numberOfItems = $arrItem['numberOfItems']; $objGallery->perPage = $arrItem['perPageGallery']; $objGallery->perRow = $arrItem['perRow']; $objGallery->size = $arrItem['size']; $objGallery->fullsize = $arrItem['fullsize']; $objGallery->galleryTpl = $arrItem['galleryTpl']; $objGallery->getAllImages($arrItem['multiSRC']); $arrItem['gallery'] = $objGallery->renderGallery(); } // create href $arrItem['href'] = null; if ($addDetailPage == '1' && $objList->source == 'default') { // reset target $arrItem['target'] = ''; $arrItem['href'] = $this->generateUrl($rootDB, $arrItem['alias']); // $listDB->alias } if ($arrItem['source'] == 'external') { $arrItem['href'] = $arrItem['url']; } if ($arrItem['source'] == 'internal') { // reset target $arrItem['target'] = ''; $jumpToDB = $this->Database->prepare('SELECT * FROM tl_page WHERE id = ?')->execute($objList->jumpTo)->row(); $strTaxonomyUrl = \Config::get('taxonomyDisable') ? '' : $this->generateTaxonomyUrl(); $arrItem['href'] = $this->generateFrontendUrl($jumpToDB, $strTaxonomyUrl); } // check for text search if ($qTextSearch) { if (!$textSearchResults[$arrItem['id']]) { continue; } } // $arrItems[] = $arrItem; } if (\Input::get('orderBy') && mb_strtoupper(\Input::get('orderBy'), 'UTF-8') == 'RAND') { shuffle($arrItems); } $total = count($arrItems); $this->listViewLimit = $total; $this->createPagination($total); $objTemplate = new \FrontendTemplate($strTemplate); $strResults = ''; for ($i = $this->listViewOffset; $i < $this->listViewLimit; $i++) { $item = $arrItems[$i]; // set css and id $item['cssID'] = deserialize($item['cssID']); $item['itemID'] = $item['cssID'][0]; $item['itemCSS'] = $item['cssID'][1] ? ' ' . $item['cssID'][1] : ''; // set date format $date = date('Y-m-d', $item['date']); $time = date('H:i', $item['time']); $dateTime = $time ? $date . ' ' . $time : $date; $item['dateTime'] = $dateTime; $item['date'] = $item['date'] ? date($dateFormat, $item['date']) : ''; $item['time'] = $item['time'] ? date($timeFormat, $item['time']) : ''; // set more $item['more'] = $GLOBALS['TL_LANG']['MSC']['more']; // get list view ce $objCte = ContentModelExtend::findPublishedByPidAndTable($item['id'], $strTableName . '_data', array('fview' => 'list')); $arrElements = array(); if ($objCte !== null) { $intCount = 0; $intLast = $objCte->count() - 1; while ($objCte->next()) { $arrCss = array(); $objRow = $objCte->current(); if ($intCount == 0 || $intCount == $intLast) { if ($intCount == 0) { $arrCss[] = 'first'; } if ($intCount == $intLast) { $arrCss[] = 'last'; } } $objRow->classes = $arrCss; $arrElements[] = $this->getContentElement($objRow, $this->strColumn); ++$intCount; } } $item['teaser'] = $arrElements; // set odd and even classes $item['cssClass'] = $i % 2 ? ' even' : ' odd'; //field if (!empty($fieldWidgets)) { $arrayAsValue = array('list.blank', 'list.keyValue', 'table.blank'); foreach ($fieldWidgets as $widget) { $id = $widget['fieldID']; $tplName = $widget['widgetTemplate']; $type = $widget['widgetType']; $value = $item[$id]; if (in_array($type, $arrayAsValue)) { $value = deserialize($value); } // unserialize $objFieldTemplate = new \FrontendTemplate($tplName); $objFieldTemplate->setData(array('value' => $value, 'type' => $type, 'item' => $item)); $item[$id] = $objFieldTemplate->parse(); } } // set last first classes if ($i == 0) { $item['cssClass'] .= ' first'; } if ($i == $this->listViewLimit - 1) { $item['cssClass'] .= ' last'; } // create marker path if ($item['addMarker'] && $item['markerSRC']) { if ($this->markerCache[$item['markerSRC']]) { $item['markerSRC'] = $this->markerCache[$item['markerSRC']]; } else { $markerDB = $this->Database->prepare('SELECT * FROM tl_files WHERE uuid = ?')->execute($item['markerSRC']); if ($markerDB->count()) { $pathInfo = $markerDB->row()['path']; if ($pathInfo) { $this->markerCache[$item['markerSRC']] = $pathInfo; $item['markerSRC'] = $pathInfo; } } } } // map settings from field if (!empty($mapFields)) { foreach ($mapFields as $map) { $objMapTemplate = new \FrontendTemplate($map['template']); $item['mapSettings'] = $map; $objMapTemplate->setData($item); $item[$map['fieldID']] = $objMapTemplate->parse(); } } // mapSettings if (!empty($mapSettings)) { $item['mapSettings'] = $mapSettings; } // set clean options if (!empty($arrCleanOptions)) { $item['cleanOptions'] = $arrCleanOptions; // overwrite clean options foreach ($arrCleanOptions as $fieldID => $options) { if ($item[$fieldID] && is_string($item[$fieldID])) { $arrValues = explode(',', $item[$fieldID]); $arrValuesAsString = array(); $arrValuesAsArray = array(); if (is_array($arrValues)) { foreach ($arrValues as $val) { $arrValuesAsArray[$val] = $options[$val]; $arrValuesAsString[] = $options[$val]; } } $item[$fieldID . 'AsArray'] = $arrValuesAsArray; $item[$fieldID] = implode(', ', $arrValuesAsString); } } } //set data $objTemplate->setData($item); //set image if ($item['addImage']) { $this->addImageToTemplate($objTemplate, array('singleSRC' => $item['singleSRC'], 'alt' => $item['alt'], 'size' => $item['size'], 'fullsize' => $item['fullsize'], 'caption' => $item['caption'], 'title' => $item['title'])); } // set enclosure $objTemplate->enclosure = array(); if ($item['addEnclosure']) { $this->addEnclosuresToTemplate($objTemplate, $item); } $arrResults[] = $item; $strResults .= $objTemplate->parse(); } $arrData = array('arrData' => $arrResults, 'strTemplate' => $strResults, 'arrFields' => $arrModuleData, 'arrWrapper' => $wrapperDB, 'arrLabels' => array('noResults' => $GLOBALS['TL_LANG']['MSC']['noResult'])); header('Content-type: application/json'); echo json_encode($arrData, 512); exit; }