make_unique_basename の件

18 views
Skip to first unread message

野田 純生

unread,
Jun 5, 2008, 11:45:54 AM6/5/08
to mtos-ja
野田です。

なんか、チラシの裏(?)に書いて盛り上がってるる方がい
るみたいで(笑)

小川さんのエントリーでいうとこの話題ですが。

http://as-is.net/blog/archives/000895.html
http://as-is.net/blog/archives/000910.html

エントリーが多くなるとbasenameのpost_xxを自動生成す
るのに時間がかかる件です。

案1) post_+entry_id(idはユニークであることが保証されてるの
で)

- while ($class->count({ blog_id => $blog->id,
- basename => $base })) {
- $base = $base_copy . '_' . $i++;
- }
+ if ($entry->id) {
+ $base .= '_' . $entry->id;
+ } else {
+ my $lastn = MT::Entry->load( undef, { sort => 'id',
+ direction => 'descend',
+ limit => 1 } );
+ my $id = $lastn->id;
+ $id++;
+ $base .= '_' . $id;
+ while ($class->count({ blog_id => $blog->id,
+ basename => $base })) {
+ $base = $base_copy . '_' . $i++;
+ }
+ }


案2) DBを拡張。テーブル(例:MT::Basenameみない
のを作って)>>コードは試してないです


- while ($class->count({ blog_id => $blog->id,
- basename => $base })) {
- $base = $base_copy . '_' . $i++;
- }
+ if ( $class->load({ blog_id => $blog->id,
+ basename => $base }) ) {
+
+ require MT::Basename;
+ my $basename = MT::Basename->load( {blog_id => $blog->id,
+ basename => $base, },
+ { sort => 'num',
+ direction => 'descend',
+ limit => 1 } );
+ my $num = $basename->num;
+ $num++;
+ $basename->num($num);
+ $basename->save or die;
+ $base = $base_copy . '_' . $num;
+ }
+ while ($class->count({ blog_id => $blog->id,
+ basename => $base })) {
+ $base = $base_copy . '_' . $i++;
+ }

# この場合、削除されたエントリのbasenameは考慮されない

番外編) ちょっと違う視点ですが、post_xx ってのが嫌な
場合のために、

mt-config.cgiに

Basename basename

とか指定して

my $base = MT->instance->{cfg}->Basename if $base eq '';

とかする手もありますよね。

※basename_1.html とか

どんなもんでしょう?

野田 純生

unread,
Jun 5, 2008, 11:52:41 AM6/5/08
to mto...@googlegroups.com
野田です。

load じゃないですね(汗;)


> + my $basename = MT::Basename->load( {blog_id => $blog->id,
> + basename => $base, },
> + { sort => 'num',
> + direction => 'descend',
> + limit => 1 } );
> + my $num = $basename->num;
> + $num++;

+ my $basename = MT::Basename->get_by_key ( {blog_id =>

$blog->id,
+ basename =>
$base, },
+ { sort => 'num',
+ direction =>
'descend',
+ limit => 1 } );

野田 純生

unread,
Jun 5, 2008, 12:13:54 PM6/5/08
to mto...@googlegroups.com
野田です。

load じゃないですね(汗;)


> + my $basename = MT::Basename->load( {blog_id => $blog->id,
> + basename => $base, },
> + { sort => 'num',
> + direction => 'descend',
> + limit => 1 } );
> + my $num = $basename->num;
> + $num++;

+ my $basename = MT::Basename->get_by_key ( {blog_id =>

$blog->id,
+ basename =>
$base, },
+ { sort => 'num',
+ direction =>
'descend',
+ limit => 1 } );

On 2008/06/06, at 0:45, 野田 純生 wrote:

Akira Niwa

unread,
Jun 5, 2008, 11:37:35 PM6/5/08
to mto...@googlegroups.com
丹羽です。
野田さんのこれ、1)をコアに反映するのが一番良い気がしますね~。
個人的にはpost_[blogID][entryID]だったりする方が好み何ですけど(笑)


2008/06/06 0:45 野田 純生 <jun...@alfasado.jp>:
>
> 野田です。
>
> なんか、チラシの裏(?)に書いて盛り上がってるる方がいるみたいで(笑)


>
> 小川さんのエントリーでいうとこの話題ですが。
>
> http://as-is.net/blog/archives/000895.html
> http://as-is.net/blog/archives/000910.html
>
> エントリーが多くなるとbasenameのpost_xxを自動生成するのに時間がかかる件です。
>
> 案1) post_+entry_id(idはユニークであることが保証されてるので)
>
> - while ($class->count({ blog_id => $blog->id,
> - basename => $base })) {
> - $base = $base_copy . '_' . $i++;
> - }
> + if ($entry->id) {
> + $base .= '_' . $entry->id;
> + } else {
> + my $lastn = MT::Entry->load( undef, { sort => 'id',
> + direction => 'descend',
> + limit => 1 } );
> + my $id = $lastn->id;
> + $id++;
> + $base .= '_' . $id;
> + while ($class->count({ blog_id => $blog->id,
> + basename => $base })) {
> + $base = $base_copy . '_' . $i++;
> + }
> + }
>
>

> 案2) DBを拡張。テーブル(例:MT::Basenameみないのを作って)>>コードは試してないです

Hirotaka Ogawa

unread,
Jun 6, 2008, 1:02:09 AM6/6/08
to mto...@googlegroups.com
小川です。

2008/6/6 野田 純生 <jun...@alfasado.jp>:
>
> 野田です。
>
> なんか、チラシの裏(?)に書いて盛り上がってるる方がいるみたいで(笑)
>


> 小川さんのエントリーでいうとこの話題ですが。
>
> http://as-is.net/blog/archives/000895.html
> http://as-is.net/blog/archives/000910.html
>
> エントリーが多くなるとbasenameのpost_xxを自動生成するのに時間がかかる件です。
>
> 案1) post_+entry_id(idはユニークであることが保証されてるので)
>
> - while ($class->count({ blog_id => $blog->id,
> - basename => $base })) {
> - $base = $base_copy . '_' . $i++;
> - }
> + if ($entry->id) {
> + $base .= '_' . $entry->id;
> + } else {
> + my $lastn = MT::Entry->load( undef, { sort => 'id',
> + direction => 'descend',
> + limit => 1 } );
> + my $id = $lastn->id;
> + $id++;
> + $base .= '_' . $id;
> + while ($class->count({ blog_id => $blog->id,
> + basename => $base })) {
> + $base = $base_copy . '_' . $i++;
> + }
> + }

二つ問題があると思います。

(1) 「post_100」というタイトルのエントリーのベースネームと、「post」というタイトルのID=100のエントリーのベースネームが同じになります。
(2) make_unique_basenameはそもそも新規オブジェクトを作成して保存する前のタイミングで呼ばれるような記憶があります。だからidが定義されておらず、式「$entry->id」は常に偽となるのではないでしょうか。

そう言えば、MT4からloadのアーギュメントとしてlikeオペレータを書けるようになっていますよね。これを使うと
http://as-is.net/blog/archives/000910.html
の下の方のmake_unique_basenameはもう少し効率良く書けます。


> 案2) DBを拡張。テーブル(例:MT::Basenameみないのを作って)>>コードは試してないです

make_unique_basenameの件ではいろんなレベルの話があると思います。

1. リファクタリングしたい

そもそもMT::Util::make_unique_basename, make_unique_author_basename,
make_unique_category_basenameという3つのユーティリティメソッドが用意されていますが、それぞれMT::Entry,
MT::Author, MT::Categoryのメソッドとして定義しなおせます。MT::Dirifiableみたいなクラスを定義しておき、MT::Entry,
MT::Author, MT::Categoryに多重継承(またはmtos-devの流行に従えばmixin)させるようにしてもいいですね。

2. ユーザ定義のmake_unique_basenameに置き換えるためのインタフェースがほしい

registryで設定できるようにしたり。そこまでの需要はないように思いますが。

3. ベースネームの指定方法をテンプレートでカスタマイズしたい

basename_<$MTEntryID$>
basename_<$MTBlogID$>_<$MTEntryID$>

4. CMSのエントリー編集画面で「出力ファイル名」を設定するロジックがJavaScriptでハードコードされてしまっているのでこれをなんとかしたい

頭痛いです。

--
Hirotaka Ogawa
http://ja.facebook.com/people/Hirotaka_Ogawa/710797233
http://as-is.net/blog/

野田 純生

unread,
Jun 6, 2008, 2:52:44 AM6/6/08
to mto...@googlegroups.com
野田です。

> (1) 「post_100」というタイトルのエントリーのベースネーム
> と、「post」というタイトルのID=100のエントリーの
> ベースネームが同じになります。

確かにそうですね。

> (2) make_unique_basenameはそもそも新規オブジェクトを作成して保
> 存する前のタイミングで呼ばれるような記憶があります。だから
> idが定義されておらず、式「$entry->id」は常に偽となるので
> はないでしょうか。

そうですね。普通に投稿画面から保存する場合、$entry->idは偽
になります。なので最後のエントリーのid++ とかしたとして、
uniqである保証がないですね。
いずれにしてもuniqというからには、効率はともかく最終的には
ユニークであることを保証しないとまずいですし。

> そう言えば、MT4からloadのアーギュメントとして
> likeオペレータを書けるようになっていますよね。これを使うと
> http://as-is.net/blog/archives/000910.html
> の下の方のmake_unique_basenameはもう少し効率良く書けます。


_の後の桁が揃えられていることが前提なら(post_0001 と
か)一発ですね。

SELECT entry_id
FROM `mt_entry`
WHERE `entry_basename` LIKE 'post_%'
AND `entry_blog_id` =1
ORDER BY `mt_entry`.`entry_basename` DESC
LIMIT 1

(↑で、IDに1を加える)

桁が揃えられてなかったら(誰かSQL詳しい方...)


> 4. CMSのエントリー編集画面で「出力ファイル名」を設定するロジッ
> クがJavaScriptでハードコードされてしまっているのでこれを
> なんとかしたい

JavaScriptでやるのならいっそ、Googleの翻訳APIとかを
使って

「ベースネームの命名規則について」→「Name-based naming
rules」 → 「name_based_naming_rules」

とか、遊ぶ分には楽しいかもしれません(^^;

On 2008/06/06, at 14:02, Hirotaka Ogawa wrote:

>
> 小川です。
>
> 2008/6/6 野田 純生 <jun...@alfasado.jp>:
>>
>> 野田です。
>>
>> なんか、チラシの裏(?)に書いて盛り上がってるる方
>> がいるみたいで(笑)
>>
>> 小川さんのエントリーでいうとこの話題ですが。
>>
>> http://as-is.net/blog/archives/000895.html
>> http://as-is.net/blog/archives/000910.html
>>

>> エントリーが多くなるとbasenameのpost_xxを自動生成
>> するのに時間がかかる件です。
>>
>> 案1) post_+entry_id(idはユニークであることが保証されて

Reply all
Reply to author
Forward
0 new messages