开发人员常见问题

本FAQ包含了新的CMS Made Simple开发人员常见问题。 开发者在forge提问之前应该先看这些问题的解答。

Q: 在我的页面或模版中如何引入外部的PHP程序?

在我的旧网站中有一个脚本程序或PHP代码片断,我想把它引入到新的CMS页面,我该如何做?

A1: 使用用户自定义标签 (推荐该方法)

你可以创建一个用户自定义标签(在管理控制台的 Extensions >> User Defined Tags 下面),并在这里自定义标签中引入PHP代码。例如:创建一个名字叫my_phpinfo的自定义标签,并在该标签中放置如下代码

  phpinfo();  //(notice that the <?php and ?> tags aren't necessary).

然后在你的页面中使用下面的语法调用该脚本:

  {my_phpinfo}

在自定义标签中你可以使用任意有效的PHP代码,包括使用"include"命令引入外部的脚本,你也有权访问所有的CMS API和全局变量。这种方法是推荐引入PHP代码的方法,因为你可以通过权限控制模块来防止其他人员编辑这些代码。

A2: 使用 {php} 和 {/php} 标签

第二种方法是在你的页面或模板中使用{php}{/php}标签来引入PHP代码(使用该语法你不需要<?php 和 ?> 标签)。但是该方法在缺省安装的情况下是禁止使用的。

为了使用该功能,你必须将config.php中的 "use_smarty_php_tags" 设置为 true。例如:

  #Allow smarty {php} tags?  These could be dangerous if you don't trust your users.
  $config['use_smarty_php_tags'] = true;

现在你就可以在页面或模版中使用{php}{/php}标签引入PHP代码了。例如:

  {php}phpinfo();{/php}

提示: 不推荐使用该方法来引入外部PHP代码,因为任何用户都可能编辑页面或模版,用户可能就会引入不安全的代码,从而造成安全隐患。请使用用户自定义标签引入外部PHP代码。

Q: 为什么Smarty Modifiers不工作

在我的模板中有下面这样的标签,但是该标签不生效,哪儿出错了?

  {content | lower}

A: Because smarty isn't that smart about spaces

Smarty使用空格作为标签属性的指示分隔符,而modifier则使用字符“|”作为指示分隔符,因此在该示例中“| lower”被看作是标签"content"的一个属性。将上面代码中的空白字符去掉即可:

  {content|lower}

Q: 为什么我不能使用FTP删除图片和模块?

有一些用户,通常是那些习惯了Windows环境的人会奇怪当使用FTP登录到Web服务器的时候为什么不能删除某些文件。通常是那些模块和uploads目录。

A: 用户不能删除其它用户的文件

但是,它们是我的文件啊!

不,你将要删除的文件不是你的文件。对不起,扯远了,这些都是Unix系统的事情。

大多数提供PHP支持的Web服务器都使用Unix或Unix-like(类Unix系统,例如Linux)风格的系统,通常Web服务进程都是使用一个特殊的帐户(类似nobody,apache,httpd等这样的用户名)来运行。Web服务进程创建的文件缺省情况下不能被其它用户删除,类似地,httpd进程也不能将文件写入其它用户的目录。这是很好的安全平衡方式,但是也导至了FTP用户不能删除图片和模块这样的问题。

当一个文件从Web页面上传到uploads目录后,或者模块或主题被使用上传的XML文件展开后,这些文件的拥有者是运行httpd进程的那个用户(而不是你的FTP用户),这些文件的默认权限是由运行httpd进程的那个用户的umask值决定的,一般情况下其它用户对这些上传的文件都只有只读权限,其它用户不能修改或删除它们。

那么,我如何解决该问题?

恩,需要从两方面的解决该问题。

1) 对于你以后将要上传的文件,通过在CMS Made Simple的站点设置来调节新建目录及文件的属性掩码值(umask)来解决。调节httpd进程的umask值将影响新创建的文件或目录的权限。简单地说,文件权限是这样计算的:

   文件权限 = 0777 - umask

例如:如果你的umask值是0022,那么新创建的目录权限是0777 - 0022 = 0755,文件也将有相似的权限,但是他没有执行权限,即文件的权限是0644。

(也就是说,要直接用FTP用户删除文件,在CMS Made Simple的站点设置中的umask值必须设置为0000,不推荐使用)

关于Unix文件的权限,下面有一个详细的教程供你参考: [1]

2) 对于你已经上传的而不能删除的文件,必须使用httpd进程的拥有者来提升它们的权限,也就是说要删除这些文件,我们不得不运行一些特殊的PHP脚本。在CMS made simple 1.0中有一个可以改变模块权限(甚至删除)的脚本已经加入。不管怎样,它是一个在子目录中遍历所有文件并递归地打开所有文件的脚本,如果你找不到该脚本,请联系calguy1000获取(希望如此,否则你只能自己写一份了哈哈)。

其它选择

如果你的CMS Made Simple运行在你可以登录到操作系统的环境中,并且你拥有CMSMS(PHP)文件,那么文件和目录问题就变的非常简单了。你只需要登录到系统,将所有文件的拥有者修改成的帐户,并将他们的权限修改成755/644,你就可以删除它们了。

我能够在一个插件中访问一个模块吗? =

我正在写一个插件或一个用户自定义标签,我真的很希望能够使用XYZ模块的接口,我如何做呢?

Answer: 是的, 通过 $gCms->modules

在全局对象$gCms中有一个所有已经安装的模块的列表(至少是那些具有前端功能的模块),你可以象下面这样来访问他们:

  global $gCms;
  if( !isset( $gCms->modules['TheModuleIWant'] ) || !isset( $gCms->modules['TheModuleIWant']['object'] ) )
    {
       return;
    }
  $themoduleiwant = $gCms->modules['TheModuleIWant']['object'];
  $themoduleiwant->DoThis($somedata);
  $themoduleiwant->DoThat($somemoredata);

这可能不是最好的处理方法,因为你不确定你所访问的模块是否已经安装。但是至少你已经开始了,在后续的工作中你可以做更多的检查来确保代码的可用,例如你可以在$gCms对象的各个部分使用var_dump和print_r来查看什么是可用的。

Q: How do I change those hard coded module strings

Occasionally you want to change a string that is output from a module, and although this string is present in the <install dir>/modules/<ModuleName>/lang/xx_YY.php file, and easy enough to change, you wonder what will happen when you upgrade. Will your changes be lost?

Note: 有些模块的字符串输出不是很友好,并且从字面上硬编码输出。这是很不友好的,如果你想修改某些显示的字符串,你必须修改源代码。如果你看到这样的事情,请联系模块管理员并督促他们修复该问题。

A: With your own lang file

It is possible to override any lang strings by creating a file structure and your own lang file that contains only the strings you want to change. The file structure needed is:

  <install dir>/module_custom/<ModuleName>/lang/xx_YY.php

You will want to copy the lines you want to change from the original lang file into this new file, and then change the strings as you see fit. See the FrontEndUsers example below (the commands are unix commands, you'll have to adapt differently for windows, or when working via ftp):

  cd /disk1/html/cms
  mkdir -p module_custom/FrontEndUsers/lang
  touch module_custom/FrontEndUsers/lang/en_US.php
  

Here I'll illustrate a couple of changed lines in the module_custom/FrontEndUsers/lang/en_US.php file:

  $lang['logout'] = 'Logout';  // changed from 'Sign Out'
  $lang['prompt_changesettings'] = 'Preferences'; // changed from 'Change My Settings'

Q: 我如何调试我的代码或站点?

A: 你可以尝试使用下面这些工具

For Internet Explorer (Windows):

  • fiddler (http://www.fiddlertool.com) is a local proxy which allows to intercept and modify both sent and received stuff from the server. Perfect to test some js or css hack before putting it back in CMSMS.
  • AIS Web Accessibility Toolbar (http://www.visionaustralia.org.au/info.aspx?page=614) allows (among other nice tools) to see exactly which CSS applies to the currently select element on a page


For Firefox (multi-platform):

  • Firebug: See and debug AJAX requests and inspect page elements, edit CSS attributes on the fly, and more.
  • Web Developer: In-page editing of CSS and HTML, examine and display CSS attributes, DIV and TABLE order, generated source (after scripts) code, resize browser window, and more.
  • LiveHTTPheaders: allows you to see HTTP request and response headers.
  • HTML Validator: (x)HTML validation right in your browser, also enhances "View Source" in Firefox.
  • ColorZilla: Pick a color, any color, off a web page and copy it's RGB or hex value to clipboard.
  • ScreenGrab!: Capture visible portion or entire page to an image.

Developers FAQ/zh

From CMSMS

A2 Hosting