bitrix:catalog.section
, то можешь задать фильтр "FILTER_NAME" => "arFilter"
$arFilter
)./**
* Выделение различий в текстах (с точностью до строк или слов)
* Изменения оборачиваются в тег "span" с классами 'added', 'deleted', 'changed
* алгоритм: http://easywebscripts.net/php/php_text_differences.php
*
* @return array - тексты A и B
* @param string $textA
* @param string $textB
* @param string $delimeter - "пробел": будет искать изменения с точностью до слова, "\n": с точностью до строки
*/
function getTextDiff($textA, $textB, $delimeter = "\n") {
if (!is_string($textA) || !is_string($textB) || !is_string($delimeter)) {
return FALSE;
}
// Получение уникальных слов(строк)
$arrA = explode($delimeter, str_replace("\r", "", $textA));
$arrB = explode($delimeter, str_replace("\r", "", $textB));
$unickTable = array_unique(array_merge($arrA, $arrB));
$unickTableFlip = array_flip($unickTable);
// Приводим к тексту из идентификаторов
$arrAid = $arrBid = array();
foreach($arrA as $v) {
$arrAid[] = $unickTableFlip[$v];
}
foreach($arrB as $v) {
$arrBid[] = $unickTableFlip[$v];
}
// Выбор наибольшей общей последовательности
$maxLen = array();
for ($i = 0, $x = count($arrAid); $i <= $x; $i++) {
$maxLen[$i] = array();
for ($j = 0, $y = count($arrBid); $j <= $y; $j++) {
$maxLen[$i][$j] = '';
}
}
for ($i = count($arrAid) - 1; $i >= 0; $i--) {
for ($j = count($arrBid) - 1; $j >= 0; $j--) {
if ($arrAid[$i] == $arrBid[$j]) {
$maxLen[$i][$j] = 1 + $maxLen[$i+1][$j+1];
} else {
$maxLen[$i][$j] = max($maxLen[$i+1][$j], $maxLen[$i][$j+1]);
}
}
}
$longest = array();
for ($i = 0, $j = 0; $maxLen[$i][$j] != 0 && $i < $x && $j < $y;) {
if ($arrAid[$i] == $arrBid[$j]) {
$longest[] = $arrAid[$i];
$i++;
$j++;
} else {
if ($maxLen[$i][$j] == $maxLen[$i+1][$j]) {
$i++;
} else {
$j++;
}
}
}
// Сравниваем строки, ищем изменения
$arrBidDiff = array();
$i1 = 0; $i2 = 0;
for ($i = 0, $iters = count($arrBid); $i < $iters; $i++) {
$simbol = array();
if (isset($longest[$i1]) && $longest[$i1] == $arrBid[$i2]) {
$simbol[] = $longest[$i1];
$simbol[] = "*";
$arrBidDiff[] = $simbol;
$i1++;
$i2++;
} else {
$simbol[] = $arrBid[$i2];
$simbol[] = "+";
$arrBidDiff[] = $simbol;
$i2++;
}
}
$arrAidDiff = array();
$i1 = 0; $i2 = 0;
for ($i = 0, $iters = count($arrAid); $i < $iters; $i++) {
$simbol = array();
if (isset($longest[$i1]) && $longest[$i1] == $arrAid[$i2]) {
$simbol[] = $longest[$i1];
$simbol[] = "*";
$arrAidDiff[] = $simbol;
$i1++;
$i2++;
} else {
$simbol[] = $arrAid[$i2];
$simbol[] = "-";
$arrAidDiff[] = $simbol;
$i2++;
}
}
// Меняем идентификаторы обратно на текст
$arrAdiff = array();
foreach($arrAidDiff as $v) {
$arrAdiff[] = array(
$unickTable[$v[0]],
$v[1],
);
}
$arrBdiff = array();
foreach($arrBidDiff as $v) {
$arrBdiff[] = array(
$unickTable[$v[0]],
$v[1],
);
}
// Если на одной и той же позиции у текста A "добавлено" а у B "удалено" - меняем метку на "изменено"
$max = max(count($arrAdiff), count($arrBdiff));
for ($i1 = 0, $i2 = 0; $i1 < $max && $i2 < $max;) {
if (!isset($arrAdiff[$i1]) || !isset($arrBdiff[$i2])) {
// no action
} elseif ($arrAdiff[$i1][1] == "-" && $arrBdiff[$i2][1] == "+" && $arrBdiff[$i2][0] != "") {
$arrAdiff[$i1][1] = "*";
$arrBdiff[$i2][1] = "m";
} elseif ($arrAdiff[$i1][1] != "-" && $arrBdiff[$i2][1] == "+") {
$i2++;
} elseif ($arrAdiff[$i1][1] == "-" && $arrBdiff[$i2][1] != "+") {
$i1++;
}
$i1++;
$i2++;
}
// Оборачиваем изменения в теги для последующей стилизации
$textA = array();
foreach($arrAdiff as $v) {
if ('+' == $v[1]) {
$textA[] = '<span class="added">' . $v[0] . '</span>';
} elseif ('-' == $v[1]) {
$textA[] = '<span class="deleted">' . $v[0] . '</span>';
} elseif ('m' == $v[1]) {
$textA[] = '<span class="changed">' . $v[0] . '</span>';
} else {
$textA[] =$v[0];
}
}
$textA = implode($delimeter, $textA);
$textB = array();
foreach($arrBdiff as $v) {
if ('+' == $v[1]) {
$textB[] = '<span class="added">' . $v[0] . '</span>';
} elseif ('-' == $v[1]) {
$textB[] = '<span class="deleted">' . $v[0] . '</span>';
} elseif ('m' == $v[1]) {
$textB[] = '<span class="changed">' . $v[0] . '</span>';
} else {
$textB[] =$v[0];
}
}
$textB = implode($delimeter, $textB);
return array($textA, $textB);
}
select
t1.id,
t1.text,
t1.text_last_update,
t2.text_version
from tabel1 t1
left join table3 t3 ON t3.text_id = t1.id
left join (
select t.id, t.text_id, t.text_version, t.`date`
from table2 t
where t.`date` <= t3.`date`
order by t.`date` desc limit 1
) t2 ON t2.text_id = t1.id
where t3.user_id = 1
class RoundedText
{
private $string = "some text";
private $angle = 45;
private $image;
private $startX = 150;
private $startY = 250;
/**
* @param string $string текст для отрисовки
*/
public function __construct($string = '')
{
if (!empty($string)) {
$this->string = $string;
}
}
/**
* Рисует текст
*/
private function drawText()
{
// пустая черная картинка 500х500
$this->image = imagecreatetruecolor(500, 500);
//массив символов из строки
$simbols = str_split($this->string);
//центр строки
$center = round(count($simbols)/2);
//цвет символов (красный)
$color = imagecolorallocate($this->image, 0xFF, 0x00, 0x00);
//множитель угла наклона
$i = 1;
//счетчик символов
$j = 1;
while ($simbols) {
$simbol = array_shift($simbols);
//угол поворота символа
$angle = $this->angle / $i;
//если текущий символ дальше центра, инвертируем угол накрона
if ($j > $center) {
$angle *= -1;
$i--;
} else {
$i++;
}
//рисуем символ
$coords = imagefttext($this->image, 24, $angle, $this->startX, $this->startY, $color, 'path_to_font.ttf', $simbol);
//присваиваем координаты нового символа
$this->startX = $coords[2];
$this->startY = $coords[3];
$j++;
}
}
public function save($path = null)
{
$this->drawText();
header("Content-type: image/jpeg");
imagejpeg($this->image, $path, 90);
imagedestroy($this->image);
}
}
$roundText = new RoundedText();
$roundText->save();
SELECT DISTICT product_id FROM t AS t1
LEFT JOIN t AS t2 ON t1.product_id = t2.product_id
WHERE t1.param_id = 1 AND t2.param_id = 2 OR t1.param_id = 2 AND t2.param_id = 1
############################################################################
#### Убираем повторяющиеся слеши (/) в URL ####
############################################################################
RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
# Проверяем, повторяется ли слеш (//) более двух раз.
RewriteRule . %1/%2 [R=301,L]
# Исключаем все лишние слеши.
############################################################################
#### Убираем слеши в конце URL для статических файлов (содержит точку) ####
############################################################################
RewriteCond %{REQUEST_URI} \..+$
# Если файл содержит точку.
RewriteCond %{REQUEST_FILENAME} !-d
# И это не директория.
RewriteCond %{REQUEST_FILENAME} -f
# Является файлом.
RewriteCond %{REQUEST_URI} ^(.+)/$
# И в конце URL есть слеш.
RewriteRule ^(.+)/$ /$1 [R=301,L]
# Исключить слеш.
############################################################################
#### Добавляем слеш(/), если его нет, и это не файл. ####
############################################################################
RewriteCond %{REQUEST_URI} !(.*)/$
# Если слеша в конце нет.
RewriteCond %{REQUEST_FILENAME} !-f
# Не является файлом.
RewriteCond %{REQUEST_URI} !\..+$
# В URL нет точки (файл).
RewriteRule ^(.*)$ $1/ [L,R=301]
# Добавляем слеш в конце.