public function saveSettings(array $settings)
{
/* @var $stmt EntityStatement */
$stmt = call_user_func([$this->entityClass, 'prepareSaveStatement']);
$encryptedFields = [];
if (method_exists($this->entityClass, 'listEncryptedFields')) {
$encryptedFields = call_user_func("{$this->entityClass}::listEncryptedFields");
}
try {
$stmt->start();
foreach ($settings as $index => $data) {
/* @var $setting Setting */
$setting = new $this->entityClass();
if (is_array($data)) {
foreach ($setting->getIterator() as $name => $value) {
if (isset($data[$name])) {
$setting->{$name} = $data[$name];
}
}
} else {
$setting->name = $index;
$setting->value = $data;
}
$this->offsetSet($index, $setting);
/* @var $field Field */
if (in_array($setting->name, $encryptedFields)) {
$field = $setting->getIterator()->fields()['value'];
$prevType = $field->getType();
$field->setType(new EncryptedType($field));
}
$stmt->execute($setting, $data === false ? EntityStatement::TYPE_DELETE : null);
if (isset($prevType)) {
$field->setType($prevType);
$prevType = null;
}
if ($data === false) {
$this->offsetUnset($index);
}
}
$stmt->commit();
} catch (Exception $e) {
$stmt->rollback();
throw $e;
}
}