Virtuemart 3.4.2 медленно грузится админка — bugfix

После обновления, админка начинает очень долго прогружать все разделы VM. Проблема в обращении к отсутствующему файлу стилей. Рукожопный способ решить эту проблему — грузим пустой файл toolbar_images.css по адресу:
administrator/components/com_virtuemart/assets/css/

Joomla 3.6.1

Не обновляйтесь до этой версии. Если обновились — админка не даст авторизоваться.
Это не страшно и лечится откатыванием бекапа (как, вы еще не делаете бекапы перед обновлением? ))).
Еще один рецепт — скачать дистрибутив 3.6.2 и залить на хостинг файлы руками.

0 Invalid address:

После обновления Joomla до 3.5.1, Virtuemart при оформлении заказа, выдает ошибку 0 Invalid address:

Это не полноценный багфикс, временное решение проблемы:

components/com_virtuemart/helpers/shopfunctionsf.php

Берем кусок кода:

if(!$noVendorMail) {
$replyTo[0] = $view->vendorEmail;
$replyTo[1] = $view->vendor->vendor_name;
$mailer->addReplyTo( $replyTo );
} else {
if(isset($view->orderDetails[‘details’]) and isset($view->orderDetails[‘details’][‘BT’])){
$replyTo[0] = $view->orderDetails[‘details’][‘BT’]->email;
$replyTo[1] = $view->orderDetails[‘details’][‘BT’]->first_name.’ ‘.$view->orderDetails[‘details’][‘BT’]->last_name;
} else {
if (isset($view->user->email) and $view->user->name) {
$replyTo[0] = $view->user->email;
$replyTo[1] = $view->user->name;
} else {
$replyTo[0] = $view->user[’email’];
$replyTo[1] = $view->user[‘name’];
}

}

$mailer->addReplyTo( $replyTo );
}

И меняем на:

if(!$noVendorMail) {
$replyTo[0] = $view->vendorEmail;
$nameReplyTo[0] = $view->vendor->vendor_name;
//$replyTo[1] = $view->vendor->vendor_name;

if ( version_compare( JVERSION, ‘3.0’, ‘<‘ ) == 1) {
$replyTo[1] = $nameReplyTo[0];
$mailer->addReplyTo( $replyTo);
}
else
{
$mailer->addReplyTo( $replyTo, $nameReplyTo );
}

} else {
if(isset($view->orderDetails[‘details’]) and isset($view->orderDetails[‘details’][‘BT’])){
$replyTo[0] = $view->orderDetails[‘details’][‘BT’]->email;
$nameReplyTo[0] = $view->orderDetails[‘details’][‘BT’]->first_name.’ ‘.$view->orderDetails[‘details’][‘BT’]->last_name;
} else {
if (isset($view->user->email) and $view->user->name) {
$replyTo[0] = $view->user->email;
$nameReplyTo[0] = $view->user->name;
} else {
$replyTo[0] = $view->user[’email’];
$nameReplyTo[0] = $view->user[‘name’];
}

}
if (!empty($replyTo)) {
if ( version_compare( JVERSION, ‘3.0’, ‘<‘ ) == 1) {
$replyTo[1] = $nameReplyTo[0];
$mailer->addReplyTo( $replyTo );
}
else
{
$mailer->addReplyTo( $replyTo, $nameReplyTo );
}
}
}

Если это не помогло. Меняем libraries/joomla/mail/mail.php на то же, из более старой версии.

Virtuemart3 вывод категорий с подкатегориями на главной.

В VM уже есть готовый функционал, который надо только красиво оформить. Берем стандартный модуль VM3 выводящий категории с подкатегориями.

1. Клонируем модуль вывода категорий в админке;
2. Публикуем скопированный модуль в нужной позиции + назначаем ему шаблон «All»;
3. Редактируем шаблон All (не забываем его сложить в наш основной шаблон, чтобы при обновлении он не умер)

Вместо кода:

<li <?php echo $active_menu ?>>
<div>
<?php echo JHTML::link($caturl, $cattext); ?>
</div>

Вставляем код:

<li class=»kkk»>
<div>
<div class=»kkkimg»><?php echo $category->images[0]->displayMediaThumb(«»,false);?></div>
<?php echo JHTML::link($caturl, $cattext); ?>
</div>
<hr/>

4. В файл стилей дописываем:

.kkk img {
max-width: 25px;
max-height: 25px;
}
.kkkimg {
float: left;
margin: 0 3px 3px;
}
.kkk {
float: left;
width: 30%;
display: block;
margin: 5px 5px 0 0;

}
.kkk li {
list-style: none;
}
.kkk a {
display: block;
margin: 12px 0 10px 0;
font-size: 16px;
line-height: 16px;
}
.kkk li a {
font-size: 14px;
line-height: 12px;
padding: 3px 0 0 0;
margin: 0;
}

5. Добавляем картинки категориям верхнего уровня.

В результате будет как-то так:

Делаем красиво, добавляем разряды к цене в Virtuemart

Открываем шаблон карточки товара, шаблон категории, шаблон модуля выводящего товар и т.д. и вставляем после вывода цены код:

<script>
var str = $(‘.product-price’).text();
$(‘.product-price’).html(str.replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, ‘$1 ‘));
</script>

Дополнительно, надо подключить jquery, если этого уже не сделано.

Если все правильно сделали, ваши унылые цены 1000000₽, превратятся в шикарные 1 000 000 ₽.

Virtuemart 3 — Лечим отправку письма покупателю.

В новой версии VM убрали возможность устанавливать отправку писем покупателю при статусе заказа «В ожидании» (pending). Разработчики вообще убрали статус «в ожидании» с отправки писем покупателю. Причина этому есть, объяснять не буду, кому интересно, можно посмотреть форум поддержки

Для решения проблемы достаточно в способе оплаты поставить любой из оставшихся статусов заказа…

Убираем вывод категорий при поиске в Virtuemart 3

templates/шаблон/html/com_virtuemart/category/default.php

Примерно 43 строка:

// Show child categories
if (VmConfig::get (‘showCategory’, 1) and empty($this->keyword)) {
if (!empty($this->category->haschildren)) {

echo ShopFunctionsF::renderVmSubLayout(‘categories’,array(‘categories’=>$this->category->children));

}
}

Ахалай, махалай:

$search=$_GET[‘search’]; //читаем переменную $search
if ($search != «true») { //если $search есть, а при поиске она есть и равна «true», категории не выводим
// Show child categories
if (VmConfig::get (‘showCategory’, 1) and empty($this->keyword)) {
if (!empty($this->category->haschildren)) {

echo ShopFunctionsF::renderVmSubLayout(‘categories’,array(‘categories’=>$this->category->children));

}
}
}

Обозначенный метод тестировался так же с модулем Virtuemart Param Filter — прекрасно работает.

Нет повести печальнее на свете. Как лечить взлом сайта — продолжение.

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

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

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

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

Кстати, мегаполезный инструмент: http://antivirus-alarm.ru Сканирует страницы по разным вирусным базам (и Авастовской тоже).

Рекомендую.


Как повесить на сайт виджет booking.com

Бился, бился, так и не нашел родного генератора виджетов booking.com без регистрации и смс.

В итоге пришлось руками лезть в код более удачливых коллег. Результат:

<script>
(function() {
var randomId = Math.floor(Math.random() * 100000);
var targetElemId = ‘bcom_rwidget_’ + randomId;
document.write(‘

‘);
var script = document.createElement(‘script’);
script.type = ‘text/javascript’;
script.async = true;
script.src = ‘http://www.booking.com/review_widget/ru/hostel-provans.ru.html?tmpl=review_widget/review_widget&wid=’ + targetElemId + ‘&wtype=box_big&hotel_id=505241&widget_language=ru’;
var node = document.getElementsByTagName(‘script’)[0];
node.parentNode.insertBefore(script, node);
}());
</script>


hostel-provans.ru — урл сайта отеля, он же есть в урл карточки отеля на букинге.
hotel_id=505241 — ID отеля, можно взять в коде страницы отеля. Так и ищется по hotel_id

С tripadvisor повезло больше:

http://www.tripadvisor.ru/Widgets-g298529-d4415667-c6-a_widgetKey.selfserveprop-Provence_Hostel-Novosibirsk_Novosibirsky_District_Novosibirsk_Oblast_S.html

Фавиконки. Favicon.ico, что может быть проще, что может быть сложнее.

Прочитав пост на хабре про фавиконки. 100500 размеров фавиконок, внезапно понял, что упустил эту тему из вида и безнадежно отстал со своим стареньким сниппетом кода, вставляемом во все проекты:

Небольшое резюме статьи:

1. В тренде PNG, т.к. формат ICO если еще не умер, то уже скоро.
2. Размер 16х16 уже не в тренде. Вернее в тренде только для десктопных браузеров, но не для тв, смартфонов и прочего популярного зоопарка техники.

Добавлю от себя. Для экономии времени можно использовать генераторы фавиконок. Например http://realfavicongenerator.net На выходе получаем готовый код и набор фавиконок топовых размеров. Картинки лучше просмотреть руками. Если результат не очень, можно внести правки в исходник и перегенерировать заново или перерисовать руками.

Вспомнился мне чего-то цирк 5,6,7,… летней давности про геморрой с версткой под разные браузеры. Видимо и тут в итоге будет один формат. Хочется верить.