首先,感谢所有花时间阅读这个问题的人。我之前从未使用过这项服务,期待您能给予我任何支持。
我目前正在尝试创建一个处理单个教师可用性的表单。当前表单的示例图像如下所示: Current Form
上面的表单位于插件目录中。这样做的目的是能够在网站上显示当前可用性,但通过管理面板进行更新。我前面的表格示例如下所示:Front-end Table
我的问题是,我无法获取表单将值提交给数据库。我可能做错了,需要有人来指导我。
我目前的插件:
/* DESCRIPTION: ADDS PGB TIMESLOTS LINK TO ADMIN DASHBOARD MENU */
add_action('admin_menu', 'pgb_timeslots');
function pgb_timeslots() {
$page_title = 'PGB Timeslot Management';
$menu_title = 'PGB Timeslots';
$capability = 'edit_posts';
$menu_slug = 'pgb_timeslots';
$function = 'pgb_timeslot_options';
$icon_url = '';
$position = 2;
add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position );
}
function pgb_timeslot_options() {
include('sp-db-connect.php'); //Student Portal DB Connection
if (isset($_POST['Update'])) {
$size = count($_POST['ID']);
$i = 0;
while ($i < $size) {
$mon = $_POST['1'][$i];
$tues = $_POST['2'][$i];
$wed = $_POST['3'][$i];
$thurs = $_POST['4'][$i];
$fri = $_POST['5'][$i];
$sat = $_POST['6'][$i];
$sun = $_POST['7'][$i];
$id = $_POST['ID'][$i];
$timetable_update_stmt = $db->prepare('
UPDATE
timetable
SET
`1` = '.$mon.',
`2` = '.$tues.',
`3` = '.$wed.',
`4` = '.$thurs.',
`5` = '.$fri.',
`6` = '.$sat.',
`7` = '.$sun.'
WHERE
timeid = '.$id.'
LIMIT
1
');
$timetable_update_stmt->execute();
++$i;
}
// NEED TO SET NOTIFICATION STATUS
echo '<p>Update Completed</p>';
}
echo '<style>
/* --- The Table Structure --- */
table {
border-collapse: separate;
border-spacing: 0;
}
table tr th,
table tr td {
border-right: 1px solid #bbb;
border-bottom: 1px solid #bbb;
box-shadow: 2px 2px 1px #e5dfcc;
}
table tr th:first-child,
table tr td:first-child {
border-left: 1px solid #bbb;
}
table tr th {
border-top: 1px solid #bbb;
}
/* top-left border-radius */
table tr:first-child th:first-child {
border-top-left-radius: 6px;
}
/* top-right border-radius */
table tr:first-child th:last-child {
border-top-right-radius: 6px;
}
/* bottom-left border-radius */
table tr:last-child td:first-child {
border-bottom-left-radius: 6px;
}
/* bottom-right border-radius */
table tr:last-child td:last-child {
border-bottom-right-radius: 6px;
}
/* -- The Stlyes -- */
input[type="text"] {
width: 100%;
}
th, td{
padding: 8px 8px;
}
th{
background: #E5E6EB;
color: #111;
}
td{
background: #EFF1F6;
}
</style>';
echo '<h1>PGB Timeslot Management</h1>
<p>This page allows you to update the available timeslots for PGB. If you enter 0, it means not available, 1 means available weekly, and 2 means available fortnightly.</p>
<section class="timeslots">
<form name="timeslots" method="POST">
<table>
<tbody>
<tr>
<th>Slots</th>
<th>Mon</th>
<th>Tue</th>
<th>Wed</th>
<th>Thu</th>
<th>Fri</th>
<th>Sat</th>
<th>Sun</th>
</tr>';
$count = 1;
$sql = 'SELECT * FROM timetable';
$result = mysqli_query($sp_db, $sql) or die($sp_db->error);
while ($row = mysqli_fetch_assoc($result)) {
echo '<tr>';
$halftime = "";
if (strpos($row['timeid'], 'h') !== false) {
$halftime = "1";
$chopme = chop($row['timeid'],"h");
$nextslot = $chopme+1;
} else {
$halftime = "0";
$chopme = $row['timeid'];
$nextslot = $row['timeid']+1;
}
if ( $halftime == "0" ) {
//starts on the hour
echo "<td>".$chopme.":00 - ".$chopme.":30</td>";
} else {
//starts on the half hour
echo "<td>".$chopme.":30 - ".$nextslot.":00</td>";
}
echo '<input type="hidden" name="ID[]" value="'.$row['timeid'].'">';
for ($i = 1; $i <= 7; $i++) {
// 1 through 7 = Mon through Sun
echo '<td><input type="text" name="'.$i.'[]" id="'.$row['timeid'].'" value="'.$row[$i].'"></td>';
}
echo '</tr>';
$count++;
}
echo '</tbody>
</table>
<input type="submit" name ="Update" value="Update" />
<p>Once you have changed the values for availability above, click the update button.</p>
</form>
</section>
</div>
</div>';
}
上面的代码不会向数据库提交任何内容,而是呈现一个空白屏幕,就像没有要显示的管理内容一样。单击提交按钮后,它不会重新加载表单或将数据保存到数据库。从前端表上的数据库中提取值时,我会根据显示的值转换输出。 0 =满,1 =每周,2 =每两周等。
我在这里完全错过了什么?
编辑:
我以为我会提供当前的表格结构,以便您可以看到我目前正在使用的内容:
CREATE TABLE `timetable` (
`ID` int(11) NOT NULL COMMENT 'Primary ID',
`timeid` varchar(4) NOT NULL COMMENT 'Time-Slot',
`1` int(1) NOT NULL COMMENT 'Monday',
`2` int(1) NOT NULL COMMENT 'Tuesday',
`3` int(1) NOT NULL COMMENT 'Wednesday',
`4` int(1) NOT NULL COMMENT 'Thursday',
`5` int(1) NOT NULL COMMENT 'Friday',
`6` int(1) NOT NULL COMMENT 'Saturday',
`7` int(1) NOT NULL COMMENT 'Sunday'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
'timeid'由7,7h,8,8h,9,9h等组成.'h'让我知道插槽是在半小时标记处开始的。然后我使用下面的代码将它们转换为前端的可读时间格式:
<table>
<tbody>
<tr>
<th>Slots</th>
<th>Mon</th>
<th>Tue</th>
<th>Wed</th>
<th>Thu</th>
<th>Fri</th>
</tr>
<?php
include('sp-db-connect.php'); // DB Connection
$count = 1;
$sql = 'SELECT * FROM timetable';
$result = mysqli_query($sp_db, $sql) or die($sp_db->error);
while ($row = mysqli_fetch_assoc($result)) {
echo '<tr>';
$halftime = "";
if (strpos($row['timeid'], 'h') !== false) {
$halftime = "1";
$chopme = chop($row['timeid'],"h");
$nextslot = $chopme+1;
} else {
$halftime = "0";
$chopme = $row['timeid'];
$nextslot = $row['timeid']+1;
}
if ( $halftime == "0" ) {
//starts on the hour
echo "<td>".$chopme.":00 - ".$chopme.":30</td>";
} else {
//starts on the half hour
echo "<td>".$chopme.":30 - ".$nextslot.":00</td>";
}
for ($i = 1; $i <= 5; $i++) {
// 1 through 5 = Mon through Fri
if ($row[$i] == '0' ) {
$row[$i] = 'Full';
} elseif ($row[$i] == '1' ) {
$row[$i] = '<a href="booking-confirmation/?d='.$i.'&t='.$row['timeid'].'&f=1" title="Book Now" rel="nofollow">Weekly</a>';
} else {
$row[$i] = '<a href="booking-confirmation/?d='.$i.'&t='.$row['timeid'].'&f=2" title="Book Now" rel="nofollow">Every 2 weeks</a>';
}
}
for ($i = 1; $i <= 5; $i++) {
// 1 through 5 = Mon through Fri
echo "<td>".$row[$i]."</td>";
}
echo '</tr>';
$count++;
}
?>
</tbody>
</table>
我不想创建功能齐全的计划程序/计划。我需要在前端显示时隙,然后指出它们是否可用。我理解你关于格式化的逻辑,只需要在数据库中存储不可用的数据。我不太确定如何使用'booking_start'和'booking_end'变量来获取数据。
用户将点击将重定向到预订表格的时间段。该时间段将传递到新页面以供他们确认。时间段不会改变。我不需要获取具体的日期等。我需要的是每周设置的时间段以及它们是否可用。如果有人在特定日期采用时间段,那么我只需将其标记为已满。原因是,如果某人确实在一天中占用了那个位置,那么他们将不断拥有该位置。
它基本上是音乐学费槽。学生每周都会预订一个插槽并拥有相同的插槽。当新学生想要查看我的可用性时,他们只需知道我有哪些插槽等,哪些插槽已满。
答案 0 :(得分:0)
不是答案,但想利用格式化选项......
好的,我们知道所有插槽mon-fri,7.00 - 23.00都存在,所以我们不需要存储它们。我们只需要存储那些不可用的。所以我们的表格看起来像这样:
( user_id INT NOT NULL
, booking_start DATETIME NOT NULL
, booking_end DATETIME NOT NULL
, PRIMARY KEY (user_id,booking_start)
)
这是否是最终设计取决于你,但它至少是标准化的,而你目前的设计并非如此。