» Главная
eXcode.ru » Статьи » PHP » Трюки
» Новости
» Опросы
» Файлы
» Журнал



Пользователей: 0
Гостей: 13





TDD: Рефакторинг приложения




Рефакторинг приложения

Отделяем бизнес логику от презентационной

Пожалуй, это самый важный первый шаг, который стоит сделать. Для этого несколько модифицируем index.php, выделив из него разметку в отдельный файл /templates/feedback.html.

index.php

<?php
ob_start();
 
include_once('db.php');
 
$conn = mysql_connect($db_host, $db_user, $db_password);
 
if($conn === FALSE){
    die('db connect error: ' . mysql_error());
}
 
if(!mysql_select_db($db_name, $conn)){
    die('can not use db: ' . mysql_error());
}
 
if(isset($_POST['submit'])) {
    $name = mysql_escape_string($_POST['name']);
    $email = mysql_escape_string($_POST['email']);
    $message = mysql_escape_string($_POST['message']);
    $time = time();
 
    $sql = "INSERT INTO feedback (name, email, message, time) VALUES ('$name', '$email', '$message', '$time')";
 
    $result = mysql_query($sql, $conn);
    if(!$result){
        die('invalid query: ' . mysql_error());
    }
}
 
$limit = 3;
$offset = isset($_GET['offset']) ? $_GET['offset'] : 0;
 
$sql = "SELECT * FROM feedback ORDER BY time DESC LIMIT " . ($offset * $limit) . ", {$limit}";
$fetch_result = mysql_query($sql, $conn);
if(!$fetch_result){
    die('invalid query: ' . mysql_error());
}
 
$sql = "SELECT COUNT(*) as counter FROM feedback";
$count_result = mysql_query($sql, $conn);
if(!$count_result){
    die('invalid query: ' . mysql_error());
}
$row = mysql_fetch_assoc($count_result);
$total = (int)$row['counter'];
 
include_once('templates/feedback.html');
 
ob_end_flush();
?>

templates/feedback.html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<link rel=stylesheet type='text/css' href='styles/main.css'>
<script language="JavaScript" type="text/javascript" src="js/form.js"></script>
</head>
<body>
<table width="100%" style="height:100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="10%" style="background-color:#7F1A22">
</td>
<td width="90%" style="padding:5px 10px 5px 10px" valign="top">
<h1>Обратная связь</h1>
<p>
  Если у вас есть пожелания или вопросы к сотрудникам нашей компании,<br>
  пожалуйста, заполните поля формы.<br>
</p>
<form action="index.php" method="post" onsubmit="return submit_form(this);">
<table>
  <tr>
    <td align="right">
      Ваше имя:
    </td>
    <td>
      <input name="name" value="" type="text">
    </td>
 </tr>
  <tr>
    <td align="right">
      Email:
    </td>
    <td>
      <input name="email" value="" type="text">
    </td>
 </tr>
    <tr>
     <td align="right">
       Текст вопроса:
     </td>
     <td>
       <textarea name="message" cols="50" rows="4"></textarea>
     </td>
    </tr>
    <tr>
    <td>
    </td>
    <td>
        <input value="Отправить" name="submit" type="submit">
    </td>
    </tr>
</table>
</form>
<?php if($offset > 0) :?><b><a href="?offset=<?=($offset-1)?>">&lt;</a></b><?php endif; ?>
<?php if($total > 0) :?><?=($offset*$limit)+1?> - <?=(($offset+1)*$limit > $total)? $total : ($offset+1)*$limit ?><?php endif; ?>
<?php if(($offset+1)*$limit < $total) :?><b><a href="?offset=<?=($offset+1)?>">&gt;</a></b><?php endif; ?>
<?php
while ($row = mysql_fetch_assoc($fetch_result)) {
?>
<hr/>
<b>Автор:</b> <a href="mailto:<?=htmlspecialchars($row['email']);?>"><?=htmlspecialchars($row['name']);?></a><br/>
<b>Сообщение:</b> <?=htmlspecialchars($row['message']);?><br/>
<b>Время:</b> <?=strftime("%m/%d/%y %H:%M:%S", $row['time'])?><br/>
<?php } ?>
</td>
</tr>
</table>
</body>
</html>

До идела еще далеко, но читается уже намного лучше. Удостоверившись в том, что все функциональные тесты срабатывают, продолжаем дальше.

Используем WACT

WACT предоставляет мощные средства для отделения презентационной и бизнес логики. Помимо гибкой шаблонной системы в WACT присутствуют также инструменты для абстрагирования работы с БД. Т.к. эти инструменты очень гибко интегрируюся с шаблонной системой, имеет смысл остановить на них выбор.

WACT требует наличие config.ini файла, в котором описываются глобальные конфигурационные настройки приложения. Перенесем данные из db.php в config.ini.

[templates]
forcecompile = TRUE

[database]
driver = mysql
mysql.database = "feedback"
mysql.user = "root"
mysql.password = "test"
mysql.host = "localhost" 

Создадим также файл tests/config.ini, в котором мы будем хранить настройки для тестов.

[templates]
forcecompile = TRUE

[database]
driver = mysql
mysql.database = "feedback-web-tests"
mysql.user = "root"
mysql.password = "test"
mysql.host = "localhost" 

Заставим WACT также пользоваться этим конфигурационным файлом при вызове из тестов. Для этого добавим следующую строку в /tests/setup.php:

<?php
define('WACT_CONFIG_DIRECTORY', dirname(__FILE__) . '/'); 
?>

Нам необходимо заменять config.ini на /tests/config.ini на время выполнения тестов, как мы это делали с db.php, для этого несколько изменим фикстуру:

<?php
class AcceptanceTestOfFeedbackProject extends WebTestCase {
    function setUp() {
        DBC :: execute('DELETE FROM feedback');
        $this->_switchToWebTestingConfig();
    }
 
    function tearDown() {
        $this->_switchToProductionConfig();
    } 
 
    function _switchToWebTestingConfig() {
        $project_dir = dirname(__FILE__) . '/../';
        $tests_dir = dirname(__FILE__) . '/';
 
        if(!file_exists($project_dir . 'config.ini~')) {
            rename($project_dir . 'config.ini', $project_dir . 'config.ini~');
        }
        copy($tests_dir . 'config.ini', $project_dir . 'config.ini');
    }
 
    function _switchToProductionConfig() {
        $project_dir = dirname(__FILE__) . '/../';
        if(file_exists($project_dir . 'config.ini~')) {
            unlink($project_dir . 'config.ini');
            rename($project_dir . 'config.ini~', $project_dir . 'config.ini');
        }
    } 
    [...]
?>

Имеет смысл также пользоваться в тесте средствами WACT для работы с БД. Как можно видеть, вызов DBC :: execute('DELETE FROM feedback') - пришел на смену жесткой привязке к mysql_ функциям.

Все готово к тому, чтобы полностью отделить бизнес логику от презентационной. Начинаем с index.php:

<?php
ob_start();
 
require_once(dirname(__FILE__) . '/external/wact/framework/common.inc.php');
require_once(WACT_ROOT . '/db/db.inc.php');
require_once(WACT_ROOT . '/template/template.inc.php');
 
function &getList(&$pager) {
    return DBC::NewPagedRecordSet('SELECT * FROM feedback ORDER BY time DESC', $pager);
}
 
function insertFeedback($arr) {
    $dataspace = new DataSpace();
    $dataspace->import($arr);
    $record =& DBC::NewRecord($dataspace);
    return $record->insert('feedback', array('name', 'email', 'message', 'time'));
}
 
if(isset($_POST['submit'])) {
    insertFeedback(array('name' => $_POST['name'],
                 'email' => $_POST['email'],
                 'message' => $_POST['message'],
                 'time' => time()));
}
 
$page = new Template('/feedback.html');
$pager =& $page->getChild('pager');
 
$feedback =& $page->findChild('feedback');
$feedback->registerDataSet(getList($pager));
 
$page->display();
 
ob_end_flush();
?>

WACT ищет по-умолчанию шаблоны в директории /templates/source, модифицируем и перенесем feedback.html.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<link rel=stylesheet type='text/css' href='styles/main.css'>
<script language="JavaScript" type="text/javascript" src="js/form.js"></script>
</head>
<body>
<table width="100%" style="height:100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="10%" style="background-color:#7F1A22">
</td>
<td width="90%" style="padding:5px 10px 5px 10px" valign="top">
<h1>Обратная связь</h1>
<p>
  Если у вас есть пожелания или вопросы к сотрудникам нашей компании,<br>
  пожалуйста, заполните поля формы.<br>
</p>
<form action="index.php" method="post" onsubmit="return submit_form(this);">
<table>
  <tr>
    <td align="right">
      Ваше имя:
    </td>
    <td>
      <input name="name" value="" type="text">
    </td>
 </tr>
  <tr>
    <td align="right">
      Email:
    </td>
    <td>
      <input name="email" value="" type="text">
    </td>
 </tr>
    <tr>
     <td align="right">
       Текст вопроса:
     </td>
     <td>
       <textarea name="message" cols="50" rows="4"></textarea>
     </td>
    </tr>
    <tr>
    <td>
    </td>
    <td>
        <input value="Отправить" name="submit" type="submit">
    </td>
    </tr>
</table>
</form>
<list:LIST id="feedback">
<page:navigator id="pager" items="3">
Страница: {$PageNumber} из {$TotalPages}
    <page:first>&lt;&lt;</page:first> <page:prev>&lt;</page:prev>
    <page:list>
        <page:number>
        <page:elipses>...</page:elipses>
        <page:separator> </page:separator>
    </page:list>
    <page:next>&gt;</page:next> <page:last>&gt;&gt;</page:last>
</page:navigator>
<list:ITEM>
<hr>
<b>Автор:</b> <a href="mailto:{$email}">{$name}</a><br>
<b>Сообщение:</b> {$message}<br>
<b>Время:</b> {$time|date:"H:i:s m/d/Y"}<br>
</list:ITEM>
</list:LIST>
</td>
</tr>
</table>
</body>
</html>

WACT предоставляет набор компонентов, позволяющих заметно облегчить жизнь верстальщика. При помощи <list:LIST> компонента организуется итерация по сообщениям в шаблоне. <page:navigator> компонент берет полностью на себя всю рутину по организации и выводу пейджера. При этом содержимое index.php и feedback.html заметно упростилось и приобрело более логический вид.

Конечно, мы сделали очень много измненений, но выполняющиеся функциональные тесты позволили нам неустанно держать руку на пульсе разработки.

Далее - Шаг третий - внедряем паттерн ActiveRecord.

К началу статьи





Добавил: PIXELДата публикации: 2008-03-05 08:58:31
Рейтинг статьи:4.00 [Голосов 1]Кол-во просмотров: 19952

Комментарии читателей

Всего комментариев: 50

2017-03-17 11:38:27
Oknanova1minly
Уровень обслуживания и цены вас приятно удивят. <a href=http://okna-nova.com/index.php/uslugi/otdelka-balkonov-i-lodzhij/sushilki-dlya-belya>подвесная сушилка для белья на балкон пермь</a> стоимость дополнительных аксессуаров невысока и продавец делает большую наценку при отдельном заказе. Можно даже договориться со своим соседом, и заключить 1-н договор на замену окон сразу в 2-х квартирах. Таким образом, опасные микроорганизмы гибнут на антибактериальном стекле намного быстрее, чем в естественных условиях, и не успевают размножиться. <a href=http://okna-nova.com/index.php/uslugi/otdelka-balkonov-i-lodzhij/uteplenie-balkonov-i-lodzhij>утепление лолжий пермь</a> Но, к сожалению, такой способ спасает лишь на короткое время, поскольку окна очень быстро загрязняются вновь. Пластиковые окна с нанесенными ионами серебра невосприимчивы к высокой и низкой температурам, ультрафиолетовым лучам. <a href=http://okna-nova.com/index.php/uslugi/osteklenie-balkonov-i-lodzhij/ustrojstvo-kryshi-na-balkone>установка крыши на балконе последнего этажа пермь</a> Зачастую подобные конструкции имеют высоту от потолка до пола. Несмотря на некоторую забюррократизированность и определенные сложности в получении документации, обратить внимание на то, что согласование перепланировок необходимо именно владельцу квартиры, так как позволит в дальнейшем избежать ненужных проверок, штрафов, а самое главное – снизит риск создания опасных аварий инженерных систем. <a href=http://okna-nova.com/index.php/uslugi/otdelka-balkonov-i-lodzhij/vstroennye-shkafy>встроенные шкафы пермь</a> Все дело в большом количестве противоречий, содержащихся в законах и подзаконных актах, регулирующих деятельность по остеклению лоджии или балкона. Этот металл издавна славится своей способностью бороться с вредными микроорганизмами, например, обеззаразить питьевую воду.

2017-03-17 09:49:26
Dvrei85minly
Например, у перегородок 1 типа критическая огнеупорность соответствует EI 45. Предусматривает соединение листового стекла при содействии специального УФ-клея. Сегодня многие магазины задействуют шоу-рум в розничной торговле, превратив его в нестандартный способ подачи своей продукции потенциальному покупателю. <a href=http://vhodniedvery.vs-line.ru>каталог дверей спб</a> Если вы решили купить китайскую входную дверь, то к этому стоит отнестись с особой осторожностью, так как в большинстве случаев качество таких дверей оставляет желать лучшего. Технологический процесс включается в себя выкладку на цельном полотне разноцветных элементов, которые впоследствии подвергаются воздействию высоких температур, пока не образуется единый пласт. Он совершенно не похож на обычный бутик или магазин. <a href=http://vhodniedvery.vs-line.ru>входные двери каталог спб</a> Для установки огнезащитных элементов, как правило, выбирают холлы, коридоры, также конструкции нередко устанавливают на лестничных пролетах различных коммерческих помещений. Предположим, взломщик открыл механические замки и тут незадача – дверь заперта. <a href=http://vhodniedvery.vs-line.ru>входные двери каталог санкт петербург</a> В том числе, узорчатые, витражные, с рисунком, однотонные и цветные виды. <a href=http://vhodniedvery.vs-line.ru>входные двери санкт петербург</a> Кроме того, в результате дверной проем может потерять эстетичный внешний вид.

2017-03-16 13:57:06
Oknanova1minly
Форма рам окна также очень важна. <a href=http://okna-nova.com/index.php/uslugi/otdelka-balkonov-i-lodzhij/sushilki-dlya-belya>подвесная сушилка для белья пермь</a> их тщательное мытье. В заключение нужно сказать, что утепление пластиковых окон – это устранение их поломки и не более. Что же касается общестроительных однокамерных и двухкамерных стеклопакетов, то они так же должны отвечать определенным минимальным требованиям. <a href=http://okna-nova.com/index.php/uslugi/osteklenie-balkonov-i-lodzhij/osteklenie-iz-pvkh>остекление балконов пермь</a> Суть процедуры состоит во внедрении в поверхность стекла тонкого слоя заряженных ионов серебра. Эта организация занимается контролем сохранности фасадов и выдает разрешения на их изменения. <a href=http://okna-nova.com/index.php/uslugi/otdelka-balkonov-i-lodzhij/sushilki-dlya-belya>сушилки для белья пермь</a> Именно здесь вы сможете получить информацию о том, являются ли балконы и лоджии в вашем доме предназначенными для эвакуации при пожаре или нет. Где используются окна с антибактериальным покрытием? Пластиковые окна с антибактериальным покрытием пользуются большим спросом и повышенным вниманием, и это абсолютно естественно. <a href=http://okna-nova.com/index.php/uslugi/otdelka-balkonov-i-lodzhij/vnutrennyaya-otdelka-balkonov-i-lodzhij>отделка балконов пермь</a> Можно сделать вывод о том, что стекло, покрытое серебром, полностью выполняет свои защитные функции, без ухудшения светопроницаемости. Фурнитура.

2017-03-16 10:13:59
Dvrei85minly
Выбирайте входные двери Leganza, и ваш дом будет под надежной защитой! Сейчас любая межкомнатная дверь является полноценной частью интерьера, несет свою смысловую и декоративную нагрузку. Здесь речь пойдёт о цилиндровых замках. Все они имеют несколько классов защиты (5.14, СНиП 21.01.97). <a href=http://vhodniedvery.vs-line.ru>входные двери санкт петербург</a> Однако в классическом понимании это все-таки торгово-выставочное пространство, в котором владельцы модных домов могут посмотреть новинки от дизайнеров и сделать заказ. Во всех городах, имеющих статус столиц мировой моды (Милане, Париже, Нью-Йорке и др.), пользуются популярностью временные шоу-румы. Нельзя назвать такой метод разумным с точки зрения криминального воздействия. <a href=http://vhodniedvery.vs-line.ru>входные двери каталог санкт петербург</a> Технологический процесс включается в себя выкладку на цельном полотне разноцветных элементов, которые впоследствии подвергаются воздействию высоких температур, пока не образуется единый пласт. Оно применяется при создании дверных полотен с изогнутыми вставками, чаще всего это входные группы или индивидуальные проекты заказчиков. <a href=http://vhodniedvery.vs-line.ru>заказать входную дверь спб</a> Технологический процесс включается в себя выкладку на цельном полотне разноцветных элементов, которые впоследствии подвергаются воздействию высоких температур, пока не образуется единый пласт. <a href=http://vhodniedvery.vs-line.ru>входные двери каталог спб</a> В том случае, когда дверной проем меньше двери, последнюю можно подрезать.

2017-03-15 16:47:10
Oknanova1minly
Фурнитура. <a href=http://okna-nova.com/index.php/uslugi/remont-okon-i-dverej/remont-okon-i-dverej>ремонт пластиковых окон пермь</a> ГОСТом допускается отклонение в толщине стеклопакета на 1 мм в большую или меньшую сторону. Чтобы створка прижималась к раме плотнее, нужно вращать эксцентрик по часовой стрелке. Как уже говорилось выше, утеплять пластиковые окна нужно только в случае их неисправности. <a href=http://okna-nova.com/index.php/uslugi/remont-okon-i-dverej/remont-okon-i-dverej>ремонт окон пвх пермь</a> Неплохо сэкономить можно, заказав окна без монтажа, но только при том условии, что у Вас есть бригада, которая установит окна дешевле, а еще большая экономия будет, если Вы самостоятельно сможете установить окна. В целом же, окна пропускают холод в помещения лишь в случае поломок, которые можно самостоятельно устранить, утеплив тем самым окна ПВХ. <a href=http://okna-nova.com/index.php/uslugi/otdelka-balkonov-i-lodzhij/uteplenie-balkonov-i-lodzhij>утепление лолжий пермь</a> Возможность реставрации и перекраски ПВХ окон без демонтажа ,прямо на дому у клиента: Обычно раз в 10 лет люди, имеющие свой дом или катедж, обновляют цвет его фасада.За это время ыкусы у людей меняются и хочется изменить цвет координально, но что делать с пластиковыми окнами. В тоже время, спустя год в Москве было подписано «Положение о едином порядке предпроектной и проектной подготовки строительства в городе Москве». <a href=http://okna-nova.com/index.php/uslugi/pritochnye-ventilyatsionnye-klapana/pritochnye-ventilyatsionnye-klapana>бриточные вентиляционные клапана пермь</a> Сотрудники центра проводят регулярные проверки на соответствие проекта Строительным нормам и правилам (СНиПам). Если данный процесс вам не под силу, то всегда можно обратиться к специалистам.

2017-03-15 07:07:58
Dvrei85minly
Можно совершенно свободно менять разные модели цилиндров, от простых ,на время ремонта, до самых совершенных и дорогих, в одно и то же тело замка. Подгонка дверного полотна под размеры проема. Так, без шоу-рума уже немыслимы нью-йоркский Манхэттен или Монтенаполеоне в Милане. <a href=http://vhodniedvery.vs-line.ru>входные двери санкт петербург</a> Довольно часто используется для производства витражей. Попытки получить доступ к отверстию всевозможными предметами полностью отсутствует. Входная дверь для загородного дома должна выполнять сразу несколько важных функций: обеспечивать надежную защиту от несанкционированного проникновения; сохранять тепло внутри дома; украшать фасад. <a href=http://vhodniedvery.vs-line.ru>заказать входную дверь санкт петербург</a> Для дверных проемов различных габаритов представлено множество вариантов изделий — витражные, двустворчатые двери, установка антресольных вставок. Современные технологии обработки стекла позволяют создавать стеклопакеты, которые по прочности не уступают металлу. <a href=http://vhodniedvery.vs-line.ru>входные двери каталог спб</a> Кодовая накладка CisaКодовая накладка Cisa – полностью закрывает отверстие к сувальдному запорному механизму металлической шторкой. <a href=http://vhodniedvery.vs-line.ru>заказать входную дверь спб</a> Существуют принципы, которые ни в коем случае нельзя игнорировать, оформляя шоу-рум: Пространство должно быть организовано в соответствии с планировкой с помощью стеклянных и радиусных перегородок.

2017-03-14 09:11:20
Oknanova1minly
Как уже говорилось выше, утеплять пластиковые окна нужно только в случае их неисправности. <a href=http://okna-nova.com/index.php/uslugi/osteklenie-balkonov-i-lodzhij/osteklenie-iz-pvkh>остекление балконов пермь</a> Но не стоит покупаться на некоторые маркетинговые акции, такие как – доставка в подарок, или москитная сетка в подарок. Один из лидеров мировой индустрии полимерных технологий, концерн Rehau в своей деятельности всегда ориентируется на самые современные и передовые разработки. Минимальное количество вкраплений. <a href=http://okna-nova.com/index.php/uslugi/otdelka-balkonov-i-lodzhij/vstroennye-shkafy>встроенные шкафы пермь</a> Эта организация занимается контролем сохранности фасадов и выдает разрешения на их изменения. Во время строительства нового дома подобный проект должен быть оговорен сразу. <a href=http://okna-nova.com/index.php/uslugi/osteklenie-balkonov-i-lodzhij/osteklenie-iz-pvkh>остекление балконов пермь</a> Окно – это не только источник естественного освещения в квартире, но и важный элемент ее дизайна. Форма рам окна также очень важна. <a href=http://okna-nova.com/index.php/uslugi/remont-okon-i-dverej/remont-okon-i-dverej>ремонт окон пермь</a> Так, в соответствии с ГОСТом 24866-99, номинальная толщина стеклопакета должна варьироваться в диапазоне от 14 до 60 мм, а расстояние между стеклами – от 8 до 36 мм. Очень красиво смотрится конструкция, в которой створки, расположенные по бокам, одинаковы по размеру.

2017-03-14 05:10:17
Dvrei85minly
Но сейчас используется не только классический прозрачный вариант, существует множество предложений. Как правило, на изготовление нетиповых изделий уходит не более 2 недель. Шоу-рум знаменитого отеля Las Vegas Hilton используется как развлекательная площадка — в нем регулярно проходят рок-оперы и другие представления. <a href=http://vhodniedvery.vs-line.ru>входные двери спб</a> ы более подробно остановимся на тех деталях, которые чаще всего интересуют покупателя – толщине дверного полотна, наполнителе и отделке. Арочные двери Если вы ищете экономичное и простое решение для арочного дверного проема, рекомендуем обратить внимание на арочные межкомнатные двери. м2, разумеется, привлекает сотни покупателей — здесь заключаются многомиллионные сделки. <a href=http://vhodniedvery.vs-line.ru>каталог дверей спб</a> Интуитивно очевидно, что чем дверь тяжелее и толще, тем она прочнее, но прямой зависимости между толщиной изделия и ее взломостойкостью все же нет. Бампингом называют вскрытие замков с использованием бамп-ключа, который похож на обычный ключ, только с максимальной нарезкой лунок или резцов. <a href=http://vhodniedvery.vs-line.ru>каталог дверей санкт петербург</a> Входные металлические двери в основном ориентированы на установку внутри многоквартирных жилых домов. <a href=http://vhodniedvery.vs-line.ru>каталог дверей спб</a> Как правило, рисунок на них имеет выдавленную заводскую форму.

2017-02-19 21:09:34
IsaacChoke
Я делюсь секретами заработка в интернете и досконально все
расписываю на моем секретном сайте: http://1-million-rubley.xyz


Информация для поисковых систем: РёРіСЂС‹ онлайн РіРґРµ можно заработать реальные деньги 1000000000РіРґРµ можно заработать денег РІ СЃРїР±РЅР° каких деньгах можно заработать gpзаработок РІ интернете РЅР° автомате отзывысколько можно заработать РЅР° продаже кроликов, заработок РІ интернете вакансии без вложений outlookпассивный заработок РІ интернетезаработать интернете без первого РІР·РЅРѕСЃР° 407152624 заработок интернете 4 буквыавтоматический заработок денег РІ интернете mail, как заработать РЅР° игровых автоматах РІ интернете qiwiкаких приложениях можно реально заработать ipРіРґРµ заработать подростку интернете 4 Р±СѓРєРІС‹e заработок интернете через телефон без вложений5 заработок интернете вложениями выводом денег.

2017-02-15 04:02:05
ВикторнBew
Новейшие базы данных фирм России 2017 года от производителей, а не посредников!

Базы данных фирм городов России. как риэлтору найти клиентов

Собираем сразу после заказа из открытых источников Интернета, БЕЗ ПРЕДОПЛАТЫ!

Заказывайте базы данных фирм у нас, мы - производители!

Только лучшее за минимальную стоимость, от 500 рублей.

Наша рабочая почта: bazy-gorodow(собачка)yandex.ru

Базы данных фирм городов России. найти клиентов салон красоты
Ваше имя: *
Текст записи: *
Имя:

Пароль:



Регистрация

Каким способом вы подключены к интернету
Dial-Up
26% (59)
ISDN
1% (2)
Выделенная линия
27% (61)
ADSL
32% (71)
Спутниковый интернет
2% (5)
GPRS-интернет
8% (17)
Другое
4% (9)

Проголосовало: 224
Программа "Наша цель - коммунизм!" выполнила недопустимую операцию и будет закрыта. В случае повторной ошибки обращайтесь к разработчику.
Рейтинг: 0/10 (0)
Посмотреть все анекдоты