Hello,

But maybe an interesting question would be: how would cocoon be different when
written in another language. Would you need an XML sitemap if you could just
write your sitemap in a dynamic language?

I've recently developed very small cocoon-like framework in php language. What I really love about it is writing pipelines in OO php code instead of xml. Here are some examples of pipelines:


1. Simple pipeline like in cocoon:

class DealersListPipeline extends COPipeline {
  function execute() {
    $this->generate('dealers-list', null, this->parameters);
    $this->transform('xslt', 'dealers-list2html.xslt');
    $this->transform('xslt', 'address2html.xslt');
    $this->serialize('html');
  }
}

2. I can have any code in pipelines:

class FooBlaPipeline extends COPipeline {
  function execute() {
    if (rand(0,1) == 1) {
      $this->generate('file', 'foo.xml');
    } else {
      $this->generate('file', 'bla.xml');
    }
    $name = $this->do_some_magic_computations();
    $this->transform('xslt', "layout-$name.xslt");
    $this->serialize('html');
  }

  function do_some_magic_computations() {
    // magic
  }
}

3. I can create abstract pipelines:

class CenterIframePipeline extends COPipeline {
  function execute($sourcePrefix, $page) {
    if ($page == 'page' || $page == 'content') {
      $source = "{$sourcePrefix}.xml";
    } else {
      $source = "{$sourcePrefix}-{$page}.xml";
    }
    $this->generate('file', $source, $this->parameters);
     if ($page == 'page') {
      $this->transform('xslt', 'center-iframe-page.xslt');
    } else {
      $this->transform('xslt', 'center-iframe-content.xslt');
    }
    $this->serialize('html');
  }
}

class ReviewPipeline extends CenterIframePipeline {
  function execute() {
    parent::execute('review', $this->parameters->get('page'));
  }
}

class WallsPipeline extends CenterIframePipeline {
  function execute() {
    parent::execute('walls', $this->parameters->get('page'));
  }
}

I think it's very flexible to have pipelines defined as classes. I can code in OO manner, use business classes (services) directly with no need to code action classes. And i have one language (php) instead of two (xml+flowscript).

Pipelines are mounted in sitemaps definitions, also implemented as php classes, but this is not so usefull and I would prefer to have this in xml file:

class MainSitemap extends COSitemap {
  function components(&$container) {
    $container->registerMatcher('string-uri',
                                'matching/StringUriMatcher.php');
    $container->registerMatcher('uri',
                                'matching/WildcardUriMatcher.php');
                
    $container->registerGenerator('file',
                                  'generation/FileGenerator.php');
                
    $container->registerTransformer('xslt',
                                  'transformation/XsltTransformer.php');
                
    $container->registerSerializer('xml',
                                   'serialization/XmlSerializer.php');
    $container->registerSerializer('html',
                                   'serialization/HtmlSerializer.php');
  }
        
  function sitemaps(&$manager) {
    $manager->mount('string-uri', '/building', 'building/Sitemap.php');
    $manager->mount('string-uri', '/service', 'service/Sitemap.php');
  }
        
  function pipelines(&$manager) {
     $manager->mount('uri',
                    '/dealers-list/{*:type}/{*:value}/{#:services}',
                    'DealersListPipeline');
    $manager->mount('uri', '/messages-list', 'MessagesListPipeline');
    $manager->mount('uri', '/message/{#:id}', 'MessageViewPipeline');
  }
}

--
Pozdrawiam,
Wojciech Gdela.



Reply via email to