Subversion Repositories web.active

Rev

Blame | Last modification | View Log | Download

<?php 

/**
 * ProcessWire General site settings module
 *
 * Allows to set global site settings 
 *
 * by Piotr Markiewicz (pmarki)
 *
 * ProcessWire 2.8.x (development), Copyright 2016 by Ryan Cramer
 * https://processwire.com
 *
 *
 */

class ProcessGeneralSettings extends Process implements Module {

  public static function getModuleInfo() {
    return array(
      'title' => __('General site settings (Process)', __FILE__),
      'summary' => __('Editing of global site settings, setup in General Settings Module', __FILE__),
      'version' => 122,
      'permanent' => false, 
      'autoload' => true,
      'icon' => 'sliders', 
      //'requires' => 'GeneralSettings',
      'installs'  => 'GeneralSettings',
      'page' => array(
        'name' => 'general-settings',
        'parent' => 'setup',
        'title' => 'General settings',
        ),
      'permission' => 'general-settings',
      "permissions" => ["general-settings" => "Access general settings page"],
      );
  }

  /**
   * Initialize
   *
   */

  public function init() {
    $this->data = $this->modules->getConfig('GeneralSettings');
  }


  public function ___execute() {

    if ($this->input->post('submit_save')) {
      return $this->renderForm($this->saveValues());
      //wire('session')->redirect(wire('page')->url);
    } else {
      return $this->renderForm();
    }
  }

  /**
   * Render form for admin page
   * 
   * @return string form markup
   *
   */
  protected function renderForm($settings=null) {

    if (!isset($this->data['settings'])) {
      return 'Create settings in module configuration first.';
    }

    $data = $this->data;

    $attrs = json_decode( $settings ?:$data['settings'], true);
    if ($attrs === null) {
      return 'Error decoding settings data.';
    }

    $form = $this->modules->get('InputfieldForm'); 
    $form->attr('id', 'SettingsModule');
    $form->attr('action', $this->wire('page')->url );

    $parent = $form;
    foreach ($attrs as $fset) {
      $field = $this->modules->get('Inputfield'.$fset['type']);
      $value = (isset($fset['value']) ? $fset['value'] : '');

      //------- NEW --------
      if($fset['type'] == 'FieldsetClose') {
        $parent = $form;
        continue;
      }
      //------- END NEW --------

      if (!$field) {
        $this->message('Unable to find field type ' .$fset['type']);
        continue;
      }
      //set attrbs for all type of fields
      $field->label = $fset['label'];
      $field->columnWidth = (intval($fset['width']) >=10) ? $fset['width'] : 100;
      $field->description = $fset['description'];

      //------- NEW --------

      // Placeholder
      $field->placeholder = isset($fset['placeholder']) ? $fset['placeholder'] : '';

      // Collapsed
      if(isset($fset['collapsed']) && $fset['collapsed'] != 'Default') {
        if($fset['collapsed'] == 'collapsedNever') $field->collapsed = Inputfield::collapsedNever;
        if($fset['collapsed'] == 'collapsedBlank') $field->collapsed = Inputfield::collapsedBlank;
        if($fset['collapsed'] == 'collapsedYes') $field->collapsed = Inputfield::collapsedYes;
      }

      // Markup
      if ($fset['type'] == 'Markup') {
        $field->markupText = '<p>' . $fset['description'] . '</p>';
        $field->description = '';
      }

      //------- END NEW --------

      if ($fset['type'] == 'Checkbox') {
        $field->uncheckedValue = '0';
        if($value === '1') {
          $field->setAttribute('checked', 'checked'); 
        }
      }
      if ($fset['type'] == 'URL') {
        $field->set('noRelative', 1);
      }

      // enabled use of checkboxes
      if ($fset['type'] == 'Select' || $fset['type'] == 'Radios' || $fset['type'] == 'Checkboxes') {
        foreach (explode(',', trim($fset['select'], ',')) as $label) {
          //value, label, attr
          $v = $this->wire('sanitizer')->name($label);
          if ($value == $v) {
            $field->addOption($v, $label, array('selected' => 1));
          } else {
            $field->addOption($v, $label);
          }
        }
      }
      if ($fset['type'] == 'Integer') {
        $field->setAttribute('type', 'number');
      }

      //fieldset or normal field
      if ($fset['type'] == 'Fieldset') {
        $field->addClass('fset_red');
        $parent = $field;
        $form->append($field);
      } else {
        $field->attr('name', $fset['api']);
        $field->attr('value', $value); 
        $parent->append($field);
      }

    }


    $f = $this->modules->get('InputfieldSubmit'); 
    $f->attr('name', 'submit_save'); 
    $f->attr('value', $this->_('Save')); 
    $f->addClass('head_button_clone');
    $f->icon = 'save';

    $form->add($f);

    return $form->render();
  }

  /**
   * Save values provided by user to module config data
   * 
   */
  protected function saveValues() {

    $old = $this->data;
    $data = json_decode($old['settings'], true);
    $new = array();
    foreach ($data as $key => $field) {
      $new[$key] = $field;
      $new[$key]['value'] = $this->wire('input')->{$field['api']};
    }
    $old['settings'] = json_encode($new);
    wire('modules')->saveConfig('GeneralSettings', $old);
    $this->message('Site settings saved');  
    return $old['settings'];
  }



}