当前位置

通过判断GET和POST实现在一个页面内呈现表单和修改数据表内容

James Qi 在 2020年4月25日 - 23:18 提交

  Drupal中以前都是用node方式来呈现数据,content type设置好字段后,有现成的办法来实现内容呈现和编辑。但后来比较多用到自建的数据表,呈现一般还是用Views来实现,也可以用SQL语句来实现,而修改数据表中内容最开始用阿里云RDS后台,后来改用自己写的form展示和输入修改提交。

  昨天同事又说到另外一个类似的需求,我花了几个小时来做,这次干脆把以前呈现表单、提交结果两个页面合并为一个页面,通过判断这个页面的$_GET和$_POST参数来做适当的操作,在Drupal的自定义模块中的PHP程序代码如下:

/**
 * 函数:专题编辑页面
 * 输入:id
 * 输出:表单、提交结果
 * 数据表:topic
 * 字段:id, name, note, title, keywords, description
 */
function edit_topic() {
	$output = '';
	if (isset($_POST['id'])) {//有POST数据,进行更新处理
		//获取POST数据
		$id = $_POST['id'];
		$name = $_POST["name"];
		$note = $_POST["note"];
		$title = $_POST["title"];
		$keywords = $_POST["keywords"];
		$description = $_POST["description"];
		//组成数据
		$topic_array['id'] = $id;
		$topic_array['name'] = $name;
		$topic_array['note'] = $note;
		$topic_array['title'] = $title;
		$topic_array['keywords'] = $keywords;
		$topic_array['description'] = $description;
		//调用更新函数
		$update_topic_num = update_topic($topic_array);
		if ($update_topic_num == 0) {
			drupal_set_message("未更新数据",'warning');
		} else {
			drupal_set_message("更新一条数据",'status');
		}
	}
	if (isset($_GET['id'])) {//有GET数据,展示编辑表单
		$id = $_GET['id'];
		//获取数据表内容到数组
		$get_topic_array = get_topic($id);
		//获取各个字段内容
		$name = $get_topic_array['name'];
		$note = $get_topic_array['note'];
		$title = $get_topic_array['title'];
		$keywords = $get_topic_array['keywords'];
		$description = $get_topic_array['description'];
		//组成表单
		$form = "
<form class='topic_edit_form' action='' method='post'>
	<div class='topic_input_wrap'>
		<label>专题ID (此处不可修改): </label>
		<input type='text' name='id' value='$id' disabled='true' />
	</div>
	<div class='topic_input_wrap'>
		<label>专题名称: </label>
		<input type='text' name='name' value='$name' size='80' />
	</div>
	<div class='topic_input_wrap'>
		<label>备注: </label>
		<input type='text' name='note' value='$note' size='80' />
	</div>
	<div class='topic_input_wrap'>
		<label>网页标题: </label>
		<input type='text' name='title' value='$title' size='80' />
	</div>
	<div class='topic_input_wrap'>
		<label>网页关键词: </label>
		<input type='text' name='keywords' value='$keywords' size='80' />
	</div>
	<div class='topic_input_wrap'>
		<label>网页描述: </label>
		<textarea cols='80' rows='5' name='description'>$description</textarea>
	</div>
	<div class='topic_input_wrap submit_wrap'>
		<input type='submit' value='提交修改' />
	</div>
</form>
";
		$output .= str_replace("\n","<br />\n",$form);
	} else {
		drupal_set_message("无id参数。",'error');
	}
	return $output;
}

/**
 * 函数:获取专题数据
 * 输入:专题id
 * 输出:各字段组成的数组
 */
function get_topic($id) {
	$database = 'center';
	db_set_active($database);
	$table = 'topic';
	//调用数据库查询语句
	$result = db_select($table)
	->fields($table, array('id','name','note','title','keywords','description'))
	->condition('id',$id,'=')
	->execute()
	->fetchAssoc();
	db_set_active();
	//从result数组转为output数组,实际使用的时候可能key不一样,下面的例子是key一样的
	$output = array(
		'id' => $result['id'],
		'name' => $result['name'],
		'note' => $result['note'],
		'title' => $result['title'],
		'keywords' => $result['keywords'],
		'description' => $result['description'],
	);
	return $output;
}

/**
 * 函数:更新专题数据
 * 输入:专题数组
 * 输出:更新条数(0表示未更新,1表示已更新)
 */
function update_topic($topic_array) {
	$database = 'center';
	db_set_active($database);
	$table = 'topic';
	//从输入数组读出变量,实际使用的时候可能需要进行一些变换
	$id = $topic_array['id'];
	$name = $topic_array['name'];
	$note = $topic_array['note'];
	$title = $topic_array['title'];
	$keywords = $topic_array['keywords'];
	$description = $topic_array['description'];
	//调用数据库更新的SQL语句
	$num_updated = db_update($table)
	->fields(array(
 		'name' => $name,
		'note' => $note,
		'title' => $title,
		'keywords' => $keywords,
		'description' => $description,
	))
	->condition('id', $id, '=')
	->execute();
	db_set_active();
	return $num_updated;
}

  本来和同事说2个小时就可以把程序写好的,实际上用了3个多小时,加上后面修改Views来展示以及第二天完善以上程序的一些时间,也是用了4个多小时。这次记录下来以后,下次应该只需要2个小时了。

  自己感觉还是比较好地实现了预定的功能,当然还有一些表单数据验证等如果有必要可以继续完善。

自由标签:

添加新评论

Plain text

  • 不允许使用HTML标签。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。