Subversion Repositories web.active

Rev

Blame | Last modification | View Log | Download

<?php namespace ProcessWire;

/**
 * ProcessWire 'Hello world' demonstration module
 *
 * Demonstrates the Module interface and how to add hooks.
 * 
 * See README file for further links regarding module development.
 * 
 * This file is licensed under the MIT license
 * https://processwire.com/about/license/mit/
 * 
 * ProcessWire 3.x, Copyright 2016 by Ryan Cramer
 * https://processwire.com
 *
 */

class Helloworld extends WireData implements Module {

  /**
   * getModuleInfo is a module required by all modules to tell ProcessWire about them
   *
   * @return array
   *
   */
  public static function getModuleInfo() {

    return array(

      // The module's title, typically a little more descriptive than the class name
      'title' => 'Hello World', 

      // version number 
      'version' => 3, 

      // summary is brief description of what this module is
      'summary' => 'An example module used for demonstration purposes.',
      
      // Optional URL to more information about the module
      'href' => 'https://processwire.com',

      // singular=true: indicates that only one instance of the module is allowed.
      // This is usually what you want for modules that attach hooks. 
      'singular' => true, 

      // autoload=true: indicates the module should be started with ProcessWire.
      // This is necessary for any modules that attach runtime hooks, otherwise those
      // hooks won't get attached unless some other code calls the module on it's own.
      // Note that autoload modules are almost always also 'singular' (seen above).
      'autoload' => true, 
    
      // Optional font-awesome icon name, minus the 'fa-' part
      'icon' => 'smile-o', 
      );
  }

  /**
   * Initialize the module
   *
   * ProcessWire calls this when the module is loaded. For 'autoload' modules, this will be called
   * when ProcessWire's API is ready. As a result, this is a good place to attach hooks. 
   *
   */
  public function init() {

    // add a hook after the $pages->save, to issue a notice every time a page is saved
    $this->pages->addHookAfter('save', $this, 'example1'); 

    // add a hook after each page is rendered and modify the output
    $this->addHookAfter('Page::render', $this, 'example2'); 

    // add a 'hello' method to every page that returns "Hello World"
    // use "echo $page->hello();" in your template file to display output
    $this->addHook('Page::hello', $this, 'example3'); 

    // add a 'hello_world' property to every page that returns "Hello [user]"
    // use "echo $page->hello_world;" in your template file to display output
    $this->addHookProperty('Page::hello_world', $this, 'example4'); 
  }

  /**
   * Example1 hooks into the pages->save method and displays a notice every time a page is saved
   * 
   * @param HookEvent $event
   *
   */
  public function example1($event) {
    /** @var Page $page */
    $page = $event->arguments[0]; 
    $this->message("Hello World! You saved {$page->path}."); 
  }


  /**
   * Example2 hooks into every page after it's rendered and adds "Hello World" text at the bottom
   * 
   * @param HookEvent $event
   *
   */
  public function example2($event) {

    /** @var Page $page */
    $page = $event->object; 

    // don't add this to the admin pages
    if($page->template == 'admin') return;

    // add a "Hello World" paragraph right before the closing body tag
    $event->return = str_replace("</body>", "<p>Hello World!</p></body>", $event->return); 
  }

  /**
   * Example3 adds a 'hello' method (not property) to every page that simply returns "Hello World"
   * 
   * @param HookEvent $event
   *
   */
  public function example3($event) {
    $event->return = "Hello World";
  }

  /**
   * Example 4 adds a 'hello_world' property (not method) to every page that returns "Hello [user]"
   * 
   * @param HookEvent $event
   *
   */
  public function example4($event) {
    $event->return = "Hello " . $this->user->name; 
  }
  
}