今天给领导博客的广告做了些调整。原本首页横幅广告的位置是固定的,即便进入单篇文章它也还在原地:

这种单调的布局据说非常不好,容易让访客认出广告位置,减少点击。所以应领导强烈要求,要改进一下。仔细看了看好像不太好改,因为我对joomla的架构不熟,当年对wordpress狠下功夫研究了一阵,知道各个页面大概的生命周期,所以到适当页面上增加或去除广告即可。现在joomla这个广告是我强行修改模版加上的,而joomla模版是全局组件,很难针对所显示的页面内容修改行为。于是决定避重就轻,先在新位置加上广告,然后再回来看怎么去掉旧的。选好的新位置是文章中间,准备上纯文字广告,我的第一想法是修改"阅读更多",也就是摘要标记那条线的代码,把广告夹进去了事。但领导不同意,说那个位置还是太靠近header了,和原来没啥区别。然后我又没辙了,因为除摘要以外,joomla文章的全文是一整个字符串存在数据库里的,不把框架原理搞清楚,别指望把正文掰开。

要换个思路了,既然不能直接往数据里注水,那就在编辑器上动脑筋,如果能找到编辑器向数据库输出那一点,不就找到门路了?于是各种看代码,看了小半天,无果,一团浆糊。。。意外收获是找到一篇非常不错的joomla系统开发教程:

https://docs.joomla.org/Developing_a_Model-View-Controller_Component/3.1/Introduction

跟着做下来就可以对joomla系统有个很好的认识了,不过要花些时间,而且把系统吃透之前,我的问题还是不能解决,这个很郁闷。代码搞不定,那就看看设置,休息一下,没想到这种自暴自弃的行为却一下子为我打开了突破口。无意间发现,joomla自带的tinymce编辑器有个"扩展模式":

我平时对编辑器需求不多,所以一直用着"高级"模式,现在打开扩展模式一看,好多问题就都不是问题了。首先,文中插入广告的问题,tinymce就有自定义代码插入功能:

 点击这个按钮会有选择mce代码模版的窗口弹出:

下一步就是自定义一个模版即可。这次免不了碰代码了,首先需要在/media/editors/tinymce/templates/下定义一个新的模版文件,比如google-ad-inline.html。其内容是要插入的广告代码,最好用一个div封装起来,方便做其他css处理。之后需要修改/media/editors/tinymce/templates/template_list.js文件,让它加载新建立的广告代码模版:

/**
 * Tinymce template_list.js sample file
 * @version tinymce 3.3.9
 * @package		Joomla
 * @copyright	Copyright (C) 2005 - 2013 Open Source Matters. All rights reserved.
 * @license		GNU/GPL, see LICENSE.php
 * Joomla! is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses.
 * See COPYRIGHT.php for copyright notices and details.
 */

// This list may be created by a server logic page PHP/ASP/ASPX/JSP in some backend system.
// There templates will be displayed as a dropdown in all media dialog if the "template_external_list_url"
// option is defined in TinyMCE init.

var tinyMCETemplateList = [
	// Name, URL, Description

	["Simple snippet", "media/editors/tinymce/templates/snippet1.html", 
        "Simple HTML snippet."],
	["Layout", "media/editors/tinymce/templates/layout1.html", 
        "HTMLLayout."],
	["Google页面内广告", 
        "media/editors/tinymce/templates/google-ad-inline.html", 
        "嵌入文章内的文字"]
];

其实前面两个模版是示例用,完全可以删除,于是最终文件变成这样:

var tinyMCETemplateList = [
	var id = new Date().getTime();
	// Name, URL, Description
	["Google页面内广告", 
        "media/editors/tinymce/templates/google-ad-inline.html?u=" + id, 
        "嵌入文章内的文字"]
];

最后url末尾的id是为了让地址一直变化,避免系统缓存这个文件。之后就大功告成了,光标停在文章中想插入广告的地方,点击按钮,选择广告模版即可。于是广告就可以出现在文章中任意位置了:

再回头看旧广告的删除,灵感爆发,也一下就找对了路子。原来我改动的是template的入口,index.php文件,那当然是所有页面都受影响的。现在把index.php还原,再去/components/com_content/views/category/tmpl/blog.php中最接近页面header的位置加上广告。这是分类页面的渲染器,因而对所有分类页面,包括主页都有用,唯独不影响单篇文章的article页面,这正好是我要的效果。
由这个问题的解决可以看出,搞技术真不能钻牛角尖。应该多多迂回,说不定绕着绕着,就柳暗花明了。