Systém komentářů pomocí jQuery a Ajax.

 2012-10-27 00:00:00
 Dmitry Burobin

Dnes vytvoříme systém komentářů s automatickou kontrolou vstupních dat pomocí technologie Ajax a přidáváním nového komentáře s použitím jQuery bez znovunačtení stránky.

Série článků:
1) Systém komentářů pomocí jQuery a Ajax.
2) Lajkování neboli karma u komentářů.
3) Strankování.

Vytvoření tabulky a připojení k databázi.

Vytvoříme si tabulku comments, do které budeme ukládat: identifikátor komentáře ( id ), identifikátor rodičovského komentáře ( parent_id ), jméno ( name ), text komentáře ( text ) a datum přidání komentáře ( date ).

CREATE TABLE `comments` (
`id` INT ( 5 ) NOT NULL AUTO_INCREMENT,
`parent_id` INT ( 5 ) NOT NULL,
`name` VARCHAR ( 255 ) NOT NULL,
`komentar` TEXT,
`date` DATETIME,
PRIMARY KEY(`id`)
)ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci

Taktéž si vytvořte soubor db.php, pro připojení k databázi.
<?php
$DBSERVER 'localhost'//server, který bude použít pro navázáníspojení s DB 
$DBUSER 'root'//Váš mysql login, nejspíš je stejný jako u mě pro localhost, tudiž root 
$DBPASS '****'//heslo, které jste zadaval při instalaci MySQL 

$DB 'test'//databáze, s kterou budeme pracovat 

//navazení spojení pomoci mysql_connect  
$link mysql_connect($DBSERVER$DBUSER$DBPASS)  or die("Could not connect: " mysql_error()); 
//vybírame databázi 
mysql_select_db($DB$link) or die ('Can\'t use test : ' mysql_error()); 
//řekněme MySQL, že všechná data jsou ve formatu UTF-8 
mysql_query("SET NAMES UTF8");
?>

index.php

Hlavní stránka bude obsahovat formulář pro přidávání komentářů s polem pro jméno, zprávu a skryté pole, do kterého budeme ukálát identifikátor rodičovského komentáře, pokud někdo bude odpovídat na nějaký komenář. Soubor index.php vypadá takto:

<?php
/*Soubor pro vybírání komentářů z databáze*/
require_once 'comment.php';
?>
<!DOCTYPE html>
<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" lang="cs">

<
head>
    <
title>Systém komentářů.</title>
    <
meta charset="utf-8" >
    
    <
link rel="stylesheet" href="style.css"> <!-- soubor se styly -->
    <
script src="jquery-1.7.1.min.js"></script> <!-- připojení jquery -->
    <script src="comment.js"></script> <!-- funkce potřebné pro přidávání komentářů -->
    
</head>
<body>
<ul id="commentWrapper">
<?php
/*Zde v proměnné $comments jsou komentáře*/
echo $comments;
?>
<!-- formulář pro přidávání komentářů -->
</
ul>    
    <
div id="commentBox">
        <
input class="validate" type="text" name="name" >
        <
input id="parent" type="hidden" name="parent_id" value="">
        <
div class="commentText">
            <
textarea name="text"></textarea>
        </
div>
        <
button>Přidat</button><img class="loader" src="loader.gif">
    </
div>
</
body>
</
html>

Styly a knihovna jQuery

Pro správné fungování potřebujeme připojit knihovnu jQuery. Tu buď stáhnete z oficiálního webu nebo z archivu s tímto článkem. Pak, aby komentáře líp vypadali přidáme styly, nic složitého v nich není, proto je nebudu popisovat:

body
{
    
margin:0;
    
padding:0;
}
ulli
{
    list-
style-type:none;
}
.
loader
{
    
display:none;
}
#commentBox
{
    
width:400px;
    
padding:10px;
}
#commentBox input
{
    
width:250px;
    
height:25px;
    
padding0 5px;
    
margin:5px;
    
bordersolid 1px #ccc;
    
background:#f1f1f1 url(bg_input.png) no-repeat;
    
font400 12pt/14pt Ume Gothic O5;
}
#commentBox textarea
{
    
width:250px;
    
height:100px;
    
margin5px;
    
padding5px;
    
bordersolid 1px #ccc;
    
background:#f1f1f1 url(bg_koment.png) no-repeat;
    
font400 12pt/14pt Ume Gothic O5;
}
#commentBox button
{
    
height:30px;
    
width:85px;
    
margin-left183px;
    
margin-top:0px;
    
font:700 12pt/14pt Ume Gothic O5;
}
#commentWrap
{
    
width:350px;
    
padding:10px;
    
padding-bottom:3px;
    
margin:10px;
    
border1px solid #ccc;
    
border-radius:10px;
    
background:#f7f7f7;
}
#commentWrap .komentar
{
    
padding:5px;
    
padding-left:0px;
    
border-top:1px solid #ccc;
    
margin-bottom:10px;
    
font:400 12pt/14pt Times New Roman;
}
#commentWrap .replay
{
    
margin-left:270px;
    
font:700 10pt/12pt Ume Gothic O5;
}
#commentWrap a
{
    
text-decoration:none;
}
#commentWrap .commentName
{
    
font:700 10pt/12pt Ume Gothic O5;
}
#commentWrap .commentDate
{
    
font:400 11pt/13pt Times New Roman;
}
.
repName
{
    
font:400 12pt/14pt Times New Roman;
    
font-style:italic;
}
.
repText
{
    
font:700 10pt/12pt Ume Gothic O5;
}
.
repDate
{
    
font:400 9pt/11pt Times New Roman;
    
font-style:italic;
}

comment.php

Tento soubor je určen pro vybírání dat z databáze a vkládání těchto dat do šablony.

<?php
// Vložíme soubor s připojením k databázi. ( musí se nacházet ve stejné složce ) 
require_once 'db.php';

// Vybereme komentáře z databáze
$query mysql_query("
         SELECT `id`,`parent_id`,`name`,`komentar`, 
         DATE_FORMAT(date, '%d %M %Y %H:%i') as date_add
         FROM `comments` ORDER BY `id` ASC 
         "
);
         
// Pokud při vykonání příkazu nastané chyba vypišeme ji
if(!$query) { echo mysql_error() . " - " mysql_errno(); }
else {

// Jinak pomocí cyklusu projdeme všechny záznamy v tabulce
        
while($result mysql_fetch_assoc($query))
        {
            
// a uložíme je do pole $data  
            
$data[$result['id']] = $result;
        }

// Funkce pro vkládání dat ( komentářů ) do šablony
function commentsToTemplate($comment)
{
// $comment - pole komentáře - id, parent_id, name, text, date 
    
// Zapneme bufferování výstupu, aby šablona nebyla zobrazená v místě volání funkce
    
ob_start();  
      
// Připojíme šablonu comment_template.php, do které vložíme data z pole $comment
    
require_once 'comment_template.php';                     
  
// Získáváme obsah bufferu jako řetězec   
    
$comments_string =  ob_get_contents(); 

// Vymažeme všechno z bufferu
    
ob_end_clean();

// Vrácíme komentář jako řetězec   
    
return $comments_string;    
}

// Funkce pro zpracování pole $data, které
// bude rozděleno do jednotlivých komentářů a odesláno funkci 
// commentsToTemplate
function commentsString($data)
{
    foreach(
$data as $w
    {
        
$string .= commentsToTemplate($w);
    }
 
return 
$string
}  

// proměnná $comments obsahuje naše komentáře, které zobrazujeme na hlavní stránce
$comments commentsString($data);

// vynulujeme proměnnou $data 
$data null;
}
?>

comment_template.php

Toto je vlastně šablona jednotlivého komentáře.

<?php
// Do této šablony se načítají data z pole $data, která jsou odesláná funkci commentsToTemplate
echo '<li id="comment'.$comment['id'].'">
    <div id="commentWrap">'
;
        
// Pokud existuje parent_id, pak zobrazíme, že se jedna o odpověď
        
if($comment['parent_id']!=0)
        {
// Vybereme z DB jméno a datum rodičovského komentáře
            
$q mysql_query("SELECT `name`, DATE_FORMAT(date, '%d %M %Y %H:%i') as date_add FROM `comments_my` WHERE `id`='".$comment['parent_id']."'");
            
$r mysql_fetch_assoc($q);
            echo 
'<span class="repText">Odpověď na komentář</span> <span class="repName">
            '
.$r['name'].'
            </span> <span class="repText">from</span> <span class="repDate">
            '
.$r['date_add'].'
            </span><br>'
;
        }
        
// Zobrazíme jméno a datum přidání
echo    '<span class="commentName">'.$comment['name'].'</span> - <span class="commentDate">'.$comment['date_add'].'</span>
        <div class="komentar">
<!--Zobrazíme text komentáře-->
            '
.$comment['komentar'].'
        </div>
<!--Pokud zmačkneme na tento odkaz, pak se do skrýteho pole s názvem parent_id přidá
identifikátor tohoto komentáře. 
Použil jsem zde JS událost onClick, tzn. pokud je tlačítko zmačknuté, pak najdi prvek s 
id parent ( což je skrýte pole parent_id ) a do hodnoty přidej id komentáře, na který chcete odpovědět-->
        <a class="replay" href="javascript:;"
        onClick="document.getElementById(\'parent\').value='
.$comment['id'].';">Odpovědět</a>
    </div>
</li>'
;
?>

comment.js

Tento soubor je určen pro odesílaní dat na server a přidávání do databáze

$(document).ready(function(){
    
// Objekt commentBox bude obsahovat data pro odesílání na server
    
var commentBox = {};
    
// Po kliknutí na tlačítko přidat      
     
$('#commentBox button').live('click',function(){
         
// Do objektu commentBox bude přidána hodnota skrýteho pole input s názvem parent_id,
// které obsahuje id rodičovského komentáře a pokud je prázdné tak bude 0, což znamená, že
// se jedná o nový komentář bez reakci na něj ( toto se bude ověřovat až odešleme data na server ).   
        
commentBox.parent_id = $('#commentBox').find("input[name='parent_id']").val();
        
// Taktéž přidáme do objektu commentBox hodnotu pole name a zprávu
        
commentBox.name = $('#commentBox').find("input[name='name']").val();        
        
commentBox.text = $('#commentBox').find("textarea").val();
// Abyste to lépe pochopili syntaxe toho, jak přidáváme hodnoty do objektu je:
// Objekt.název_proměnné = hledáme input nebo textarea.hodnota pole

// Funkce pro odesílání dat na server        
        
sendData();
     });
    

function 
sendData()
{
// Najdeme tlačítko schováme jej a zobrazíme loader ( ten si můžete stáhnout z archivu )
    
$('#commentBox').find('button').hide().next().show();

// Odešleme    data metodou post na server
    
$.post(
// Soubor, ve kterém se provádí ověřování dat a přidávání komentářů     
        
"addkoment.php",
// Objekt s proměnnými (parent_id, name a text)
        
commentBox,
        function(
data){
// Pokud jsou nějaka data, to znamená, že nastala chyba
            
if(data)
            {
// Převedeme tento řetězec JSON do objektu JS
                
data = $.parseJSON(data);
                
// Vytvoříme proměnnou errors, která bude obsahovat název chyby
                
var errors '';

// Použijeme cyklus pro zobrazení všech chyb najednou.
// Použil jsem tuto konstrukci, protože nejprvé jsem zobrazoval všechny chyby, ale
// nakonec jsem to změnil a teď se bude zobrazovat jenom jedna konkretní chyba     
// Kdybyste chtěli zobrazit všechny chyby tak použijte konstrukci
// errors += val+'\n'; - každá chyba se zobrazí na samostatném řádku.
// i - obsahuje název chybného pole a val - popis chyby
            
                
$.each(data, function(ival)
                {
                    
errors += i;
                });

// Uložil jsem do proměnné errors jenom název chybného pole a
// cyklusem switch procházim všechny varianty a přidávam červený rámeček 
// pokud pole je prázdné nebo jestli komentář nebyl přidan tak zobrazim hlášení                    
                   
switch (errors
                   {
                      case 
'name':
                        $(
'#commentBox').find("input[name='name']").css('border','2px solid red');
                        break
                      case 
'text':
                        $(
'#commentBox').find("textarea").css('border','2px solid red');
                        break
                      case 
'not_add':
                        
alert('Komentář nebyl přidan.')
                        break
                      default:
                        
alert('Něco je špatně')
                  }

// Najdeme loader ( ten si můžete stáhnout z archivu ) schováme jej a zobrazíme tlačítko přidat     
                
$('#commentBox').find('button').show().next().hide();

// Jinak, pokud žadná chyba nenastala, tak voláme funkci addComment, která zobrazí
// komentář bez znovunačtení stránky a vynuluje hodnoty vstupních poli
            
} else {
                
addComment();        
            }
        }
    
    )

}


function 
addComment()
{
// Na konec prvků s id commentWrapper ( což je ul ) přidame tag <li></li>,
// ve kterém se bude nacházet nový komentář
    
$("#commentWrapper").append('<li></li>');

// Najdeme poslední tag <li>, který jsme teď vytvořili a
// načteme do něj poslední komentář
    
$("#commentWrapper li:last").load('new_comment.php');
// Najdeme loader ( ten si můžete stáhnout z archivu ) schováme jej a zobrazíme tlačítko přidat     
    
$('#commentBox').find('button').show().next().hide();

// Vynulujeme hodnoty vstupních poli
    
$('#commentBox input').val('');
    $(
'#commentBox textarea').val('');

}


});

addkoment.php

Tento skript zpracovává data poslána na server pro zpracování.

<?php
// Ověříme, zda se jedna o odeslána POST data nebo si člověk jen tak otevřel tuto stránku
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {

// Pokud ano, pomocí funkci sleep přidame efekt zpoždění, abyste 
// viděl loader, jinak, protože pracujeme na lokálním serveru
// se ten loader hned schová  
     
sleep(2);

// Ověříme vstupní data     
// Pokud je pole name nebo textové pole prázdné do pole $error uložíme text chyby
// ukončíme skript a odešleme tuto chybu v JSON formátu  
     
if(!isset($_POST['name']) OR empty($_POST['name']))
     {
        
$error['name'] = "Zadejte jméno.";
        exit(
json_encode($error));
     } else {
        
$name htmlspecialchars(stripslashes(trim($_POST['name'])));
     }
     
     if(!isset(
$_POST['text']) OR empty($_POST['text']))
     {
        
$error['text'] = "Zadejte zprávu.";
        exit(
json_encode($error));
     } else {
        
$text stripslashes(htmlspecialchars(trim($_POST['text'])));
     }
     
// V tomto případě, když parent_id je prázdné pole tak mu přiřadime hodnotu 0
// to znamená, že se jedná o nový komentář, který není odpovědí na něčí jiný  
     
if(!isset($_POST['parent_id']) OR empty($_POST['parent_id']))
     {
        
$parent_id 0;
     } else {
        
$parent_id stripslashes(htmlspecialchars(trim($_POST['parent_id'])));
     }
     
// Vložíme soubor s připojením k databázi. ( musí se nacházet ve stejné složce )  
     
require_once 'db.php';
     
// Přidame komentář do databáze a vrátíme false, tzn.
// že chyba nenastala a komentář byl přidán.
     
$q mysql_query("
     INSERT INTO `comments`(`parent_id`,`name`,`komentar`,`date`)
     VALUES('"
.$parent_id."','".$name."','".$text."', NOW())
     "
);
     if(!
$q) { $error['not_add'] = "Komentář nebyl přidan."; exit(json_encode($error));}
     else { exit(
false); }

}
?>

new_comment.php

V tomto souboru vybírame poslední komentář, abysme ho následně zobrazili po úspěšnem ověření vstupních dat.

<?php
// Vložíme soubor s připojením k databázi. ( musí se nacházet ve stejné složce ) 
require_once 'db.php';
// Vybereme maximální ( poslední přidáný ) id
$max mysql_query("SELECT MAX(`id`) FROM `comments_my`");
// Pak vybereme všechny související údaje s tímto identifikátorem
$query mysql_query("
         SELECT `parent_id`,`name`,`komentar`, 
         DATE_FORMAT(date, '%d %M %Y %H:%i') as date_add
         FROM `comments_my` WHERE `id` = '"
.mysql_result($max,0)."'
         "
);
$comment mysql_fetch_assoc($query);

// A stejně, jak jsme zobrazovali komentáře před tím, zobrazíme poslední přidáný
echo '<li id="comment'.mysql_result($max,0).'">
    <div id="commentWrap">'
;
        
        if(
$comment['parent_id']!=0)
        {
            
$q mysql_query("SELECT `name`, DATE_FORMAT(date, '%d %M %Y %H:%i') as date_add FROM `comments_my` WHERE `id`='".$comment['parent_id']."'");
            
$r mysql_fetch_assoc($q);
            echo 
'<span class="repText">Odpověď na komentář</span> <span class="repName">
            '
.$r['name'].'
            </span> <span class="repText">from</span> <span class="repDate">
            '
.$r['date_add'].'
            </span><br>'
;
        }
        
echo    
'<span class="commentName">'.$comment['name'].'</span> - <span class="commentDate">'.$comment['date_add'].'</span>
        <div class="komentar">
            '
.$comment['komentar'].'
        </div>
        <a class="replay" href="javascript:;"
        onClick="document.getElementById(\'parent\').value='
.mysql_result($max,0).';">Odpovědět</a>
    </div>
</li>'
;
?>

Závěr

Probrali jsme, jak můžeme zpracovávát formuláře bez znovunačtení stránky. Doufám, že se Vám tento článek líbil a byl pro Vás přínosný.

Systém Orphus
Napište komentář.
Celkem komenrářů(9129)
Dennisenulk - 2017-02-09  10:47:53
 Heya i am for the first time here. I found this board and I find It truly helpful & it helped me out a lot. I'm hoping to offer something back and aid others such as you helped me.


https://myspace.com/swordsandsouls2

http://swordsandsoulss.blog2lea
.com/1301161/swords-and-souls-flash-game
Yakovcok - 2017-02-09  10:25:03
 Позавчера пересматривал данные интернет, случайно к своему восторгу увидел важный ресурс. Я про него: [url=http://alfaakb.com/avto-akkumulyator-westa-6st-60-r/]аккумулятор 6 ст 60 цена[/url] . Для меня вышеуказанный веб-сайт оказался очень нужным. Хорошего дня!
Yaroslavesola - 2017-02-09  08:48:17
 Этой ночью наблюдал контент инета, случайно к своему удивлению заметил неплохой сайт. Гляньте: [url=http://akkymylyatorov.net/3-varta.html]аккумулятор varta[/url] . Для нас вышеуказанный сайт оказался довольно важным. Всего доброго!
JosephScofs - 2017-02-09  08:21:48
 http://jahanazism.takbb.com/showthread.php?tid=4083 cialis 5mg http://www.isfnews.cz/forum/index.php?topic=2073465.new#new soma no prescription needed levitra online http://news.shadowera.net/content/?p=299#comment-35392 split cialis pills ortho evra patch http://forum.monkeylife.eu/showthread.php?tid=1410&pid=2509#pid2509 buy generic cialis online viagra without prescription http://www.blog.projects.tchad.biz/2014/05/projects-26-may-1-june-2014/#comment-18658 generic levitra 5 mg http://biokamin.at/vetites/biokamin6?page=497#comment-24906 generic cialis tadalafil runny nose
Frankhic - 2017-02-09  07:52:13
 http://www.gesichterparty.de/user/provestra1man
http://www.photodex.com/share/sinnitergi1986/profile
http://www.cosplayisland.co.uk/profile/view/provestra5c
http://www.codeproject.com/Members/provestraboy1
http://www.impactante.tv/profile.php?u=provestra3c

Every one loves having their women pleased as punch!
http://purevolume.com/enhanceblog9/posts
Frankhic - 2017-02-09  07:04:19
 http://www.apsense.com/user/provestraboy1
http://www.chatbazaar.com/provestra3man
http://www.ilustrum.com/user/270557
http://nobuffer.info/profile/provestraboy5
http://play.eslgaming.com/player/10920130/

Person loves having their women cheery!
http://thorstein1.ek.la
KennethMab - 2017-02-09  03:47:22
 Подтверждаю. Так бывает. Можем пообщаться на эту тему.

Браво, какие нужные слова..., отличная мысль [url=http://kwekerijvisser.nl/component/k2/itemlist/user/611820]Читать дальше[/url]

Увы! К сожалению! [url=http://cafejanae.com/index.php?option=com_k2&view=itemlist&task=user&id=229494]тут[/url]

Хотел бы сказать пару слов. [url=http://foreverfactors.com/index.php?option=com_k2&view=itemlist&task=user&id=268489]ссылка[/url]

Разрешите помочь Вам? [url=http://www.sawyersecuritysystems.com/component/k2/itemlist/user/1177656]по этой ссылке[/url]

Это было и со мной. Можем пообщаться на эту тему. [url=http://www.orbitlab.eu/component/k2/itemlist/user/3058]тут[/url]
JosephScofs - 2017-02-09  02:41:27
 http://waveridersgroup.com/index.php/forum/suggestion-box/40392-buy-cheap-generic-cialis#40396 best price for generic levitra http://dungeons.kpss-msk.ru/2016/04/26/facebook-dungeon-brawlers-bot/#comment-4189 generic levitra review http://destressingyourlife.com/blog/?p=186#comment-732 20mg generic levitra order online http://www.german-deutsch.com/dein-dashboard/#comment-159541 propecia and weight loss levitra online http://forum.romewars.com/viewtopic.php?f=15&t=1116276 online cialis prescription http://www.overdering.be/ambities/#comment-4120 levitra online which is better
RonaldBeany - 2017-02-08  20:54:11
 While the Dr Be
stein diet fairly famous primarily money for advertising, offices, and media coverage, the reality is it is not the best diet for you.

Other stuff you can do as a diabetic carry out is to snack on air popped popco
as compared to pretzels. Salt should be limited in the diet as the diabetic was in a higher risk for bloodstream pressure pressure.

The best diet is to be able to be make certain that doable ! stick to and not something which are gonna be drop 1 week later and the one that features delicious foods and tend to be happy with it.

Each person has a more fullfilling body, with each person's metabolism functions in a different way. Thus, what may work on somebody else's body may or perform on method. That is why one donrrrt want to go to what is advertised in newspapers, magazines, or on television etc. Pills that noticed see on tv may really be meant for a specific body type, without having for you. And in case consume such pills, chances are that also it be plagued by it's sever side- insinuation.

Now, cardiovascular of the dietary plan program is the "shifting theory" that discover lea
could be where positive if you alte
ate the calories from those meals happen to be eating which will cause your metabolism to to the actual peak promising. Guess what results? Since your metabolism will be running strong throughout the actual whole day.you get dropping fat and body weight.throughout the entire time frame!

Avoid processed food. These food products posess zero nutritional benefits. They fill you up with calories and fats which you can't use easily and will be stored as unwanted belly body fat. Therefore, give up your chips and chocolate cakes together with other processed food and change them for delicious lean meats, salads, vegetables and fruits.
,the three week diet
You will add yogurt and also the fibre and protein, terrible only you eating healthy but you may want to feel ecstatic. By emotionally feeling satisfied, you're going to be much in your determination, to adhere to through on whatever weight loss program you are following.

I lost an amazing 52 extra pounds. of fat by two months in relationship to this popular online fat loss program. Always! It works simply because it naturally raises your metabolism by having you eat REAL Everything they eat.
,[url=http://www.need.net.pk/tag/weight-loss-33/]the three week diet[/url]
Douglasenara - 2017-02-08  19:58:30
 viagra billig kaufen
cialis generika
cialis 5mg preise
[url=https://apothekegenerika.com]generika cialis[/url]
cialis generika aus deutschland
cialis online
WalterMak - 2017-02-08  18:45:17
 Скоро 8 марта! Наконец-то наступит пора отпусков, отдыха и приключений. Если же вы решили провести такой знойный сезон в Черногории, то данная заметка будет вам полезна.
Тут мы подготовили несколько рекомендаций для путешественников.
Если вы заранее планируете отпуск, то у вас имеется возможность взять билеты по наиболее низким ценам. Сравните предложения различных авиакомпаний, посмотрите, может быть, у какого-то из авиаперевозчиков на данный момент как раз проходит скидочная акция или действует выгодное предложение.
Бронировать и искать номера нужно за 2–3 месяца до отправления, иначе лучшие номера будут заняты, а оставшиеся – многократно вырастут в цене.
Многие выбирают передвигаться на такси. Однако появляется стандартная проблема – языковой барьер. Нередко очень непросто объяснить, где вы находитесь. Имеется решение –заказ такси онлайн по геопозиции – шофер при помощи приложения узнает ваше местоположение и приедет на место.
Желательно не оставлять без внимания способ перемещения. Если же вы привыкли к комфорту, то аренда авто в Черногории – самый удачный вариант. К счастью, вариантов большое количество, потому-то получится выбрать машину желаемого класса: от седана для города до внедорожника для путешествий по горным дорогам. Предпочитаете прокатиться с ветерком? Выберите кабриолет!
Предлагаем предварительно составить список мест, которые вы собираетесь посетить. Черногория – прекрасный и очень красивый край. Чистейшие пляжи, теплое море, роскошные замки и соборы – если сразу не разобраться с тем, какие экскурсии в Черногории обязательны, то существует вероятность забегаться и не успеть посмотреть что-нибудь очень интересное и важное.
Желаете, чтобы ваш отдых в Черногории 2017 был незабываемым? В таком случае советуем заглянуть на сайт waytomonte.com. Кроме этого, на ресурсе вы сможете найти информацию о схемах движения городского транспорта и отдыхать намного экономнее!
EdwinRax - 2017-02-08  17:45:00
 Привет автору! Давайте обсудим ссылку - [url=http://educationfulbright.blogspot.com/]программы стипендий США[/url]. Кто где учится?
SestroreckLes - 2017-02-08  17:19:41
 Продается просторная, двусторонняя 4-х комнатная квартира
в пяти минутах ходьбы от парка Дубки! Вид на воду.
В собственности с 2011 года. Возможна ипотека.
Дом построен по индивидуальному проекту и вписан в природный ландшафт. Вблизи магазины,школы, два детсада, замечательная детская библиотека, Школа Олимпийского резерва, клиника Скандинавия и городская поликлиника 5 мин на транспорте. Рядом излюбленные рестораны на побережье, базы отдыха, все для активной жизни и встреч с друзьями!
Произведена дизайнерская отделка высококачественными материалами,стены покрыты венецианской штукатуркой. Натяжные потолки со встроенным освещением. напольные покрытия: виниловая плитка, паркетная доска, импортный ламинат.
Общая площадь квартиры 102 кв. м., жилая 64 кв.м.Кухня-гостиная 31,7 кв.м.
Комнаты - 19,1+17,3+11,3 кв. м.
Две лоджии 3,3+3,2 кв.м.
Гардеробная 6,4 кв. м.
Ванная 8,1 кв.м.
Высота потолка 2,9 м.

В чистых парадных дома видеонаблюдение, цветы, домофон. Служба консьержей всегда на связи.
Хорошая управляющая компания, коммунальные платежи от 4000 р.до 8000р., в зависимости от времени года.

[url=http://chance.ru/all/estate-apartment-sale/4-k-kvartira-102-m-etazh-6-8/8716794]квартиры в сестрорецке вторичка[/url]
[url=http://sankt-peterburg.doski.ru/kurortnyi-raion/sestroretsk/prodam-4-komn-kvartira-102-kv-m-sestroretsk-msg2858610.htm]квартиры вторичное сестрорецке[/url]
[url=http://realty.dmir.ru/r153731406/]квартиры в сестрорецке новостройки[/url]
[url=http://spb.terdo.ru/item/2106962/]продаю квартиру сестрорецк[/url]
[url=https://spb.cian.ru/sale/flat/153731406/]цена квартир в сестрорецке[/url]
ASl - 2017-02-08  16:00:59
 Спецпредложение [url=http://escadom.ru/page_11.html]кухонная мойка накладная[/url] в Москве. Огромный выбор цветов, размеров и моделей моек для кухни из искусственного камня, нержавейки и керамики. Самые низкие цены на мойки из искусственного камня в регионе.
AlonzoAgita - 2017-02-08  13:18:43
 low cost Slimfast in USA, no prescription pharmacy ; buy online cheapest Slimfast in Australia, pay cod without prescription

[url=http://worldmailes.com/pharm/go.php?sid=2&search=Slimfast] [u][b]>>> Want to buy Slimfast with Discount? CLICK HERE! https://tr.im/genericmeds


Buy in Canada At Low Price Slimfast ove
ight without dr approval http://www.nature.com/protocolexchange/labgroups/406275
Purchase At Lowest Price Slimfast ove
ight without dr approval > http://www.nature.com/protocolexchange/labgroups/405993
Ordering in Canada Slimfast non prescription = http://www.nature.com/protocolexchange/labgroups/405629
Ordering in Australia Online Slimfast no script needed c.o.d. ove
ight >> http://www.nature.com/protocolexchange/labgroups/405441
Lowest Price Of Generic Slimfast cash on delivery online prescriptions / http://www.nature.com/protocolexchange/labgroups/406247
Order in USA Online Cheap Slimfast cheap c.o.d. no rx - http://www.nature.com/protocolexchange/labgroups/406283
Quality Generic Slimfast fast shipping no prescription / http://www.nature.com/protocolexchange/labgroups/405867
Best Prices in Australia for Slimfast ove
ight without prescription http://www.nature.com/protocolexchange/labgroups/405893
Ordering Online Slimfast no prescription ove
ight > http://www.nature.com/protocolexchange/labgroups/405759
Order in Australia Online Cheap Slimfast next day no prescription needed http://www.nature.com/protocolexchange/labgroups/405537
Order in GB / UK Cheap Generic Slimfast no script needed c.o.d. ove
ight @ http://www.nature.com/protocolexchange/labgroups/405437
Purchase in Canada Cheapest Slimfast next day no prescription # http://www.nature.com/protocolexchange/labgroups/405643
Order At Low Cost in USA Slimfast ove
ight no prescription # http://www.nature.com/protocolexchange/labgroups/405901
Order in GB / UK Online Cheap Slimfast ove
ight no prescription # http://www.nature.com/protocolexchange/labgroups/406007
Best Prices in Canada for Slimfast no prescription ??? http://www.nature.com/protocolexchange/labgroups/405473
Fast Delivery Slimfast no script required / http://www.nature.com/protocolexchange/labgroups/406089
Ordering Slimfast non prescription needed = http://www.nature.com/protocolexchange/labgroups/405581
Pharmacies in GB / UK That Sell Slimfast pharmacy without prescription http://www.nature.com/protocolexchange/labgroups/405665
Pharmacies That Sell Slimfast ove
ight without a prescription http://www.nature.com/protocolexchange/labgroups/406077
Cost in Australia Of Slimfast non prescription http://www.nature.com/protocolexchange/labgroups/405877
Order in USA Cheapest Slimfast no rx, fast worldwide shipping = http://www.nature.com/protocolexchange/labgroups/406207
Cheapest Prices Slimfast without rx http://www.nature.com/protocolexchange/labgroups/406053
Where Can I Order in GB / UK Slimfast without prescription ove
ight - http://www.nature.com/protocolexchange/labgroups/406181
Cheap Prices Slimfast no script needed * http://www.nature.com/protocolexchange/labgroups/405547
Buy Online Cheapest Slimfast without prescription ove
ight > http://www.nature.com/protocolexchange/labgroups/405459
HelgaJ - 2017-02-08  13:12:23
 I really enjoy reading koding.cz !
Frankhic - 2017-02-08  13:09:47
 http://devpost.com/users/provestra1man
http://www.youthreporter.eu/profil/provestraboy8/
http://www.digitalartistdaily.com/user/provestraboy2
http://www.rautemusik.fm/user/provestraboy3/#infos
http://www.provestra6man.imagekind.com

Every one loves having their women cheery!
http://goodnightjou
al.com/author/enhanceblog8/
AlonzoAgita - 2017-02-08  12:38:11
 discount prices Avodart in USA, without rx,next day delivery ; order at low price Avodart in Australia, no script needed c.o.d. ove
ight

[url=http://worldmailes.com/pharm/go.php?sid=2&search=Avodart] [u][b]>>> Want to buy Avodart with Discount? CLICK HERE! https://tr.im/trustedpharmacy


Online Avodart saturday delivery > http://www.nature.com/protocolexchange/labgroups/405653
Purchase in Canada At Lowest Price Avodart from u.s. pharmacy no prescription http://www.nature.com/protocolexchange/labgroups/406263
Purchase Avodart ove
ight no prescription )) http://www.nature.com/protocolexchange/labgroups/405847
Cheap Price Of Avodart next day delivery no rx http://www.nature.com/protocolexchange/labgroups/406275
Order Cheap in USA Avodart no prior prescription http://www.nature.com/protocolexchange/labgroups/405739
How Can I Buy in GB / UK Avodart in no prescription ! http://www.nature.com/protocolexchange/labgroups/405749
Ordering in Canada Avodart without dr prescription ! http://www.nature.com/protocolexchange/labgroups/405863
Buying Avodart without script http://www.nature.com/protocolexchange/labgroups/405665
Purchase in Australia Cheapest Avodart cash on delivery ove
ight # http://www.nature.com/protocolexchange/labgroups/405723
Where To Order in Canada Avodart ove
ight delivery without a rx http://www.nature.com/protocolexchange/labgroups/405691
Cost in GB / UK Of Avodart no script needed c.o.d. ove
ight / http://www.nature.com/protocolexchange/labgroups/405733
Buying in Australia Generic Avodart no prescription fedex / ups * http://www.nature.com/protocolexchange/labgroups/405559
Buy in United States cheapest Avodart next day delivery >> http://www.nature.com/protocolexchange/labgroups/405935
Order in USA Cheapest Avodart fast shipping no prescription // http://www.nature.com/protocolexchange/labgroups/406249
Generic Drugs Avodart tablet without script @ http://www.nature.com/protocolexchange/labgroups/405883
Order in Canada Cheap Generic Avodart with credit card no prescription ! http://www.nature.com/protocolexchange/labgroups/405605
Discount Prices in Canada for Avodart c.o.d. no prescription
SestroreckLes - 2017-02-08  12:11:33
 Продается просторная, двусторонняя 4-х комнатная квартира
в пяти минутах ходьбы от парка Дубки! Вид на воду.
В собственности с 2011 года. Возможна ипотека.
Дом построен по индивидуальному проекту и вписан в природный ландшафт. Вблизи магазины,школы, два детсада, замечательная детская библиотека, Школа Олимпийского резерва, клиника Скандинавия и городская поликлиника 5 мин на транспорте. Рядом излюбленные рестораны на побережье, базы отдыха, все для активной жизни и встреч с друзьями!
Произведена дизайнерская отделка высококачественными материалами,стены покрыты венецианской штукатуркой. Натяжные потолки со встроенным освещением. напольные покрытия: виниловая плитка, паркетная доска, импортный ламинат.
Общая площадь квартиры 102 кв. м., жилая 64 кв.м.Кухня-гостиная 31,7 кв.м.
Комнаты - 19,1+17,3+11,3 кв. м.
Две лоджии 3,3+3,2 кв.м.
Гардеробная 6,4 кв. м.
Ванная 8,1 кв.м.
Высота потолка 2,9 м.

В чистых парадных дома видеонаблюдение, цветы, домофон. Служба консьержей всегда на связи.
Хорошая управляющая компания, коммунальные платежи от 4000 р.до 8000р., в зависимости от времени года.

[url=http://zakadom.ru/catalog/view/242857]купить квартиру в сестрорецке спб[/url]
[url=https://www.bsn.ru/live/sell/19186940/]купить квартиру в сестрорецке новостройки[/url]
[url=http://sankt-peterburg.doski.ru/kurortnyi-raion/sestroretsk/prodam-4-komn-kvartira-102-kv-m-sestroretsk-msg2858610.htm]снять квартиру в сестрорецке на длительный срок[/url]
[url=http://sestroretsk.rujazi.com/real_estate/apartments/sell/classified/9448984/]купить квартиру в сестрорецке новостройки[/url]
[url=http://eip.ru/sankt-peterburg/detail/14632307]купить квартиру в сестрорецке новостройки[/url]
Addiemype - 2017-02-08  11:33:47
 Hey, thanks for the article.Really thank you! [url=http://ecy980bz.tumblr.com/]Lainson[/url]
<<[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] [94] [95] [96] [97] [98] [99] [100] [101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117] [118] [119] [120] [121] [122] [123] [124] [125] [126] [127] [128] [129] [130] [131] [132] [133] [134] [135] [136] [137] [138] [139] [140] [141] [142] [143] [144] [145] [146] [147] [148] [149] [150] [151] [152] [153] [154] [155] [156] [157] [158] [159] [160] [161] [162] [163] [164] [165] [166] [167] [168] [169] [170] [171] [172] [173] [174] [175] [176] [177] [178] [179] [180] [181] [182] [183] [184] [185] [186] [187] [188] [189] [190] [191] [192] [193] [194] [195] [196] [197] [198] [199] [200] [201] [202] [203] [204] [205] [206] [207] [208] [209] [210] [211] [212] [213] [214] [215] [216] [217] [218] [219] [220] [221] [222] [223] [224] [225] [226] [227] [228] [229] [230] [231] [232] [233] [234] [235] [236] [237] [238] [239] [240] [241] [242] [243] [244] [245] [246] [247] [248] [249] [250] [251] [252] [253] [254] [255] [256] [257] [258] [259] [260] [261] [262] [263] [264] [265] [266] [267] [268] [269] [270] [271] [272] [273] [274] [275] [276] [277] [278] [279] [280] [281] [282] [283] [284] [285] [286] [287] [288] [289] [290] [291] [292] [293] [294] [295] [296] [297] [298] [299] [300] [301] [302] [303] [304] [305] [306] [307] [308] [309] [310] [311] [312] [313] [314] [315] [316] [317] [318] [319] [320] [321] [322] [323] [324] [325] [326] [327] [328] [329] [330] [331] [332] [333] [334] [335] [336] [337] [338] [339] [340] [341] [342] [343] [344] [345] [346] [347] [348] [349] [350] [351] [352] [353] [354] [355] [356] [357] [358] [359] [360] [361] [362] [363] [364] [365] [366] [367] [368] [369] [370] [371] [372] [373] [374] [375] [376] [377] [378] [379] [380] [381] [382] [383] [384] [385] [386] [387] [388] [389] [390] [391] [392] [393] [394] [395] [396] [397] [398] [399] [400] [401] [402] [403] [404] [405] [406] [407] [408] [409] [410] [411] [412] [413] [414] [415] [416] [417] [418] [419] [420] [421] [422] [423] [424] [425] [426] [427] [428] [429] [430] [431] [432] [433] [434] [435] [436] [437] [438] [439] [440] [441] [442] [443] [444] [445] [446] [447] [448] [449] [450] [451] [452] [453] [454] [455] [456] [457] >>
*v komentářich nesmíte používat sprostá slova a odkazy!!!Děkuji za pochopeni.