有很多博主都会将一篇博文发在几个网站,毕竟写篇原创不易,多发几个地方就多些读者,也有的这样做是为了备份。但是从一个网站直接将博文拷贝到另一个网站对有的摄影博主来讲效果并不理想,因为这样做的话博文中的图片并没有和博文的内容一起拷贝到第二个网站。这样的博文也不会出现在各种摄影模块里因为那些模块只选择含有本地图片的博文。本文讨论既相关又独立的两个问题:如何在日志编辑器的工具栏里添加两个按钮,一个将远程日志内容拷贝到编辑器里,另一个将日志里的远程图片都下载到本地,并使得日志内容指向下载的本地图片。
1。导入图片
Discuz在论坛编辑器和文章编辑器里都提供了下载远程图片到本地的功能(需在管理中心对选定的用户组设置后才能使用论坛编辑器:用户->用户组->选择用户组编辑->论坛相关->贴子相关->允许下载远程图片: 远程图片本地化保存),唯独日志编辑器里缺少这个功能。下面我们介绍下在日志编辑器里添加这个功能的步骤。
1)在日志编辑器的工具栏里添加"下载远程图片"按钮: 将文件 source/module/home/home_editor.php 里的这段
改为:
2)修改对点击该按钮的事件处理代码使之兼顾文章编辑器和日志编辑器。将文件 static/image/editor/editor_function.js 中的函数 downRemoteFile
function downRemoteFile() {
edit_save();
var formObj = $("articleform");
var oldAction = formObj.action;
formObj.action = "portal.php?mod=portalcp&ac=upload&op=downremotefile";
formObj.onSubmit = "";
formObj.target = "uploadframe";
formObj.submit();
formObj.action = oldAction;
formObj.target = "";
}
改为:
function downRemoteFile() {
edit_save();
var formObj = $("articleform");
if (formObj != null) {
var oldAction = formObj.action;
formObj.action = "portal.php?mod=portalcp&ac=upload&op=downremotefile";
}
else {
formObj = $("ttHtmlEditor");
var oldAction = formObj.action;
formObj.action = "home.php?mod=spacecp&ac=upload&op=downremotefile";
}
formObj.onSubmit = "";
formObj.target = "uploadframe";
formObj.submit();
formObj.action = oldAction;
formObj.target = "";
}
注意这里设定了在日志编辑器里点击该按钮后将编辑器里的内容提交给了服务器的 home.php?mod=spacecp&ac=upload&op=downremotefile 来处理,并将处理结果交给编辑器所在网页的一个名叫 uploadframe 的 iframe。接下来两步设置了与之配套的代码。
3)添加服务器对在日志编辑器里点击该按钮后提交的编辑器里的内容的处理。这是这个功能的关键部分,在这里下载了远程图片并换了日志里远程图片的链接。在文件 source/include/spacecp/spacecp_upload.php 开始部分
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}
后添加一段:
if($_GET['op']=='downremotefile') {
if(submitcheck('blogsubmit') && helper_access::check_module('blog')) {
$upload = new discuz_upload();
$arrayimageurl = $temp = $imagereplace = array();
$string = $_GET['message'];
preg_match_all("/\/ismUe", $string, $temp, PREG_SET_ORDER);
if(is_array($temp) && !empty($temp)) {
foreach($temp as $tempvalue) {
$tempvalue[2] = str_replace('\"', '', $tempvalue[2]);
if(strlen($tempvalue[2])){
$arrayimageurl[] = $tempvalue[2];
}
}
$arrayimageurl = array_unique($arrayimageurl);
if($arrayimageurl) {
foreach($arrayimageurl as $tempvalue) {
$imageurl = $tempvalue;
$imagereplace['oldimageurl'][] = $imageurl;
$attach['ext'] = $upload->fileext($imageurl);
if(!$upload->is_image_ext($attach['ext'])) {
continue;
}
$content = '';
if(preg_match('/^(https?:\/\/|\.)/i', $imageurl)) {
$content = dfsockopen($imageurl);
}
if(empty($content)) continue;
$temp = explode('/', $imageurl);
$attach['name'] = trim($temp[count($temp)-1]);
$_G['setting']['allowwatermark'] = 0;
$attach = stream_save($content, 0, 'jpg', $attach['name'], '', 0);
$attachs[] = daddslashes($attach);
$attach['url'] = ($attach['remote'] ? $_G['setting']['ftp']['attachurl'] : $_G['setting']['attachurl']).'album/';
$imagereplace['newimageurl'][] = $attach['url'].$attach['filepath'];
}
}
}
if($imagereplace) {
$string = preg_replace(array("/\<(script|style|iframe)[^\>]*?\>.*?\<\/(\\1)\>/si", "/\]*?\>/si"), '', $string);
$string = str_replace($imagereplace['oldimageurl'], $imagereplace['newimageurl'], $string);
$string = str_replace(array("\r", "\n", "\r\n"), '', addcslashes($string, '/"\\\''));
print <<
var f = parent.window.frames["uchome-ifrHtmlEditor"].window.frames["HtmlEditor"];
f.document.body.innerHTML = '$string';
EOF;
}
exit();
}
}
4)在日志编辑器所在网页添加一个 iframe 来接受服务器处理结果。在文件 template/default/home/spacecp_blog.htm 的最下方的 javascript 代码
前添加
2。导入日志
1)添加新按钮所用汉字和相应对话框里的汉字。在文件 source/language/home/lang_editor.php 里添加:
'editor_download_blog' => '下载远程日志',
'editor_prompt_bloglink' => '请输入日志 URL 地址',
2)添加新按钮所用图标。在文件夹 static/image/editor 里加入图片文件 download_blog.gif:
3)在日志编辑器的工具栏里添加新按钮。在文件 source/module/home/home_editor.php 里加入 (可以加在前述"下载远程图片"按钮的后面):
4)添加点击该按钮后出现的填写远程日志URL的对话框。在文件 source/module/home/home_editor.php 里这段
后添加:
5)添加在点击该按钮后显示对话框的代码。在文件 static/image/editor/editor_base.js 里添加下面的函数:
function downloadBlog(e, show) {
if (typeof show == 'undefined') {
var urlObj = $('insertBlogUrl');
var sURL = urlObj.value;
if ((sURL != null) && (sURL != "http://")) {
parent.downRemoteBlog(sURL);
}
fHide($('downloadBlogBox'));
urlObj.value = 'http://';
} else {
if (gIsIE) {
var e = window.event;
}
getCaret();
var dvUrlBox = $("downloadBlogBox");
var iX = e.clientX;
var iY = e.clientY;
dvUrlBox.style.display = "";
dvUrlBox.style.left = (iX - 300) + "px";
dvUrlBox.style.top = 33 + "px";
}
}
6)添加当用户在对话框里填写了远程日志URL并点击确定按钮后,提交该URL给服务器的代码。在文件 static/image/editor/editor_function.js 里添加下面这个函数:
function downRemoteBlog(url) {
edit_save();
var formObj = $("ttHtmlEditor");
var oldAction = formObj.action;
formObj.action = "home.php?mod=spacecp&ac=upload&op=downremoteblog&blogurl=" + encodeURIComponent(url);
formObj.onSubmit = "";
formObj.target = "uploadframe";
formObj.submit();
formObj.action = oldAction;
formObj.target = "";
}
7)添加服务器对在日志编辑器里点击该按钮后提交的编辑器里的内容的处理。在文件 source/include/spacecp/spacecp_upload.php 开始部分
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}
后添加一段:
if($_GET['op']=='downremoteblog') {
if(submitcheck('blogsubmit') && helper_access::check_module('blog')) {
$subject = $_GET['subject'];
$string = $_GET['message'];
$blogurl = $_GET['blogurl'];
$doc = new DOMDocument;
$doc->loadHTMLFile($blogurl);
$xpath = new DOMXPath($doc);
$entries = $xpath->query('//h1[@class="ph"]');
foreach($entries as $entry) {
$blogSubject = $entry->nodeValue;
}
$entries = $xpath->query('//div[@id="blog_article"]');
foreach($entries as $entry) {
$blogContent = get_inner_html($entry);
}
if($blogContent) {
$subject .= $blogSubject;
$subject = str_replace(array("\r", "\n", "\r\n"), '', addcslashes($subject, '/"\\\''));
$string .= preg_replace("/\/ismUe", "get_image_tag('\\2', '$blogurl')", $blogContent);
$string = str_replace(array("\r", "\n", "\r\n"), '', addcslashes($string, '/"\\\''));
print <<
parent.window.document.getElementById('subject').value = "$subject";
var f = parent.window.frames["uchome-ifrHtmlEditor"].window.frames["HtmlEditor"];
f.document.body.innerHTML = "$string";
EOF;
}
exit();
}
}
8)在文件 source/include/spacecp/spacecp_upload.php 里添加几个上面用到的函数:
// http://php.net/manual/de/class.domelement.php
function get_inner_html( $node ) {
$innerHTML= '';
$children = $node->childNodes;
foreach ($children as $child) {
$innerHTML .= $child->ownerDocument->saveXML( $child );
}
return $innerHTML;
}
// http://99webtools.com/blog/convert-relative-path-into-absolute-url/
function rel2abs($rel, $base) {
if(strpos($rel,"//")===0) return "http:".$rel;
if (parse_url($rel, PHP_URL_SCHEME) != '') return $rel;
if ($rel[0]=='#' || $rel[0]=='?') return $base.$rel;
extract(parse_url($base));
$path = preg_replace('#/[^/]*$#', '', $path);
if ($rel[0] == '/') $path = '';
$abs = "$host$path/$rel";
$re = array('#(/.?/)#', '#/(?!..)[^/]+/../#');
for($n=1; $n>0; $abs=preg_replace($re, '/', $abs, -1, $n)) {}
return $scheme.'://'.$abs;
}
function get_image_tag($imageurl, $baseurl) {
return "";
}
9)(如果没做第一部分修改的话) 在日志编辑器所在网页添加一个 iframe 来接受服务器处理结果(与第一部分的4)相同)。
最后总结一下。在日志编辑器的工具栏里添加了"下载远程日志"和"下载远程图片"这两个按钮后,博主可以这样来将发表在其它网站的博文拷贝到本网站:
1)在博文列表页里点击"发表新日志"按钮
2)点击"下载远程日志"按钮,在对话框里填写要下载的其它网站的博文的网址
3)点击"下载远程图片"按钮
4)点击"保存发布"按钮
3/20/2016 补充: 导入日志和评论
HQ问及能否在导入日志时同时导入日志后的评论。 下面讨论下如何修改第二部分来添加一个同时导入评论的选项:
1)修改第二部分中的1): 添加对话框里的汉字。在原来在文件 source/language/home/lang_editor.php 内添加的内容后加上:
'editor_prompt_includecomments' => '同时下载评论',
2)修改第二部分中的4): 添加点击该按钮后出现的填写远程日志URL的对话框。将原来在文件 source/module/home/home_editor.php 里添加的内容改为 :
3)修改第二部分中的5): 添加在点击该按钮后显示对话框的代码。将原来在文件在文件 static/image/editor/editor_base.js 里添加的函数 downloadBlog 改为:
function downloadBlog(e, show) {
if (typeof show == 'undefined') {
var sURL = $('insertBlogUrl').value;
var includeComments = ($('includeComments').checked)?1:0;
if ((sURL != null) && (sURL != "http://")) {
parent.downRemoteBlog(sURL, includeComments);
}
fHide($('downloadBlogBox'));
$('insertBlogUrl').value = 'http://';
} else {
if (gIsIE) {
var e = window.event;
}
getCaret();
var dvUrlBox = $("downloadBlogBox");
var iX = e.clientX;
var iY = e.clientY;
dvUrlBox.style.display = "";
dvUrlBox.style.left = (iX - 300) + "px";
dvUrlBox.style.top = 33 + "px";
}
}
4)修改第二部分中的6): 添加当用户在对话框里填写了远程日志URL并点击确定按钮后,提交该URL给服务器的代码。将原来在文件 static/image/editor/editor_function.js 里添加的函数 downRemoteBlog 改为:
function downRemoteBlog(url, includeComments) {
edit_save();
var formObj = $("ttHtmlEditor");
var oldAction = formObj.action;
formObj.action = "home.php?mod=spacecp&ac=upload&op=downremoteblog&blogurl=" + encodeURIComponent(url) + "&includecomments=" + includeComments;
formObj.onSubmit = "";
formObj.target = "uploadframe";
formObj.submit();
formObj.action = oldAction;
formObj.target = "";
}
5)修改第二部分中的7): 添加服务器对在日志编辑器里点击该按钮后提交的编辑器里的内容的处理。将原来在文件 source/include/spacecp/spacecp_upload.php 里添加的内容改为:
if($_GET['op']=='downremoteblog') {
if(submitcheck('blogsubmit') && helper_access::check_module('blog')) {
$subject = $_GET['subject'];
$string = $_GET['message'];
$blogurl = $_GET['blogurl'];
$doc = new DOMDocument;
$doc->loadHTMLFile($blogurl);
$docbase = $blogurl;
foreach($doc->getElementsByTagName('base') as $base)
{
$docbase = $base->getAttribute('href');
}
dom_rel2abs($doc, $docbase);
$xpath = new DOMXPath($doc);
$entries = $xpath->query('//h1[@class="ph"]');
foreach($entries as $entry) {
$blogSubject = $entry->nodeValue;
}
$entries = $xpath->query('//div[@id="blog_article"]');
foreach($entries as $entry) {
if(empty($blogContent)) $blogContent = get_inner_html($entry);
}
if($blogContent) {
$subject = $blogSubject;
$subject = str_replace(array("\r", "\n", "\r\n"), '', addcslashes($subject, '/"\\\''));
$string = $blogContent;
if($_GET['includecomments']) {
$commentCount = 0;
// get comment count
$entries = $xpath->query('//span[@id="comment_replynum"]');
foreach($entries as $entry) {
$commentCount = $entry->nodeValue;
}
$string .= '
' . lang('home/template', 'comment');
$string .= ' (' . $commentCount . lang('home/template', 'blog_replay') . ')
';
$comments = '';
// entry page may not be the first page
$nextPageUrl = get_first_page($blogurl, $docbase);
// loop through all comment pages
while ($nextPageUrl) {
$doc = new DOMDocument;
$doc->loadHTMLFile($nextPageUrl);
dom_rel2abs($doc, $docbase);
$xpath = new DOMXPath($doc);
$entries = $xpath->query('//div[@id="comment_ul"]');
foreach($entries as $entry) {
$comments .= preg_replace("/(.*?)<\/span>/is", "", get_inner_html($entry));
}
$nextPageUrl = get_next_page($doc);
}
if ($commentCount && $comments) $string .= '' . $comments . '
';
}
$string = str_replace(array("\r", "\n", "\r\n"), '', addcslashes($string, '/"\\\''));
print <<
parent.window.document.getElementById('subject').value = "$subject";
var f = parent.window.frames["uchome-ifrHtmlEditor"].window.frames["HtmlEditor"];
f.document.body.innerHTML = "$string";
EOF;
}
exit();
}
}
6)在文件 source/include/spacecp/spacecp_upload.php 里再添加三个上面用到的函数:
function dom_rel2abs($doc, $docbase) {
$imgs = $doc->getElementsByTagName('img');
foreach($imgs as $img) {
$src = $img->getAttribute('src');
$img->setAttribute('src', rel2abs($src, $docbase));
}
$as = $doc->getElementsByTagName('a');
foreach($as as $a) {
$href = $a->getAttribute('href');
$a->setAttribute('href', rel2abs($href, $docbase));
}
}
function get_next_page($pageDoc) {
$xpath = new DOMXPath($pageDoc);
$entries = $xpath->query('//div[@class="pg"]/*');
$getnext = false;
foreach($entries as $entry) {
if ($getnext) {
if ($entry->nodeName=='a') {
return $entry->getAttribute('href');
}
break;
}
if ($entry->nodeName=='strong') $getnext = true;
}
return NULL;
}
function get_first_page($blogurl, $docbase) {
$doc = new DOMDocument;
$doc->loadHTMLFile($blogurl);
dom_rel2abs($doc, $docbase);
$xpath = new DOMXPath($doc);
$entries = $xpath->query('//div[@class="pg"]/*');
$firstpage = true;
foreach($entries as $entry) {
if ($entry->nodeValue=='1') {
if ($firstpage) {
return $blogurl;
}
if ($entry->nodeName=='a') {
return $entry->getAttribute('href');
}
}
$firstpage = false;
continue;
}
return $blogurl;
}
代码下载:
http://www.bian-wang.com/upload/txgz_import_image_and_blog_160408.zip
注:本文中的代码里的<符号如果后面的字符是a的话,在它们中间加了一个不应该有的空格,以避免Discuz在保存日志时自动改变日志内容。