149 lines
3.3 KiB
PHP
149 lines
3.3 KiB
PHP
<?php
|
|
namespace Grav\Plugin;
|
|
|
|
use Grav\Common\Iterator;
|
|
use Grav\Common\Grav;
|
|
use Grav\Common\GravTrait;
|
|
use Grav\Common\Page\Page;
|
|
use RocketTheme\Toolbox\Event\Event;
|
|
|
|
class Form extends Iterator
|
|
{
|
|
use GravTrait;
|
|
|
|
/**
|
|
* @var array
|
|
*/
|
|
protected $values = array();
|
|
|
|
/**
|
|
* @var Page $page
|
|
*/
|
|
protected $page;
|
|
|
|
/**
|
|
* Create form for the given page.
|
|
*
|
|
* @param Page $page
|
|
*/
|
|
public function __construct(Page $page)
|
|
{
|
|
$this->page = $page;
|
|
|
|
$header = $page->header();
|
|
$this->rules = isset($header->rules) ? $header->rules : array();
|
|
$this->data = isset($header->data) ? $header->data : array();
|
|
$this->items = $header->form;
|
|
|
|
// Set form name if not set.
|
|
if (empty($this->items['name'])) {
|
|
$this->items['name'] = $page->slug();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Return page object for the form.
|
|
*
|
|
* @return Page
|
|
*/
|
|
public function page()
|
|
{
|
|
return $this->page;
|
|
}
|
|
|
|
/**
|
|
* Get value of given variable (or all values).
|
|
*
|
|
* @param string $name
|
|
* @return mixed
|
|
*/
|
|
public function value($name = null)
|
|
{
|
|
if (!$name) {
|
|
return $this->values;
|
|
}
|
|
return $this->getField($name, 'values');
|
|
}
|
|
|
|
/**
|
|
* Get value of given variable (or all values).
|
|
*
|
|
* @param string $name
|
|
* @return mixed
|
|
*/
|
|
public function setValue($name = null, $value = '')
|
|
{
|
|
if (!$name) {
|
|
return;
|
|
}
|
|
|
|
$this->values[$name] = $value;
|
|
}
|
|
|
|
/**
|
|
* Reset values.
|
|
*/
|
|
public function reset()
|
|
{
|
|
$this->values = array();
|
|
}
|
|
|
|
/**
|
|
* Handle form processing on POST action.
|
|
*/
|
|
public function post()
|
|
{
|
|
if (isset($_POST)) {
|
|
$this->values = (array) $_POST;
|
|
}
|
|
|
|
foreach($this->items['fields'] as $field) {
|
|
if ($field['type'] == 'checkbox') {
|
|
if (isset($this->values[$field['name']])) {
|
|
$this->values[$field['name']] = true;
|
|
} else {
|
|
$this->values[$field['name']] = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
$process = isset($this->items['process']) ? $this->items['process'] : array();
|
|
if (is_array($process)) {
|
|
foreach ($process as $action => $data) {
|
|
if (is_numeric($action)) {
|
|
$action = \key($data);
|
|
$data = $data[$action];
|
|
}
|
|
self::getGrav()->fireEvent('onFormProcessed', new Event(['form' => $this, 'action' => $action, 'params' => $data]));
|
|
}
|
|
} else {
|
|
// Default action.
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* @param string $name
|
|
* @param string $scope
|
|
* @return mixed|null
|
|
* @internal
|
|
*/
|
|
protected function getField($name, $scope = 'value')
|
|
{
|
|
$path = explode('.', $name);
|
|
|
|
$current = $this->{$scope};
|
|
foreach ($path as $field) {
|
|
if (is_object($current) && isset($current->{$field})) {
|
|
$current = $current->{$field};
|
|
} elseif (is_array($current) && isset($current[$field])) {
|
|
$current = $current[$field];
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
return $current;
|
|
}
|
|
}
|