会员登录

联系我们

电话:18921289006

传真:0510-88804819

EMAIL: 这个 E-mail 受所垃圾邮件程序保护,您需要启用 JavaScript 才能查看。

手记

建立后台界面:
在之前的三个部分,我们已经开发了一个MVC模式的组件,并从数据库里取得数据.现在,还是没法添加数据到数据库里除非手动添加,现在将介绍如何开发一个管理单元来管理数据.
建立一个基本的框架
管理面板的基本框架类似于前台的部分.该组件的后台的主入口文件是hello.php.该文件的作用跟前台一样,默认的控制器也叫controller.php,与前台的也一样.
hello.php文件的示例代码:

<?php
/**
* @package Joomla.Tutorials
* @subpackage Components
* @link http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_4
* @license GNU/GPL
*/
// No direct access defined( '_JEXEC' ) or die( 'Restricted access' ); // Require the base controller require_once( JPATH_COMPONENT.DS.'controller.php' ); // Require specific controller if requested if($controller = JRequest::getWord('controller')) { $path = JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php'; if (file_exists($path)) { require_once $path; } else { $controller = ''; } } // Create the controller $classname = 'HellosController'.$controller; $controller = new $classname( ); // Perform the Request task $controller->execute( JRequest::getVar( 'task' ) ); // Redirect if set by the controller $controller->redirect();



hellos 模型
这个hello的模型非常简单,仅是从数据库取得数据即可,用方法getData()来实现这个效果,JModel类已经建了一个受保护的方法_getList().这个方法使了从数据库取得数据变得简单.我们仅仅是需要传递一个查询语句,一组纪录就从数据库返回.
也许我想将查询在另一个内部方法里得到应用,我们建立一个私有方法_buildQuery(),就是将查询语句传递给_getList(),这样利于将来修改.
于是我们这个类里需要两个方法getData() 和 _buildQuery().
_buildQuery()示例代码:

/**
* Returns the query
* @return string The query to be used to retrieve the rows from the database
*/
function _buildQuery() { $query = ' SELECT * ' . ' FROM #__hello ' ; return $query; }

getData()将获得查询语句然后从数据库检索得到数据,有可能在载入一页面同样的数据检索要发生两次,这将产生重复的数据库查询的操作,于是我们将忆检索的数据存入_data以防止出现重复的查询.
getData()的示例代码:

**
* Retrieves the hello data
* @return array Array of objects containing the data from the database
*/
function getData() { // Lets load the data if it doesn't already exist if (empty( $this->_data )) { $query = $this->_buildQuery(); $this->_data = $this->_getList( $query ); } return $this->_data; }



完整的模型示例:

<?php
/**
* Hellos Model for Hello World Component
*
* @package Joomla.Tutorials
* @subpackage Components
* @link http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_4
* @license GNU/GPL
*/
// Check to ensure this file is included in Joomla! defined('_JEXEC') or die(); jimport( 'joomla.application.component.model' ); /**
* Hello Model
*
* @package Joomla.Tutorials
* @subpackage Components
*/
class HellosModelHellos extends JModel { /**
* Hellos data array
*
* @var array
*/
var $_data; /**
* Returns the query
* @return string The query to be used to retrieve the rows from the database
*/
function _buildQuery() { $query = ' SELECT * ' . ' FROM #__hello ' ; return $query; } /**
* Retrieves the hello data
* @return array Array of objects containing the data from the database
*/
function getData() { // Lets load the data if it doesn't already exist if (empty( $this->_data )) { $query = $this->_buildQuery(); $this->_data = $this->_getList( $query ); } return $this->_data; } }




文件存储路径为models/hellos.php

hello的视图

现在有了从数据库检索数据,现在还差个视图,这个视图也类似于前台的视图,像前台一样我们的模型已自动实例化,后台也是如此.使用JView类的get()方法来获得我们的模型.我们的视图有三行:一个从模型取得数据,一个将数据传送给模板,第三个调用显示方法来显示输出.

<?php
/**
* Hellos View for Hello World Component
*
* @package Joomla.Tutorials
* @subpackage Components
* @link http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_4
* @license GNU/GPL
*/
// Check to ensure this file is included in Joomla! defined('_JEXEC') or die(); jimport( 'joomla.application.component.view' ); /**
* Hellos View
*
* @package Joomla.Tutorials
* @subpackage Components
*/
class HellosViewHellos extends JView { /**
* Hellos view display method
* @return void
**/
function display($tpl = null) { JToolBarHelper::title( JText::_( 'Hello Manager' ), 'generic.png' ); JToolBarHelper::deleteList(); JToolBarHelper::editListX(); JToolBarHelper::addNewX(); // Get data from the model $items =& $this->get( 'Data'); $this->assignRef( 'items', $items ); parent::display($tpl); } }



上面这段代码存储为/hellos/view.html.php;


阅读全文:joomla组件开发之四--管理后台

类别:开发手记 发布于 2013-01-25, 周五 16:37 作者 Super User 点击数:3028

在使用JOOMLA的Virtuemart的过程中,发现在添加产品时的关联商品有一个问题。关联只是单向的,那样就产生一个问题,如果在后期大量添加新产品时,只能让新的关联老的,如果让旧有商品同时也关联该新产品,必须去这个产品进行重新編辑,如果产品过多,这无疑工作量是非常大的。

如果能让新产品添加时能让老产品自动相互关联,这就要更改代码来实现,先查看了数据库VM的关联商品的表里面的关联结构,是一个商品的ID对应关联商品用|相隔。如果我在添加新产品时,添加进新产品的ID的相关联商品后,然后用将他对应的商品ID一个一个的进这个数据库进行检索。如果检索不到,插进关联。如果检索得到

则将其对应的产品ID取出再进行确认,如果已经存在,刚放过(虽然不可能存在,但还是检测一下好),如果不存在,则在尾部添加此ID,替换之前的数据。

找到administrator/components/com_virtuemart/class/ps_product.php打开,找到370行:

if( !empty($d["related_products"])) {
/* Insert Pipe separated Related Product IDs */
$related_products = vmGet( $d, "related_products" );
$q  = "INSERT INTO #__{vm}_product_relations ";
$q .= "(product_id, related_products) ";
$q .= "VALUES ('".$d["product_id"]."','".$db->getEscaped($related_products)."')";
$db->setQuery($q); $db->query();
$related_products_a = explode('|',$related_products);
$db3 =new ps_DB;
foreach ($related_products_a as $related_products_b){
$db->query("SELECT related_products FROM #__{vm}_product_relations WHERE product_id='$related_products_b'");
if($db->next_record()) {
$related_products_c = explode("|", $db->f("related_products"));
if (!in_array($d["product_id"],$related_products_c)){
$related_products_c[]=$d["product_id"];
$related_products_d=implode('|',$related_products_c);
$q  = "REPLACE INTO #__{vm}_product_relations (product_id, related_products)";
$q .= " VALUES( '".$related_products_b."', '$related_products_d') ";
$db3->query($q);
}
}else{
$q  = "INSERT INTO #__{vm}_product_relations ";
$q .= "(product_id, related_products) ";
$q .= "VALUES ('".$related_products_b."','".$db->getEscaped($d["product_id"])."')";
$db3->setQuery($q); $db3->query();
}
}

}

将以上语句代替之前的代码。便可实现关联商品的相互关联

阅读全文:JOOMLA的vm商城的关联商品更改手记

类别:开发手记 发布于 2013-01-25, 周五 16:36 作者 Super User 点击数:2503

该模块还是属于测试中,模块可以显示文章或者Virtuemart商城组件的产品的图片滚动slideshow的效果。

Nhuang SlideShow

阅读全文:joomla文章、商城图片滚动模块展示

类别:开发手记 发布于 2013-01-25, 周五 16:35 作者 Super User 点击数:3190

 

因为想做了一个mall.huang.com的商城网。为了实现nhuang.com里的会员共享到mall.nhuang.com里面去,于是就需要一个认证插件,当用户在mall.nhuang.com里用nhuang用户名登陆的时候,就需要到nhuang.com的数据库里的用户表里进行认证。

到plugins里的authentication表里打开本来的joomla自有的认证插件,当然将它复制一下,修改xml里相关名称,用一个全新的,便如nhuang,这样就可以省却写多余的代码的功夫。

打开另外一个JOOMLA的PHP文件,先把文件名改了,再打开文件将里的类名称也改了,构造函数的当然也要改,找到onAuthenticate函数,

 

$options = array('driver'=>'mysql','host'=>'数据库主机一般也是localhost','user'=>'用户名','password'=>'数据库用户实际密码','database'=>'数据库名','prefix'=>'前缀');
 $db =& JDatabase::getInstance($options);
 $query = 'SELECT `id`, `password`, email,name,`gid`'
 . ' FROM `#__users`'
 . ' WHERE username=' . $db->Quote( $credentials['username'] )
 ;

 

把这段代码替换掉之前的它的认证方法,他是直接到数据库里进行认证的。现在必须是到新数据库,也就是我的nhuang.com数据库里yufi_users里进行用户认证。

然后找到这一段,

$user = JUser::getInstance($result->id); // Bring this in line with the rest of the system
 $response->email = $user->email;
 $response->fullname = $user->name;

将里面的$user = JUser::getInstance($result->id)删掉,然后将$user改成$result也就是$result->email,$result->name.

 

这样将这两个文件再压缩,到mall.nhuang.com的后台安装插件,发布它,OK,成功。

 

阅读全文:实现两个JOOMLA网站的会员的通信

类别:开发手记 发布于 2013-01-25, 周五 16:33 作者 Super User 点击数:2856

joomla消息提示,例如登录不成功时出现的账号错误提示,是以模块方式显示的。效果显示不是那么太美观,为了在不修改心文件的基础上实现弹出框 提示的效果。只有对模板稍微修改一下了。

1.打开默认模板文件的css文件,一般是tmplates.css,找到#system-message,如果没有则添加一个,插入属 性:display:none;

2.打开模板的index.php,找到<jdoc:include type=”message”/>先删掉,再把下面的代码粘贴到最下面也就是</body>的前面,


<?php if ($this->getBuffer(‘message’)){?> <jdoc:include type="message" /> <script type="text/javascript" language="javascript"> var nhmessage = document.getElementById("system-message").innerHTML; sAlert(nhmessage,this);

function sAlert(txt){ //var eSrc=(document.all)?window.event.srcElement:arguments[1]; var eSrc = window; var shield = document.createElement("DIV"); shield.id = "shield"; shield.style.position = "absolute"; shield.style.left = "0px"; shield.style.top = "0px"; shield.style.width = "100%"; shield.style.height = ((document.documentElement.clientHeight>document.documentElement.scrollHeight)?document.documentElement.clientHeight:document.documentElement.scrollHeight)+"px"; shield.style.background = "#333"; shield.style.textAlign = "center"; shield.style.zIndex = "10000"; shield.style.filter = "alpha(opacity=0)"; shield.style.opacity = 0; var alertFram = document.createElement("DIV"); alertFram.id="alertFram"; alertFram.style.position = "absolute"; alertFram.style.left = "50%"; alertFram.style.top = "50%"; alertFram.style.marginLeft = "-225px" ; alertFram.style.marginTop = -75+document.documentElement.scrollTop+"px"; alertFram.style.width = "450px"; alertFram.style.height = "150px"; alertFram.style.background = "#ccc"; alertFram.style.textAlign = "center"; alertFram.style.lineHeight = "150px"; alertFram.style.zIndex = "10001"; strHtml  = "<div style=\"list-style:none;margin:0px;padding:0px;width:100%\">\n"; strHtml += "    <div style=\"background:#658BB2;text-align:left;padding-left:10px;font-size:14px;font-weight:bold;height:25px;line-height:25px;border:1px solid #336699;color:#fff;\">系统提示</div>\n"; strHtml += "    <div style=\"background:#fff;text-align:center;font-size:12px;height:120px;line-height:120px;border-left:1px solid #336699;border-right:1px solid #336699;\"><dl id=\"system-message\" style=\"display:inline;\">"+txt+"</dl></div>\n"; strHtml += "    <div style=\"background:#fff;text-align:center;font-weight:bold;height:25px;line-height:25px;border:1px solid #336699;border-top-width:0;\"><input type=\"button\" value=\"确 定\" id=\"do_OK\" onclick=\"doOk()\" /></div>\n"; strHtml += "</div>\n"; alertFram.innerHTML = strHtml; document.body.appendChild(alertFram); document.body.appendChild(shield); this.setOpacity = function(obj,opacity){ if(opacity>=1)opacity=opacity/100; try{ obj.style.opacity=opacity; }catch(e){} try{ if(obj.filters.length>0&&obj.filters("alpha")){ obj.filters("alpha").opacity=opacity*100; }else{ obj.style.filter="alpha(opacity=\""+(opacity*100)+"\")"; } }catch(e){} } var c = 0; this.doAlpha = function(){ if (++c > 20){clearInterval(ad);return 0;} setOpacity(shield,c); } var ad = setInterval("doAlpha()",1); this.doOk = function(){ //alertFram.style.display = "none"; //shield.style.display = "none"; document.body.removeChild(alertFram); document.body.removeChild(shield); eSrc.focus(); document.body.onselectstart = function(){return true;} document.body.oncontextmenu = function(){return true;} } document.getElementById("do_OK").focus(); eSrc.blur(); document.body.onselectstart = function(){return false;} document.body.oncontextmenu = function(){return false;} } </script> <?php }?>

这样就可以实现弹出式效果,如果模板有<jdoc:include type="modules" name="debug" />,代码一定也要在它前面,否则弹出消息提示后,摁确定后,页面须重新刷新一下再可以用,不然鼠标不能点击

阅读全文:实现joomla消息提示弹出式效果

类别:开发手记 发布于 2013-01-25, 周五 16:32 作者 Super User 点击数:2542

 

想用JOOMLA架设一个中小学校或者幼儿园了的网站,学校新闻功能可以直接用joomla文章,学校风采图片和视频JOOMLA也有不少视频和相册组件来解决。学校网站前台应该有三种会员机制,一个就是老师,登录后可以针对本班学生的成绩,评语,还有课程安排,或者临时活动,特别是对本班学生家长的短信息的发送。学生可以登录,可以查阅课程安排,查看成绩。家长登录是也是查看学生的成绩,在线发送请假需求。家长和家长之间的沟通。短信发送功能,发送模块可以整合现在许多网站的提供的短信平台,不需要特别去移动或者联通公司特别申请。

这样的话,应该开发一个包含这些功能的一个课程管理组件。

阅读全文:关于用JOOMLA架设中小学校网站的一些思路

类别:开发手记 发布于 2013-01-25, 周五 16:31 作者 Super User 点击数:2589

以下开发内容来自官网的开发手册。

我们要做的是建一个其于模块-显示-控制器结构的MVC组件,简单的在前台显示“你好,南荒";

网站目录/components/com_nh/nh.php。

如上所示,在网站目录componetns新建一个目录叫com_nh目录,然后在该目录下在新建一个文件nh.php,包含输出内容:你好南荒,

代码如下:<?php echo "hi,nhuang";?>

我们可以在浏览器输入了"你的网址/index.php?option=com_nh"来测试内空是否有正常显示。

后台显示

刚刚上面的是前台显示的内容,我们同时还要新建一个后台管理界面。administrator/components/com_nh/nh.php

然后也输入上面的内容。当然随便你输入什么内容都可以,

这个可以在网址/administrator/components/com_nh/nh.php,用浏览器打开测试一下。

安装文件制作

在本地新建一个目录,要你喜欢的编辑器新建以下文件,

以上新建对应目录和文件,最后面的0.0.1.sql是一个空文件,是用来设置这个组件版本的概要。其中几个index.php也是空文件,当用户直接输入这个目录访问时只打开一个空白显示。                          

将上面的文件新建压缩后,在JOOMLA后台安装,你会在后台的组件扩展菜单里发现该组件的身影。当然你也可以直接下载测试,下载地址:

archive下载

自己新建的话,nh.xml包含的安例内容如下:

<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="1.6.0" method="upgrade">

<name>NH南荒</name>
<!-- The following elements are optional and free of formatting conttraints -->
<creationDate>November 2009</creationDate>
<author>John Doe</author>
<authorEmail> 这个 E-mail 受所垃圾邮件程序保护,您需要启用 JavaScript 才能查看。 </authorEmail>
<authorUrl>http://www.example.org</authorUrl>
<copyright>Copyright Info</copyright>
<license>License Info</license>
<!-- The version string is recorded in the components table -->
<version>0.0.1</version>
<!-- The description is optional and defaults to the name -->
<description>Description of the Hello World component ...</description>

<update> <!-- Runs on update; New in 1.6 -->
<schemas>
<schemapath type="mysql">sql/updates/mysql</schemapath>
</schemas>
</update>

<!-- Site Main File Copy Section -->
<!-- Note the folder attribute: This attribute describes the folder
to copy FROM in the package to install therefore files copied
in this section are copied from /site/ in the package -->

<files folder="site">
<filename>index.html</filename>
<filename>nh.php</filename>
</files>

<administration>
<!-- Administration Menu Section -->
<menu>Hello World!</menu>
<!-- Administration Main File Copy Section -->
<!-- Note the folder attribute: This attribute describes the folder
to copy FROM in the package to install therefore files copied
in this section are copied from /admin/ in the package -->

<files folder="admin">
<!-- Admin Main File Copy Section -->
<filename>index.html</filename>
<filename>nh.php</filename>
<!-- SQL files section -->
<folder>sql</folder>
</files>
</administration>

</extension>

<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="1.6.0" method="upgrade">

<name>Hello World!</name>
<!-- The following elements are optional and free of formatting conttraints -->
<creationDate>November 2009</creationDate>
<author>John Doe</author>
<authorEmail> 这个 E-mail 受所垃圾邮件程序保护,您需要启用 JavaScript 才能查看。 </authorEmail>
<authorUrl>http://www.example.org</authorUrl>
<copyright>Copyright Info</copyright>
<license>License Info</license>
<!-- The version string is recorded in the components table -->
<version>0.0.1</version>
<!-- The description is optional and defaults to the name -->
<description>Description of the Hello World component ...</description>

<update> <!-- Runs on update; New in 1.6 -->
<schemas>
<schemapath type="mysql">sql/updates/mysql</schemapath>
</schemas>
</update>

<!-- Site Main File Copy Section -->
<!-- Note the folder attribute: This attribute describes the folder
to copy FROM in the package to install therefore files copied
in this section are copied from /site/ in the package -->

<files folder="site">
<filename>index.html</filename>
<filename>helloworld.php</filename>
</files>

<administration>
<!-- Administration Menu Section -->
<menu>Hello World!</menu>
<!-- Administration Main File Copy Section -->
<!-- Note the folder attribute: This attribute describes the folder
to copy FROM in the package to install therefore files copied
in this section are copied from /admin/ in the package -->

<files folder="admin">
<!-- Admin Main File Copy Section -->
<filename>index.html</filename>
<filename>helloworld.php</filename>
<!-- SQL files section -->
<folder>sql</folder>
</files>
</administration>

</extension>

在两个nh.php文件里输入前面提的内空,当然你也可以输些别的。

index.html 的源代码包含

<html><body bgcolor="#FFFFFF"></body></html>

这样就完成了一个简单的JOOMLA1.6的测试组件,你可以通过网站/index.php?option=com_nh来访问前台内容,如果你是直接下载的那个整装包里,那你就要访问index.php?option=com_helloworld。

阅读全文:JOOMLA1.6组件开发案例——第一步

类别:开发手记 发布于 2013-01-25, 周五 16:30 作者 Super User 点击数:2767