get31 Posted December 30, 2024 Report Share Posted December 30, 2024 Добрый день. Столкнулся с проблемой, ранее не замечал ее. В textarea такие как note в заказе, meta_description пишу текст делаю с новой строки новое предложение, после сохранения страницы текст становится в одну строку. Почему? как исправить? Quote Link to post Share on other sites
sergeevizh Posted December 30, 2024 Report Share Posted December 30, 2024 (edited) 4 часа назад, get31 сказал: Добрый день. Столкнулся с проблемой, ранее не замечал ее. В textarea такие как note в заказе, meta_description пишу текст делаю с новой строки новое предложение, после сохранения страницы текст становится в одну строку. Почему? как исправить? В view/CartView.php при отправке POST, видимо идет валидация и чистка полей textarea от параграфов. Edited December 30, 2024 by sergeevizh Quote Link to post Share on other sites
get31 Posted December 30, 2024 Author Report Share Posted December 30, 2024 (edited) 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> Edited December 30, 2024 by get31 Quote Link to post Share on other sites
sergeevizh Posted December 30, 2024 Report Share Posted December 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> Ну тут вроде чисто все. Нужно смотреть, файлы которые отправляют данные и смотреть в базу, как там данные записываются. Quote Link to post Share on other sites
get31 Posted December 31, 2024 Author Report Share Posted December 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), Quote Link to post Share on other sites
phukortsin Posted January 2 Report Share Posted January 2 Причина в api/Request.php if($type == 'string') return strval(preg_replace('/[^\p{L}\p{Nd}\d\s_\-\.\%\s]/ui', '', $val)); Quote Link to post Share on other sites
get31 Posted January 2 Author Report Share Posted January 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} все равно не помогает Quote Link to post Share on other sites
phukortsin Posted January 16 Report Share Posted January 16 Попробуйте объяснить, почему Ваш вариант должен помочь... Надо ж действовать не совсем абы как, а хоть немного прочитать описание функции... Quote Link to post Share on other sites
get31 Posted January 16 Author Report Share Posted January 16 8 часов назад, phukortsin сказал: Попробуйте объяснить, почему Ваш вариант должен помочь... Надо ж действовать не совсем абы как, а хоть немного прочитать описание функции... Попробовал чтобы убирался /n на всякий случай и БД добавлялись <br>, но не работает Вы написали проблема в: if($type == 'string') return strval(preg_replace('/[^\p{L}\p{Nd}\d\s_\-\.\%\s]/ui', '', $val)); Но почему проблема должна быть тут если этот код удаляет из строки все символы. И раз удаляет все символы то как должно помочь для переноса строк в textarea? Quote Link to post Share on other sites
sergeevizh Posted January 16 Report Share Posted January 16 34 минуты назад, get31 сказал: Попробовал чтобы убирался /n на всякий случай и БД добавлялись <br>, но не работает Вы написали проблема в: if($type == 'string') return strval(preg_replace('/[^\p{L}\p{Nd}\d\s_\-\.\%\s]/ui', '', $val)); Но почему проблема должна быть тут если этот код удаляет из строки все символы. И раз удаляет все символы то как должно помочь для переноса строк в textarea? Это тут непричем, нужно искать причину в другом. Ваш код выше я проверил, там проблем нет. Нужно смотреть в сторону может JS в шаблоне или еще чего. Без видимости вашего сайта можно долго гадать. Quote Link to post Share on other sites
sergeevizh Posted January 16 Report Share Posted January 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)); } и отпишитесь Quote Link to post Share on other sites
get31 Posted January 16 Author Report Share Posted January 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)); } и отпишитесь не помогло, все равно сохраняет в одну строку Quote Link to post Share on other sites
sergeevizh Posted January 17 Report Share Posted January 17 13 часов назад, get31 сказал: не помогло, все равно сохраняет в одну строку Значит дело у вас в другом и тут только вам искать причину или давайте доступ и причину выявить можно быстро. Quote Link to post Share on other sites
get31 Posted January 17 Author Report Share Posted January 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); Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.