トップ «前の日記(2005-04-19) 最新 次の日記(2005-04-21)» 編集

いしなお!

2002|01|02|03|04|05|06|07|08|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|02|03|04|07|
2009|03|

2005-04-20 [長年日記]

_ [tDiary][MM] tDiaryのアンカーリンク時にドキュメントタイトルを表示する その2 (13:11)

昨日のバージョンから諸々追加して、結局こうなった。

  • highlight.rb.diff
23,27d22
<
<         if (highlightElem.tagName == 'H3') {
<           var h1 = document.getElementsByTagName('H1')[0];
<           document.title = (highlightElem.innerHTML + ' - ' + h1.innerHTML).replace(/<[^>]+?>/g, '').substr(2);
<         }

tDiaryは必ずH1に日記タイトルってつくよね? ということを前提に、日記タイトルをけつに付けてみた。あと、段落アンカーってCSSで画像とかを表示することがあっても、実体としてのテキストはいつも「_」なんだよね? ってことで、H3のタイトルからタグを除去し、あたま2文字を削ってみた。

というわけで、JavaScriptオンな環境ならば、ここの段落アンカーをクリックすると「[tDiary][MM] tDiaryのアンカーリンク時にドキュメントタイトルを表示する その2 (13:11) - tdiary.ishinao.net」なんて感じになって、その状態でdel.icio.usとかはてなブックマークとかにbookmarkletを使って登録すると、そのタイトルがちゃんと登録されるわけですね。

ちなみにMM/Memoでもbookmarkletで現在ブラウザが表示しているタイトルを渡したい場合は、

memo!

なんて感じ? タイトルだけでなく、選択されている範囲があったらその部分をテキストとして送るようにもしてある。

_ [PHP][MVC] BMediaNode: PHPプログラマの力量を計る その2 (18:49)

OOPってのは、要はMVCのことなのか。ってことで、MVCで書いてみた。modelをNULLで返すパターンはあんまり美しくないなー。空のmodelでも返した方がきれいか。でもまああまり深く考えることはやめておこう。

index3.php

<?php

main();

function main()
{
    header('content-type: text/html; charset=UTF-8');
    $ctrl =& new MyController();
    $ctrl->run();
    $model =& $ctrl->getModel();
    $view =& $ctrl->getView();
    $view->display($model);
}

class MyController
{
    var $_model;
    var $_view;

    function run()
    {
        switch ($_SERVER['REQUEST_METHOD']) {
        case 'POST':
            $this->_model =& new MyModel();
            switch ($this->_getMode()) {
            case 'input':
                $this->_view =& new MyViewInput();
                break;
            case 'check':
                $this->_view =& new MyViewCheck();
                break;
            case 'result':
                $this->_view =& new MyViewResult();
                break;
            }
            break;
        default:
            $this->_view =& new MyViewInput();
            break;
        }
    }

    function _getMode()
    {
        if (isset($_POST['btnSave']) && $this->_model->isValid()) {
            return 'result';
        } elseif (isset($_POST['btnNext']) && $this->_model->isValid()) {
            return 'check';
        } else {
            return 'input';
        }
    }

    function &getModel()
    {
        return $this->_model;
    }

    function &getView()
    {
        return $this->_view;
    }
}

class MyModel
{
    var $_params = array();
    var $_errors = array();

    function MyModel()
    {
        $this->_init();
        $this->_validate();
    }

    function _init()
    {
        $this->_param = array();

        $zip = isset($_POST['zip']) ? $_POST['zip'] : '';
        $zip = trim(mb_convert_kana($zip, 'KVas'));
        $zip = str_replace('-', '', $zip);
        $this->_params['zip'] = $zip;
    }

    function _validate()
    {
        $this->_errors = array();
        if ($this->_params['zip'] == '') {
            $this->_errors[] = '入力されていません';
        } elseif (!preg_match('|^[0-9]{7}$|', $this->_params['zip'])) {
            $this->_errors[] = '入力内容が正しくありません';
        }
    }

    function getParams()
    {
        return $this->_params;
    }

    function isValid()
    {
        return count($this->_errors) == 0;
    }

    function getErrors()
    {
        return $this->_errors;
    }
}

class MyViewInput
{
    function display($model)
    {
        if (isset($model)) {
            extract($model->getParams());
            $errors = $model->getErrors();
        } else {
            $zip = NULL;
        }
        include 'templates/input.tmpl';
    }
}

class MyViewCheck
{
    function display($model)
    {
        extract($model->getParams());
        include 'templates/check.tmpl';
    }
}

class MyViewResult
{
    function display($model)
    {
        extract($model->getParams());
        include 'templates/result.tmpl';
    }
}

function h($str)
{
    return htmlspecialchars($str);
}

?>

テンプレートは、昨日のやつとはちょっと変わっているんだけど面倒くさいから省略。エラーが配列になって、actionのURLはテンプレート側で解決($_SERVER['PHP_SELF'])するようにしただけ。

より規模が大きいフォームとかに拡張することを考えたプロトタイプとして書くならこういう書き方もありかなー。ただ、これはもともとの仕様を満たすには適材適所を大幅にはみ出ている気がする。

まあ、頭の体操にはいいよね。多分人によっては、MVCの切り分け範囲が違ってくるんだろうな。

ああ

$ctrl->_getMode()が$ctrl->runの中のswitchの条件に依存している。危険危険。

_ [MM][tDiary] テーマを追加 (19:31)

MM/Memoの個人ページで使えるテーマとして、Treetop、マーガレット、Digital Gadgets、カーテン、Orange Flower、お花見、Sleepy Kitten、ナトリウムランプを追加。っつーか、Sleepy Kittenを使ってみたかっただけ。

本日のツッコミ(全2件) [ツッコミを入れる]
_ ただただし (2005-04-21 10:00)

「_」とは限らないですけど、1文字の場合が大多数だとは思います >アンカー

_ ishinao (2005-04-21 14:15)

いくつか見て回ったところ、思ったよりバリエーションあるんですね。というかたださんのところも1文字じゃないし!<br>「最初の空白までを削除する」の方が無難かなー。あと、日記タイトルはどうせなら、Ruby側でJavaScriptを生成する段階で埋め込んでやる方が、日付とかの情報も入れられていいのか。

[]