Jump to content

HTML in Category Description


Recommended Posts

  • 2 weeks later...

Это предъява! xD

Ну, а если серьезно? Действительно как его добавить? Поиском я что-то не нашел ответа на сей вопрос. Может кто ткнёт носом? :)

Link to comment
Share on other sites

  • 1 month later...

Стнанно. Это та же страница, что у меня, но выглядит она совсем иначе! На Вашей нет ничего. Что-то у Вас неправильно работает. Но я в части корректной работы движка разбираюсь пока слабо. Совсем недавно начал с этим знакомиться.

Link to comment
Share on other sites

  • 4 weeks later...

А можно поподробнее? Что и где нужно создать? У меня тоже отсутствует визуальный редактор для редактирования категорий.

Link to comment
Share on other sites

  • 2 weeks later...

Нужно править исходники. Покопавшись в коде выяснилось, что для того чтоб не срабатывал strip_tags в описаниях категорий нужно заменить функцию getTranslationsFieldsChild() в classes/Category.php на то что снизу

   public function getTranslationsFieldsChild()
   {
       parent::validateFieldsLang();

       $fieldsArray = array('name', 'link_rewrite', 'meta_title', 'meta_keywords', 'meta_description');
       $fields = array();
       $languages = Language::getLanguages();
       $defaultLanguage = Configuration::get('PS_LANG_DEFAULT');
       foreach ($languages as $language)
       {
           $fields[$language['id_lang']]['id_lang'] = $language['id_lang'];
           $fields[$language['id_lang']][$this->identifier] = intval($this->id);
           $fields[$language['id_lang']]['description'] = (isset($this->description[$language['id_lang']])) ? pSQL($this->description[$language['id_lang']], true) : '';
           foreach ($fieldsArray as $field)
           {
               if (!Validate::isTableOrIdentifier($field))
                   die(Tools::displayError());

               /* Check fields validity */
               if (isset($this->{$field}[$language['id_lang']]) AND !empty($this->{$field}[$language['id_lang']]))
                   $fields[$language['id_lang']][$field] = pSQL($this->{$field}[$language['id_lang']]);
               elseif (in_array($field, $this->fieldsRequiredLang))
                   $fields[$language['id_lang']][$field] = pSQL($this->{$field}[$defaultLanguage]);
               else
                   $fields[$language['id_lang']][$field] = '';
           }
       }
       return $fields;

   }


ВИзуальный редактор не появится зато можно вводить хтмл. Для визуального редактора нужно править AdminCategories.php.
Ищем там <textarea name="description_.... и исправляем на <textarea class="rte" name="description_....
Дальше после </form> вставляем:

           [removed][removed]
           [removed]
           function tinyMCEInit(element)
           {
               $().ready(function() {
                   $(element).tinymce({
                       // Location of TinyMCE script
                       script_url : \''.__PS_BASE_URI__.'js/tinymce/jscripts/tiny_mce/tiny_mce.js\',
                       // General options
                       theme : "advanced",
                       //plugins : "safari,pagebreak,style,layer,table,advimage,advlink,inlinepopups,media,searchreplace,contextmenu,paste,directionality,fullscreen",
                       // Theme options
                       theme_advanced_buttons1 : "newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,fontsizeselect",
                       theme_advanced_buttons2 : "bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,cleanup,code,,|,forecolor,backcolor",
                       theme_advanced_buttons3 : "",
                       theme_advanced_buttons4 : "",
                       theme_advanced_toolbar_location : "top",
                       theme_advanced_toolbar_align : "left",
                       theme_advanced_statusbar_location : "bottom",
                       theme_advanced_resizing : false,
                       content_css : "'.__PS_BASE_URI__.'themes/'._THEME_NAME_.'/css/global.css",
                       document_base_url : "'.__PS_BASE_URI__.'",
                       width: "350",
                       height: "auto",
                       font_size_style_values : "8pt, 10pt, 12pt, 14pt, 18pt, 24pt, 36pt",
                       // Drop lists for link/image/media/template dialogs
                       template_external_list_url : "lists/template_list.js",
                       external_link_list_url : "lists/link_list.js",
                       external_image_list_url : "lists/image_list.js",
                       media_external_list_url : "lists/media_list.js",
                       elements : "nourlconvert",
                       convert_urls : false,
                       language : "'.(file_exists(_PS_ROOT_DIR_.'/js/tinymce/jscripts/tiny_mce/langs/'.$iso.'.js') ? $iso : 'en').'"
                   });
               });
           }
           tinyMCEInit(\'textarea.rte\');
           [removed]


Должно заработать.
ЗЫ: взглянув на код возникло легкое дежавю - такой говнокод видел когда работал с индусами не слишком высокой квалификации

Link to comment
Share on other sites

  • 1 month later...
  • 7 months later...
...нужно заменить функцию getTranslationsFieldsChild() в classes/Category.php...


Да, спасибо! Помогло!
Но при наведении курсора, над категорией всплывает это описание, а оно у меня большое, и все теги видны теперь - это так замусоривает! :((((

Как бы теперь сделать невидимым это облачко с описанием?
Link to comment
Share on other sites

  • 1 year later...
  • 2 weeks later...

В PrestaShop 1.5 к полю Description можно легко прикрепить HTML-редактор TinyMCE

 

Для этого в файле controllers/admin/AdminCmsController.php нужно найти следующий код:

 


array(
'type' => 'textarea',
'label' => $this->l('Description:'),
'name' => 'description',
'lang' => true,
'rows' => 10,
'cols' => 100,
'hint' => $this->l('Invalid characters:').' <>;=#{}'
),

(399 строка)

и заменить его на этот:


array(
'type' => 'textarea',
'label' => $this->l('Description:'),
'name' => 'description',
'lang' => true,
'rows' => 10,
'cols' => 100,
'hint' => $this->l('Invalid characters:').' <>;=#{}',
'autoload_rte' => true
),

строка 'autoload_rte' => true отвечает за подключение редактора.

 

strip_tags для description нет, так что проблем с сохранением не будет :)

  • Like 1
Link to comment
Share on other sites

  • 8 months later...

В PrestaShop 1.5 к полю Description можно легко прикрепить HTML-редактор TinyMCE

 

Для этого в файле controllers/admin/AdminCmsController.php нужно найти следующий код:

 


array(
'type' => 'textarea',
'label' => $this->l('Description:'),
'name' => 'description',
'lang' => true,
'rows' => 10,
'cols' => 100,
'hint' => $this->l('Invalid characters:').' <>;=#{}'
),

(399 строка)

и заменить его на этот:


array(
'type' => 'textarea',
'label' => $this->l('Description:'),
'name' => 'description',
'lang' => true,
'rows' => 10,
'cols' => 100,
'hint' => $this->l('Invalid characters:').' <>;=#{}',
'autoload_rte' => true
),

строка 'autoload_rte' => true отвечает за подключение редактора.

 

strip_tags для description нет, так что проблем с сохранением не будет :)

 

А вот в версии PrestaShop 1.5.4.1 все по-другому... Озадачился тем же вопросом.

И описанный тут метод для новой престы уже не работает.

Кто знает новое решение, подскажите. Я в этом деле простой пользователь, не могу понят где что искать и на что менять и т.п. Поэтому и прошу совета.

Как в новую PrestaShop 1.5.4.1 добавить визуальный редактор TinyMCE! И немало важно расширенную версию, т.е. с кнопками скрытия подробного описания. Если это конечно возможно!? Ну чтобы когда пользователь на сайте видел категории в компактом виде, а когда уже проваливался в эту категорию то видел бы кнопку ПОДРОБНЕЕ... и при необходимости читал полную стать.

 

Женя, смотрю тут ту один всех выручаешь. Есть какие идем? Подскажи пожалуйста. Спасибо!

Edited by Oleg2013 (see edit history)
Link to comment
Share on other sites

  • 3 weeks later...
  • 4 weeks later...

в версии 1.5.4.1 в controllers/admin/AdminCmsController.php

нужно добавить к:

array(

'type' => 'text',

'label' => $this->l('Meta description'),

'name' => 'meta_description',

'lang' => true,

'hint' => $this->l('Invalid characters:').' <>;=#{}',

'size' => 70

array(

'type' => 'text',

'label' => $this->l('Meta description'),

'name' => 'meta_description',

'lang' => true,

'hint' => $this->l('Invalid characters:').' <>;=#{}',

'size' => 70

),

строку:

'autoload_rte' => true

 

 

после этого будет видеть html теги.

Link to comment
Share on other sites

в версии 1.5.4.1 в controllers/admin/AdminCmsController.php

нужно добавить к:

 

array(
				'type' => 'text',
				'label' => $this->l('Meta description'),
				'name' => 'meta_description',
				'lang' => true,
				'hint' => $this->l('Invalid characters:').' <>;=#{}',
				'size' => 70
			),

строку:

'autoload_rte' => true

 

 

после этого будет видеть html теги.

 

Привет! Спасибо за ответ!

А нужно добавлять в оба array(....) строку?

 'autoload_rte' => true

 

Сначала не увидел, что ты случайно вставил два одинаковых кода)))

Сейчас все понятно!

Спасибо, попробуем =)

 

в версии 1.5.4.1 в controllers/admin/AdminCmsController.php

В код:

array(
'type' => 'text',
'label' => $this->l('Meta description'),
'name' => 'meta_description',
'lang' => true,
'hint' => $this->l('Invalid characters:').' <>;=#{}',
'size' => 70
),

Добавляем строку:

 'autoload_rte' => true

 

________________________________________________________________

ПОПРОБОВАЛ НЕ ПОМОГЛО! =(((

Ниже скрин экрана, в самой категории он теги и так видел, но вот они вылезали в description при наведении курсора мыши на категорию.

Так все и осталось...

post-637649-0-26455100-1377556816_thumb.jpg

Edited by Oleg2013 (see edit history)
Link to comment
Share on other sites

Ну так залесь в шаблон блока категорий и удали title там который выводит описание категории в себе

Так не пойдет! Описания то нужны! ;)

Скорее всего это просто браузеры не умеют в Title читать теги (

Link to comment
Share on other sites

Исправления:

в версии 1.5.4.1 в controllers/admin/AdminCmsController.php

должно быть:

array(

'type' => 'text',

'label' => $this->l('Meta description'),

'name' => 'meta_description',

'lang' => true,

'hint' => $this->l('Invalid characters:').' <>;=#{}',

'size' => 70,

'autoload_rte' => true,

'lang' => true,

 

),

Тогда не вылазят ошибки в админке при добавлении статей.

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

убрать title для категорий можно тут:

modules/blockcategories/category-tree-branch.tpl

в этой строке убераете содержимое в кавычках у title="" Получится так:

<a href="{$node.link|escape:'html':'UTF-8'}" {if isset($currentCategoryId) && $node.id == $currentCategoryId}class="selected"{/if} title="">{$node.name|escape:'html':'UTF-8'}</a>

Если не срабатывает, отключаете кеш и переключитесь на Принудительная перекомпиляция.

Если и это не поможет, то почистите файлы кеша. это не может не сработать)

Про <br /> весьма странный вопрос.. :ph34r: .Копайте здесь: http://htmlbook.ru/html/br

Link to comment
Share on other sites

Например:

В редакторе следующий код:

<p>Подключил редактор.</p>
<p>Всё нормально.</p>
<p>Но что генерит тег переноса строки на странице, если в редакторе его нет?</p>
<p>Где копать?</p>

А на странице фрагмент кода выглядит уже так:

<div class="cat_desc"><p>Подключил редактор.</p><br><p>Всё нормально.</p><br><p>Но что генерит тег переноса строки на странице, если в редакторе его нет?</p><br><p>Где копать?</p></div>

Edited by AlGarun (see edit history)
Link to comment
Share on other sites

Про <br /> весьма странный вопрос.. :ph34r: .Копайте здесь: http://htmlbook.ru/html/br

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

На PrestaShop работаю впервые - это так.

Отсюда и вопрос:

Как избавиться от тегов <br> между тегами </p> и <p> (см. пример выше)

Link to comment
Share on other sites

Читать мануал по html редактору TinyMCE и исключением при автоматическом форматировании кода...хотя у меня в 1.4 по умолчанию настройки и такого нету...

 

Может у тебя браузер вставляет при загрузке сайта? посмотри исходный код страницы там есть бры?

Link to comment
Share on other sites

Может у тебя браузер вставляет при загрузке сайта? посмотри исходный код страницы там есть бры?

А это, по Вашему, я откуда скопировал?

<div class="cat_desc"><p>Подключил редактор.</p><br><p>Всё нормально.</p><br><p>Но что генерит тег переноса строки на странице, если в редакторе его нет?</p><br><p>Где копать?</p></div>

Link to comment
Share on other sites

Читать мануал по html редактору TinyMCE

А он ли тому причина?

До сего дня TinyMCE подключён не был.

А <br> генерировался автоматом, когда админ делал описания, тупо нажимая enter для переноса строки .

Т.е. это был единственный способ форматирования материала.

Сегодня подключил TinyMCE, руководствуясь рекомендациями в этой теме.

Всё чудесно.

Но <br> продолжает появляться автоматически.

Link to comment
Share on other sites

А <br> генерировался автоматом

Да, TinyMCE тут явно не при делах.

Дело в файле classes/Db.php

Вот его содержимое:

<?php
/*
* 2007-2011 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to [email protected] so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
*  @author PrestaShop SA <[email protected]>
*  @copyright  2007-2011 PrestaShop SA
*  @version  Release: $Revision: 7541 $
*  @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
*  International Registered Trademark & Property of PrestaShop SA
*/

if (file_exists(dirname(__FILE__).'/../config/settings.inc.php'))
   include_once(dirname(__FILE__).'/../config/settings.inc.php');
//include_once(dirname(__FILE__).'/../classes/MySQL.php');

abstract class DbCore
{
   /** @var string Server (eg. localhost) */
   protected $_server;

   /** @var string Database user (eg. root) */
   protected $_user;

   /** @var string Database password (eg. can be empty !) */
   protected $_password;

   /** @var string Database type (MySQL, PgSQL) */
   protected $_type;

   /** @var string Database name */
   protected $_database;

   /** @var mixed Ressource link */
   protected $_link;

   /** @var mixed SQL cached result */
   protected $_result;

   /** @var mixed ? */
   protected static $_db;

   /** @var mixed Object instance for singleton */
   protected static $_instance = array();

   protected static $_servers = array(    
   array('server' => _DB_SERVER_, 'user' => _DB_USER_, 'password' => _DB_PASSWD_, 'database' => _DB_NAME_), /* MySQL Master server */
   /* Add here your slave(s) server(s)*/
   /*array('server' => '192.168.0.15', 'user' => 'rep', 'password' => '123456', 'database' => 'rep'),
   array('server' => '192.168.0.3', 'user' => 'myuser', 'password' => 'mypassword', 'database' => 'mydatabase'),
   */
   );

   protected $_lastQuery;
   protected $_lastCached;

   protected static $_idServer;

   /**
    * Get Db object instance (Singleton)
    *
    * @param boolean $master Decides wether the connection to be returned by the master server or the slave server
    * @return object Db instance
    */
   public static function getInstance($master = 1)
   {
       if ($master OR ($nServers = sizeof(self::$_servers)) == 1)
           $idServer = 0;
       else
           $idServer = ($nServers > 2 AND ($id = ++self::$_idServer % (int)$nServers) !== 0) ? $id : 1;

       if (!isset(self::$_instance[$idServer]))
           self::$_instance[(int)($idServer)] = new MySQL(self::$_servers[(int)($idServer)]['server'], self::$_servers[(int)($idServer)]['user'], self::$_servers[(int)($idServer)]['password'], self::$_servers[(int)($idServer)]['database']);

       return self::$_instance[(int)($idServer)];
   }

   public function getRessource() { return $this->_link;}

   public function __destruct()
   {
       $this->disconnect();
   }

   /**
    * Build a Db object
    */
   public function __construct($server, $user, $password, $database)
   {
       $this->_server = $server;
       $this->_user = $user;
       $this->_password = $password;
       $this->_type = _DB_TYPE_;
       $this->_database = $database;

       $this->connect();
   }

   /**
    * Filter SQL query within a blacklist
    *
    * @param string $table Table where insert/update data
    * @param string $values Data to insert/update
    * @param string $type INSERT or UPDATE
    * @param string $where WHERE clause, only for UPDATE (optional)
    * @param string $limit LIMIT clause (optional)
    * @return mixed|boolean SQL query result
    */
   public function    autoExecute($table, $values, $type, $where = false, $limit = false, $use_cache = 1)
   {
       if (!sizeof($values))
           return true;

       if (strtoupper($type) == 'INSERT')
       {
           $query = 'INSERT INTO `'.$table.'` (';
           foreach ($values AS $key => $value)
               $query .= '`'.$key.'`,';
           $query = rtrim($query, ',').') VALUES (';
           foreach ($values AS $key => $value)
               $query .= '\''.$value.'\',';
           $query = rtrim($query, ',').')';
           if ($limit)
               $query .= ' LIMIT '.(int)($limit);
           return $this->q($query, $use_cache);
       }
       elseif (strtoupper($type) == 'UPDATE')
       {
           $query = 'UPDATE `'.$table.'` SET ';
           foreach ($values AS $key => $value)
               $query .= '`'.$key.'` = \''.$value.'\',';
           $query = rtrim($query, ',');
           if ($where)
               $query .= ' WHERE '.$where;
           if ($limit)
               $query .= ' LIMIT '.(int)($limit);
           return $this->q($query, $use_cache);
       }

       return false;
   }


   /**
    * Filter SQL query within a blacklist
    *
    * @param string $table Table where insert/update data
    * @param string $values Data to insert/update
    * @param string $type INSERT or UPDATE
    * @param string $where WHERE clause, only for UPDATE (optional)
    * @param string $limit LIMIT clause (optional)
    * @return mixed|boolean SQL query result
    */
   public function    autoExecuteWithNullValues($table, $values, $type, $where = false, $limit = false)
   {
       if (!sizeof($values))
           return true;

       if (strtoupper($type) == 'INSERT')
       {
           $query = 'INSERT INTO `'.$table.'` (';
           foreach ($values AS $key => $value)
               $query .= '`'.$key.'`,';
           $query = rtrim($query, ',').') VALUES (';
           foreach ($values AS $key => $value)
               $query .= (($value === '' OR $value === NULL) ? 'NULL' : '\''.$value.'\'').',';
           $query = rtrim($query, ',').')';
           if ($limit)
               $query .= ' LIMIT '.(int)($limit);
           return $this->q($query);
       }
       elseif (strtoupper($type) == 'UPDATE')
       {
           $query = 'UPDATE `'.$table.'` SET ';
           foreach ($values AS $key => $value)
               $query .= '`'.$key.'` = '.(($value === '' OR $value === NULL) ? 'NULL' : '\''.$value.'\'').',';
           $query = rtrim($query, ',');
           if ($where)
               $query .= ' WHERE '.$where;
           if ($limit)
               $query .= ' LIMIT '.(int)($limit);
           return $this->q($query);
       }

       return false;
   }

   /*********************************************************
    * ABSTRACT METHODS
    *********************************************************/

   /**
    * Open a connection
    */
   abstract public function connect();

   /**
    * Get the ID generated from the previous INSERT operation
    */
   abstract public function Insert_ID();

   /**
    * Get number of affected rows in previous databse operation
    */
   abstract public function Affected_Rows();

   /**
    * Gets the number of rows in a result
    */
   abstract public function NumRows();

   /**
    * Delete
    */
   abstract public function delete ($table, $where = false, $limit = false, $use_cache = 1);
   /**
    * Fetches a row from a result set
    */
   abstract public function Execute ($query, $use_cache = 1);

   /**
    * Fetches an array containing all of the rows from a result set
    */
   abstract public function ExecuteS($query, $array = true, $use_cache = 1);

   /*
    * Get next row for a query which doesn't return an array
    */
   abstract public function nextRow($result = false);

   /*
    * return sql server version.
    * used in Order.php to allow or not subquery in update
    */
   abstract public function getServerVersion();

   /**
        * Alias of Db::getInstance()->ExecuteS
        *
        * @acces string query The query to execute
        * @return array Array of line returned by MySQL
        */
   public static function s($query, $use_cache = 1)
   {
       return Db::getInstance()->ExecuteS($query, true, $use_cache);
   }

   public static function ps($query, $use_cache = 1)
   {
       $ret = Db::s($query, $use_cache);
       p($ret);
       return $ret;
   }

   public static function ds($query, $use_cache = 1)
   {
       Db::s($query, $use_cache);
       die();
   }

   /**
    * getRow return an associative array containing the first row of the query
    * This function automatically add "limit 1" to the query
    *
    * @param mixed $query the select query (without "LIMIT 1")
    * @param int $use_cache find it in cache first
    * @return array associative array of (field=>value)
    */
   abstract public function getRow($query, $use_cache = 1);

   /**
    * getValue return the first item of a select query.
    *
    * @param mixed $query
    * @param int $use_cache
    * @return void
    */
   abstract public function getValue($query, $use_cache = 1);

   /**
    * Returns the text of the error message from previous database operation
    */
   abstract public function getMsgError();
}

/**
* Sanitize data which will be injected into SQL query
*
* @param string $string SQL data which will be injected into SQL query
* @param boolean $htmlOK Does data contain HTML code ? (optional)
* @return string Sanitized data
*/
function pSQL($string, $htmlOK = false)
{
   if (_PS_MAGIC_QUOTES_GPC_)
       $string = stripslashes($string);
   if (!is_numeric($string))
   {
       $link = Db::getInstance()->getRessource();
       $string = _PS_MYSQL_REAL_ESCAPE_STRING_ ? mysql_real_escape_string($string, $link) : addslashes($string);
       if (!$htmlOK)
           $string = strip_tags(nl2br2($string));
   }

   return $string;
}

/**
* Convert \n and \r\n and \r to <br />
*
* @param string $string String to transform
* @return string New string
*/
function nl2br2($string)
{
   return str_replace(array("\r\n", "\r", "\n"), '<br />', $string);
}

Не уверен, что поступил совсем уж правильно...

Но взял и тупо заменил <br /> между кавычек на пробел.

Строка 331

    return str_replace(array("\r\n", "\r", "\n"), '<br />', $string);

на

    return str_replace(array("\r\n", "\r", "\n"), ' ', $string);

Результат: бры исчезли.

 

Как правельнее решить вопрос?

Link to comment
Share on other sites

br используется в TinyMCE для обозначения переноса строки, т.е. Когда ты печатаешь текст и нажимаешь enter для перехода на следующую строку то скрипт ставит br..я же обычно нажимал на кнопку HTML и писал текст прописывая HTML код вручную по этому не встречался с Вашими проблемами...наверно твое решение идеально именно для тебя.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...