Subversion Repositories web.creative

Rev

Blame | Last modification | View Log | Download

<?php namespace ProcessWire;

/**
 * Intended just for outputting markup as help or commentary among other Inputfields
 * 
 * @property callable|string|null $markupFunction
 * @property array $textformatters
 * @property string $markupText
 *
 */ 

class InputfieldMarkup extends InputfieldWrapper {

  public static function getModuleInfo() {
    return array(
      'title' => __('Markup', __FILE__),
      'summary' => __('Contains any other markup and optionally child Inputfields', __FILE__),
      'version' => 102,
      'permanent' => true, 
      );
  }
  
  protected $renderValueMode = false;

  public function init() {
    $this->set('markupText', '');
    $this->set('markupFunction', null); // closure or name of function that returns markup, receives $this as arg0.
    $this->set('textformatters', array());
    $this->skipLabel = Inputfield::skipLabelBlank;
    parent::init();
  } 
  
  public function renderReady(Inputfield $parent = null, $renderValueMode = false) {
    $label = $this->getSetting('label');
    
    if(!strlen($label) && $this->skipLabel == Inputfield::skipLabelBlank) {
      $this->addClass('InputfieldHeaderHidden');
    }
    return parent::renderReady($parent, $renderValueMode);
  }

  public function ___render() {
    
    $out = '';
    $value = $this->attr('value');
    
    if(strlen($value)) {
      $out .= "\n" . $value;
    }
    
    $markupFunction = $this->getSetting('markupFunction');
    $markupText = $this->getSetting('markupText');
    $textformatters = $this->getSetting('textformatters');
    $description = $this->getSetting('description');
    
    if($markupFunction !== null & is_callable($markupFunction)) {
      $out .= "\n" . call_user_func($markupFunction, $this);
    }
    if(strlen($markupText)) {
      $out .= "\n" . $markupText;
    }
    $out = trim($out);

    if(wireCount($textformatters)) {
      foreach($textformatters as $className) {
        $t = $this->wire('modules')->get($className);
        if(!$t) continue; 
        $t->formatValue($this->wire('page'), $this->wire(new Field()), $out);
      } 
    }

    if(strlen($description)) {
      $textFormat = $this->getSetting('textFormat');
      if($this->getSetting('entityEncodeText') !== false && $textFormat != Inputfield::textFormatNone) {
        if($textFormat == Inputfield::textFormatBasic) {
          $description = $this->entityEncode($description, Inputfield::textFormatBasic);
          $out = "<p class='description'>{$description}</p>$out";
        } else if($textFormat == Inputfield::textFormatMarkdown) {
          $out = "<div class='description'>" . $this->entityEncode($description, Inputfield::textFormatMarkdown) . "</div>$out";
        }
      } else {
        $out = "<div class='description'>$description</div>$out"; 
      }
      $this->description = ''; // prevents it from appearing again at the bottom
    }

    // prevent possible double render 
    $v = $this->attr('value');
    $this->attr('value', '');
    $out .= parent::___render(); 
    $this->attr('value', $v);
    
    return $out; 
  }

  public function ___renderValue() {
    $this->renderValueMode = true; 
    $out = $this->render();
    $this->renderValueMode = false;
    return $out; 
  }

  public function ___getConfigInputfields() {

    $inputfields = parent::___getConfigInputfields();   
    if($this->hasFieldtype) return $inputfields;

    $f = $this->wire('modules')->get('InputfieldTextarea');
    $f->attr('id+name', 'markupText'); 
    $f->attr('value', $this->markupText);
    $f->attr('rows', 10);
    $f->label = $this->_('Markup Text');
    $inputfields->add($f);

    $f = $this->modules->get('InputfieldAsmSelect');
    $f->attr('id+name', 'textformatters');
    $f->label = $this->_('Text Formatters');

    foreach($this->modules->find("className^=Textformatter") as $textformatter) {
      $info = $textformatter->getModuleInfo();
      $f->addOption($textformatter->className(), "$info[title]");
    }

    $f->attr('value', $this->textformatters);

    $f->description = $this->_('Select the format that your Markup Text is in, or the formatters that you want to be applied to it, in the order you want them applied.'); 
    $f->notes = $this->_('If your Markup Text is plain HTML, you may not want to select any Text Formatters.');
    $inputfields->add($f);

    return $inputfields;
  }
  
}