[ 'name' => tra('Category jail'), 'description' => tra('Limits the visibility of objects to those in these category IDs. Used mainly for creating workspaces from perspectives.'), 'separator' => ',', 'type' => 'text', 'filter' => 'int', 'default' => [''], //empty string needed to keep preference from setting unexpectedly 'detail' => tra('This should only be set for perspectives, and not globally.'), 'profile_reference' => 'category', ], 'category_jail_root' => [ 'name' => tra('Category jail root'), 'description' => tra('Always display categories outside of the jail root, which would be for normal categorization.'), 'separator' => ',', 'type' => 'text', 'filter' => 'int', 'default' => [0], //empty string needed to keep preference from setting unexpectedly 'profile_reference' => 'category', ], 'category_defaults' => [ 'name' => tra('Category defaults'), 'description' => tra('Require certain categories to be present. If none of the categories in a given set is provided, assign a category by default.') . ' ' . tra('Use *7 to specify all the categories in the subtree of 7 + category 7.') . ' ' . tra('Can do only this for objectname matching the regex (Example: /^RND_/ = name beginning by RND_)(Optional)') . ' ' . tra('Can do for wiki only (optional).') . ' ' . tra('Rename will only reassign the categories for wiki pages.'), 'type' => 'textarea', 'filter' => 'striptags', 'hint' => tra('One per line, for example: 1,4,6,*7/4:/^RND_/:wiki page'), 'size' => 5, 'serialize' => 'prefs_category_serialize_defaults', 'unserialize' => 'prefs_category_unserialize_defaults', 'profile_reference' => 'category', 'default' => false, 'tags' => [ 'experimental', // Assignment fails quietly, cryptic description. Chealer 2017-03-23 'advanced' ] ], 'category_i18n_sync' => [ 'name' => tra('Synchronize multilingual categories'), 'description' => tra('Make sure that the categories of the translations are synchronized when modified on any version.'), 'type' => 'list', 'dependencies' => [ 'feature_multilingual' ], 'options' => [ 'n' => tra('None'), 'whitelist' => tra('Only those specified'), 'blacklist' => tra('All but those specified'), ], 'default' => 'n', ], 'category_i18n_synced' => [ 'name' => tra('Synchronized categories'), 'description' => tra('List of categories affected by the multilingual synchronization. Depending on the parent feature, this list will be used as a white list (the only categories allowed) or as a black list (all categories allowed except those specified).'), 'type' => 'text', 'dependencies' => ['category_i18n_sync'], 'filter' => 'digits', 'separator' => ',', 'default' => [''], //empty string needed to keep preference from setting unexpectedly ], 'category_sort_ascii' => [ 'name' => tra('Sort categories case insensitively'), 'description' => tra('Ignore case and accents when listing categories. Disable to use the "locale" sort settings.'), 'type' => 'flag', 'default' => 'n', ], 'category_autogeocode_within' => [ 'name' => tra('Automatically geocode items with this category'), 'description' => tra('Automatically geocode items based on category name when categorized in the sub-categories of this category ID'), 'type' => 'text', 'filter' => 'digits', 'size' => 3, 'default' => '', ], 'category_autogeocode_replace' => [ 'name' => tra('Replace any existing geocode'), 'description' => tra('When automatically geocoding items based on category name, replace existing geocode, if any'), 'type' => 'flag', 'default' => 'n', ], 'category_autogeocode_fudge' => [ 'name' => tra('Use approximate geocode location'), 'description' => tra('When automatically geocoding items based on category name, use randomly approximated location instead of precise location'), 'type' => 'flag', 'default' => 'n', ], 'category_morelikethis_algorithm' => [ 'name' => tra('"More Like This" algorithm for categories'), 'type' => 'list', 'options' => [ '' => '', 'basic' => tra('Basic'), 'weighted' => tra('Weighted'), ], 'default' => '', ], 'category_morelikethis_mincommon' => [ 'name' => tra('Minimum number of categories in common'), 'type' => 'list', 'units' => tra('categories'), 'options' => [ '1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9', '10' => '10', ], 'default' => 2, ], 'category_morelikethis_mincommon_orless' => [ 'name' => tra('List objects with most categories in common'), 'description' => tra('No minimum is applied.'), 'type' => 'flag', 'default' => 'y', ], 'category_morelikethis_mincommon_max' => [ 'name' => tra('Maximum number of "more like this" objects'), 'description' => tra('The default maximum records setting for the site is used of this is set to 0.'), 'type' => 'text', 'size' => 3, 'filter' => 'int', 'units' => tra('objects'), 'default' => 0, ], 'category_custom_facets' => [ 'name' => tr('Generate custom facets from categories'), 'description' => tr('Comma-separated list of category IDs.'), 'type' => 'text', 'size' => 15, 'filter' => 'int', 'separator' => ',', 'default' => '', 'profile_reference' => 'category', ], 'category_browse_count_objects' => [ 'name' => tra('Show category object count'), 'description' => tra('Show object count when browsing categories, complying with search and type filters'), 'warning' => tra('Can slow the loading of the categories page on large sites.'), 'type' => 'flag', 'default' => 'y', ], ]; } function prefs_category_serialize_defaults($data) { if (! is_array($data)) { $data = unserialize($data); } $out = ''; if (is_array($data)) { foreach ($data as $row) { $out .= implode(',', $row['categories']) . '/' . $row['default']; if (! empty($row['filter'])) { $out .= ':' . $row['filter']; } if (! empty($row['type'])) { if (empty($row['filter'])) { $out .= ':'; } $out .= ':' . $row['type']; } $out .= "\n"; } } return trim($out); } function prefs_category_unserialize_defaults($string) { $data = []; foreach (explode("\n", $string) as $row) { if (preg_match('/^\s*(\*?\d+\s*(,\s*\*?\d+\s*)*)\/\s*(\d+)\s*(:(.*)(:(wiki page))?)?$/U', $row, $parts)) { $categories = explode(',', $parts[1]); $categories = array_map('trim', $categories); $categories = array_filter($categories); $default = $parts[3]; $filter = empty($parts[5]) ? '' : $parts[5]; $type = empty($parts[7]) ? '' : 'wiki page'; $data[] = [ 'categories' => $categories, 'default' => $default, 'filter' => $filter, 'type' => $type, ]; } } if (count($data)) { return $data; } else { return false; } }