Разделы

Сниппет MiniNEWS v0.3.2

Обновлён 01.03.2010 в 10.24

Описание:
Давно хотел написать легкий сниппет выводящий несколько новостей.
Тем паче что Ditto большой, толстый и два на страницу глючат очень сильно.

MiniNews делает 3 запроса к базе.

Прошу использовать при желании.

И конечно же прошу совета:
Как использовать плейсхолдеры типа [+body+] в сниппете — такое ощущение что MODx их вырезает с корнем?

Фиксы:
— Ошибка даты в версии 0.3.0
— Ошибка « `` is not numeric and may not be passed to makeUrl() » когда total больше суммы документов.

Нововведения:

Множественные ID:
Реализованная поддержка неограниченного количества родительских ID
Большое спасибо за это ManManovich.


Поддержка TV:
Реализованная без API поддержка TV
&tv_name — необходимые TV параметры через запятую.
По умолчанию все TV
Зависит от: &tv_enable

&tv_enable — Определяет, включен ли механизм подстановки TV параметров: значения TRUE / FALSE
В шаблон нужно добавить плейсхолдер [~+tv_name+~] в который выведется содержание TV.
Например есть TV-картинка и TV текстовое поле с системными именами image и text соответственно.
Что бы вывести их в шаблон вставляем плейсхолдеры [~+image+~] и [~+text+~].
А вызов добавляем &tv_name=`image,system`
По умолчанию FALSE

Добавление полей при вызове:
&fields — поля, необходимые к получению. Желательно указывать, для уменьшения нагрузки к БД.
По умолчанию «id,pagetitle,description,alias,menutitle,longtitle,content,introtext,pub_date»


<?php
/*
Сниппет вывода новостей MiniNEWS  v0.3.2
Пример вызова:
[!MiniNEWS? &id=`1` &tpl=`MiniNEWS_tpl`!]
Переменные в вызове сниппета:

&id - ID родительского документа (если несколько - то через запятую)
По умолчанию "ID текущей страницы"

&dir - направление сортировки DESC ASC
По умолчанию "DESC"

&sort -поле для сортировки
По умолчанию "createdon"

&total - общее количество возвращаемых документов
По умолчанию "нет"

&fields - поля, необходимые к получению. Желательно указывать, для уменьшения нагрузки к БД.
По умолчанию "id,pagetitle,description,alias,menutitle,longtitle,content,introtext,createdon"

&data - формат даты
По умолчанию "%d.%m.%Y - %A"

&tv_name - TV параметры через запятую.
В шаблон нужно добавить плейсхолдер [~+tv_name+~] в который выведется содержание TV .
Например есть TV-картинка и TV текстовое поле с системными именами image и text соответственно.
Что бы вывести их в шаблон вставляем плейсхолдеры [~+image+~] и [~+text+~]. 
А вызов добавляем &tv_name=`image,system`
По умолчанию все TV
Зависит от: &tv_enable

&tv_enable - Определяет, включен ли механизм подстановки TV параметров: значения TRUE / FALSE
По умолчанию FALSE

&tpl - шаблон документа - чанк, что содержит плейсхолдеры, соответствующие названиям заданных полей
По умолчанию: "<dl class="mininews"><dt><a href="[~+id+~]">[~+pagetitle+~]</a>  - [~+createdon+~]</dt><dd>[~+introtext+~]</dd></dl>"

Поля (плейсхолдеры) по умолчанию:
[~[~+id+~]~] - ссылка 
[~+id+~] - ID
[~+pagetitle+~] - заголовок
[~+description+~] - описание
[~+alias+~] - псевдоним
[~+menutitle+~] - название ссылки
[~+longtitle+~] - расширенный заголовок
[~+content+~] - содержание документа
[~+introtext+~] - сокращенное содержание
[~+createdon+~] - дата
*/
            
// Поехали! Кот, одмин, шредер!
// Проверка поля для сортировки
        if(!isset($sort))$sort = 'createdon';
// Проверяем поля:         
                if(!isset($fields))
                {
                $fields = array('id','pagetitle','description','alias','menutitle','longtitle','content','introtext','createdon');
                }ELSE{
                $fields = explode(",",$fields);
                }
// Проверка направления сортировки
        if(!isset($dir))$dir = 'DESC';
        
// Проверка переменной формата даты
        if(!isset($data))$data = '%d.%m.%Y - %A';
//удаляем пробелы из строки c id
        $setids2 = trim($setids, " ");
//делаем массив родительских id 
        $ids = explode( "," , $setids2);
// Проверка ID родительского документа, если не установлена, то id документа не котором вызван сниппет
        if(!isset($ids))$ids = $modx->documentIdentifier;
// определяем переменную child и говорим что она массив, иначе ругается
        $child = array();          
// Проверка TV?

                if(!isset($tv_enable))$tv_enable=false;

// Проверка шаблона
        if(isset($tpl)){
        $chunk = $modx->getChunk($tpl);
        }ELSE{
        $chunk = '<dl class="mininews"><dt><a href="[~[~+id+~]~]">[~+pagetitle+~]</a>  - [~+createdon+~]</dt><dd>[~+introtext+~]</dd></dl>';
        }
// Готовим к использованию поля - переводим массив в тест и создаем массив плейсхолдеров       
                for ($i = 0; $i < sizeof($fields); $i++) {
                        if(isset($fields_txt)){
                                        $fields_txt = $fields_txt.','.$fields[$i];
                                }ELSE{
                                        $fields_txt =$fields[$i];
                                }
                $place_arr[$i] = '[~+'.$fields[$i].'+~]';
        } 
        
// Запрос в API        
 // переводим указатель в массиве ids на первый элемент
reset($ids);
//получаем активные документы из указанных папок и записываем их в один массив
while (list($key, $id) = each($ids)) {
  $child1 = $modx->getActiveChildren($id,$sort,$dir,$fields_txt);
  $child = array_merge( $child,$child1);
}
        
//функция сортировке полученного массива по дате
                   function cmp ($a,$b)
                                {
                                         return $b[createdon] - $a[createdon];
                                }

//вызываем функцию
                                usort($child, "cmp");
// Обработка даты

                                setlocale(LC_TIME, '');                         
                                foreach($child as $key => $value){
                                $data_i = strftime($data,$value["createdon"]);
                                $child[$key]["createdon"]= $data_i;
                                }  
//print_r($child);
                
// Устанавливаем количество интераций
                if(!isset($total))$total = sizeof($child);
                if($total > sizeof($child))$total = sizeof($child);

                
// Выдергиваем TV
        if($tv_enable==true){

        // Формируем список всех ID
                for ($i = 0; $i < $total; $i++){
                $doc = $child[$i];
                if(isset($id_arr))
                        {
                        $in = $id_arr.','.$doc['id'];
                        $id_arr = $in;
                        }ELSE{
                        $id_arr= $doc['id'];
                        }
                
                }
                // Вытаскиваем префикс
                $dbprefix = $modx->db->config['table_prefix'];

                // Формируем запрос к получению TV
                
                
                if(isset($tv_name)){
                        $tv_que=str_replace(',','\',\'',$tv_name);
                        $q_i=' AND '.$dbprefix.'site_tmplvars.name IN (\''.$tv_que.'\')';
                }ELSE{

                }
                $q='SELECT '.$dbprefix.'site_tmplvar_contentvalues.value, '.$dbprefix.'site_tmplvars.name, '.$dbprefix.'site_tmplvar_contentvalues.contentid  FROM '.$dbprefix.'site_tmplvar_contentvalues INNER JOIN '.$dbprefix.'site_tmplvars ON '.$dbprefix.'site_tmplvar_contentvalues.tmplvarid = '.$dbprefix.'site_tmplvars.id WHERE '.$dbprefix.'site_tmplvar_contentvalues.contentid IN ('.$id_arr.')'.$q_i.'';
                
                // Получаем TV
                $result = $modx->db->query($q);
                for ($tv_ar=array(); $row=mysql_fetch_assoc($result);$tv_ar[]=$row);

        }

// Основной цикл
        for ($i = 0; $i < $total; $i++) {
                $doc = $child[$i];
                                
                                // Поиск и замена плейсхолдеров
                $parce = str_replace($place_arr,$doc,$chunk);
                                
                                            
                                
                                // Создание и добавление ссылки
                $url = $modx->makeUrl($doc['id']);
                $parse_with_links = str_replace('[~[~+id+~]~]',$url,$parce);
                                
                                // Формируем TV
                                                                
                            

                                if($tv_enable==true){
                                                                
                                                                                foreach ($tv_ar as $value)
                                        {
                                                                                
                                                if($value['contentid']==$doc['id']){
                                                        $tv_place='[~+'.$value[name].'+~]';
                                                        
                                                        if(isset($parse_with_tv))
                                                        {
                                                                $str_i = str_replace($tv_place,$value[value],$parse_with_tv);
                                                                $parse_with_tv = $str_i;
                                                        }ELSE{
                                                                $parse_with_tv = str_replace($tv_place,$value[value],$parse_with_links);
                                                        }
                                                }
                                        }
                                if (!empty($value[value])){
                                                                                echo $parse_with_tv;
                                                                                }ELSE{
                                                                                echo $parse_with_links;
                                                                                }
                                }ELSE{
                                echo $parse_with_links;
                                }
                                
                
                                // УСЁ!!!
                
         unset($parse_with_tv);               
        }
// удаляем переменные для возможности многократного вызова     
unset($id, $sort, $dir, $fields_txt, $data, $tpl, $tv_name, $total, $i, $int, $tv_name,$tv_enable);
?>
  • +6
  • 5 февраля 2010, 10:01
  • abadello

Комментарии (53)

RSS свернуть / развернуть
+2
2. makeUrl вам в помощь.
avatar

pitbull

  • 5 февраля 2010, 10:12
0
от спасибо! ужо поправил!
avatar

abadello

  • 5 февраля 2010, 10:17
+1
эх, TV бы ещё сюда добавить для вывода изображений.
avatar

NevroZ

  • 8 февраля 2010, 20:54
0
пожалуйста
avatar

abadello

  • 9 февраля 2010, 12:15
+1
Да, отсутствие обработки ТВ параметров — это основной минус. Но собсно, если они не используются (что тоже нередко встречается), то действительно Дитто абы-зря гонять не стоит.
avatar

iJack

  • 8 февраля 2010, 23:36
0
Добавил поддержку TV.
Следуя принципам — вывести новости как можно менее затратным способом эта поддержка скорее полуавтоматическая. Подробности в коде, там все описано.
avatar

abadello

  • 9 февраля 2010, 12:12
0
А кстати не замеряли по времени теперь? С функцией $modx->getTemplateVars в цикле ко всем выводимым новостям. Ибо это может потянуть посильнее, чем Дитто :) — отдельный запрос на каждую новость. В идеале, как я думаю, нужно вытягивать все для всех новостей все ТВ сразу.
avatar

iJack

  • 10 февраля 2010, 01:18
0
Вы предлагаете сделать выборку напрямую из базы, без API, в массив, а потом его печатать? Это просто единственное что мне приходит в голову.
avatar

abadello

  • 10 февраля 2010, 13:13
+1
Ну вобщем то да, почти напрямую, но с API… MODx DBAPI :)
$modx->db->query();
Это позволит не делать лишнее подключение к БД + системный счетчик кол-ва запросов к БД.
avatar

iJack

  • 10 февраля 2010, 14:11
0
))))))))
avatar

abadello

  • 10 февраля 2010, 14:12
0
Слушай, чет не пойму как префикс таблиц вычислить… ( Может подскажешь?
avatar

abadello

  • 10 февраля 2010, 14:53
0
ААА нашел!
avatar

abadello

  • 10 февраля 2010, 16:03
0
Фактически реализовал
avatar

abadello

  • 10 февраля 2010, 17:06
0
Поставил, на выходе получил:

аЂб�аЕб�б�б� аНаОаВаОб�б�б� — 01.01.1970
аЂб�аЕб�б�б� аНаОаВаОб�б�б�
а�аОб�б�б�аАб� аИаНб�аОб�аМаАб�аИб� аИаЗ аЖаИаЗаНаИ аНаАб�аЕаКаОаМб�б�…

а�аОаВаОб�б�б� аНаОаМаЕб� аДаВаА — 01.01.1970
а�аОаВаОб�б�б� аНаОаМаЕб� аДаВаА:
б�аАаМаАб� аПб�аЕаКб�аАб�аНаАб� аНаОаВаОб�б�б� аНаА б�аВаЕб�аЕ — аОб�аЕаНб� аИаНб�аЕб�аЕб�аНаАб� аНаОаВаОб�б�б� — б�аМаОб�б�аИб�аЕ, б�аИб�аАаЙб�аЕ, аВаНаИаМаАаЙб�аЕ…

а�аОаВаОб�б�б� аНаОаМаЕб� аОаДаИаН — 01.01.1970
а�аОаВаОб�б�б� аНаОаМаЕб� аОаДаИаН:
аНаЕаКаОб�аОб�аОаЕ аКб�аАб�аКаОаЕ аОаПаИб�аАаНаИаЕ аНаОаВаОб�б�аИ

« MODx Parse Error »
MODx encountered the following error while attempting to parse the requested resource:
« `` is not numeric and may not be passed to makeUrl() »
— EVO-1.0.2
avatar

kalina

  • 9 февраля 2010, 23:56
0
покажите вызов и шаблон
avatar

abadello

  • 10 февраля 2010, 13:10
0
Ошибку пофиксил, а с кодировками это у вас беда
avatar

abadello

  • 10 февраля 2010, 13:46
0
Реализована поддержка TV без привязки к API, что свело нагрузку к минимуму.
avatar

abadello

  • 10 февраля 2010, 17:46
+1
Отлично! Спасибо!

Есть еще ошибки.
1. В разделе три документа. Дату публикации у документов я не ставил.
Все три вывелись нормально, за исключением их дат:
01.01.1970
2. Поставил у Двух документов даты публикации:
Новость номер два 26 02-02-2010 01:54:00
Новость номер один 22 01-02-2010 01:52:00
Новости вывелись в таком виде:
Новость номер два — 02.02.2010
Самая прекрасная новость на свете — очень интересная новость — смотрите, читайте, внимайте…
Новость номер один — 02.02.2010
некоторое краткое описание новости

Третья новость — 02.02.2010
Горячая информация из жизни насекомых…
т.е.
дата вывелась везде одинаковая, при этом у Третьего документа дата публикации не выставлена.
Шаблон использую дефолтный; EVO-102; кодировка UTF-8
avatar

kalina

  • 11 февраля 2010, 02:04
0
Тут важно учесть разницу между датами [*createdon*] и [*pub_date*]. [*createdon*] — создается и записывается ВСЕГДА при создании дока. А [*pub_date*] — только если ее явно указать или юзать ММ, там плагин автоматически заполняет. Собственно тут или иную дату нужно использовать в разных случаях по необходимости. Так что стоит учесть, что плэйсхолдер даты — это не только [*pub_date*] (это замечание, так сказать, автору топика :) ).
avatar

iJack

  • 11 февраля 2010, 12:30
0
Да, эти поправки я уже внес.
Думал сначала публикацию выводить, но пото уже понял что createdon адекватнее воспримится массами ))
Просто нашел косяк, с которым никак не разберусь, как поправлю только, сразу все и выкачу.
avatar

abadello

  • 11 февраля 2010, 12:37
0
А где же пагинатор? :)
avatar

Dorimen

  • 21 февраля 2010, 10:30
0
Внес фикс с датой, были проблемы.
Есть известная ошибка с использованием TV. Когда указано что TV есть а их нет.
Катастрофически не хватает времени.
avatar

abadello

  • 1 марта 2010, 10:28
0
не туда, но все поняли ))
avatar

abadello

  • 1 марта 2010, 10:28
-2
Не знаю куда спросить, поэтому попробую написать здесь.
А не подскажете, как например к документу через TV подцепить неограниченное количество изображений, а не только одно?
avatar

lesch

  • 2 апреля 2010, 20:55
0
Здесь читайте, а в следующий раз выбирайте более подходящее место для вопроса. По крайней мере чтобы топик был по теме.
avatar

pitbull

  • 3 апреля 2010, 18:17
0
MODx 1.0.2. Попробовал и почему-то не выводится. Возможно что-то неправильно сделал? Скопировал код сниппета MiniNEWS. Создал чанк MiniNEWS_tpl:
<dl class="mininews"><dt><a href="[~+id+~]">[~+pagetitle+~]</a>  - [~+createdon+~]</dt><dd>[~+introtext+~]</dd></dl>
Создал страницы с новостями (дочерними к той из которой вызываю снипет).
Вызываю сниппет [!MiniNEWS? &id=`1` &tpl=`MiniNEWS_tpl`!]
и… ничего не наблюдаю. Подскажите, пожалуйста, что я делаю неправильно?
avatar

SlavaRom

  • 10 апреля 2010, 19:51
0
А
[!MiniNEWS? &id=`1`!]
выводит? В принципе все верно, проблем быть не должно.
Сниппет постоянно использую сам, все работает, кроме известного и описанного бага с TV — но вы их и не используете.
И еще — сниппет выводит пустой HTML или даже его не выводит?
avatar

abadello

  • 10 апреля 2010, 20:50
0
Использую демо-сайт из комплекта MODx. Выводится короткий текст, который в контексте, а ниже, где должна быть информация, пусто.
avatar

SlavaRom

  • 10 апреля 2010, 21:23
0
Так при использовании страницы без подстраниц, а с дочерними ресурсами выдает такую ошибку:
PHP error debug
  Error: 	Invalid argument supplied for foreach()	 
  Error type/ Nr.: 	Warning - 2	 
  File: 	/home/n/*/modx/public_html/manager/includes/document.parser.class.inc.php(770) : eval()'d code	 
  Line: 	158
avatar

SlavaRom

  • 11 апреля 2010, 22:06
0
Я честно говоря не очень понимаю, что вы хотите от сниппета? Я не заявлял поддержку вложенных структур, если будет время, я буду этим заниматься, хотя опять же не вижу смысла, если есть Ditto.
Несколько новостей вывести у сниппета получается отлично.
А данная ошибка еще может возникать из-за того, что в выводе вы активировали поддержку TV, но не заполнили поля у документов (которые и должны вывестись) — эта ошибка известна.
avatar

abadello

  • 12 апреля 2010, 09:37
0
Я хочу чтобы он хоть что-то вывел. Пока же чистая страница выводится.
Есть параметр &id — ID родительского документа, я так понял, что как и в Ditto, информация, которая должна выводится в новости должна находится в дочерних ресурсах (страницах). Выше я уже писал:
Создал страницы с новостями (дочерними к той из которой вызываю снипет).
Вызываю сниппет [!MiniNEWS? &id=`1` &tpl=`MiniNEWS_tpl`!]
Вы написали в ответ:
В принципе все верно, проблем быть не должно.
Опишите, пожалуйста, подробно как запустить MiniNEWS на простейшем примере. Кроме сниппета, чанка и указанной строчки ничего вводить/выводить не надо?
avatar

SlavaRom

  • 12 апреля 2010, 10:56
0
поставьте тип шаблона blank, в содержимом поставьте
[!MiniNEWS? &id=`1` &tpl=`MiniNEWS_tpl`!]

и пришлите мне исходный код страницы, пожалуйста.
avatar

abadello

  • 12 апреля 2010, 11:04
0
Шаблон везде поставил blank. Код страницы при просмотре сайта:
<p>Проверка сниппета МиниНьюс: </p>
<p>
</p>

Страница в при редактировании в админке (в режиме html):
<p>Проверка сниппета МиниНьюс: </p>
<p>
[!MiniNEWS? id=`51` tpl=`MiniNEWS_tpl`!]</p>
avatar

SlavaRom

  • 12 апреля 2010, 13:58
0
Могу и полный доступ к сайту дать, может так удобнее будет?
avatar

SlavaRom

  • 12 апреля 2010, 14:16
0
Не
[!MiniNEWS? id=`51` tpl=`MiniNEWS_tpl`!]

А
[!MiniNEWS? &id=`51` &tpl=`MiniNEWS_tpl`!]
avatar

abadello

  • 13 апреля 2010, 09:24
0
Да, правильно, так и есть: [!MiniNEWS? &id=`51` &tpl=`MiniNEWS_tpl`!]. Здесь не так написал. Если страница не имеет дочерних, то пусто, вернее:
<p>Проверка сниппета МиниНьюс: </p>
<p>
</p>
. Если имеет, то выдается указанная ошибка.
avatar

SlavaRom

  • 13 апреля 2010, 11:00
0
318195шесть91 стукни плиз, посмотрю что по чем
avatar

abadello

  • 13 апреля 2010, 11:06
0
подскажите пожалуйста, рядом с датой присутствуют некие квадратики
http://s54.radikal.ru/i144/1004/28/a3181dbae183.png
как это исправить?
avatar

Trent

  • 28 апреля 2010, 21:16
0
уже нашёл! нужно было удалить в коде %A
avatar

Trent

  • 29 апреля 2010, 01:52
0
Формат даты задаётся параметром &data — он формируется в связи с настройками вашего сервера. Поэтому и конфликт кодировок. Кстати, если мне не изменяет память php начал поддерживать utf8 только с 5.3.3
avatar

abadello

  • 27 июля 2010, 22:38
0
Хорошо было бы, если нет проверки по вложенным папкам, добавить возможность задать несколько id.
avatar

ManManovich

  • 27 июля 2010, 18:54
0
Вот, блин. Кажется вставить возможность задать несколько id не сильно проще чем добавить возможность просматривать на предмет новинок дочерние папки. :(
avatar

ManManovich

  • 27 июля 2010, 21:47
0
Не понимаю вопроса — конкретизируйте и опишите подробнее.
avatar

abadello

  • 27 июля 2010, 22:35
0
Попробую. Хотелось бы, чтобы можно было делать так
[!MiniNEWS? &id=`1, 10, 42`!] Соответственно он ищет и выводит последние документы из нескольких указанных директорий.
avatar

ManManovich

  • 28 июля 2010, 08:03
0
ещё не успел проверить, но должно быть что-то вроде этого, кажется.

$child = array();
$ids =  array(); //не уверен что это нужно
$setids2 = trim($setids, " ");
$ids = explode( "," , $setids2);
if(!isset($ids))$ids = $modx->documentIdentifier;


reset($ids);
while (list($key, $id) = each($ids)) {
  $child1 = $modx->getActiveChildren($id,$sort,$dir,$fields_txt);
  $child = array_merge( $child,$child1);
}
//print_r($child);


Вместо параметра "&id=`19`" в вызове сниппета, будет "&setids=`19, 82, 49`"
avatar

ManManovich

  • 28 июля 2010, 09:24
комментарий был удален

0
При запросе по 9 id справляется лучше чем listIndexer

Mini news:
[!MiniNews? &setids=`57,19,20,37,38,36,45,51,69` &total=`15`  &tpl=`MiniNEWS_tpl` &date=`%d.%m.%Y` &fields=`id,pagetitle,createdon`!]

время на запросы к базе данных: 0.0115 s
запросов к базе данных: 11
общее время на генерацию страницы: 0.0443 s
время на работу PHP скриптов: 0.0328 s

ListIndexer
[[ListIndexer? &LIn_root=`69, 18, 12` &LIn_fDesc=`0` &LIn_depth=`3` &LIn_sQty=`15` $shortDesc=`0` LIn_fast=`1`]]

время на запросы к базе данных: 0.1456 s
запросов к базе данных: 14
общее время на генерацию страницы: 0.1790 s
время на работу PHP скриптов: 0.0335 s

avatar

ManManovich

  • 28 июля 2010, 21:59
0
Спасибо, нововведение нужное и полезное. Внес соответствующие поправки в голову.
Просьба админа вот отсюда community.modx-cms.ru/blog/addons/436.html#comment7372 вырезать код — что бы не дублировать и не растягивать тему. Спасибо.
avatar

abadello

  • 29 июля 2010, 10:49
0
Есть добавления. Там в начале сниппета, в справке, надо поменять:

[!MiniNEWS? &id=`1` &tpl=`MiniNEWS_tpl`!]
Переменные в вызове сниппета:

&id — ID родительского документа (если несколько — то через запятую)
По умолчанию «ID текущей страницы»

на

[!MiniNEWS? &setids=`1` &tpl=`MiniNEWS_tpl`!]
Переменные в вызове сниппета:

&setids — ID родительского документа (если несколько — то через запятую)
По умолчанию «ID текущей страницы»

Можно и код переписать, чтоб вызов &id=`13, 14,15`не менять. Те я его переписал, брать отсюда: чтоб не удлиннять тему ;)
avatar

ManManovich

  • 29 июля 2010, 12:32
0
А нельзя вырезать. Только весь коммент если удалить. По хорошему надо бы сделать сворачивание длинного кода.
avatar

Carw

  • 30 июля 2010, 01:28
0
Ну ладно, все равно спасибо.
avatar

abadello

  • 30 июля 2010, 09:35
0
Ну дак удаляйте. Код в первом сообщении, а в остальном там особой важности нет.
avatar

ManManovich

  • 30 июля 2010, 10:28
0
Удалил.
avatar

Carw

  • 30 июля 2010, 11:03

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.