RSS   Twitter   Copiny   Copiny
Нашел ошибку? 

Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!

JTable - работа с таблицами базы данных

Joomla CRUD

Joomla! предоставляет нам мощный абстрактный класс JTable; при этом мы можем выполнять все основные функции по работе с таблицей. Для каждой таблицы, которую мы хотим использовать в классе JTable, мы должны создать новый подкласс.

При создании подкласса JTable, мы должны придерживаться некоторых правил. Эти правила позволят нам интегрировать наше расширение в Фреймворк Joomla.

Итак, каждый подкласс JTable должен быть расположен в отдельном файле в каталоге tables (в административной части компонента). Имя создаваемого класса должно иметь префикс table. Имя файла обязательно должно быть в единственном числе.

Используем описанную выше схему таблицы, чтобы показать на примере как работать с классом JTable.

Класс должен называться Table[Название класса], например, TableMyData и расположен в каталоге  JPATH_COMPONENT_ADMINISTRATOR.DS.'tables'.DS.'mydata.php'.  При первом использовании нашего класса мы должны определить глобальные свойства. Глобальные свойства соответствуют полям таблицы и должны иметь такие же названия. Мы используем эти свойства как буфер для хранения отдельных записей.

Во-вторых, в целях использования метода JTable::getInstance() мы должны определить конструктор.

В-третьих, нам нужно переопределить метод check(). Этот метод проверяет содержимое буфера и возвращает булево значение. Если метод вернул значение false, то используем метод setError() для пояснения ошибки.

class TableMyData extends JTable
{
    /** @var int Primary key */ 
    var $id = null;

    /** @var string Content */ 
    var $content = null;

    /** @var int Checked-out owner */ 
    var $checked_out = null;

    /** @var string Checked-out time */ 
    var $checked_out_time = null;

    /** @var string Parameters */ 
    var $params = null;

    /** @var int Order position */ 
    var $ordering = null;

    /** @var int Number of views */ 
    var $hits = null;

    /**
    * Constructor
    *
    * @param database Database object
    */
    function __construct( &$db )
    {
        parent::__construct('#__myextension_mydata', 'id', $db);
    }
    
    /**
    * Проверка
    *
    * @return boolean True if buffer is valid
    */
    function check()
    {
        if(!$this->content)
        {
            $this->setError(JText::_('Ошибка'));
            return false;
        }
        return true;
    }
}

Теперь, когда мы создали TableMyData класс нужно инстанцировать объект с помощью статического метода JTable:: getInstance().

JTable::addIncludePath(JPATH_COMPONENT_ADMINISTRATOR.DS.'tables');
$table = JTable::getInstance('mydata', 'Table');

Заметьте, что мы подключаем не mydata.php а только каталог с таблицами. Когда JTable начинает инстанцировать TableMyData на объект, автоматически подключается mydata.php.

CRUD

CRUD (Create Read Update Delete) - это общее название основных задач по управлению таблицей. 
Все CRUD примеры $table ссылаются на класс TableMyData и $id ссылается на идентификатор записи которую мы в данный момент обрабатываем. В этом примере мы создаем новую запись; $table - экземпляр класса TableMyData.

$table->reset();
$table->set('content', "Наш контент");
$table->set('ordering', $table->getNextOrder());
if ($table->check())
{
    if (!$table->store())
    {
        // обработчик ошибок записи
        // используем $table->getError()
    }
} else {
    // обработчик ошибки проверки буфера
    // тоже используем $table->getError()
}

Метод reset() очищает наш буфер и приводит значения всех свойств к значениям по-умолчанию. Метод getNextOrder() определяет следующий по порядку вложенности элемент. Если запись не существующая, то он ставит значение 1.

Давайте рассмотрим наш пример подробнее. Некоторые из полей имели значение по-умолчанию, и после записи, значение даты будет пустым. После выполнения предыдущего примера буфер $table выглядит так:

array (
    'id' => '1',
    'content' => 'Наш контент',
    'checked_out' => '',
    'checked_out_time' => '',
    'params' => '',
    'ordering' => '1',
    'hits' => '0'
);


После выполнения метода store() (сохранения записи), мы можем загрузить его:

<samp>$table->load($table->id);</samp>


Теперь наш буфер выглядит так:

array (
    'id' => '1',
    'content' => 'Наш контент',
    'checked_out' => '0',
    'checked_out_time' => '0000-00-00 00:00:00',
    'params' => '',
    'ordering' => '1',
    'hits' => '0',
); 


Вместо загрузки нашей сохраненной записи, мы могли бы изначально верно установить значения по-умолчанию, и нам бы не пришлось перезагружать запись.

Однако некоторые значения по-умолчанию зависят от типа данных. Поэтому нам нужно переопределить метод reset(). Для примера значение checked_out_time будет равно $db->getNullDate(). Итак для загрузки конкретной записи используем метод:

if (!$table->load($id))
{
    // обработчик загрузки
    // используем $table->getError() для ловли ошибок
}


Для обновления записи в буфере мы можем использовать два метода: первый - это загрузить запись из БД, второй - это установить конкретные значения для свойств буфера.

В этом примере покажем как обновить запись:

// установка значений
$table->reset();
$table->setVar('id', $id);
$table->setVar('content', JRequest::getString('content'));
if ($table->check())
{
    if (!$table->store())
    {
        // обрабатываем ошибки записи с помощью $table->getError()
    }
} else {
    // обрабатываем ошибки ввода в буфер $table->getError()
}


Последнее что мы рассмотрим - это удаление записи:

if (!$table->delete($id))
{
    // обрабатываем ошибки
}


Если мы не указываем в методе delete() номер id, то id будет браться из буфера.

Если наша запись в таблице имеет родственные записи с другими таблицами, то мы должны сначала выполнить проверку методом canDelete(). Этот метод имеет всего один параметр в виде двумерного массива. Внутри массива должно быть несколько ключей - idfield, name, joinfield, и label. idfield - это имя первичного ключа в соответствующей таблице. name - это название самой таблицы. joinfield - это имя внешнего ключа соответствующей таблицы. label - это описание отношения между таблицами, для вывода сообщения об ошибке, если родственных связей не найдено.

Представьте что есть еще одна таблица #__myextension_children. Эта таблица имеет первичный ключ childid и внешний ключ primary, который ссылается на запись в таблице #__myextension_mydata. В этом примере мы проверим нет ли зависимости между записями таблицами #__myextension_children и #__myextension_mydata, перед удалением записи из таблицы #__myextension_mydata.

$join1 = array(
    'idfield'   => 'childid', 
    'name'      => '#__myextension_children', 
    'joinfield' => 'parent', 
    'label'     => 'Children'
);
 
$joins = array($join1);
if ($table->canDelete($id, $joins))
{
    if (!$table->delete($id))
    {
        // обрабатываем ошибки удаления
    }
} else {
    // обрабатываем в случае нахождения зависимостей
}

Мы можем определить более одной межтабличной связи. Допустим еще существует таблица #__myextension_illegitimate_children:

$join1 = array(
    'idfield'   => 'childid', 
    'name'      => '#__myextension_children', 
    'joinfield' => 'parent', 
    'label'     => 'Children');
$join2 = array(
    'idfield'   => 'ichildid', 
    'name'      => '#__myextension_illegitimate_children', 
    'joinfield' => 'parent', 
    'label'     => 'illegitimate Children');
$joins = array($join1, $join2);

Управление зарезервированными полями

Наша таблица содержит все зарезервированные поля, которыми мы можем управлять с помощью методов класса JTable. Рассмотрим управление этими полями подробнее.

Publishing

Для публикации и снятия с публикации мы можем использовать метод publish(). Если таблица содержит поле checked_ out, то мы можем быть уверены что запись таблицы не редактируется другим пользователем. Приведем пример публикации:

$publishIds = array($id);
$user =& JFactory::getUser();
if (!$table->publish($publishIds, 1, $user->get('id')))
{
    // обрабатываем ошибки
}


Первый параметр - это массив из id записей, которые нужно опубликовать или снять с публикации. Второй параметр необязательный, и указывает публикуем мы запись (значение 1), или снимаем с публикации (значение 0). По-умолчанию имеет значение 1. Последний параметр используется только в случае, если существует поле checked_out, и указывает id пользователя редактирующего запись. Метод возвращает значение true если все прошло успешно.

Hits

Произвести инкремент над записью можно с помощью метода hit(). Для примера мы установим id записи и выполним инкремент.

$table->set('id', $id);
$table->hit();


Также мы можем указать в параметре метода hit() нужный нам id. Но мы должны помнить что при этом обновиться буфер.

$table->hit($id);

Checking Out

Перед тем как мы начнем блокировать наши записи, мы должны убедиться что запись уже не заблокирована. Это нужно, чтобы не получилось, что несколько пользователей одновременно редактируют одну запись. Для этого мы можем использовать метод isCheckOut(). В этом примере мы выполняем проверку:

$table->load($id);
$user =& JFactory::getUser();
if ($table->isCheckedOut($user->get('id')))
{
    // выполняем действия если запись заблокирована
}

Далее мы блокируем запись под пользователя:

$table->load($id);
$user =& JFactory::getUser();
if (!$table->checkout($user->get('id')))
{
    // обрабатываем ошибки
}


Для того чтобы обрабатывать запись используем следующий метод:

$table->load($id);
$user =&amp; JFactory::getUser();
if (!$table->checkin($user->get('id')))
{
    // обрабатываем ошибки
}

Запомните, что эти методы можно использовать только для залогенных пользователей.

Ordering

Когда мы хотим расположить элементы в определенном порядке, JTable предоставляет нам для этого набор методов. Первый из рассмотренных нами методов будет reorder(). Этот метод исправляет ошибки в порядке расположения записей в таблице.

$table->reorder();


В более сложных таблицах записи обычно разбиты по группам, и для этого в метод reorder() нужно дописать дополнительный параметр. Представим, что в нашей таблице есть поле group. В этом примере мы упорядочим записи в группе 1.

$db =& $table::getDBO();
$where = $db->nameQuote('group').' = 1';
$table->reorder($where);


Заметьте, что мы получаем объект базы данных не из JFactory, а из таблицы!
Ранее мы уже использовали метод getNextOrder(). Метод выдает нам следующую позицию в порядке упорядочивания. Как и в случае с reorder(), мы имеем возможность определения групп. Например, получим следующий номер порядка для группы 1.

$db =& $table::getDBO();
$where = $db->nameQuote('group').' = 1';
$nextPosition = $table->getNextOrder($where);


И последний метод - это move(). Он нужен для перемещения записи на одну позицию вверх или вниз. Переместим на примере запись вверх.
$table->load($id); $table->move(-1); Опять у нас есть возможность для указания групп. Покажем это на примере:

$db =& $table::getDBO();
$where = $db->nameQuote('group').' = 1';
$table->load($id);
$table->move(1, $where);

Поле параметров params

Класс JTable не имеет каких-то специальных методов по управлению параметрами INI. Буфер JTable предназначен для хранения RAW данных параметров, которые необходимо сохранить.

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

Класс JParameter расширяет класс JRegistry. В этом примере мы рассмотрим как можно парсить параметры используя класс JParameter.

$params = new JParameter($table->params);


Как только мы получили доступ к параметрам, мы можем изменять их используя методы get() и set().

$value = $params->get('someValue');
$params->set('someValue', ++$value);


Также мы можем получить данные в виде INI строки используя метод toString().

$table->params = $params->toString();


Мы также можем сами создать строку параметров. Для этого нужно указать сами параметры и путь к XML файлу манифеста.

$params = new JParameter('foo=bar', $pathToXML_File);


Для вывода параметров на экран в виде формы используется метод render().

echo $params->render('params');

Поля даты

При сохранении даты, очень важно чтобы она была в правильном формате. Для MySql мы должны сохранять дату в виде YYYY-MM-DD HH:MM:SS. Самый простой способ сделать это - использовать класс JDate. В этом классе нам потребуется метод toMySQL(), для приведения даты к правильному виду.

// import JDate class
jimport('joomla.utilities.date');
// получаем текущую дату и время
$myDate = gmdate();
// создаем новый объект JDate
// для joomla 1.5.0 надо было писать $jdate = new JDate($myDate);
$jdate = &amp; JFactory::getDate($myDate);
// создаем запрос используя toMySQL()
$query = 'SELECT * FROM #__example WHERE date < '.$jdate->toMySQL();


$myDate - это дата в формате UNIX (timestamp).

Смотрите также:
Комментарии (46) Добавить комментарий
  • Андрей
    Андрей
    12 Сентября 2011, 02:53
     ↑  0  ↓     ответ

    Привет,

    в первом примере рассматривается способ добавления одной строки в базу, а если к примеру нужно добавить сразу несколько в базу?

    • smet.denis
      smet.denis (админ)
      13 Сентября 2011, 23:59
       ↑  0  ↓     ответ

      повторите одно и тоже действие несколько раз :)

  • lastalert
    lastalert
    11 Октября 2011, 22:44
     ↑  +1  ↓     ответ

    smet.denis, подскажи, если не трудно, как можно сохранить данные формы в 2 таблицы?

    т.е., например, значение 1-го инпута летит в первую таблицу, значение 2-го инпута - во 2-ю таблицу.

    В документации не нашел, саппорты молчат :(

    • Мурад
      Мурад
      10 Февраля 2015, 15:17
       ↑  0  ↓     ответ

      smet.denis, подскажи, если не трудно, как можно сохранить данные формы в 2 таблицы?

      т.е., например, значение 1-го инпута летит в первую таблицу, значение 2-го инпута - во 2-ю таблицу.

      В документации не нашел, саппорты молчат :(

      --------

      тоже интересен этот вопрос

  • startom
    startom
    23 Ноября 2011, 15:14
     ↑  0  ↓     ответ

    Добрый день.

    А где именно проводится проверка на использование INSERT или UPDATE? Делал свой компонент по образу и подобию, но при попытке редактирования делается insert, в результате возникает ошибка о дублировании ключа.

    Ваш компонент устанавливается и работает корректно.

    • startom
      startom
      23 Ноября 2011, 15:33
       ↑  +2  ↓     ответ

      разобрался - неправильно указал идентификатор ключа при объявлении класса таблицы

  • Александр
    Александр
    28 Января 2014, 16:29
     ↑  0  ↓     ответ

    Добрый день!

    есть простое меню вида

    <!--<ul class="m">

    <li><a href="#">пункт первый</a></li>

    <ul>

    <li><a href="#">подпункт первый</a></li>

    <li><a href="#">подпункт второй</a></li>

    </ul>

    <li><a href="#">пункт второй</a></li>

    <li><a href="#">пункт третий</a></li>

    </ul>-->

    Вопрос - как программно напрямую внести это меню в меню joomla3. Я так понимаю это надо делать через базу данных joomla? Прошу Вашей помощи!!!

    Спасибо!

  • or coconut oil
    or coconut oil
    26 Ноября 2019, 01:11
     ↑  0  ↓     ответ

    Hello there, You've done an excellent job. I will definitely

    digg it and personally recommend to my friends.

    I am confident they will be benefited from this site.

  • plenty of fish dating site
    plenty of fish dating site
    26 Ноября 2019, 16:22
     ↑  0  ↓     ответ

    Hi, all is going fine here and ofcourse every one is sharing information, that's really fine, keep up writing.

  • r
    r
    10 Декабря 2019, 21:01
     ↑  0  ↓     ответ

    Почему не разжевано откуда вообще взялись данные из буфера

    array (

    'id' => '1',

    'content' => 'Наш контент',

    'checked_out' => '',

    'checked_out_time' => '',

    'params' => '',

    'ordering' => '1',

    'hits' => '0'

    );

    до загрузки?

  • Corinne
    Corinne
    09 Марта 2021, 13:24
     ↑  0  ↓     ответ

    Hi to every body, it's my first pay a quick

    visit of this webpage; this webpage includes amazing and genuinely good data for readers.

  • http://tinyurl.com/y7d5busg
    http://tinyurl.com/y7d5busg
    26 Марта 2022, 09:28
     ↑  0  ↓     ответ

    all the time i used to read smaller posts that also clear their motive, and that is also happening with this

    paragraph which I am reading here.

  • http://tinyurl.com/yapbobl8
    http://tinyurl.com/yapbobl8
    27 Марта 2022, 05:59
     ↑  0  ↓     ответ

    I'm really enjoying the theme/design of your web site.

    Do you ever run into any web browser compatibility

    problems? A couple of my blog audience have complained about

    my blog not working correctly in Explorer but looks great in Safari.

    Do you have any suggestions to help fix this issue?

  • http://tinyurl.com/y9m2nuqu
    http://tinyurl.com/y9m2nuqu
    30 Марта 2022, 11:16
     ↑  0  ↓     ответ

    It's very straightforward to find out any topic on net as

    compared to textbooks, as I found this article at this web site.

  • plane ticket
    plane ticket
    02 Апреля 2022, 23:29
     ↑  0  ↓     ответ

    You ought to take part in a contest for one of the greatest

    sites on the web. I most certainly will recommend this blog!

  • airlines tickets cheapest
    airlines tickets cheapest
    04 Апреля 2022, 08:42
     ↑  0  ↓     ответ

    I’m not that much of a online reader to be honest but your

    blogs really nice, keep it up! I'll go ahead and bookmark your site to come back in the future.

    Many thanks

  • book flights
    book flights
    04 Апреля 2022, 17:12
     ↑  0  ↓     ответ

    Hey there would you mind sharing which blog

    platform you're working with? I'm looking to start my own blog soon but I'm having a

    difficult time selecting between BlogEngine/Wordpress/B2evolution and Drupal.

    The reason I ask is because your design and style seems different then most

    blogs and I'm looking for something completely

    unique. P.S Apologies for being

    off-topic but I had to ask!

  • cheap fly
    cheap fly
    05 Апреля 2022, 13:18
     ↑  0  ↓     ответ

    I think that everything posted was actually very logical.

    But, what about this? what if you were to create a

    killer headline? I am not saying your information is not good., but suppose you added a headline

    that grabbed folk's attention? I mean JTable - работа с таблицами базы данных / Классы Joomla .:.

    Документация Joomla! CMS is kinda boring.

    You should glance at Yahoo's front page and watch how they create article titles to get viewers to

    open the links. You might add a related video or a related picture or two to get people interested

    about everything've got to say. Just my opinion, it could bring your blog a little livelier.

  • airtickets
    airtickets
    06 Апреля 2022, 01:56
     ↑  0  ↓     ответ

    Hi there i am kavin, its my first occasion to commenting anyplace, when i read this article i thought i

    could also create comment due to this good piece of writing.

  • cheap flights booking
    cheap flights booking
    06 Апреля 2022, 09:49
     ↑  0  ↓     ответ

    I've been exploring for a little for any high quality articles or weblog posts in this sort of space .

    Exploring in Yahoo I eventually stumbled upon this web site.

    Studying this info So i'm glad to express that I

    have an incredibly excellent uncanny feeling I discovered just

    what I needed. I most definitely will make certain to don?t forget this

    website and provides it a glance regularly.

  • extremely low airfares
    extremely low airfares
    06 Апреля 2022, 23:26
     ↑  0  ↓     ответ

    Its like you read my mind! You seem to know a lot about this, like you wrote the book in it or something.

    I think that you can do with some pics to drive the message home a little bit, but

    instead of that, this is wonderful blog. A fantastic read.

    I will certainly be back.

  • gamefly
    gamefly
    07 Апреля 2022, 10:08
     ↑  0  ↓     ответ

    Greetings! This is my first visit to your blog!

    We are a team of volunteers and starting a new initiative in a community in the same niche.

    Your blog provided us valuable information to work on. You have

    done a extraordinary job!

  • gamefly
    gamefly
    10 Апреля 2022, 21:41
     ↑  0  ↓     ответ

    When I originally commented I clicked the "Notify me when new comments are added" checkbox

    and now each time a comment is added I get several e-mails with the same

    comment. Is there any way you can remove people from that service?

    Many thanks!

  • tinyurl.com
    tinyurl.com
    10 Мая 2022, 07:22
     ↑  0  ↓     ответ

    Its not my first time to pay a quick visit this site, i am browsing this web

    site dailly and obtain fastidious information from here everyday.

  • tinyurl.com
    tinyurl.com
    12 Мая 2022, 01:23
     ↑  0  ↓     ответ

    Greate article. Keep writing such kind of info on your page.

    Im really impressed by it.

    Hello there, You have done an excellent job. I will definitely

    digg it and for my part recommend to my friends. I'm confident they will be benefited from

    this web site.

  • http://tinyurl.com/yxz78fug
    http://tinyurl.com/yxz78fug
    16 Мая 2022, 19:47
     ↑  0  ↓     ответ

    Excellent weblog right here! Additionally your web site a lot up

    fast! What web host are you using? Can I am getting your affiliate hyperlink

    on your host? I desire my web site loaded up as quickly as

    yours lol

  • bit.ly
    bit.ly
    05 Июня 2022, 03:30
     ↑  0  ↓     ответ

    Thank you for the auspicious writeup. It actually

    used to be a amusement account it. Look advanced to far brought agreeable from you!

    By the way, how can we keep in touch?

  • tinyurl.com
    tinyurl.com
    07 Июля 2022, 10:44
     ↑  0  ↓     ответ

    Everyone loves what you guys tend to be up too.

    This type of clever work and coverage! Keep up the good works guys I've added you guys to my

    personal blogroll.

  • http://bit.ly/3NYK0dA
    http://bit.ly/3NYK0dA
    15 Июля 2022, 17:47
     ↑  0  ↓     ответ

    Good day! This is my 1st comment here so I just wanted to give a

    quick shout out and say I really enjoy reading your blog

    posts. Can you suggest any other blogs/websites/forums that

    go over the same topics? Appreciate it!

  • http://bit.ly
    http://bit.ly
    22 Июля 2022, 23:50
     ↑  0  ↓     ответ

    Hi, i think that i noticed you visited my website thus i came

    to return the want?.I am attempting to find things

    to enhance my website!I suppose its ok to use

    some of your concepts!!

  • tinyurl.com
    tinyurl.com
    28 Июля 2022, 17:35
     ↑  0  ↓     ответ

    Saved as a favorite, I love your web site!

  • tinyurl.com
    tinyurl.com
    01 Августа 2022, 08:05
     ↑  0  ↓     ответ

    It's actually very complex in this active life to listen news on Television, therefore I only

    use the web for that purpose, and get the newest news.

  • http://tinyurl.com/28b97jy7
    http://tinyurl.com/28b97jy7
    01 Августа 2022, 20:02
     ↑  0  ↓     ответ

    I wanted to thank you for this wonderful read!! I definitely loved every little bit of it.

    I have got you book-marked to check out new stuff you post…

  • tinyurl.com
    tinyurl.com
    03 Августа 2022, 04:53
     ↑  0  ↓     ответ

    Amazing! This blog looks exactly like my old one! It's on a completely different

    subject but it has pretty much the same layout and design. Excellent choice of

    colors!

  • http://sl860.com/comment/html/?10130.html
    http://sl860.com/comment/html/?10130.html
    07 Августа 2022, 23:58
     ↑  0  ↓     ответ

    Hi to every single one, it's genuinely a nice for me

    to go to see this site, it contains helpful Information.

  • http://tinyurl.com/2zn4lgyr
    http://tinyurl.com/2zn4lgyr
    09 Августа 2022, 00:53
     ↑  0  ↓     ответ

    After looking into a handful of the blog posts on your website,

    I honestly appreciate your way of writing a blog. I bookmarked it to my bookmark webpage list and will be checking back in the near future.

    Take a look at my website as well and let me know your opinion.

  • http://tinyurl.com/2pdbabog
    http://tinyurl.com/2pdbabog
    09 Августа 2022, 19:43
     ↑  0  ↓     ответ

    Thank you for sharing your thoughts. I really appreciate your efforts and I am waiting for your

    next write ups thanks once again.

  • tinyurl.com
    tinyurl.com
    10 Августа 2022, 09:26
     ↑  0  ↓     ответ

    We stumbled over here different web page

    and thought I might check things out. I like what I see so now i am

    following you. Look forward to looking at your web

    page yet again.

  • coupon
    coupon
    12 Августа 2022, 02:12
     ↑  0  ↓     ответ

    Hi, Neat post. There is a problem along with your site in internet explorer, would check this?

    IE nonetheless is the market leader and a big component to

    people will pass over your wonderful writing because of this problem.

  • http://tinyurl.com/2qaz2p9k
    http://tinyurl.com/2qaz2p9k
    14 Августа 2022, 00:50
     ↑  0  ↓     ответ

    Hey there! I simply wish to give you a huge thumbs up for your excellent info

    you've got right here on this post. I'll be returning to your

    blog for more soon.

  • tinyurl.com
    tinyurl.com
    15 Августа 2022, 09:24
     ↑  0  ↓     ответ

    Good post. I learn something totally new

    and challenging on websites I stumbleupon everyday.

    It's always exciting to read articles from other writers and practice something from their sites.

  • http://tinyurl.com/2p9qyt9b
    http://tinyurl.com/2p9qyt9b
    30 Августа 2022, 01:26
     ↑  0  ↓     ответ

    Appreciating the commitment you put into your site and detailed information you present.

    It's awesome to come across a blog every once in a while that isn't the same unwanted rehashed material.

    Excellent read! I've saved your site and I'm adding your RSS feeds to my Google

    account.

  • tracfone
    tracfone
    03 Сентября 2022, 20:22
     ↑  0  ↓     ответ

    I have been surfing online more than three hours today, yet

    I never found any interesting article like yours. It is pretty

    worth enough for me. In my view, if all website owners and bloggers made good content as you

    did, the internet will be much more useful than ever before.

  • tinyurl.com
    tinyurl.com
    04 Сентября 2022, 23:17
     ↑  0  ↓     ответ

    You actually make it seem so easy with your presentation but I find this topic to be really something that I think I would

    never understand. It seems too complicated and very

    broad for me. I'm looking forward for your next post, I'll try to get the hang of

    it!

  • tinyurl.com
    tinyurl.com
    07 Сентября 2022, 17:48
     ↑  0  ↓     ответ

    Howdy very nice website!! Guy .. Beautiful .. Amazing ..

    I will bookmark your website and take the feeds additionally?

    I am satisfied to seek out numerous useful information right here

    within the publish, we want work out more strategies in this regard,

    thanks for sharing. . . . . .

  • shipitshoutit.com
    shipitshoutit.com
    12 Сентября 2022, 03:08
     ↑  0  ↓     ответ

    Can you tell us more about this? I'd want to find out more details.

Оставить комментарий




* обязательно для заполнения

1 введенный почтовый адрес используется только для обратной связи при ответах в комментариях и сервиса gravatar.com
.