We are no longer offering accounts on this server. Consider https://gitlab.freedesktop.org/ as a place to host projects.

form.php 4.78 KB
Newer Older
1 2
<?php
/**
3
 * StatusNet, the distributed open-source microblogging tool
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
 *
 * Base class for forms
 *
 * PHP version 5
 *
 * LICENCE: This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @category  Widget
23
 * @package   StatusNet
24 25
 * @author    Evan Prodromou <evan@status.net>
 * @author    Sarven Capadisli <csarven@status.net>
26
 * @copyright 2009 StatusNet, Inc.
27
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
28
 * @link      http://status.net/
29 30
 */

31
if (!defined('STATUSNET') && !defined('LACONICA')) {
32 33 34 35 36 37 38 39 40 41 42 43
    exit(1);
}

require_once INSTALLDIR.'/lib/widget.php';

/**
 * Base class for forms
 *
 * We have a lot of common forms (subscribe, fave, delete) and this superclass
 * lets us abstract out the basic features of the form.
 *
 * @category Widget
44
 * @package  StatusNet
45 46
 * @author   Evan Prodromou <evan@status.net>
 * @author   Sarven Capadisli <csarven@status.net>
47
 * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
48
 * @link     http://status.net/
49 50 51 52 53 54
 *
 * @see      HTMLOutputter
 */

class Form extends Widget
{
55 56
    var $enctype = null;

57 58 59 60 61 62 63 64 65 66 67
    /**
     * Show the form
     *
     * Uses a recipe to output the form.
     *
     * @return void
     * @see Widget::show()
     */

    function show()
    {
68 69
        $attributes = array('id' => $this->id(),
            'class' => $this->formClass(),
70
            'method' => $this->method(),
71 72 73 74 75 76
            'action' => $this->action());

        if (!empty($this->enctype)) {
            $attributes['enctype'] = $this->enctype;
        }
        $this->out->elementStart('form', $attributes);
77 78
        $this->out->elementStart('fieldset');
        $this->formLegend();
79 80 81
        $this->sessionToken();
        $this->formData();
        $this->formActions();
82
        $this->out->elementEnd('fieldset');
83 84 85 86 87 88 89 90 91 92 93
        $this->out->elementEnd('form');
    }

    /**
     * Include a session token for CSRF protection
     *
     * @return void
     */

    function sessionToken()
    {
94 95 96
        if (strtolower($this->method()) == 'post') {
            $this->out->hidden('token-' . $this->id() ?: common_random_hexstr(3), common_session_token(), 'token');
        }
97 98
    }

99 100 101 102 103 104 105 106 107 108 109 110
    /**
     * Name of the form
     *
     * Sub-classes should overload this with the name of their form.
     *
     * @return void
     */

    function formLegend()
    {
    }

111 112 113 114 115 116 117 118 119 120 121 122 123
    /**
     * Visible or invisible data elements
     *
     * Display the form fields that make up the data of the form.
     * Sub-classes should overload this to show their data.
     *
     * @return void
     */

    function formData()
    {
    }

124 125 126 127 128 129 130 131 132 133 134 135
    /**
     * HTTP method used to submit the form
     *
     * Defaults to post. Subclasses can override if they need to.
     *
     * @return string the method to use for submitting
     */
     function method()
     {
         return 'post';
     }

136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
    /**
     * Buttons for form actions
     *
     * Submit and cancel buttons (or whatever)
     * Sub-classes should overload this to show their own buttons.
     *
     * @return void
     */

    function formActions()
    {
    }

    /**
     * ID of the form
     *
     * Should be unique on the page. Sub-classes should overload this
     * to show their own IDs.
     *
     * @return int ID of the form
     */

    function id()
    {
        return null;
    }

    /**
     * Action of the form.
     *
     * URL to post to. Should be overloaded by subclasses to give
     * somewhere to post to.
     *
     * @return string URL to post to
     */

    function action()
    {
    }
175

176
    /**
177 178 179 180 181 182 183
     * Class of the form. May include space-separated list of multiple classes.
     *
     * If 'ajax' is included, the form will automatically be submitted with
     * an 'ajax=1' parameter added, and the resulting form or error message
     * will replace the form after submission.
     *
     * It's up to you to make sure that the target action supports this!
184 185 186 187 188 189
     *
     * @return string the form's class
     */

    function formClass()
    {
190
        return 'form';
191
    }
Zach Copley's avatar
Zach Copley committed
192

mattl's avatar
mattl committed
193
    function li($class=null)
Zach Copley's avatar
Zach Copley committed
194
    {
mattl's avatar
mattl committed
195
        $this->out->elementStart('li', $class);
Zach Copley's avatar
Zach Copley committed
196 197 198 199 200 201
    }

    function unli()
    {
        $this->out->elementEnd('li');
    }
202
}