Немного о компьютере

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

в моем Zend-приложении я пишу немного API для мобильных приложений. Чтобы упростить работу с мобильными разработчиками, я использую Swagger. До сих пор все работает отлично, за исключением одного GET-запроса.

Когда я вызываю /user/messages/{sessionToken}? NumMessages = {numMessages} & pageNr = {pageNr} в браузере, я получаю результаты, которые хочу, но когда я пытаюсь позволить Swagger выполнить этот запрос, передается только sessionToken. Я попробовал эти аннотации для Swagger:

/** * @SWG\Api(path="/user/messages/{sessionToken}?numMessages={numMessages}&pageNr={pageNr}", * @SWG\Operation(* method="GET", * summary="Gets messages paged", * notes="", * type="string", * nickname="getUsermessagesPaged", * authorizations={}, * @SWG\Parameter(* name="sessionToken", * description="The token from an active user session", * required=true, * type="string", * paramType="path", * allowMultiple=true *), * @SWG\Parameter(* name="numMessages", * description="number of messages on page (numMessages & pageNr are ignored if not both are set)", * required=true, * type="string", * paramType="query", * allowMultiple=true *), * @SWG\Parameter(* name="pageNr", * description="pagenumber (numMessages & pageNr are ignored if not both are set)", * required=true, * type="string", * paramType="query", * allowMultiple=true *), * @SWG\ResponseMessage(code=200, message="json {messages => "user_messages"}"), * @SWG\ResponseMessage(code=400, message="json with error "not logged in"") *) *) */

Кто-нибудь видит мою ошибку?

Любая помощь приветствуется.

С уважением

Обновление. Как было предложено, я сменил оба paramTypes на "query" и изменил путь:

@SWG\Api(path="/user/messages/{sessionToken}",

но он не работал истребитель.

xdebug в eclipse PDT показывает:

RequestURI => /ias/public/user/messages/{sessionToken}

QueryParams => Zend\\Stdlib\\Parameters - *ArrayObject*storage => Array - =>

чванство JSON:

{ "apiVersion": "1.0.0", "swaggerVersion": "1.2", "apis": [ { "path": "\/user", "description": "Operations about users" } ], "info": { "title": "Mobile access api", "description": "This is the xxx mobile access api.", "termsOfServiceUrl": null, "contact": "xxx", "license": null, "licenseUrl": null, "_partialId": null, "_partials": , "_context": { "comment": "\/**\ * @SWG\\Info(\ * title="Mobile access api",\ * description="This is the xxx mobile access api.",\ * contact="xxx",\ *)\ *\/", "line": 3 } } }

Вот т выход /user:

{ "basePath": "http://localhost/ias/public", "swaggerVersion": "1.2", "apiVersion": "1.0.0", "resourcePath": "/user", "apis": [ { "path": "/user/balance/{sessionToken}", "operations": [ { "method": "GET", "summary": "Gets userbalance", "nickname": "getUserdata", "type": "string", "parameters": [ { "paramType": "path", "name": "sessionToken", "type": "string", "required": true, "allowMultiple": false, "description": "The token from an active user session" } ], "responseMessages": [ { "code": 200, "message": "json {balance => "user_balance"}" }, { "code": 400, "message": "json with error "not logged in"" } ], "notes": "", "authorizations": {} } ] }, { "path": "/user/login", "operations": [ { "method": "POST", "summary": "Logs user into the system", "nickname": "loginUser", "type": "string", "parameters": [ { "paramType": "form", "name": "email", "type": "string", "required": true, "allowMultiple": false, "description": "The user email for login" }, { "paramType": "form", "name": "password", "type": "string", "required": true, "allowMultiple": false, "description": "The password for login in clear text" } ], "responseMessages": [ { "code": 200, "message": "json with session_id, user_id, user_balance" }, { "code": 400, "message": "json with error "no user with given email and password"" }, { "code": 400, "message": "json with error "invalid input"" }, { "code": 400, "message": "json with error "no post request"" } ], "notes": "", "authorizations": {} } ] }, { "path": "/user/logout", "operations": [ { "method": "POST", "summary": "Logs user out", "nickname": "logoutUser", "type": "string", "parameters": [ { "paramType": "form", "name": "sessionToken", "type": "string", "required": true, "allowMultiple": false, "description": "The token from an active user session" } ], "responseMessages": [ { "code": 200, "message": "json {result => "deleted"}" }, { "code": 400, "message": "json with error "no user_session with given sid"" }, { "code": 400, "message": "json with error "invalid input"" }, { "code": 400, "message": "json with error "no post request"" } ], "notes": "", "authorizations": {} } ] }, { "path": "/user/messages/{sessionToken}", "operations": [ { "method": "GET", "summary": "Gets new messages", "nickname": "getUsermessages", "type": "string", "parameters": [ { "paramType": "path", "name": "sessionToken", "type": "string", "required": true, "allowMultiple": false, "description": "The token from an active user session" } ], "responseMessages": [ { "code": 200, "message": "json {messages => "user_messages"}" }, { "code": 400, "message": "json with error "not logged in"" } ], "notes": "", "authorizations": {} }, { "method": "GET", "summary": "Gets messages paged", "nickname": "getUsermessagesPaged", "type": "string", "parameters": [ { "paramType": "path", "name": "sessionToken", "type": "string", "required": true, "description": "The token from an active user session" }, { "paramType": "query", "name": "numMessages", "type": "string", "required": true, "description": "number of messages on page (numMessages & pageNr are ignored if not both are set)" }, { "paramType": "query", "name": "pageNr", "type": "string", "required": true, "description": "pagenumber (numMessages & pageNr are ignored if not both are set)" } ], "responseMessages": [ { "code": 200, "message": "json {messages => "user_messages"}" }, { "code": 400, "message": "json with error "not logged in"" } ], "notes": "", "authorizations": {} } ] }, { "path": "/user/userdata", "operations": [ { "method": "POST", "summary": "Posts userdata", "nickname": "postUserdata", "type": "string", "parameters": [ { "paramType": "form", "name": "sessionToken", "type": "string", "required": true, "allowMultiple": false, "description": "The token from an active user session" }, { "paramType": "form", "name": "password", "type": "string", "required": false, "allowMultiple": false, "description": "new password" }, { "paramType": "form", "name": "address", "type": "string", "required": false, "allowMultiple": false, "description": "new address" }, { "paramType": "form", "name": "housenr", "type": "string", "required": false, "allowMultiple": false, "description": "new housenr" }, { "paramType": "form", "name": "zip", "type": "string", "required": false, "allowMultiple": false, "description": "new zip" }, { "paramType": "form", "name": "city", "type": "string", "required": false, "allowMultiple": false, "description": "new city" }, { "paramType": "form", "name": "email", "type": "string", "required": false, "allowMultiple": false, "description": "new email" } ], "responseMessages": [ { "code": 200, "message": "json {user => "userdata"}" }, { "code": 400, "message": "json with error "not logged in"" } ], "notes": "", "authorizations": {} } ] }, { "path": "/user/userdata/{sessionToken}", "operations": [ { "method": "GET", "summary": "Gets userdata", "nickname": "getUserdata", "type": "string", "parameters": [ { "paramType": "path", "name": "sessionToken", "type": "string", "required": true, "allowMultiple": false, "description": "The token from an active user session" } ], "responseMessages": [ { "code": 200, "message": "json {user => "userdata", user_limit => "userLimits"}" }, { "code": 400, "message": "json with error "not logged in"" } ], "notes": "", "authorizations": {} } ] } ], "produces": [ "application/json" ] }

Кажется, что ошибка, что мой swagger-ui не отправляет никаких параметров запроса? Вот пример с одним параметром query-param, sessionToken: (контролируется FireBug 2.0.6)

GET /ias/public/user/balance HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0 Accept: application/json Accept-Language: de,en-US;q=0.7,en;q=0.3 Accept-Encoding: gzip, deflate Content-Type: application/json Referer: http://localhost/ias/swagger/ Cookie: __utma=111872281.581414660.1366700677.1394721873.1394723866.255; uvts=sB5Dda3cZBNdaTk; searchpanel-close=set Connection: keep-alive

Ответ был:

HTTP/1.1 400 Bad Request Date: Tue, 25 Nov 2014 14:58:20 GMT Server: Apache/2.4.9 (Win32) PHP/5.5.12 X-Powered-By: PHP/5.5.12 Content-Length: 25 Connection: close Content-Type: application/json; charset=utf-8

Ответ был верным, потому что не было передано sessionToken.

Это требует работы, но это не происходит от swagger-ui:

GET /ias/public/user/balance?sessionToken=HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: de,en-US;q=0.7,en;q=0.3 Accept-Encoding: gzip, deflate Cookie: __utma=111872281.581414660.1366700677.1394721873.1394723866.255; uvts=sB5Dda3cZBNdaTk; searchpanel-close=set Connection: keep-alive

В конце концов я понял: лучше жены никого не найти. Осталось только найти жену

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; } }

Overview

The built in notification system, first ever in Joomla, allows your app to keep the user (or group of users) informed about various different events. Think of notifications as important alerts that user would be interested to read and keep track of it.
Notifications can be generated everywhere. In your component or plugins and later displayed inside JomSocial notification system.
This tutorial will show you how, but since we do not have idea of any third-party component we could use:) the examples will be done on a community plugin which will be triggered at onAfterProfileUpdate event
If you don"t know how to create plugin which will be triggered on this event, we suggest you to check this guide

Implementing it in your component anyway

As stated in overview of this tutorial, we will generate notifications using community plugin.
You will most likely want to create notifications inside your component, or your plugin. The following tutorial will work in any of this cases. You only need to determine at what point in your code the notification will be created and just load the JomSocial Core Libraries file.

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

Following the 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
If not, you can download empty example plugin from , install it in Joomla and enable the plugin. It is named Community - Notifications Example
2. Navigate to your database and empty these two tables, so they dont have any records at all

A) prefix_community_notification
b) prefix_community_mailq

3. Have at least two (2) users at your test sites and know their ID"s

In earlier versions of Joomla, user ID"s have always started from specified number (62, 42) In Joomla 3, this number will be random, hence, the picture of our testing environment because it will definitely be different at your end.

The First Notification

Open the plugin php file which will be located in ROOT/plugins/community/example
Within the function onAfterProfileUpdate() replace the

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

As shown on the example, notification add api have 7 parameters

  • $cmd - is the notification type. You can see all notifications types in this file. ROOT/components/com_community/libraries/notificationtypes.php starting from, or around line 53. We recommend using system_messaging notification type.
  • $actor - is the person who carry out the action
  • $target - is the person, or group of people that will receive notification
  • $subject - is the notification subject, in both, notification popup window and the email title
  • $body - is the body of email notification message
  • $template - if you need specific template to use, you can define it here. Otherwise, this parameter can be 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, type of activity $actor = $user -> id ; //second param - get the id of $actor $target = "965" ; // third param. Who receive notification? In our dev environment, its admin user with id 965. At your environment, you will most likely want to get the ID from your object or from array of users. $subject = "Notification Subject" ; // Subject of both, email and popup notifications $body = ; //Body message in emails. $template = "" ; // If you need to use specific jomsocial template file, you can 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 ) ;

    Now login with any user and change the 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, and see the new record

    Congratulations! - You have successfully created your first very own notification which has been dispatched via email and internal JomSocial notification system


    Potential Code Bloat

    Above example is fine, and it works, but generally it is not recommended to use it like that. 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 ) ;

    This is much cleaner and easier to follow while basically doing absolutely same thing as a code shown above.

    Custom Notification Parameters

    A notification API can be extended with any param you would like to add.
    These params can be passed to either email template, notification, and 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. Used when hovering over avatar in notification window. Can be used as {url} tag in outgoing emails too. Make sure that you have defined $link variable:) CNotificationLibrary:: add ( "system_messaging" , $actor -> id , "965" , "Notification Subject" , "This is the notification body message" , "" , $params ) ;

    • $params = new CParameter(); - We want to create a new params object, and assign data to it, without having to formally define a class.
    • $params->set("actor", $actor->getDisplayName()); - Your notification should always have an actor. This param can be passed to template as {actor} tag. In 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); - This is most important paramater you must always set properly. In notification window, this param is used over the avatar image. In email notification, it echoes the location where activity occurred.

    For this example, we will set variable $link to lands on www.google.com so you can see how it works

    Adding Language String and Use Params

    Having the params we just set are available to be used in our language files as well.
    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" ) , "" , $params ) ;

    The language file should look like this

    PLG_COMMUNITY_EXAMPLE_SUBJECT = "{actor} updated profile" PLG_COMMUNITY_EXAMPLE_BODY = "Hi Admin \n This is the mail to inform you that {actor} updated profile \n\n If you want to go to Google, click here \n a href=" _QQ_"{url}" _QQ_">{url}"

    In this example, we have used the tag {actor) and {url} to pass the data to both, notification, and email templates. Lets see how does that look.
    In notification window when hovering over avatar, notice the {url} param kicked in and adds the link to google over avatar. It is intentional , because we made it that way:)


    ]

    In the same window, when hovering over 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


    And finally, the actual email that is sent to end user


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

  • (actor) - Returns the username of the user which carries the action
  • {actor_url} - Gives the attribute to the {actor}
  • {url} - Is not mandatory, but you should always have it in your notification. It is the main url where action that we are notified about happened.
  • Similarly, you can define "

    • {target} - if you need it
    • {target_url} if you need it in your notification.
    • (title) - Commonly used to refer to an object that generated notification. Example: "User X posted new photo in Album Y ." Album Y is title here
    • {title_url} - As with previous ones, the url of an object that generated notification.
    • {message} - This param can be used to set (and echo) the message in the body of JomSocial email.

    Похожие публикации