context = gpsa(array('page', 'sort', 'dir', 'crit', 'search_method')); // @todo: sensible standard list view if(empty($this->context['sort'])) $this->context['sort'] = 'name'; if($this->context['dir'] != 'desc') $this->context['dir'] = 'asc'; } // ------------------------------------------------------------- function list_view() { $default = safe_row('page, css', 'txp_section', "name = 'default'"); $pages = safe_column('name', 'txp_page', "1 = 1"); $styles = safe_column('name', 'txp_css', "1 = 1"); echo n.n.startTable('list'). n.n.tr( tda( n.n.hed(gTxt('section_head').sp.popHelp('section_category'), 1). /* * insert new section */ n.n.form( fInput('text', 'name', '', 'edit', '', '', 10). fInput('submit', '', gTxt('create'), 'smallerbox'). eInput('section'). sInput('insert') ) , ' colspan="3"') ). endTable(); /* * edit 'default' section n.n.tr( td(gTxt('default')). td( form( ''. tr( fLabelCell(gTxt('uses_page').':'). td( selectInput('page', $pages, $default['page']).sp.popHelp('section_uses_page') , '', 'noline') ). tr( fLabelCell(gTxt('uses_style').':') . td( selectInput('css', $styles, $default['css']).sp.popHelp('section_uses_css') , '', 'noline') ). tr( tda( fInput('submit', '', gTxt('save_button'), 'smallerbox'). eInput('section'). sInput('save'). hInput('name','default') , ' colspan="2" class="noline"') ). endTable() ) ). td() ); */ /* * edit any other section */ # $rs = safe_rows_start('*', 'txp_section', "name != 'default' order by name"); $rs = safe_rows('*', 'txp_section', "1=1 order by name"); if($rs) { $v = new SectionListView($rs, $this); echo $v->render(); } return; if ($rs) { while ($a = nextRow($rs)) { extract($a); echo n.n.tr( n.td($name). n.td( form( '
'. n.n.tr( fLabelCell(gTxt('section_name').':'). fInputCell('name', $name, 1, 20) ). n.n.tr( fLabelCell(gTxt('section_longtitle').':'). fInputCell('title', $title, 1, 20) ). n.n.tr( fLabelCell(gTxt('uses_page').':'). td( selectInput('page', $pages, $page).sp.popHelp('section_uses_page') , '', 'noline') ). n.n.tr( fLabelCell(gTxt('uses_style').':'). td( selectInput('css', $styles, $css).sp.popHelp('section_uses_css') , '', 'noline') ). n.n.tr( fLabelCell(gTxt('parent_section').':'). td( $this->adopters_dropdown($id, $parent).sp.popHelp('section_parent_section') , '', 'noline') ). n.n.tr( fLabelCell(gTxt('selected_by_default').'?'). td( yesnoradio('is_default', $is_default, '', $name).sp.popHelp('section_is_default') , '', 'noline') ). n.n.tr( fLabelCell(gTxt('on_front_page').'?'). td( yesnoradio('on_frontpage', $on_frontpage, '', $name).sp.popHelp('section_on_frontpage') , '', 'noline') ). n.n.tr( fLabelCell(gTxt('syndicate').'?') . td( yesnoradio('in_rss', $in_rss, '', $name).sp.popHelp('section_syndicate') , '', 'noline') ). n.n.tr( fLabelCell(gTxt('include_in_search').'?'). td( yesnoradio('searchable', $searchable, '', $name).sp.popHelp('section_searchable') , '', 'noline') ). n.n.tr( tda( fInput('submit', '', gTxt('save_button'), 'smallerbox'). eInput('section'). sInput('save'). hInput('old_name', $name) , ' colspan="2" class="noline"') ). endTable() ) ). td( dLink('section', 'delete', 'name', $name, '', 'type', 'section') ) ); } } echo n.n.endTable(); } //------------------------------------------------------------- function insert_post() { global $txpcfg; $name = doSlash(ps('name')); // prevent non url chars on section names include_once txpath.'/lib/classTextile.php'; $textile = new Textile(); $title = $textile->TextileThis($name,1); $name = dumbDown($textile->TextileThis(trim(doSlash($name)),1)); $name = preg_replace("/[^[:alnum:]\-_]/", "", str_replace(" ","-",$name)); // prevent duplicate section names // @todo: lose this for nested sections when parents differ $chk = fetch('name','txp_section','name',$name); if (!$chk) { if ($name) { $rs = safe_insert( "txp_section", "name = '$name', title = '$title', page = 'default', css = 'default', is_default = 0, in_rss = 1, on_frontpage = 1" ); if ($rs) { $message = gTxt('section_created', array('{name}' => $name)); $this->_message($message); $this->_set_view('list'); } else { $message = gTxt('section_not_created', array('{name}' => $name)); $this->_error($message); $this->_set_view('list'); // @todo: stay in detail view } } else { $this->_set_view('list'); } } else { $message = gTxt('section_name_already_exists', array('{name}' => $name)); $this->_error($message); $this->_set_view('list'); } } //------------------------------------------------------------- function save_post() { global $txpcfg; extract(doSlash(psa(array('page','css','old_name')))); extract(psa(array('name', 'title'))); $parent = $this->psi('parent', 0); if (empty($title)) { $title = $name; } // Prevent non url chars on section names include_once txpath.'/lib/classTextile.php'; $textile = new Textile(); $title = doSlash($textile->TextileThis($title,1)); $name = doSlash(sanitizeForUrl($name)); // rename existing section if ($old_name && (strtolower($name) != strtolower($old_name))) { if (safe_field('name', 'txp_section', "name='$name'")) { $message = gTxt('section_name_already_exists', array('{name}' => $name)); $this->_error($message); $this->_set_view('list'); // @todo: stay in detail view return; } } if ($name == 'default') { // @todo: default section is defined by parent == '0', not by name safe_update('txp_section', "page = '$page', css = '$css'", "name = 'default'"); update_lastmod(); } else { extract(array_map('assert_int',psa(array('is_default','on_frontpage','in_rss','searchable')))); // note this means 'selected by default' not 'default page' if ($is_default) { safe_update("txp_section", "is_default = 0", "name != '$old_name'"); } safe_update('txp_section', " name = '$name', title = '$title', page = '$page', css = '$css', parent = $parent, is_default = $is_default, on_frontpage = $on_frontpage, in_rss = $in_rss, searchable = $searchable ", "name = '$old_name'"); safe_update('textpattern', "Section = '$name'", "Section = '$old_name'"); update_lastmod(); } $message = gTxt('section_updated', array('{name}' => $name)); $this->_message($message); $this->_set_view('list'); } // ------------------------------------------------------------- function delete_post() { $name = ps('name'); safe_delete('txp_section', "name = '$name'"); $message = gTxt('section_deleted', array('{name}' => $name)); $this->_message($message); $this->_set_view('list'); } // ------------------------------------------------------------- function adopters($child_id) { static $adopters; if(empty($adopters)) { $adopters = safe_rows('name, id', 'txp_section','1=1'); } // do not attempt to adopt yourself, child! foreach($adopters as $a) { if($a['id'] != $child_id) { $out[$a['id']] = $a['name']; } } // @todo: prevent circular section graphs return($out); } // ------------------------------------------------------------- function adopters_dropdown($child_id, $parent_id=0) { return selectInput('parent', SectionController::adopters($child_id), $parent_id); } } // SectionController class SectionListView extends TxpTableView { var $controller = NULL; function SectionListView(&$rows, $controller, $caption='', $edit_actions=array()) { parent::TxpTableView($rows, $caption, $edit_actions); $this->controller = $controller; $this->pages = safe_column('name', 'txp_page', "1 = 1"); $this->styles = safe_column('name', 'txp_css', "1 = 1"); } function head($cols) { if (!$this->controller) return; extract($this->controller->context); $switch_dir = ($dir == 'asc') ? 'desc' : 'asc'; $e = $this->controller->event; return ''.n. ''.n. ''.n. ''.n. ''.n. ''.n. ''.n. ''.n. ''.n. n.''.tr( column_head('ID', 'id', $e, true, $switch_dir, $crit, $search_method, ('id' == $sort) ? $dir : ''). column_head('section_name', 'name', $e, true, $switch_dir, $crit, $search_method, ('name' == $sort) ? $dir : ''). column_head('section_longtitle', 'title', $e, true, $switch_dir, $crit, $search_method, ('title' == $sort) ? $dir : ''). column_head('uses_page', 'page', $e, true, $switch_dir, $crit, $search_method, ('page' == $sort) ? $dir : ''). column_head('uses_style', 'css', $e, true, $switch_dir, $crit, $search_method, ('css' == $sort) ? $dir : ''). column_head('parent_section', 'parent', $e, true, $switch_dir, $crit, $search_method, ('parent' == $sort) ? $dir : ''). column_head('selected_by_default', 'is_default', $e, true, $switch_dir, $crit, $search_method, ('is_default' == $sort) ? $dir : ''). column_head('on_front_page', 'on_front_page', $e, true, $switch_dir, $crit, $search_method, ('on_fornt_page' == $sort) ? $dir : ''). column_head('syndicate', 'in_rss', $e, true, $switch_dir, $crit, $search_method, ('in_rss' == $sort) ? $dir : ''). column_head('include_in_search', 'searchable', $e, true, $switch_dir, $crit, $search_method, ('searchable' == $sort) ? $dir : ''). hCell() ).''; } function row($row) { if (!$this->controller) return; extract($this->controller->context); extract($row); $event = $this->controller->event; $tr = array(); $tr[] = $id; $tr[] = fInput('text', 'name', $name, '', '', '', 20); $tr[] = fInput('text', 'title', $title, '', '', '', 20); $tr[] = selectInput('page', $this->pages, $page);//.sp.popHelp('section_uses_page'); $tr[] = selectInput('css', $this->styles, $css);//.sp.popHelp('section_uses_css'); $tr[] = SectionController::adopters_dropdown($id, $parent);//.sp.popHelp('section_parent_section'); $tr[] = yesnoradio('is_default', $is_default, '', $name);//.sp.popHelp('section_is_default'); $tr[] = yesnoradio('on_frontpage', $on_frontpage, '', $name);//.sp.popHelp('section_on_frontpage'); $tr[] = yesnoradio('in_rss', $in_rss, '', $name);//.sp.popHelp('section_syndicate'); $tr[] = yesnoradio('searchable', $searchable, '', $name);//.sp.popHelp('section_searchable'); $tr[] = fInput('submit', '', gTxt('save_button'), 'smallerbox'). eInput('section'). sInput('save'). hInput('old_name', $name); $tr = doWrap($tr, 'tr', 'td', 'row-'.(++$this->count % 2 ? 'odd' : 'even')); #echo "
".htmlspecialchars($tr)."

===
"; $tr = preg_replace('//', '\\0'.start_form(), $tr); $tr = preg_replace('/<\/tr>/', end_form().'', $tr); return $tr; } } // SectionListView ?>