如何使用来自外部Web服务的数据加载drupal表单

时间:2013-06-13 12:34:51

标签: forms web-services rest drupal

我对Drupal(7)和PHP相对较新,所以这可能是一个基本问题,因为我还没有找到 到目前为止我在问题中需要的东西,因此是帖子。

我有一个drupal站点,它将连接到一个简单的CRUD REST Web服务(.net 4)来检索和发布数据。

我发现很难确定如何将从网站获得的数据加载到一个简单的drupal表单中。 数据将通过JSON格式传输,但我不确定如何从响应数组中检索数据并填充 表格的字段与从网站获得的数据。假设返回的JSON字段与表单字段名称匹配。

在我的例子中,我在提交函数中有http_request,实际上它应该在页面加载函数中。

所以问题是: 如何从已检索的数据中填充表单的字段? 从json_array中获取数据的语法是什么? 页面加载时需要检索数据,实现这一目标的最佳方法是什么?

这是示例代码,我一直在提交中玩。我已经重建了,这是最好的方法 将数据保留在屏幕上?我试图将'Surname'字段重置为新值但没有欢乐..

<?php

/**
* @file
* Test activation form
*/

/**
* Implements hook_menu()
*/
function activation_menu() {
  $items['activation'] = array(
  'title' => 'Registration form',
  'page callback' => 'drupal_get_form',
  'page arguments' => array('activation_nameform'),
  'access callback' => TRUE,
 // 'access_callback' => TRUE,
  'type' => MENU_NORMAL_ITEM
  );
  return $items;
  }

/**
* Define the form
*/
function activation_nameform() {
$form['Firstname'] = array(
'#Firstname' => t('Firstname'),
'#type' => 'textfield',
'#maxlength'=> 50,
'#description' => t('Please enter your First name.'),
);

$form['Surname'] = array(
'#Surname' => t('Surname'),
'#type' => 'textfield',
'#maxlength'=> 50,
'#description' => t('Please enter your Surname.'),
);

$form['Username'] = array(
'#Username' => t('Username'),
'#type' => 'textfield',
'#maxlength'=> 100,
'#description' => t('Please enter your Username.'),
);
$form['Password'] = array(
'#Password' => t('Password'),
'#type' => 'textfield',
'#maxlength'=> 8,
'#description' => t('Please enter your Surname.'),
);

$form['Organisation'] = array(
'#Organisation' => t('Organisation'),
'#type' => 'textfield',
'#maxlength'=> 50,
'#description' => t('Please enter your Organisation.'),
);

$form['Address1'] = array(
'#Address1' => t('Address1'),
'#type' => 'textfield',
'#maxlength'=> 150,
'#description' => t('Please enter your first full line of Address.'),
);

$form['Address2'] = array(
'#Address2' => t('Address'),
'#type' => 'textfield',
'#maxlength'=> 150,
'#description' => t('Please enter your second full line of Address.'),
);

$form['Town_city'] = array(
'#Town_city' => t('Town_city'),
'#type' => 'textfield',
'#maxlength'=> 50,
'#description' => t('Please enter your Town or City.'),
);

$form['Region'] = array(
'#Region' => t('Region'),
'#type' => 'textfield',
'#maxlength'=> 50,
'#description' => t('Please enter your Region.'),
);

$form['PostCode'] = array(
'#PostCode' => t('PostCode'),
'#type' => 'textfield',
'#maxlength'=> 10,
'#description' => t('Please enter your PostCode.'),
);



$form['Postcode'] = array(
'#Postcode' => t('Postcode'),
'#type' => 'textfield',
'#maxlength'=> 15,
'#description' => t('Please enter your Postcode or ZIP code.'),
);

$form['Country_options'] = array(
'#type' => 'value',
'#value'=> array(t('UK'),t('Europe'),t('USA')),
);

$form['Country']['favourite_country'] = array(
'#title' => t('Favourite Country'),
'#type' => 'select',
'#value'=> array(t('UK'),t('Europe'),t('USA')),
'#description' => t('Please enter your Country'),
'#options' => $form['Country_options']['#value']
);

$form['Status'] = array(
'#Status' => t('Status'),
'#type' => 'textfield',
'#maxlength'=> 150,
'#description' => t('Please enter your first full line of Address.'),
);

$form['Add_credits'] = array(
'#Add_credits' => t('Add_credits'),
'#type' => 'textfield',
'#maxlength'=> 15,
'#description' => t('Please enter additional credits'),
);


$form['TandC'] = array(
'#TandC' => t('TandC'),
'#type' => 'textfield',
'#maxlength'=> 5,
'#description' => t('TandC'),
'#value'=> 30
);

$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit')
);
return $form;
}


/**
* Handle post - validation form submission
*/
function activation_nameform_submit($form,&$form_state) {
$name = $form_state['values']['Firstname'];
drupal_set_message(t('Thanks ,%name',
array('%name' => $name)));
$request = drupal_http_request('http://somewebsite.com/Customers/?ID=10');
$jsonarray =drupal_json_decode($request->data);

$form_state['rebuild']=TRUE;
$form['Surname']['#value']='Hello mother';

}

继续回答 使用

echo '<pre>';var_dump($request); echo '</pre>'

我现在可以看到请求信息:

["data"]=>
  string(346) "?{"CustomerID":10,"FirstName":"Howard Philip","LastName":"Lovecraft","Organisation":"superglue","AddressID":null,"Status":0,"Credits":0,"Type":0,"ExpiryDate":"0001-01-01T00:00:00","UserName":"xxx@hotmail.com","Password":"","CustomerIconURL":"","CountryCode":"","LastUpdated":null,"DateCreated":"2013-04-18T07:43:10.123","ApplicationID":null}"
  ["protocol"]=>
  string(8) "HTTP/1.1"
  ["status_message"]=>
  string(2) "OK"
  ["headers"]=>
  array(6) {
    ["content-length"]=>
    string(3) "346"
    ["content-type"]=>
    string(31) "application/json; charset=utf-8"
    ["server"]=>
    string(17) "Microsoft-IIS/7.5"
    ["x-powered-by"]=>
    string(7) "ASP.NET"
    ["date"]=>
    string(29) "Fri, 14 Jun 2013 12:00:35 GMT"
    ["connection"]=>
    string(5) "close"
  }
  ["code"]=>
  string(3) "200"
}

现在将实施以下建议......

2 个答案:

答案 0 :(得分:1)

..问题的完整答案是,用于填充下面显示的字段的代码/ **

* Define the form
*/
function activation_nameform() {
$request = drupal_http_request('http://somewebsite.com/ML5/MLSvrSvc.svc/Customers/?ID=10');
$jsonarray = $request->data; 
//$jsonarray =json_decode('{"CustomerID":10,"FirstName":"Howard Philip","LastName":"Lovecraft","Organisation":"superglue","AddressID":null,"Status":0,"Credits":0,"Type":0,"ExpiryDate":"0001-01-01T00:00:00","UserName":"xxx@hotmail.com","Password":"","CustomerIconURL":"","CountryCode":"","LastUpdated":null,"DateCreated":"2013-04-18T07:43:10.123","ApplicationID":null}',TRUE);
echo '<pre2>';var_dump($jsonarray); echo '</pre2>';

$form['Firstname'] = array(
'#Firstname' => t('FirstName'),
'#type' => 'textfield',
'#maxlength'=> 50,
'#description' => t('Please enter your First name.'),
'#default_value' => $jsonarray['FirstName'],
);
.
.
.etc

然而,来自windows 7 /.net 64位系统的json存在一个解析问题,因此测试json字符串...已尝试过大多数utf8编码函数和preg_replace示例,但今天依然没有进展......也许是另一个问题,我们会看到。

答案 1 :(得分:0)

  

在我的例子中,我在提交函数中有http_request,实际上它应该在页面加载函数中。

我会这样做

1)在定义表单时获取值,即activation_nameform() 2)使用键默认值进行分配。

'#default_value' => // your variable here

3)执行一个printr函数xdebug会话以确保转换json对象。我之前我曾经遇到过一些问题。

如果上述方法不起作用,那么我会研究一下hook_form_alter函数。

4)返回类型是一个数组,因此您可以访问$ var [1]

$request = drupal_http_request('https://api.twitter.com/1/users/show.json? screen_name=TwitterAPI&include_entities=true');

$var= drupal_json_decode($request->data);
print $var[1]; // this should contain your value and then you can place for the default value.

参考 - http://webwash.net/articles/getting-started-json-drupal-7 https://api.drupal.org/api/drupal/includes!common.inc/function/drupal_json_decode/7 http://in3.php.net/json_decode