Kirby2 Spad Save

📄 Kirby single page app json

Project README

Spad

Spad is a Kirby plugin to expose your site data as json for use in a single page app.

Usage

Echos site data as json:

<?= $site->spad() ?>

Typically you'd use this to inline into a variable for use in your app:

<script>var data = <?= $site->spad() ?></script>

Response

Spad recursively includes visible page data and files. Click here to view the default response from the Kirby starterkit.

Filters

Two filters are provided to filter the json response:

c::set('spad.filterAll', function ($data) {
  return $data;
});

c::set('spad.filterEach', function ($page) {
  return $page;
});

These are useful if you need to perform some transformations on the data or to remove unecessary fields. filterAll is run at the very end for filtering the entire tree, whereas filterEach is run on each page. Here is an example that removes some of the fields from each page:

c::set('spad.filterEach', function ($page) {
  $dontNeed = [
    'parent',
    'dirname',
    'diruri',
    'contentUrl',
    'tinyUrl',
    'depth',
    'root',
    'uid',
    'num',
    'hash',
    'modified'
  ];

  foreach ($dontNeed as $field) {
    unset($page[$field]);
  }

  return $page;
});

You can use page templates to conditionally filter pages:

c::set('spad.filterEach', function ($page) {
  if ($page['intendedTemplate'] == 'project') {
    // only do a transformation on pages with `project` template
  }
  return $page;
});

Note: Careful not remove the child field when using filterEach, otherwise you will break recursion!

Route

For handiness, Spad also adds a route which returns the site as json:

http://yourkirbysite.com/spad

Options

Options are provided to customize the method and route names, and to filter the data:

<?php

c::set('spad.method', 'spad');
c::set('spad.route', 'spad');
c::set('spad.filterAll', function ($data) { return $data; });
c::set('spad.filterEach', function ($page) { return $page; });

Todo

  • Page method
  • Optional Recursion

starterkit Response

Default Spad response for the Kirby starterkit:

{
  "files":[

  ],
  "children":[
    {
      "id":"about",
      "title":"About",
      "parent":"",
      "dirname":"1-about",
      "diruri":"1-about",
      "url":"http://localhost:8080/about",
      "contentUrl":"http://localhost:8080/content/1-about",
      "tinyUrl":"http://localhost:8080/x/1ehhfqb",
      "depth":1,
      "uri":"about",
      "root":"/Users/jongacnik/Sites/kirby/content/1-about",
      "uid":"about",
      "slug":"about",
      "num":"1",
      "hash":"1ehhfqb",
      "modified":1475951682,
      "template":"default",
      "intendedTemplate":"about",
      "content":{
        "title":"About",
        "text":"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim.\r\n\r\n## Lorem Ipsum\r\nIn enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a.\r\n\r\n(image: about.jpg)\r\n\r\n### Lorem Ipsum\r\nIn enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus.\r\n\r\n#### Lorem Ipsum\r\nIn enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus."
      },
      "files":[
        {
          "root":"/Users/jongacnik/Sites/kirby/content/1-about/about.jpg",
          "url":"http://localhost:8080/content/1-about/about.jpg",
          "hash":"616ed5d915ad7b02d055c981983983b9",
          "dir":"/Users/jongacnik/Sites/kirby/content/1-about",
          "filename":"about.jpg",
          "name":"about",
          "safeName":"about.jpg",
          "extension":"jpg",
          "size":232182,
          "niceSize":"226.74 kB",
          "modified":1475951682,
          "mime":"image/jpeg",
          "type":"image",
          "dimensions":{
            "width":1280,
            "height":853,
            "ratio":1.5005861664713,
            "orientation":"landscape"
          },
          "meta":[

          ]
        }
      ],
      "children":[

      ]
    },
    {
      "id":"projects",
      "title":"Projects",
      "parent":"",
      "dirname":"2-projects",
      "diruri":"2-projects",
      "url":"http://localhost:8080/projects",
      "contentUrl":"http://localhost:8080/content/2-projects",
      "tinyUrl":"http://localhost:8080/x/poq46c",
      "depth":1,
      "uri":"projects",
      "root":"/Users/jongacnik/Sites/kirby/content/2-projects",
      "uid":"projects",
      "slug":"projects",
      "num":"2",
      "hash":"poq46c",
      "modified":1475951682,
      "template":"projects",
      "intendedTemplate":"projects",
      "content":{
        "title":"Projects",
        "text":"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.\r\n\r\nNullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim."
      },
      "files":[

      ],
      "children":[
        {
          "id":"projects/project-a",
          "title":"Project A",
          "parent":"projects",
          "dirname":"1-project-a",
          "diruri":"2-projects/1-project-a",
          "url":"http://localhost:8080/projects/project-a",
          "contentUrl":"http://localhost:8080/content/2-projects/1-project-a",
          "tinyUrl":"http://localhost:8080/x/e1kw3g",
          "depth":2,
          "uri":"projects/project-a",
          "root":"/Users/jongacnik/Sites/kirby/content/2-projects/1-project-a",
          "uid":"project-a",
          "slug":"project-a",
          "num":"1",
          "hash":"e1kw3g",
          "modified":1475951682,
          "template":"project",
          "intendedTemplate":"project",
          "content":{
            "title":"Project A",
            "year":"2014",
            "tags":"outdoor",
            "text":"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo."
          },
          "files":[
            {
              "root":"/Users/jongacnik/Sites/kirby/content/2-projects/1-project-a/forrest.jpg",
              "url":"http://localhost:8080/content/2-projects/1-project-a/forrest.jpg",
              "hash":"385a87a789ed2d14af29b456bfd80752",
              "dir":"/Users/jongacnik/Sites/kirby/content/2-projects/1-project-a",
              "filename":"forrest.jpg",
              "name":"forrest",
              "safeName":"forrest.jpg",
              "extension":"jpg",
              "size":280900,
              "niceSize":"274.32 kB",
              "modified":1475951682,
              "mime":"image/jpeg",
              "type":"image",
              "dimensions":{
                "width":1280,
                "height":853,
                "ratio":1.5005861664713,
                "orientation":"landscape"
              },
              "meta":[

              ]
            },
            {
              "root":"/Users/jongacnik/Sites/kirby/content/2-projects/1-project-a/green.jpg",
              "url":"http://localhost:8080/content/2-projects/1-project-a/green.jpg",
              "hash":"46391b3717002abcd548479f77e2e48f",
              "dir":"/Users/jongacnik/Sites/kirby/content/2-projects/1-project-a",
              "filename":"green.jpg",
              "name":"green",
              "safeName":"green.jpg",
              "extension":"jpg",
              "size":306670,
              "niceSize":"299.48 kB",
              "modified":1475951682,
              "mime":"image/jpeg",
              "type":"image",
              "dimensions":{
                "width":1280,
                "height":853,
                "ratio":1.5005861664713,
                "orientation":"landscape"
              },
              "meta":[

              ]
            },
            {
              "root":"/Users/jongacnik/Sites/kirby/content/2-projects/1-project-a/the-sea.jpg",
              "url":"http://localhost:8080/content/2-projects/1-project-a/the-sea.jpg",
              "hash":"e4332622c6ff44c4ef7d6e397f0d2ab2",
              "dir":"/Users/jongacnik/Sites/kirby/content/2-projects/1-project-a",
              "filename":"the-sea.jpg",
              "name":"the-sea",
              "safeName":"the-sea.jpg",
              "extension":"jpg",
              "size":263038,
              "niceSize":"256.87 kB",
              "modified":1475951682,
              "mime":"image/jpeg",
              "type":"image",
              "dimensions":{
                "width":1280,
                "height":854,
                "ratio":1.4988290398126,
                "orientation":"landscape"
              },
              "meta":[

              ]
            }
          ],
          "children":[

          ]
        },
        {
          "id":"projects/project-b",
          "title":"Project B",
          "parent":"projects",
          "dirname":"2-project-b",
          "diruri":"2-projects/2-project-b",
          "url":"http://localhost:8080/projects/project-b",
          "contentUrl":"http://localhost:8080/content/2-projects/2-project-b",
          "tinyUrl":"http://localhost:8080/x/1bluoqu",
          "depth":2,
          "uri":"projects/project-b",
          "root":"/Users/jongacnik/Sites/kirby/content/2-projects/2-project-b",
          "uid":"project-b",
          "slug":"project-b",
          "num":"2",
          "hash":"1bluoqu",
          "modified":1475951682,
          "template":"project",
          "intendedTemplate":"project",
          "content":{
            "title":"Project B",
            "year":"2013",
            "tags":"city",
            "text":"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo."
          },
          "files":[
            {
              "root":"/Users/jongacnik/Sites/kirby/content/2-projects/2-project-b/mountains.jpg",
              "url":"http://localhost:8080/content/2-projects/2-project-b/mountains.jpg",
              "hash":"4a243fce010d8a1266ddd091a9d96f78",
              "dir":"/Users/jongacnik/Sites/kirby/content/2-projects/2-project-b",
              "filename":"mountains.jpg",
              "name":"mountains",
              "safeName":"mountains.jpg",
              "extension":"jpg",
              "size":169253,
              "niceSize":"165.29 kB",
              "modified":1475951682,
              "mime":"image/jpeg",
              "type":"image",
              "dimensions":{
                "width":1280,
                "height":853,
                "ratio":1.5005861664713,
                "orientation":"landscape"
              },
              "meta":[

              ]
            },
            {
              "root":"/Users/jongacnik/Sites/kirby/content/2-projects/2-project-b/road.jpg",
              "url":"http://localhost:8080/content/2-projects/2-project-b/road.jpg",
              "hash":"f8d91c83779319383a2ee3b6f5294c6d",
              "dir":"/Users/jongacnik/Sites/kirby/content/2-projects/2-project-b",
              "filename":"road.jpg",
              "name":"road",
              "safeName":"road.jpg",
              "extension":"jpg",
              "size":268073,
              "niceSize":"261.79 kB",
              "modified":1475951682,
              "mime":"image/jpeg",
              "type":"image",
              "dimensions":{
                "width":1280,
                "height":850,
                "ratio":1.5058823529412,
                "orientation":"landscape"
              },
              "meta":[

              ]
            }
          ],
          "children":[

          ]
        },
        {
          "id":"projects/project-c",
          "title":"Project C",
          "parent":"projects",
          "dirname":"3-project-c",
          "diruri":"2-projects/3-project-c",
          "url":"http://localhost:8080/projects/project-c",
          "contentUrl":"http://localhost:8080/content/2-projects/3-project-c",
          "tinyUrl":"http://localhost:8080/x/1p79aog",
          "depth":2,
          "uri":"projects/project-c",
          "root":"/Users/jongacnik/Sites/kirby/content/2-projects/3-project-c",
          "uid":"project-c",
          "slug":"project-c",
          "num":"3",
          "hash":"1p79aog",
          "modified":1475951682,
          "template":"project",
          "intendedTemplate":"project",
          "content":{
            "title":"Project C",
            "year":"2012",
            "tags":"stuff",
            "text":"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo."
          },
          "files":[
            {
              "root":"/Users/jongacnik/Sites/kirby/content/2-projects/3-project-c/hightide.jpg",
              "url":"http://localhost:8080/content/2-projects/3-project-c/hightide.jpg",
              "hash":"78a0dde966c390550063dd773bad9074",
              "dir":"/Users/jongacnik/Sites/kirby/content/2-projects/3-project-c",
              "filename":"hightide.jpg",
              "name":"hightide",
              "safeName":"hightide.jpg",
              "extension":"jpg",
              "size":208192,
              "niceSize":"203.31 kB",
              "modified":1475951682,
              "mime":"image/jpeg",
              "type":"image",
              "dimensions":{
                "width":1280,
                "height":853,
                "ratio":1.5005861664713,
                "orientation":"landscape"
              },
              "meta":[

              ]
            },
            {
              "root":"/Users/jongacnik/Sites/kirby/content/2-projects/3-project-c/kermit-the-fog.jpg",
              "url":"http://localhost:8080/content/2-projects/3-project-c/kermit-the-fog.jpg",
              "hash":"667141bffb9f5fcc8ec3a13f55a3e093",
              "dir":"/Users/jongacnik/Sites/kirby/content/2-projects/3-project-c",
              "filename":"kermit-the-fog.jpg",
              "name":"kermit-the-fog",
              "safeName":"kermit-the-fog.jpg",
              "extension":"jpg",
              "size":268191,
              "niceSize":"261.91 kB",
              "modified":1475951682,
              "mime":"image/jpeg",
              "type":"image",
              "dimensions":{
                "width":1280,
                "height":853,
                "ratio":1.5005861664713,
                "orientation":"landscape"
              },
              "meta":[

              ]
            }
          ],
          "children":[

          ]
        }
      ]
    },
    {
      "id":"contact",
      "title":"Contact",
      "parent":"",
      "dirname":"3-contact",
      "diruri":"3-contact",
      "url":"http://localhost:8080/contact",
      "contentUrl":"http://localhost:8080/content/3-contact",
      "tinyUrl":"http://localhost:8080/x/l7027s",
      "depth":1,
      "uri":"contact",
      "root":"/Users/jongacnik/Sites/kirby/content/3-contact",
      "uid":"contact",
      "slug":"contact",
      "num":"3",
      "hash":"l7027s",
      "modified":1475951682,
      "template":"default",
      "intendedTemplate":"contact",
      "content":{
        "title":"Contact",
        "text":"## Get in touch\r\n\r\n- (link: http://getkirby.com/support text: Kirby's support page)\r\n- (link: http://forum.getkirby.com text: Kirby's forum)\r\n- (link: http://github.com/getkirby text: Kirby on Github)\r\n- <[email protected]>\r\n\r\n## Follow us on Twitter\r\n\r\n- Follow Kirby on Twitter (twitter: @getkirby)\r\n- Follow Bastian on Twitter (twitter: @bastianallgeier)\r\n- Follow Nico on Twitter (twitter: @distantnative)\r\n- Follow Sascha on Twitter (twitter: @sashtown)"
      },
      "files":[

      ],
      "children":[

      ]
    }
  ]
}
Open Source Agenda is not affiliated with "Kirby2 Spad" Project. README Source: jongacnik/kirby2-spad
Stars
47
Open Issues
2
Last Commit
5 years ago
License
MIT

Open Source Agenda Badge

Open Source Agenda Rating