id = $id; return $this; } public function setUser(PhabricatorUser $user) { $this->user = $user; return $this; } public function setAction($action) { $this->action = $action; return $this; } public function setMethod($method) { $this->method = $method; return $this; } public function setEncType($enc_type) { $this->encType = $enc_type; return $this; } public function addHiddenInput($key, $value) { $this->data[$key] = $value; return $this; } public function setWorkflow($workflow) { $this->workflow = $workflow; return $this; } public function render() { require_celerity_resource('aphront-form-view-css'); static $initialized_behavior; if (!$initialized_behavior) { // TODO: This is sort of a yucky hack. $initialized_behavior = true; Javelin::initBehavior( 'aphront-form-disable-on-submit', array()); } return javelin_render_tag( 'form', array( 'action' => $this->action, 'method' => $this->method, 'class' => 'aphront-form-view', 'enctype' => $this->encType, 'sigil' => $this->workflow ? 'workflow' : null, 'id' => $this->id, ), $this->renderDataInputs(). $this->renderChildren()); } private function renderDataInputs() { if (!$this->user) { throw new Exception('You must pass the user to AphrontFormView.'); } $data = $this->data + array( '__form__' => 1, '__csrf__' => $this->user->getCSRFToken(), ); $inputs = array(); foreach ($data as $key => $value) { if ($value === null) { continue; } $inputs[] = phutil_render_tag( 'input', array( 'type' => 'hidden', 'name' => $key, 'value' => $value, )); } return implode("\n", $inputs); } }