Виведення повідомлень користувачу у веб-застосунках. PHP AJAX CRUD: створення, видалення, редагування записів у БД MySQL PHP скрипт для операцій CRUD

Overview

Будівля в notification system, перша в Joomla, дозволяє вашому довіднику натиснути на користувача (або групу користувачів) позначитися на різних аспектах. Примітка, що повідомлення є важливими вимогами, що користувачі можуть бути зацікавлені в read and keep track of it.
Notifications може бути створена кожнийчас. У вашому компоненті або plugins і останній відтворюється всередині JomSocial notification system.
Цей літературу буде показано, але не вважається, що у вас немає третій-party component буде використовувати:)
Якщо ви не знаєте, як створювати інструмент, який буде захищений на цьому місці, ми робимо це, щоб виконати цей контроль.

Implementing it in your component anyway

Як зазначено в перегляді цього літератури, ми будемо створювати notifications з використанням plugin community.
Ви будете найкраще намагатися створювати повідомлення всередині свого компонента, або ваш plugin. Наслідуючи літературу буде працювати в будь-якому випадку. Ви повинні тільки визначити, на якому рівні в вашому коді notification буде створено і just load the JomSocial Core Libraries file.

require_once JPATH_ROOT . "/components/com_community/libraries/core.php" ;

Зробивши tutorial explained bellow will work just fine for your extension too

Preparing the Development Environment

1. We will assume that you"re already created community type example plugin which will be triggered when user changes its profile
Якщо ви не можете додати empty example plugin from , install it in Joomla and enable the plugin. It is named Community - Notifications Example
2. Навігація до вашого database і empty these два tables, so they dont have any records at all

A) prefix_community_notification
b) prefix_community_mailq

3. Будьте на двох двох (2) користувачах на ваших тестових роботах і знають свої ID"s

У попередніх версіях Joomla, user ID's буде завжди переглянуто з визначеного номера (62, 42) У Joomla 3, цей номер буде бути рівним, денним, зображення з нашого тестування навколишнього середовища, щоб його було певним чином.

The First Notification

Open the plugin php file which will be located в ROOT/plugins/community/example
З функцією onAfterProfileUpdate() replace the

CNotificationLibrary:: add ($cmd, $actor, $target, $subject, $body, $template, $params);

Як показано на прикладі, notification add api have 7 parameters

  • $cmd - це notification type. Ви можете додати всі зміни типів в цьому файлі. ROOT/components/com_community/libraries/notificationtypes.php starting from, or line 53. We recommend using system_messaging notification type.
  • $actor - is the person who carry out the action
  • $target - це людина, або група людей, які будуть отримувати повідомлення
  • $subject - is notification subject, in both, notification popup window and the email title
  • $body - is the body of email notification message
  • $template - якщо ви потребуєте конкретний template для використання, ви можете визначити його. Іншийwise, цей параметр може бути empty
  • $params - custom defined parameters
  • Knowing all this, lets define the variables we will use
    Change your plugin code to:

    $user = CFactory:: getUser(); $cmd = "system_messaging"; // first param, тип діяльності $actor = $user -> id ; //second param - get the id of $actor $target = "965" ; // Third param. Who receive notification? У нашому середовищі, його admin user with id 965. На вашому environment, ви будете найбільш добре, щоб отримати ID від вашого об'єкта або від array of users. $subject = "Notification Subject" ; // Subject of both, email and popup notifications $body = ; // Body message in emails. $template = ""; // Якщо ви потрібні для використання specific jomsocial template file, ви можете define it here. $params = new CParameter("") ; // We want to create an additional params object, and assign data to it, without having to formally define a class CNotificationLibrary:: add ( $cmd , $actor , $target , $subject , $body , $template , $params ) ;

    Новий підпис з будь-яким користувачем і зміна profile information. Lets go to database to see what happened.
    Navigate to prefix_community_notifications table and observe the new record

    Navigate to prefix_community_mailq table, і бачите новий рекорд

    Congratulations! - Ви успішно створили свою першу пряму власні notification, які були розповсюджені за допомогою електронної пошти та міжнародного JomSocial notification system


    Potential Code Bloat

    Above example is fine, and it works, але це не є спільним для використання це як це. Instead, it could be written like this

    $actor = CFactory:: getUser(); $params = new CParameter("") ; CNotificationLibrary:: add ( "system_messaging" , $actor -> "This is the notification body message" , "" , $params ) ;

    Це є дуже чутливим і підготовленим до тих пір, коли basically doing absolutely самої thing as a code shown above.

    Custom Notification Parameters

    Примітка API може бути розширена з будь-яким рівнем для вас, щоб бути прийнятим.
    Ці рекомендації можуть бути прописані до її email template, notification, і of course, language file.

    $actor = CFactory:: getUser(); $link = "http://www.google.com"; $params = new CParameter("") ; $params -> set ("actor", $actor -> getDisplayName()); // can be used as (actor) tag $params -> set ("actor_url", "index.php?option=com_community&view=profile&userid=". $actor -> id); // Link for the (actor) tag $params -> set("url", $link); //url of the whole activity. Використовується, коли їзда над avatarом в notification window. Можна використовувати як (url) tag in outgoing emails too. Make sure that you have defined $link variable:) CNotificationLibrary:: add ( "system_messaging" , $actor -> id , "965" , "Notification Subject" , "Цей є повідомлення повідомлень message" , "" , $params ) ;

    • $params = новий CParameter( ); - Ви будете створювати новий персоналізований об'єкт, і оцінити його, без будь-якого умовно визначеного класу.
    • $params->set("actor", $actor->getDisplayName()); - Your notification should always have an actor. Цей парадокс може бути прописаний до мітки як (actor) tag. У notification window, it defines the user that carries an action.
    • $params->set("actor_url", "index.php?option=com_community&view=profile&userid=" . $actor->id); - Actor URL is usually the url of an actor. In notification popup, it adds the link to the (actor) element
    • $params->set("url", $link); - Це є найбільш важливим paramater, що ви повинні бути належним чином. У notification window, ця парам використовується за допомогою зображення. У електронній пошті, це все, що місце, де діяльність відбувається.

    Для цього прикладу, ми будемо встановити variable $link to lands on www.google.com so you can see how it works

    Adding Language String and Use Params

    Маючи params, як тільки набір є доступним для використання в наших мовних файлах як добре.
    Lets define the language keys by altering the " CNotificationLibrary::add() API

    CNotificationLibrary:: add ( "system_messaging" , $actor -> id , "965" , JText:: sprintf ("PLG_COMMUNITY_EXAMPLE_SUBJECT" ) , JText:: sprintf ("PLG_COMMUNITY_EXAMPLE_BODY" ), "

    The language file should look like this

    PLG_COMMUNITY_EXAMPLE_SUBJECT = "(actor) updated profile" PLG_COMMUNITY_EXAMPLE_BODY = "Hi Admin \n Це є електронною поштою для того, щоб (actor) updated profile \n\n Якщо ви хочете, щоб Google, click here \n (url)" _QQ_">(url)"

    У цьому прикладі, ми використовуємо tag (actor) and (url) для прослуховування ваших дзвінків, notification, і email templates. Lets see how does that look.
    У повідомленні повідомлень, коли ходьба над avatarом, повідомити про (url) param клацнути в і зняти link to google over avatar. It is intentional , because we made it that way:)


    ]

    У той самий window, коли ходьба над actor link. This is the part where (actor) echoed the user that carries an action, while (actor_url)" taken care that object is linked properly


    Lets see what happens in the email queue


    І, наприкінці, поточний електронний лист, що є для отримання кінцевого користувача


    Success
    Till now, we created three (3) parameters that are successfully used in notification window, and emails.

  • (actor) - Відкрийте username of the user which carries the action
  • (actor_url) - Gives the attribute to the (actor)
  • (url) - Це не mandatory, але ви повинні будь-який він у вашій заяві. Це є головною URL-адресою, де рішення, що ми не зараховані про happened.
  • По-перше, ви можете define "

    • (target) - if you need it
    • (target_url) if you need it in your notification.
    • (title) - Commonly used to refer to object that generated notification. Example: "User X оновлений фото в Album Y ." Album Y is title here
    • (title_url) - Як з попередньою цією адресою, що генерує повідомлення.
    • (Message) - Цей парадокс може бути використаний для набору (і echo) message in body of JomSocial email.
    3.3K

    Виведення повідомлень користувачеві - досить поширена дія, яку має виконувати веб-додаток. Воно може відбуватися при обробці форм, це можуть бути повідомлення про помилки, а також повідомлення, які говорять, що треба зареєструватися, коли користувач намагається отримати доступ до обмеженої частини сайту та в багатьох інших випадках.

    Дуже часто створення та виведення повідомлень рознесено за різними HTTP-запитами. Як правило, зручно буває використовувати редирект після обробки форм (щоб уникнути проблем з кнопками Back і Refresh), але в той же час природний момент для створення повідомлення - це саме момент обробки форм і здійснення дій, що його супроводжують. Чому? Уявіть, що текст повідомлення повинен виглядати приблизно так: "Кількість одиниць товару 'Килимок для миші', що замовляються, успішно змінено з 7 до 12". Після редиректу, можливо, на зовсім іншу з погляду функціональності сторінку, це буде зайва головна - визначити, що було до цього.

    Найчастіше повідомлення виводять саме в POST-запиті, який займається обробкою форми - це погано, написи "ця сторінка застаріла" псують життя (коли користувачеві заманеться спробувати кнопку Back).

    Хтось використовує редирект, махнувши рукою на доброзичливі повідомлення.

    У той же час є простий і очевидний спосіб зробити життя кращим. Незважаючи на очевидність, мені чомусь не доводилося бачити, щоб хтось його використав – принаймні коли я дивився чужі вихідники.

    Отже, маємо проблему – повідомлення має "жити" у різних запитах. Нам потрібен механізм передачі тексту повідомлення на сторінку, яка має виводити його. Ви вже, мабуть, згадали про сесію.

    Так, взагалі-то ви маєте рацію. Інші способи, наприклад, через глобальну змінну, не дозволяють зберегти дані у разі, коли використовується редирект (зауваження Максима Науменка). Плюс ще я зазвичай роблю так, щоб кожен екран у додатку мав можливість поряд з іншою інформацією виводити повідомлення, які були сформовані на попередніх екранах. Це зручно, тому що не потрібно готувати окремі екрани для виведення повідомлень, а користувачеві не доведеться ще раз клацати мишею. Але, щоправда, тут треба подумати дизайнеру - виділити область, де б з'являлися повідомлення.

    Ідея дуже проста, і її можна реалізувати за допомогою кількох класів.

    Перше, що спадає на думку - створити клас Message, який би, власне, і був повідомленням на нашій нехитрій схемі класів. Повідомлення має вміти зберігати себе у сесії, а також виводити себе на екран.

    class Message ( /** * Зміст повідомлення. */ var $content; /** * Конструктор для ініціалізації тексту повідомлення. * * @param content зміст повідомлення */ function Message($content) ( $this->content = $content ; ) /** * Запис повідомлення на сесію. */ function send() ( $_SESSION["session_messages"] = $this->content; ) /** * Виведення повідомлення на сторінку. " - " . $this->content .
    "; } }

    Для доступу до сесії використовується змінна $_SESSION.

    Зауважу, що $_SESSION - це масив, ми використовуємо лише один елемент цього масиву з індексом 'session_message'.

    В даному випадку маємо справу з "масивом масивів" - те, що ми зберігаємо в елементі 'session_message', є масивом, це і є список повідомлень, що передаються (їх, звичайно, може бути кілька).

    Якщо ви не змогли намацати нитку, час освіжити в пам'яті розділи мануалу, присвячені сесіям і масивам.

    У вас може виникнути питання. А навіщо тут потрібні класи? Цілком можна було обійтися двома функціями. Але давайте заглянемо далі. Нам може знадобитися створювати повідомлення з різними типами (info, error, warning), визначати адресатів повідомлень.

    Зауважте, що зараз у сесію кладеться сам об'єкт, лише текст повідомлення. ООП дозволяє нам надалі поміняти поведінку методу send(), не змінюючи клієнський код, який звертається до цього методу (наприклад, у майбутньому в сесію можна повністю записувати об'єкт Message, якщо в ньому буде багато полів).

    Уявімо, що ми це робили б за допомогою функцій. Напевно, у нас була б функція message_send($txt), ще була б функція message_to_page($txt). Тепер треба додати можливість різної поведінки різних видів повідомлень. Виклики функцій змінюються: message_send($txt, $kind), message_to_page($txt, $kind). Потрібно прочесати весь код програми в пошуках таких функцій, роблячи виправлення.

    Цього можна уникнути, заздалегідь передбачаючи ситуацію, представивши повідомлення як асоціативного масиву: $msg[‘txt’], $msg[‘kind’], тоді у викликах функцій буде лише одне параметр. Відчуваєте, як це прагне перетворитися на клас?

    Так ось, ОВП дає можливість дозволити собі розкіш не продумувати все заздалегідь.

    Наступний клас - Inbox - саме для цього призначений.

    class Inbox ( /** * Масив повідомлень, що надійшли. */ 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 = новий Message($messages[$i]); ) ) /* очищаємо масив повідомлень */ $_SESSION["session_messages"] = array(); ) /** * Виводимо на сторінку вміст Inbox. */ function toPage() ( $co = sizeof($this->messages); if ($co > 0) ( echo "Повідомлення від системи:
    "; ) for ($i = 0; $i< $co; $i++) { $this->messages[$i]->ToPage(); ) ) )

    Давайте перевіримо нашу систему повідомлень.

    Створимо дуже простий приклад, який у відповідь на відправлення форми повідомлятиме кількість секунд у поточній хвилині.

    Всю роботу з масивами та сесіями ми сховали всередині класів, і кінцевий код виглядає просто та красиво.

    Створіть каталог на веб-сервері, потім створіть у ньому ці три файли і спробуйте у роботі. Зауважте, проблем із кнопками Back і Refresh не виникає.

    А тепер уявіть, що ви створюєте складний портал, де, як правило, на сторінках є кілька блоків, і кожен може містити в собі окрему програму.

    Тут ми зустрічаємо дві труднощі:

    * Хотілося б, щоб список повідомлень з'являвся у певній частині сторінки, і ви вже підібрали хороше місце для цього.
    Проблема в тому, що треба запустити команду $inbox->toPage() саме в той момент, який відповідав би положенню списку повідомлень на сторінці. Якщо ми захочемо змінити положення цього списку, доведеться лізти в код, але погано завжди для цього змінювати каркас порталу. Найкращим рішенням було б зробити висновок повідомлень у вигляді окремого модуля, про який відомо лише, що його треба підключити до каркаса.
    Тобто звільнитися від суворої послідовності запуску модулів. Справді, якщо результат роботи виведення Inbox не залежить від роботи системи (на даному кроці – всі дані у нас вже є у сесії), то навіщо зайві складності?
    * Щоб підтримувати зовнішній вигляд (дизайн) списку повідомлень, треба дбати про HTML-код, який у нас зашитий у методах toPage() класів Message та Inbox. Як правило, доведеться змінювати PHP-код для того, щоб змінити дизайн.

    Щоб спробувати вирішити першу проблему, можна створити буфер, в якому зберігався результат роботи виведення Inbox.

    Можливо, ми ще матимемо кілька схожих (на Inbox) речей, і треба створити систему буферів. Для того, щоб не переплутати де чийсь висновок, ми, напевно, прийдемо до іменування буферів. У нас десь зберігатиметься послідовність, відповідно до якої має відбуватися виведення буферів – бажано у зовнішньому файлі, щоб легше було вносити зміни.

    Вже ця спроба рішення дає нам ідею використовувати XML як зберігання проміжних даних. А використання стилів XSLT допоможе подолати і другу проблему.

    Я не зупинятимусь на тому, що таке XML, і що таке XSLT. Якщо ви не знаєте цих речей, zvon.org стане гарною відправною точкою для вивчення.

    Ідея у тому, щоб у методах toPage() формувати не HTML-код, а XML структуру. Документ сторінки буде створюватися у вигляді стрінга з XML-кодом (він буде служити як "буфер"), а на останній стадії роботи скрипту ми будемо використовувати XSL-трансформацію.

    Для початку уявімо, що має бути результатом роботи основної частини коду.

    minute 57 second: 45

    Що це таке – здогадатися досить просто – два повідомлення та форма. Зауважте, PHP-скрипт повинен підготувати лише такий стрінг – він дуже простий. Причому порядок проходження основних тегів неважливий - можна поставити спочатку, наприклад, як буде зручно програмісту. Як це реалізувати? Можна, майже нічого не змінюючи, використовувати output buffering, замість HTML коду виводити XML, а в кінці просто захопити виведення в стрінг. Але тоді ми втратимо у гнучкості - наприклад, хочеться іноді виводити налагоджувальну інформацію прямо на сторінку (за допомогою echo). У той же час, розробники PHP працюють над DOM-модулем, який пропонує більш розвинений спосіб створення та передачі деревоподібних документів. Якщо ми захочемо впровадити DOM, то доведеться перекроювати всі програми, змінюючи виведення стрингів на створення DOM-елементів. Тому я віддаю перевагу зберігати XML-подання об'єктів усередині самих об'єктів, послідовно збираючи загальний XML-документ. Це не так складно, потрібна лише невелика модифікація. Ви побачите, що такий прийом не прив'язаний жорстко до конкретного способу зберігання даних XML, і це дозволить здійснити перехід до використання DOM "малою кров'ю". Насамперед зауважимо, що у кожного нашого об'єкта є метод toPage(). Ця схожість має нас змусити задуматися про те, щоб запровадити новий спільний батьківський клас. Нехай кожен клас, який здатний створювати шматочки XML-документа для сторінки, успадковуватиметься від класу, який дбатиме про XML-подання об'єкта. Назвемо його Outputable.

    class Outputable ( /** * XML контейнер (стрінг). */ var $output = ""; /** * Віддати вміст контейнера та очистити контейнер. * * @return стринг з XML-даними */ function getOutput() ( $ out = $this->output; $this->output = ""; return $out; ) /** * Додати порцію до вмісту контейнера. ->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; ) /** * Запис повідомлення на сесію. ( $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 = новий 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

    Головне нововведення - в об'єкті $global_content, назва якого говорить сама за себе. У цьому випадку він належить класу Outputable, у реальних завданнях ви, напевно, створите окремий клас для контенту сторінки.

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

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

    XSLT Example

    message

    Чого ж ми досягли?

    Насамперед, можна сміливіше братися за складні проекти – забезпечено реальну незалежність модулів. Порядок укладання результатів на сторінку контролюється за допомогою зовнішнього XSL-шаблону і не залежить від порядку запуску модулів.

    Будь-який модуль, який генерує XML-дані як результат своєї роботи, може бути використаний у проекті. До речі, це одна з переваг перед template-движками, в яких створення даних полягає в послідовності виклику методів (assign і т.п.) конкретного движка, на яких немає загального стандарту.

    Ще одна перевага – легкість налагодження. Якщо ви запустите скрипт, то помітите, що на кожній сторінці є debug-висновок - XML-прообраз, який дуже спрощує налагодження додатків.

    Над чим ще треба подумати - як створювати об'єкти-повідомлення. Не завжди зручно використовувати новий безпосередньо в клієнтському коді. Але це тема для окремої статті.

    Насамкінець, галопом про перспективи:

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

    У КП і БУС починаючи з версії 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, // модуль запросив відправлення повідомлення " " => "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 травня.

    Краще чорна смуга, ніж біла гарячка.

    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") $("#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, тип: "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 = новий 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; (!empty($_POST["message_id"])) ( mysql_query("DELETE FROM comment WHERE id=".$_POST["message_id"]); ) break; ) )

    До цього моменту в даному курсі закладено основу нашого плагіна, визначено користувальницький 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 панелі адміністрації.

    Для цього ми збираємося розширити роботу, проведену у минулому уроці і почнемо звідси.

    Успішні повідомлення

    Оскільки ми розпочали з успішних повідомлень у попередньому уроці, давайте з ними і продовжимо. Тепер у нас є жорстко кодований метод, який відображає єдиний прийом: