我已经使用concrete5购买了附加组件模块contact_directory,现在我需要根据自己的需求进行定制。
所以我需要更改文件包\contact_directory\blocks\contact_directory\view.php,我在与我的view.php文件相同的目录中创建了test.php文件,所以我的表单标记是url('contact_directory/test')?>">
那么请告诉我哪里出了问题?
Concrete5为块使用了松散的MVC架构。这意味着,与"普通的老"php站点不同,在那里,当访问某个URL时,你有一个文件会运行,而你的块的控制器总是被调用。但是,控制器中可以有不同的函数来响应不同的url,在C5世界中,这些函数被称为动作。
因此,在块的view.php文件中,将表单标记更改为:
<form method="post" action="<?php echo $this->action('test'); ?>">
然后在controller.php文件中,创建一个新的公共函数,该函数的名称为"action_",后跟传递到表单标记中的内容。在您的示例中,这将是:
public function action_test() {
//do stuff here
}
现在您将遇到一个问题,因为Concrete5块总是渲染"view.php"模板(例如,没有简单的方法可以告诉它使用"test.php"文件)。这里最简单的解决方案是将两个模板合并到带有"if"语句的view.php文件中。例如:
<?php defined('C5_EXECUTE') or die(_("Access Denied.")); ?>
<?php if ($controller->getTask() == 'test'): ?>
<!-- Put all of the code from your test.php file here -->
<?php else: ?>
<!-- Put all the code from your view.php file here -->
<?php endif; ?>
需要注意的一点是,如果您的块被放置在页面默认值或全局区域(或堆栈)中,那么表单操作可能不会提交到正确的位置。但我不确定这一点——这是我在5.4.2版本中遇到的一个问题,但从那时起可能已经解决了。
PS-如果你想看看一些在C5块中使用这种表单处理的示例代码,请下载我的免费电子邮件列表注册插件(http://www.concrete5.org/marketplace/addons/email-list-signup)。