[バグ][要望] 自動エイリアス生成でエイリアスが重複する ほか

MODx 0.9.6.1において、自動エイリアス生成機能の利用時にエイリアスが重複するバグが報告されている。また、公開・削除ステータスと無関係にドキュメントを取得するAPIが欲しい、との要望が挙がっている。

自動エイリアス生成でエイリアスが重複する

フレンドリーURL機能のエイリアスに関するバグ。フレンドリーURLを使用している場合で、「自動エイリアス生成」を有効にしている場合に「重複エイリアスを許可」の設定が無視され、ドキュメントのエイリアスが不完全な形で重複する。

例として、「重複エイリアスを許可」を無効にしている場合に、同じ「document」というタイトルでドキュメントを作成すると、「document」、「document1」、「document1」のように3つ目以降のドキュメントのエイリアスが重複する。また、「重複エイリアスを許可」を有効にしている場合でも、2つ目までは重複しないエイリアスが生成され、3つ目以降は重複エイリアスが生成される。

修正案として、以下のコードが提案されている。修正後、同じタイトルのドキュメントを作成した場合、ドキュメントのエイリアスは「document」、「document1」、「document2」のように連番となる。

/manager/processors/save_content.processor.php(65~72行目)
// auto assign alias
    if (!$alias && $automatic_alias) {
    $alias = strtolower(stripAlias(trim($pagetitle)));
    // check if alias already exists. if yes then append $cnt to alias
    if ($modx->db->getValue("SELECT count(*) FROM " . $tblsc . " WHERE id<>'$id' AND alias='$alias'") != 0) {
        $cnt = '1';
        $tempAlias = $alias;
        while ($modx->db->getValue("SELECT count(*) FROM " . $tblsc . " WHERE id<>'$id' AND alias='$tempAlias'") != 0) {
            $tempAlias = $alias;
            $tempAlias .= $cnt;
            $cnt++;
        }
        $alias = $tempAlias;
    }
}

ただし、この修正案では、やはり「重複エイリアス」の設定が考慮されていないため、不完全である点に注意が必要。自動エイリアス生成機能にも重複エイリアスの設定を反映させるためには、さらに「$allow_duplicate_alias」(重複エイリアスの設定)による分岐が必要。

公開・削除ステータスと無関係にドキュメントを取得するAPI

ドキュメントを取得するためのAPIに対する要望。対象として挙げられているのは、DocumentParser APIの以下のメソッド。

  • getTemplateVars
  • getTemplateVarOutput
  • getDocuments

通常、これらのメソッドでは、取得するドキュメントの公開・削除ステータスを指定する必要がある。そのため、公開・削除ステータスとは無関係にドキュメントを取得したい場合には、これらのメソッドを繰り返して呼び出す必要があり、複数回のクエリが実行されることになる。

無駄なクエリの実行を避けるために、公開・削除ステータスと無関係にドキュメントを取得するAPIが欲しいとのこと。パラメータと処理を追加・変更したファイルが添付されている。

現在のMODxは、Etomiteのコードを引き継いでおり、APIに関しても柔軟性に乏しい部分が残っている。フルスクラッチで書き起こし中の次期modx evolutionでの改善が期待される。

M子