<?php
-/////////////////////////////////////////////////
-// PukiWiki - Yet another WikiWikiWeb clone.
-//
-// $Id: tracker.inc.php,v 1.20 2003/12/03 12:36:02 arino Exp $
+// PukiWiki - Yet another WikiWikiWeb clone
+// $Id: tracker.inc.php,v 1.34 2005/11/28 17:48:30 teanan Exp $
//
+// Issue tracker plugin (See Also bugtrack plugin)
// tracker_list¤Çɽ¼¨¤·¤Ê¤¤¥Ú¡¼¥¸Ì¾(Àµµ¬É½¸½¤Ç)
// 'SubMenu'¥Ú¡¼¥¸ ¤ª¤è¤Ó '/'¤ò´Þ¤à¥Ú¡¼¥¸¤ò½ü³°¤¹¤ë
function plugin_tracker_convert()
{
global $script,$vars;
-
+
+ if (PKWK_READONLY) return ''; // Show nothing
+
$base = $refer = $vars['page'];
-
+
$config_name = 'default';
$form = 'form';
$options = array();
$options = array_splice($args,2);
case 2:
$args[1] = get_fullname($args[1],$base);
- $base = is_pagename($args[1]) ? $args[1] : $base;
+ $base = is_pagename($args[1]) ? $args[1] : $base;
case 1:
$config_name = ($args[0] != '') ? $args[0] : $config_name;
list($config_name,$form) = array_pad(explode('/',$config_name,2),2,$form);
}
}
-
+
$config = new Config('plugin/tracker/'.$config_name);
-
+
if (!$config->read())
{
return "<p>config file '".htmlspecialchars($config_name)."' not found.</p>";
}
-
+
$config->config_name = $config_name;
-
+
$fields = plugin_tracker_get_fields($base,$refer,$config);
-
+
$form = $config->page.'/'.$form;
if (!is_page($form))
{
}
$retval = convert_html(plugin_tracker_get_source($form));
$hiddens = '';
-
+
foreach (array_keys($fields) as $name)
{
$replace = $fields[$name]->get_tag();
}
function plugin_tracker_action()
{
- global $script,$post,$vars,$now;
-
+ global $post, $vars, $now;
+
+ if (PKWK_READONLY) die_message('PKWK_READONLY prohibits editing');
+
$config_name = array_key_exists('_config',$post) ? $post['_config'] : '';
-
+
$config = new Config('plugin/tracker/'.$config_name);
if (!$config->read())
{
}
$config->config_name = $config_name;
$source = $config->page.'/page';
-
+
$refer = array_key_exists('_refer',$post) ? $post['_refer'] : $post['_base'];
-
+
if (!is_pagename($refer))
{
return array(
{
$page = $base;
}
-
+
while (is_page($page))
{
$real = ++$num;
}
// ¥Ú¡¼¥¸¥Ç¡¼¥¿¤òÀ¸À®
$postdata = plugin_tracker_get_source($source);
-
+
// µ¬Äê¤Î¥Ç¡¼¥¿
$_post = array_merge($post,$_FILES);
$_post['_date'] = $now;
$_post['_name'] = $name;
$_post['_real'] = $real;
// $_post['_refer'] = $_post['refer'];
-
+
$fields = plugin_tracker_get_fields($page,$refer,$config);
-
+
+ // Creating an empty page, before attaching files
+ touch(get_filename($page));
+
foreach (array_keys($fields) as $key)
{
$value = array_key_exists($key,$_post) ?
$fields[$key]->format_value($_post[$key]) : '';
-
+
foreach (array_keys($postdata) as $num)
{
if (trim($postdata[$num]) == '')
);
}
}
-
- // ½ñ¤¹þ¤ß
- page_write($page,join('',$postdata));
-
+
+ // Writing page data, without touch
+ page_write($page, join('', $postdata));
+
$r_page = rawurlencode($page);
-
- header("Location: $script?$r_page");
+
+ pkwk_headers_sent();
+ header('Location: ' . get_script_uri() . '?' . $r_page);
exit;
}
/*
function plugin_tracker_inline()
{
global $vars;
-
+
+ if (PKWK_READONLY) return ''; // Show nothing
+
$args = func_get_args();
if (count($args) < 3)
{
}
$body = array_pop($args);
list($config_name,$field) = $args;
-
+
$config = new Config('plugin/tracker/'.$config_name);
-
+
if (!$config->read())
{
return "config file '".htmlspecialchars($config_name)."' not found.";
}
-
+
$config->config_name = $config_name;
-
+
$fields = plugin_tracker_get_fields($vars['page'],$vars['page'],$config);
$fields[$field]->default_value = $body;
return $fields[$field]->get_tag();
function plugin_tracker_get_fields($base,$refer,&$config)
{
global $now,$_tracker_messages;
-
+
$fields = array();
// ͽÌó¸ì
foreach (array(
$class = 'Tracker_field_'.$class;
$fields[$field] = &new $class(array($field,$_tracker_messages["btn$field"],'','20',''),$base,$refer,$config);
}
-
+
foreach ($config->get('fields') as $field)
{
// 0=>¹àÌÜ̾ 1=>¸«½Ð¤· 2=>·Á¼° 3=>¥ª¥×¥·¥ç¥ó 4=>¥Ç¥Õ¥©¥ë¥ÈÃÍ
var $config;
var $data;
var $sort_type = SORT_REGULAR;
-
+ var $id = 0;
+
function Tracker_field($field,$page,$refer,&$config)
{
global $post;
-
+ static $id = 0;
+
+ $this->id = ++$id;
$this->name = $field[0];
$this->title = $field[1];
$this->values = explode(',',$field[3]);
class Tracker_field_text extends Tracker_field
{
var $sort_type = SORT_STRING;
-
+
function get_tag()
{
$s_name = htmlspecialchars($this->name);
class Tracker_field_page extends Tracker_field_text
{
var $sort_type = SORT_STRING;
-
+
function format_value($value)
{
global $WikiName;
-
+
$value = strip_bracket($value);
if (is_pagename($value))
{
class Tracker_field_title extends Tracker_field_text
{
var $sort_type = SORT_STRING;
-
+
function format_cell($str)
{
make_heading($str);
class Tracker_field_textarea extends Tracker_field
{
var $sort_type = SORT_STRING;
-
+
function get_tag()
{
$s_name = htmlspecialchars($this->name);
class Tracker_field_format extends Tracker_field
{
var $sort_type = SORT_STRING;
-
+
var $styles = array();
var $formats = array();
-
+
function Tracker_field_format($field,$page,$refer,&$config)
{
parent::Tracker_field($field,$page,$refer,$config);
-
+
foreach ($this->config->get($this->name) as $option)
{
list($key,$style,$format) = array_pad(array_map(create_function('$a','return trim($a);'),$option),3,'');
if ($format != '')
{
$this->formats[$key] = $format;
- }
+ }
}
}
function get_tag()
class Tracker_field_file extends Tracker_field_format
{
var $sort_type = SORT_STRING;
-
+
function get_tag()
{
$s_name = htmlspecialchars($this->name);
class Tracker_field_radio extends Tracker_field_format
{
var $sort_type = SORT_NUMERIC;
-
+
function get_tag()
{
$s_name = htmlspecialchars($this->name);
$retval = '';
+ $id = 0;
foreach ($this->config->get($this->name) as $option)
{
$s_option = htmlspecialchars($option[0]);
$checked = trim($option[0]) == trim($this->default_value) ? ' checked="checked"' : '';
- $retval .= "<input type=\"radio\" name=\"$s_name\" value=\"$s_option\"$checked />$s_option\n";
+ ++$id;
+ $s_id = '_p_tracker_' . $s_name . '_' . $this->id . '_' . $id;
+ $retval .= '<input type="radio" name="' . $s_name . '" id="' . $s_id .
+ '" value="' . $s_option . '"' . $checked . ' />' .
+ '<label for="' . $s_id . '">' . $s_option . '</label>' . "\n";
}
-
+
return $retval;
}
function get_key($str)
class Tracker_field_select extends Tracker_field_radio
{
var $sort_type = SORT_NUMERIC;
-
+
function get_tag($empty=FALSE)
{
$s_name = htmlspecialchars($this->name);
$retval .= " <option value=\"$s_option\"$selected>$s_option</option>\n";
}
$retval .= "</select>";
-
+
return $retval;
}
}
class Tracker_field_checkbox extends Tracker_field_radio
{
var $sort_type = SORT_NUMERIC;
-
+
function get_tag($empty=FALSE)
{
$s_name = htmlspecialchars($this->name);
$defaults = array_flip(preg_split('/\s*,\s*/',$this->default_value,-1,PREG_SPLIT_NO_EMPTY));
$retval = '';
+ $id = 0;
foreach ($this->config->get($this->name) as $option)
{
$s_option = htmlspecialchars($option[0]);
$checked = array_key_exists(trim($option[0]),$defaults) ?
' checked="checked"' : '';
- $retval .= "<input type=\"checkbox\" name=\"{$s_name}[]\" value=\"$s_option\"$checked />$s_option\n";
+ ++$id;
+ $s_id = '_p_tracker_' . $s_name . '_' . $this->id . '_' . $id;
+ $retval .= '<input type="checkbox" name="' . $s_name .
+ '[]" id="' . $s_id . '" value="' . $s_option . '"' . $checked . ' />' .
+ '<label for="' . $s_id . '">' . $s_option . '</label>' . "\n";
}
-
+
return $retval;
}
}
class Tracker_field_hidden extends Tracker_field_radio
{
var $sort_type = SORT_NUMERIC;
-
+
function get_tag($empty=FALSE)
{
$s_name = htmlspecialchars($this->name);
$s_default = htmlspecialchars($this->default_value);
$retval = "<input type=\"hidden\" name=\"$s_name\" value=\"$s_default\" />\n";
-
+
return $retval;
}
}
$s_page = htmlspecialchars($this->page);
$s_refer = htmlspecialchars($this->refer);
$s_config = htmlspecialchars($this->config->config_name);
-
+
return <<<EOD
<input type="submit" value="$s_title" />
<input type="hidden" name="plugin" value="tracker" />
class Tracker_field_date extends Tracker_field
{
var $sort_type = SORT_NUMERIC;
-
+
function format_cell($timestamp)
{
return format_date($timestamp);
class Tracker_field_past extends Tracker_field
{
var $sort_type = SORT_NUMERIC;
-
+
function format_cell($timestamp)
{
return get_passage($timestamp,FALSE);
function plugin_tracker_list_convert()
{
global $vars;
-
+
$config = 'default';
$page = $refer = $vars['page'];
$field = '_page';
$order = '';
- $list = 'list';
+ $list = 'list';
$limit = NULL;
if (func_num_args())
{
function plugin_tracker_list_action()
{
global $script,$vars,$_tracker_messages;
-
+
$page = $refer = $vars['refer'];
$s_page = make_pagelink($page);
$config = $vars['config'];
$list = array_key_exists('list',$vars) ? $vars['list'] : 'list';
$order = array_key_exists('order',$vars) ? $vars['order'] : '_real:SORT_DESC';
-
+
return array(
'msg' => $_tracker_messages['msg_list'],
'body'=> str_replace('$1',$s_page,$_tracker_messages['msg_back']).
function plugin_tracker_getlist($page,$refer,$config_name,$list,$order='',$limit=NULL)
{
$config = new Config('plugin/tracker/'.$config_name);
-
+
if (!$config->read())
{
return "<p>config file '".htmlspecialchars($config_name)."' is not exist.";
}
-
+
$config->config_name = $config_name;
-
+
if (!is_page($config->page.'/'.$list))
{
return "<p>config file '".make_pagelink($config->page.'/'.$list)."' not found.</p>";
}
-
+
$list = &new Tracker_list($page,$refer,$config,$list);
$list->sort($order);
return $list->toString($limit);
var $pattern_fields;
var $rows;
var $order;
-
+
function Tracker_list($page,$refer,&$config,$list)
{
$this->page = $page;
$this->config = &$config;
$this->list = $list;
$this->fields = plugin_tracker_get_fields($page,$refer,$config);
-
+
$pattern = join('',plugin_tracker_get_source($config->page.'/page'));
// ¥Ö¥í¥Ã¥¯¥×¥é¥°¥¤¥ó¤ò¥Õ¥£¡¼¥ë¥É¤ËÃÖ´¹
// #comment¤Ê¤É¤ÇÁ°¸å¤Ëʸ»úÎó¤ÎÁý¸º¤¬¤¢¤Ã¤¿¾ì¹ç¤Ë¡¢[_block_xxx]¤ËµÛ¤¤¹þ¤Þ¤»¤ë¤è¤¦¤Ë¤¹¤ë
$pattern = preg_replace('/^\#([^\(\s]+)(?:\((.*)\))?\s*$/m','[_block_$1]',$pattern);
-
+
// ¥Ñ¥¿¡¼¥ó¤òÀ¸À®
$this->pattern = '';
$this->pattern_fields = array();
function add($page,$name)
{
static $moved = array();
-
+
// ̵¸Â¥ë¡¼¥×ËÉ»ß
if (array_key_exists($name,$this->rows))
{
return;
}
-
+
$source = plugin_tracker_get_source($page);
if (preg_match('/move\sto\s(.+)/',$source[0],$matches))
{
return $this->add($page,$name);
}
$source = join('',preg_replace('/^(\*{1,3}.*)\[#[A-Za-z][\w-]+\](.*)$/','$1$2',$source));
-
+
// ¥Ç¥Õ¥©¥ë¥ÈÃÍ
$this->rows[$name] = array(
'_page' => "[[$page]]",
}
foreach ($this->rows as $row)
{
- $keys[$field][] = $this->fields[$field]->get_value($row[$field]);
+ $keys[$field][] = isset($row[$field])? $this->fields[$field]->get_value($row[$field]) : '';
}
$params[] = $keys[$field];
$params[] = $this->fields[$field]->sort_type;
$params[] = $order;
-
+
}
$params[] = &$this->rows;
function replace_title($arr)
{
global $script;
-
+
$field = $sort = $arr[1];
if ($sort == '_name' or $sort == '_page')
{
$dir = SORT_ASC;
$arrow = '';
$order = $this->order;
-
- if (array_key_exists($sort,$order))
+
+ if (is_array($order) && isset($order[$sort]))
{
- $index = array_flip(array_keys($order));
+ // BugTrack2/106: Only variables can be passed by reference from PHP 5.0.5
+ $order_keys = array_keys($order); // with array_shift();
+
+ $index = array_flip($order_keys);
$pos = 1 + $index[$sort];
- $b_end = ($sort == array_shift(array_keys($order)));
+ $b_end = ($sort == array_shift($order_keys));
$b_order = ($order[$sort] == SORT_ASC);
$dir = ($b_end xor $b_order) ? SORT_ASC : SORT_DESC;
$arrow = '&br;'.($b_order ? '↑' : '↓')."($pos)";
- unset($order[$sort]);
+
+ unset($order[$sort], $order_keys);
}
$title = $this->fields[$field]->title;
$r_page = rawurlencode($this->page);
$r_config = rawurlencode($this->config->config_name);
$r_list = rawurlencode($this->list);
$_order = array("$sort:$dir");
- foreach ($order as $key=>$value)
- {
- $_order[] = "$key:$value";
- }
+ if (is_array($order))
+ foreach ($order as $key=>$value)
+ $_order[] = "$key:$value";
$r_order = rawurlencode(join(';',$_order));
-
+
return "[[$title$arrow>$script?plugin=tracker_list&refer=$r_page&config=$r_config&list=$r_list&order=$r_order]]";
}
function toString($limit=NULL)
{
global $_tracker_messages;
-
+
$source = '';
$body = array();
-
+
if ($limit !== NULL and count($this->rows) > $limit)
{
$source = str_replace(
if (!TRACKER_LIST_SHOW_ERROR_PAGE and !$row['_match'])
{
continue;
- }
+ }
$this->items = $row;
foreach ($body as $line)
{
// ¸«½Ð¤·¤Î¸ÇÍIDÉô¤òºï½ü
$source = preg_replace('/^(\*{1,3}.*)\[#[A-Za-z][\w-]+\](.*)$/m','$1$2',$source);
// #freeze¤òºï½ü
- return preg_replace('/^#freeze\s*$/m','',$source);
+ return preg_replace('/^#freeze\s*$/im', '', $source);
}
?>