public function index($project = null) { if (empty($project)) { throw new Redirection('/discover', Redirection::PERMANENT); } if ($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['message'])) { $projectData = Model\Project::getMini($project); if ($projectData->status < 3) { \Goteo\Library\Message::Error(Text::get('project-messages-closed')); throw new Redirection("/project/{$project}"); } $message = new Model\Message(array('user' => $_SESSION['user']->id, 'project' => $project, 'thread' => $_POST['thread'], 'message' => $_POST['message'])); if ($message->save($errors)) { $support = Model\Message::isSupport($_POST['thread']); // Evento Feed $log = new Feed(); $log->setTarget($projectData->id); if (empty($_POST['thread'])) { // nuevo hilo $log_html = \vsprintf('%s ha creado un tema en %s del proyecto %s', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('message', Text::get('project-menu-messages'), $projectData->id . '/messages#message' . $message->id), Feed::item('project', $projectData->name, $projectData->id))); } else { // respuesta // si una respuesta a un mensaje de colaboraicón if (!empty($support)) { $log_html = \vsprintf('Nueva colaboración de %s con %s en el proyecto %s', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('message', $support, $projectData->id . '/messages#message' . $_POST['thread']), Feed::item('project', $projectData->name, $projectData->id))); } else { // es una respuesta a un hilo normal $log_html = \vsprintf('%s ha respondido en %s del proyecto %s', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('message', Text::get('project-menu-messages'), $projectData->id . '/messages#message' . $message->id), Feed::item('project', $projectData->name, $projectData->id))); } } $log->populate('usuario escribe mensaje/respuesta en Mensajes del proyecto', '/admin/projects', $log_html); $log->doAdmin('user'); // Evento público if (empty($_POST['thread'])) { $log_html = Text::html('feed-messages-new_thread', Feed::item('message', Text::get('project-menu-messages'), $projectData->id . '/messages#message' . $message->id), Feed::item('project', $projectData->name, $projectData->id)); } else { // si una respuesta a un mensaje de colaboraicón if (!empty($support)) { $log_html = Text::html('feed-message_support-response', Feed::item('message', $support, $projectData->id . '/messages#message' . $_POST['thread']), Feed::item('project', $projectData->name, $projectData->id)); } else { // es una respuesta a un hilo normal $log_html = Text::html('feed-messages-response', Feed::item('message', Text::get('project-menu-messages'), $projectData->id . '/messages#message' . $message->id), Feed::item('project', $projectData->name, $projectData->id)); } } $log->populate($_SESSION['user']->name, '/user/profile/' . $_SESSION['user']->id, $log_html, $_SESSION['user']->avatar->id); $log->doPublic('community'); unset($log); if (!empty($_POST['thread'])) { // aqui el owner es el autor del mensaje thread $thread = Model\Message::get($_POST['thread']); // Si no tiene estas notiicaciones bloqueadas en sus preferencias $sql = "\n SELECT user_prefer.threads\n FROM user_prefer\n WHERE user = :user\n "; $query = Model\Project::query($sql, array(':user' => $thread->user->id)); $spam = $query->fetchColumn(0); if (!$spam) { // Mail al autor del thread // Obtenemos la plantilla para asunto y contenido $template = Template::get(12); // Sustituimos los datos $subject = str_replace('%PROJECTNAME%', $projectData->name, $template->title); $response_url = SITE_URL . '/user/profile/' . $_SESSION['user']->id . '/message'; $project_url = SITE_URL . '/project/' . $projectData->id . '/messages#message' . $message->id; $search = array('%MESSAGE%', '%OWNERNAME%', '%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%RESPONSEURL%'); $replace = array($_POST['message'], $thread->user->name, $_SESSION['user']->name, $projectData->name, $project_url, $response_url); $content = \str_replace($search, $replace, $template->text); $mailHandler = new Mail(); $mailHandler->to = $thread->user->email; $mailHandler->toName = $thread->user->name; $mailHandler->subject = $subject; $mailHandler->content = $content; $mailHandler->html = true; $mailHandler->template = $template->id; $mailHandler->send($errors); unset($mailHandler); } } else { // mensaje al autor del proyecto // Obtenemos la plantilla para asunto y contenido $template = Template::get(30); // Sustituimos los datos $subject = str_replace('%PROJECTNAME%', $projectData->name, $template->title); $response_url = SITE_URL . '/user/profile/' . $_SESSION['user']->id . '/message'; $project_url = SITE_URL . '/project/' . $projectData->id . '/messages#message' . $message->id; $search = array('%MESSAGE%', '%OWNERNAME%', '%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%RESPONSEURL%'); $replace = array($_POST['message'], $projectData->user->name, $_SESSION['user']->name, $projectData->name, $project_url, $response_url); $content = \str_replace($search, $replace, $template->text); $mailHandler = new Mail(); $mailHandler->to = $projectData->user->email; $mailHandler->toName = $projectData->user->name; $mailHandler->subject = $subject; $mailHandler->content = $content; $mailHandler->html = true; $mailHandler->template = $template->id; $mailHandler->send($errors); unset($mailHandler); } } } throw new Redirection("/project/{$project}/messages#message" . $message->id, Redirection::TEMPORARY); }
/** * Graba las colaboraciones con lo recibido por POST * * @param object $project Instancia de proyecto de trabajo * @param array $errors (por referncia) * @return object $project Instancia de proyecto modificada */ public static function process_supports($project, &$errors = array()) { // tratar colaboraciones existentes foreach ($project->supports as $key => $support) { // quitar las colaboraciones marcadas para quitar if (!empty($_POST["support-{$support->id}-remove"])) { unset($project->supports[$key]); continue; } if (isset($_POST['support-' . $support->id . '-support'])) { $support->support = $_POST['support-' . $support->id . '-support']; $support->description = $_POST['support-' . $support->id . '-description']; $support->type = $_POST['support-' . $support->id . '-type']; if (!empty($support->thread)) { // actualizar ese mensaje $msg = Model\Message::get($support->thread); $msg->date = date('Y-m-d'); $msg->message = "{$support->support}: {$support->description}"; $msg->blocked = true; $msg->save(); } else { // grabar nuevo mensaje $msg = new Model\Message(array('user' => $project->owner, 'project' => $project->id, 'date' => date('Y-m-d'), 'message' => "{$support->support}: {$support->description}", 'blocked' => true)); if ($msg->save()) { // asignado a la colaboracion como thread inicial $support->thread = $msg->id; // Evento Feed $log = new Feed(); $log->setTarget($project->id); $log->populate('usuario pone una nueva colaboracion en su proyecto (dashboard)', '/admin/projects', \vsprintf('%s ha publicado una nueva %s en el proyecto %s, con el título "%s"', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('message', 'Colaboración'), Feed::item('project', $project->name, $project->id), Feed::item('update', $support->support, $project->id . '/messages#message' . $msg->id)))); $log->doAdmin('user'); // evento público, si el proyecto es público if ($project->status > 2) { $log->populate($_SESSION['user']->name, '/user/profile/' . $_SESSION['user']->id, Text::html('feed-new_support', Feed::item('project', $project->name, $project->id), Feed::item('update', $support->support, $project->id . '/messages#message' . $msg->id)), $_SESSION['user']->avatar->id); $log->doPublic('community'); } unset($log); } } } } // añadir nueva colaboracion (no hacemos lo del mensaje porque esta sin texto) if (!empty($_POST['support-add'])) { $new_support = new Model\Project\Support(array('project' => $project->id, 'support' => 'Nueva colaboración', 'type' => 'task', 'description' => '')); if ($new_support->save($errors)) { $project->supports[] = $new_support; $_POST['support-' . $new_support->id . '-edit'] = true; } else { $project->supports[] = new Model\Project\Support(array('project' => $project->id, 'support' => 'Nueva colaboración', 'type' => 'task', 'description' => '')); } } // guardamos los datos que hemos tratado y los errores de los datos $project->save($errors); return $project; }
private function process_supports(&$project, &$errors) { if (!isset($_POST['process_supports'])) { return false; } // tratar colaboraciones existentes foreach ($project->supports as $key => $support) { // quitar las colaboraciones marcadas para quitar if (!empty($_POST["support-{$support->id}-remove"])) { unset($project->supports[$key]); continue; } if (isset($_POST['support-' . $support->id . '-support'])) { $support->support = $_POST['support-' . $support->id . '-support']; $support->description = $_POST['support-' . $support->id . '-description']; $support->type = $_POST['support-' . $support->id . '-type']; if (!empty($support->thread)) { // actualizar ese mensaje $msg = Model\Message::get($support->thread); $msg->date = date('Y-m-d'); $msg->message = "{$support->support}: {$support->description}"; $msg->blocked = true; $msg->save($errors); } else { // grabar nuevo mensaje $msg = new Model\Message(array('user' => $project->owner, 'project' => $project->id, 'date' => date('Y-m-d'), 'message' => "{$support->support}: {$support->description}", 'blocked' => true)); if ($msg->save($errors)) { // asignado a la colaboracion como thread inicial $support->thread = $msg->id; } } } } // añadir nueva colaboracion if (!empty($_POST['support-add'])) { $project->supports[] = new Model\Project\Support(array('project' => $project->id, 'support' => 'Nueva colaboración', 'type' => 'task', 'description' => '')); } return true; }
public function publish(&$errors = array()) { try { $sql = "UPDATE project SET passed = NULL, status = :status, published = :published WHERE id = :id"; self::query($sql, array(':status' => 3, ':published' => date('Y-m-d'), ':id' => $this->id)); // borramos mensajes anteriores que sean de colaboraciones self::query("DELETE FROM message WHERE id IN (SELECT thread FROM support WHERE project = ?)", array($this->id)); // creamos los hilos de colaboración en los mensajes foreach ($this->supports as $id => $support) { $msg = new Message(array('user' => $this->owner, 'project' => $this->id, 'date' => date('Y-m-d'), 'message' => "{$support->support}: {$support->description}", 'blocked' => true)); if ($msg->save()) { // asignado a la colaboracion como thread inicial $sql = "UPDATE support SET thread = :message WHERE id = :support"; self::query($sql, array(':message' => $msg->id, ':support' => $support->id)); } unset($msg); } return true; } catch (\PDOException $e) { $errors[] = Text::_('No se ha grabado correctamente. ') . $e->getMessage(); return false; } }