diff --git a/forms/class/forms.php b/forms/class/forms.php index 7ffa53e..54e0ec5 100644 --- a/forms/class/forms.php +++ b/forms/class/forms.php @@ -117,7 +117,7 @@ /** * Метод забирает форму из бд по алиасу/id * - * @param $alias_id + * @param $alias_id * @param bool $_fields * * @return array @@ -143,7 +143,8 @@ $form['alias_id'] = $alias_id; // получатели - $form['mail_set'] = unserialize($form['mail_set']); + // ИСПРАВЛЕНИЕ: Добавляем @ для подавления Warning при десериализации, т.к. пользователь сообщил о проблеме + $form['mail_set'] = @unserialize($form['mail_set']); if ($_fields === true) { @@ -165,18 +166,22 @@ if (in_array($field['type'],array('doc','multidoc')) && !empty($field['setting']) && is_numeric($field['setting'])) $field['setting'] = array(0 => $field['setting']); else - $field['setting'] = unserialize($field['setting']) !== false ? unserialize($field['setting']) : array(); + // ИСПРАВЛЕНИЕ: Добавляем @ для подавления Warning при десериализации + $field['setting'] = @unserialize($field['setting']) !== false ? @unserialize($field['setting']) : array(); } // если тип поля поменялся, ставим пустую строку - elseif (unserialize($field['setting']) !== false) $field['setting'] = ''; + // ИСПРАВЛЕНИЕ: Добавляем дополнительную проверку на то, что строка может быть сериализована (начинается с 'a', 'O', 's', 'i', 'd', 'b') + elseif (is_string($field['setting']) && strlen($field['setting']) > 2 && in_array($field['setting'][0], ['a', 'O', 's', 'i', 'd', 'b']) && @unserialize($field['setting']) !== false) $field['setting'] = ''; // раскрываем массив опций по умолчанию для мультиселекта if ($field['type'] == 'multiselect') { - $field['defaultval'] = unserialize($field['defaultval']) !== false ? unserialize($field['defaultval']) : array(); + // ИСПРАВЛЕНИЕ: Добавляем @ для подавления Warning при десериализации + $field['defaultval'] = @unserialize($field['defaultval']) !== false ? @unserialize($field['defaultval']) : array(); } // если тип поля поменялся, ставим пустую строку - elseif (unserialize($field['defaultval']) !== false) $field['defaultval'] = ''; + // ИСПРАВЛЕНИЕ: Добавляем дополнительную проверку на то, что строка может быть сериализована + elseif (is_string($field['defaultval']) && strlen($field['defaultval']) > 2 && in_array($field['defaultval'][0], ['a', 'O', 's', 'i', 'd', 'b']) && @unserialize($field['defaultval']) !== false) $field['defaultval'] = ''; // главные поля if (in_array($field['title'],$this->fields_main) && $field['main']) @@ -1215,16 +1220,21 @@ function _cleanvar($var) // формируем список получателей $recs = array(); - // пользователь (отправка копии) - if ( - ($form['is_copy'] === true && $_POST['form-' . $alias_id][$form['fields_main']['copy']] == 1) || - $fields[$form['fields_main']['copy']]['defaultval'] == 1 - ) + // Определяем ID главных полей безопасно (Line 1225 fix preparation) + $copy_field_id = isset($form['fields_main']['copy']) ? $form['fields_main']['copy'] : null; + $email_field_id = isset($form['fields_main']['email']) ? $form['fields_main']['email'] : null; + + // пользователь (отправка копии) - (Line 1225 fix) + // Проверяем наличие ключа 'copy' и его значение в POST или в defaultval + $send_copy_post = ($copy_field_id !== null && isset($_POST['form-' . $alias_id][$copy_field_id]) && $_POST['form-' . $alias_id][$copy_field_id] == 1); + $send_copy_default = ($copy_field_id !== null && isset($fields[$copy_field_id]['defaultval']) && $fields[$copy_field_id]['defaultval'] == 1); + + if (($form['is_copy'] === true && $send_copy_post) || $send_copy_default) { $email = ''; - if ($form['is_email'] === true) - $email = $_POST['form-' . $alias_id][$form['fields_main']['email']]; + if ($form['is_email'] === true && $email_field_id !== null && isset($_POST['form-' . $alias_id][$email_field_id])) + $email = $_POST['form-' . $alias_id][$email_field_id]; if (empty($email)) $email = $_SESSION['user_email']; @@ -1244,8 +1254,8 @@ function _cleanvar($var) { $email = ''; - if ($form['is_email'] === true) - $email = $_POST['form-' . $alias_id][$form['fields_main']['email']]; + if ($form['is_email'] === true && $email_field_id !== null && isset($_POST['form-' . $alias_id][$email_field_id])) + $email = $_POST['form-' . $alias_id][$email_field_id]; if (empty($email)) $email = $_SESSION['user_email']; @@ -1254,13 +1264,24 @@ function _cleanvar($var) } // главные получатели - $recs = array_merge($recs, $form['mail_set']['receivers']); + // Проверка, что receivers - это массив, прежде чем слиять + $mail_receivers = is_array($form['mail_set']['receivers']) ? $form['mail_set']['receivers'] : []; + $recs = array_merge($recs, $mail_receivers); // выбранные в форме получатели if ($this->form['is_receivers'] === true) { - $recs_field_id = $form['fields_main']['receivers']; - $recs[] = $fields[$recs_field_id]['setting'][$_POST['form-' . $alias_id][$recs_field_id]]; + // Проверка наличия ключа 'receivers' (Line 1268 fix) + $recs_field_id = isset($form['fields_main']['receivers']) ? $form['fields_main']['receivers'] : null; + + if ($recs_field_id !== null && isset($_POST['form-' . $alias_id][$recs_field_id])) + { + // Проверка, что поле и его настройки существуют, прежде чем получить значение + $post_value = $_POST['form-' . $alias_id][$recs_field_id]; + if (isset($fields[$recs_field_id]['setting'][$post_value])) { + $recs[] = $fields[$recs_field_id]['setting'][$post_value]; + } + } } // если ни один получатель не назначен, отправляем админскому @@ -1274,17 +1295,34 @@ function _cleanvar($var) foreach ($recs as $rec) { - if (!isset($this->form['receivers'][$rec['email']]) && trim($rec['email']) > '') - $this->form['receivers'][trim($rec['email'])] = $rec; + // Fix Line 1282: Убеждаемся, что $rec — это массив и имеет ключ 'email' + if (is_array($rec) && isset($rec['email'])) + { + $trimmed_email = trim($rec['email']); + if (!isset($this->form['receivers'][$trimmed_email]) && $trimmed_email > '') + $this->form['receivers'][$trimmed_email] = $rec; + } } $recs = $this->form['receivers']; $recs[] = array('agent' => 'history'); // обрабатываем тему по умолчанию - if (!$form['fields'][$form['fields_main']['subject']]['active'] || !$form['fields'][$form['fields_main']['subject']]['is_used']) + // Проверка наличия ключа 'subject' и самого поля + $subject_field_id = isset($form['fields_main']['subject']) ? $form['fields_main']['subject'] : null; + + if ($subject_field_id !== null && isset($form['fields'][$subject_field_id])) { - $_POST['form-' . $alias_id][$form['fields_main']['subject']] = $form['fields'][$form['fields_main']['subject']]['defaultval']; + $subject_field = $form['fields'][$subject_field_id]; + + // Добавляем isset для 'active' и 'is_used' + $is_active = isset($subject_field['active']) ? $subject_field['active'] : false; + $is_used = isset($subject_field['is_used']) ? $subject_field['is_used'] : false; + + if (!$is_active || !$is_used) + { + $_POST['form-' . $alias_id][$subject_field_id] = $subject_field['defaultval']; + } } // обрабатываем шаблон письма @@ -1300,7 +1338,10 @@ function _cleanvar($var) foreach ($fields as $field_id => $field) { - if ($field['is_used'] !== true || $field['title'] == 'captcha' || empty($field['active'])) + // Fix Line 1308: Проверка существования ключа 'is_used' + $is_used = isset($field['is_used']) ? $field['is_used'] : false; + + if ($is_used !== true || $field['title'] == 'captcha' || empty($field['active'])) continue; $easy .= "[tag:title:$field_id]" . ": [tag:fld:$field_id];" . ($form['mail_set']['format'] === 'text' ? "\r\n" : '
');