<commit_before><?php
/**
 * Базовый класс форм
 * @file    AbstractForm.php
 *
 * PHP version 5.3.9+
 *
 * @author  <NAME> <<EMAIL>>
 * @date    Вск Авг 12 10:30:52 2012
 * @copyright The BSD 3-Clause License
 */

namespace Veles\Form;

use \Veles\View;
use \Veles\Cache\Cache;
use \Veles\Validators\RegEx;
use \Veles\Form\Elements\iElement;
use \Veles\Form\Elements\ButtonElement;
use \Veles\Form\Elements\HiddenElement;
use \Veles\Form\Elements\SubmitElement;

/**
 * Класс AbstractForm
 * @author  <NAME> <<EMAIL>>
 */
abstract class AbstractForm implements iForm
{
    protected $method   = 'post';
    protected $template = null;
    protected $data     = null;
    protected $sid      = null;
    protected $name     = null;
    protected $action   = null;

    private $elements = array();

    /**
     * Конструктор
     * @param mixed $data Данные, которые могут понадобиться для генерации формы
     */
    abstract public function __construct($data = false);

    /**
     * Сохранение формы
     */
    abstract public function save();

    /**
     * Инициализиция значений по-умолчанию
     */
    final protected function init()
    {
        $this->data = ('get' === $this->method) ? $_GET : $_POST;
        $this->sid  = md5(mt_rand());

        $params = array(
            'validator'  => new RegEx('/^[a-f\d]{32}$/'),
            'required'   => true,
            'attributes' => array('name' => 'sid', 'value' => $this->sid)
        );
        $this->addElement(new HiddenElement($params));
    }

    /**
     * Добавление элемента формы
     * @param iElement $element Экземпляр элемента формы
     * @return void
     */
    final public function addElement(iElement $element)
    {
        $this->elements[] = $element;
    }

    /**
     * Валидатор формы
     * @return bool
     */
    final public function valid()
    {
        /** @var iElement $element*/
        foreach ($this->elements as $element) {
            if ($element instanceof ButtonElement
                || $element instanceof SubmitElement
            ) {
                continue;
            }

            $name = $element->getName();

            if (!isset($this->data[$name])) {
                if ($element->required()) {
                    return false;
                }

                continue;
            }

            if (!$element->validate($this->data[$name])) {
                return false;
            }
        }

        return true;
    }

    /**
     * Проверка была ли отправлена форма
     * @return bool
     */
    final public function submitted()
    {
        if (!isset($this->data['sid'])) {
            return false;
        }

        $key = $this->name . $this->data['sid'];

        if (!Cache::get($key)) {
            return false;
        }

        return true;
    }

    /**
     * Очистка security-ключа формы
     */
    final public function cleanup()
    {
        $key = $this->name . $this->data['sid'];
        Cache::del($key);
    }

    /**
     * Вывод формы
     * @return string
     */
    public function __toString()
    {
        $elements = $tpl = array();
        $output   = View::get($this->template);

        /** @var iElement $element */
        foreach ($this->elements as $number => $element) {
            $elements[] = $element->render($this);
            $tpl[]      = "#$number#";
        }

        $tpl      = array_merge($tpl, array("#method#", "#action#", "#name#"));
        $elements = array_merge(
            $elements,
            array(
                $this->method,
                $this->action,
                $this->name
            )
        );

        Cache::set($this->name . $this->sid, true, 7200);

        return str_replace($tpl, $elements, $output);
    }
}<commit_msg>Add method for getting form security id<commit_after><?php
/**
 * Базовый класс форм
 * @file    AbstractForm.php
 *
 * PHP version 5.3.9+
 *
 * @author  <NAME> <<EMAIL>>
 * @date    Вск Авг 12 10:30:52 2012
 * @copyright The BSD 3-Clause License
 */

namespace Veles\Form;

use \Veles\View;
use \Veles\Cache\Cache;
use \Veles\Validators\RegEx;
use \Veles\Form\Elements\iElement;
use \Veles\Form\Elements\ButtonElement;
use \Veles\Form\Elements\HiddenElement;
use \Veles\Form\Elements\SubmitElement;

/**
 * Класс AbstractForm
 * @author  <NAME> <<EMAIL>>
 */
abstract class AbstractForm implements iForm
{
    protected $method   = 'post';
    protected $template = null;
    protected $data     = null;
    protected $sid      = null;
    protected $name     = null;
    protected $action   = null;

    private $elements = array();

    /**
     * Конструктор
     * @param mixed $data Данные, которые могут понадобиться для генерации формы
     */
    abstract public function __construct($data = false);

    /**
     * Сохранение формы
     */
    abstract public function save();

    /**
     * Инициализиция значений по-умолчанию
     */
    final protected function init()
    {
        $this->data = ('get' === $this->method) ? $_GET : $_POST;
        $this->sid  = md5(mt_rand());

        $params = array(
            'validator'  => new RegEx('/^[a-f\d]{32}$/'),
            'required'   => true,
            'attributes' => array('name' => 'sid', 'value' => $this->sid)
        );
        $this->addElement(new HiddenElement($params));
    }

    /**
     * Добавление элемента формы
     * @param iElement $element Экземпляр элемента формы
     * @return void
     */
    final public function addElement(iElement $element)
    {
        $this->elements[] = $element;
    }

    /**
     * Валидатор формы
     * @return bool
     */
    final public function valid()
    {
        /** @var iElement $element*/
        foreach ($this->elements as $element) {
            if ($element instanceof ButtonElement
                || $element instanceof SubmitElement
            ) {
                continue;
            }

            $name = $element->getName();

            if (!isset($this->data[$name])) {
                if ($element->required()) {
                    return false;
                }

                continue;
            }

            if (!$element->validate($this->data[$name])) {
                return false;
            }
        }

        return true;
    }

    /**
     * Проверка была ли отправлена форма
     * @return bool
     */
    final public function submitted()
    {
        if (!isset($this->data['sid'])) {
            return false;
        }

        $key = $this->name . $this->data['sid'];

        if (!Cache::get($key)) {
            return false;
        }

        return true;
    }

    /**
     * Очистка security-ключа формы
     */
    final public function cleanup()
    {
        $key = $this->name . $this->data['sid'];
        Cache::del($key);
    }

    /**
     * Вывод формы
     * @return string
     */
    public function __toString()
    {
        $elements = $tpl = array();
        $output   = View::get($this->template);

        /** @var iElement $element */
        foreach ($this->elements as $number => $element) {
            $elements[] = $element->render($this);
            $tpl[]      = "#$number#";
        }

        $tpl      = array_merge($tpl, array("#method#", "#action#", "#name#"));
        $elements = array_merge(
            $elements,
            array(
                $this->method,
                $this->action,
                $this->name
            )
        );

        Cache::set($this->name . $this->sid, true, 7200);

        return str_replace($tpl, $elements, $output);
    }

    /**
     * Return form seciruty id
     *
     * Can be used for refresh sid after ajax-request
     *
     * @return string
     */
    public function getSid()
    {
        return $this->sid;
    }
}
{'fraction_non_alphanumeric': 0.14587085155647028, 'fraction_numerical': 0.005917159763313609, 'mean_word_length': 1.7071727019498608, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 78, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1317333', 'n_tokens_mistral': 2377, 'n_tokens_neox': 2367, 'n_words': 535}