public function ClassAttributeDependencies::buildForm in Dropdown Attributes 8
Form constructor.
Parameters
array $form: An associative array containing the structure of the form.
\Drupal\Core\Form\FormStateInterface $form_state: The current state of the form.
Return value
array The form structure.
Overrides ConfigFormBase::buildForm
File
- src/
Form/ ClassAttributeDependencies.php, line 31
Class
- ClassAttributeDependencies
- Administrative form for specifying the product attribute dependencies.
Namespace
Drupal\uc_dropdown_attributes\FormCode
public function buildForm(array $form, FormStateInterface $form_state, NodeTypeInterface $node_type = NULL) {
$form['#theme'] = array(
'node_edit_form',
);
$form['intro'] = array(
'#markup' => '<p>' . t('Since drop down attributes may not appear, they cannot be always required. The required checkbox applies only when the dropdown attribute appears. Any dropdown attribute is also checked under the attributes table to make sure it is not required there as this would cause validation errors.') . '</p><p>' . t('Unless you know what you are doing, all dependent (child) attributes should be marked as required on this page.') . '</p>',
);
$attributes = uc_class_get_attributes($node_type
->id());
$fields = array(
'aid',
'parent_aid',
'parent_values',
'required',
);
$dependencies = \Drupal::database()
->select('uc_dropdown_classes', 'classes')
->condition('classes.pcid', $node_type
->id())
->fields('classes', $fields)
->execute();
$form['class'] = array(
'#type' => 'hidden',
'#value' => $node_type
->id(),
);
$parent = array();
$values = array();
$required = array();
$values = $form_state
->getValues();
if (count($values)) {
foreach ($values['attributes'] as $key => $attribute) {
$parent[$key] = $attribute['parent'];
$values[$key] = $attribute['values'];
$required[$key] = $attribute['required'];
}
}
else {
foreach ($dependencies as $item) {
$parent[$item->aid] = $item->parent_aid;
$values[$item->aid] = unserialize($item->parent_values);
$required[$item->aid] = $item->required;
}
}
$form['attributes'] = array(
'#type' => 'table',
'#header' => array(
t('Attribute'),
t('Depends on'),
t('With values'),
t('Required'),
),
);
foreach ($attributes as $attribute) {
$form['attributes'][$attribute->aid]['attribute'] = array(
'#markup' => $attribute->name,
);
$options = array();
$options[0] = 'None';
foreach ($attributes as $option) {
if ($option->aid != $attribute->aid) {
$options[$option->aid] = $option->name;
}
}
$selected = array_key_exists($attribute->aid, $parent) ? $parent[$attribute->aid] : 0;
$form['attributes'][$attribute->aid]['parent'] = array(
'#type' => 'select',
'#options' => $options,
'#default_value' => $selected,
'#ajax' => array(
'callback' => 'uc_dropdown_attributes_dependent_callback',
'wrapper' => 'dropdown-' . $attribute->aid . '-replace',
),
);
$options = array();
if ($selected == 0) {
$type = 'select';
}
else {
$parent_attributes = uc_attribute_load($selected);
if (count($parent_attributes->options) == 0) {
$type = 'textfield';
}
else {
$type = 'select';
foreach ($parent_attributes->options as $oid => $option) {
$options[$oid] = $option->name;
}
}
}
if ($type == 'select') {
$form['attributes'][$attribute->aid]['values'] = array(
'#type' => 'select',
'#multiple' => TRUE,
'#prefix' => '<div id="dropdown-' . $attribute->aid . '-replace">',
'#suffix' => '</div>',
'#options' => $options,
);
if (array_key_exists($attribute->aid, $values)) {
$form['attributes'][$attribute->aid]['values']['#default_value'] = $values[$attribute->aid];
}
}
else {
$form['attributes'][$attribute->aid]['values'] = array(
'#type' => 'textfield',
'#prefix' => '<div id="dropdown-' . $attribute->aid . '-replace">',
'#suffix' => '</div>',
);
}
$form['attributes'][$attribute->aid]['required'] = array(
'#type' => 'checkbox',
'#returned_value' => 1,
'#default_value' => array_key_exists($attribute->aid, $required) ? $required[$attribute->aid] : 0,
);
}
return parent::buildForm($form, $form_state);
}