{"id":5,"date":"2015-04-13T17:01:00","date_gmt":"2015-04-13T15:01:00","guid":{"rendered":"https:\/\/daniel.liljeberg.io\/?p=5"},"modified":"2021-04-01T22:02:08","modified_gmt":"2021-04-01T20:02:08","slug":"data-objects-for-osclass-plugins-using-dlicore","status":"publish","type":"post","link":"https:\/\/daniel.liljeberg.io\/sv\/2015\/04\/13\/data-objects-for-osclass-plugins-using-dlicore\/","title":{"rendered":"Data Objects for Osclass plugins using dliCore"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">As mentioned&nbsp;in our&nbsp;<a href=\"https:\/\/daniel.liljeberg.io\/2015\/04\/13\/database-tables-for-osclass-plugins-using-dlicore\" target=\"_blank\" rel=\"noreferrer noopener\">previous post<\/a>&nbsp;regarding database tables for Osclass plugins written using dliCore the library offers another way to access the data stored in your tables. It was a thought that originated in an old library I did many years ago that I simplified for this case. The old approach consisted of something I called data gateways. These gateways would fill objects (that knew nothing about the back end storing the data) with data. The objects could be loaded and saved from each back end through the respective gate way. This made it quick and easy to change your code from working with the database to testing using mock-up data in xml files.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For dliCore I took parts of this an made a system that would abstract the database layer for the developer and allow them to work with objects instead. I made it so that it would not require a huge overhead and it would also keep track of the fact that objects and databases were in sync.&nbsp;By that I mean that if you add a column to your table and you don\u2019t allow it to have a default value then it must be present in the object or an exception is thrown.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here I give a very simple presentation about how to connect an object to a table. Let\u2019s use a simple messages table in a plugin called&nbsp;<strong>userMessages<\/strong>&nbsp;in our example.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Create table<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">First we create our table class.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?php\nnamespace userMessages\\Table;\n\nuse dliLib\\Db\\AbstractTable;\n\nclass MessageTable extends AbstractTable\n{\n    protected $_tableName = 't_message';\n\n    protected function _init() {\n        $this->_struct =\"CREATE TABLE IF NOT EXISTS \/*TABLE_NAME*\/ (\n        pk_i_id INT UNSIGNED AUTO INCREMENT,\n        fk_i_user_id INT UNSIGNED,\n        fk_i_sender_id INT UNSIGNED,\n        s_title VARCHAR(64) NOT NULL,\n        s_text  VARCHAR(256) DEFAULT NULL,\n        dt_date DATETIME NOT NULL,\n        PRIMARY KEY (pk_i_id),\n        FOREIGN KEY (fk_i_user_id) REFERENCES \/*TABLE_PREFIX*\/t_user (pk_i_id) ON DELETE CASCADE,\n        FOREIGN KEY (fk_i_sender_id) REFERENCES \/*TABLE_PREFIX*\/t_user (pk_i_id) ON DELETE SET NULL\n      ) ENGINE=InnoDB DEFAULT CHARACTER SET 'UTF8' COLLATE 'UTF8_GENERAL_CI';\";\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Our messages contains a id, a foreign key to the receiving&nbsp;user, a foreign key to the sending user, a title, the contents and a date time of when the message was sent. Indexes to speed up access by date etc could of course be added.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Register table<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Now we register the table with our plugin to it will be installed when the plugin is installed.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class userMessagesPlugin extends Plugin\n{\n    protected function _init() {       \n        \/* Register Tables *\/\n        $this->_registerTable('userMessages\\Table\\MessageTable', 'message');\n    }<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Creating our data object<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Now we create an object that extends&nbsp;<strong>DbModel.&nbsp;<\/strong>We tell it which table it\u2019s connected to and we give it the member variables needed to carry the data. Note that we could add more variables here than what is available in the table and add&nbsp;additional logic as well.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?php\nnamespace userMessages\\Model;\n\nuse dliLib\\Model\\DbModel;\n\nclass Message extends DbModel\n{\n    protected static $_dbTableClass = 'userMessages\\Table\\UserMessagesTable';\n\n    protected $_id        = null;\n    protected $_userId    = null;\n    protected $_senderId  = null;\n    protected $_title     = null;\n    protected $_message   = null;\n    protected $_date      = null;\n\n    public function __construct($title, $message, receiver) {\n      $this->_userId  = $receiver;\n      $this->_title   = $title;\n      $this->_message = $message;\n      $this->_sender  = osc_logged_user_id();\n      $this->_date    = date('Y-m-d H:m:s');\n    }\n    public function getId()\n    {\n        return $this->_id;\n    }\n\n    public function setId($_id)\n    {\n        $this->_id = $_id;\n        return $this;\n    }\n\n    public function getUserId()\n    {\n        return $this->_userId;\n    }\n\n    public function setUserId($userId)\n    {\n        $this->_userId = $userId;\n        return $this;\n    }\n    \n    public function getSenderId()\n    {\n        return $this->_senderId;\n    }\n\n    public function setSenderId($senderId)\n    {\n        $this->_senderId = $senderId;\n        return $this;\n    }\n    \n    public function getTitle()\n    {\n        return $this->_title;\n    }\n\n    public function setTitle($title)\n    {\n        $this->_title = $title;\n        return $this;\n    }\n\n...<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If a&nbsp;<strong>set<\/strong>&nbsp;function is present, that will be used when&nbsp;creating the object when reading from the database. So any extra logic needed on data read from the database can be put there. For instance you might store a data in some specific format in the database but want it to be stored differently within the object. If&nbsp;this need does not exist and there is no wish for any public&nbsp;<strong>get<\/strong>&nbsp;or&nbsp;<strong>set<\/strong>&nbsp;functions they can be left out.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Functionality to save a single or multiple items&nbsp;and fetch items based on their primary key exists by default. Even multi-column primary keys are supported. To add extended functionality like we did in our old DAO object we can do things like this to our object.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">static public function fetchAllForUser($userId) {\n    return static::_fetchAll(static::getDbTable()->dao->select()->from(static::getDbTable()->getTableName())->where('fk_i_user_id', $userId));\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Working with your objects<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">By these simple steps you can now do things like<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?php\n\nuse userMessages\\Model\\UserMessage;\n\n\/\/ Create message with user 10 as receipient\n$message = new UserMessage('Hello!', 'I would just like to say hello.', 10);\n\n\/\/ Store the message in the database\n$message->save();\n\n\/\/-----------------------------------------------------\n\n\/\/ Create and store a batch of messages at once\n\n$userIds  = [1, 2, 3, 4, 5, 6, 7, 8];\n$messages = [];\n\nforeach($userIds as $userId) {\n  $messages[] = new UserMessage('Hello!', 'I would just like to say hello.', userId);\n}\n\nUserMessage::saveBatch(messages);\n\n\/\/-----------------------------------------------------\n\n\/\/ Fetch all messages for a given user and echo them\n$myMessages = UserMessage::fetchAllForUser(osc_logged_user_id());\n\nforeach($myMessages as $myMessage) {\n  echo $myMessage->getTitle() . '&lt;br\/>';\n  echo $myMessage->getMessage() . '&lt;br\/>';\n  \n  \/\/ Deletes the entry in the database and sets object to null\n  \/\/ _beforeDelete is called on the object before object is deleted from db\n  $myMessage->delete();\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Closing thoughts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If one opts-in to use this style you get an easy encapsulation of objects without much work. For the standard tables like&nbsp;<em>User<\/em>&nbsp;these objects will also be made available by the library. That way, user objects can be passed around instead of user id\u00b4s or associative arrays.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Note that just as with most parts of dliCore, the use of these objects are purely optional. You can stick to just creating the tables in this new way, or doing it the old&nbsp;manual way and sticking with DAO your old objects. For older plugins being moved to use dliCore this can help reduce the needed modifications.<\/p>\n\t\t\t<input type=\"hidden\" id=\"wplinkpress-user-email\" value=\"\" \/>\n<input type=\"hidden\" id=\"wplinkpress-authorize-url\" value=\"https:\/\/www.linkedin.com\/oauth\/v2\/authorization?response_type=code&client_id=77uzug7iq2dnd2&redirect_uri=https%3A%2F%2Fdaniel.liljeberg.io%2Fauthorize-linkedin%2F&state=https%3A%2F%2Fdaniel.liljeberg.io%2Fsv%2Fwp-json%2Fwp%2Fv2%2Fposts%2F5&scope=r_liteprofile%20r_emailaddress%20w_member_social\" \/>\n<input type=\"hidden\" id=\"wplinkpress-post-id\" value=\"5\" \/>\n<div class=\"ui wplinkpress comments\">\n<h3 class=\"ui dividing header\">Comments<\/h3>\n<form id=\"add-wplinkpress-comment\" method=\"POST\"> \n<div class=\"comment add-comment\">\n\t<a class=\"avatar\"><img src=\"https:\/\/daniel.liljeberg.io\/wp-content\/plugins\/wplinkpress\/assets\/media\/non-user-icon.jpg\" \/><\/a>\n\t<div class=\"content\">\n\t<textarea id=\"wplinkpress-comment-text-0\" class=\"wplinkpress-comment-text\" style=\"width:100%;\" placeholder=\"Add a comment...\"><\/textarea>\n\t<div class=\"bottom-layer\">\n\t\t<div class=\"comment-atts\" style=\"float:left;\">\n\t\t\t\t<div class=\"feed-share\">\n\t\t<label class=\"switch tips\">\n\t\t\t<input type=\"checkbox\" id=\"toggle-linkedin-feed\" >\n        \t<span class=\"slider round\"><\/span>\n\t\t<\/label>\n\t\t<span>Share on activity feed<\/span>\n\t\t<\/div>\n\t\t<\/div>\n\t<div class=\"wplinkpress_buttons\">\n\t\t<button id=\"authorize_comment_0\" class=\"authorize_comment\" disabled=\"disabled\">Post with LinkedIn<\/button>\n\t\t<\/div>\n\t<\/div>\n\t<\/div>\n<\/div>\n<\/form>\n<h3 class=\"ui dividing header\"><span class=\"wplinkpress-brand\">Powered by WP LinkPress<\/span><\/h3>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>As mentioned&nbsp;in our&nbsp;previous post&nbsp;regarding database tables for Osclass plugins written using dliCore the library offers another way to access the data stored in your tables. It was a thought that originated in an old library I did many years ago that I simplified for this case. The old approach consisted of something I called data&hellip;&nbsp;<a href=\"https:\/\/daniel.liljeberg.io\/sv\/2015\/04\/13\/data-objects-for-osclass-plugins-using-dlicore\/\" rel=\"bookmark\">Read More &raquo;<span class=\"screen-reader-text\">Data Objects for Osclass plugins using dliCore<\/span><\/a><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","neve_meta_reading_time":"","footnotes":""},"categories":[3,2],"tags":[],"class_list":["post-5","post","type-post","status-publish","format-standard","hentry","category-dlicore","category-osclass"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Data Objects for Osclass plugins using dliCore - Daniel Liljeberg<\/title>\n<meta name=\"description\" content=\"Using dliCore data objects in your Osclass plugins.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/daniel.liljeberg.io\/sv\/2015\/04\/13\/data-objects-for-osclass-plugins-using-dlicore\/\" \/>\n<meta property=\"og:locale\" content=\"sv_SE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Data Objects for Osclass plugins using dliCore - Daniel Liljeberg\" \/>\n<meta property=\"og:description\" content=\"Using dliCore data objects in your Osclass plugins.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/daniel.liljeberg.io\/sv\/2015\/04\/13\/data-objects-for-osclass-plugins-using-dlicore\/\" \/>\n<meta property=\"og:site_name\" content=\"Daniel Liljeberg\" \/>\n<meta property=\"article:published_time\" content=\"2015-04-13T15:01:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-04-01T20:02:08+00:00\" \/>\n<meta name=\"author\" content=\"Daniel Liljeberg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Skriven av\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Liljeberg\" \/>\n\t<meta name=\"twitter:label2\" content=\"Ber\u00e4knad l\u00e4stid\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minuter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/daniel.liljeberg.io\\\/sv\\\/2015\\\/04\\\/13\\\/data-objects-for-osclass-plugins-using-dlicore\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/daniel.liljeberg.io\\\/sv\\\/2015\\\/04\\\/13\\\/data-objects-for-osclass-plugins-using-dlicore\\\/\"},\"author\":{\"name\":\"Daniel Liljeberg\",\"@id\":\"https:\\\/\\\/daniel.liljeberg.io\\\/#\\\/schema\\\/person\\\/e2c3fe10971c37cff2669f5688834cd7\"},\"headline\":\"Data Objects for Osclass plugins using dliCore\",\"datePublished\":\"2015-04-13T15:01:00+00:00\",\"dateModified\":\"2021-04-01T20:02:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/daniel.liljeberg.io\\\/sv\\\/2015\\\/04\\\/13\\\/data-objects-for-osclass-plugins-using-dlicore\\\/\"},\"wordCount\":646,\"publisher\":{\"@id\":\"https:\\\/\\\/daniel.liljeberg.io\\\/#\\\/schema\\\/person\\\/e2c3fe10971c37cff2669f5688834cd7\"},\"articleSection\":[\"dliCore\",\"Osclass\"],\"inLanguage\":\"sv-SE\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/daniel.liljeberg.io\\\/sv\\\/2015\\\/04\\\/13\\\/data-objects-for-osclass-plugins-using-dlicore\\\/\",\"url\":\"https:\\\/\\\/daniel.liljeberg.io\\\/sv\\\/2015\\\/04\\\/13\\\/data-objects-for-osclass-plugins-using-dlicore\\\/\",\"name\":\"Data Objects for Osclass plugins using dliCore - Daniel Liljeberg\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/daniel.liljeberg.io\\\/#website\"},\"datePublished\":\"2015-04-13T15:01:00+00:00\",\"dateModified\":\"2021-04-01T20:02:08+00:00\",\"description\":\"Using dliCore data objects in your Osclass plugins.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/daniel.liljeberg.io\\\/sv\\\/2015\\\/04\\\/13\\\/data-objects-for-osclass-plugins-using-dlicore\\\/#breadcrumb\"},\"inLanguage\":\"sv-SE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/daniel.liljeberg.io\\\/sv\\\/2015\\\/04\\\/13\\\/data-objects-for-osclass-plugins-using-dlicore\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/daniel.liljeberg.io\\\/sv\\\/2015\\\/04\\\/13\\\/data-objects-for-osclass-plugins-using-dlicore\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/daniel.liljeberg.io\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Data Objects for Osclass plugins using dliCore\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/daniel.liljeberg.io\\\/#website\",\"url\":\"https:\\\/\\\/daniel.liljeberg.io\\\/\",\"name\":\"Daniel Liljeberg\",\"description\":\"The is no place like 127.0.0.1\",\"publisher\":{\"@id\":\"https:\\\/\\\/daniel.liljeberg.io\\\/#\\\/schema\\\/person\\\/e2c3fe10971c37cff2669f5688834cd7\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/daniel.liljeberg.io\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"sv-SE\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/daniel.liljeberg.io\\\/#\\\/schema\\\/person\\\/e2c3fe10971c37cff2669f5688834cd7\",\"name\":\"Daniel Liljeberg\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"sv-SE\",\"@id\":\"https:\\\/\\\/daniel.liljeberg.io\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/DanielLiljeberg.png\",\"url\":\"https:\\\/\\\/daniel.liljeberg.io\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/DanielLiljeberg.png\",\"contentUrl\":\"https:\\\/\\\/daniel.liljeberg.io\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/DanielLiljeberg.png\",\"width\":424,\"height\":440,\"caption\":\"Daniel Liljeberg\"},\"logo\":{\"@id\":\"https:\\\/\\\/daniel.liljeberg.io\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/DanielLiljeberg.png\"},\"description\":\"Agile practitioner and advocate. Strong believer in the future of agile organizations, businesses and teams. Got my first computer, a C64, at age 7 and computers has been part of my life since then. Working professionally with development since the early 2000\u2019s in a vast array of technologies and roles. Social, easy going, fun loving guy with an appetite for new challenges and new knowledge who has been \u201cthere\u201d and done \u201cthat\u201d. That\u2019s a good way to sum it all up. Married and father of three kids. All true blessings ;)\",\"sameAs\":[\"https:\\\/\\\/daniel.liljeberg.io\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/danielliljeberg\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Data Objects for Osclass plugins using dliCore - Daniel Liljeberg","description":"Using dliCore data objects in your Osclass plugins.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/daniel.liljeberg.io\/sv\/2015\/04\/13\/data-objects-for-osclass-plugins-using-dlicore\/","og_locale":"sv_SE","og_type":"article","og_title":"Data Objects for Osclass plugins using dliCore - Daniel Liljeberg","og_description":"Using dliCore data objects in your Osclass plugins.","og_url":"https:\/\/daniel.liljeberg.io\/sv\/2015\/04\/13\/data-objects-for-osclass-plugins-using-dlicore\/","og_site_name":"Daniel Liljeberg","article_published_time":"2015-04-13T15:01:00+00:00","article_modified_time":"2021-04-01T20:02:08+00:00","author":"Daniel Liljeberg","twitter_card":"summary_large_image","twitter_misc":{"Skriven av":"Daniel Liljeberg","Ber\u00e4knad l\u00e4stid":"5 minuter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/daniel.liljeberg.io\/sv\/2015\/04\/13\/data-objects-for-osclass-plugins-using-dlicore\/#article","isPartOf":{"@id":"https:\/\/daniel.liljeberg.io\/sv\/2015\/04\/13\/data-objects-for-osclass-plugins-using-dlicore\/"},"author":{"name":"Daniel Liljeberg","@id":"https:\/\/daniel.liljeberg.io\/#\/schema\/person\/e2c3fe10971c37cff2669f5688834cd7"},"headline":"Data Objects for Osclass plugins using dliCore","datePublished":"2015-04-13T15:01:00+00:00","dateModified":"2021-04-01T20:02:08+00:00","mainEntityOfPage":{"@id":"https:\/\/daniel.liljeberg.io\/sv\/2015\/04\/13\/data-objects-for-osclass-plugins-using-dlicore\/"},"wordCount":646,"publisher":{"@id":"https:\/\/daniel.liljeberg.io\/#\/schema\/person\/e2c3fe10971c37cff2669f5688834cd7"},"articleSection":["dliCore","Osclass"],"inLanguage":"sv-SE"},{"@type":"WebPage","@id":"https:\/\/daniel.liljeberg.io\/sv\/2015\/04\/13\/data-objects-for-osclass-plugins-using-dlicore\/","url":"https:\/\/daniel.liljeberg.io\/sv\/2015\/04\/13\/data-objects-for-osclass-plugins-using-dlicore\/","name":"Data Objects for Osclass plugins using dliCore - Daniel Liljeberg","isPartOf":{"@id":"https:\/\/daniel.liljeberg.io\/#website"},"datePublished":"2015-04-13T15:01:00+00:00","dateModified":"2021-04-01T20:02:08+00:00","description":"Using dliCore data objects in your Osclass plugins.","breadcrumb":{"@id":"https:\/\/daniel.liljeberg.io\/sv\/2015\/04\/13\/data-objects-for-osclass-plugins-using-dlicore\/#breadcrumb"},"inLanguage":"sv-SE","potentialAction":[{"@type":"ReadAction","target":["https:\/\/daniel.liljeberg.io\/sv\/2015\/04\/13\/data-objects-for-osclass-plugins-using-dlicore\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/daniel.liljeberg.io\/sv\/2015\/04\/13\/data-objects-for-osclass-plugins-using-dlicore\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/daniel.liljeberg.io\/"},{"@type":"ListItem","position":2,"name":"Data Objects for Osclass plugins using dliCore"}]},{"@type":"WebSite","@id":"https:\/\/daniel.liljeberg.io\/#website","url":"https:\/\/daniel.liljeberg.io\/","name":"Daniel Liljeberg","description":"The is no place like 127.0.0.1","publisher":{"@id":"https:\/\/daniel.liljeberg.io\/#\/schema\/person\/e2c3fe10971c37cff2669f5688834cd7"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/daniel.liljeberg.io\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"sv-SE"},{"@type":["Person","Organization"],"@id":"https:\/\/daniel.liljeberg.io\/#\/schema\/person\/e2c3fe10971c37cff2669f5688834cd7","name":"Daniel Liljeberg","image":{"@type":"ImageObject","inLanguage":"sv-SE","@id":"https:\/\/daniel.liljeberg.io\/wp-content\/uploads\/2020\/12\/DanielLiljeberg.png","url":"https:\/\/daniel.liljeberg.io\/wp-content\/uploads\/2020\/12\/DanielLiljeberg.png","contentUrl":"https:\/\/daniel.liljeberg.io\/wp-content\/uploads\/2020\/12\/DanielLiljeberg.png","width":424,"height":440,"caption":"Daniel Liljeberg"},"logo":{"@id":"https:\/\/daniel.liljeberg.io\/wp-content\/uploads\/2020\/12\/DanielLiljeberg.png"},"description":"Agile practitioner and advocate. Strong believer in the future of agile organizations, businesses and teams. Got my first computer, a C64, at age 7 and computers has been part of my life since then. Working professionally with development since the early 2000\u2019s in a vast array of technologies and roles. Social, easy going, fun loving guy with an appetite for new challenges and new knowledge who has been \u201cthere\u201d and done \u201cthat\u201d. That\u2019s a good way to sum it all up. Married and father of three kids. All true blessings ;)","sameAs":["https:\/\/daniel.liljeberg.io","https:\/\/www.linkedin.com\/in\/danielliljeberg\/"]}]}},"_links":{"self":[{"href":"https:\/\/daniel.liljeberg.io\/sv\/wp-json\/wp\/v2\/posts\/5","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/daniel.liljeberg.io\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/daniel.liljeberg.io\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/daniel.liljeberg.io\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/daniel.liljeberg.io\/sv\/wp-json\/wp\/v2\/comments?post=5"}],"version-history":[{"count":4,"href":"https:\/\/daniel.liljeberg.io\/sv\/wp-json\/wp\/v2\/posts\/5\/revisions"}],"predecessor-version":[{"id":442,"href":"https:\/\/daniel.liljeberg.io\/sv\/wp-json\/wp\/v2\/posts\/5\/revisions\/442"}],"wp:attachment":[{"href":"https:\/\/daniel.liljeberg.io\/sv\/wp-json\/wp\/v2\/media?parent=5"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/daniel.liljeberg.io\/sv\/wp-json\/wp\/v2\/categories?post=5"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/daniel.liljeberg.io\/sv\/wp-json\/wp\/v2\/tags?post=5"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}