Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

Мануал по добавлению нового поля


AndreyIvanov
 Поделиться

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

37 минут назад, nikifalex сказал:

Ладно, а что мешает скачать пару бесплатных модулей

Ничего не мешает, кроме вот этого требования:

 

В 08.11.2017 в 18:55, AndreyIvanov сказал:

5. Код должен быть написан по правилам MVC в рамках принятых Опенкарт сообществом.

Поэтому:

 

В 08.11.2017 в 19:10, florapraktik сказал:

А Вы сможете проверить это требование? 

 

Как можно понять, что там не г*мнокод?

Как я пойму, что, например, экранирование данных проведено по фен-шую?

 

Например:

try {
		$sql = 'INSERT INTO plant SET
		description = :description,
		$s = $pdo->prepare($sql);
		$s->bindValue(':description', $_POST['plant-description']);
		$s->execute();
	} 

Это экранирование? Или экранирование это что-то другое?

Во всяком случае, это точно НЕ стандарты ОС? Или стандарты?

 

И куда это записать? Создаём доп столбец в product_description? Или лучше создать отдельную таблицу для дополнительного поля? Или использовать какой-нибудь "ненужный" столбец в таблице product (там их обычно много "запасных")?

По стандартам, куда лучше записать?

 

Хорошо, посоветуйте, пожалуйста, эталонный модуль, который можно принять за образец.

Изменено пользователем florapraktik
Ссылка на комментарий
Поделиться на других сайтах


37 минут назад, fanatic сказал:

 

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


$this->db->.........

вот это db и есть в system

тот же language.php тоже там

а контроллеры и модели, от чего наследуются

а обработка запроса и ответ  request and response

а работа с сессиями, изображениями и т.д

Тогда почему паттерн называется MVC+L, а не MVC+L+S и плюс вкумод?

Изменено пользователем florapraktik
Ссылка на комментарий
Поделиться на других сайтах


49 минут назад, nikifalex сказал:

Ладно, а что мешает скачать пару бесплатных модулей и таким функционалом и просто препарировать их для изучения.

В принципе я с этого и начинал когда-то.

 

Возьмите например модуль "описание производителя" или как он назывется, который добавляет текст на страницу производителя. Идеальный вариант

Вы не могли бы уточнить название модуля? Просмотрел только что весь арсенал, не нашел. Правда смотрел лишь под версию 2,3

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

Только что, florapraktik сказал:

Тогда почему паттерн называется MVC+L,

потому что - модель, вид(шаблон), контроллер  + работа с языками.

mvc - это один из паттернов программирования который используется в opencart. применяется для работы с какой либо сущностью.  к примеру продукт, категория, статьи и т.д.

но,  перед тем как начнет работу контроллер, отрабатывают другие паттерны(единая точка входа, регистри).   и кто сказал, что контроллер не может использовать  вспомогательные классы. 

  • +1 2
Ссылка на комментарий
Поделиться на других сайтах

Вот же, разжёвано, правда для 1.5, но суть одна.

  • +1 2
Ссылка на комментарий
Поделиться на других сайтах

10 часов назад, mazein сказал:

Вот же, разжёвано, правда для 1.5, но суть одна.

Спасибо, конечно. Вы гораздо добрее к людям, чем некоторые.

Но в той теме обсуждаются костыли.:)

Изменено пользователем florapraktik
Ссылка на комментарий
Поделиться на других сайтах


Кстати! Вот это экранирование по фен-шую:

'".$this->db->escape($data['example'])."'

Правильно? Угадал?

Зачем столько кавычек? Наружные одинарные зачем?

 

А метод escape() описан в папке system/library/db/?

Блин, но там пять файлов и в каждом escape() описан по разному.

 

...

 

И ещё. Вот это:

$this->db

это не потому что папка называется db. Это потому что:

$db = new DB(DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);

Правильно?

Изменено пользователем florapraktik
Ссылка на комментарий
Поделиться на других сайтах


28 минут назад, florapraktik сказал:

Зачем столько кавычек? Наружные одинарные зачем?

в двойных кавычках весь запрос.  одинарные для значения. в запросе sql,  названия таблиц и столбцов в косых кавычках, значения в одинарных

32 минуты назад, florapraktik сказал:

Блин, но там пять файлов и в каждом escape() описан по разному.

это драйвера  для работы с базой прописывается в конфиге

define('DB_DRIVER', 'mysqli');

 

34 минуты назад, florapraktik сказал:

это не потому что папка называется db.

нет не потому.  а потому что

$registry = new Registry();
if ($config->get('db_autostart')) {
	$registry->set('db', new DB($config->get('db_type'), $config->get('db_hostname'), $config->get('db_username'), $config->get('db_password'), $config->get('db_database'), $config->get('db_port')));
}
abstract class Controller {
	protected $registry;

	public function __construct($registry) {
		$this->registry = $registry;
	}

	public function __get($key) {
		return $this->registry->get($key);
	}

	public function __set($key, $value) {
		$this->registry->set($key, $value);
	}
}

как то так

  • +1 1
Ссылка на комментарий
Поделиться на других сайтах

2 часа назад, fanatic сказал:

как то так

Спасибо!

С кавычками разобрался. В той цитате, что я привёл, первые двойные кавычки на самом деле закрывающие (я ошибочно подумал, что открывающие).

 

...

 

db - это ключ массива $data, имеющий значение в виде объекта от намеспейса DB. Создан и описан в файле index.php, содержание взято из файла config.php, блок // DB  в самом низу. По сути, это данные для подключения к базе.

 

В запросе 

.$this->db->escape($data['example']).

db, это член (переменная, принадлежащая и доступная внутри) класса ModelCatalogProduct, которая унаследована от родительского класса Model через метод set($key, $value) объекта $registry, класса Registry.

 

Нифигасебе "один сплошной пример"! Тут в пору разноцветную схему рисовать.

 

...

 

Не, всё равно не понятно.:)

$registry, который в index.php

$registry = new Registry();

Это тот же самый $registry, который в Model

abstract class Model {
	protected $registry;
//.....
}

Или они просто однофамильцы?

Изменено пользователем florapraktik
Ссылка на комментарий
Поделиться на других сайтах


@AndreyIvanov, так Вы именно модуль хотите или тупо изуродовать оригинальные файлы тоже годиться?

Потому что, если можно изменять оригинальные файлы, то завтра будем пробовать:)

Сегодня уже поздно. Спать пора.

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


1 час назад, florapraktik сказал:

@AndreyIvanov, так Вы именно модуль хотите или тупо изуродовать оригинальные файлы тоже годиться?

Потому что, если можно изменять оригинальные файлы, то завтра будем пробовать:)

Сегодня уже поздно. Спать пора.

не принципиально

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

57 минут назад, florapraktik сказал:

db, это член (переменная, принадлежащая и доступная внутри) класса ModelCatalogProduct, которая унаследована от родительского класса Model через метод set($key, $value) объекта $registry, класса Registry.

нет. все совсем по другому. 

почитайте о наследовании классов, магических методах  __get() ,  __set(). и паттерн  Registry

если в двух словах

создается объект реестра

$registry = new Registry();

далее создаются объекты разных классов и добавляются в реесер

$loader = new Loader($registry);
$registry->set('load', $loader);
$registry->set('request', new Request());
if ($config->get('db_autostart')) {
	$registry->set('db', new DB($config->get('db_type'), $config->get('db_hostname'), $config->get('db_username'), $config->get('db_password'), $config->get('db_database'), $config->get('db_port')));
} и т.д

при запуске модели или контроллера им передается объект   реестра.

и когда вы обращаетесь к несуществующим методам, допустим в модели

$this->db->..........

срабатывает магических метод   __get()

	public function __get($key) {
		return $this->registry->get($key);
	}

и возвращает объект нужного класса.  в данном случае  DB

  • +1 3
Ссылка на комментарий
Поделиться на других сайтах

Ну, блин!

@AndreyIvanov, я помучился, конечно. Но, кое-что получилось:):eek:.

 

Во всяком случае, в БД добавил, а это главное. Причём, менее костыльно, чем в примере от mazein (ещё раз спасибо!) - по идее, у меня будет работать поддержка нескольких языков. В том примере в качестве образца использовалось поле, одинаковое для всех языков.

Кроме того, там надо организовать проверку в контроллере (в примере её нет).

 

Думаю, всё получится в конце концов, но на сегодня устал.

 

Попутно разобрался, почему поле sku обнуляется при копировании - как раз надо, что бы не обнулялось.:)

Изменено пользователем florapraktik
Ссылка на комментарий
Поделиться на других сайтах


@AndreyIvanov, Вы ещё с нами? Отчитываюсь о проделанной работе.:)

Удалось получить дополнительное поле для продукта, заполняемое из админки, с поддержкой мультиязычности и html разметки.
Выводится в дополнительном табе (только в случае, если это доп поле вообще заполнено).
Вы хотели "типа стринг", поэтому я его обозвал addi_string. 
Но при этом, важная деталь! 
Когда я пытаюсь читать большие блоки чужого кода, то часто возникает проблема, что разные сущности имеют одинаковые названия.
И не всегда понятно, где суть одно и тоже, а где разные сущности с одинаковым названием.
У меня новая абстракция называется addi_string, а префиксы и постфиксы разделяют её проявления в различных блоках и частях кода.
1) addi_string_db    - название столбца в базе данных.
2) input-addi-string     - id textarea в форме редактирования. Точнее, это часть id - весь id имеет ещё дополнительный языковый постфикс.
3) addi_string_form      - значение атрибута name той же textarea. Точнее, это только часть name  - есть ещё дополнительный языковый префикс.
4) addi_string_admin     - значение addi_string, полученное из БД для вывода в админке при редактировании товара.
5) addi_string_info      - ключ в массиве $product_info со значением соответствующим addi_string_db.
6) addi_string_product     - ключ в массиве $data, со значением, соответствующим значению addi_string_info.
7) $addi_string_product     - переменная PHP, соответствующая значению addi_string_product и используемая непосредственно на странице продукта.

Ну вот, не много, не мало, а семь разных сущностей для одной абстракции. 
В принципе можно было каждый раз использовать одно слово addi_string, но мне кажется, что так, как сейчас будет проще разобраться, что откуда берётся.
Итак.

 

Пункт А.
Первое, что надо сделать, это создать столбец в базе данных. 
На мой взгляд лучше всего подходит таблица product_description, - там как раз вся вкладка General. Вроде как логично.
Я создавал вручную инструментами phpMyAdmin, чего и Вам желаю. Так что кода здесь не будет.
Я назвал этот столбец addi_string_db, где постфикс _db говорит о том, что сущность относится к базе данных и больше ни к чему.

 

Пункт Б.
Создаём форму ввода в админке.
Файл называется product_form.tpl и находится по адресу /admin/view/template/catalog/product_form.tpl

Код вставляется в 
<form action="<?php echo $action; ?>" method="post" enctype="multipart/form-data" id="form-product" class="form-horizontal">
  ...
  <div class="tab-content">
    <div class="tab-pane active" id="tab-general">
      ...
      <div class="tab-content">
    ... 

Закрывающие теги здесь не проставлены.
Вот внутри этого последнего <div class="tab-content"> находятся все инпуты и текстареа вкладки General. 
Я вставил свой код после инпута Product Name

Вот сам код:

<!-- addi_string start -->

                  <div class="form-group">
                    <label class="col-sm-2 control-label" for="input-addi-string<?php echo $language['language_id']; ?>">***</label>
                    <div class="col-sm-10">
                      <textarea name="product_description[<?php echo $language['language_id']; ?>][addi_string_form]" rows="5" placeholder="***" id="input-addi-string<?php echo $language['language_id']; ?>" class="form-control">
                      	<?php echo isset($product_description[$language['language_id']]) ? $product_description[$language['language_id']]['addi_string_admin'] : ''; ?>
                      </textarea>
                    </div>
                  </div>

<!-- addi_string end -->

Комментарии к коду:
а) id имеет не совсем привычный вид id="input-addi-string<?php echo $language['language_id']; ?>"
Часть input-addi-string мы задаём любую, отражающую смысл значения. Потом при помощи <?php echo $language['language_id']; ?> добавляем к ней идетнификатор языка. 
Для английского на дефолте инспектор браузера покажет id="input-addi-string1", где 1 - это англ яз
Таким образом, для разных языков будет разный id.


б) Атрибут name тоже не совсем обычный:
 name="product_description[<?php echo $language['language_id']; ?>][addi_string_form]"
Здесь:
часть product_description, - это название массива в который записываются значения всех атрибутов name инпутов и текстарея вкладки General.
К тому же для всех используемых языков. (я в этом месте долго фтыкал, блин)
часть [<?php echo $language['language_id']; ?>] - это доступ к массиву текущего используемого языка.
часть [addi_string_form] - это название именно этого поля формы (этой текстареа)
Для английского на дефолте инспектор браузера покажет  name="product_description[1][addi_string_form]", где 1 - это англ яз


в) Для значения placeholder и внуть тега label я поставил звёздочки. 
Вообще, там должны быть языковые переменные, но я пытался упростить и сократить код. 
В принципе, в качестве временной меры можно написать любой уместный текст прямо вместо этих звёздочек.
Либо заморочится с чзыковыми файлами.


г) Внутри тега textarea выводится значение переменной $product_description[$language['language_id']]['addi_string_admin'],
если оно установленно. 
Здесь $product_description, - это массив из массивов языков. 
Каждый массив языка, это тоже массив и он имеет ключ 'addi_string_admin' (объяснение того, откуда это берётся будет позже).


д) И на закуску:
В самом низу этого файла, после всех закрывающих дивов есть яваскрипт:

<script type="text/javascript"><!--
<?php foreach ($languages as $language) { ?>
$('#input-description<?php echo $language['language_id']; ?>').summernote({height: 300});
<?php } ?>
//--></script>

Так вот, в тупо сделал вот так:

<script type="text/javascript"><!--
<?php foreach ($languages as $language) { ?>
$('#input-description<?php echo $language['language_id']; ?>').summernote({height: 300});
$('#input-addi-string<?php echo $language['language_id']; ?>').summernote({height: 300});
<?php } ?>
//--></script>

И текстареа стала с поддержкой визуального редактора кода.

По формам всё.

 

Пункт В.
Делаем запись в базу данных.
Файл называется product.php  и находится по адресу:
admin/model/catalog/product.php
Необходимо добавить две записи:


1) В функцию addProduct (функция добавления нового продукта). Это в самом начале файла.
Но добавлять надо не в начало функции, а в запрос где есть
INSERT INTO " . DB_PREFIX . "product_description SET
т.е. запрос, который работает с таблицей product_description.
Надо понимать, авторы движка считают этот запрос нередактируемым тем варварским способом, который мы применяем,
поэтому запрос написан в одну строчку. Редактировать неудобно.
Вставить надо вот это:

addi_string_db = '" . $this->db->escape($value['addi_string_form']) . "',

Вставить надо после любой запятой и перед название следующего столбца.
В этом месте я тоже долго мучился, потому что пытался красиво отформатировать текст запроса,
но имел проблемы с заголовками для браузера. Так что, в этом месте поаккуратней с пробелами.

Здесь addi_string_db - это как раз название столбца в базе данных,
а addi_string_form - это значение атрибута name в форме ввода в админке. 
Причём, не всё значение этого атрибута, а только то, что в последних квадратных скобках.
Остальные части атрибута name разобраны циклом foreach, перебирающего массив product_description
Надо понимать, будет столько запросов, сколько используется языков.

 

2) В функцию editProduct (функция редактирования существующего продукта).
В принципе, всё аналогично. Ищите аналогичный запрос 
INSERT INTO " . DB_PREFIX . "product_description SET
но внутри функции editProduct
Манипуляции с запросом те же самые.

 

С записью в таблицу всё.
Можно открыть phpMyAdmin и проверить наличие записей в столбце addi_string_db таблицы product_description.
Хотя, конечно, с первого раза вряд-ли получиться.

 

КОНЕЦ ПЕРВОЙ СЕРИИ.

 

Вывод на экран в админке и карточке товара в следующей серии. 
 

 

ПС код лучше не копипастить тупо и бездумно (могут быть опечатки). Но у меня всё работает, включая содержание второй серии.:)

 

 

Изменено пользователем florapraktik
  • +1 3
Ссылка на комментарий
Поделиться на других сайтах


ВТОРАЯ СЕРИЯ
Вывод содержимого таблицы на экран.

 

Часть 1.
Вывод в админке. 


В той самой форме, где происходит запись, надо вывести текущее значение для случая редактирования существующего продукта.
Запрос текущего значения делается в том же самом файле, что и добавление.
admin/model/catalog/product.php
Функция getProductDescriptions 
Внути этой функции есть цикл foreach (он там один)
Внутри цикла формируется массив $product_description_data
Этот процесс отформатирован для наглядности, так что проблем быть не должно.
Надо вставить строчку кода:

'addi_string_admin'=> $result['addi_string_db'],

 

где addi_string_admin - это ключ в этом массиве, а его значение будет соответствовать содержимому столбца addi_string_db.

Итак, в модели формируется массив $product_description_data.
Он содержит в себе всю таблицу product_description для продукта с заданным $product_id.

 

Затем в файле контроллера admin/controller/catalog/product.php этот массив присваевается ключу product_description массива $data

  if (isset($this->request->post['product_description'])) {
            $data['product_description'] = $this->request->post['product_description'];
        } elseif (isset($this->request->get['product_id'])) {
            $data['product_description'] = $this->model_catalog_product->getProductDescriptions($this->request->get['product_id']);
        } else {
            $data['product_description'] = array();
        }

 

вот этот elseif посередине, это как раз оно.

Впрочем, менять ничего не надо и без всякого нашего участия значение ассоциативного массива $data, соответствующее ключу product_description будет доступно в файле product_form.tpl в виде переменной $product_description.
Но сама переменная $product_description, это в свою очередь тоже массив, причём не просто массив, а массив из массивов.
Поэтому для вывода на экран значения нашего дополнительного поля используется нотация с квадратными скобками:

$product_description[$language['language_id']]['addi_string_admin']


где $language - это массив языков, доступ к каждому языку получаем указывая его language_id и каждый этот элемент каждого языка, он тоже в свою очередь массив.
Ну, а addi_string_admin, это как раз один из элементов этого массива, наряду с 'name', 'meta_title', 'meta_keyword' и другими.
Этот массив был изначально сформирован в функции getProductDescriptions файла admin/model/catalog/product.php и там он назывался $product_description_data

 

В админке всё. 
При редактировании товара, имеющего установленное значение addi_string_db это значение должно отражаться.

 

 

Часть 2.
Вывод в карточке товара фронта.

 

Получаем значение из базы данных в файле catalog/model/catalog/product.php
Функция getProduct($product_id)
Нас интересует процесс формирования возвращаемого массива return array( 

и потом там с новой строчки идут пары ключ=>значение.
Добавляем свою пару 

'addi_string_info' => $query->row['addi_string_db'],


В модели всё

 

...


Идём в контроллер catalog/controller/product/product.php
Здесь формируется массив $data
Надо добавить в него дополнительную пару ключ=>значение.
Мне предсавляется, что уместней и логичней сделать это рядом с формированием значения для description
Это формирование description выглядит вот так:

$data['description'] = html_entity_decode($product_info['description'], ENT_QUOTES, 'UTF-8');

 

Я так понимаю, что такой вид обусловлен необходимостью выводить на экран html теги.
Делаем по аналогии  и где-то рядом добавляем строчку:

$data['addi_string_product'] = html_entity_decode($product_info['addi_string_info'], ENT_QUOTES, 'UTF-8');

 

Таким образом, добавили к ассоциативному массиву $data новую пару ключ=>значение.
Ключём будет addi_string_product
а его значением будет то, что записано в массиве $product_info под ключём addi_string_info
Но перед записью эти данные будут обработаны функцией html_entity_decode() - браузеру попадает не совсем то, что записано в базе. 


В контроллере всё.

 

...

 

Собственно говоря, на этом этапе данные уже доступны на странице продукта в виде автоматически созданной переменной $addi_string_product
Её можно выводить где душе угодно.
Например, можно сделать какой-нибудь шот-дескрипшн справа.


Учитывая, что полученная переменная поддерживает html разметку и визуальный редактор кода, выведем её в дополнительном табе.
Файл называется catalog/view/theme/default/template/product/product.php
Понадобиться две вставки кода

 

1) Названия табов организованы при помощи списка  <ul class="nav nav-tabs">, вот его и надо найти.
Перед его закрывающим тегом </ul> добавить:

<!-- $addi_string_product start -->
            <?php if ($addi_string_product) { ?>
              <li><a href="#tab-addi-string" data-toggle="tab">***</a></li>
            <?php } ?>
<!-- $addi_string_product end -->

здесь if ($addi_string_product) - проверка на существование переменной
*** - заглушка для языкового файла. Это название таба. Его можно прописать прямо здесь, но тогда оно будет одно и тоже для всех языков.

Если переменная $addi_string_product существует, то внутри списка <ul class="nav nav-tabs">, добавляется новый пункт <li><a href="#tab-addi-string" data-toggle="tab">***</a></li>, содержащий в себе ссылку на элемент с id=tab-addi-string

 

2) Далее, сразу за закрывающим тегом </ul> находим <div class="tab-content">
внутри этого дива имеется ещё три 

<div class="tab-pane active" id="tab-description"> - описание
<div class="tab-pane" id="tab-specification"> - атрибуты
<div class="tab-pane" id="tab-review"> - отзывы

надо вствить код

<!-- $addi_string_product start -->
            <?php if ($addi_string_product) { ?>
              <div class="tab-pane" id="tab-addi-string">
                <?php echo $addi_string_product; ?>
              </div>
            <?php } ?>
<!-- $addi_string_product end -->

Это и будет тот самый элемент с id=tab-addi-string, на который ведёт ссылка <a href="#tab-addi-string" data-toggle="tab">***</a>

Проще всего вставить его сразу за описанием, т.е. сразу после этого:

<div class="tab-pane active" id="tab-description">
     <?php echo $description; ?>
</div>

Очерёдность расположения здесь не имеет значения.

Вот и всё.


КОНЕЦ

 

П.С. У меня где-то была ссылка на модуль, создающий дополнительные табы.
Похоже, что она мне больше не нужна.:)

 

П.П.С. Ах, да!

Версия 2.1.0.2

нативный opencart.

Изменено пользователем florapraktik
  • +1 2
Ссылка на комментарий
Поделиться на других сайтах


Сделал всё, до вывода в шаблоне. Все работает и даже понятно, не то чтобы прям всё понятно, понятно что делает строка, но как она это делает... Но это и не удивительно =)

Спасибо Вам огромное за проделанную работу.

Сейчас закончу с выводом и буду пробовать на версии 2,3.

Поднял бы вам репутацию, но все еще не могу.

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

Самое главное, что по сути это инструкция для решения практически половины задач по модификации магазина под собственные нужды.

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

Ну и с выводом никаких проблем не возникло. Возможно администрация вынесет это в отдельный фак куда-нибудь. На мой взгляд очень информативно и главное полезно.

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

Проверил на версии osStore 2.3.0.2.3

Всё работает, но есть два момента.

в файле product_form.tpl по адресу /admin/view/template/catalog/product_form.tpl

код

<script type="text/javascript"><!--
<?php foreach ($languages as $language) { ?>
$('#input-description<?php echo $language['language_id']; ?>').summernote({height: 300});
<?php } ?>

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

И второе. 

<!-- addi_string start -->

                  <div class="form-group">
                    <label class="col-sm-2 control-label" for="input-addi-string<?php echo $language['language_id']; ?>">***</label>
                    <div class="col-sm-10">
                      <textarea name="product_description[<?php echo $language['language_id']; ?>][addi_string_form]" rows="5" placeholder="***" id="input-addi-string<?php echo $language['language_id']; ?>" class="form-control">
                      	<?php echo isset($product_description[$language['language_id']]) ? $product_description[$language['language_id']]['addi_string_admin'] : ''; ?>
                      </textarea>
                    </div>
                  </div>

<!-- addi_string end -->

Форма добавляет 20 пробелов перед значением и после него в админ панели. В бд никаких пробелов нет. Откуда они?

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

С формой разобрался, нужно добавить

class="form-control summernote"

Редактор работает. И в визуальном представлении всё нормально. Но при переходе в режим "исходного кода" все еще есть по 20 пробелов слева и справа от значения. Они ни на что не влияют, но любопытно, откуда это?

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

31 минуту назад, AndreyIvanov сказал:

Но при переходе в режим "исходного кода" все еще есть по 20 пробелов слева и справа от значения. Они ни на что не влияют, но любопытно, откуда это?

Кстати, да!

Эти загадочные пробелы были той причиной, по которой я стал искать способ подключения редактора.

Но у меня в редакторе на данный момент нет пробелов.

Но при этом, редактор #input-addi-string работает нормально, а соседний редактор #input-description почему-то добавляет пустые строки в режиме кода. 

Эти пустые строки меня на боевом магазе задолбали. И здесь они.

Полезу искать настройки summernote.

Хотя, пробелы появляются без summernote...

 

Может, кто подскажет?

Изменено пользователем florapraktik
Ссылка на комментарий
Поделиться на других сайтах


Пустые строки появляются, если сохранять в режиме исходного кода.

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

 

Где же у него кнопка!? (с):)

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


@florapraktik ну так визуальный режим просто обрезает "неправильное" форматирование

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

@AndreyIvanov что я смог нарыть о пробелах.

 

файл admin/view/javascript/summernote/summernote.js

И в нём есть строка

var blankHTML = agent.isMSIE ? '&nbsp;' : '<br>';

Как раз пробел.

А ещё есть функция 

var dom = (function () {.......... много кода....... })();

И в ней есть строка 
 

return {
      ....
      blank: blankHTML,
      emptyPara: '<p>' + blankHTML + '</p>',
     ....
  };

Т.е., как раз пробел внутри параграфа.

Правда, для IE... и не 20 штук... и не в обычной текстареа, а в редакторе.

 

И вот ещё:

 

 

Изменено пользователем florapraktik
Ссылка на комментарий
Поделиться на других сайтах


Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

  • Сейчас на странице   0 пользователей

    • Нет пользователей, просматривающих эту страницу.
×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.