View source
<?php
namespace Drupal\uc_attribute\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
abstract class ObjectAttributesAddFormBase extends FormBase {
protected $attributes = [];
protected $attributeTable;
protected $optionTable;
protected $idField;
protected $idValue;
public function getFormId() {
return 'uc_object_attributes_add_form';
}
protected function buildBaseForm(array $form, FormStateInterface $form_state) {
$used_aids = [];
foreach ($this->attributes as $attribute) {
$used_aids[] = $attribute->aid;
}
$unused_attributes = [];
$result = \Drupal::database()
->query("SELECT a.aid, a.name, a.label FROM {uc_attributes} a LEFT JOIN {uc_attribute_options} ao ON a.aid = ao.aid GROUP BY a.aid, a.name, a.label ORDER BY a.name");
foreach ($result as $attribute) {
if (!in_array($attribute->aid, $used_aids)) {
$unused_attributes[$attribute->aid] = $attribute->name;
}
}
$form['add_attributes'] = [
'#type' => 'checkboxes',
'#title' => $this
->t('Attributes'),
'#options' => $unused_attributes ?: [
$this
->t('No attributes left to add.'),
],
'#disabled' => empty($unused_attributes),
];
$form['actions'] = [
'#type' => 'actions',
];
$form['actions']['add'] = [
'#type' => 'submit',
'#value' => $this
->t('Add attributes'),
];
return $form;
}
public function submitForm(array &$form, FormStateInterface $form_state) {
foreach (array_filter($form_state
->getValue('add_attributes')) as $aid) {
$attribute = uc_attribute_load($aid);
$oid = 0;
if (isset($attribute->options)) {
foreach ($attribute->options as $option) {
$option->{$this->idField} = $this->idValue;
unset($option->name);
unset($option->aid);
\Drupal::database()
->insert($this->optionTable)
->fields((array) $option)
->execute();
}
if ($option = reset($attribute->options)) {
$oid = $option->oid;
}
}
$select = \Drupal::database()
->select('uc_attributes', 'a')
->condition('aid', $aid);
$select
->addExpression(':id', $this->idField, [
':id' => $this->idValue,
]);
$select
->addField('a', 'aid');
$select
->addField('a', 'label');
$select
->addField('a', 'ordering');
$select
->addExpression(':oid', 'default_option', [
':oid' => $oid,
]);
$select
->addField('a', 'required');
$select
->addField('a', 'display');
\Drupal::database()
->insert($this->attributeTable)
->from($select)
->execute();
}
$num = count(array_filter($form_state
->getValue('add_attributes')));
if ($num > 0) {
$this
->attributesAdded();
$this
->messenger()
->addMessage($this
->formatPlural($num, '1 attribute has been added.', '@count attributes have been added.'));
}
}
protected function attributesAdded() {
}
}