PHP 表单中的多个 PHP 函数处理程序?
Multiple PHP Function handlers in HTML Form?
我正在使用 OctoberCMS based on Laravel and Twig。
我正在尝试使用 1 个表单和 2 个提交按钮从 2 个 php 文件调用 2 个不同的函数。
我将自己制作的组件 Edit.php
和 Delete.php
连接到一个页面。
我没有将表单操作指向 /Edit.php,而是将其指向当前 url 并使用处理程序调用 php 函数 onEdit()
Edit.php
,使用编辑提交按钮。
在相同的表单中,如何使用删除提交按钮在 Delete.php
中调用 onDelete()
?
它只选择 1 个处理程序并调用其函数。
我无法将这两个函数合并到 1 个 php 文件中。
https://jsfiddle.net/t3t5e2Ln/
表格
<!-- Edit or Delete -->
<form method="POST" action="{{ url_current() }}" enctype="multipart/form-data">
<!-- Edit Handler -->
<input type="hidden" name="_handler" value="onEdit" />
<!-- Delete Handler -->
<input type="hidden" name="_handler2" value="onDelete" />
<!-- Title -->
<input type="text" name="title" maxlength="255" />
<!-- Edit Submit -->
<input type="submit" name="edit" value="Edit" />
<!-- Delete Submit -->
<input type="submit" name="delete" value="Delete" />
</form>
Edit.php
public function onEdit() {
//edit
}
Delete.php
public function onDelete() {
//delete
}
通常这应该通过ajax请求来完成,所以你可以独立选择端点,但是使用一些js也可以做到这一点。
$('input[type=submit]').on('click', function(e) {
e.preventDefault();
var url = '/Edit.php';
if (this.name == 'delete') {
url = '/Delete.php';
}
this.form.action = url;
this.form.submit();
});
在你的 header
<head>
<script language="javascript" src="editordelete.js" type="text/javascript"></script>
</head>
你的按钮
<input type="button" name="edit" value=edit onClick="seteditAction();" />
<input type="button" name="edit" value=edit onClick="setdeleteAction();" />
创建一个名为“editordelete.js 的文件并将其放入其中将您的表单名称放在我写的地方 yourformnamesgoeshere
function seteditAction() {
document.yourformnamegoeshere.action = "Edit.php";
document.yourformnamegoeshere.submit();
}
function setdeleteAction() {
document.yourformnamegoeshere.action = "Delete.php";
document.yourformnamegoeshere.submit();
}
给你的表格起个名字,方法是post,动作是注意
<form name="yourformnamegoeshere" method="post" action="">
之前的两个答案都不正确。有关开发 10 月自定义组件的更多信息,请参阅 http://octobercms.com/docs/cms/components and http://octobercms.com/docs/plugin/components。
首先,我会将两个处理程序放在同一个组件中(RecordData.php 作为名称的示例)。其次,您应该利用 October 出色的 AJAX 框架:http://octobercms.com/docs/ajax/introduction.
这是您的 RecordData.php 组件 class 的示例:
<?php namespace MyVendor\MyPlugin\Components;
use Auth;
use Flash;
use Cms\Classes\ComponentBase;
use MyVendor\MyPlugin\Models\MyRecord as MyRecordModel;
class RecordData extends ComponentBase
{
/**
* Provide information about the component
*/
public function componentDetails()
{
return [
'name' => 'RecordData Component',
'description' => 'Used for editing and deleting custom record data'
];
}
/**
* Register any component properties
* http://octobercms.com/docs/plugin/components#component-properties
*/
public function defineProperties()
{
// return [];
}
/**
* Get the record that will be edited, factoring in the user's access to the specified record
*
* @return MyRecordModel
*/
public function getRecord()
{
$user = Auth::getUser();
if ($user) {
return MyRecordModel::findOrFail(post('recordId'));
} else {
throw new \Exception("You do not have access to do that.");
}
}
/**
* AJAX Handler for editing data
*/
public function onEdit()
{
// Get the record
$record = $this->getRecord();
// Modify the record
$record->title = post('title');
// Save the modifications to the record
$record->save();
// Notify the user that the record has been edited
Flash::success("Record successfully edited");
}
/**
* AJAX Handler for deleting data
*/
public function onDelete()
{
// Get the record
$record = $this->getRecord();
// Delete the record
$record->delete();
// Notify the user that the record has been deleted
Flash::success("Record deleted");
}
}
然后你的 default.htm
部分呈现该组件将如下所示:
{{ form_open() }}
{# Hidden form field containing the record id. Passing the record id through the URL or other means is possible as well #}
<input type="hidden" name="recordId" value="{{ __SELF__.recordId }}">
{# Title #}
<input type="text" name="title" maxlength="255" />
{# Edit Button #}
<button type="button" data-request="{{ __SELF__ }}::onEdit">Save changes</button>
{# Delete Button #}
<button type="button" data-request="{{ __SELF__ }}::onDelete">Delete record</button>
{{ form_close() }}
让我向您介绍上面粘贴的 Twig 标记:
{{ form_open() }}
and {{ form_close() }}
是 10 月注册的 Twig 辅助函数,用于简化创建表单元素的操作,因为它们会自动确保生成正确的标记,如果您选择启用,它会包含 csrf 令牌隐藏字段在您的网站上。
{# #}
表示 Twig 中的注释块,我通常更喜欢使用它们而不是 <!-- -->
,因为这样注释只会对查看 Twig 文件的实际源代码的人可见,并非您网站的所有用户。
data-request
利用 October AJAX 框架的 attributes API 向 AJAX 框架指示服务器上的哪个方法将负责处理由包含 data-request
属性的元素。
{{ __SELF__ }}
指的是当前组件,它本质上会降低该组件别名的值。基本上,您需要知道的是,使用它将使您能够在将来一次在页面上放置多个组件。在 {{ __SELF__ }}
之后的 ::onDelete
和 ::onEdit
是告诉服务器您希望 运行 在 {{ __SELF__ }}
指定的组件上使用什么方法来处理 AJAX 请求。
我正在使用 OctoberCMS based on Laravel and Twig。
我正在尝试使用 1 个表单和 2 个提交按钮从 2 个 php 文件调用 2 个不同的函数。
我将自己制作的组件 Edit.php
和 Delete.php
连接到一个页面。
我没有将表单操作指向 /Edit.php,而是将其指向当前 url 并使用处理程序调用 php 函数 onEdit()
Edit.php
,使用编辑提交按钮。
在相同的表单中,如何使用删除提交按钮在 Delete.php
中调用 onDelete()
?
它只选择 1 个处理程序并调用其函数。
我无法将这两个函数合并到 1 个 php 文件中。
https://jsfiddle.net/t3t5e2Ln/
表格
<!-- Edit or Delete -->
<form method="POST" action="{{ url_current() }}" enctype="multipart/form-data">
<!-- Edit Handler -->
<input type="hidden" name="_handler" value="onEdit" />
<!-- Delete Handler -->
<input type="hidden" name="_handler2" value="onDelete" />
<!-- Title -->
<input type="text" name="title" maxlength="255" />
<!-- Edit Submit -->
<input type="submit" name="edit" value="Edit" />
<!-- Delete Submit -->
<input type="submit" name="delete" value="Delete" />
</form>
Edit.php
public function onEdit() {
//edit
}
Delete.php
public function onDelete() {
//delete
}
通常这应该通过ajax请求来完成,所以你可以独立选择端点,但是使用一些js也可以做到这一点。
$('input[type=submit]').on('click', function(e) {
e.preventDefault();
var url = '/Edit.php';
if (this.name == 'delete') {
url = '/Delete.php';
}
this.form.action = url;
this.form.submit();
});
在你的 header
<head>
<script language="javascript" src="editordelete.js" type="text/javascript"></script>
</head>
你的按钮
<input type="button" name="edit" value=edit onClick="seteditAction();" />
<input type="button" name="edit" value=edit onClick="setdeleteAction();" />
创建一个名为“editordelete.js 的文件并将其放入其中将您的表单名称放在我写的地方 yourformnamesgoeshere
function seteditAction() {
document.yourformnamegoeshere.action = "Edit.php";
document.yourformnamegoeshere.submit();
}
function setdeleteAction() {
document.yourformnamegoeshere.action = "Delete.php";
document.yourformnamegoeshere.submit();
}
给你的表格起个名字,方法是post,动作是注意
<form name="yourformnamegoeshere" method="post" action="">
之前的两个答案都不正确。有关开发 10 月自定义组件的更多信息,请参阅 http://octobercms.com/docs/cms/components and http://octobercms.com/docs/plugin/components。
首先,我会将两个处理程序放在同一个组件中(RecordData.php 作为名称的示例)。其次,您应该利用 October 出色的 AJAX 框架:http://octobercms.com/docs/ajax/introduction.
这是您的 RecordData.php 组件 class 的示例:
<?php namespace MyVendor\MyPlugin\Components;
use Auth;
use Flash;
use Cms\Classes\ComponentBase;
use MyVendor\MyPlugin\Models\MyRecord as MyRecordModel;
class RecordData extends ComponentBase
{
/**
* Provide information about the component
*/
public function componentDetails()
{
return [
'name' => 'RecordData Component',
'description' => 'Used for editing and deleting custom record data'
];
}
/**
* Register any component properties
* http://octobercms.com/docs/plugin/components#component-properties
*/
public function defineProperties()
{
// return [];
}
/**
* Get the record that will be edited, factoring in the user's access to the specified record
*
* @return MyRecordModel
*/
public function getRecord()
{
$user = Auth::getUser();
if ($user) {
return MyRecordModel::findOrFail(post('recordId'));
} else {
throw new \Exception("You do not have access to do that.");
}
}
/**
* AJAX Handler for editing data
*/
public function onEdit()
{
// Get the record
$record = $this->getRecord();
// Modify the record
$record->title = post('title');
// Save the modifications to the record
$record->save();
// Notify the user that the record has been edited
Flash::success("Record successfully edited");
}
/**
* AJAX Handler for deleting data
*/
public function onDelete()
{
// Get the record
$record = $this->getRecord();
// Delete the record
$record->delete();
// Notify the user that the record has been deleted
Flash::success("Record deleted");
}
}
然后你的 default.htm
部分呈现该组件将如下所示:
{{ form_open() }}
{# Hidden form field containing the record id. Passing the record id through the URL or other means is possible as well #}
<input type="hidden" name="recordId" value="{{ __SELF__.recordId }}">
{# Title #}
<input type="text" name="title" maxlength="255" />
{# Edit Button #}
<button type="button" data-request="{{ __SELF__ }}::onEdit">Save changes</button>
{# Delete Button #}
<button type="button" data-request="{{ __SELF__ }}::onDelete">Delete record</button>
{{ form_close() }}
让我向您介绍上面粘贴的 Twig 标记:
{{ form_open() }}
and {{ form_close() }}
是 10 月注册的 Twig 辅助函数,用于简化创建表单元素的操作,因为它们会自动确保生成正确的标记,如果您选择启用,它会包含 csrf 令牌隐藏字段在您的网站上。
{# #}
表示 Twig 中的注释块,我通常更喜欢使用它们而不是 <!-- -->
,因为这样注释只会对查看 Twig 文件的实际源代码的人可见,并非您网站的所有用户。
data-request
利用 October AJAX 框架的 attributes API 向 AJAX 框架指示服务器上的哪个方法将负责处理由包含 data-request
属性的元素。
{{ __SELF__ }}
指的是当前组件,它本质上会降低该组件别名的值。基本上,您需要知道的是,使用它将使您能够在将来一次在页面上放置多个组件。在 {{ __SELF__ }}
之后的 ::onDelete
和 ::onEdit
是告诉服务器您希望 运行 在 {{ __SELF__ }}
指定的组件上使用什么方法来处理 AJAX 请求。