Rose debug info
---------------

Позднее Ctrl + ↑

OpenCart: как сделать сортировку товаров по наличию

И в магазине, и в админке.

В чём проблема

По умолчанию, все товары в категориях, страницах производителей, поиске — сортируются по названиям в алфавитном порядке. И даже те товары, которых нет в наличии, могут отображаться в начале списка. А когда таких товаров много — это становится проблемой.

Что делать

  1. Открываем сайт/catalog/model/catalog/product.php
  1. Находим код (~168 строка):
if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
	if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
		$sql .= " ORDER BY LCASE(" . $data['sort'] . ")";
	} elseif ($data['sort'] == 'p.price') {
		$sql .= " ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";
	} else {
		$sql .= " ORDER BY " . $data['sort'];
	}
} else {
	$sql .= " ORDER BY p.sort_order";
}
  1. Заменяем его на:
if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
    if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
        $sql .= " ORDER BY p.stock_status_id DESC, LCASE(" . $data['sort'] . ")";
    } elseif ($data['sort'] == 'p.price') {
        $sql .= " ORDER BY p.stock_status_id DESC, (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";
    } else {
        $sql .= " ORDER BY p.stock_status_id DESC, " . $data['sort'];
    }
} else {
    $sql .= " ORDER BY p.stock_status_id DESC, p.sort_order";
}
  1. Сохраняем, обновляем кэш.
  1. Готово. Товары будут сортироваться по наличию. Товаров, которых нет в наличии, будут отображаться в конце списка.
  1. Можно сортировать и по количеству, а уже затем по наличию. Для этого заменяем на:
if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
    if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
        $sql .= " ORDER BY p.quantity DESC, p.stock_status_id DESC, LCASE(" . $data['sort'] . ")";
    } elseif ($data['sort'] == 'p.price') {
        $sql .= " ORDER BY p.quantity DESC, p.stock_status_id DESC, (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";
    } else {
        $sql .= " ORDER BY p.quantity DESC, p.stock_status_id DESC, " . $data['sort'];
    }
} else {
    $sql .= " ORDER BY p.quantity DESC, p.stock_status_id DESC, p.sort_order";
}
  1. Можно использовать разные комбинации: сортировать по стоимости, рейтингу, дате добавления. Нужно лишь подменить значения в коде выше. Вот они:
$sort_data = array(
    'pd.name',
    'p.model',
    'p.quantity',
    'p.price',
    'rating',
    'p.sort_order',
    'p.date_added'
);

Как сделать в админке

  1. Открываем сайт/admin/model/catalog/product.php.
  1. Делаем тоже самое, что и наверху.
  1. Готово.

По теме

Сортировка данных в SQL (ORDER BY).

 1676   2020   OpenCart 3   работа

Как я веду дневник

Резюмирую накопленный опыт:

  1. Я уже два года непрерывно веду дневник. Из них полтора — в телеграме.
  1. Дневник мне помогает оставаться собой. Мой психотерапевт. Мой личный островок гармонии и хаоса. Мой мир, который живёт по моим правилам.
  1. С дневником я делюсь всем: мыслями, идеями, вопросами, размышлениями, наблюдениями, теориями, историями, впечатлениями, секретами, мрачными тайнами, безумными фантазиями, сценариями другой жизни, мечтами.
  1. Ведя дневник, я испытываю всю гамму эмоций: радость, веселье, злость, гнев, огорчение, апатию.
  1. Когда я пишу — я не парюсь. Пишу то, что первым приходит на ум. Это вообще мой любимый способ понимания себя.
  1. Я ничего не редактирую. Максимум могу исправить орфографические и/или пунктуационные ошибки.
  1. Я всегда честен с самим собой. Если я понимаю, что пытаюсь съюлить, то пишу или говорю о том, что пытаюсь съюлить.
  1. Я веду дневник либо от первого лица, либо на «ты».
  1. Помимо текста, в дневнике я использую смайлики, стикеры, записываю аудио и видеосообщения, отправляю фото, делаю репосты.
  1. Записи всегда выглядят по-разному. Одни начинаются с заголовка и выглядят как посты у Тёмы Лебедева. Другие написаны флудом. Третьи — как-то ещё.
  1. В дневнике я веду разные рубрики. Например, у меня есть рубрики «идея», «наблюдение», «пиздец», «рссс» (разговор с самим собой), которые обозначаются соответствующим хэштегом.
  1. Рубрика «рссс» — особенная. Выглядит это так. Мне в голову приходит вопрос, который меня беспокоит. Затем я включаю запись аудио: «Рубрика — разговор с самим собой. Сегодня 24 апреля, пятница, 16:00. Давай поговорим о...». Для меня это неплохая самотерапия и хороший способ выговориться.
  1. Порой записи в дневнике настолько откровенные или причиняющие душевную боль, что хочется их удалить. Но я научился не удалять записи, какими бы они ни были. Я принимаю всё, что было.
  1. Бывает, что я пишу в дневник несколько раз в день. А бывает, что не пишу неделю. Это нормально.
  1. Делаю резервные копии дневника примерно один раз в два месяца.

См. также заметки о том, как я веду аудиодневник и видеодневник.

OpenCart: как подключить LazyLoad

На страницы товаров, в категориях, результаты поиска, страницы производителей.

Что это

Это ленивая загрузка изображений, которая ускоряет загрузку сайта.

Что делать

Примечание: для работы скрипта нужна подключённая библиотека jquery.

  1. Скачать lazyload.min.js.
  1. Можно подключить и ссылкой:
<script src="https://cdn.jsdelivr.net/npm/vanilla-lazyload@15.1.1/dist/lazyload.min.js"></script>
  1. Загрузить файл в catalog/view/javascript/. Или куда удобно.
  1. Подключить в header.twig в своей теме.
  1. В footer.twig, перед закрывающим тегом body, вставить:
<script>
var lazyLoadInstance = new LazyLoad({
    elements_selector: ".lazy"
});
</script>
  1. Переходим в сайт/catalog/view/тема/product/category.twig
  1. К каждому тегу img добавляем класс lazy, а вместо src — data-src. Вот так:
<img class="lazy" data-src="ссылка на изображение" alt="">
  1. Тоже самое нужно проделать в файлах product.twig, search.twig, manufacturer_info.twig.
  1. Сохраняем, обновляем кэш.
  1. Готово.

У скрипта много настроек и возможностей, взгляните на гитхабе.

 1251   2020   OpenCart 3   работа

OpenCart: как исправить баг с адаптивность в админке

И начать нормально жить.

В чём проблема

Не знаю как у других, но когда я заходил в админку, было вот так:

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

Потратил много времени прежде чем найти решение. А оно — до смешного простое.

Что делать

  1. Открываем сайт/admin/system/tweak.ocmod.xml
  1. Находим код (~13 строка):
<operation>
	<search><![CDATA[
	{% for link in links %}
	]]></search>
	<add position="before"><![CDATA[
	<script type="text/javascript" src="view/javascript/jquery/translit.js"></script>

	<style>
	#column-left {width: 260px !important;}
	#column-left + #content {margin-left: 260px !important;}
	.bimage {margin:0;}
	</style>
	]]></add>
</operation>
  1. Удаляем из него вот эту часть:
<style>
#column-left {width: 260px !important;}
#column-left + #content {margin-left: 260px !important;}
.bimage {margin:0;}
</style>
  1. Сохраняем, обновляем кэш.
  1. Готово.
  1. Результат:
Человеческий вид
 626   2020   OpenCart 3   работа

OpenCart: как сделать нормальную разметку в исходном коде редактора товаров

Двумя строчками кода.

В чём проблема

Когда вы заходите в исходный код описания, всё выглядит вот так:

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

Что делать

  1. Открываем скрипт сайт/admin/view/javascript/summernote/opencart.js
  1. Находим код:
$(element).summernote({
    lang: $(this).attr('data-lang'),
    disableDragAndDrop: true,
    height: 500,
    emptyPara: '',
    codemirror: { // codemirror options
        mode: 'text/html',
        htmlMode: true,
        lineNumbers: true,
        theme: 'monokai'
	},
  1. После строки lineNumbers вставляем:
lineWrapping: true,
  1. Это уберёт прокрутку, и разметка начнёт переноситься на новые строки.
  1. После строки emptyPara вставляем:
prettifyHtml: true,
  1. Это превратит кашу с разметкой в человеческий вид.
  1. Сохраняем, обновляем кэш.
  1. Готово.
  1. Результат на выходе:
 1339   2020   OpenCart 3   работа

OpenCart: как отключить форматирование при копировании

Когда вы копируете откуда-то текст, он копируется целиком — вместе со стилями источника. Есть два решения.

Первое — копировать и вставлять не через Ctrl + V, а через Ctrl + Shift + V. Второе — отключить форматирование при копировании вообще.

Что делать

  1. Открываем сайт/admin/view/javascript/summernote/opencart.js
  1. Находим код:
$(element).summernote({
    lang: $(this).attr('data-lang'),
    disableDragAndDrop: true,
    height: 400,
    emptyPara: '',
    codemirror: { // codemirror options
        mode: 'text/html',
        htmlMode: true,
        lineNumbers: true,
        theme: 'monokai'
    },
  1. После него вставляем:
callbacks: {
    onPaste: function(e) {
        var bufferText = ((e.originalEvent || e).clipboardData || window.clipboardData).getData('Text');
        e.preventDefault();
        setTimeout(function() {
            document.execCommand('insertText', false, bufferText);
            }, 10);
        }
},
  1. Сохраняем, обновляем кэш.
  1. Готово.
 882   2020   OpenCart 3   работа

OpenCart: как сделать видео адаптивным по умолчанию

Не залезая в исходный код редактора товаров.

В чём проблема

Когда вы вставляете видео с ютюба (кнопка «Видео»), оно имеет размеры 640х360. Чтобы сделать его адаптивным, приходится лезть в код и дополнять его. Это неудобно и неприятно.

Что делать

Примечание: у меня по умолчанию установлен редактор summernote, поэтому инструкция для него.

  1. Открываем сайт/admin/view/javascript/summernote/summernote.js
  1. Находим код (~6372 строка):
$video.addClass('note-video-clip');

return $video[0];
  1. Заменяем его на:
var $embed;
var $embed = $('<div>').addClass('embed-responsive').addClass('embed-responsive-16by9');

$video.addClass('note-video-clip').addClass('embed-responsive-item');
$video.appendTo($embed);

return $embed[0];
  1. Сохраняем, обновляем кэш.
  1. Теперь при добавлении видео оно сразу будет адаптивным.
  1. Это не всё. Добавим возможность включать полноэкранный режим.
  1. В этом же файле находим код (~6327 строка):
var $video;
if (ytMatch && ytMatch[1].length === 11) {
    var youtubeId = ytMatch[1];
    $video = $('<iframe>')
        .attr('frameborder', 0)
        .attr('src', '//www.youtube.com/embed/' + youtubeId)
        .attr('width', '640').attr('height', '360');
  1. После последнего .attr добавляем:
.attr('allowfullscreen', '');
  1. Сохраняем, обновляем кэш.
  1. Готово.
 1450   2020   OpenCart 3   работа

Виды искажённого мышления

Читаю книгу Павела Федоренко «Психотерапия тревожно-фобических расстройств» и тут есть прекрасная глава про искажённое мышление. Она про то, что мы все мыслим разными категориями, и это нас отравляет. Не могу не законспектировать.

Фильтрация

Концентрация только на негативных, тревожных, обидных и раздражающих сторонах ситуации, вытесняя её положительные моменты и отбрасывая предшествующий позитивный опыт.

Например: «Он всегда ведёт себя ужасно», «Мне бы она понравилась, если бы не её вонючие духи», «Меня окружают плохие люди».

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

Ключевые слова: «плохо», «ужасно», «страшно», «отвратительно», «невыносимо».

Поляризация

Чёрно-белое видение мира, в котором все вещи и явления бывают хорошими или плохими, прекрасными или ужасными, в котором нет места для компромиссов и полутонов, потому что существуют только крайности.

Например: «Я должен выглядеть идеально, или это будет позор», «Либо я стану успешным человеком, либо всю жизнь буду неудачником», «Я не должен ошибаться, иначе стану посмешищем».

Что делать? Перестать бросаться в крайности при оценке ситуаций, оценивать события в процентном отношении, постепенно снижать уровень своего максимализма и перфекционизма.

Ключевые слова: «или..., или...», «либо..., либо...», «всё или ничего».

Сверхобобщение

Неоправданные обобщающие выводы из-за единожды произошедшего негативного случая с последующим приклеиванием негативных ярлыков на все события и явления.

Например: «У меня никогда ничего не получается», «Я никому не нужен», «Все толстые — мудаки», «Все богатые — воры».

Что делать? Исходить из реальных фактов и конкретных доказательств, заменить негативные определения на нейтральные.

Ключевые слова: «все», «всё», «никто», «ничто», «никогда», «всегда».

Чтение мыслей

Убеждение, что человек знает мысли и чувства других людей. Или уверенность в том, что другие люди должны знать, что у человека на уме.

Например: «Я и так знаю, о чём ты думаешь», «Она хочет от меня только денег», «Они должны понимать, что мне плохо».

Что делать? Понимать невозможность точного знания того, о чём думают и что чувствуют другие люди, подтверждать свои подозрения реальными фактами.

Ключевые слова: «я знаю», «он думает», «она считает», «он должен знать», «они должны понимать».

Катастрофизация

Постоянное ожидание самых худших и самых ужасных сценариев развития событий.

Например: «А что если мой самолёт разобьётся?», «А вдруг на меня нападут бандиты?», «А что если я заболею и не смогу работать?»

Что делать? Перестать раздувать из мухи слона, оценивать вероятность того или иного события, критически анализировать свои мысли.

Ключевые слова: «а что если...», «а вдруг...», «катастрофа», «кошмар».

Гиперболизация

Преувеличение значимости проблем, масштабирование сложностей и минимизирование позитивных моментов.

Например: «Стоять в очереди целый час невыносимо!», «Я не переживу отказа!», «Это ужасно, что я опаздываю!»

Что делать? Перестать преувеличивать размеры трудностей и учиться видеть их реальные масштабы.

Ключевые слова: «ужасный», «невыносимый», «огромный», «непомерный».

Персонализация

Уверенность в том, что слова и действия других людей являются их непосредственной реакцией на человека. Принятие ответственности за чувства других людей на себя.

Например: «Они смеются и смотрят на меня, значит со мной что-то не так», «Это я их разозлил», «Я всё испортил».

Что делать? Найти доказательства своим предположениям, смотреть на ту или иную ситуацию глазами независимого наблюдателя.

Ключевые слова: «я», «меня», «мной», «мне», «обо мне».

Сравнение

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

Например: «Я не такой везучий, как он», «Она гораздо лучше меня решает проблемы», «Мне не достичь такого успеха, как Илон Маск».

Что делать? Отказаться от сравнений, являющихся истоком нестабильной самооценки, понимать, что у всех людей есть сильные и слабые стороны.

Ключевые слова: «лучше», «хуже», «успешнее», «сильнее», «достойнее».

Долженствования

Необоснованно завышенные требования к себе, другим людям и миру в целом, отступление от которых недопустимо.

Например: «Я должен быть хорошим другом», «Я не должен испытывать страданий», «Окружающие должны меня одобрять», «Сегодня не должно быть плохой погоды», «Всё должно быть так, как я хочу».

Что делать? Допускать возможность ошибок, признавать уникальность других людей, заменять долженствования пожеланиями, то есть альтернативными здоровыми мыслями и разумными предпочтениями по типу «Мне бы хотелось..., но это вовсе не означает...», «Я хочу..., но это не гарантирует...».

Ключевые слова: «должен», «обязан», «следует», «необходимо».

Обесценивание

Отрицание важности происходящих событий посредством «сглаживания» своих недостатков, самообмана и оправдывания себя.

Например: «Меня бросила девушка, значит так и должно быть», «Это меня не касается!», «Кому какая разница?»

Что делать? Осознавать подлинную значимость событий и реалистично оценивать свои индивидуальные качества.

Ключевые слова: «ничего страшного», «так и должно быть», «ну и что».

Непереносимость дискомфорта

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

Например: «Вставать рано утром ужасно», «Я должен сейчас поесть, или это будет невыносимо», «Если мне откажут, я этого не переживу».

Что делать? Опираться на предшествующий позитивный опыт аналогичных ситуаций, понимать реальную степень дискомфорта.

Ключевые слова: «невыносимо», «нетерпимо», «невозможно», «ужасно».

Книга Энни Дьюк «Принцип ставок»

Одна из самых полезных глав в книге — про убеждения. Её я и законспектировал.

Про формирование убеждений

Вся наша жизнь, все наши действия и мысли — это отражение наших убеждений.

Многие наши убеждения — случайны: мы что-то узнали от других людей и приняли на веру.

Нам кажется, что наши убеждения формируются так:

  1. мы что-то от кого-то узнаём;
  1. мы думаем об этом и проверяем — истинно или ложно это утверждение;
  1. мы формируем новое убеждение, как следует «разобравшись» с пунктом 2.

А фактически наши убеждения формируются вот так:

  1. мы что-то от кого-то узнаём;
  1. решаем, что так оно и есть;
  1. и лишь иногда, если у нас появляется время или желание, мы размышляем над этим утверждением, проверяем.

Про упорство убеждений

Когда наши убеждения уже сформировались, их трудно пересмотреть — они начинают жить своей жизнью. Мы ищем факты в их поддержку и редко оспариваем их убедительность. При этом мы игнорируем или пытаемся компрометировать данные, которые противоречат нашим установкам. Всё это искажает наше восприятие новых сведений — и так до бесконечности.

Про факты

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

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

Проблема в том, что мы думаем, что убеждение либо на 100% верно, либо на 100% ложно. Если новая информация не совпадает с нашими убеждениями, мы выбираем одно из двух:

  1. кардинально изменяем мнение о себе. То есть раньше был на 100% прав, теперь совершенно не прав;
  1. игнорируем или компрометируем «неподходящую» информацию.

Если же новая информация согласуются с нашими убеждениями, мы без усилий принимаем её.

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

Про споры

Споры или пари — это сигнал: кто-то сомневается в нашей правоте. А это, в свою очередь, побуждает нас проверить свои взгляды и проанализировать факты, на основе которых сформировалось «спорное» суждение.

  • Почему я так думаю?
  • Как я получил эту информацию?
  • Можно ли считать эти источники качественными?
  • Насколько я им доверяю?
  • Актуальна ли эта информация?
  • Достаточно ли у меня данных, обосновывающих эту установку?
  • Как часто факты, в которых я был уверен, оказывались ложными?
  • Каковы иные правдоподобные альтернативы?
  • Что я знаю о человеке, который со мною спорит?
  • Насколько он доверяет моему мнению?
  • Есть ли у него недоступная мне информация?
  • В какой области он специалист?
  • Что я упускаю из виду?

Когда мы спорим на что-то весомое, то чаще всего отказываемся от предвзятости и честно признаёмся себе, что в чём-то не уверены. А ещё с готовностью открываемся новой информации, учитываем её и корректируем «устоявшиеся» взгляды. Таким образом, наши представления о мире становятся адекватнее.

Суть в том, чтобы изменить привычное восприятие собственных убеждений и решений. Например, смотря на мир через призму вызова «Спорим?»

Так мы быстрее осознаем, что всегда есть некая степень неопределённости, что наши взгляды не так уж тверды, и что нет ничего только чёрного или только белого, 0% или 100%. И это неплохая жизненная философия.

Новый взгляд на убеждения

Мы можем эффективнее общаться и принимать решения, если будем думать не о том, уверены ли мы в свои убеждениях, а сосредоточимся на том, насколько мы в них уверены.

Например, уверенность в своих убеждениях можно оценивать в баллах — от нуля до десяти, или в процентах. Нуль — убеждение неверно, десять — истина.

Когда мы оцениваем уверенность в своих убеждениях, мы наглядно показываем, что то, во что мы верим, находится где-то между 100% истиной и 0%, а не на полюсах. А это значит, что мы отходим от «чёрно-белого» мышления.

Зачем оценивать свои убеждения

Когда мы открыты новому, нам проще объективно воспринимать информацию, с которой мы не сразу готовы согласиться. Мы с меньшей вероятностью поддадимся предвзятости, потому что проще слегка подправить свои установки, чем радикально менять оценку собственной «правоты».

Одно дело сказать «Я был уверен на 60%, а теперь на 40%», и совсем другое — «Я думал, что прав, но нет, я ошибался». В последнем случае, если информация не согласуется с нашими убеждениями, мы воспримем её как угрозу и будем защищаться, что усложнит путь к истине.

Корректируя убеждения, мы становимся менее самокритичными. Нет ничего плохого в том, что некоторые факты противоречат нашим взглядам. Плохо, когда мы относимся к ним необъективно и не используем для совершенствования собственных убеждений.

Когда мы говорим, что уверены, допустим, лишь на 80%, мы стимулируем других поделиться с нами знаниями. Это помогает нам корректировать свои убеждения. И со временем, информация, которой мы располагаем, становится более достоверной.


См. также книгу Дейва Грея «Лиминальное мышление».

Обращение на «ты» в рекламе

Одно из самых неприятных, раздражающих и неуважительных явлений в рекламе — обращение на «ты». Это дешёвый манипуляционный приём, который чаще всего используют инфобизнесмены и неумелые копирайтеры.

Нет ничего плохого в том, чтобы общаться на «ты» с друзьями, родственниками или собутыльниками. Но когда в рекламе к человеку обращаются на «ты» без его согласия — это верный признак туфты.

 3031   2019   маркетинг   реклама
Ранее Ctrl + ↓