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)。