Перейти к содержанию
Официальный форум поддержки Simpla

Рекомендуемые сообщения

Добрый день.

Столкнулся с проблемой, ранее не замечал ее.

В textarea такие как note в заказе, meta_description пишу текст делаю с новой строки новое предложение, после сохранения страницы текст становится в одну строку. Почему? как исправить?

Ссылка на сообщение
Поделиться на другие сайты
4 часа назад, get31 сказал:

Добрый день.

Столкнулся с проблемой, ранее не замечал ее.

В textarea такие как note в заказе, meta_description пишу текст делаю с новой строки новое предложение, после сохранения страницы текст становится в одну строку. Почему? как исправить?

В view/CartView.php при отправке POST, видимо идет валидация и чистка полей textarea от параграфов.

Изменено пользователем sergeevizh
Ссылка на сообщение
Поделиться на другие сайты
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>

 

Изменено пользователем get31
Ссылка на сообщение
Поделиться на другие сайты
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>

 

Ну тут вроде чисто все. 
Нужно смотреть, файлы которые отправляют данные и смотреть в базу, как там данные записываются. 

Ссылка на сообщение
Поделиться на другие сайты
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),

 

Ссылка на сообщение
Поделиться на другие сайты
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}

все равно не помогает

Ссылка на сообщение
Поделиться на другие сайты
  • 2 недели спустя...

Попробуйте объяснить, почему Ваш вариант должен помочь...

Надо ж действовать не совсем абы как, а хоть немного прочитать описание функции...

Ссылка на сообщение
Поделиться на другие сайты
8 часов назад, phukortsin сказал:

Попробуйте объяснить, почему Ваш вариант должен помочь...

Надо ж действовать не совсем абы как, а хоть немного прочитать описание функции...

Попробовал чтобы убирался /n на всякий случай и БД добавлялись <br>, но не работает

Вы написали проблема в:

        if($type == 'string')
            return strval(preg_replace('/[^\p{L}\p{Nd}\d\s_\-\.\%\s]/ui', '', $val));

Но почему проблема должна быть тут если этот код удаляет из строки все символы. И раз удаляет все символы то как должно помочь для переноса строк в textarea?

Ссылка на сообщение
Поделиться на другие сайты
34 минуты назад, get31 сказал:

Попробовал чтобы убирался /n на всякий случай и БД добавлялись <br>, но не работает

Вы написали проблема в:


        if($type == 'string')
            return strval(preg_replace('/[^\p{L}\p{Nd}\d\s_\-\.\%\s]/ui', '', $val));

Но почему проблема должна быть тут если этот код удаляет из строки все символы. И раз удаляет все символы то как должно помочь для переноса строк в textarea?

Это тут непричем, нужно искать причину в другом. Ваш код выше я проверил, там проблем нет. 
Нужно смотреть в сторону может JS в шаблоне или еще чего. 
Без видимости вашего сайта можно долго гадать.

Ссылка на сообщение
Поделиться на другие сайты

Если только, попробуйте изменить:

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));
}

и отпишитесь

Ссылка на сообщение
Поделиться на другие сайты
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));
}

и отпишитесь

не помогло, все равно сохраняет в одну строку

Ссылка на сообщение
Поделиться на другие сайты
13 часов назад, get31 сказал:

не помогло, все равно сохраняет в одну строку

Значит дело у вас в другом и тут только вам искать причину или давайте доступ и причину выявить можно быстро. 

Ссылка на сообщение
Поделиться на другие сайты
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);

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...