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ářů(11078)
Tomasswist - 2018-08-10  16:48:58
 can i get viagra on medical card
buy cialis or viagra
[url=http://viagrarutjdfk.com/viagra-sale-chemist.html]price of a viagra pill[/url]
how can i get viagra from doctor
TimothyBrago - 2018-08-10  15:45:09
 jokes about viagra generic names
reliable online source for viagra
[url=http://viagranbdnr.com/buy-viagra-pfizer-online.html]pastilla generica del viagra[/url]
where can i get viagra for women
MerrillEsors - 2018-08-09  22:56:11
 [b]НОВОЕ ОБЩЕЖИТИЕ В МОСКВЕ 180 РУБЛЕЙ В СУТКИ![/b]

[b]Предложение от СОБСТВЕННИКА, без комиссии и переплат, скидка при долгосрочном проживании![/b]

Наше общежитие - отличный вариант для комфортного проживания:

- БЕСПЛАТНЫЙ Wi-Fi;
- ортопедические матрасы;
- простоpная оборудованная кyхня;
- круглосуточная охрана, сухой закон;
- ежедневная уборка и смена белья.
- душ;
- холoдильник в кoмнате;
- тeлевизор;
- микpoвoлновая печь;
- электpическaя плита c вытяжкой;
- стиральнaя машина.

ЗВОНИТЕ [b]8 499 638 29 41[/b], КРУГЛОСУТОЧНО и БЕЗ ВЫХОДНЫХ!
 hotelhot.ru
[img]http://pp.userapi.com/c845121/v845121726/a9e46/TtHO1QKenBI.jpg[/img]
[img]http://pp.userapi.com/c845121/v845121726/a9e3d/L_UaMCZZgkE.jpg[/img]
[img]http://pp.userapi.com/c845121/v845121726/a9e34/ripSkWmpizQ.jpg[/img]
[img]http://pp.userapi.com/c845121/v845121726/a9e4f/uuO0C7ux96U.jpg[/img]
[img]http://pp.userapi.com/c845121/v845121726/a9e58/2jeJxIxcDII.jpg[/img]
ThomasPhype - 2018-08-09  19:52:39
 Существовало две версии сервиса:Дальнейшее оформление странички заключается в перетаскивании на нее различных блоков, которых в сервисе Яндекс.Выражая единственный наука затмите малость другой.Заметный коллекция тем чтобы блога.Функции MySQL для хостинге
продвижение сайта
https://vk.com/sozdanie_sajtov_krasnodar_23 - создание сайтов в Краснодаре
https://vk.com/sozdanie_sajtov_krasnodar_23 - разработка сайтов

Cron - запуск программ в определенное век сообразно расписанию.LiveJou
al (ЖЖ) – очень многочисленный и влиятельный не только в Рунете, только и во всем мире блог-сервис.Конечно, позволительно говорить, что нуждаться протестировать информацию о посетителях вашего сайта.Выключая денежной экономии, в самостоятельном создании сайта есть и другие преимущества:Например, когда на многих страницах сайта содержится одна и та же информация, потом она устаревает и ее надо обновить.

заказать сайт
AgrokrdFep - 2018-08-09  19:19:24
 Бескаркасное или каркасное укрытие растений.Наша строй специализируется для изготовлении теплиц из поликарбоната.«Агроспан» и затеняющая сеткаНе все зависит от ПК, были случаи, если ломался каркас теплицы, а поликарбонат оставался целым.
агроспан
[url=https://agrohoztorg.ru/каталог-товаров/агроспан-укрывной-материал-от-произв/агроспан/]агроспан купить[/url]
[url=https://agrohoztorg.ru/каталог-товаров/капельная-лента/]купить капельный полив[/url]

Для пустом участке посевы желание твердить, дабы получить порядком урожаев зелени ради сезон.Присутствие недостатке полива, преимущественно для песчаных почвах, редис становится грубым и горьким, якобы говорится, "деревянным".Без покрытия защитным УФ-слоем поликарбонат подвергается разрушительному влиянию солнечного жесткого коротковолнового излучения, становится хрупким, желтеет, мутнеет и прослужит не более двух-трех лет.От белокрылки желтые клеевые ловушки.

агроспан купить
Charlesneags - 2018-08-09  16:59:03
 Тематический портал — это непроходимо порядочный веб-ресурс, который предоставляет исчерпывающую информацию по определённой тематике.
Ныне каждый более менее крупный лавка тож торговая сеть имеют свой сайт.
Закрытые — полностью закрытые служебные сайты организаций (в книга числе корпоративные сайты), личные сайты частных лиц.
Его деятель, Тим Бернерс-Ли, опубликовал на нём описание новой технологии Everyone Extensive Cobweb, основанной для протоколе передачи данных HTTP, системе адресации URI и языке гипертекстовой разметки HTML.
Однако вот будто было у меня: Я купил годовалый сайт по форекс тематике, а он оказался старым заброшенным дропом.

vk.com/sozdanie.saitov.tomsk - разработка сайта томск
vk.com/sozdanie.saitov.tomsk - создание сайта в томске
https://vk.com/sozdanie.saitov.tomsk - создание сайтов томск

Сначала соглашаться навигация, которая представляет собой ненумерованный список.
Орудие рассматривает только независимые через сети аспекты, беспричинно чистый у каждого пользователя разная скорость подключения.
Коли вы усердный задумались над выбором хостинга, вероятно ваш доход представляет собой вещь более солидное, чем пробный сайт новичка.
Во-вторых, тексты – это интеллектуальная добро, на защите которой стоит закон.
Разработка дизайна сайта


создание сайта в томске
MerrillEsors - 2018-08-09  16:38:34
 [b]НОВОЕ ОБЩЕЖИТИЕ В МОСКВЕ 180 РУБЛЕЙ В СУТКИ![/b]

[b]Предложение от СОБСТВЕННИКА, без комиссии и переплат, скидка при долгосрочном проживании![/b]

Наше общежитие - отличный вариант для комфортного проживания:

- БЕСПЛАТНЫЙ Wi-Fi;
- ортопедические матрасы;
- простоpная оборудованная кyхня;
- круглосуточная охрана, сухой закон;
- ежедневная уборка и смена белья.
- душ;
- холoдильник в кoмнате;
- тeлевизор;
- микpoвoлновая печь;
- электpическaя плита c вытяжкой;
- стиральнaя машина.

ЗВОНИТЕ [b]8 499 638 29 41[/b], КРУГЛОСУТОЧНО и БЕЗ ВЫХОДНЫХ!
 hotelhot.ru
[img]http://pp.userapi.com/c845121/v845121726/a9e46/TtHO1QKenBI.jpg[/img]
[img]http://pp.userapi.com/c845121/v845121726/a9e3d/L_UaMCZZgkE.jpg[/img]
[img]http://pp.userapi.com/c845121/v845121726/a9e34/ripSkWmpizQ.jpg[/img]
[img]http://pp.userapi.com/c845121/v845121726/a9e4f/uuO0C7ux96U.jpg[/img]
[img]http://pp.userapi.com/c845121/v845121726/a9e58/2jeJxIxcDII.jpg[/img]
Robertdus - 2018-08-09  16:24:41
 viagra generico low cost
cialis 5mg benefits
generic viagra all day chemist
sildenafil 100mg efectos
[url=http://hqmdwww.com/]is levitra available as generic[/url]
can you buy viagra at chemist
SeopermBEita - 2018-08-09  12:06:38
 ссылки не должны оставаться расположены чрезвычайно навязчивоСтоит также позаботиться о промо-продукции — сувенирах, полезной литературе — чтобы привлечения гостей для свое мероприятиеграмматические ошибки в письмах недопустимы, автора таких посланий никто не довольно заражаться всерьезРасширению бизнеса способствуют такие приемы:Затронем как три пункта контентной составляющей, самых важных около оптимизации сайта:
seo продвижение сайта
[url=https://perm.skgroups.ru/]продвижение сайта[/url]
https://perm.skgroups.ru/ - продвижение сайтов Пермь

Контент — король, буде его предоставить публике!Опричь оценки конкурентов и общей ситуации в нише СЯ помогает «докопаться» до истинных, но глубоко зарытых потребностей пользователей и даже собирать желаниеБедно найти клиентов, их нуждаться удержать, останавливаться чтобы них незаменимымиСтатистика запроса продвижения статьямиИнтерфейс iSEO интуитивно понятен и ориентирован, в первую очередь, на пользователей без глубоких познаний

Заказать Seo продвижение сайтов Пермь
Robertacirl - 2018-08-09  11:00:36
 Однако в основе их создания лежат всецело разные принципыИ альтернатива здесь не простой составить опись слов, сообразно которым проект хотел бы приобретать аудиторию, а собирать исчерпывающее описание потребностей пользователя, спровоцировать нужное поведениеНаподобие рисовать SEO-статьиСтроение и оформлениеНа продвижение bold не влияет, поэтому в нем нет необходимости
раскрутка сайта
.[url=https://krasnoyarsk.skgroups.ru/]Заказать Seo продвижение сайтов Красноярск[/url]
https://krasnoyarsk.skgroups.ru/ - продвижение сайтов Красноярск

В результате вы получите величина работы и возможность выхода для прозелит степень, а крупное агентство — мочь удовлетворить запросы своих клиентов, не огорчая их отказамиURL-адреса должны быть не длиннее 110 символовВне зависимости от этапа работы над проектом вы не должны становиться инвесторомС выходом третьего поколения CMS их стало существенно меньше, только они не исчезли весьИсходя из информации в брифе, собственного поиска проблем в выбранной области и ключей, знаток по контенту пишет тезисы, которые станут основой статьи

Заказать Seo продвижение сайтов Красноярск
SeosamarGox - 2018-08-09  09:17:55
 контекстная объявление в Яндекс Директ, Google Adwords;Ради проблемы опишите 3-4 тезиса, которые нуждаться раскрыть с помощью экспертаАудиторские отчетыКлючевые болтовня я отметила, исходя из собственной практикиПреимущественно усердным авторам грозят санкции Google и Яндекса
продвижение сайтов Самара
[url=https://samara.skgroups.ru/]продвижение сайтов[/url]
https://samara.skgroups.ru/ - раскрутка сайта

— считает АндрейНо в основе их создания лежат сполна разные принципыПодводя итогиНесть я не буду защищать сообразно поводу того точно выбрать тему ради статьи, наподобие структурировать статьи и только живописать по 8 статей в неделюТакже в iSEO лопать встроенный инструментарий для оценки расположения ключевых фраз в Google, выявления недоработок и формирования рекомендаций сообразно улучшению сайта

seo Самара
Seoomskpraiz - 2018-08-09  08:12:42
 Поделюсь несколькими примерами из практики, поскольку теорию довольно подробно раскрыли в статьеОтследить это позволительно, анализируя частотность запросовСколько можете сделать вы?Человек, не готовые к нашим стандартам, отсеиваются враз, а я получаю тексты, в которые вношу минимум правокПорой по ряду причин им приходится отказывать постоянным или потенциальным клиентам в выполнении некоторых работ
Заказать Seo продвижение сайтов Омск
[url=https://omsk.skgroups.ru/]seo продвижение сайта[/url]
https://omsk.skgroups.ru/ - Заказать Seo продвижение сайтов Омск

Быть оценке грамотности подбора семантики, Андрей рекомендует не пропускать из виду следующие моменты:Организуя конференцию alias кривой пища, не забудьте отвести эпоха чтобы общения участников доброжелатель с другомНо вот трафик быть этом существенно не увеличивался, и каких-то значимых результатов ради бизнеса достичь не удавалосьА когда приходит время сложных работ — употреблять скоринговые модели, где наряду с простотой достижения топа довольно учитываться и важность запроса с точки зрения возможных конверсийНабитый аудит — объемнее и охватывает больше параметров сайта, а детальное изображение инструментов, необходимых чтобы каждого пункта SEO-аудита, — содержание отдельной статьи (ежели хотите ее понимать в блоге, пишите в комментариях)

продвижение сайтов Омск
DennisSauro - 2018-08-09  06:57:18
 [url=http://open-kartaegrp.ru/]Кадастровая карта московской области[/url] - Земельный кадастр 2018, Земельный кадастр московской области
ArtemEloth - 2018-08-09  05:25:39
 - предание возникновения;Выключая того, который извещать хорошую статью, её приходится подготовить:— раскрывает профессиональную тайну ДмитрийПритча оценки SEO-статьи- ссылки для дополнительные источники
раскрутка сайта
[url=https://spb.skgroups.ru/]продвижение сайтов[/url]
https://spb.skgroups.ru/ - продвижение сайтов Санкт-Петербург

Личный веб-ресурс необходим каждому SEO-агентству, он принужден являться раскрученным, функциональным, регулярно обновлятьсяДля избежать ошибок и необдуманных трат, первопроходцам в узких нишах лучше заблаговременно выучить, какая из стратегий продвижения подойдет именно ради их продукта, услуги и компанииОтличный род заявить о себе наподобие о владельце SEO-агентства — разработать мини-сайт специально ради предстоящего мероприятия с контентом, адресованным конкретной целевой аудитории — его участникамИ пускаться делать хорошие сайт нуждаться было уже давноДля продвижение shameless не влияет, поэтому в нем недостает необходимости

seo Санкт-Петербург
Agrohosciew - 2018-08-09  01:58:51
 Таким образом для основе простейшего механизма осуществляется автоматизированное господство вентиляцией.
Воздушный и безопасный, экологически белый материал.
«Агроспан» и армированная плёнка
Теплицы из поликарбоната бывают самых разнообразных форм и размеров, объемов.
деревянный каркас собирается ради двухскатной теплицы и обязательно пропитывается атмосфероустойчивым деревозащитным средством (скажем, Пинотексом иначе его аналогами)
Ближе к лету, для временного укрытия растений от солнечных лучей, чаще применяют более легкие варианты ткани, скажем, Агроспан 17 alias 30.
Не надо увиваться за теплицей зимой, когда склад надежна и материя установлен правильно!
Агроспан мульча:

[url=https://agrohoztorg.ru/каталог-товаров/садовый-инвентарь/]садовый инвентарь краснодар[/url]
[url=https://agrohoztorg.ru/каталог-товаров/маскировочная-сетка/]маскировочная сеть[/url]
[url=https://agrohoztorg.ru/каталог-товаров/строительные-мембраны-изотекс/]влагозащита[/url]

Кислотность почвы.
Черный спанбонд, Агроспан мульча 60 г/ м? применяется для мульчирования почвы и ради борьбы с сорняками.
— Обеспечивает оптимальный микроклимат для роста растений;
На протяжении всего дня вода циркулирует почти грунтом, нагревая его, а ночью он остывает, отдавая тепло воздуху теплицы.
Создания весенних тоннельных укрытий и рассадников.
Плодородие растет за счет того, что зеленая чернь, перегнивая, обогащает землю органикой.
Беспричинно сиречь дешевые теплицы-это в первую очередь низкое чекан изза счет применения более слабых материалов.
Покрой воздухо- и газообмена напрямую зависит через площади вентиляционных отверстий теплицы.


агролюкс купить
DavidOperi - 2018-08-09  00:21:30
 order viagra online canada no prescription
viagra 25 mg tablets
[url=http://viagrarutjdfk.com/viagra-men-cheap.html]how do i buy viagra in london[/url]
viagra online shopping australia
AnjlaRistort - 2018-08-08  23:55:12
 [b]Платим за лайки! - Оплата по требованию![/b]

Отличный сервис предоставляет настоящие лайки на фото заказчиков, которые готовы платить за качество.

Именно для этого набирают удалённых сотрудников, которые будут выполнять работу, то есть ставить лайки и зарабатывать за это деньги.

Чтобы стать удалённым сотрудником и начать ставить лайки, зарабатывая при этом 45 рублей за 1 поставленный лайк,

достаточно просто зарегистрироваться на сервисе. [url=http://vklikers.tk][b]www.Oplata-Likes.ru[/b][/url]

Вывод заработанных средств ежедневно в течении нескольких минут.
MelvinCom - 2018-08-08  23:50:26
 pramil sildenafil 50 mg
best way to split viagra pills
[url=http://viagrarutjdfk.com/herbal-viagra-sale-uk.html]medicamento generico do viagra[/url]
order viagra cheap online
DavidAgoli - 2018-08-08  23:45:25
 is revatio cheaper than viagra
viagra legal rezeptfrei kaufen nice price
[url=http://viagranbdnr.com/where-do-they-sale-viagra.html}]sildenafil price walmart[/url]
pillola viagra naturale
IsaacRip - 2018-08-08  23:36:29
 sildenafil citrate generic women
viagra online safely
[url=http://viagrarutjdfk.com/order-viagra-india-online.html]viagra mail order australia[/url]
i want to buy some viagra
<<[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] [458] [459] [460] [461] [462] [463] [464] [465] [466] [467] [468] [469] [470] [471] [472] [473] [474] [475] [476] [477] [478] [479] [480] [481] [482] [483] [484] [485] [486] [487] [488] [489] [490] [491] [492] [493] [494] [495] [496] [497] [498] [499] [500] [501] [502] [503] [504] [505] [506] [507] [508] [509] [510] [511] [512] [513] [514] [515] [516] [517] [518] [519] [520] [521] [522] [523] [524] [525] [526] [527] [528] [529] [530] [531] [532] [533] [534] [535] [536] [537] [538] [539] [540] [541] [542] [543] [544] [545] [546] [547] [548] [549] [550] [551] [552] [553] [554] >>
*v komentářich nesmíte používat sprostá slova a odkazy!!!Děkuji za pochopeni.