/** * Common posting stuff for post/reply/edit * * @param string $mode * @param \titania_post $post * @return JsonResponse|RedirectResponse|Response|null */ protected function common_post($mode, $post) { $this->user->add_lang('posting'); // Submit check...handles running $post->post_data() if required $submit = $this->message->submit_check(); $is_reply = $mode == 'edit' || $mode == 'reply'; $post_attachments = $this->message->has_attachments(); // Ensure that post_attachment remains valid when the user doesn't submit the post after deleting all attachments if ($mode == 'edit' && $post->post_attachment && empty($post_attachments)) { $sql = 'UPDATE ' . TITANIA_POSTS_TABLE . ' SET post_attachment = 0 WHERE post_id = ' . (int) $post->post_id; $this->db->sql_query($sql); } if ($this->message->is_plupload_request()) { return new JsonResponse($this->message->get_plupload_response_data()); } if ($submit) { $error = $post->validate(); if (($validate_form_key = $this->message->validate_form_key()) !== false) { $error[] = $validate_form_key; } // @todo use permissions for captcha if (!$this->user->data['is_registered'] && ($validate_captcha = $this->message->validate_captcha()) !== false) { $error[] = $validate_captcha; } $error = array_merge($error, $this->message->error); if (sizeof($error)) { $this->template->assign_var('ERROR', implode('<br />', $error)); } else { // Force Queue Discussion topics to always be stickies if ($post->post_type == TITANIA_QUEUE_DISCUSSION) { $post->topic->topic_sticky = true; } // Does the post need approval? Never for the Queue Discussion or Queue. Do not set again in edit mode, otherwise this causes problems when the post has been approved. if (!$this->auth->acl_get('u_titania_post_approved') && $post->post_type != TITANIA_QUEUE_DISCUSSION && $post->post_type != TITANIA_QUEUE && $mode != 'edit') { $post->post_approved = false; } $post->post_attachment = !empty($post_attachments); $post->parent_contrib_type = $this->parent_type; $post->submit(); $this->message->submit($post->post_access); // Did they want to subscribe? if ($this->request->is_set_post('notify') && $this->user->data['is_registered']) { $this->subscriptions->subscribe(TITANIA_TOPIC, $post->topic->topic_id); } // Unapproved posts will get a notice if (!$post->topic->get_postcount()) { return $this->controller_helper->message($this->user->lang['POST_STORED_MOD'] . '<br /><br />' . $this->user->lang('RETURN_INDEX', '<a href="' . $post->topic->get_parent_url() . '">', '</a>')); } else { if (!$post->post_approved) { return $this->controller_helper->message($this->user->lang['POST_STORED_MOD'] . '<br /><br />' . $this->user->lang('RETURN_TOPIC', '<a href="' . $post->topic->get_url() . '">', '</a>')); } else { // Send out subscription notifications if ($mode == 'post' || $mode == 'reply') { $this->send_notifications($post, $mode); } } } return new RedirectResponse($post->get_url()); } } else { if (!empty($this->message->error)) { $this->template->assign_var('ERROR', implode('<br />', $this->message->error)); } } // Do we subscribe to actual topic? $is_subscribed = $is_reply && $this->subscriptions->is_subscribed(TITANIA_TOPIC, $post->topic->topic_id); $can_subscribe = $this->user->data['is_registered'] && !$is_subscribed; $this->template->assign_vars(array('S_NOTIFY_ALLOWED' => $can_subscribe, 'S_NOTIFY_CHECKED' => $can_subscribe && $this->user->data['user_notify'] && $post->post_type == TITANIA_SUPPORT ? ' checked=checked' : '')); $topic_access_level = access::PUBLIC_LEVEL; if ($is_reply) { // If this is the first post, we'll allow lowering the access level, otherwise the topic access level is the minimum that can be set $topic_access_level = $post->post_id == $post->topic->topic_first_post_id ? access::PUBLIC_LEVEL : $post->topic->topic_access; } $this->message->display($topic_access_level); }