# Implementing custom storage

To implement a custom backend, you need to create your own implementation of the mindplot.PersistenceManager class. 

Here is an example skeleton::

function createStorageManager(mindplot) {
    mindplot.RestStorageManager = new Class({
        Extends:mindplot.PersistenceManager,
        initialize: function(url) {
            this.parent();
            this.backendUrl = url;
        },

        saveMapXml : function(mapId, mapXml, pref, saveHistory, events) {
            var url = this.backendUrl  + mapId;
            var xmlRequest = new Request({
                url: url,
                method: 'post',
                async: false,
                onSuccess: function(responseText) {
                    events.onSuccess();        
                }, 
                onError: function (text, error) {
                    console.log("Error saving mindmap to: " + url, text, error);
                    events.onError();
                }
            });
            xmlRequest.send();
        },

        loadMapDom : function(mapId) {
                var xmlRequest = new Request({
                    url: this.backendUrl  + mapId,
                    method: 'get',
                    async: false,
                    onSuccess: function(responseText) {
                        xml = responseText;
                    }
                });
                xmlRequest.send();

                // If I could not load it from a file, hard code one.
                if (xml == null) {
                    throw "Map could not be loaded";
                }
                var parser = new DOMParser();
                return parser.parseFromString(xml,  "text/xml");
           }

    }
    );
    return new mindplot.RestStorageManager(url);
}


In your script for loading the mindmap you add a call to the callback into the loadcomplete method::

     $(document).addEvent('loadcomplete', function(resource) {
               //Asset.javascript("{{ asset('bundles/fpgadmin/js/FpgMindmapPersistence.js')}}");
               // Options has been defined in by a external ile ?
               var options = {
                    'persistenceManager' : createStorageManager(mindplot, "http://localhost/my/rest/interface");    
                    viewPort: {
                        height: parseInt(window.innerHeight - 70), // Footer and Header
                        width:  parseInt(window.innerWidth)
                    },
                    size : {
                    height: parseInt(screen.height),
                    width:  parseInt(screen.width)
                },
                "readOnly":false,
                "zoom":1.3,
                "container":"mindplot"
                "mapId" : "myMapId"
               };
               var designer = buildDesigner(options);
               var persistence = mindplot.PersistenceManager.getInstance();
               var mindmap;
               try {
                   mindmap = persistence.load(mapId);
               } catch(e) {
                   // If the map could not be loaded, create a new empty map...
                   mindmap = mindplot.model.Mindmap.buildEmpty(mapId);
               }
               designer.loadMap(mindmap);
           });
