PHP: Разделить число на разряды
Не люблю, когда нет разделителей разрядов в длинных числах, поэтому пришлось для себя отрыть функцию number_format.
<? number_format($string, 0, '', ' '); ?>
Веб-разработка и интернет-реклама без воды.
Не люблю, когда нет разделителей разрядов в длинных числах, поэтому пришлось для себя отрыть функцию number_format.
<? number_format($string, 0, '', ' '); ?>
Есть клёвый сервис, который позволяет в вашей корзине вызывать подсказки.
Подсказки могут быть разными — фамилии, имена, отчества, адреса, почты, огрн, инн и ещё большая куча других подсказок. Для простых интернет-магазинов очень нужны ФИО, электропочты и адреса. Это реально упрощает процесс оформления заказа и в какой-то степени увеличивает конверсию.
{literal}
<link href="https://cdn.jsdelivr.net/npm/suggestions-jquery@19.4.2/dist/css/suggestions.min.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/suggestions-jquery@19.4.2/dist/js/jquery.suggestions.min.js"></script>
<script type="text/javascript">
$(".cart input[name='name']").suggestions({
serviceUrl: "https://dadata.ru/api/v2",
token: "a8fe6329cfa81666be66deb370d2c364ccfddeaa",
type: "NAME",
params: {
parts: ["SURNAME", "NAME", "PATRONYMIC"]
}
});
$(".cart input[name='address']").suggestions({
serviceUrl: "https://dadata.ru/api/v2",
token: "a8fe6329cfa81666be66deb370d2c364ccfddeaa",
type: "ADDRESS"
});
$(".cart input[name='email']").suggestions({
serviceUrl: "https://dadata.ru/api/v2",
token: "a8fe6329cfa81666be66deb370d2c364ccfddeaa",
type: "EMAIL",
/* Вызывается, когда пользователь выбирает одну из подсказок */
onSelect: function(suggestion) {
console.log(suggestion);
}
});
</script>
{/literal}
$(".cart input[name='name']").suggestions({
...
$(".cart input[name='address']").suggestions({
...
$(".cart input[name='email']").suggestions({
...
}
Кривой TinyMCE 3 версии в 2019 году уже невозможно использовать. Он регулярно вставляет всякие спаны и непечатаемые пробелы, поэтому нужно было обновить его версию.
-langs
-plugins
-skins
-themes
--jquery.tinymce.min.js
--tinymce.min.js
<script language="javascript" type="text/javascript" src="design/js/tinymce/tinymce.min.js"></script>
<script language="javascript">
tinymce.init({
selector: "textarea.editor_large,textarea.editor_small",
language : "ru",
plugins: [
"advlist autosave autolink lists link image charmap print preview hr anchor pagebreak",
"searchreplace wordcount charactercount charmap visualblocks visualchars code fullscreen",
"insertdatetime media nonbreaking save table contextmenu directionality",
"emoticons template paste textcolor colorpicker textpattern "
],
toolbar1: "undo redo | bold italic underline | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link unlink anchor | image media charmap blockquote | forecolor backcolor | removeformat print preview code emoticons ",
menubar: '',
verify_html: false,
image_advtab: true,
setup : function(ed) {
if(typeof set_meta == 'function')
{
ed.on('keyUp', function() {
set_meta();
});
ed.on('change', function() {
set_meta();
});
}
}
{literal}}{/literal});
function myCustomGetContent( id ) {
if( typeof tinymce != "undefined" ) {
var editor = tinymce.get( id );
if( editor && editor instanceof tinymce.Editor ) {
return editor.getContent{literal}({format : 'text'}{/literal}).substr(0, 512);
} else {
return jQuery('textarea[name='+id+']').val().replace(/(<([^>]+)>)/ig," ").replace(/(\ )/ig," ").replace(/^\s+|\s+$/g, '').substr(0, 255);
}
}
return '';
}
</script>
// Обновлённая функция, которую нужно вставить в файлы
function generate_meta_description()
{
if( typeof tinymce != "undefined" )
{
return myCustomGetContent( "annotation" );
}
else
return $('textarea[name=annotation]').val().replace(/(<([^>]+)>)/ig," ").replace(/(\ )/ig," ").replace(/^\s+|\s+$/g, '').substr(0, 255);
}
В файле /simpla/design/html/category.tpl полностью обновляем функцию:
function generate_meta_description()
{
if( typeof tinymce != "undefined" )
{
return myCustomGetContent( "description" );
}
else
return $('textarea[name=description]').val().replace(/(<([^>]+)>)/ig," ").replace(/(\ )/ig," ").replace(/^\s+|\s+$/g, '').substr(0, 255);
}
В файле /simpla/design/html/page.tpl полностью обновляем функцию:
function generate_meta_description()
{
if( typeof tinymce != "undefined" )
{
return myCustomGetContent( "body" );
}
else
return $('textarea[name=body]').val().replace(/(<([^>]+)>)/ig," ").replace(/(\ )/ig," ").replace(/^\s+|\s+$/g, '').substr(0, 255);
}
Результат работы
Откроем файл /view/ProductView.php, отыщем строчку
//Соседние товары
И заменим содержимое блока на:
$next = $this->products->get_next_product($product->id);
$next_brand = $this->brands->get_brand(intval($next->brand_id));
$i = $this->products->get_images(array('product_id'=>$next->id));
$next->image = reset($i);
$next->brand = $next_brand;
$prev = $this->products->get_prev_product($product->id);
$prev_brand = $this->brands->get_brand(intval($prev->brand_id));
$i = $this->products->get_images(array('product_id'=>$prev->id));
$prev->image = reset($i);
$prev->brand = $prev_brand;
Теперь, чтобы вывести бренд соседнего товара:
{$prev_product->brand->name} или {$next_product->brand->name}
В целом решение подойдет для любой переменной, но именно этот массив содержит большое количество информации, которое сложно прочитать без форматирования.
<? if ($USER->IsAdmin()) {
echo "<pre>Template arResult: "; print_r($arResult); echo "</pre>";
} ?>
Создадим новый файл RssView.php в папке /view/ со следующим содержимым:
<?PHP
require_once('View.php');
class RssView extends View
{
public function fetch()
{
$items_per_page = 20;
$params = array();
$params['visible'] = 1;
$params['limit'] = $items_per_page;
switch($this->request->get('type', 'string')) {
default:
$items = $this->blog->get_posts($params);
$category = 'Статьи компании';
$cat_url = $this->config->root_url.'/blog';
$base_url = $this->config->root_url.'/blog/';
}
header("Content-Type: application/rss+xml; charset=UTF-8");
$p = $items[0];
$rssfeed = '<?xml version="1.0" encoding="UTF-8"?>';
$rssfeed .= '<rss xmlns:yandex="http://news.yandex.ru" xmlns:media="http://search.yahoo.com/mrss/" xmlns:turbo="http://turbo.yandex.ru" version="2.0">';
$rssfeed .= '<channel>';
$rssfeed .= '<title>'.$this->settings->site_name.'</title>';
$rssfeed .= '<link>'.$cat_url.'</link>';
$rssfeed .= '<description>'.$this->settings->company_name.'</description>';
$rssfeed .= '<language>ru-ru</language>';
$rssfeed .= '<category>' . $category . '</category>';
$rssfeed .= '<copyright>Copyright '.date('Y').' '.$this->settings->company_name.'</copyright>';
$rssfeed .= '<pubDate>' . date("D, d M Y H:i:s O", strtotime($p->date)) . '</pubDate>';
$rssfeed .= '<lastBuildDate>' . date("D, d M Y H:i:s O", strtotime($p->date)) . '</lastBuildDate>';
foreach($items as $p) {
$rssfeed .= '<item turbo="true">';
$rssfeed .= '<guid isPermaLink="true">'. $base_url . $p->url . '</guid>';
$rssfeed .= '<link>'. $base_url . $p->url . '</link>';
$rssfeed .= '<turbo:content>';
$rssfeed .= '<![CDATA[';
$rssfeed .= '<header>';
$rssfeed .= '<h1>' . $p->name . '</h1>';
$rssfeed .= '</header>';
$rssfeed .= '<p>'. ($p->text) . '</p>';
$rssfeed .= '<div data-block="share" data-network="twitter, facebook"></div>';
$rssfeed .= ']]>';
$rssfeed .= '</turbo:content>';
$rssfeed .= '<title>' . $p->name . '</title>';
$rssfeed .= '<description><![CDATA[' . ($p->annotation) . ']]></description>';
$rssfeed .= '<comments>'. $base_url . $p->url . '#comments</comments>';
$rssfeed .= '<pubDate>' . date("D, d M Y H:i:s O", strtotime($p->date)) . '</pubDate>';
$rssfeed .= '</item>';
}
$rssfeed .= '</channel>';
$rssfeed .= '</rss>';
print($rssfeed);
exit();
}
}
Далее откроем в корне сайта .htaccess и после строчки
RewriteRule ^blog(.*)$ /news$1 [L,R=301]
Добавим в него новое правило:
RewriteRule ^rss?$ index.php?module=RssView [L,QSA]
Теперь у вас есть RSS лента, оптимизированная под Яндекс.Турбо по адресу ваш_сайт.ру/rss
Далее откроем Вебмастер Яндекса, откроем раздел Турбо Страницы -> Источники и добавим ссылку на ваш RSS-канал:
Нажимаем кнопку добавить и ждём когда канал загрузится в систему. После этого проверяем, чтобы всё работало без ошибок и нажимаем кнопку Вкл:
Теперь нужно несколько часов на модерацию вашего источника, а после завершения ваши новости будут в формате Яндекс Турбо ;-)
Решение принадлежит DaVinci и большая ему благодарность за это.
Решение позволяет избавиться от хеша в названии изображения, что позволит изображениям залетать в индекс поисковых систем. Базовое имя у изображений весьма кривое:
В стандарной симпле адрес изображения имеет абракадабру на конце:
8b8a7e13a7e2e5a7ee9f
Чтобы от него изобавиться нужно открыть /resize/resize.php и закомментировать:
/*
if(!$simpla->config->check_token($filename, $token))
exit('bad token');
*/
Далее открываем Design.php и добавим в функцию public function resize_modifier после переменных $resized_filename и $resized_filename_encode:
$size = ($width?$width:0).'x'.($height?$height:0).($set_watermark?"w":'');
$image_sizes = array();
if($this->settings->image_sizes)
$image_sizes = explode('|',$this->settings->image_sizes);
if(!in_array($size, $image_sizes)){
$image_sizes[] = $size;
$this->settings->image_sizes = implode('|',$image_sizes);
}
В этой же функции ниже нужно закомментировать хвост у строчки:
return $this->config->root_url.'/'.$this->config->resized_images_dir.$resized_filename_encoded/*.'?'.$this->config->token($resized_filename)*/;
Далее открываем файл Image.php и в функцию function resize добавить после конструкции list:
$size = ($width?$width:0).'x'.($height?$height:0).($set_watermark?"w":'');
$image_sizes = array();
if($this->settings->image_sizes)
$image_sizes = explode('|',$this->settings->image_sizes);
if(!in_array($size, $image_sizes)){
header("http/1.0 404 not found");
exit();
}
Всё. Теперь все изображения без абракадабры на конце.
Обкатаны на услугах, но подойдёт для многих интернет-магазинов. Список буду постоянно дополнять.
wi-fi.ru
auth.wi-fi.ru
images.yandex.ru
images.rambler.ru
video.yandex.ru
tv.yandex.ru
mamba.ru
www.mamba.ru
m.mamba.ru
loveplanet.ru
games.mail.ru
dota2.ru
ru.msn.com
www.allbest.ru
www.twirpx.com
dic.academic.ru
anekdot.ru
mylove.ru
www.rabota.ru
smartsearchapp.com
spb.kp.ru
www.eg.ru
www.livejournal.com
onlinelpu.ru
www.pickupclub.ru
www.jobinmoscow.ru
video.rambler.ru
m.hh.ru
www.redwhite.ru
www.studfiles.ru
beboo.ru
www.maxpark.com
smotri.com
www.gotovim.ru
sportsdaily.ru
mir24.tv
pogoda.ru
auto.yandex.ru
www.garant.ru
otvet.mail.ru
rabota.yandex.ru
rabota.ru
avito.ru
m.avito.ru
www.odnoklassniki.ru
irr.ru
m.irr.ru
my.mail.ru
<script type="text/javascript">
$(document).ready(function(){
$('#ID_BLOCK a').click(function(){ // Надо указать ID блока, в котором расположена ссылка
yaCounterXXXXXXXX.reachGoal('ORDER'); // Надо указать название цели и номер счётчика Метрики
gtag('event', 'OrderClick', { 'event_category': 'Order', 'event_action': 'Order Click', }); // Надо указать название и тип события для Analytics
console.log('Data was sent'); // Это отладка для консоли. Если в консоли выводится, то всё ок, цели работают.
});
});
</script>
Не нашёл переменной, которая выводит стоимость заказа с учётом доставки, пришлось написать костылёк прям в шаблоне. Работает просто — забираем данные из переменных (total_price и delivery_price), складываем (math equation), преобразовываем в переменную (assign) и выводим значение в отформатированном виде (total|convert).
{math equation = $order->total_price + $order->delivery_price assign = 'total'}
{$total|convert} {$currency->sign}