Jump to content

Recommended Posts

Добрый день.

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

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

Link to post
Share on other sites
4 часа назад, get31 сказал:

Добрый день.

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

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

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

Edited by sergeevizh
Link to post
Share on other sites
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 by get31
Link to post
Share on other sites
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>

 

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

Link to post
Share on other sites
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),

 

Link to post
Share on other sites
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}

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

Link to post
Share on other sites
  • 2 weeks later...

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

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

Link to post
Share on other sites
8 часов назад, phukortsin сказал:

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

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

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

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

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

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

Link to post
Share on other sites
34 минуты назад, get31 сказал:

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

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


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

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

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

Link to post
Share on other sites

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

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

и отпишитесь

Link to post
Share on other sites
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));
}

и отпишитесь

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

Link to post
Share on other sites
13 часов назад, get31 сказал:

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

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

Link to post
Share on other sites
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);

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...