/** * @test */ public function form_appears_and_saves() { Config::inst()->update('Controller', 'extensions', array('QuickFeedbackExtension')); $controller = new TestController(); $result = $controller->handleRequest(new SS_HTTPRequest('GET', 'form_appears_and_saves'), DataModel::inst()); $body = $result->getBody(); $this->assertContains('Form_QuickFeedbackForm', $body); $this->assertContains('Form_QuickFeedbackForm_Rating', $body); $this->assertContains('Form_QuickFeedbackForm_Comment', $body); preg_match('/action="([^"]+)"/', $body, $action); if (!count($action)) { $this->fail('No form action'); } preg_match('/name="SecurityID" value="([^"]+)"/', $body, $token); if (!count($action)) { $this->fail('No token'); } $parts = explode('/', $action[1]); $action = end($parts); $time = time(); $data = ['SecurityID' => $token[1], 'Rating' => '0', 'Comment' => 'comment at ' . $time]; $controller->handleRequest(new SS_HTTPRequest('POST', $action, array(), $data), DataModel::inst()); $existing = Feedback::get()->filter('Comment', 'comment at ' . $time)->first(); if (!$existing) { $this->fail('Record missing'); } }
/** * @param array $data * @param Form $form * * @return mixed */ public function doSubmit($data, $form) { $controller = Controller::curr(); $redirect = Director::baseURL() . $this->owner->URLSegment; if ((bool) Config::inst()->get('QuickFeedbackExtension', 'redirect_field') && isset($data['Redirect']) && Director::is_site_url($data['Redirect'])) { $redirect = Director::absoluteURL($data['Redirect'], true); } if (!$controller) { goto error; } $request = $controller->getRequest(); if (!$request) { goto error; } $limit = (int) Config::inst()->get('QuickFeedbackExtension', 'rate_limit'); $existing = Feedback::get()->filter('IP', $request->getIP())->sort('Created desc')->first(); if ($existing) { $created = $existing->dbObject('Created'); if (!$created) { goto error; } $seconds = abs(time() - strtotime($created->getValue())); $minutes = round($seconds / 60); if ($minutes <= $limit) { goto rate; } } $feedback = Feedback::create(); $feedback->Rating = $data['Rating']; $feedback->Comment = $data['Comment']; $feedback->IP = $request->getIP(); if (!empty($this->owner->ID)) { $feedback->PageID = $this->owner->ID; } if (!empty($this->owner->URLSegment)) { $feedback->URL = $this->owner->RelativeLink(); } if ((bool) Config::inst()->get('QuickFeedbackExtension', 'redirect_field') && isset($data['Redirect'])) { $feedback->URL = $data['Redirect']; } $feedback->write(); $form->sessionMessage(_t('QuickFeedback.ThanksMessage', 'Thanks for your comment!'), 'good'); return $this->owner->redirect($redirect . '?success=1'); error: $form->sessionMessage(_t('QuickFeedback.ErrorMessage', 'An error occurred!'), 'error'); return $this->owner->redirect($redirect . '?error=1'); rate: $form->sessionMessage(_t('QuickFeedback.RateMessage', 'Please wait a while before submitting!'), 'error'); return $this->owner->redirect($redirect . '?rate=1'); }
$dt = new YuiDatatable(); $dt->addColumn('id', '#', 'link', 'a/feedback/handle/', 'subject'); $dt->addColumn('time_created', 'Created'); $dt->addColumn('from', 'From', 'link', 'u/profile/'); $dt->setDataSource($list); echo $dt->render(); break; case 'handle': // child = tblFeedback.id function fbHandle($p) { $msg_id = Message::send($p['to'], $p['msg']); Feedback::markHandled($p['owner'], $msg_id); js_redirect('a/feedback/default'); } $fb = Feedback::get($this->child); if (!$fb) { die('Eppp'); } if ($fb->type == USER) { $from = User::get($fb->from); echo '<h2>User feedback from ' . $fb->name . '</h2>'; } echo 'Subject: ' . $fb->subject . '<br/>'; if ($fb->body) { echo 'Message: ' . nl2br($fb->body); } echo '<br/>'; if ($fb->type == USER) { $msg = "In response to your feedback:\n\n" . $fb->body; $frm = new XhtmlForm();