====== PHP 1ファイルのみでDB不要のTODO管理ツール - Todo.php ====== コメントと更新履歴は[[http://0-oo.net/log/category/todo-php/|ゼロと無限の間のログ » Todo.php]]へどうぞ。 {{php-tool-box:pencil.png|}} ([[http://www.moongift.jp/|MOONGIFT]]風に)みなさんはタスク管理にどんなものを使っているだろうか。Webのサービスでもインストール型のツールでも、TODO管理の方法は色々あるが、いざ探してみると意外に帯に短し襷に長しである。\\ Remember The Milkは高機能だが重いし、Tracは共有するには良いが個人で使うには冗長、iGoogleのTODOガジェットはシンプルでよいが痒いところに手が届かない。\\ それならいっそ、自分のサーバで手軽に管理できるTODOツールはどうだろうか。今日紹介するのはPHPが1ファイルのみ、しかもDBも不要なTODO管理ツール、「Todo.php」だ。 ===== 使い方 ===== 下記のソースコードをコピーして適当な名前でPHPファイルとして保存し、Todoクラスの先頭で定義してある定数をお好みで変更してください。また、定数に合わせてデータを保存するディレクトリを作ってください。 なお、このソースコードではJavaScirptとCSSとして、操作性を高めるために[[../javascript/pryn-js-css|Pryn.js/css]]を、カレンダーを使うために[[../javascript/Yahho Calendar|Yahho Calendar]]と[[../javascript/Google Calendar Holidays|GCalHolidays]]を使っていますが、これら無しでもTodo.phpは動きます。使わない場合はこれらを削除してください。 ===== サンプル ===== [[http://x.0-oo.net/sam/todo/?cat=Milk|Todo.phpのサンプル]] ===== さらに進んだ使い方 ===== メールサーバが使えるなら、[[mail to todo|mail2todo]]を組み合わせて使うと便利です。 ===== ライセンス ===== [[http://0-oo.net/pryn/MIT_license.txt|MITライセンス]]で。\\ ===== ソースコード ===== |]{1,20}$'; /** ページタイトル */ const TITLE = 'TODO'; /** バックアップの保存期限 */ const BACKUP_TIME = '-7 day'; /** 優先度の最大値 */ const PRI_MAX = 5; public $cat; public $cats; public $list; /** * コンストラクタ * @param string $cat カテゴリ */ public function __construct($cat) { $this->cat = $cat; mb_internal_encoding(Todo::ENCODING); mb_regex_encoding(Todo::ENCODING); } /** * 表示の準備 */ public function setUp() { if ($this->isValidCat()) { if ($_REQUEST['delete'] && $this->_deleteCat()) { } else { if ($_POST['update']) { $this->_updateList(); } $this->list = $this->_getList(); } } $this->cats = $this->_getCategories(); } /** * カテゴリチェック * @return boolean 許可されるカテゴリかどうか */ public function isValidCat() { return mb_eregi(Todo::CAT_REGEX, $this->cat); } /** * TODOリストのファイルパスを取得する * @return string パス */ public function getPath() { $cat = mb_convert_encoding($this->cat, Todo::FILE_NAME_ENCODING); return Todo::DATA_DIR . '/' . $cat . '.' . Todo::DATA_EXT; } /** * カテゴリを全て取得する * @return array 全てのカテゴリのカテゴリ名とファイルサイズ */ private function _getCategories() { $h = opendir(Todo::DATA_DIR); if (!$h) { exit('data directory is not found.'); } $cats = array(); $limit = date('YmdHis', strToTime(Todo::BACKUP_TIME)); while (false !== ($file = readdir($h))) { if (is_dir($file)) { continue; } $arr = explode('.', $file); $path = Todo::DATA_DIR . '/' . $file; if (count($arr) == 3) { //バックアップの場合 if ($arr[2] < $limit) { //期限切れは削除 unlink($path); } } else { //最新版の場合 $cat = mb_convert_encoding($arr[0], Todo::ENCODING, Todo::FILE_NAME_ENCODING); $cats[$cat] = filesize($path); } } closedir($h); ksort($cats); return $cats; } /** * TODOリストを更新して保存する */ private function _updateList() { $oldCat = new Todo($_POST['oldcat']); //変更前のカテゴリ $newPath = $this->getPath(); if (is_file(strtoupper(__FILE__))) { //ファイルパスで大文字小文字を区別しない場合 $change = strcasecmp($oldCat->cat, $this->cat); } else { $change = ($oldCat->cat != $this->cat); } if ($change && is_file($newPath)) { return; //変更後のカテゴリが既に存在する場合は更新しない } $oldPath = $oldCat->getPath(); if ($oldCat->isValidCat() && is_file($oldPath)) { rename($oldPath, $oldPath . '.' . date('YmdHis')); //バックアップ } foreach ($_POST['todo'] as $post) { if ($post[1] != '') { //TODO未入力は削除 $data .= implode("\t", $post) . "\n"; } } file_put_contents($newPath, $data); } /** * TODOリストを取得する * @return array TODOリスト */ private function _getList() { $path = $this->getPath(); if (!is_file($path)) { //新規の場合 return array(''); } $list = explode("\n", file_get_contents($path)); rsort($list); //優先度順でソート return $list; } /** * カテゴリを削除する * @return boolean 削除できたかどうか */ private function _deleteCat() { $path = $this->getPath(); if (!is_file($path) || filesize($path)) { //todoが残っている場合は削除させない return false; } $this->cat = null; return unlink($path); } } //----- Global Functions ----- /** * HTMLエスケープ * @param string $val エスケープしたい文字列 * @return string エスケープした文字列 */ function h($val) { return htmlspecialchars($val, ENT_QUOTES); } /** * option要素を出力する * @param string $val optionの値 * @param string $selected selectedにすべき値 */ function echoOption($val, $selectedVal) { if ($val == $selectedVal) { $selected = 'selected="selected"'; } echo "\n"; } //---------------------------- $todo = new Todo($_REQUEST['cat']); $todo->setUp(); ini_set('default_charset', Todo::ENCODING); ?> <?xml version="1.0" encoding="" ?> <?php echo h(Todo::TITLE . ' - ' . $todo->cat); ?>

isValidCat()) { ?>
カテゴリ :
', '保留', '完了'); foreach ($todo->list as $i => $row) { $task = explode("\t", $row); if ($task[4] == $statuses[2]) { //完了は出力しない continue; } ?>
優先度TODO開始日 期限状態
cat) { ?> 残念ですが、このカテゴリ名( cat); ?> )は使えません
    cats as $cat => $fileSize) { $href = '?cat=' . urlencode($cat); ?>
  • [削除]
powered by Todo.php