ここの情報は古いです。ご理解頂いた上でお取り扱いください。

Opened 11 years ago

#3531 new enhancement

URLを張っても小窓を表示させない機能が欲しい

Reported by: imamura623 Owned by: nobody
Priority: minor Milestone:
Component: 指定しない Version:
Keywords: 2.13要望 Cc:

Description

http://sns.openpne.jp/?m=pc&a=page_fh_diary&target_c_diary_id=20411より転記

[質問全般] コミュで以下のような質問をしたのですが、
URLを張っても小窓を表示させない方法を知りたい
http://sns.openpne.jp/?m=pc&a=page_c_topic_detail&target_...

その後、自前でプログラムを改造し実現しました。
また可能である事もわかったので、ぜひ仕様に取り入れていただけるよう要望します。
参考までに、当方が手を加えたソースを添付します。


当方で取り入れた仕様は、上記質問でおとみさんが提案くださった、
「<nocmd>タグが先頭にあるURLは小窓にならない」
を取り入れ、さらに<nocmd_link>であった場合はリンクを張るようにしました。
また、URLをタグでくくる必要はなく、先頭に<nocmd>か<nocmd_link>が存在するか否かで判断しています。

参考までにソースを以下に張ります。
改造したファイルは以下です(OpenPNE2.13.5)
/OpenPNE/webapp/lib/smarty_plugins/modifier.t_url2cmd.php

手を加えた箇所は、
<nocmd>タグにより小窓を表示させない仕様を盛り込んでほしい -- 改 ここから

改 ここまで
でくくっています。



以下、ソース


<?php
/**
* @copyright 2005-2008 OpenPNE Project
* @license http://www.php.net/license/3_01.txt PHP License 3.01
*/


function smarty_modifier_t_url2cmd($string, $type = '', $target_c_member_id = '', $is_html = true)
{

$list = array();

if ($type === 'entry_point') {
// 置換用に文字列を退避
list($list, $string) = util_replace_patterns_to_marker($string);
}

// -------------------- <nocmd>タグにより小窓を表示させない仕様を盛り込んでほしい -- 改 ここから
$cancelcommand = array('nocmd', 'nocmd_link');
$nocmdtag = '(' ;
foreach ($cancelcommand as $value) {
$nocmdtag .= '&lt;' . $value . '&gt;' . '|';
$nocmdtag .= '&lt;' . strtoupper($value) . '&gt;' . '|';
}
$nocmdtag = substr($nocmdtag, 0, strlen($nocmdtag)-1);
$nocmdtag .= ')?' ;

// -------------------- 改 ここまで

if (!$is_html || in_array($type, db_get_url2a_denied_list())) {
// HTMLエスケープされていない場合、 t_url2a の変換対象でない場合
// ", ', </a> がURLの後に続く場合はマッチさせない
// -------------------- <nocmd>タグにより小窓を表示させない仕様を盛り込んでほしい -- 改 ここから
// $url_pattern = 'https?:\/\/([a-zA-Z0-9\-.]+)\/?(?:[a-zA-Z0-9_\-\/.,:;~?@=+$%#!()&])*(?!["\'a-zA-Z0-9_\-\/.,:;~?@=+$%#!()&]|<\/a>)/';
$url_pattern = '/' .$nocmdtag. 'https?:\/\/([a-zA-Z0-9\-.]+)\/?(?:[a-zA-Z0-9_\-\/.,:;~?@=+$%#!()&])*(?!["\'a-zA-Z0-9_\-\/.,:;~?@=+$%#!()&]|<\/a>)/';
// -------------------- 改 ここまで
} else {
// -------------------- <nocmd>タグにより小窓を表示させない仕様を盛り込んでほしい -- 改 ここから
// $url_pattern = '/https?:\/\/([a-zA-Z0-9\-.]+)\/?(?:[a-zA-Z0-9_\-\/.,:;~?@=+$%#!()]|&amp;)*/';
$url_pattern = '/' .$nocmdtag. 'https?:\/\/([a-zA-Z0-9\-.]+)\/?(?:[a-zA-Z0-9_\-\/.,:;~?@=+$%#!()]|&amp;)*/';
// -------------------- 改 ここまで
}

$GLOBALS['_CMD']['type'] = $type;
$GLOBALS['_CMD']['target_c_member_id'] = $target_c_member_id;

$string = preg_replace_callback($url_pattern, '_smarty_modifier_t_cmd_make_url_js', $string);

if ($type === 'entry_point') {
// 退避した文字列を元に戻す
$string = str_replace(array_keys($list), array_values($list), $string);
}

return $string;
}

function _smarty_modifier_t_cmd_make_url_js($matches)
{
$url = str_replace('&amp;', '&', $matches[0]);

// -------------------- <nocmd>タグにより小窓を表示させない仕様を盛り込んでほしい -- 改 ここから
// $cmd = $matches[1];
$cmd_cancel = $matches[1];
$cmd = $matches[2];

if ($cmd_cancel) {
$url = substr_replace($url, '', 0, strlen($cmd_cancel));
//$url = substr($url, strlen($cmd_cancel), strlen($url) - strlen($cmd_cancel));

$cmd_cancel = str_replace(array("&lt;", "&gt;"), '', $cmd_cancel);
if (strcasecmp($cmd_cancel, 'nocmd') == 0){
return $url;
}else{
return pne_url2a($url);
}
}
// -------------------- 改 ここまで

// SNS内を指すURLの場合は cmd/openpne ディレクトリ以下の小窓を読み込む
$openpne_url = '';
if (strpos($url, OPENPNE_URL) === 0) {
$openpne_url = OPENPNE_URL;
} elseif (OPENPNE_USE_PARTIAL_SSL && strpos($url, OPENPNE_SSL_URL) === 0) {
$openpne_url = OPENPNE_SSL_URL;
}

if ($openpne_url) {
$url_pattern = sprintf('/^%s(?:index.php)?\?m=(\w+)&a=(\w+)((?:[a-zA-Z0-9_=]|&)*)$/', preg_quote($openpne_url, '/'));

$openpne_url_matches = array();
if (preg_match($url_pattern, $url, $openpne_url_matches)) {
$module = $openpne_url_matches[1];
$action = $openpne_url_matches[2];
$cmd = 'openpne/' . $module . '_' . $action;
}
}

$file = $cmd . '.js';
$path = './cmd/' . $file;

// ファイルが読み込めない場合は、小窓キャスト配信者のJavaScriptを読み込む
if (!is_readable($path)) {
$path = db_etc_c_cmd_url4name($cmd);
}


if (!OPENPNE_USE_CMD_TAG || !db_is_use_cmd($cmd, $GLOBALS['_CMD']['type']) || !$path) {
if (in_array($GLOBALS['_CMD']['type'], db_get_url2a_denied_list())) {
// t_url2aが無効: 何もせずに返す
return $matches[0];
} else {
// t_url2aが有効
return pne_url2a($url);
}
}

$url_html = str_replace('&', '&amp;', $url);
$result = <<<EOD
<script type="text/javascript" src="{$path}"></script>
<script type="text/javascript">
<!--
url2cmd('{$url_html}', '{$GLOBALS['_CMD']['target_c_member_id']}');
//-->
</script>
EOD;
return $result;
}

?>

Change History (0)

Note: See TracTickets for help on using tickets.