当前位置

Drupal中表单调用SQL查询API操作数据库表

James Qi 在 2019年3月12日 - 16:04 提交

  这两年我们新建网站多数都采用了《在Drupal中直接导入、使用数据库》这篇文章中说的办法,而没有用以前新建内容类型、导入到Drupal的Node中的办法,这对于数据量大、改动不大、读取多、写入少的需求很合适。

  偶尔遇到需要修改、删除的事情,我们就是到阿里云RDS管理后台,Web界面来操作或者用SQL语句来进行,比以前在Node页面进行编辑要麻烦,但更改量不大的情况下也可以接受。

  最近要用的一个新站也是用直接建表方式来搭建的,但内容需要人工来修改完善,而且是长久都需要添加、维护信息的,再用以前导入RDS后台就显得太麻烦了,于是想去找现成的Drupal第三方模块来解决,找了几个,发现需要把data导入的table进行entity实体化,那反而搞复杂了。

  后来干脆决定自己写表单来操作,但需要解决权限的问题,尝试在自定义模块中添加menu项,利用Drupal自有的机制可以解决权限问题,只让具有管理员权限的用户可以访问。

function my_module_menu() {
  $items= array();
  $items['edit_table'] = array (
    'title'=>t('Edit').' '.t('Table'),
    'page callback'=>'edit_table',
    'access callback' => 'user_access',
    'access arguments'=>array('administer users'),
  );
  $items['edit_table_submit'] = array (
    'title'=>t('Edit').' '.t('Table').' '.t('Submit'),
    'page callback'=>'edit_table_submit',
    'access callback' => 'user_access',
    'access arguments'=>array('administer users'),
  );
  return $items;
}

  menu项添加一个edit table路径和一个edit table submit路径,前者用于读取数据库表内容和生成相应的表单,后者用于接收处理前者提交来的表单对数据库表进行修改,这样就可以实现不进入RDS管理后台就修改数据库表的功能。简化后的示范程序如下:

function edit_table() {//读取数据库表,生成表单
  $request_uri = $_SERVER['REQUEST_URI'];
  $keyword = substr($request_uri,strpos($request_uri,'/edit_table/')+strlen('/edit_table/'));
  $result = db_select('table_name')
    ->fields('table_name',array(
    'field_1',
    'field_2',
    ...
    'field_n'
    ))
    ->condition('name', $name,'=')
    ->execute()
    ->fetchAssoc();
  $field_1 = $result['field_1'];
  $field_2 = $result['field_2'];
  ...
  $field_n = $result['field_n'];
  $form = "
  <form class='edit_form' action='/edit_table_submit' method='post'>
    <input type='hidden' name='field_1' value='$field_1' />
    <div class='input_wrap'>
      <label>Field 1: </label>
      <input type='text' name='field_1' value='$field_1' disabled='disabled' />
    </div>
    <div class='input_wrap'>
      <label>Field 2: </label>
      <input type='text' name='field_2' value='$field_2' />
    </div>
    ...
    <div class='emoji_input_wrap'>
      <label>Field n: </label>
      <input type='text' name='field_n' value='$field_n' />
    </div>
    <div class='input_wrap submit_wrap'>
      <input type='submit' value='".t('Submit')."' />
    </div>
  </form>
  ";
  $output = str_replace("\n","<br />\n",$form);
  return $output;
}

function edit_table_submit() {//接收表单提交数据,更改数据库表
  $field_1 = $_POST["field_1"];
  $field_2 = $_POST["field_2"];
  ...
  $field_n = $_POST["field_n"];
  $num_updated = db_update('table_name')
    ->fields(array(
    'field_1' => $field_1,
    'field_2' => $field_2,
    ...
    'field_n' => $field_n,
    ))
    ->condition('name', $name, '=')
    ->execute();
  $output = $num_updated;
  return $output;
}

  使用Drupal在找不到合适第三方模块的时候,自己来编写自定义模块也是一个很好的解决问题办法✌😀。

评论

添加新评论

Plain text

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