Вымышленный add message php. PHP AJAX CRUD: создание, удаление, редактирование записей в БД MySQL

В КП и БУС начиная с версии 11.5, в редакциях включающих в себя социальную сеть появился новый модуль " Веб-мессенджер ".
Перед тем как выпустить всем, модуль прошел боевое крещение на нашем " Социальном интранете ", собрав аж 8 обновлений


За шесть месяцев разработки, мы сделали многое

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

Окно истории это отдельная тема, все давно хотели иметь поиск по истории, теперь он наконец у нас есть, планируем добавить туда еще и календарь для быстрой навигации.

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

И это все доступно на каждой странице вашего сайта!

К сожалению, реализовано далеко не все что планировалось

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

Второе , это реализация настоящей "мгновенной" связи. Сейчас в модуле используется обычный пулинг, раз в n-секунд опрос сервера, период опроса меняется в зависимости от активности общения.
Мы планируем написать отдельный сервис, который будет держать постоянные соединения и рассылать по мере надобности обновления данных (для мессенджера, для живой ленты и тд).

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

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

Работа с уведомлениями (актуально для IM начиная с версии 11.5.2)

Мы реализовали три типа уведомлений:
- персонализированное уведомление;
- уведомление от системы;
- уведомление требующее подтверждения (confirm);

П еред использованием API необходимо проверять установлен ли модуль в системе:

if (IsModuleInstalled("im") && CModule::IncludeModule("im")) { } ?>

Персонализированное уведомление


Если сообщениям задавать NOTIFY_TAG, то у пользователя они будут группироваться.

Уведомление от системы


$arMessageFields = array(// получатель "TO_USER_ID" => $USER->GetId(), // отправитель (может быть >0) "FROM_USER_ID" => 0, // тип уведомления "NOTIFY_TYPE" => IM_NOTIFY_SYSTEM, // модуль запросивший отправку уведомления "NOTIFY_MODULE" => "im", // символьный тэг для группировки (будет выведено только одно сообщение), если это не требуется - не задаем параметр "NOTIFY_TAG" => "IM_CONFIG_NOTICE", // текст уведомления на сайте (доступен html и бб-коды) "NOTIFY_MESSAGE" => "[b]Внимание: необходимо проверить и указать корректный путь до социальной сети в настройках модуля “Мгновенные сообщения и уведомления”", // текст уведомления для отправки на почту (или XMPP), если различий нет - не задаем параметр //"NOTIFY_MESSAGE_OUT" => ""); CIMNotify::Add($arMessageFields); ?>

Уведомление требующее подтверждения (confirm)


$arMessageFields = array(// получатель "TO_USER_ID" => $USER->GetId(), // отправитель "FROM_USER_ID" => 2, // тип уведомления "NOTIFY_TYPE" => IM_NOTIFY_CONFIRM, // модуль запросивший отправку уведомления "NOTIFY_MODULE" => "calendar", // символьный тэг для группировки (будет выведено только одно сообщение), если это не требуется - не задаем параметр "NOTIFY_TAG" => "CALENDAR|INVITE|123|".$USER->GetId(), // текст уведомления на сайте (доступен html и бб-коды) "NOTIFY_MESSAGE" => "Приглашаю вас принять участие во встрече “Мгновенные сообщения и уведомления” которая состоится 15.03.2012 в 14:00", // текст уведомления для отправки на почту (или XMPP), если различий нет - не задаем параметр "NOTIFY_MESSAGE_OUT" => "Пользователь Евгений Шеленков приглашает вас принять участие во встрече “Мгновенные сообщения и уведомления” #BR# которая состоится 15.03.2012 в 14:00.#BR# #BR# Принять: http://test.ru/calend.php?CONFIRM=Y&CID=123 #BR# Отказаться: http://test.ru/calend.php?CONFIRM=N&CID=123", // массив описывающий кнопки уведомления "NOTIFY_BUTTONS" => Array(// 1. название кнопки, 2. значение, 3. шаблон кнопки, 4. переход по адресу после нажатия (не обязательный параметр) Array("TITLE" => "Принять", "VALUE" => "Y", "TYPE" => "accept" /*, "URL" => "http://test.ru/?confirm=Y" */), Array("TITLE" => "Отказаться", "VALUE" => "N", "TYPE" => "cancel" /*, "URL" => "http://test.ru/?confirm=N" */),), // символьный код шаблона отправки письма, если не задавать отправляется шаблоном уведомлений "NOTIFY_EMAIL_TEMPLATE" => "CALENDAR_INVITATION",); CIMNotify::Add($arMessageFields); ?>

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

Обслуживание
Есть два варианта, самый простой, переход по ссылке (если задать 4 параметр в NOTIFY_BUTTONS).
После перехода по ссылке, в вашем коде нужно вызвать следующий код:
Внимание: внимательно следите за названием тэгов, при вызове удаления будут удалены все сообщения с таким тэгом.
При множественной рассылке необходимо это учитывать, что бы выполнение действия одним пользователем случайно не удалило уведомление всем (кроме мест где такая логика нужна).

Второй вариант, на событиях.
1. нужно зарегистрировать зависимость

Не забудьте внутри ваших функций ConfirmRequest и RejectRequest вызвать удаление уведомления CIMNotify:: DeleteByTag()

На этом пока все, жду ваших предложений в комментариях, удачных внедрений!
Если вы хотите попробовать API до выхода 11.5.2 в массив с параметрами необходимо дополнительно указывать "MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, так же у уведомлений confirm не будет работать вариант с ссылкой в кнопках. Но лучше подождать, обновление 11.5.2 должно выйти 23 мая.

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

То, что мы не сделали, это не реализовали типы сообщений и их отображение согласно введённым пользователем данным.

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

Готовы начать?

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

  • PHP 5.6.25 и MySQL 5.6.28
  • Apache или Nginx
  • WordPress 4.6.1
  • Предпочитаемый вами IDE или редактор

И если вы ищете решение "все-в-одном", не забудьте попробовать MAMP .

Мы продвинулись до

Как упоминалось ранее, мы находимся ровно в середине этого курса. Если вы пропустили какой-то из первых уроков, вот то, что мы рассмотрели к настоящему моменту:

  • В первом уроке , мы сосредоточились на минимальной основе для создания нашего плагина и на том, что необходимо иметь на старте.
  • В второй части , мы продвинулись с плагином дальше, немного дополнив базовую страницу администрации в WordPress. Ещё мы назначили пользовательский hook, который используем и провели его на стороне сервера. Также мы задали основные параметры для нашего Settings Messenger.
  • И вот что мы рассмотрим на заключительном этапе обучения:

  • Мы свяжем все это вместе, посмотрим в действии и сделаем плагин публично доступным для скачивания.
  • В настоящее время у нас есть иные задачи, на них мы и сосредоточимся.

    Вернёмся к работе

    Поскольку мы обратились к работе (и, как было сказано в предыдущих уроках), мы стремимся к дальнейшей реализации задач в этой части:

    В этом уроке мы продолжим развитие нашего Settings Messenger путём добавления поддержки для успешных и ошибочных сообщений, а также затронем вопросы безопасности.

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

    В этом уроке мы добавим поддержку для ошибочных, предупреждающих и успешных сообщениях. Затем выведем их на экран, чтобы получить представление как messenger будет работать.

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

    Это весь план необходимой работы на этот урок. Давайте начнем.

    Расширение Settings Messenger

    Помните, что вся суть Settings Messenger состоит в определении для нас своего способа работы с пользовательскими сообщениями, пользовательскими hooks и родной WordPress API для отображения сообщений в контексте WordPress панели администрации.

    Для этого мы собираемся расширить работу, проделанную в прошлом уроке и начнём отсюда.

    Успешные сообщения

    Поскольку мы начали с успешных сообщений в предыдущем уроке, давайте с ними и продолжим. Теперь у нас есть жестко-кодированный метод, который отображает единственный приём:

    output; $this->output = ""; return $out; } /** * Добавить порцию к содержимому контейнера. * * @param string добавляемый стринг */ function appendOutput($string) { $this->output .= $string . "n"; } /** * "Абстрактный" метод. */ function toPage() { } }

    Метод toPage() сделан пустым - в данном случае он нужен как индикатор того, как должны внешние "матрешки"-классы общаться с внутренним классом. Впрочем, здесь можно было бы предложить реализацию по умолчанию, если бы мы заметили, что есть много объектов, которые одинаково выводят себя на страницу.

    Классы Message и Inbox несколько изменятся - теперь оба они должны наследоваться от Outputable, а также изменятся и методы toPage()
    Message.php

    class Message extends Outputable { /** * Содержание сообщения. */ var $content; /** * Конструктор для инициализации текста сообщения. * * @param content содержание сообщения */ function Message($content) { $this->content = $content; } /** * Запись сообщения в сессию. */ function send() { $_SESSION["session_messages"] = $this->content; } /** * Вывод сообщения на страницу. */ function toPage() { $this->appendOutput("".$this->content.""); } }

    class Inbox extends Outputable { /** * Массив поступивших сообщений. */ var $messages = array(); /** * В конструкторе получаем все поступившие сообщения * и удаляем их из сессии. */ function Inbox() { if (is_array($_SESSION["session_messages"])) { $messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i < $co; $i++) { $this->messages = new Message($messages[$i]); } } /* очищаем массив сообщений */ $_SESSION["session_messages"] = array(); } /** * Выводим на страницу содержимое Inbox. */ function toPage() { $co = sizeof($this->messages); $this->appendOutput(""); for ($i = 0; $i < $co; $i++) { $this->messages[$i]->toPage(); $this->appendOutput($this->messages[$i]->getOutput()); } $this->appendOutput(""); } }

    Изменился способ вывода - теперь вместо непосредственного вывода на страницу внешнее представление до поры до времени хранится в Outputable, который "сидит" в каждом из объектов. Метод appendOutput() служит некоторой заменой конструкции echo(). Чтобы забрать вывод объекта, используется метод getOutput().

    Теперь посмотрим, что собой представляет клиентская часть кода, которая будет решать ту же задачу, что и раньше.
    index.php

    send(); /* текущая секунда */ $msg_sec = new Message("second: " . date("s")); $msg_sec->send(); /* перенаправление на себя же */ header("location:"); exit; } else { /* подготавливаем список сообщений в виде XML */ $inbox = new Inbox(); $inbox->toPage(); $global_content->appendOutput($inbox->getOutput()); } $global_content->appendOutput(""); $xml_string = $global_content->getOutput(); $xh = xslt_create(); $xarg = array(); /* заголовок XML-документа */ $xarg["xml"] = ""."n"; /* тело XML-документа */ $xarg["xml"] .= "" . $xml_string . ""; /* XSL-шаблон */ $xarg["xsl"] = implode("", file("style.xsl")); /* выводим HTML-код - результат XSL-трансформации */ echo xslt_process($xh, "arg:xml", "arg:xsl", NULL, $xarg); /* выводим XML-исходник (debug) */ echo "" . htmlspecialchars($xml_string) . ""; ?>

    Главное новшество - в объекте $global_content, название которого говорит само за себя. В данном случае он принадлежит классу Outputable, в реальных задачах вы, наверное, создадите отдельный класс для контента страницы.

    Если внимательно присмотреться, то содержательная часть скрипта практически не изменилась - тот же inbox, тот же toPage(). Добавлена инструкция, которая содержимое списка сообщений выводит в контент страницы. Для разнообразия теперь генерируется два сообщения.

    Для того, чтобы посмотреть на результат, осталось только подготовить XSL-шаблон.
    style.xsl

    XSLT Example

    message

    Чего же мы добились?

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

    Любой модуль, который генерирует XML-данные в качестве результата своей работы, может быть использован в проекте. Кстати, это одно из преимуществ перед template-движками, в которых создание данных заключается в последовательности вызова методов (assign и т.п.) конкретного движка, на которых нет общего стандарта.

    Еще одно преимущество - легкость отладки. Если вы запустите скрипт, то заметите, что на каждой странице присутствует debug-вывод - XML-прообраз, который здорово упрощает отладку приложений.

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

    Напоследок, галопом о перспективах:

    * всплывающие окна для списка важных сообщений
    * "страницы-отправители" и "страницы-адресаты" в сообщениях
    * ведение лога сообщений в базе данных
    * кнопка "показать историю моих действий"
    * статистический анализ действий пользователей в пределах сессий
    * "интеллектуальные помощники" в веб-приложениях

    Лучше черная полоса, чем белая горячка...

    PHP AJAX CRUD: создание, удаление, редактирование записей в БД MySQL

    В этой статье мы узнаем о том, как добавлять, редактировать и удалять записи в базе данных MySQL, используя PHP. Мы использовали обработчик JQuery, который посылает AJAX запрос к серверному скрипту. Обработчик обновляет список записей.

    AJAX форма для отправки запросов на создание, удаление, редактирование

    При добавлении записи форма отправляет данные PHP скрипту через AJAX запрос. В случае успешного добавления список записей перезагружается.

    JQuery AJAX функции для запроса к базе данных CRUD

    В функции JQuery AJAX у нас есть переключатель случаи добавить редактировать и удалять. Эти случаи генерирует различные строки запроса и ответа-данные в зависимости от действий базы данных.

    function showEditBox(id) { $("#frmAdd").hide(); var currentMessage = $("#message_" + id + " .message-content").html(); var editMarkUp = ""+currentMessage+"SaveCancel"; $("#message_" + id + " .message-content").html(editMarkUp); } function cancelEdit(message,id) { $("#message_" + id + " .message-content").html(message); $("#frmAdd").show(); } function callCrudAction(action,id) { $("#loaderIcon").show(); var queryString; switch(action) { case "add": queryString = "action="+action+"&txtmessage="+ $("#txtmessage").val(); break; case "edit": queryString = "action="+action+"&message_id="+ id + "&txtmessage="+ $("#txtmessage_"+id).val(); break; case "delete": queryString = "action="+action+"&message_id="+ id; break; } jQuery.ajax({ url: "crud_action.php", data:queryString, type: "POST", success:function(data){ switch(action) { case "add": $("#comment-list-box").append(data); break; case "edit": $("#message_" + id + " .message-content").html(data); $("#frmAdd").show(); break; case "delete": $("#message_"+id).fadeOut(); break; } $("#txtmessage").val(""); $("#loaderIcon").hide(); }, error:function (){} }); }

    PHP скрипт для операций CRUD

    Следующий код выполняет запросы к базе данных. Этот скрипт PHP после выполнения CRUD действия обновляет записи в результате ответа AJAX.

    require_once("dbcontroller.php"); $db_handle = new DBController(); $action = $_POST["action"]; if(!empty($action)) { switch($action) { case "add": $result = mysql_query("INSERT INTO comment(message) VALUES("".$_POST["txtmessage"]."")"); if($result){$insert_id = mysql_insert_id(); echo " Edit Delete " . $_POST["txtmessage"] . " "; } break; case "edit": $result = mysql_query("UPDATE comment set message = "".$_POST["txtmessage"]."" WHERE id=".$_POST["message_id"]); if($result) echo $_POST["txtmessage"]; break; case "delete": if(!empty($_POST["message_id"])) { mysql_query("DELETE FROM comment WHERE id=".$_POST["message_id"]); } break; } }