Javascript.Объекты

Материал из Hivext Wiki

Перейти к: навигация, поиск

Работа с объектами

В настоящем уроке продолжим рассматривать примеры использования сервиса Структур на Javascript.

Смотрим документацию

Документация сервиса Структуры.
Для урока выбраны методы:

  • CreateObject - создание объекта;
  • SetProperty - установить значение свойства;
  • GetProperty - получить значение свойства;
  • GetObject - получить объект заданного типа по идентификатору;
  • GetObjects - получение массива объектов заданного типа;
  • GetObjectsByCriteria - получение массива объектов заданного типа и критерия;
  • DeleteObjectsByCriteria - удалить объекты заданного типа и критерия.

Важно обратить внимание на особенности работы c объектами:

  • Все объекты создаются для заданного идентификатора приложения (APPID);
  • Права читать, редактировать и удалять объекты имеет пользователь который создал данный объект;
  • Физически создание нового объекта это новая запись в базе данных.

Теоретическая часть закончена, переходим к практической.

Приступаем к разработке

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

В данном примере воспользуемся гостевым аккаунтом, который используется для тестов.

Разработчик: guest@guest.com
Пароль: guest

Для разработчика guest@guest.com уже создан идентификатор приложения (APPID): 9106d759b6a3ae4b1a790d7b3b78fb23.
Этот идентификатор можно использовать на любом домене. Итак у нас все есть чтобы перейти непосредственно к созданию новых объектов.

Работаем с объектами

// Идентификатор приложения для которого будем создавать объекты.
var sAppid = "9106d759b6a3ae4b1a790d7b3b78fb23";

var sSession; // Здесь будем хранить идентификатор сессии пользователя.

var nUid; // Здесь будем хранить идентификатор пользователя.

var sName; // Здесь будем хранить имя пользователя.

//
// Начнем сеанс пользователя.
//

Users.Authentication.Signin(sAppid, "guest@guest.com", "guest", function(oResponse) {

    if(oResponse.result === 0) { // Аутентификация прошла успешно.

        // Сохраняем информацию о пользователе.
        sSession = oResponse.session;
        sUid = oResponse.uid;
        sName = oResponse.name;

        //
        // До начала работы с объектами необходимо подготовить нужный тип данных.
        // Пример подготовки нового типа данных для хранения сообщений пользователей.
        //
        // var oFields = {
        //    Uid : "int", - идентификатор автора
        //    Name : "string", - имя автора
        //    Subject : "string", - тема сообщения
        //    Content : "string" - текст сообщения
        // }
        //
        // var sFields = toJSON(oFields);
        //
        // Создаем новый тип данных Post с полями указанными в строке sFields.
        // Data.Base.DefineType(sAppid, sSession, "Post", sFields, function(oResponse) {});
        //

        //
        // Приступаем к созданию объекта типа Post.
        //

        // Значения свойств объекта можно передать в формате JSON сразу при создании объекта.

        var oData = {
            Uid : sUid,
            Name : sName,
            Subject : "Тема поста",
            Content : "Здесь можно разместить много текста или тегов и текста"
        }

        var sData = toJSON(oData);

        //
        // Создаем объект типа Post.
        //

        Data.Base.CreateObject(sAppid, sSession, "Post", sData, function(oResponse) {
            if(oResponse.result === 0) { // Объект создан успешно.
                // oResponse.id - идентификатор объекта.

                //
                // Значения свойств объектов также можно задавать через метод SetProperty.
                //

                Data.Base.SetProperty(sAppid, sSession, "Post", oResponse.id,
                     "Subject", "Новая тема", function(oResponse) {
                    if(oResponse.result === 0) { // Свойство установлено.
                    }
                });

                //
                // И получать через метод GetProperty.
                //

                Data.Base.GetProperty(sAppid, sSession, "Post", oResponse.id,
                     "Name", function(oResponse) {
                    if(oResponse.result === 0) { // Свойство получено.
                        // oResponse.value - значение свойства.
                    }
                });
            }
        });

        //
        // Рассмотрим несколько вариантов выборки объектов.
        //

        // Все методы выборки (кроме GetObject) содержат необязательные параметры from и count,
        // они используются для постраничной выборки объектов.
        // Если реальное число объектов меньше чем задано в count,
        // то вернется количество объектов попавшее в диапазон from, from + count.

        //
        // Метод GetObject - возвращает объект указанного типа и идентификатора.
        //

        Data.Base.GetObject(sAppid, sSession, "Post", nId, function(oResponse) {
            if(oResponse.result === 0) { // Объект выбран успешно.
                // oResponse.object - объект.
            }
        });

        //
        // Метод GetObjects - возвращает объекты указанного типа.
        // В примере ниже выбирается 10 объектов типа Post с индекса 0.
        //

        Data.Base.GetObjects(sAppid, sSession, "Post", 0, 10, function(oResponse) {
            if(oResponse.result === 0) { // Объекты выбраны успешно.
                // oResponse.objects - массив объектов.
            }
        });

        //
        // Метод GetObjectsByCriteria - возвращает объекты указанного типа и критерия.
        // Для критериев используется SQL подобный синтаксис.
        //

        //
        // Запросить все посты автора Joe.
        //

        sCriteria = "Name LIKE 'Joe'";

        Data.Base.GetObjectsByCriteria(sAppid, sSession, "Post", sCriteria, function(oResponse) {
            if(oResponse.result === 0) { // Объекты выбраны успешно.
                // oResponse.objects - массив объектов.
            }
        });

        //
        // Запросить все посты содержащие в теме или тексте слово hivext, без учета регистра.
        //

        sCriteria = "Subject ILIKE '%hivext%' OR Content ILIKE '%hivext%'";

        Data.Base.GetObjectsByCriteria(sAppid, sSession, "Post", sCriteria, function(oResponse) {
            if(oResponse.result === 0) { // Объекты выбраны успешно.
                // oResponse.objects - массив объектов.
            }
        });

        //
        // Удалим все объекты для типа Post.
        //

        sCriteria = "id IS NOT NULL";

        // или

        sCriteria = "id > 0";

        Data.Base.DeleteObjectsByCriteria(sAppid, sSession, "Post", sCriteria, function(oResponse) {
            if(oResponse.result === 0) { // Объекты удалены успешно.
                // oResponse.count - количество удаленных объектов.
            }
        });

        //
        // Все объекты типа также удаляются, если удаляется тип данных.
        //

        Data.Base.UndefineType(sAppid, sSession, "Post", function(oResponse) {});


        //
        // Завершим сеанс пользователя.
        //

        Users.Authentication.Signout(sAppid, sSession, function(oResponse) {});

    }

});

Функция преобразования Javascript объекта в JSON строку

String.prototype.replaceAll = function(s1, s2) { return this.split(s1).join(s2); }

function toJSON(obj) {
    switch(typeof obj) {
        case "function" : return obj.toString();
        case "string" : return "\"" + obj.replaceAll("\"", "\\\"") + "\"";
        case "object" :
        var str = "";
        if(obj == null) return "null";
        if(obj instanceof Array) {
            for (var i = 0, l = obj.length; i < l; i++) str += ", " + toJSON(obj[i])
            if (str.length > 0) str = str.substring(1);
            return "[ " + str + " ]";
        }
        for (var i in obj) str += ", " + i + " : " + toJSON(obj[i]);
        return "{ " + (str.length > 0 ? str.substring(1) : str) + " }";
    }
    return obj;
}

Личные инструменты