1

I am looking for a way to add attributes for the root node when using XMLViews in CakePHP3. The Script generates a simple sitemap.xml which needs the namespace included in the urlset tag. Not to much code to show, but anyway:

function sitemap($language='en') {
    [..]
    $_rootNode = 'urlset';
    $this->set(compact('url'));
    $this->set('_rootNode', $_rootNode);
    $this->set('_serialize', ['url']);
}

I am aware, that I could add real views for the XML, but I would prefer this way of doing this

ndm
  • 59,784
  • 9
  • 71
  • 110
harpax
  • 5,986
  • 5
  • 35
  • 49

1 Answers1

3

Generally attributes can be defined using the @ prefix. In case of a generic namespace you could also use the xmlns: key.

In order to add them to the root note, you have to set them as view/serialization variables at the same level as the url variable, ie something like

$attributes = [
    'xmlns:' => 'http://www.sitemaps.org/schemas/sitemap/0.9', // or
    // '@xmlns' => 'http://www.sitemaps.org/schemas/sitemap/0.9',
    // ...
];
$this->set($attributes + compact('url'));
$this->set('_rootNode', $_rootNode);
$this->set('_serialize', array_merge(array_keys($attributes), ['url']));

So that you end up with a dataset that looks like

[
    'xmlns:' => 'http://www.sitemaps.org/schemas/sitemap/0.9',
    // ...
    'url' => [
        // ...
    ]
]

and a serialization set like

['xmlns:' /*, ... */, 'url']

See also

ndm
  • 59,784
  • 9
  • 71
  • 110
  • thanks a lot! works as expected.. Took me a while to realize the difference regarding the `:` – harpax May 19 '16 at 12:36