FAQ для тех, кто собирается в поход первый раз

- Posted in Uncategorized by

В походах, как и в любом деле, через некоторое время оказывается, что то, что знаешь и считаешь само собой разумеющимся, для других - иногда новость или откровение. Или "о, я об этом даже не подумал!". А объяснить, что к чему и почему, зачастую уже тоже не можешь, поскольку давно забыл проблемы и вопросы начального этапа и просто не способен их вспомнить. То есть можешь (ответы есть в голове), но некому задать правильные вопросы. И что желательно - вовремя. И вспоминаешь и отвечаешь на них уже в процессе. А потом снова забываешь.

И вот поэтому, когда в руки попадаются начинающие туристы со всем ворохом первых вопросов, надо спешить и записывать ответы. Потому что это оказывается полезным для всех.

Все советы тщательно выстраданы и бережно оттестированы на собственной персоне.

Travel Hiking Howto

Table of Contents


Еда

Крупы, сахар, чай, кофе перепаковываются в пластиковые бутылки с широким горлом (в которое проходит чайная ложка). Удобны бутылки из-под соков "Биола" на 0.5 л и меньше (меньше - это в основном для чая и кофе).

  • такие бутылки можно не бояться забыть оставить ночью в темноте возле костра или в тамбуре палатки: звери и насекомые не заберутся и под дождём не промокнет. Однако если ночью выпадет снег, вы будете ругаться матом на тех, кто оставил их возле костра. Поэтому лучше не оставляйте. У каждой вещи должно быть своё место и она должна находиться там, а не где попало. Чтобы вы могли наощупь и в темноте без проблем в своих вещах ориентироваться, а при сборе достаточно было взять рюкзак, а не бегать по всему лагерю;

  • альтернативный способ - канцелярская "прищепка". Главное открыть пачку аккуратно, чтобы можно было тщательно закрыть отверстие, несколько раз согнув упаковку и надёжно закрепив прищепкой. Начатую пачку можно нести в рюкзаке внутри котелка, чашки или внутри коробки с жёсткими стенками (пищевые контейнеры, походные закрытые котелки типа армейских). Круп и каш это не касается: способ в основном для небольших запасов чая и кофе;

  • сахар кубиками в походе не очень удобен: он всё равно крошится, объём занимает приличный, перепаковывать его сложно. Хотя удобен тем, что его легко равномерно отмерить и разделить между участниками.

Крупы и каши ОЧЕНЬ РЕКОМЕНДУЮ перед походом расфасовывать в индивидуальные порции. Покупаете на базаре упаковку из сотни небольших (10 x 15 см) кулечков с зип-локом, вооружаетесь весами поточнее (надо будет отмерять порции по 80-100 грамм), столовой ложкой, терпением и списком рациона... Дальше всё понятно. Потраченные усилия (небольшие на самом деле) окупаются удобствами в самых разных ситуациях: и при внезапной переорганизации группы, и в одиночных походах, спасают от неразберихи или необходимости иметь толкового завхоза (кто что несет, как равномерно разгружать участников, как быстро собрать комплект еды для приготовления), и от необходимости бороться с неудобными большими упаковками (они превращаются в удобные атомарные: взял, использовал, забыл). Ну и при аварийных ситуациях вы не останетесь вдруг без всех круп или вообще без еды. Или с очень-очень промокшей и негодной едой.

Уклоняться от употребления сахара и особенно соли в походах, мотивируя это "не ем" и "худею" я категорически не советую. Единственная веская причина уклоняться - если вас от этих продуктов порвет в клочья. Или превратитесь в зеленое бревно и вас надо будет нести. Соль интенсивно теряется организмом при физических нагрузках. Если потери не восполнять, довольно быстро возникнут проблемы с усвоением воды. И сопутствующие неприятности в виде плохого самочувствия, утомляемости, плохой реакции, голова не соображает и т.п. И ещё будете пить много и часто, но напиться и жажду утолить не сможете. Хотите с этим побаловаться - дома перед зеркалом пожалуйста. Где привычные нагрузки - это дойти от дома/офиса до маршрутки или магазина.

Сахар - это углеводы. Их ваш организма сжигает первыми при нагрузках, если не вдаваться в детали. Поэтому в походе можно и нужно бросаться на сладкое, если тянет. Слушайте свой организм, в общем. Он не дурак. А если дурак - слушайте более опытных туристов. Или спортсменов. Но не тех спортсменов, которые спортсмены, а тех, которые физкультурники. И выглядят здоровыми и бодрыми, а не круглыми и большими. Большие могут лишнего насоветовать.

Еда в первый и последний день похода. Обычно поезда в Крым идут ночью и приходят утром. Поэтому

  • в походную раскладку обычно не включается завтрак первого дня, а также ужин (а может и обед) последнего дня похода - в это время группа обычно находится в цивилизации и костры разводить для приготовления пищи просто негде. Поэтому рассчитывать надо на питание в цивилизации или сухими перекусами (орехи, изюм, печенье и т.п.);
  • завтракаем обычно либо своими запасами в поезде или в маршрутке/троллейбусе, либо на вокзале в городе: в кафе (макдональдс), киосках и т.п. можно купить поесть-попить по мелочам;
  • где-нибудь недалеко от цивилизации под конец похода может очень захотеться посидеть в кафе, поэтому желательно иметь запас денег и на такие случаи. Примерно по 50-100 грн за раз.

Посуда

Вилка в походе не нужна. Нужны КЛМН: кружка, ложка, миска, нож.

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

  • то же самое касается туалетной бумаги. Она должна соседствовать с посудой;

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

Зайдите на базар вместо спортивных и туристических магазинов: посуда из нержавейки весит как пух и очень удобна. И дешёвая. Тяжёлые термокружки -- штука довольно бесполезная. Поэтому на любителя. Лучше взять с собой тонкую и невесомую кружку из нержавейки. Её при желании можно поставить на огонь, чтобы вскипятить немного воды (чего не сделаешь термокружкой).

Термобельё и термоноски -- штука очень полезная, в отличие от термокружек.

Одежда

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

  1. всегда помните, что вам это нести на себе и не один день

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

  3. минимум - штаны, шорты, футболка, свитер, носки, шапка+головной убор от солнца, перчатки, УДОБНАЯ и РАЗНОШЕННАЯ обувь, сменная обувь на время стоянок для отдыха ног. при желании и лёгком весе удваиваем или утраиваем всё это:)

Помните, что свитер удваивать не надо :)

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

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

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

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

todo: 50/10, 45/15, остановки - обязательно снимается рюкзак (проветривание спины и отдых плечам и спине)

Штаны должны быть лёгкие и защищающие от ветра. Это главное. Ещё лучше быстросохнущие. В идеале -- легкие спортивные. Я предпочитаю в походах современную синтетику: бабушкины сказки о пользе х/б материалов устарели лет так на 50 как минимум. Современная спортивная синтетика не раздражает, быстро сохнет и мало весит, ну и не мнётся в качестве бонуса. Поэтому в походе гораздо удобней.

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

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

Температура на высоте ниже, чем на уровне моря! Не забывайте, что у моря - ровно, песок и жарко. На высоте - помимо естественного уменьшения температуры (примерно 0.5-0.7 градуса каждые 100 метров по вертикали) есть ещё ВЕТЕР на плато и перевалах, а также тенистые и сырые леса, где заметно прохладней, чем на берегу моря. То есть, что мы имеем? В Крыму высота гуляний по горам - примерно 1 км над уровнем моря. Если в мае на побережье 20-25 градусов днём и около 10 ночью, то на высоте Ай-Петри в это же время будет уже градусов 15 днём и в лучшем случае около 5-6 ночью.

Про ветер на плато и перевалах я не зря написал большими буквами. Там ситуация такая: идёте вы по склону горы в футболке, солнце печёт, жара, тишина, благодать. достигаете вершины того, куда шли - и оказываетесь натурально в таком ветре, что дышать мешает и чуть с ног не сбивает. И надо весьма проворно одеваться в флиску/свитер/штормовку, иначе слишком холодно, а то и искать шапку, если баффа не хватает. Бафф в таких условиях гораздо удобней на шее и лице (чтобы закрывал рот и нос, а может и уши с затылком).

Ночью ночуют нередко возле воды: ручья, озера. А там прохладнее. Даже если мощный родник недалеко - почва вокруг довольно влажная и прохлада чувствуется не только вблизи источника. Ну и если это лес, тем более высокий, куда днём лучи солнца не особенно достают, чтобы прогреть почву - ночевать в таких условиях вдруг оказывается не очень комфортно и холодно. Поэтому помните что наверху - примерно на 5-10 градусов холоднее. И если днём вы это не заметите, то ночью - вполне.

Аптечка

Минимум личных медикаментов:

  • 1-2 упаковки таблеток активированного угля;

  • несколько таблеток, которые вам от головной боли помогают (цитрамон / анальгин / пиркофен);

  • солнцезащитный крем (лучше один на 3-5 человек).

Желательно ещё:

  • наборчик бактерицидных лейкопластырей (в небольших плоских упаковках или коробочках продают, они там разной формы для разных участков тела);

  • эластичный бинт (нужен не всегда, но лучше по одному у каждого иметь).

На случай мозолей в дополнение к набору мелких пластырей можно взять один пластырь в виде ленты и маленькую индивидуальную упаковку ваты (они размером с пачку влажных салфеток). (Вот здесь вам и пригодится персональный ножик из комплекта КЛМН).

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

<

p>

Гигиена

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

Не берите полотенце. Толку от него в походе - ноль. Промокнуть лицо после умывания можно и футболкой. Если кто-то рискнёт купаться -- под конец похода у вас будут грязные футболки, которыми вполне можно вытереться.

Для гигиены лучше взять упаковки влажных салфеток из расчёта как минимум пара салфеток в день: вечером лицо и ноги протереть (вам с этими ногами спать в палатке), ну и 1-2 салфетки в течение дня могут уйти на жирные руки и т.п.

<

p>

Туалет

В туалет желательно ходить парами :) Один страхует, чтобы ищущие хворост для костра не пошли в строну сидящего в засаде товарища. Если сидите в засаде и замечаете движущегося в вашем направлении человека - не стесняйтесь проорать волшебное слово "Занято!". Иначе стесняться придётся потом, когда вас заметят, это гораздо менее приятно. Те, кто не первый раз в походах, обычно соображают, что к чему, орут "Понял" и разворачиваются.

Для большой группы и на днёвках очень желательно по приходу сразу организовать ОДНО отхожее место, вырыв узкую достаточно глубокую ямку и закопав её перед уходом со стоянки. Это гораздо экологичней. К тому же кучки и бумажки не украшают лес и стоянки, если вы не в курсе. А судя по состоянию Крыма, многие не в курсе.

<

p>

Спальник

Насчёт спальников и холодных ночей. Не планируйте спать в них в одежде. В спальнике быстро согреваешься, а ночью обычно потеешь. Если ваша одежда -- обычная х/б ткань, вы проснётесь в 3-4 утра мокрыми и замёрзшими. Не верите - приготовьте часы и попробуйте.

Спать желательно раздетым (бельё, футболка), тогда спальник отводит излишнюю влагу наружу, оставляя тело сухим и в тепле. В холодные ночи -- класть куртку и свитер СВЕРХУ на спальник. Это гарантированно греет, в отличие от попыток начинающих надеть на себя всю одежду вечером и залезть в спальник.

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

Отмазка: если видите опытных туристов, спящих в спальнике в одежде, не спешите с выводами (насчёт них или меня). Они скорей всего в термобелье, а спальник у них весит с пол-кило (ваш раз в 4-5 больше). То есть это совсем другие материалы и другие условия. Они сознательно идут на экономию веса и комбинирование функций вещей в походах. Термобельё - это вобще отдельная и обширная тема. В общем, не спешите с выводами. Никакой ошибки тут нет.

<

p>

Упаковка вещей

todo: что снизу, что сверху, куда тяжёлое, куда кухонную утварь, тапочки, сахар, чай, перекус, кружку

todo: карта, компас, часы, телефон, ключи, деньги, билеты

Кому нужны полиэтиленовые пакеты с зип-локом (многоразового использования, герметичные)

В объявленном на сходке магазине на Философской есть пакеты 30х40см. Продаются только упаковкой 100 шт - 45,50 грн. Думаю, одной упаковки на всех неэкипированных должно хватить. Могу купить, а при дележной встрече раздать. Думаю, пакетов по 10 на лицо будет достаточно.

Какие-то большие они: туда и ноутбук поместится. Мне интересны несколько штук (2-6 наверное) -- для карт, документов пригодятся.

А более мелких нет? Кстати, такие кульки с зипом продаются на Озёрке. Мы такие мелкие кулёчки покупали для индивидуальной расфасовки еды

Если поход возле воды, то во избежание сюрпризов лучше найти на Озёрке большие "мешки для сахара". Они полиэтиленовые, но габаритами с рюкзак примерно. Берётся 2 таких мешка, заполняются наполовину (чтобы оставшийся хвост надёжно завязать крепкой верёвкой, согнув его предварительно). В один - то, что понадобится только вечером на стоянке, в верхний -- то что может потребоваться днём при смене погоды. А в остальном всё пакуется как обычно, только аккуратно, чтобы мешок не порвать. Изнутри рюкзак получается защищён полиэтиленом. Вещи не намокнут ни под дождями, ни даже если вдруг свалится в реку ненадолго.

Но более мелкие мешки и кульки тоже нужны: и для разграничения вещей (для этого и обычные АТБ-шные и т.п. кульки подойдут), и для отделения грязной и мокрой одежды. Но для этого можно взять упаковку крепких мусорных пакетов: за 2-4 грн обычно получаешь 30 пакетов, если правильно помню.

В пакет зип-лок большой свитер не засунешь, но другая одежда (футболки, майки, штаны, рубашки и остальная мелочь) запросто помещается. Они удобны ещё тем что выдавив воздух из них и застегнув вещь занимает меньший объём.

Особой водонепроницаемости не требуется, лучше о весе не забывать. Самый универсальный способ - большие мусорные пакеты. Весят и стоят мало, в одной упаковке 30 мешков. Или 1-2 больших полиэтиленовых пакета размером с рюкзак. Главное - защитить от намокания спальник.

<

p>

Палатка

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

Палатку в дороге можно разделить между 2-3 людьми: один несёт тент (1-1.5 кг), другой внутреннюю палатку (~1.5 кг), третий колышки и дуги (400-600 грамм).

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

В случае 10-15 человек удобней несколько вместительных палаток (если есть возможность) вместо кучи 2-местных: во-первых, на стоянках часто не так уж много ровного места под палатки, и поставить 3-4 больших палатки гораздо легче, чем 5-7 маленьких, а во-вторых, выбранные даты и места гарантируют наличие огромного количества людей на стоянках. Это интересно (если вы не мизантроп), но неудобно, если вам негде поставить палатки.

<

p>

Рюкзак

Если есть возможность взять большой рюкзак (например 100-литровый вместо 60-литрового) -- берите не раздумывая. Чем больше рюкзак, тем меньше проблем с его упаковкой. В идеале снаружи не должно ничего крепиться: ни карематы, ни палатки, ни тем более спальники. Если порвать каремат о кустарник или камни -- ещё не трагедия, то проколотая палатка или намокший или порванный спальник вас не порадуют. Соседей ваших тоже, поскольку им также придётся терпеть неудобства и как-то спасать вас от холода.

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

<

p>

Клещи

Клещи. За 6-7 лет походов вроде бы видел на себе всего одного клеща. И то не уверен до сих пор, что это он был -- может неглубокая заноза (мы тогда вечно в заросли терновника попадали, были везде исцарапаны - может мелкая щепка неглубоко в кожу встряла). При том, что я хожу почти всё время в шортах и от травы на обочинах не шарахаюсь (вчера читал, что там их рассадники), впрочем как и от кустов. Хотя говорят, это индивидуально: одних клещи охотно едят, других нет.

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

Напоследок цитата: "Случаи клещевого вирусного энцефалита среди людей регистрируются почти ежегодно в Крыму и Волынской области. В 2009 году их было зарегистрировано 9." Когда оцените количество туристов, гуляющих на майские по Крыму... В общем, шансов подцепить гадость от клещей у вас невелика.

<

p>

Трекинговые палки

Трекинговые палки позволяют СУЩЕСТВЕННО разгрузить ваши ноги.

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

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

Quickcheckout (1.5.1.3) адаптирован для темы Shoppica

- Posted in Uncategorized by

Исправлен внешний вид и проблема с Шоппикой: теперь не надо модифицировать common/header.tpl, перенося в него строчку с включением скрипта Fancybox из аналогичного файла темы Default (см. bugtracker, #2).

Единственная проблема, которая там осталась - при использовании галочки согласия покупателя с условиями я пока не могу вывести текст в окно PrettyPhoto, как сделано в стандартной форме оформления заказа. Если кто силён в jQuery - буду благодарен за подсказку. Этот яваскрипт мне уже весь мозг выел. PrettyPhoto ругается на неправильную картинку, хотя отличий от стандартной формы оформления заказа я при беглом осмотре не увидел. Придётся искать-читать про премудрости преттифото. А лучше отключите эту галочку и не мучайте своих покупателей. Всё равно в 2-недельный срок товар вернуть можно по закону, несмотря ни на какие галочки.

P.S. Архив ещё не рассылал. Чуть позже сделаю.

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

UPD 26 Dec. Разослал наконец-то.

Как облегчить процесс публикации изменений на сервер

- Posted in Uncategorized by

[Git, FTP] Для FTP и shared hosting (без SSH доступа и полноценной консоли)

Рекомендую готовый скрипт git-extract:

По команде, в которой указывается диапазон коммитов, создаёт папку .deployment с готовым деревом и изменившимися файлами. И список удаленных файлов, которые придётся удалить вручную (если пользуетесь FTP клиентом) или через SSH на сервере (если есть такая возможность).

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

[Git, SSH] При полноценном хостинге (с SSH доступом)

Судя по всему, у меня сделано один в один как в http://habrahabr.ru/blogs/Git/127213/, поэтому не вижу смысла описывать то же самое. У меня немного отличается структура папок проектов, но это несущественно. Суть проста - на сервере лежит как Git-репозиторий, так и обычная рабочая копия (на которую смотрит веб-сервер). Точнее, на одну из папок репозитория - public_html. Потому что в репозитории хранится ещё документация, служебные скрипты, тестовые и чистые SQL дампы.

И при новых коммитах от разработчиков (git push) репозиторий по хуку делает автоматически две операции - обновление локальной серверной копии (git pull origin dev) и копирование набора файлов из config_sets (здесь у меня хранятся файлы, специфические для разных конфигураций: для одного разработчика, для другого, для dev2-windows, dev2-linux, для production1, production-dev и так далее, если надо ещё больше). Понятна идея? Требуемый набор конфигов просто перезаписывается поверх того, что есть в репозитории (а туда могут попасть и локальные конфиги девелоперов, если они не исключены через .gitignore), и получается чистая и настроенная конфигурация. Быстро, без чек-листов, ручных проверок-исправлений и условий-ветвлений с множеством девелоперских конфигов (зачем они на сервере?).

Естественно, на сервере настроено использование SSH-ключей, чтобы избавиться от необходимоси ввода пароля после git pull.

Есть, конечно, мелкие особенности - за неделю мы уже наступили на пару граблей и может это стоило бы описать.

См. также

[PHP, FTP] Web based FTP Sync Tool written in PHP. Есть возможность запрещать синхронизацию для отдельных файлов/папок.

[Windows, GUI] Сделать архив, содержащий только измененные файлы (сохранив при этом всю структуру папок) может также WinMerge: http://opencartforum.ru/topic/28606-решено-winmerge-как-сделать-изменения-в-движке-и-сохра/#entry223289

Не хватает сбора-подсчета спамерских IP в MaxSite CMS

- Posted in Webdev by

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

Для начала я выделил розовым фоном запрещенные комментарии. Это уже заметно облегчило разборки.

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

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

И через отметку галочек удалять или разрешать комментарии тоже очень не нравится: я обычно разрешаю 1-2 комментария. А для этого надо их отметить, промотать список до конца (спамеров гораздо больше успевает накопиться) и там не ошибиться с кнопкой (потому что пока проматываешь, иногда забывается - это я сейчас разрешить полезные хотел и их отметил? Или запретить/удалить бесполезное?).

Мне гораздо больше подошл бы вариант с парой ссылок возле комментария: разрешить, запретить, удалить.

Opencart 1.5.1: возможность регулировать точность и количество десятичных знаков при выводе веса и размеров

- Posted in Uncategorized by

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

commit b8607fb31b2d9c414506c513b8fb4b8593cbc214
Author: Ruslan Brest <rb@labtodo.com>
Date:   Sun Dec 4 14:12:47 2011 +0200
    [+] Возможность настройки точности чисел при выводе веса и размеров (количество знаков после зяпятой)
diff --git a/public_html/admin/language/english/english.php b/public_html/admin/language/english/english.php
index 5a0223c..71bb46d 100644
--- a/public_html/admin/language/english/english.php
+++ b/public_html/admin/language/english/english.php
@@ -7,6 +7,8 @@ $_['date_format_long']        = 'l dS F Y';
 $_['time_format']             = 'h:i:s A';
 $_['decimal_point']           = '.';
 $_['thousand_point']          = ',';
+$_['length_decimals']         = 2;
+$_['weight_decimals']         = 2;
 
 // Text
 $_['text_yes']                = 'Yes';
diff --git a/public_html/admin/language/russian/russian.php b/public_html/admin/language/russian/russian.php
index d68a762..2cdbc95 100644
--- a/public_html/admin/language/russian/russian.php
+++ b/public_html/admin/language/russian/russian.php
@@ -7,6 +7,8 @@ $_['date_format_long']        = 'l, d F Y';
 $_['time_format']             = 'H:i:s';
 $_['decimal_point']           = '.';
 $_['thousand_point']          = ',';
+$_['length_decimals']       = 0;
+$_['weight_decimals']       = 0;
 
 // Text
 $_['text_yes']                = 'Да';
diff --git a/public_html/catalog/language/english/english.php b/public_html/catalog/language/english/english.php
index cdf17cf..524e1d9 100644
--- a/public_html/catalog/language/english/english.php
+++ b/public_html/catalog/language/english/english.php
@@ -7,6 +7,8 @@ $_['date_format_long']      = 'l dS F Y';
 $_['time_format']           = 'h:i:s A';
 $_['decimal_point']         = '.';
 $_['thousand_point']        = ',';
+$_['length_decimals']       = 2;
+$_['weight_decimals']       = 2;
 
 // Text
 $_['text_home']             = 'Home';
diff --git a/public_html/catalog/language/russian/russian.php b/public_html/catalog/language/russian/russian.php
index 48829a5..f69f200 100644
--- a/public_html/catalog/language/russian/russian.php
+++ b/public_html/catalog/language/russian/russian.php
@@ -7,6 +7,8 @@ $_['date_format_long']      = 'l d F Y';
 $_['time_format']           = 'H:i:s';
 $_['decimal_point']         = '.';
 $_['thousand_point']        = '';
+$_['length_decimals']       = 0;
+$_['weight_decimals']       = 0;
 
 // Text
 $_['text_home']             = 'Главная';
diff --git a/public_html/system/library/length.php b/public_html/system/library/length.php
index 03ca441..3d02025 100644
--- a/public_html/system/library/length.php
+++ b/public_html/system/library/length.php
@@ -5,6 +5,7 @@ final class Length {
    public function __construct($registry) {
        $this->db = $registry->get('db');
        $this->config = $registry->get('config');
+       $this->language = $registry->get('language');
 
        $length_class_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "length_class mc LEFT JOIN " . DB_PREFIX . "length_class_description mcd ON (mc.length_class_id = mcd.length_class_id) WHERE mcd.language_id = '" . (int)$this->config->get('config_language_id') . "'");
     
@@ -41,9 +42,9 @@ final class Length {
    public function format($value, $length_class_id, $decimal_point = '.', $thousand_point = ',') {
        if( 0 == $value ) return "";
        if (isset($this->lengths[$length_class_id])) {
-           return number_format($value, 2, $decimal_point, $thousand_point) . $this->lengths[$length_class_id]['unit'];
+           return number_format($value, $this->language->get('length_decimals'), $decimal_point, $thousand_point) . $this->lengths[$length_class_id]['unit'];
        } else {
-           return number_format($value, 2, $decimal_point, $thousand_point);
+           return number_format($value, $this->language->get('length_decimals'), $decimal_point, $thousand_point);
        }
    }
 }
diff --git a/public_html/system/library/weight.php b/public_html/system/library/weight.php
index d55fdf9..cda9d4d 100644
--- a/public_html/system/library/weight.php
+++ b/public_html/system/library/weight.php
@@ -5,6 +5,7 @@ final class Weight {
    public function __construct($registry) {
        $this->db = $registry->get('db');
        $this->config = $registry->get('config');
+       $this->language = $registry->get('language');
        
        $weight_class_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "weight_class wc LEFT JOIN " . DB_PREFIX . "weight_class_description wcd ON (wc.weight_class_id = wcd.weight_class_id) WHERE wcd.language_id = '" . (int)$this->config->get('config_language_id') . "'");
        
@@ -36,9 +37,9 @@ final class Weight {
    public function format($value, $weight_class_id, $decimal_point = '.', $thousand_point = ',') {
        if( 0 == $value ) return "";
        if (isset($this->weights[$weight_class_id])) {
-           return number_format($value, 2, $decimal_point, $thousand_point) . $this->weights[$weight_class_id]['unit'];
+           return number_format($value, $this->language->get('weight_decimals'), $decimal_point, $thousand_point) . $this->weights[$weight_class_id]['unit'];
        } else {
-           return number_format($value, 2, $decimal_point, $thousand_point);
+           return number_format($value, $this->language->get('weight_decimals'), $decimal_point, $thousand_point);
        }
    }
 }

Opencart 1.5.1.x: страница товара - на вкладку характеристик добавлен вес и размеры

- Posted in Opencart by
Добавлен показ веса и размеров на вкладке характеристик товара (Opencart 1.5)

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

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

Изменения для обеих версий одинаковые. Просто на вкладке для 1.5.1.3 более полная версия: включает в себя изменение системных библиотек для более аккуратного вывода нулевых значений веса и размеров. В версии 1.5.1.2 я это изменение вносил давно и забыл про него написать.

commit a26a849f1ac31fd2ab24f491860748b64f588ef8
Author: Ruslan Brest 
Date:   Thu Nov 17 18:20:47 2011 +0200
    [+] catalog: информация о товаре - на вкладку характеристик добавлен вес и размеры
diff --git a/public_html/catalog/controller/product/product.php b/public_html/catalog/controller/product/product.php
index 25ba580..8062941 100644
--- a/public_html/catalog/controller/product/product.php
+++ b/public_html/catalog/controller/product/product.php
@@ -3,6 +3,7 @@ class ControllerProductProduct extends Controller {
    private $error = array();
 
    public function index() {
+       $this->language->load('product/compare');
        $this->language->load('product/product');
 
        $this->data['breadcrumbs'] = array();
@@ -154,6 +155,9 @@ class ControllerProductProduct extends Controller {
            $this->data['text_share'] = $this->language->get('text_share');
            $this->data['text_wait'] = $this->language->get('text_wait');
            $this->data['text_tags'] = $this->language->get('text_tags');
+           $this->data['text_weight_and_dim'] = $this->language->get('text_weight_and_dim');
+           $this->data['text_weight'] = $this->language->get('text_weight');
+           $this->data['text_dimension'] = $this->language->get('text_dimension');
 
            $this->data['entry_name'] = $this->language->get('entry_name');
            $this->data['entry_review'] = $this->language->get('entry_review');
@@ -178,10 +182,14 @@ class ControllerProductProduct extends Controller {
            $this->data['product_id'] = $this->request->get['product_id'];
            $this->data['manufacturer'] = $product_info['manufacturer'];
            $this->data['manufacturers'] = $this->url->link('product/manufacturer/product', 'manufacturer_id=' . $product_info['manufacturer_id']);
-           $this->data['model'] = $product_info['model'];
+           $this->data['model']  = $product_info['model'];
            $this->data['reward'] = $product_info['reward'];
            $this->data['points'] = $product_info['points'];
-
+           $this->data['weight'] = $this->weight->format($product_info['weight'], $product_info['weight_class_id']);
+           $this->data['length'] = $this->length->format($product_info['length'], $product_info['length_class_id']);
+           $this->data['width']  = $this->length->format($product_info['width'], $product_info['length_class_id']);
+           $this->data['height'] = $this->length->format($product_info['height'], $product_info['length_class_id']);
+           
            if ($product_info['quantity'] <= 0) {
                $this->data['stock'] = $product_info['stock_status'];
            } elseif ($this->config->get('config_stock_display')) {
@@ -309,7 +317,7 @@ class ControllerProductProduct extends Controller {
            $this->data['rating'] = (int)$product_info['rating'];
            $this->data['description'] = html_entity_decode($product_info['description'], ENT_QUOTES, 'UTF-8');
            $this->data['attribute_groups'] = $this->model_catalog_product->getProductAttributes($this->request->get['product_id']);
-
+           
            $this->data['products'] = array();
 
            $results = $this->model_catalog_product->getProductRelated($this->request->get['product_id']);
diff --git a/public_html/catalog/language/english/product/product.php b/public_html/catalog/language/english/product/product.php
index 16f42c5..1771dc0 100644
--- a/public_html/catalog/language/english/product/product.php
+++ b/public_html/catalog/language/english/product/product.php
@@ -25,6 +25,7 @@ $_['text_upload']       = 'Your file was successfully uploaded!';
 $_['text_wait']         = 'Please Wait!';
 $_['text_tags']         = 'Tags:';
 $_['text_error']        = 'Product not found!';
+$_['text_weight_and_dim'] = 'Weight and dimension';
 
 // Entry
 $_['entry_name']        = 'Your Name:';
diff --git a/public_html/catalog/language/russian/product/product.php b/public_html/catalog/language/russian/product/product.php
index 7542b96..fae7e99 100644
--- a/public_html/catalog/language/russian/product/product.php
+++ b/public_html/catalog/language/russian/product/product.php
@@ -25,6 +25,8 @@ $_['text_upload']       = 'Ваш файл был успешно загруже
 $_['text_wait']         = 'Пожалуйста, подождите!';
 $_['text_tags']         = 'Метки:';
 $_['text_error']        = 'Товар не найден!';
+$_['text_weight']       = 'Вес';
+$_['text_weight_and_dim'] = 'Вес и размеры';
 // Entry
 $_['entry_name']        = 'Ваше имя:';
 $_['entry_review']      = 'Ваш отзыв:';
diff --git a/public_html/catalog/view/theme/default/template/product/product.tpl b/public_html/catalog/view/theme/default/template/product/product.tpl
index aaeab64..8e8f8e8 100644
--- a/public_html/catalog/view/theme/default/template/product/product.tpl
+++ b/public_html/catalog/view/theme/default/template/product/product.tpl
@@ -221,6 +221,24 @@
   
   
+ + + + + + + + + + + + + + + + + +
commit 2dec5cba9d01d1fbef34e34bfaa5558bb7676c3e
Author: Ruslan Brest 
Date:   Wed Feb 15 10:17:52 2012 +0200
    [+] catalog: информация о товаре - на вкладку характеристик добавлен вес и размеры
diff --git a/upload/admin/language/english/english.php b/upload/admin/language/english/english.php
index 891da64..7f05d1c 100644
--- a/upload/admin/language/english/english.php
+++ b/upload/admin/language/english/english.php
@@ -7,6 +7,8 @@ $_['date_format_long']        = 'l dS F Y';
 $_['time_format']             = 'h:i:s A';
 $_['decimal_point']           = '.';
 $_['thousand_point']          = ',';
+$_['length_decimals']       = 0;
+$_['weight_decimals']       = 0;
 
 // Text
 $_['text_yes']                = 'Yes';
diff --git a/upload/admin/language/russian/russian.php b/upload/admin/language/russian/russian.php
index 2860121..f3fcd1a 100644
--- a/upload/admin/language/russian/russian.php
+++ b/upload/admin/language/russian/russian.php
@@ -7,6 +7,8 @@ $_['date_format_long']        = 'l, d F Y';
 $_['time_format']             = 'H:i:s';
 $_['decimal_point']           = '.';
 $_['thousand_point']          = ',';
+$_['length_decimals']       = 0;
+$_['weight_decimals']       = 0;
 
 // Text
 $_['text_yes']                = 'Да';
diff --git a/upload/catalog/controller/product/product.php b/upload/catalog/controller/product/product.php
index eadd2f3..c51d220 100644
--- a/upload/catalog/controller/product/product.php
+++ b/upload/catalog/controller/product/product.php
@@ -3,6 +3,7 @@ class ControllerProductProduct extends Controller {
    private $error = array(); 
    
    public function index() { 
+       $this->language->load('product/compare');
        $this->language->load('product/product');
    
        $this->data['breadcrumbs'] = array();
@@ -154,6 +155,9 @@ class ControllerProductProduct extends Controller {
            $this->data['text_share'] = $this->language->get('text_share');
            $this->data['text_wait'] = $this->language->get('text_wait');
            $this->data['text_tags'] = $this->language->get('text_tags');
+           $this->data['text_weight_and_dim'] = $this->language->get('text_weight_and_dim');
+           $this->data['text_weight'] = $this->language->get('text_weight');
+           $this->data['text_dimension'] = $this->language->get('text_dimension');
            
            $this->data['entry_name'] = $this->language->get('entry_name');
            $this->data['entry_review'] = $this->language->get('entry_review');
@@ -181,6 +185,11 @@ class ControllerProductProduct extends Controller {
            $this->data['model'] = $product_info['model'];
            $this->data['reward'] = $product_info['reward'];
            $this->data['points'] = $product_info['points'];
+
+           $this->data['weight'] = $this->weight->format($product_info['weight'], $product_info['weight_class_id']);
+           $this->data['length'] = $this->length->format($product_info['length'], $product_info['length_class_id']);
+           $this->data['width']  = $this->length->format($product_info['width'], $product_info['length_class_id']);
+           $this->data['height'] = $this->length->format($product_info['height'], $product_info['length_class_id']);
            
            if ($product_info['quantity'] <= 0) {
                $this->data['stock'] = $product_info['stock_status'];
diff --git a/upload/catalog/language/english/english.php b/upload/catalog/language/english/english.php
index cdf17cf..74b1bd6 100644
--- a/upload/catalog/language/english/english.php
+++ b/upload/catalog/language/english/english.php
@@ -7,6 +7,8 @@ $_['date_format_long']      = 'l dS F Y';
 $_['time_format']           = 'h:i:s A';
 $_['decimal_point']         = '.';
 $_['thousand_point']        = ',';
+$_['length_decimals']       = 0;
+$_['weight_decimals']       = 0;
 
 // Text
 $_['text_home']             = 'Home';
diff --git a/upload/catalog/language/english/product/product.php b/upload/catalog/language/english/product/product.php
index 16f42c5..762f0b5 100644
--- a/upload/catalog/language/english/product/product.php
+++ b/upload/catalog/language/english/product/product.php
@@ -25,6 +25,8 @@ $_['text_upload']       = 'Your file was successfully uploaded!';
 $_['text_wait']         = 'Please Wait!';
 $_['text_tags']         = 'Tags:';
 $_['text_error']        = 'Product not found!';
+$_['text_weight']       = 'Weight';
+$_['text_weight_and_dim'] = 'Weight and dimension';
 
 // Entry
 $_['entry_name']        = 'Your Name:';
diff --git a/upload/catalog/language/russian/product/product.php b/upload/catalog/language/russian/product/product.php
index 7542b96..e44ea79 100644
--- a/upload/catalog/language/russian/product/product.php
+++ b/upload/catalog/language/russian/product/product.php
@@ -25,6 +25,9 @@ $_['text_upload']       = 'Ваш файл был успешно загруже
 $_['text_wait']         = 'Пожалуйста, подождите!';
 $_['text_tags']         = 'Метки:';
 $_['text_error']        = 'Товар не найден!';
+$_['text_weight']       = 'Вес';
+$_['text_weight_and_dim'] = 'Вес и размеры';
+
 // Entry
 $_['entry_name']        = 'Ваше имя:';
 $_['entry_review']      = 'Ваш отзыв:';
diff --git a/upload/catalog/language/russian/russian.php b/upload/catalog/language/russian/russian.php
index 48829a5..f69f200 100644
--- a/upload/catalog/language/russian/russian.php
+++ b/upload/catalog/language/russian/russian.php
@@ -7,6 +7,8 @@ $_['date_format_long']      = 'l d F Y';
 $_['time_format']           = 'H:i:s';
 $_['decimal_point']         = '.';
 $_['thousand_point']        = '';
+$_['length_decimals']       = 0;
+$_['weight_decimals']       = 0;
 
 // Text
 $_['text_home']             = 'Главная';
diff --git a/upload/catalog/view/theme/default/template/product/product.tpl b/upload/catalog/view/theme/default/template/product/product.tpl
index 81d6334..b7a3d15 100644
--- a/upload/catalog/view/theme/default/template/product/product.tpl
+++ b/upload/catalog/view/theme/default/template/product/product.tpl
@@ -27,6 +27,8 @@
          
         
          
+       
+
          
          
@@ -227,7 +229,7 @@
- + @@ -238,14 +240,26 @@
+
- - x x - + + + + + + + + + + + + + + + -
diff --git a/upload/system/library/length.php b/upload/system/library/length.php index 70f1b0f..f4d120a 100644 --- a/upload/system/library/length.php +++ b/upload/system/library/length.php @@ -5,6 +5,7 @@ final class Length { public function __construct($registry) { $this->db = $registry->get('db'); $this->config = $registry->get('config'); + $this->language = $registry->get('language'); $length_class_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "length_class mc LEFT JOIN " . DB_PREFIX . "length_class_description mcd ON (mc.length_class_id = mcd.length_class_id) WHERE mcd.language_id = '" . (int)$this->config->get('config_language_id') . "'"); @@ -39,10 +40,11 @@ final class Length { } public function format($value, $length_class_id, $decimal_point = '.', $thousand_point = ',') { + if( 0 == $value ) return ""; if (isset($this->lengths[$length_class_id])) { - return number_format($value, 2, $decimal_point, $thousand_point) . $this->lengths[$length_class_id]['unit']; + return number_format($value, (int)$this->language->get('length_decimals'), $decimal_point, $thousand_point) . $this->lengths[$length_class_id]['unit']; } else { - return number_format($value, 2, $decimal_point, $thousand_point); + return number_format($value, (int)$this->language->get('length_decimals'), $decimal_point, $thousand_point); } } } diff --git a/upload/system/library/weight.php b/upload/system/library/weight.php index 584df3c..6b8c59f 100644 --- a/upload/system/library/weight.php +++ b/upload/system/library/weight.php @@ -5,6 +5,7 @@ final class Weight { public function __construct($registry) { $this->db = $registry->get('db'); $this->config = $registry->get('config'); + $this->language = $registry->get('language'); $weight_class_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "weight_class wc LEFT JOIN " . DB_PREFIX . "weight_class_description wcd ON (wc.weight_class_id = wcd.weight_class_id) WHERE wcd.language_id = '" . (int)$this->config->get('config_language_id') . "'"); @@ -34,10 +35,11 @@ final class Weight { } public function format($value, $weight_class_id, $decimal_point = '.', $thousand_point = ',') { + if( 0 == $value ) return ""; if (isset($this->weights[$weight_class_id])) { - return number_format($value, 2, $decimal_point, $thousand_point) . $this->weights[$weight_class_id]['unit']; + return number_format($value, (int)$this->language->get('weight_decimals'), $decimal_point, $thousand_point) . $this->weights[$weight_class_id]['unit']; } else { - return number_format($value, 2, $decimal_point, $thousand_point); + return number_format($value, (int)$this->language->get('weight_decimals'), $decimal_point, $thousand_point); } }

Opencart 1.5.1 (catalog): показ SKU в списке товаров (product/category)

- Posted in Uncategorized by

Для 1.5.1.3. Отличается ли для 1.5.1.2 - не смотрел. Не должно, но номера строк придется искать самостоятельно.

Внизу есть ссылка на скачивание модидифицированных файлов на свежеустановленном Опенкарте.

commit 1e06f21174b1fb07414cbe0cf2eeee0627b75e2f
Author: Ruslan Brest <rb@labtodo.com>
Date:   Mon Oct 17 13:24:33 2011 +0300
    [+] catalog: Добавлен показ SKU в списке товаров (product/category)
diff --git a/upload/catalog/controller/product/category.php b/upload/catalog/controller/product/category.php
index 500e6bb..1be14db 100644
--- a/upload/catalog/controller/product/category.php
+++ b/upload/catalog/controller/product/category.php
@@ -188,6 +188,7 @@ class ControllerProductCategory extends Controller {
                    'product_id'  => $result['product_id'],
                    'thumb'       => $image,
                    'name'        => $result['name'],
+                   'sku'         => (empty($result['sku'])) ? '' : $this->language->get('text_sku') .' '. $result['sku'],
                    'description' => mb_substr(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8')), 0, 100, 'UTF-8') . '&hellip;',
                    'price'       => $price,
                    'special'     => $special,
diff --git a/upload/catalog/language/english/product/category.php b/upload/catalog/language/english/product/category.php
index def6f88..f3ddd08 100644
--- a/upload/catalog/language/english/product/category.php
+++ b/upload/catalog/language/english/product/category.php
@@ -7,6 +7,7 @@ $_['text_empty']        = 'There are no products to list in this category.';
 $_['text_quantity']     = 'Qty:';
 $_['text_manufacturer'] = 'Brand:';
 $_['text_model']        = 'Product Code:'; 
+$_['text_sku']          = 'SKU:';
 $_['text_points']       = 'Reward Points:'; 
 $_['text_price']        = 'Price:'; 
 $_['text_tax']          = 'Ex Tax:'; 
diff --git a/upload/catalog/language/russian/product/category.php b/upload/catalog/language/russian/product/category.php
index 762c91e..cfea2b9 100644
--- a/upload/catalog/language/russian/product/category.php
+++ b/upload/catalog/language/russian/product/category.php
@@ -7,6 +7,7 @@ $_['text_empty']        = 'В этой категории нет товаров.
 $_['text_quantity']     = 'Кол-во:';
 $_['text_manufacturer'] = 'Производитель:';
 $_['text_model']        = 'Модель:';
+$_['text_sku']          = 'SKU (Артикул):';
 $_['text_points']       = 'Бонусные баллы:';
 $_['text_price']        = 'Цена:';
 $_['text_tax']          = 'Без НДС:'; 
diff --git a/upload/catalog/view/theme/default/template/product/category.tpl b/upload/catalog/view/theme/default/template/product/category.tpl
index 37ff9c0..909edc4 100644
--- a/upload/catalog/view/theme/default/template/product/category.tpl
+++ b/upload/catalog/view/theme/default/template/product/category.tpl
@@ -72,7 +72,7 @@
       <?php if ($product['thumb']) { ?>
       <div class="image"><a href="<?php echo $product['href']; ?>"><img src="<?php echo $product['thumb']; ?>" title="<?php echo $product['name']; ?>" alt="<?php echo $product['name']; ?>" /></a></div>
       <?php } ?>
-      <div class="name"><a href="<?php echo $product['href']; ?>"><?php echo $product['name']; ?></a></div>
+      <div class="name"><a href="<?php echo $product['href']; ?>"><?php echo $product['name']; ?></a><?php echo $product['sku']; ?></div>
       <div class="description"><?php echo $product['description']; ?></div>
       <?php if ($product['price']) { ?>
       <div class="price">

Модифицированные файлы:

(Opencart 1.5.1.3) catalog: Добавлен показ SKU в списке товаров (product/category) 20

Применять с осторожностью: вы рискуете затереть свои изменения, внесенные ранее.

Завёл репозиторий для MaxSite CMS на GitHub-е

- Posted in Webdev by

https://github.com/rb2/MaxSite-CMS

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

Если кто-то хочет присоединиться к переводу на английский или правке украинского - теперь есть куда:

  • Исключительно языковые файлы живут и переводятся в соответствующих ветках репозитория https://github.com/g3d/MaxSite-TC (сейчас там украинский в ветке master и английская заготовка в ветке english).
  • Участвовать в корректировке переводов может любой человек, даже понятия не имеющий и не желающий разбираться с Git-ом: достаточно оставлять комментарии к строкам файлов при их просмотре. Тем, кто дружит с Git-ом, объяснять наверное ничего не надо.
  • Файлы скачивать можно там же: переключиться на соответствующую ветку ("Current branch" справа) и скачать ZIP.

В https://github.com/rb2/MaxSite-CMS живёт полностью CMS. Языки туда по мере готовности будут периодически вливаться.

Если автор MaxSite CMS переберётся на GitHub - это значительно упростит дело: можно будет предлагать/публиковать дополнения гораздо проще. Пока что я предполагаю держать этот репозиторий (по крайней мере основную ветку) только для "чистых" релизов версий CMS. И пускать разработчиков только с условием коммитить любые дополнения и модификации в соседние ветки, но не в master. Master branch сейчас - исключительно для оригиналов и получения списка отличий между ними.

Убираем ограничение 999.99 на вес и размеры в Opencart

- Posted in Uncategorized by
ALTER TABLE `opencart_product`
CHANGE `length` `length` DECIMAL(7,2) NOT NULL DEFAULT '0.00',
CHANGE `width` `width` DECIMAL(7,2) NOT NULL DEFAULT '0.00',
CHANGE `height` `height` DECIMAL(7,2) NOT NULL DEFAULT '0.00',
CHANGE `weight` `weight` DECIMAL(7,2) NOT NULL DEFAULT '0.00'

Префикс таблиц "opencart_" меняете на свой, если он используется.

Установка (1.5.1.x)

  1. Запишите это в текстовыый файл, например 999.sql.txt.
  2. Измените префикс таблиц на свой.
  3. Сделайте на всякий случай резервную копию базы данных (Система / Резервные копии / все таблицы должны быть отмечены / кнопка Бэкап). Вообще делайте их почаще, это полезно.
  4. Там же в поле "Востановить базу данных" выберите файл 999.sql.txt и нажмите кнопку "Восстановить".
  5. Теперь можете идти в редактирование товаров и проверять вес и размеры, например 15000 грамм. Если вам вдруг не хватит и этого количества цифр и позарез надо вводить вес в граммах, а не килограмах или тоннах - измените в этом коде цифры 7 на что-то большее (например 10) и повторите процедуру.

Что-то как ни взгляну на часы - то 11:11, то 03:14, то 09:11

- Posted in Uncategorized by

Иногда (гораздо реже) натыкаюсь на 12:12 или 13:13. И ещё 59. Причем не могу сказать, что на часы я часто смотрю - ну 2, ну 3 раза в день могу взгляд бросить. И весь этот год так. Раньше случалось, но воспринималось как: "Ух ты! Смотрите скорей, пока не исчезло!". А сейчас это настолько часто, что уже: "Ох, опять?".

Вот недавно: просыпаюсь - 9:00. Ну вот почему 00, а? Как это так точно? :) Я без будильника встаю. Думаю, ну вот, опять же будет 9:11, как пить дать. Умываюсь, зубы, кухня, то-сё, цветок полил, забыл уже про часы - возвращаюсь ноут включить, перекладываю автоматически телефон с постели на стол - опа, в руках 09:11 светится! Ну как по заказу. Вот почему я не через 5 минут вернулся, или через 20? Чай там заварить или ещё что подобное.

Что это, а?

И почему я не натыкаюсь на 18:28 например? Кусок e ничем не хуже 03:14 :) Вселенная, а другие константы мне показывать будут?