get31 Опубликовано 30 декабря, 2024 Жалоба Поделиться Опубликовано 30 декабря, 2024 Добрый день. Столкнулся с проблемой, ранее не замечал ее. В textarea такие как note в заказе, meta_description пишу текст делаю с новой строки новое предложение, после сохранения страницы текст становится в одну строку. Почему? как исправить? Цитата Ссылка на сообщение Поделиться на другие сайты
sergeevizh Опубликовано 30 декабря, 2024 Жалоба Поделиться Опубликовано 30 декабря, 2024 (изменено) 4 часа назад, get31 сказал: Добрый день. Столкнулся с проблемой, ранее не замечал ее. В textarea такие как note в заказе, meta_description пишу текст делаю с новой строки новое предложение, после сохранения страницы текст становится в одну строку. Почему? как исправить? В view/CartView.php при отправке POST, видимо идет валидация и чистка полей textarea от параграфов. Изменено 30 декабря, 2024 пользователем sergeevizh Цитата Ссылка на сообщение Поделиться на другие сайты
get31 Опубликовано 30 декабря, 2024 Автор Жалоба Поделиться Опубликовано 30 декабря, 2024 (изменено) 1 час назад, sergeevizh сказал: В view/CartView.php при отправке POST, видимо идет валидация и чистка полей textarea от параграфов. в simpla/MailingAdmin.php <?PHP require_once('api/Simpla.php'); class MailingAdmin extends Simpla { public function fetch() { $post = new stdClass(); if ($this->request->method('post')) { // Обработка данных формы mailing $post->id = $this->request->post('id', 'integer'); $post->name = $this->request->post('name'); $post->date = date('Y-m-d', strtotime($this->request->post('date'))); $post->message = $this->request->post('message'); $post->visible = $this->request->post('visible', 'boolean'); $post->url = $this->request->post('url'); } else { // Обработка GET-запроса (загрузка данных для редактирования) $post->id = $this->request->get('id', 'integer'); $post = $this->mailings->get_mailing(intval($post->id)); } if (empty($post)) { $post = new stdClass(); } if (empty($post->date)) { $date_format = !empty($this->settings->date_format) ? $this->settings->date_format : 'Y-m-d'; $post->date = date($date_format, time()); } $this->design->assign('post', $post); return $this->design->fetch('mailing.tpl'); } } в шаблоне вывожу <textarea name="message" type="text">{$post->message|escape}</textarea> Изменено 30 декабря, 2024 пользователем get31 Цитата Ссылка на сообщение Поделиться на другие сайты
sergeevizh Опубликовано 30 декабря, 2024 Жалоба Поделиться Опубликовано 30 декабря, 2024 58 минут назад, get31 сказал: в simpla/MailingAdmin.php <?PHP require_once('api/Simpla.php'); class MailingAdmin extends Simpla { public function fetch() { $post = new stdClass(); if ($this->request->method('post')) { // Обработка данных формы mailing $post->id = $this->request->post('id', 'integer'); $post->name = $this->request->post('name'); $post->date = date('Y-m-d', strtotime($this->request->post('date'))); $post->message = $this->request->post('message'); $post->visible = $this->request->post('visible', 'boolean'); $post->url = $this->request->post('url'); } else { // Обработка GET-запроса (загрузка данных для редактирования) $post->id = $this->request->get('id', 'integer'); $post = $this->mailings->get_mailing(intval($post->id)); } if (empty($post)) { $post = new stdClass(); } if (empty($post->date)) { $date_format = !empty($this->settings->date_format) ? $this->settings->date_format : 'Y-m-d'; $post->date = date($date_format, time()); } $this->design->assign('post', $post); return $this->design->fetch('mailing.tpl'); } } в шаблоне вывожу <textarea name="message" type="text">{$post->message|escape}</textarea> Ну тут вроде чисто все. Нужно смотреть, файлы которые отправляют данные и смотреть в базу, как там данные записываются. Цитата Ссылка на сообщение Поделиться на другие сайты
get31 Опубликовано 31 декабря, 2024 Автор Жалоба Поделиться Опубликовано 31 декабря, 2024 10 часов назад, sergeevizh сказал: Ну тут вроде чисто все. Нужно смотреть, файлы которые отправляют данные и смотреть в базу, как там данные записываются. api/Mailings.php <?php require_once('Simpla.php'); class Mailings extends Simpla { /* * * Функция возвращает пост по его id или url * (в зависимости от типа аргумента, int - id, string - url) * @param $id id или url поста * */ public function get_mailing($id) { if(is_int($id)) $where = $this->db->placehold(' WHERE b.id=? ', intval($id)); else $where = $this->db->placehold(' WHERE b.url=? ', $id); $query = $this->db->placehold("SELECT b.id, b.url, b.name, b.message, b.visible, b.date, b.position FROM __mailings b $where LIMIT 1"); if($this->db->query($query)) return $this->db->result(); else return false; } /* * * Функция возвращает массив постов, удовлетворяющих фильтру * @param $filter * */ public function get_mailings($filter = array()) { // По умолчанию $limit = 1000; $page = 1; $post_id_filter = ''; $visible_filter = ''; $keyword_filter = ''; $order = 'b.date DESC, b.id DESC'; $posts = array(); if(isset($filter['limit'])) $limit = max(1, intval($filter['limit'])); if(isset($filter['page'])) $page = max(1, intval($filter['page'])); if(!empty($filter['id'])) $post_id_filter = $this->db->placehold('AND b.id in(?@)', (array)$filter['id']); if(isset($filter['visible'])) $visible_filter = $this->db->placehold('AND b.visible = ?', intval($filter['visible'])); if(!empty($filter['sort'])) switch ($filter['sort']) { case 'position': $order = 'b.position DESC'; break; case 'name': $order = 'b.name'; break; case 'date': $order = 'b.date DESC,b.id DESC'; break; } if(isset($filter['keyword'])) { $keywords = explode(' ', $filter['keyword']); foreach($keywords as $keyword) $keyword_filter .= $this->db->placehold('AND (b.name LIKE "%'.$this->db->escape(trim($keyword)).'%" OR b.message LIKE "%'.$this->db->escape(trim($keyword)).'%") '); } $sql_limit = $this->db->placehold(' LIMIT ?, ? ', ($page-1)*$limit, $limit); $query = $this->db->placehold("SELECT b.id, b.url, b.name, b.message, b.visible, b.date, b.position FROM __mailings b WHERE 1 $post_id_filter $visible_filter $keyword_filter ORDER BY $order $sql_limit"); $this->db->query($query); return $this->db->results(); } /* * * Функция вычисляет количество постов, удовлетворяющих фильтру * @param $filter * */ public function count_mailings($filter = array()) { $post_id_filter = ''; $visible_filter = ''; $keyword_filter = ''; if(!empty($filter['id'])) $post_id_filter = $this->db->placehold('AND b.id in(?@)', (array)$filter['id']); if(isset($filter['visible'])) $visible_filter = $this->db->placehold('AND b.visible = ?', intval($filter['visible'])); if(isset($filter['keyword'])) { $keywords = explode(' ', $filter['keyword']); foreach($keywords as $keyword) $keyword_filter .= $this->db->placehold('AND (b.name LIKE "%'.$this->db->escape(trim($keyword)).'%" OR b.message LIKE "%'.$this->db->escape(trim($keyword)).'%") '); } $query = "SELECT COUNT(distinct b.id) as count FROM __mailings b WHERE 1 $post_id_filter $visible_filter $keyword_filter"; if($this->db->query($query)) return $this->db->result('count'); else return false; } /* * * Создание поста * @param $post * */ public function add_mailing($post) { if(isset($post->date)) { $date = $post->date; unset($post->date); $date_query = $this->db->placehold(', date=STR_TO_DATE(?, ?)', $date, $this->settings->date_format); } $query = $this->db->placehold("INSERT INTO __mailings SET ?% $date_query", $post); if(!$this->db->query($query)) return false; else return $this->db->insert_id(); } /* * * Обновить пост(ы) * @param $post * */ public function update_mailing($id, $post) { $query = $this->db->placehold("UPDATE __mailings SET ?% WHERE id in(?@) LIMIT ?", $post, (array)$id, count((array)$id)); $this->db->query($query); return $id; } /* * * Удалить пост * @param $id * */ public function delete_mailing($id) { if(!empty($id)) { $query = $this->db->placehold("DELETE FROM __mailings WHERE id=? LIMIT 1", intval($id)); if($this->db->query($query)) { $query = $this->db->placehold("DELETE FROM __comments WHERE type='mailing' AND object_id=? LIMIT 1", intval($id)); if($this->db->query($query)) return true; } } return false; } } БД CREATE TABLE IF NOT EXISTS `s_mailings` ( `id` int(11) NOT NULL AUTO_INCREMENT, `category_id` int(11) NOT NULL DEFAULT '0', `name` varchar(500) CHARACTER SET utf8mb4 NOT NULL, `url` varchar(255) NOT NULL, `message` text CHARACTER SET utf8mb4 NOT NULL, `visible` tinyint(1) NOT NULL DEFAULT '0', `date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `position` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `enabled` (`visible`), KEY `url` (`url`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ; INSERT INTO `s_mailings` (`id`, `category_id`, `name`, `url`, `message`, `visible`, `date`, `position`) VALUES (12, 0, 'Тест', '677001661075f38cae44adbc', 'Текст текст текст текст', 1, '2024-12-26 22:00:00', 0), Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 2 января Жалоба Поделиться Опубликовано 2 января Причина в api/Request.php if($type == 'string') return strval(preg_replace('/[^\p{L}\p{Nd}\d\s_\-\.\%\s]/ui', '', $val)); Цитата Ссылка на сообщение Поделиться на другие сайты
get31 Опубликовано 2 января Автор Жалоба Поделиться Опубликовано 2 января 1 час назад, phukortsin сказал: Причина в api/Request.php if($type == 'string') return strval(preg_replace('/[^\p{L}\p{Nd}\d\s_\-\.\%\s]/ui', '', $val)); У меня есть эти строки. Попробовал сделать if($type == 'string') { return strval(preg_replace('/[^\p{L}\p{Nd}\d\s_\-\.\%\n\r]/ui', '', $val)); а в шаблоне {$post->message|nl2br} все равно не помогает Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 16 января Жалоба Поделиться Опубликовано 16 января Попробуйте объяснить, почему Ваш вариант должен помочь... Надо ж действовать не совсем абы как, а хоть немного прочитать описание функции... Цитата Ссылка на сообщение Поделиться на другие сайты
get31 Опубликовано 16 января Автор Жалоба Поделиться Опубликовано 16 января 8 часов назад, phukortsin сказал: Попробуйте объяснить, почему Ваш вариант должен помочь... Надо ж действовать не совсем абы как, а хоть немного прочитать описание функции... Попробовал чтобы убирался /n на всякий случай и БД добавлялись <br>, но не работает Вы написали проблема в: if($type == 'string') return strval(preg_replace('/[^\p{L}\p{Nd}\d\s_\-\.\%\s]/ui', '', $val)); Но почему проблема должна быть тут если этот код удаляет из строки все символы. И раз удаляет все символы то как должно помочь для переноса строк в textarea? Цитата Ссылка на сообщение Поделиться на другие сайты
sergeevizh Опубликовано 16 января Жалоба Поделиться Опубликовано 16 января 34 минуты назад, get31 сказал: Попробовал чтобы убирался /n на всякий случай и БД добавлялись <br>, но не работает Вы написали проблема в: if($type == 'string') return strval(preg_replace('/[^\p{L}\p{Nd}\d\s_\-\.\%\s]/ui', '', $val)); Но почему проблема должна быть тут если этот код удаляет из строки все символы. И раз удаляет все символы то как должно помочь для переноса строк в textarea? Это тут непричем, нужно искать причину в другом. Ваш код выше я проверил, там проблем нет. Нужно смотреть в сторону может JS в шаблоне или еще чего. Без видимости вашего сайта можно долго гадать. Цитата Ссылка на сообщение Поделиться на другие сайты
sergeevizh Опубликовано 16 января Жалоба Поделиться Опубликовано 16 января Если только, попробуйте изменить: if($type == 'string') { return strval(preg_replace('/[^\p{L}\p{Nd}\d\s_\-\.\%\s]/ui', '', $val)); } на if($type == 'string') { return preg_replace('/[^\p{L}\p{Nd}\d\s_\-\.\%\s]/ui', '', strval($val)); } и отпишитесь Цитата Ссылка на сообщение Поделиться на другие сайты
get31 Опубликовано 16 января Автор Жалоба Поделиться Опубликовано 16 января 2 часа назад, sergeevizh сказал: Если только, попробуйте изменить: if($type == 'string') { return strval(preg_replace('/[^\p{L}\p{Nd}\d\s_\-\.\%\s]/ui', '', $val)); } на if($type == 'string') { return preg_replace('/[^\p{L}\p{Nd}\d\s_\-\.\%\s]/ui', '', strval($val)); } и отпишитесь не помогло, все равно сохраняет в одну строку Цитата Ссылка на сообщение Поделиться на другие сайты
sergeevizh Опубликовано 17 января Жалоба Поделиться Опубликовано 17 января 13 часов назад, get31 сказал: не помогло, все равно сохраняет в одну строку Значит дело у вас в другом и тут только вам искать причину или давайте доступ и причину выявить можно быстро. Цитата Ссылка на сообщение Поделиться на другие сайты
get31 Опубликовано 17 января Автор Жалоба Поделиться Опубликовано 17 января 4 часа назад, sergeevizh сказал: Значит дело у вас в другом и тут только вам искать причину или давайте доступ и причину выявить можно быстро. Нашел проблему. в api/Database.php public function placehold() { $args = func_get_args(); $tmpl = array_shift($args); // Заменяем все __ на префикс, но только необрамленные кавычками $tmpl = preg_replace('/([^"\'0-9a-z_])__([a-z_]+[^"\'])/i', "\$1".$this->config->db_prefix."\$2", $tmpl); // fix формата запроса, что бы при дебаге влез в 300 символов $tmpl = preg_replace('/\s+/', ' ', $tmpl); if (!empty($args)) { $result = $this->sql_placeholder_ex($tmpl, $args, $error); if ($result === false) { throw new \Exception('Placeholder substitution error. Diagnostics: ' . $error ); } return $result; } else { return $tmpl; } } проблема в самой строке - $tmpl = preg_replace('/\s+/', ' ', $tmpl); Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.