我对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"
}
现在将实施以下建议......
答案 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