I'm building a custom compound field in Drupal 8. I'm almost there, but one final bit I'm missing: when I add this new field type to a content type, the taxonomy autocomplete field pulls from every taxonomy vocabulary on the site.
I'm trying to determine how to only pull from a specific "plant_parts" vocabulary. Currently, within my widget code, I've got this:
$element['plant_component_measured'] = array(
'#type' => 'entity_autocomplete',
'#target_type' => 'taxonomy_term',
'#title' => t('Plant part'),
'#prefix' => '<table><tr><td>',
'#suffix' => ' ',
'#default_value' => isset($items[$delta]->plant_component_measured) ?
$items[$delta]->plant_component_measured : NULL,
);
You can use STATE or CONFIG API for saving the default value and specify your taxonomy type in #selection_settings['target_bundles'] = ['plant_part'] as below
use Drupal\taxonomy\Entity\Term;
:
:
if (empty(\Drupal::state()->get('YOUR_MODULE_NAME.plant_component_measured')))
\Drupal::state()->set('YOUR_MODULE_NAME.plant_component_measured', '');
$entity = Term::load(\Drupal::state()->get('YOUR_MODULE_NAME.plant_component_measured'));
$element['plant_component_measured'] = [
'#type' => 'entity_autocomplete',
'#target_type' => 'taxonomy_term',
'#title' => $this->t('Plant part'),
'#description' => $this->t('Plant part'),
'#prefix' => '<table><tr><td>',
'#suffix' => ' ',
'#default_value' => $entity,
'#selection_handler' => 'default',
'#selection_settings' => [
'target_bundles' => [
'plant_part'
],
],
];
I have a select form control in Drupal 7. How to call a function to whenever onchange event fires.
This is my select form control code:
$form['id']['signature'] = array(
'#type' => 'select',
'#options' => array(
0 => t('Browse...'),
1 => t('Sign...'),
2 => t('Clear...'),
),
);
You could probably do it with '#attibutes'.
eg.
$form['id']['signature']['#attributes'] = array('onchange' => array('myFunction()'))
Though I never like adding event attributes to html tags, so you could also probably do it by adding inline (or extenal) javascript to the form with a behavior like this:
$form['id']['signature'] = array(
'#type' => 'select',
'#options' => array(
0 => t('Browse...'),
1 => t('Sign...'),
2 => t('Clear...'),
),
'#attributes' => array(
'id' => array('signature-goes-here'),
),
);
$form['id']['signature']['#attached']['js'][] = array(
'data' => "
Drupal.behaviors.signature = function (context) {
$('#signature-goes-here', context).change(function () {
// Do stuff here.
});
}
",
'type' => 'inline',
);
But if you wanted to fire ajax when this form item changes, you would probably use the Drupal form api functionality.
i have quick questions: i need to set the month dates on my form to English settings; they are curretnly set in Romanian Langugauge
i followed the example set by bakura10 / gist:3705417 and set my dates as such:
$this->add(array(
'type' => 'Zend\Form\Element\DateSelect',
'name' => 'birthDate',
'options' => array(
'label' => 'Date',
'create_empty_option' => true,
'day_attributes' => array(
'data-placeholder' => 'Day',
'style' => 'width: 20%',
),
'month_attributes' => array(
'data-placeholder' => 'Month',
'style' => 'width: 20%',
),
'year_attributes' => array(
'data-placeholder' => 'Year',
'style' => 'width: 20%',
)
)
));
i then set my view helper as such;
echo $this->formDateSelect($this->form->get('birthDate'), IntlDateFormatter::LONG, 'ro_RO');
the problem is that this obviously gives me romanian setting; i dont know where to get the settings for English; i tried this but it does not work;
echo $this->formDateSelect($this->form->get('birthDate'), IntlDateFormatter::LONG, 'en');
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 ...
..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.
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
I am trying to create a filtering form for a Drupal module that show hours. I am trying to get a date field to only show if the user wants to filter by it. I have a text field further down in the code that is hiding. I am not sure what I should do. Here is my code for the field:
$form['filters']['start-do'] = array(
'#type' => 'checkbox',
'#title' => t('Filter by start date'),
);
$form['filters']['start'] = array(
'#type' => 'date',
'#title' => t('Start Date'),
'#description' => t('Show hours that started after this date.'),
'#states' => array(
'invisible' => array(
':input[name="start-do"]' => array('checked' => FALSE)
)
)
);
You have forgotten about "container" type form element in your example.
Try something like this:
$form['filters']['start-do'] = array(
'#type' => 'checkbox',
'#title' => t('Filter by start date'),
);
$form['filters']['container'] = array(
'#type' => 'container',
'#states' => array(
'invisible' => array(
'input[name="start-do"]' => array('checked' => FALSE)
)
)
);
$form['filters']['container']['start'] = array(
'#type' => 'date',
'#title' => t('Start Date'),
'#description' => t('Show hours that started after this date.'),
);
It's always worth to check Forms API reference: http://api.drupal.org/api/drupal/developer--topics--forms_api_reference.html/7#states