. */ /** * Sections panel. * * @package Admin\Section */ use Textpattern\Search\Filter; if (!defined('txpinterface')) { die('txpinterface is undefined.'); } if ($event == 'section') { require_privs('section'); global $all_skins, $all_pages, $all_styles; $all_skins = \Txp::get('Textpattern\Skin\Skin')->getInstalled(); $all_pages = \Txp::get('Textpattern\Skin\Page')->getInstalled(); $all_styles = \Txp::get('Textpattern\Skin\Css')->getInstalled(); $available_steps = array( 'section_change_pageby' => true, 'sec_section_list' => false, 'section_delete' => true, 'section_save' => true, 'section_edit' => false, 'section_multi_edit' => true, 'section_set_default' => true, 'section_set_theme' => true, 'section_select_skin' => false, 'section_toggle_option' => true, ); if ($step && is_callable($step) && bouncer($step, $available_steps)) { $step(); } else { sec_section_list(); } } /** * The main panel listing all sections. * * So-named to avoid clashing with the <txp:section_list /> tag. * * @param string|array $message The activity message */ function sec_section_list($message = '', $update = false) { global $event, $step, $all_pages, $all_styles, $txp_sections; if ($update) { $txp_sections = safe_column(array('name'), 'txp_section', '1 ORDER BY title, name'); } pagetop(gTxt('tab_sections'), $message); extract(gpsa(array( 'page', 'sort', 'dir', 'crit', 'search_method', ))); $columns = array('name', 'title', 'skin', 'page', 'css', 'permlink_mode', 'on_frontpage', 'in_rss', 'searchable', 'article_count'); $columns = array_merge( array_combine($columns, $columns), array('on_frontpage' => 'on_front_page', 'in_rss' => 'syndicate', 'searchable' => 'include_in_search', 'article_count' => 'articles') ); if ($sort === '') { $sort = get_pref('section_sort_column', 'name'); } else { if (!isset($columns[$sort])) { $sort = 'name'; } set_pref('section_sort_column', $sort, 'section', PREF_HIDDEN, '', 0, PREF_PRIVATE); } if ($dir === '') { $dir = get_pref('section_sort_dir', 'desc'); } else { $dir = ($dir == 'asc') ? "asc" : "desc"; set_pref('section_sort_dir', $dir, 'section', PREF_HIDDEN, '', 0, PREF_PRIVATE); } if (isset($columns[$sort])) { $sort_sql = "$sort $dir"; } else { $sort_sql = "name $dir"; } $switch_dir = ($dir == 'desc') ? 'asc' : 'desc'; $search = new Filter($event, array( 'name' => array( 'column' => 'txp_section.name', 'label' => gTxt('name'), ), 'title' => array( 'column' => 'txp_section.title', 'label' => gTxt('title'), ), 'skin' => array( 'column' => array('txp_section.skin', 'txp_section.dev_skin'), 'label' => gTxt('skin'), ), 'page' => array( 'column' => array('txp_section.page', 'txp_section.dev_page'), 'label' => gTxt('page'), ), 'css' => array( 'column' => array('txp_section.css', 'txp_section.dev_css'), 'label' => gTxt('css'), ), 'description' => array( 'column' => 'txp_section.description', 'label' => gTxt('description'), ), 'permlink_mode' => array( 'column' => 'txp_section.permlink_mode', 'label' => gTxt('permlink_mode'), ), 'on_frontpage' => array( 'column' => 'txp_section.on_frontpage', 'label' => gTxt('on_front_page'), 'type' => 'boolean', ), 'in_rss' => array( 'column' => 'txp_section.in_rss', 'label' => gTxt('syndicate'), 'type' => 'boolean', ), 'searchable' => array( 'column' => 'txp_section.searchable', 'label' => gTxt('include_in_search'), 'type' => 'boolean', ), ) ); $alias_yes = '1, Yes'; $alias_no = '0, No'; $search->setAliases('on_frontpage', array($alias_no, $alias_yes)); $search->setAliases('in_rss', array($alias_no, $alias_yes)); $search->setAliases('searchable', array($alias_no, $alias_yes)); list($criteria, $crit, $search_method) = $search->getFilter(); $search_render_options = array('placeholder' => 'search_sections'); $total = safe_count('txp_section', $criteria); $searchBlock = n.tag( $search->renderForm('sec_section', $search_render_options), 'div', array( 'class' => 'txp-layout-4col-3span', 'id' => $event.'_control', ) ); getDefaultSection(); $createBlock = array(); if (has_privs('section.edit')) { $createBlock[] = n.tag( sLink('section', 'section_edit', gTxt('create_section'), 'txp-button'). n.tag_start('form', array( 'class' => 'async', 'id' => 'default_section_form', 'name' => 'default_section_form', 'method' => 'post', 'action' => 'index.php', )). tag(gTxt('default_write_section'), 'label', array('for' => 'default_section')). popHelp('section_default'). section_select_list(). eInput('section'). sInput('section_set_default'). n.tag_end('form'), 'div', array('class' => 'txp-control-panel') ); } $paginator = new \Textpattern\Admin\Paginator(); $limit = $step == 'section_select_skin' ? PHP_INT_MAX : $paginator->getLimit(); list($page, $offset, $numPages) = pager($total, $limit, $page); $createBlock = implode(n, $createBlock); $contentBlock = ''; if ($total < 1) { if ($crit !== '') { $contentBlock .= graf( span(null, array('class' => 'ui-icon ui-icon-info')).' '. gTxt('no_results_found'), array('class' => 'alert-block information') ); } } else { $rs = safe_rows_start( "*, (SELECT COUNT(*) FROM ".safe_pfx_j('textpattern')." WHERE textpattern.Section = txp_section.name) AS article_count", 'txp_section', "$criteria ORDER BY $sort_sql LIMIT $offset, $limit" ); if ($rs) { $dev_set = false; $dev_preview = get_pref('enable_dev_preview') && has_privs('skin.edit'); $contentBlock .= n.tag_start('form', array( 'class' => 'multi_edit_form', 'id' => 'section_form', 'name' => 'longform', 'method' => 'post', 'action' => 'index.php', )). n.tag_start('div', array( 'class' => 'txp-listtables', 'tabindex' => 0, 'aria-label' => gTxt('list'), )). n.tag_start('table', array('class' => 'txp-list')). n.tag_start('thead'); $thead = hCell( fInput('checkbox', 'select_all', 0, '', '', '', '', '', 'select_all'), '', ' class="txp-list-col-multi-edit" scope="col" title="'.gTxt('toggle_all_selected').'"' ); foreach ($columns as $column => $label) { $thead .= column_head( $label, $column, 'section', true, $switch_dir, $crit, $search_method, (($column == $sort) ? "$dir " : '').'txp-list-col-'.$column ); } $contentBlock .= tr($thead). n.tag_end('thead'). n.tag_start('tbody'); while ($a = nextRow($rs)) { extract($a, EXTR_PREFIX_ALL, 'sec'); $edit_url = array( 'event' => 'section', 'step' => 'section_edit', 'name' => $sec_name, 'sort' => $sort, 'dir' => $dir, 'page' => $page, 'search_method' => $search_method, 'crit' => $crit, ); if ($sec_name == 'default') { $articles = $sec_searchable = $sec_in_rss = $sec_on_frontpage = '-'; } else { $sec_on_frontpage = asyncHref(yes_no($sec_on_frontpage), array( 'step' => 'section_toggle_option', 'thing' => $sec_name, 'property' => 'on_frontpage', )); $sec_in_rss = asyncHref(yes_no($sec_in_rss), array( 'step' => 'section_toggle_option', 'thing' => $sec_name, 'property' => 'in_rss', )); $sec_searchable = asyncHref(yes_no($sec_searchable), array( 'step' => 'section_toggle_option', 'thing' => $sec_name, 'property' => 'searchable', )); if ($sec_article_count > 0) { $articles = href($sec_article_count, array( 'event' => 'list', 'search_method' => 'section', 'crit' => '"'.$sec_name.'"', ), array( 'title' => gTxt('article_count', array('{num}' => $sec_article_count)), )); } else { $articles = 0; } } $has_dev_skin = !empty($sec_dev_skin) && $sec_dev_skin !== $sec_skin; !empty($sec_dev_skin) or $sec_dev_skin = $sec_skin; !empty($sec_dev_page) or $sec_dev_page = $sec_page; !empty($sec_dev_css) or $sec_dev_css = $sec_css; $in_dev = false; foreach (array('page', 'css') as $item) { $all_items = $item === 'page' ? $all_pages : $all_styles; $sec_item = ${"sec_$item"}; $sec_dev_item = ${"sec_dev_$item"}; $missing = $sec_dev_item && isset($all_items[$sec_dev_skin]) && !in_array($sec_dev_item, $all_items[$sec_dev_skin]); $replaced = $dev_preview && ($has_dev_skin && $sec_dev_item || $sec_item != $sec_dev_item || $sec_dev_item && $missing) ? 'disabled' : false; $dev_set = $dev_set || $replaced; $in_dev = $in_dev || $replaced; ${"sec_$item"} = ($sec_item ? tag(href(txpspecialchars($sec_item), array( 'event' => $item, 'name' => $sec_item, 'skin' => $sec_skin, ), array('title' => gTxt('edit')) ), $replaced ? 'span' : null, $replaced ? array('class' => 'secondary-text') : '') : tag(gTxt('none'), 'span', array('class' => 'disabled'))). ($replaced ? n.'
'.n. href(txpspecialchars($sec_dev_item), array( 'event' => $item, 'name' => $sec_dev_item, 'skin' => $sec_dev_skin, ), array('title' => gTxt('edit'))). ($missing ? sp.tag(gTxt('status_missing'), 'small', array('class' => 'alert-block alert-pill error')) : '') : ''); } $replaced = $dev_preview && ($sec_skin != $sec_dev_skin) ? 'disabled' : false; $dev_set = $dev_set || $replaced; $in_dev = $in_dev || $replaced; $contentBlock .= tr( td( fInput('checkbox', 'selected[]', $sec_name), '', 'txp-list-col-multi-edit' ). hCell( href( txpspecialchars($sec_name), $edit_url, array('title' => gTxt('edit')) ). span( sp.span('|', array('role' => 'separator')). sp.href(gTxt('view'), pagelinkurl(array('s' => $sec_name), null, $sec_permlink_mode)), array('class' => 'txp-option-link') ). ($in_dev ? n.'
'.n.tag(gTxt('dev_theme'), 'small', array('class' => 'alert-block alert-pill warning')) : ''), '', array( 'class' => 'txp-list-col-name', 'scope' => 'row', ) ). td( txpspecialchars($sec_title), '', 'txp-list-col-title' ). td( tag($sec_skin, $replaced ? 'span' : null, $replaced ? array('class' => 'secondary-text') : '').($replaced ? n.'
'.n.$sec_dev_skin : ''), '', 'txp-list-col-skin' ). td( $sec_page, '', 'txp-list-col-page' ). td( $sec_css, '', 'txp-list-col-style' ). td( $sec_permlink_mode ? gTxt($sec_permlink_mode) : ''.gTxt(get_pref('permlink_mode')).'', '', 'txp-list-col-permlink_mode' ). td( $sec_on_frontpage, '', 'txp-list-col-on_frontpage' ). td( $sec_in_rss, '', 'txp-list-col-in_rss' ). td( $sec_searchable, '', 'txp-list-col-searchable' ). td( $articles, '', 'txp-list-col-article_count' ), array('id' => 'txp_section_'.$sec_name) ); } $disabled = $dev_set ? array() : array('switchdevlive'); $contentBlock .= n.tag_end('tbody'). n.tag_end('table'). n.tag_end('div'). // End of .txp-listtables. section_multiedit_form($page, $sort, $dir, $crit, $search_method, $disabled). tInput(). n.tag_end('form'); } } $pageBlock = $paginator->render(). nav_form('section', $page, $numPages, $sort, $dir, $crit, $search_method, $total, $limit); $table = new \Textpattern\Admin\Table($event); echo $table->render(compact('total', 'crit') + array('heading' => 'tab_sections'), $searchBlock, $createBlock, $contentBlock, $pageBlock); } /** * Renders and outputs the section editor panel. */ function section_edit() { global $event, $step, $all_skins, $all_pages, $all_styles; require_privs('section.edit'); extract(gpsa(array( 'page', 'sort', 'dir', 'crit', 'search_method', 'name', ))); $is_edit = ($name && $step == 'section_edit'); $caption = gTxt('create_section'); $is_default_section = false; if ($is_edit) { $rs = safe_row( "*", 'txp_section', "name = '".doSlash($name)."'" ); if ($name == 'default') { $caption = gTxt('edit_default_section'); $is_default_section = true; } else { $caption = gTxt('edit_section'); } } else { // Pulls defaults for the new section from the 'default'. $rs = safe_row( "skin, page, css, on_frontpage, in_rss, searchable", 'txp_section', "name = 'default'" ); if ($rs) { $rs['name'] = $rs['title'] = $rs['description'] = $rs['permlink_mode'] = ''; } } if (!$rs) { sec_section_list(array(gTxt('unknown_section'), E_ERROR)); return; } extract($rs, EXTR_PREFIX_ALL, 'sec'); pagetop(gTxt('tab_sections')); $out = array(); $out[] = hed($caption, 2); if ($is_default_section) { $out[] = hInput('name', 'default'); } else { $out[] = inputLabel( 'section_name', fInput('text', 'name', $sec_name, '', '', '', INPUT_REGULAR, '', 'section_name', false, true), 'section_name', '', array('class' => 'txp-form-field edit-section-name') ). inputLabel( 'section_title', fInput('text', 'title', $sec_title, '', '', '', INPUT_REGULAR, '', 'section_title'), 'section_longtitle', '', array('class' => 'txp-form-field edit-section-longtitle') ); } $pageSelect = selectInput(array('name' => 'section_page', 'required' => false), array(), '', '', '', 'section_page'); $styleSelect = selectInput(array('name' => 'css', 'required' => false), array(), '', '', '', 'section_css'); $json_page = json_encode($all_pages, TEXTPATTERN_JSON); $json_style = json_encode($all_styles, TEXTPATTERN_JSON); $out[] = inputLabel( 'section_skin', selectInput('skin', $all_skins, $sec_skin, '', '', 'section_skin'), 'uses_skin', 'section_uses_skin', array('class' => 'txp-form-field edit-section-uses-skin') ). inputLabel( 'section_page', $pageSelect, 'uses_page', 'section_uses_page', array('class' => 'txp-form-field edit-section-uses-page') ). inputLabel( 'section_css', $styleSelect, 'uses_style', 'section_uses_css', array('class' => 'txp-form-field edit-section-uses-css') ). inputLabel( 'permlink_mode', permlinkmodes('permlink_mode', $is_default_section ? get_pref('permlink_mode') : $sec_permlink_mode, $is_default_section ? false : array('' => gTxt('default'))), 'permlink_mode', 'permlink_mode', array('class' => 'txp-form-field edit-section-permlink-mode') ). script_js(<< 'txp-form-field edit-section-on-frontpage') ). inputLabel( 'syndicate', yesnoradio('in_rss', $sec_in_rss, '', $sec_name), '', 'section_syndicate', array('class' => 'txp-form-field edit-section-syndicate') ). inputLabel( 'include_in_search', yesnoradio('searchable', $sec_searchable, '', $sec_name), '', 'section_searchable', array('class' => 'txp-form-field edit-section-searchable') ); } $out[] = inputLabel( 'section_description', '', 'description', 'section_description', array('class' => 'txp-form-field txp-form-field-textarea edit-section-description') ); $out[] = pluggable_ui('section_ui', 'extend_detail_form', '', $rs). graf( sLink('section', '', gTxt('cancel'), 'txp-button'). fInput('submit', '', gTxt('save'), 'publish'), array('class' => 'txp-edit-actions') ). eInput('section'). sInput('section_save'). hInput('old_name', $sec_name). hInput('search_method', $search_method). hInput('crit', $crit). hInput('page', $page). hInput('sort', $sort). hInput('dir', $dir); echo form(join('', $out), '', '', 'post', 'txp-edit', '', 'section_details'); } /** * Saves a section. */ function section_save() { $in = array_map('assert_string', psa(array( 'name', 'title', 'skin', 'description', 'old_name', 'section_page', 'css', 'permlink_mode', ))); if (empty($in['title'])) { $in['title'] = $in['name']; } // Prevent non-URL characters on section names. $mbstrings = extension_loaded('mbstrings'); $in['name'] = $mbstrings ? mb_strtolower(sanitizeForUrl($in['name']), 'UTF-8') : strtolower(sanitizeForUrl($in['name'])); extract($in); $in = doSlash($in); extract($in, EXTR_PREFIX_ALL, 'safe'); $lower_name = $mbstrings ? mb_strtolower($old_name, 'UTF-8') : strtolower($old_name); if ($name != $lower_name) { if (safe_field("name", 'txp_section', "name = '$safe_name'")) { // Invalid input. Halt all further processing (e.g. plugin event // handlers). $message = array(gTxt('section_name_already_exists', array('{name}' => $name)), E_ERROR); sec_section_list($message); return; } } $ok = false; if ($name == 'default') { $on_frontpage = $in_rss = $searchable = 0; $ok = safe_update('txp_section', "skin = '$safe_skin', page = '$safe_section_page', css = '$safe_css', description = '$safe_description'", "name = 'default'"); set_pref('permlink_mode', $permlink_mode); } elseif ($name) { extract(array_map('assert_int', psa(array('on_frontpage', 'in_rss', 'searchable')))); if ($safe_old_name) { $ok = safe_update('txp_section', " name = '$safe_name', title = '$safe_title', skin = '$safe_skin', page = '$safe_section_page', css = '$safe_css', description = '$safe_description', permlink_mode = '$safe_permlink_mode', on_frontpage = '$on_frontpage', in_rss = '$in_rss', searchable = '$searchable' ", "name = '$safe_old_name'"); // Manually maintain referential integrity. if ($ok) { $ok = safe_update('textpattern', "Section = '$safe_name'", "Section = '$safe_old_name'"); } } else { $ok = safe_insert('txp_section', " name = '$safe_name', title = '$safe_title', skin = '$safe_skin', page = '$safe_section_page', css = '$safe_css', description = '$safe_description', permlink_mode = '$safe_permlink_mode', on_frontpage = '$on_frontpage', in_rss = '$in_rss', searchable = '$searchable'"); } } if ($ok) { if ($name != $lower_name && $lower_name == get_pref('default_section')) { set_pref('default_section', $name, 'section', PREF_HIDDEN); } update_lastmod('section_saved', compact('name', 'title', 'section_page', 'css', 'description', 'on_frontpage', 'in_rss', 'searchable', 'permlink_mode')); Txp::get('Textpattern\Skin\Skin')->setEditing($safe_skin); } if ($ok) { sec_section_list(gTxt(($safe_old_name ? 'section_updated' : 'section_created'), array('{name}' => $name)), true); } else { sec_section_list(array(gTxt('section_save_failed'), E_ERROR)); } } /** * Changes and saves the pageby value. */ function section_change_pageby() { Txp::get('\Textpattern\Admin\Paginator')->change(); sec_section_list(); } /** * Toggles section yes/no parameters. * * This function requires three HTTP POST parameters: 'column', 'value' and * 'name'. The 'value' is the new value, localised 'Yes' or 'No', * 'name' is the section and the 'column' is the altered setting, * either 'on_frontpage', 'in_rss' or 'searchable'. * * Outputs a text/plain response comprising the new displayable * value for the toggled parameter. */ function section_toggle_option() { extract(psa(array( 'property', 'value', 'thing', ))); $value = (int) ($value === gTxt('no')); if (in_array($property, array('on_frontpage', 'in_rss', 'searchable'))) { if (safe_update('txp_section', "$property = $value", "name = '".doSlash($thing)."'")) { echo yes_no($value); return; } } trigger_error(gTxt('section_save_failed'), E_USER_ERROR); } /** * Sets a section as the default. */ function section_set_default() { extract(psa(array('default_section'))); $exists = safe_row("name", 'txp_section', "name = '".doSlash($default_section)."'"); if ($exists && set_pref('default_section', $default_section, 'section', PREF_HIDDEN)) { send_script_response(announce(gTxt('default_section_updated'))); return; } send_script_response(announce(gTxt('section_save_failed'), E_ERROR)); } /** * Renders a 'default_section' <select> input listing all sections. * * Used for changing the default section. * * @return string HTML */ function section_select_list() { global $txp_sections; $val = get_pref('default_section'); $vals = array(); foreach ($txp_sections as $name => $row) { $name == 'default' or $vals[$name] = $row['title']; } return selectInput(array( 'name' => 'default_section', 'class' => 'txp-async-update' ), $vals, $val, false, true, 'default_section'); } /** * Processes delete actions sent using the multi-edit form. */ function section_delete() { global $txp_sections; $selectedList = ps('selected'); $selected = join(',', quote_list($selectedList)); $message = ''; $sections = safe_column( "name", 'txp_section', "name != 'default' AND name IN ($selected) AND name NOT IN (SELECT Section FROM ".safe_pfx('textpattern').")" ); $sectionsNotDeleted = array_diff($selectedList, $sections); if ($sections && safe_delete('txp_section', "name IN (".join(',', quote_list($sections)).")")) { foreach ($sections as $section) { unset($txp_sections[$section]); } callback_event('sections_deleted', '', 0, $sections); $message = gTxt('section_deleted', array('{name}' => join(', ', $sections))); } if ($sectionsNotDeleted) { $severity = ($message) ? E_WARNING : E_ERROR; $message = array(($message ? $message.n : '').gTxt('section_delete_failure', array('{name}' => join(', ', $sectionsNotDeleted))), $severity); } sec_section_list($message); } /** * Processes theme preview actions. */ function section_set_theme($type = 'dev_skin') { global $all_skins, $all_pages, $all_styles; $skin = gps('skin'); $message = ''; if (isset($all_skins[$skin]) && has_privs('skin.edit')) { safe_update( 'txp_section', "$type = '".doSlash($skin)."'", $type == 'dev_skin' ? '1' : 'page IN ('.join(',', quote_list($all_pages[$skin])).') AND css IN ('.join(',', quote_list($all_styles[$skin])).')' ); $message = gTxt($type == 'dev_skin' ? 'dev_theme' : 'live_theme').': '.txpspecialchars($all_skins[$skin]); if ($type == 'dev_skin') { Txp::get('Textpattern\Skin\Skin')->setName($skin)->setEditing(); } } script_js(<< 'multi-option multi-step'), '' ); $pageSelect = inputLabel( 'multiedit_page', selectInput('section_page', array(), '', '', '', 'multiedit_page'), 'page', '', array('class' => 'multi-option multi-step'), '' ); $styleSelect = inputLabel( 'multiedit_css', selectInput('css', array(), '', '', '', 'multiedit_css'), 'css', '', array('class' => 'multi-option multi-step'), '' ); $devThemeSelect = inputLabel( 'multiedit_skin', selectInput('dev_skin', $all_skins, '', false, '', 'multiedit_dev_skin'), 'skin', '', array('class' => 'multi-option multi-step'), '' ); $devPageSelect = inputLabel( 'multiedit_page', selectInput('dev_page', array(), '', '', '', 'multiedit_dev_page'), 'page', '', array('class' => 'multi-option multi-step'), '' ); $devStyleSelect = inputLabel( 'multiedit_css', selectInput('dev_css', array(), '', '', '', 'multiedit_dev_css'), 'css', '', array('class' => 'multi-option multi-step'), '' ); $dev_preview = get_pref('enable_dev_preview') && has_privs('skin.edit'); $methods = array( 'changepagestyle' => array( 'label' => gTxt('change_page_style'), 'html' => (!$dev_preview ? hInput('live_theme', 1) : inputLabel('dev_theme', checkbox2('dev_theme', 1, 0, 'dev_theme'), 'dev_theme', '', array('class' => 'multi-option multi-step'), '' ) . inputLabel('live_theme', checkbox2('live_theme', 0, 0, 'live_theme'), 'live_theme', '', array('class' => 'multi-option multi-step'), '' ) ) . $themeSelect . $pageSelect . $styleSelect ), 'switchdevlive' => array( 'label' => gTxt('switch_dev_live'), 'html' => radioSet(array( 0 => gTxt('live_to_dev'), 1 => gTxt('dev_to_live'), ), 'switch_dev_live', 0), ), 'permlinkmode' => array( 'label' => gTxt('permlink_mode'), 'html' => permlinkmodes('permlink_mode', '', array('' => gTxt('default'))), ), 'changeonfrontpage' => array( 'label' => gTxt('on_front_page'), 'html' => yesnoRadio('on_frontpage', 1), ), 'changesyndicate' => array( 'label' => gTxt('syndicate'), 'html' => yesnoRadio('in_rss', 1), ), 'changesearchable' => array( 'label' => gTxt('include_in_search'), 'html' => yesnoRadio('searchable', 1), ), 'delete' => gTxt('delete'), ); foreach ($disabled as $method) { unset($methods[$method]); } $script = << ps('skin'), 'page' => ps('section_page'), 'css' => ps('css'), ); } if (ps('dev_theme')) { $nameVal += array( 'dev_skin' => ps('skin'), 'dev_page' => ps('section_page'), 'dev_css' => ps('css'), ); } break; case 'switchdevlive': $nameVal['switch_dev_live'] = (int) ps('switch_dev_live'); break; case 'permlinkmode': $nameVal['permlink_mode'] = (string) ps('permlink_mode'); break; case 'changeonfrontpage': $nameVal['on_frontpage'] = (int) ps('on_frontpage'); break; case 'changesyndicate': $nameVal['in_rss'] = (int) ps('in_rss'); break; case 'changesearchable': $nameVal['searchable'] = (int) ps('searchable'); break; } $setskin = "IF(dev_skin > '', dev_skin, skin)"; $setpage = "IF(dev_page > '', dev_page, page)"; $setcss = "IF(dev_css > '', dev_css, css)"; $filter = array("name IN (".join(',', quote_list($selected)).")"); $message = ''; if ($edit_method === 'changepagestyle' && !empty($nameVal['skin'])) { $skin = $nameVal['skin']; if (empty($nameVal['page'])) { $filter[] = empty($all_pages[$skin]) ? '0' : "page IN (".join(',', quote_list($all_pages[$skin])).")"; } if (empty($nameVal['css'])) { $filter[] = empty($all_styles[$skin]) ? '0' : "css IN (".join(',', quote_list($all_styles[$skin])).")"; } } elseif ($edit_method === 'switchdevlive' && empty($nameVal['switch_dev_live'])) { $skinset = array(); foreach ($all_skins as $skin => $title) { $skinset[] = "$setskin = '".doSlash($skin)."' AND ($setpage = '' OR ". (empty($all_pages[$skin]) ? '0' : "$setpage IN (".join(',', quote_list($all_pages[$skin]))."))" )." AND ($setcss = '' OR ". (empty($all_styles[$skin]) ? '0' : "$setcss IN (".join(',', quote_list($all_styles[$skin]))."))" ); } $filter[] = '('.implode(' OR ', $skinset).')'; } $sections = safe_column( "name", 'txp_section', implode(' AND ', $filter) ); if ($nameVal && $sections) { if ($edit_method == 'switchdevlive') { $set = ($nameVal['switch_dev_live'] ? '' : "skin = $setskin, page = $setpage, css = $setcss, " )."dev_skin = '', dev_page = '', dev_css = ''"; } elseif ($edit_method == 'permlinkmode') { $set = "permlink_mode = IF(name='default', '', '".doSlash($nameVal['permlink_mode'])."')"; if ($nameVal['permlink_mode'] && in_array('default', $sections)) { set_pref('permlink_mode', $nameVal['permlink_mode']); } } else { $in = array(); foreach ($nameVal as $key => $val) { if ((string)$val != '*') { $in[] = "{$key} = '".doSlash($val)."'"; } } $set = implode(',', $in); } if ($set && safe_update( 'txp_section', $set, "name IN (".join(',', quote_list($sections)).")" ) ) { $message = gTxt('section_updated', array('{name}' => join(', ', $sections))); if ($edit_method === 'changepagestyle') { Txp::get('Textpattern\Skin\Skin')->setEditing(doSlash($nameVal['skin'])); } } } else { $message = array(gTxt('section_save_failed'), E_ERROR); } sec_section_list($message, $nameVal && $sections); }