/** * Returns all available search form placements - those data bundles that can be searches for the given content type, in other words. * The returned value is a list of arrays; each array contains a 'bundle' specifier than can be passed got Model::get() or SearchResult::get() and a display name * * @param mixed $pm_table_name_or_num The table name or number specifying the content type to fetch bundles for. If omitted the content table of the currently loaded search form will be used. * @return array And array of bundles keyed on display label. Each value is an array with these keys: * bundle = The bundle name (eg. ca_objects.idno) * display = Display label for each available bundle * description = Description of bundle * * Will return null if table name or number is invalid. */ public function getAvailableBundles($pm_table_name_or_num = null, $pa_options = null) { if (!$pm_table_name_or_num) { $pm_table_name_or_num = $this->get('table_num'); } $pm_table_name_or_num = $this->_DATAMODEL->getTableNum($pm_table_name_or_num); if (!$pm_table_name_or_num) { return null; } $t_instance = $this->_DATAMODEL->getInstanceByTableNum($pm_table_name_or_num, true); $va_search_settings = $this->opo_search_indexing_config->getAssoc($this->_DATAMODEL->getTableName($pm_table_name_or_num)); $vs_primary_table = $t_instance->tableName(); $vs_table_display_name = $t_instance->getProperty('NAME_PLURAL'); $t_placement = new ca_search_form_placements(null, array()); $va_available_bundles = array(); $va_additional_settings = array('width' => array('formatType' => FT_TEXT, 'displayType' => DT_FIELD, 'width' => 4, 'height' => 1, 'takesLocale' => false, 'default' => "100px", 'label' => _t('Width'), 'description' => _t('Width, in characters, of search form elements.'))); $t_placement->setSettingDefinitionsForPlacement($va_additional_settings); // Full-text $vs_bundle = "_fulltext"; $vs_display = "<div id='searchFormEditor__fulltext'><span class='bundleDisplayEditorPlacementListItemTitle'>" . _t("General") . '</span> ' . ($vs_label = _t('Full text')) . "</div>"; $va_available_bundles[strip_tags($vs_display)][$vs_bundle] = array('bundle' => $vs_bundle, 'label' => $vs_label, 'display' => $vs_display, 'description' => $vs_description = _t('Searches on all content that has been indexed'), 'settingsForm' => $t_placement->getHTMLSettingForm(array('id' => $vs_bundle . '_0')), 'settings' => $va_additional_settings); TooltipManager::add("#searchFormEditor__fulltext", "<h2>{$vs_label}</h2>{$vs_description}"); // get fields foreach ($va_search_settings as $vs_table => $va_fields) { if (!is_array($va_fields['fields'])) { continue; } if ($vs_table == $vs_primary_table) { $va_element_codes = method_exists($t_instance, 'getApplicableElementCodes') ? $t_instance->getApplicableElementCodes(null, false, false) : array(); $va_field_list = array(); foreach ($va_fields['fields'] as $vs_field => $va_field_indexing_info) { if ($vs_field === '_metadata') { foreach ($va_element_codes as $vs_code) { $va_field_list[$vs_code] = array(); } } else { $va_field_list[$vs_field] = $va_field_indexing_info; } } foreach ($va_field_list as $vs_field => $va_field_indexing_info) { if (in_array('DONT_INCLUDE_IN_SEARCH_FORM', $va_field_indexing_info)) { continue; } if (!($va_field_info = $t_instance->getFieldInfo($vs_field))) { // is it an attribute? if (in_array($vs_field, $va_element_codes)) { $t_element = $this->_getElementInstance($vs_field); if (!$t_element) { continue; } if (in_array($t_element->get('datatype'), array(15, 16))) { continue; } // skip file and media attributes - never searchable if (!$t_element->getSetting('canBeUsedInSearchForm')) { continue; } if (caGetBundleAccessLevel($vs_primary_table, $vs_field) == __CA_BUNDLE_ACCESS_NONE__) { continue; } $vs_bundle = $vs_table . '.' . $vs_field; $vs_display = "<div id='searchFormEditor_{$vs_table}_{$vs_field}'><span class='bundleDisplayEditorPlacementListItemTitle'>" . caUcFirstUTF8Safe($t_instance->getProperty('NAME_SINGULAR')) . "</span> " . ($vs_label = $t_instance->getDisplayLabel($vs_bundle)) . "</div>"; $va_available_bundles[strip_tags($vs_display)][$vs_bundle] = array('bundle' => $vs_bundle, 'label' => $vs_label, 'display' => $vs_display, 'description' => $vs_description = $t_instance->getDisplayDescription($vs_bundle), 'settingsForm' => $t_placement->getHTMLSettingForm(array('id' => $vs_bundle . '_0')), 'settings' => $va_additional_settings); TooltipManager::add("#searchFormEditor_{$vs_table}_{$vs_field}", "<h2>{$vs_label}</h2>{$vs_description}"); } } else { if (isset($va_field_info['DONT_USE_AS_BUNDLE']) && $va_field_info['DONT_USE_AS_BUNDLE']) { continue; } if (in_array($va_field_info['FIELD_TYPE'], array(FT_MEDIA, FT_FILE))) { continue; } $vs_bundle = $vs_table . '.' . $vs_field; $vs_display = "<div id='searchFormEditor_{$vs_table}_{$vs_field}'><span class='bundleDisplayEditorPlacementListItemTitle'>" . caUcFirstUTF8Safe($t_instance->getProperty('NAME_SINGULAR')) . "</span> " . ($vs_label = $t_instance->getDisplayLabel($vs_bundle)) . "</div>"; $va_available_bundles[strip_tags($vs_display)][$vs_bundle] = array('bundle' => $vs_bundle, 'label' => $vs_label, 'display' => $vs_display, 'description' => $vs_description = $t_instance->getDisplayDescription($vs_bundle), 'settingsForm' => $t_placement->getHTMLSettingForm(array('id' => $vs_bundle . '_0')), 'settings' => $va_additional_settings); TooltipManager::add("#searchFormEditor_{$vs_table}_{$vs_field}", "<h2>{$vs_label}</h2>{$vs_description}"); } } } else { // related table if ($this->getAppConfig()->get($vs_table . '_disable')) { continue; } $t_table = $this->_DATAMODEL->getInstanceByTableName($vs_table, true); if (method_exists($t_table, "getSubjectTableName") && ($vs_subject_table = $t_table->getSubjectTableName())) { if ($this->getAppConfig()->get($vs_subject_table . '_disable')) { continue; } } if (caGetBundleAccessLevel($vs_primary_table, $vs_subject_table) == __CA_BUNDLE_ACCESS_NONE__) { continue; } foreach ($va_fields['fields'] as $vs_field => $va_field_indexing_info) { if (in_array('DONT_INCLUDE_IN_SEARCH_FORM', $va_field_indexing_info)) { continue; } if ($va_field_info = $t_table->getFieldInfo($vs_field)) { if (isset($va_field_info['DONT_USE_AS_BUNDLE']) && $va_field_info['DONT_USE_AS_BUNDLE']) { continue; } $vs_bundle = $vs_table . '.' . $vs_field; $vs_related_table = caUcFirstUTF8Safe($t_table->getProperty('NAME_SINGULAR')); if (method_exists($t_table, 'getSubjectTableInstance')) { $t_subject = $t_table->getSubjectTableInstance(); $vs_related_table = caUcFirstUTF8Safe($t_subject->getProperty('NAME_SINGULAR')); } $vs_label = $t_instance->getDisplayLabel($vs_bundle); if (method_exists($t_table, "getSubjectTableName") && $vs_primary_table == $vs_subject_table) { $vs_display = "<div id='searchFormEditor_{$vs_table}_{$vs_field}'><span class='bundleDisplayEditorPlacementListItemTitle'>" . caUcFirstUTF8Safe($t_subject->getProperty('NAME_SINGULAR')) . "</span> {$vs_label}</div>"; } else { $vs_display = "<div id='searchFormEditor_{$vs_table}_{$vs_field}'><span class='bundleDisplayEditorPlacementListItemTitle'>{$vs_related_table}</span> {$vs_label}</div>"; } $va_available_bundles[strip_tags($vs_display)][$vs_bundle] = array('bundle' => $vs_bundle, 'label' => $vs_label, 'display' => $vs_display, 'description' => $vs_description = $t_instance->getDisplayDescription($vs_bundle), 'settingsForm' => $t_placement->getHTMLSettingForm(array('id' => $vs_bundle . '_0')), 'settings' => $va_additional_settings); TooltipManager::add("#searchFormEditor_{$vs_table}_{$vs_field}", "<h2>{$vs_label}</h2>{$vs_description}"); } } } } // // access points // $va_access_points = isset($va_search_settings['_access_points']) && is_array($va_search_settings['_access_points']) ? $va_search_settings['_access_points'] : array(); //unset($va_search_settings['_access_points']); foreach ($va_access_points as $vs_access_point => $va_access_point_info) { if (isset($va_access_point_info['options']) && is_array($va_access_point_info['options'])) { if (in_array('DONT_INCLUDE_IN_SEARCH_FORM', $va_access_point_info['options'])) { continue; } } $vs_display = "<div id='searchFormEditor_{$vs_access_point}'><span class='bundleDisplayEditorPlacementListItemTitle'>" . _t('Access point') . '</span> ' . ($vs_label = isset($va_access_point_info['name']) && $va_access_point_info['name'] ? $va_access_point_info['name'] : $vs_access_point) . "</div>"; $va_available_bundles[strip_tags($vs_display)][$vs_access_point] = array('bundle' => $vs_access_point, 'label' => $vs_label, 'display' => $vs_display, 'description' => $vs_description = isset($va_access_point_info['description']) && $va_access_point_info['description'] ? $va_access_point_info['description'] : '', 'settingsForm' => $t_placement->getHTMLSettingForm(array('id' => $vs_access_point . '_0')), 'settings' => $va_additional_settings); TooltipManager::add("#searchFormEditor_{$vs_access_point}", "<h2>{$vs_label}</h2>{$vs_description}"); } // // created and modified // $t_placement->setSettingDefinitionsForPlacement($va_additional_settings); foreach (array('created', 'modified') as $vs_bundle) { $vs_display = "<div id='searchFormEditor_{$vs_bundle}'><span class='bundleDisplayEditorPlacementListItemTitle'>" . _t('General') . "</span> " . ($vs_label = $t_instance->getDisplayLabel($vs_bundle)) . "</div>"; $va_available_bundles[strip_tags($vs_display)][$vs_bundle] = array('bundle' => $vs_bundle, 'label' => $vs_label, 'display' => $vs_display, 'description' => $vs_description = $t_instance->getDisplayDescription($vs_bundle), 'settingsForm' => $t_placement->getHTMLSettingForm(array('id' => $vs_bundle . '_0')), 'settings' => $va_additional_settings); TooltipManager::add("#searchFormEditor_{$vs_bundle}", "<h2>{$vs_label}</h2>{$vs_description}"); } ksort($va_available_bundles); $va_sorted_bundles = array(); foreach ($va_available_bundles as $vs_k => $va_val) { foreach ($va_val as $vs_real_key => $va_info) { $va_sorted_bundles[$vs_real_key] = $va_info; } } return $va_sorted_bundles; }