1

I am relatively new to Drupal (7) and PHP so this may be a bit of a basic question through I have not managed to find out what I needed in the questions so far, hence the post.

I have a drupal site that will connect to a simple CRUD REST webservice(.net 4) to retreive and post data.

I have been finding it difficult to determine how to load the data obtained from the website into a simple drupal form. The data will be transfered via JSON format but I an not sure how to retreive the data from the response array and populate the fields of the form with the data obtained from the website. Assume the JSON fields returned match the form field names.

In my example I have the http_request in the submit function through really it should be in a page load function.

So the questions are : how to you populate the fields of the form from the retreived data ? What is the syntax to get the data out of the json_array? The data needs to be retrieved when the page loads, what is the best way of acheiveing this ?

Here is the example code , I have been playing around in the submit. I have put a rebuilt in , is this the best way to persist the data on the screen ? I have tried to reset the 'Surname' field to a new value but no joy..

<?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';

}

Continuation of answer by using

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

I can now see the request information:

["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"
}

So will now implement the suggestion below ...

tshepang
  • 12,111
  • 21
  • 91
  • 136
Richard H
  • 67
  • 9

2 Answers2

1

..So full answer to the question is , code for populating the fields shown below/**

* 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

However there is a parsing issue with the json coming from the windows 7 /.net 64 bit system hence the test json string... Have tried most of the utf8 encoding functions and the preg_replace examples , but no joy still progress today... Perhaps another question, we'll see.

Richard H
  • 67
  • 9
0

In my example I have the http_request in the submit function through really it should be in a page load function.

I would do it this way

1) Get the values when defining the form ie activation_nameform() 2) Use key default values to assign it.

'#default_value' => // your variable here

3) Do a printr function do xdebug session to make sure json object is getting converted. I rem I had some problems with that before.

If the above does not work then I would look into hook_form_alter function.

4) The return type is an array so you can acess it $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.

reference - 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

Vishal Khialani
  • 2,557
  • 6
  • 38
  • 49
  • Thanks for your answer @vishal. I was starting to think along those lines. So the http_request would just be called as the first statement in the activation_nameform function before the form elements are defined.OK. I did ask what the correct syntax would be to unpack the $jsonarray into elements that can be used as the assignment for the #default _value. Do you know? As I said I am a little new to PHP/Drupal! Richard – Richard H Jun 14 '13 at 07:35
  • @RichardH print pls the json data in your question I will try to answer it. – Vishal Khialani Jun 14 '13 at 09:50
  • Thanks @vishal. I'm trying but i can't work out how to see the result of the print command. i am using print_r($jsonarray); have also tried ... echo '
    '; print_r($jsonarray); echo '
    '; in the submit of the form but can't see any output. Have also tried putting the the print_r in a set_message but wasn't successful..... what is the best way of seeing the output?
    – Richard H Jun 14 '13 at 10:43
  • A bit more info on my environment. gulp. I am developing on a mac using a windows 7 vm and a drupal vm. I have been running the drupal site in safari but if the print_r might output to page source have switched to the windows 7 vm and looked at it in firefox, still not joy I'm afraid... – Richard H Jun 14 '13 at 10:52
  • @RichardH check out http://stackoverflow.com/questions/4933217/print-json-parsed-object – Vishal Khialani Jun 14 '13 at 10:52
  • I can now see
     in firefox which indicates the response hasn't been parsed/returned properly at all. However what would help me is if you look at the article http://webwash.net/articles/getting-started-json-drupal-7 half way down 'pulling in json objects' what would be the syntax for getting the 'location element out of the $request->data array?tx
    – Richard H Jun 14 '13 at 11:03
  • @RichardH I have added the syntax. – Vishal Khialani Jun 14 '13 at 11:26
  • Ok, thanks @Vishal. That'll do it. Assuming that $var[1] gets the 1st JSON element and so on. Many thanks for the references they are a big help. – Richard H Jun 14 '13 at 11:53