Отображение случайных, а не последних фото из галереи IP.Gallery 4.2.* для IPB

admin/applicetions_addon/gallery/sources/classes/hooks.php
Находим:

$recents = $this->registry->gallery->helper('image')->fetchImages( $this->memberData['member_id'], array( 'limit' => 20, 'sortKey' => 'date', 'sortOrder' => 'desc', 'unixCutOff' => GALLERY_A_YEAR_AGO ) );

меняем на:

$recents = $this->registry->gallery->helper('image')->fetchImages( $this->memberData['member_id'], array( 'limit' => 20, 'sortKey' => 'rand', 'sortOrder' => 'desc', 'unixCutOff' => GALLERY_A_YEAR_AGO ) );

Фишка ‘sortKey’ => ‘rand’, т.к. в библиотеке запроса есть строчка:

if ( $filters['limit'] == 1 && isset( $filters['_sortKey'] ) && $filters['_sortKey'] == 'rand' )

всё.

Если вместо русских букв отображаются «крякозяблы» после загрузки на сервер

В .htaccess добавляем:

<IfModule mod_charset.c>
  CharsetRecodeMultipartForms off
</IfModule>

Скрипт обновления цен в Presta Shop [обновляет цену, скидку, количество]

Как-то давно нашёл в просторах скрипт для PrestaShop, который обновлял количество и цену у товара. Знакомому нужен же был более полный функционал.
С количеством и ценой проблем не возникает, а вот со скидкой пришлось повозиться. Скидка хранится в таблице ps_specific_price (ps — префикс таблицы, у вас он может быть другим).
Сам код:

<?php

define('PS_ADMIN_DIR', getcwd());
include(PS_ADMIN_DIR . '/../config/config.inc.php');
include(PS_ADMIN_DIR . '/functions.php');
include(PS_ADMIN_DIR . '/header.inc.php');
echo '<div style="text-align:left;">';

// Проверяем загружен ли файл
if (is_uploaded_file($_FILES["filename"]["tmp_name"]))
{
    // Если файл загружен успешно, перемещаем его из временной директории в конечную
    move_uploaded_file($_FILES["filename"]["tmp_name"], "" . $_SERVER["DOCUMENT_ROOT"] . "/upload/" . $_FILES["filename"]["name"]);
    $file_path = "" . $_SERVER["DOCUMENT_ROOT"] . "/upload/" . $_FILES["filename"]["name"] . "";

// Меняем кодировку файла с windows-1251 на utf-8
    $file = file_get_contents("" . $file_path . "");
    $file = iconv("windows-1251", "utf-8", $file);
    file_put_contents("" . $file_path . "", $file);

//меняем локаль на хостинге
    if (!setlocale(LC_ALL, 'ru_RU.utf8'))
        setlocale(LC_ALL, 'en_US.utf8'); if (setlocale(LC_ALL, 0) == 'C')
        die('Не поддерживается ни одна из перечисленных локалей (ru_RU.utf8, en_US.utf8)');
    if (($handle_f = fopen($file_path, "r")) !== FALSE)
    {
        //начинаем цикл чтения csv
        while (($data_f = fgetcsv($handle_f, 99999, ";")) !== FALSE)
        {

            //ищем товар по supplier_reference
            $sql = "SELECT id_product FROM ps_product WHERE supplier_reference = '" . $data_f[0] . "'";
            $id_product = Db::getInstance()->getValue($sql, 0);

            //если такой товар есть, обновляем количество и цену
            if ($id_product)
            {
                if ((isset($data_f[1])))
                    $sql = mysql_query("UPDATE `ps_product` SET `quantity` ='" . $data_f[1] . "'  WHERE `id_product`='" . $id_product . "' LIMIT 1");

                if ((isset($data_f[2])))
                    $sql = mysql_query("UPDATE `ps_product` SET`price` = '" . $data_f[2] . "' WHERE `id_product`='" . $id_product . "' LIMIT 1");
                if ((isset($data_f[4])))
                    $sql = mysql_query("UPDATE `ps_product` SET `on_sale` = '" . $data_f[4] . "' WHERE `id_product`='" . $id_product . "' LIMIT 1");

                if ((isset($data_f[3])))
                    $sql = mysql_query("UPDATE `ps_product` SET `wholesale_price` ='" . $data_f[3] . "' WHERE `id_product`='" . $id_product . "' LIMIT 1");
                if ((isset($data_f[5])))
                {
                    if ($data_f[5] == 0)
                    {
                        $sql = mysql_query("DELETE FROM `ps_specific_price` WHERE `id_product`='" . $id_product . "' LIMIT 1");
                    }
                    else
                    {
                        $sql = mysql_query("DELETE FROM `ps_specific_price` WHERE `id_product`='" . $id_product . "' LIMIT 1");
                        $s = str_replace(',', '.', $data_f[5] / 100);
                        $sql = mysql_query(
                                "INSERT INTO `uds4lif_vne`.`ps_specific_price` (
`id_specific_price` ,
`id_product` ,
`id_shop` ,
`id_currency` ,
`id_country` ,
`id_group` ,
`price` ,
`from_quantity` ,
`reduction` ,
`reduction_type` ,
`from` ,
`to`
)
VALUES (
NULL , '" . $id_product . "', '1', '0', '0', '0', '0', '1', '" . $s . "', 'percentage', '0000-00-00 00:00:00', '0000-00-00 00:00:00'
);
"
                        );
                    }
                }

                echo "<p style='color:green'>товар с штрихкодом <b>" . $data_f[0] . "</b> обновлен</p>";
            }
            else
            {
                echo "<p style='color:red  '>товар с штрихкодом <b>" . $data_f[0] . "</b> не найден</p>";
            }
        }
        echo "<b>Обновление завершено</b>";
    }
    else
    {
        echo "Невозможно открыть загруженый файл";
    }
}
else
{
    echo '
<h2>Обновления цены и количества:</h2>
<form action="' . $_SERVER["PHP_SELF"] . '" method="post" enctype="multipart/form-data">
          <input type="file" name="filename"><br>
          <input type="submit" value="Загрузить"><br>
</form>
';
}

echo '</div>';
include(PS_ADMIN_DIR . '/footer.inc.php');
?>

Инструкция: Создаем/качаем ниже файл и закачиваем его в админку магазина. Путь к файлу: http://mojmagazin.ua/adminXXX/upl_price.php

Инстуркция по созданию файла CSV:

файл csv нужно заполнять так | Supplier reference #| количество | цена продажи | закупочная цена | скидка на товар: 1 – есть, 0 – нету | размер скидки в процентах|
Расчитан скрипт на то что файл в кодировке windows-1251
(в таком формате сохраняет файл эксель — «csv — разделеные точкой с запятой»)

Теперь сами файлы:

http://vazelin.org.ua/wp-content/plugins/downloads-manager/img/icons/default.gif download: update price for prestashop (1.65KB)
added: 01/03/2012
clicks: 47
description:

http://vazelin.org.ua/wp-content/plugins/downloads-manager/img/icons/default.gif download: Файл csv для импорта PrestaShop (B)
added: 01/03/2012
clicks: 53
description:

Если нужно будет для формата экселя — попросите, добавлю.
PS: Кто знает автора оригинального скрипта — маякните, чтобы добавить автора.
Спасибо: http://www.prestashop.com/forums/user/157834-surkov85/ и 4udak

Прикольные смайлики в UTF-8

Собственно текста нет :) Просто копируйте и вставляйте на сайты, где есть поддержка UTF-8
٩(-̮̮̃-̃)۶ ٩(●̮̮̃•̃)۶ ٩(͡๏̯͡๏)۶ ٩(-̮̮̃•̃)
◎ܫ◎
ಠﭛಠ
⊙_ʘ
♨_♨
ಠ_ಠ

Трансляция записей из Twitterа на свой сайт.

Вставляем в код страницы, или в отдельный js файл, который не забываем подключить.

function twitterCallback2(twitters) {
  var statusHTML = [];
  for (var i=0; i<twitters.length; i++){
    var username = twitters[i].user.screen_name;
    var status = twitters[i].text.replace(/((https?|s?ftp|ssh)\:\/\/[^"\s\<\>]*[^.,;'">\:\s\<\>\)\]\!])/g, function(url) {
      return '<a href="'+url+'">'+url+'</a>';
    }).replace(/\B@([_a-z0-9]+)/ig, function(reply) {
      return  reply.charAt(0)+'<a href="http://twitter.com/'+reply.substring(1)+'">'+reply.substring(1)+'</a>';
    });
    statusHTML.push('<p>«'+status+'» — <b>'+relative_time(twitters[i].created_at)+'</b></p>');
  }

		 $('#latest_tweet').append($(statusHTML.join('')));									

}

function relative_time(time_value) {
  var values = time_value.split(" ");
  time_value = values[1] + " " + values[2] + ", " + values[5] + " " + values[3];
  var parsed_date = Date.parse(time_value);
  var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
  var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
  delta = delta + (relative_to.getTimezoneOffset() * 60);

  if (delta < 60) {
    return 'less a minute ago';
  } else if(delta < 120) {
    return 'a minute ago';
  } else if(delta < (60*60)) {
    return (parseInt(delta / 60)).toString() + ' minutes ago';
  } else if(delta < (120*60)) {
    return 'about an hour ago';
  } else if(delta < (24*60*60)) {
    return 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago';
  } else if(delta < (48*60*60)) {
    return '1 day ago';
  } else {
    return (parseInt(delta / 86400)).toString() + ' days ago';
  }
}

$(document).ready(function() {

	$.getScript('http://twitter.com/statuses/user_timeline/UaDesignStudio.json?callback=twitterCallback2&count=1');

});

UaDesignStudio — название аккаунта на твиттере, с которого хотите транслировать.
count=1 — указывает сколько записей выводить.

Дальше, на самой html странице:

<div id="latest_tweet"></div>

В эту дивку будет добавляться текст из твиттера.

Давайте копнем глубже.

...
statusHTML.push('<p>«'+status+'» — <b>'+relative_time(twitters[i].created_at)+'</b></p>');
...

Стоить говорить, что так вы можете задать нужную вам структуру вывода твитов?
status — текст твита
twitters[i].created_at — время твита. Как видно, мы его прогоняем через функцию, которая выводим в человекопонятном виде дату создания.

Странное поведение

Последний месяц, Яндекс очень странно стал относится к моим сайтам. Всего, у меня порядка 20 сайтов на этом хостинге, но проблемы возникают только с теми, на которых есть достаточное количество посещений. Так вот, две недели назад один мой сайт, по мнению Яндекса был заражён.
К сожалению, Яндекс не указывает код, который он считает вредоносным, а суппорт его не выдаёт. Так вот, облазил я все файлы и ничего не нашёл. Подал на перепроверку. Снова обнаружены вирусы. Подал еще раз — вирусов больше нет.
Через пару дней, совршенно другой проект стал якобы заражённым. Все страницы на нём берутс из кэша, который был сформирован месяц назад и дата изменения не менялась да и кода «левого» нет ни в исходниках ни в скомпилированном коде.
Снова, снять значок о заражении удалось только после второго или третьего раза.
Естественно, трафик был утерян, страницы вылетили из индекса.
Вот такие вот приключения.

Когда последний раз было … PHP

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

/****
* Author: Uskov A. (Ukrainian Design Studio)
*/
                $d1 = strtotime($post_date);
                $d2 = strtotime(date("Y-m-d H:m:s"));
                $hours = round((($d2-$d1)/(60*60)));
                $minutes =floor(($d2-$d1)/60);

                if ($hours <= 1)
                {
                        if ($minutes <= 60)
                        {

                                if ($minutes < 1){$minutes = 1;}
                                $forms = array('минуту','минуты', 'минут');
                                $result = $minutes.' '.UDS_WriteRuMonth::plural_form($minutes, $forms).' назад';
                        }
                        else{
                                $result = "час назад";
                        }
                }
                else if ($hours <= 2)
                {
                        $result = "2 часа назад";
                }
                else if ($hours <= 3)
                {
                        $result = "3 часа назад";
                }
                else if (( $hours >= 3 )&& ( $hours <= 25 ))
                {
                        $result = "сегодня";
                }
                else if (( $hours >= 24 )&& ( $hours <= 48 ))
                {
                        $result = "вчера";
                }
                else
                {
                        $str_t   = strtotime ($post_date);
                        $result  = date("d ", $str_t);
                        $result .= answer(date("m", $str_t));
                        if (date("Y") != date("Y", $str_t))
                        {
                                $result .= date(" Y", $str_t);
                        }
                        $result .= date(" в H:m", $str_t);
                }

           echo $result;

Код выводит количество минут, если прошло менее 1 часа.
Если больше 3х часов, то напишет «сегодня».

Теперь дополнительные функции:
Выдает русское название месяца

function answer($month)
        {
          switch ($month){
                case 01: $result = 'января'; break;
                case 02: $result = 'февраля'; break;
                case 03: $result = 'марта'; break;
                case 04: $result = 'апреля'; break;
                case 05: $result = 'мая'; break;
                case 06: $result = 'июня'; break;
                case 07: $result = 'июля'; break;
                case 08: $result = 'августа'; break;
                case 09: $result = 'сентября'; break;
                case 10: $result = 'октября'; break;
                case 11: $result = 'ноября'; break;
                case 12: $result = 'декабря'; break;
                }
            return $result;
        }

Эта функция, которая делает правильное склонение:

function plural_form($n, $forms)
        {
               return $n%10==1&&$n%100!=11?$forms[0]:($n%10>=2&&$n%10<=4&&($n%100<10||$n%100>=20)?$forms[1]:$forms[2]);
        }

Её использование:

$count = 22;
$forms = array('минуту','минуты', 'минут');
echo plural_fom($count, $forms);

Победили 406 Error от Яндекса

Привожу сразу правила, которые нужно добавить в файл .htaccess


AddType text/html php
AddType text/html .php
AddType text/html .html

AddType "text/html; charset=UTF-8" .html
AddType "text/html; charset=UTF-8" .php
AddType "text/plain; charset=UTF-8" .txt
AddLanguage ru .html .txt .php

AddHandler php-script php
AddType text/html php
AddHandler php5-script php
AddType text/html php

Это дает 99,99% гарантию избавления от 406 ошибки при сканировании роботом страниц. С помощью этого «фикса», страницы с 406 ошибкой переиндексировались успешно.

Проверено на 3х месяцах работы.

Причина ошибки: Робот яндекса получает неправильные заголовки о кодировке страницы от сервера.

Используем Google Maps у себя на сайте

Первое, что нам нужно — получить ключ для работы. Ключ получаем по ссылке http://code.google.com/intl/ru/apis/maps/signup.html

На сайте, мне нужно было отображать местоположение человека, который ввёл адрес.

Сам код:


// вставляем полученный ключ для домена.

<script src="http://maps.google.com/maps?file=api&amp;v=3&amp;sensor=true&amp;key=" type="text/javascript"></script>

<script>

 var map = null;
 var geocoder = null;

 function initialize() {
 if (GBrowserIsCompatible()) {
 map = new GMap2(document.getElementById("map_canvas"));
 map.setCenter(new GLatLng(50.449744, 30.523968), 7);
 geocoder = new GClientGeocoder();
 }
 if (geocoder) {
 address = "<? $new_person -> EchoContacts2();?>";
 geocoder.getLatLng(
 address,
 function(point) {
 if (!point) {

 } else {
 map.setCenter(point, 16);
 var marker = new GMarker(point);
 map.addOverlay(marker);

 }
 }
 );
 }
 }
 </script><body onload="initialize()" onunload="GUnload()">
 <p>Местоположение на карте</p>
 <div id="map_canvas" style="width: 271px; height: 210px"></div>
 </body>

$new_person -> EchoContacts2(); — выводит для карты адрес человека. Смысл этого простой: получить из базы адрес. Для вас это место будет другим.

Если адреса нет — выводит центр Киева

Работа в PHP с шаблонами {templates}

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

<?php

class template # создали класс

{ # зададим переменные

var $data = array(); # переменная для шаблонов

var $root = '.'; # каталог для шаблонов

var $ext = '.tpl'; # расширение для шаблонов

var $da_vr = array(); # переменная для преобразованых шаблонов

// Класс создан, далее формируем функции:

function template($dir,$ext)

{

if(is_dir($dir)){$this -> root = $dir;}

else{die('Ошибка! <b>'.$dir.'</b> - это не директория!');}

$this -> ext = $ext;

}

// Эта функция выполниется сразу после создания класса, поэтому при создании надо

// указывать директорию и расширения шаблонов (см. ниже). Далее надо загрузить шаблон:

function load($name)

{

$nn = $name;

$dir = $this -> root;

$ext = $this -> ext;

$name = $dir.'/'.$name.$ext;

if(!is_file($name)) {die('Ошибка <b>'.$name.'</b> - это не файл!');}

$fp = fopen($name,'r');

$data = fread($fp,filesize($name));

fclose($fp);

$this -> data[$nn] = $data;

$this -> da_vr[$nm] = $data;

}

// В этой функции мы считали шаблон через fread и запихнули его в две переменных:

// da_vr и data. При загрузке шаблона надо указывать имя шаблона без расширения

// (см.ниже). Далее преобразовываем переменные:

function vars($nm,$vars = array())

{

$data = $this -> data[$nm];

while(list($id,$var) = each($vars))

{

global $$vars[$id];

$data=str_replace('{'.$vars[$id].'}',$$vars[$id],$data);

}

$this -> da_vr[$nm] = $data;

}

// Тут мы преобразовали переменные и загнали в переменную da_vr. И осталось вывести

// шаблон:

function out($name)

{

$ret = $this -> da_vr[$name];

$this -> da_vr[$name] = $this -> data[$name];

return $ret;

}

}

Обясню как работать с классом. Допустим у нас есть шаблон body.tpl в директории data. Его содержимое:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>

<head>

<title> {title} </title>

</head>

<body bgcolor={bgcolor}>

{text}

</body>

</html>

Работа с классом:

include('template.php'); # включили класс

# Зададим переменные #

$bgcolor = '#CCFFCC';

$text = 'Тест класса!';

$title = 'ТЕСТ!';

$tpl = new template('./data','.tpl'); # создали объект, задали каталог и расширение

$tpl -> load('body'); # зашрузили шаблон

$tpl -> vars('body',array('text','title','bgcolor')); # указали какие переменные преобразовать, они должны быть заданы зарание

echo $tpl -> out('body'); # вывели шаблон

По следам: http://php.su/articles/?cat=examples&page=006

Автор:  Андрошук Александр