public function index() { // sacamos su blog $blog = Model\Blog::get(\GOTEO_NODE, 'node'); $tags = Model\Blog\Post\Tag::getAll(); /* echo '<pre>'.print_r($tags, 1).'</pre>'; echo '<pre>'.print_r($blog->posts, 1).'</pre>'; die; * */ // al ser xml no usaremos vista // usaremos FeedWriter // configuracion $config = array('title' => 'Goteo Rss', 'description' => 'Blog Goteo.org rss', 'link' => SITE_URL, 'indent' => 6); $data = array('tags' => $tags, 'posts' => $blog->posts); \header("Content-Type: application/rss+xml"); echo Library\Rss::get($config, $data, $_GET['format']); // le preparamos los datos y se los pasamos }
public function index($post = null) { if (!empty($post)) { $show = 'post'; // -- Mensaje azul molesto para usuarios no registrados if (empty($_SESSION['user'])) { $_SESSION['jumpto'] = '/blog/' . $post; Message::Info(Text::html('user-login-required')); } } else { $show = 'list'; } // sacamos su blog $blog = Model\Blog::get(\GOTEO_NODE, 'node'); $filters = array(); if (isset($_GET['tag'])) { $tag = Model\Blog\Post\Tag::get($_GET['tag']); if (!empty($tag->id)) { $filters['tag'] = $tag->id; } } else { $tag = null; } if (isset($_GET['author'])) { $author = Model\User::getMini($_GET['author']); if (!empty($author->id)) { $filters['author'] = $author->id; } } else { $author = null; } if (!empty($filters)) { $blog->posts = Model\Blog\Post::getList($filters); } if (isset($post) && !isset($blog->posts[$post]) && $_GET['preview'] != $_SESSION['user']->id) { throw new \Goteo\Core\Redirection('/blog'); } // segun eso montamos la vista return new View('view/blog/index.html.php', array('blog' => $blog, 'show' => $show, 'filters' => $filters, 'post' => $post, 'owner' => \GOTEO_NODE)); }
private function view($id, $show, $post = null) { $project = Model\Project::get($id, LANG); // recompensas foreach ($project->individual_rewards as &$reward) { $reward->none = false; $reward->taken = $reward->getTaken(); // cofinanciadores quehan optado por esta recompensas // si controla unidades de esta recompensa, mirar si quedan if ($reward->units > 0 && $reward->taken >= $reward->units) { $reward->none = true; } } // mensaje cuando, sin estar en campaña, tiene fecha de publicación, es que la campaña ha sido cancelada if ($project->status < 3 && !empty($project->published)) { Message::Info(Text::get('project-unpublished')); } elseif ($project->status < 3) { // mensaje de no publicado siempre que no esté en campaña Message::Info(Text::get('project-not_published')); } // solamente se puede ver publicamente si... $grant = false; if ($project->status > 2) { // está publicado $grant = true; } elseif ($project->owner == $_SESSION['user']->id) { // es el dueño $grant = true; } elseif (ACL::check('/project/edit/todos')) { // es un admin $grant = true; } elseif (ACL::check('/project/view/todos')) { // es un usuario con permiso $grant = true; } elseif (isset($_SESSION['user']->roles['checker']) && Model\User\Review::is_assigned($_SESSION['user']->id, $project->id)) { // es un revisor y lo tiene asignado $grant = true; } // (Callsys) // si lo puede ver if ($grant) { $viewData = array('project' => $project, 'show' => $show); // sus entradas de novedades $blog = Model\Blog::get($project->id); // si está en modo preview, ponemos todas las entradas, incluso las no publicadas if (isset($_GET['preview']) && $_GET['preview'] == $_SESSION['user']->id) { $blog->posts = Model\Blog\Post::getAll($blog->id, null, false); } $viewData['blog'] = $blog; // tenemos que tocar esto un poquito para motrar las necesitades no economicas if ($show == 'needs-non') { $viewData['show'] = 'needs'; $viewData['non-economic'] = true; } // -- Mensaje azul molesto para usuarios no registrados if (($show == 'messages' || $show == 'updates') && empty($_SESSION['user'])) { Message::Info(Text::html('user-login-required')); } //tenemos que tocar esto un poquito para gestionar los pasos al aportar if ($show == 'invest') { // si no está en campaña no pueden estar aqui ni de coña if ($project->status != 3) { Message::Info(Text::get('project-invest-closed')); throw new Redirection('/project/' . $id, Redirection::TEMPORARY); } $viewData['show'] = 'supporters'; /* pasos de proceso aporte * * 1, 'start': ver y seleccionar recompensa (y cantidad) * 2, 'login': loguear con usuario/contraseña o con email (que crea el usuario automáticamente) * 3, 'confirm': confirmar los datos y saltar a la pasarela de pago * 4, 'ok'/'fail': al volver de la pasarela de pago, la confirmación nos dice si todo bien o algo mal * 5, 'continue': recuperar aporte incompleto (variante de confirm) */ // usamos la variable de url $post para movernos entre los pasos $step = isset($post) && in_array($post, array('start', 'login', 'confirm', 'continue')) ? $post : 'start'; // si llega confirm ya ha terminado el proceso de aporte if (isset($_GET['confirm']) && \in_array($_GET['confirm'], array('ok', 'fail'))) { unset($_SESSION['invest-amount']); // confirmación $step = $_GET['confirm']; } else { // si no, a ver en que paso estamos if (isset($_GET['amount'])) { $_SESSION['invest-amount'] = $_GET['amount']; } // si el usuario está validado, recuperamos posible amount y mostramos if ($_SESSION['user'] instanceof Model\User) { $step = 'confirm'; } elseif ($step != 'start' && empty($_SESSION['user'])) { // si no está validado solo puede estar en start Message::Info(Text::get('user-login-required-to_invest')); $step = 'start'; } elseif ($step == 'start') { // para cuando salte $_SESSION['jumpto'] = SEC_URL . '/project/' . $id . '/invest/#continue'; } else { $step = 'start'; } } $viewData['step'] = $step; } if ($show == 'updates') { $viewData['post'] = $post; $viewData['owner'] = $project->owner; } if ($show == 'messages' && $project->status < 3) { Message::Info(Text::get('project-messages-closed')); } return new View('view/project/view.html.php', $viewData); } else { // no lo puede ver throw new Redirection("/"); } }
public static function Projects($debug = false) { // proyectos a notificar $projects = Model\Project::review(); // para cada uno, foreach ($projects as $project) { // por ahora solo tratamos los de primera ronda y hasta 2 meses tras la financiación if ($project->days > 40 || $project->days > 360) { continue; } if ($debug) { echo "Proyecto {$project->name}, Impulsor: {$project->user->name}, email: {$project->user->email}, estado {$project->status}, lleva {$project->days} dias<br />"; } // primero los que no se bloquean // Recuerdo al autor proyecto, 2 meses despues de campaña finalizada if ($project->days == 140) { // si quedan recompensas/retornos pendientes por cumplir if (!Model\Project\Reward::areFulfilled($project->id) || !Model\Project\Reward::areFulfilled($project->id, 'social')) { if ($debug) { echo "Recompensas/Retornos pendientes<br />"; } Send::toOwner('2m_after', $project); } else { if ($debug) { echo "Recompensas/Retornos cumplidas, no se envía<br />"; } } } // Recuerdo al autor proyecto, 8 meses despues de campaña finalizada if ($project->days == 320) { // si quedan retornos pendientes por cumplir if (!Model\Project\Reward::areFulfilled($project->id, 'social')) { if ($debug) { echo "Retornos pendientes<br />"; } Send::toOwner('8m_after', $project); } else { if ($debug) { echo "Retornos cumplidos, no se envía<br />"; } } } // ahora checkeamos bloqueo de consejos $prefs = Model\User::getPreferences($project->owner); if ($prefs->tips) { if ($debug) { echo "Bloqueado por preferencias<hr />"; } continue; } // flag de aviso $avisado = false; // Consejos/avisos puntuales switch ($project->days) { // NO condicionales case 1: // Difunde, difunde, difunde // Difunde, difunde, difunde case 2: // Comienza por lo más próximo // Comienza por lo más próximo case 3: // Una acción a diario, por pequeña que sea // Una acción a diario, por pequeña que sea case 4: // Llama a todas las puertas // Llama a todas las puertas case 5: // Busca dónde está tu comunidad // Busca dónde está tu comunidad case 8: // Agradece en público e individualmente $template = 'tip_' . $project->days; if ($debug) { echo "Envío {$template}<br />"; } Send::toOwner($template, $project); break; // periodico condicional // periodico condicional case 6: // Publica novedades! // y se repite cada 6 días (fechas libres) mientras no haya posts // Publica novedades! // y se repite cada 6 días (fechas libres) mientras no haya posts case 12: case 18: case 24: case 30: case 36: // si ya hay novedades, nada if (Model\Blog::hasUpdates($project->id)) { if ($debug) { echo "Ya ha publicado novedades<br />"; } } else { if ($debug) { echo "Envío aviso de que no ha publicado novedades<br />"; } Send::toOwner('any_update', $project); $avisado = true; } break; // comprobación periódica pero solo un envío // comprobación periódica pero solo un envío case 7: // Apóyate en quienes te van apoyando , si más de 20 cofinanciadores // o en cuanto llegue a 20 backers (en fechas libres) // Apóyate en quienes te van apoyando , si más de 20 cofinanciadores // o en cuanto llegue a 20 backers (en fechas libres) case 14: case 17: case 21: case 24: case 27: // Si ya se mandó esta plantilla (al llegar a los 20 por primera vez) no se envía de nuevo $sql = "\n SELECT\n id\n FROM mail\n WHERE mail.email = :email\n AND mail.template = 46\n ORDER BY mail.date DESC\n LIMIT 1"; $query = Model\Project::query($sql, array(':email' => $project->user->email)); $sended = $query->fetchColumn(0); if (!$sended) { if ($project->num_investors >= 20) { if ($debug) { echo "Tiene 20 backers y no se le habia enviado aviso antes<br />"; } Send::toOwner('20_backers', $project); } else { if ($debug) { echo "No llega a los 20 backers<br />"; } } } else { if ($debug) { echo "Ya enviado<br />"; } } break; case 9: // Busca prescriptores e implícalos // si no tiene padrinos if ($project->patrons > 0) { if ($debug) { echo "Tiene padrino<br />"; } } else { if ($debug) { echo "No tiene padrino<br />"; } Send::toOwner('tip_9', $project); } break; case 10: // Luce tus recompensas y retornos // que no se envie a los que solo tienen recompensas de agradecimiento $thanksonly = true; // recompensas $rewards = Model\Project\Reward::getAll($project->id, 'individual', \LANG); foreach ($rewards as $rew) { if ($rew->icon != 'thanks') { $thanksonly = false; break; // ya salimos del bucle, no necesitamos más } } if ($thanksonly) { if ($debug) { echo "Solo tiene recompensas de agradecimiento<br />"; } } else { if ($debug) { echo "Tienen recompensas<br />"; } uasort($rewards, function ($a, $b) { if ($a->amount == $b->amount) { return 0; } return $a->amount > $b->amount ? 1 : -1; }); // sacar la primera y la última $lower = reset($rewards); $project->lower = $lower->reward; $higher = end($rewards); $project->higher = $higher->reward; Send::toOwner('tip_10', $project); } break; case 11: // Refresca tu mensaje de motivacion // si no tiene video motivacional if (empty($project->video)) { if ($debug) { echo "No tiene video motivacional<br />"; } Send::toOwner('tip_11', $project); } else { if ($debug) { echo "Tiene video motivacional<br />"; } } break; case 15: // Sigue los avances y calcula lo que falta // si no ha llegado al mínimo if ($project->invested < $project->mincost) { if ($debug) { echo "No ha llegado al mínimo<br />"; } Send::toOwner('tip_15', $project); } else { if ($debug) { echo "Ha llegado al mínimo<br />"; } } break; case 25: // No bajes la guardia! // si no ha llegado al mínimo if ($project->invested < $project->mincost) { if ($debug) { echo "No ha llegado al mínimo<br />"; } Send::toOwner('two_weeks', $project); } else { if ($debug) { echo "Ha llegado al mínimo<br />"; } } break; case 32: // Al proyecto le faltan 8 días para archivarse // si no ha llegado al mínimo if ($project->invested < $project->mincost) { if ($debug) { echo "No ha llegado al mínimo<br />"; } Send::toOwner('8_days', $project); } else { if ($debug) { echo "Ha llegado al mínimo<br />"; } } break; case 38: // Al proyecto le faltan 2 días para archivarse // si no ha llegado al mínimo pero está por encima del 70% if ($project->invested < $project->mincost && $project->percent >= 70) { if ($debug) { echo "No ha llegado al mínimo<br />"; } Send::toOwner('2_days', $project); } else { if ($debug) { echo "Ha llegado al mínimo o lleva menos de 70%<br />"; } } break; } // Avisos periodicos // si lleva más de 15 días: si no se han publicado novedades en la última semana // Ojo! que si no a enviado ninguna no lanza este sino la de cada 6 días if (!$avisado && $project->days > 15) { if ($debug) { echo "ya lleva una quincena de campaña, verificamos novedades<br />"; } // veamos si ya le avisamos hace una semana // Si ya se mandó esta plantilla (al llegar a los 20 por primera vez) no se envía de nuevo $sql = "\n SELECT\n id,\n DATE_FORMAT(\n from_unixtime(unix_timestamp(now()) - unix_timestamp(date))\n , '%j'\n ) as days\n FROM mail\n WHERE mail.email = :email\n AND mail.template = 23\n ORDER BY mail.date DESC\n LIMIT 1"; $query = Model\Project::query($sql, array(':email' => $project->user->email)); $lastsend = $query->fetchObject(); if (!$lastsend->id || $lastsend->days > 7) { // veamos cuanto hace de la última novedad $sql = "\n SELECT\n DATE_FORMAT(\n from_unixtime(unix_timestamp(now()) - unix_timestamp(date))\n , '%j'\n ) as days\n FROM post\n INNER JOIN blog\n ON post.blog = blog.id\n AND blog.type = 'project'\n AND blog.owner = :project\n WHERE post.publish = 1\n ORDER BY post.date DESC\n LIMIT 1"; $query = Model\Project::query($sql, array(':project' => $project->id)); $lastUpdate = $query->fetchColumn(0); if ($lastUpdate > 7) { if ($debug) { echo "Ultima novedad es de hace más de una semana<br />"; } Send::toOwner('no_updates', $project); } elseif (is_numeric($lastUpdate)) { if ($debug) { echo "Publicó novedad hace menos de una semana<br />"; } } else { if ($debug) { echo "No se ha publicado nada, recibirá el de cada 6 días<br />"; } } } else { if ($debug) { echo "Se le avisó por novedades hace menos de una semana<br />"; } } } if ($debug) { echo "<hr />"; } } if ($debug) { echo "<br />Auto-tips Listo!<hr />"; } return; }
public static function process($action = 'list', $id = null, $filters = array()) { $errors = array(); $node = empty($_SESSION['admin_node']) ? \GOTEO_NODE : $_SESSION['admin_node']; $blog = Model\Blog::get($node, 'node'); if (!$blog instanceof \Goteo\Model\Blog) { $blog = new Model\Blog(array('type' => 'node', 'owner' => $node, 'active' => 1)); if ($blog->save($errors)) { Message::Info(Text::get('admin-blog-info-initialize')); } else { Message::Error(Text::get('admin-blog-error-initialize')); throw new Redirection('/admin'); } } elseif (!$blog->active) { Message::Error(Text::get('admin-blog-error-no_blog')); throw new Redirection('/admin'); } // primero comprobar que tenemos blog if (!$blog instanceof Model\Blog) { Message::Error(Text::get('admin-blog-error-not_found')); throw new Redirection('/admin'); } $url = '/admin/blog'; if ($_SERVER['REQUEST_METHOD'] == 'POST') { if (empty($_POST['blog'])) { Message::Error(Text::get('admin-blog-error_missing_blog')); break; } $editing = false; if (!empty($_POST['id'])) { $post = Model\Blog\Post::get($_POST['id']); } else { $post = new Model\Blog\Post(); } // campos que actualizamos $fields = array('id', 'blog', 'title', 'text', 'image', 'media', 'legend', 'date', 'publish', 'home', 'footer', 'allow', 'author'); foreach ($fields as $field) { $post->{$field} = $_POST[$field]; } // tratar la imagen y ponerla en la propiedad image if (!empty($_FILES['image_upload']['name'])) { $post->image = $_FILES['image_upload']; $editing = true; } // tratar las imagenes que quitan foreach ($post->gallery as $key => $image) { if (!empty($_POST["gallery-{$image->id}-remove"])) { $image->remove('post'); unset($post->gallery[$key]); if ($post->image == $image->id) { $post->image = ''; } $editing = true; } } if (!empty($post->media)) { $post->media = new Model\Project\Media($post->media); } $post->tags = $_POST['tags']; // si tenemos un nuevio tag hay que añadirlo if (!empty($_POST['new-tag_save']) && !empty($_POST['new-tag'])) { // grabar el tag en la tabla de tag, $new_tag = new Model\Blog\Post\Tag(array('id' => '', 'name' => $_POST['new-tag'])); if ($new_tag->save($errors)) { $post->tags[] = $new_tag->id; // asignar al post } else { Message::Error(implode('<br />', $errors)); } $editing = true; // seguir editando } /// este es el único save que se lanza desde un metodo process_ if ($post->save($errors)) { if ($action == 'edit') { Message::Info(Text::get('admin-blog-info-updates-saved')); } else { Message::Info(Text::get('admin-blog-info-add_new')); $id = $post->id; } $action = $editing ? 'edit' : 'list'; if ((bool) $post->publish) { // Evento Feed $log = new Feed(); $log->setTarget('goteo', 'blog'); $log->populate('nueva entrada blog Goteo (admin)', '/admin/blog', \vsprintf('El admin %s ha %s en el blog Goteo la entrada "%s"', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('relevant', 'Publicado'), Feed::item('blog', $post->title, $post->id)))); $log->doAdmin('admin'); // evento público $log->unique = true; $log->populate($post->title, '/blog/' . $post->id, Text::recorta($post->text, 250), $post->gallery[0]->id); $log->doPublic('goteo'); unset($log); } else { //sino lo quitamos \Goteo\Core\Model::query("DELETE FROM feed WHERE url = '/blog/{$post->id}' AND scope = 'public' AND type = 'goteo'"); } } else { Message::Error(Text::get('admin-blog-error-save-fail') . ':<br />' . \implode('<br />', $errors)); } } switch ($action) { case 'list': // lista de entradas // obtenemos los datos $filters['node'] = $node; $show = array('all' => 'Todas las entradas existentes', 'published' => 'Solamente las publicadas en el blog', 'owned' => 'Solamente las del propio nodo', 'home' => 'Solamente las de portada', 'entries' => 'Solamente las de cierto nodo', 'updates' => 'Solamente las de proyectos'); // filtro de blogs de proyectos/nodos switch ($filters['show']) { case 'updates': $blogs = Model\Blog::getListProj(); break; case 'entries': $blogs = Model\Blog::getListNode(); break; } if (!in_array($filters['show'], array('entries', 'updates')) || !isset($blogs[$filters['blog']])) { unset($filters['blog']); } $posts = Model\Blog\Post::getList($filters, false); $homes = Model\Post::getList('home', $node); $footers = Model\Post::getList('footer', $node); if ($node == \GOTEO_NODE) { $show['footer'] = 'Solamente las del footer'; } return new View('view/admin/index.html.php', array('folder' => 'blog', 'file' => 'list', 'posts' => $posts, 'filters' => $filters, 'show' => $show, 'blogs' => $blogs, 'homes' => $homes, 'footers' => $footers, 'node' => $node)); break; case 'add': // nueva entrada con wisiwig // obtenemos datos basicos $post = new Model\Blog\Post(array('blog' => $blog->id, 'date' => date('Y-m-d'), 'publish' => false, 'allow' => true, 'tags' => array(), 'author' => $_SESSION['user']->id)); $message = 'Añadiendo una nueva entrada'; return new View('view/admin/index.html.php', array('folder' => 'blog', 'file' => 'edit', 'action' => 'add', 'post' => $post, 'tags' => Model\Blog\Post\Tag::getAll(), 'message' => $message)); break; case 'edit': if (empty($id)) { Message::Error(Text::get('admin-blog-error-nopost')); throw new Redirection('/admin/blog'); break; } else { $post = Model\Blog\Post::get($id); if (!$post instanceof Model\Blog\Post) { Message::Error(Text::get('admin-blog-error-break_entry')); $action = 'list'; break; } elseif ($node != \GOTEO_NODE && $post->owner_type == 'node' && $post->owner_id != $node) { Message::Error(Text::get('admin-blog-error-noedit')); throw new Redirection('/admin/blog/list'); } } $message = 'Editando una entrada existente'; return new View('view/admin/index.html.php', array('folder' => 'blog', 'file' => 'edit', 'action' => 'edit', 'post' => $post, 'tags' => Model\Blog\Post\Tag::getAll(), 'message' => $message)); break; case 'remove': // eliminar una entrada $tempData = Model\Blog\Post::get($id); if ($node != \GOTEO_NODE && $tempData->owner_type == 'node' && $tempData->owner_id != $node) { Message::Error(Text::get('admin-blog-error-nodelete')); throw new Redirection('/admin/blog'); } if (Model\Blog\Post::delete($id)) { // Evento Feed $log = new Feed(); $log->setTarget('goteo', 'blog'); $log->populate('Quita entrada de blog (admin)', '/admin/blog', \vsprintf('El admin %s ha %s la entrada "%s" del blog de Goteo', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('relevant', 'Quitado'), Feed::item('blog', $tempData->title)))); $log->doAdmin('admin'); unset($log); Message::Info(Text::get('admin-blog-info-deleted_entry')); } else { Message::Error(Text::get('admin-blog-error-delete-fail')); } throw new Redirection('/admin/blog/list'); break; // acciones portada // acciones portada case 'reorder': // lista de entradas en portada // obtenemos los datos $posts = Model\Post::getAll('home', $node); return new View('view/admin/index.html.php', array('folder' => 'blog', 'file' => 'order', 'posts' => $posts)); break; case 'up': if ($node != \GOTEO_NODE) { Model\Post::up_node($id, $node); } else { Model\Post::up($id, 'home'); } throw new Redirection('/admin/blog/reorder'); break; case 'down': if ($node != \GOTEO_NODE) { Model\Post::up_node($id, $node); } else { Model\Post::down($id, 'home'); } throw new Redirection('/admin/blog/reorder'); break; case 'add_home': // siguiente orden if ($node != \GOTEO_NODE) { $next = Model\Post::next_node($node); $data = (object) array('post' => $id, 'node' => $node, 'order' => $next); if (Model\Post::update_node($data, $errors)) { Message::Info(Text::get('admin-blog-info-add-home')); } else { Message::Error(Text::get('admin-blog-error-any-problem') . ':<br />' . \implode('<br />', $errors)); } } else { $next = Model\Post::next('home'); $post = new Model\Post(array('id' => $id, 'order' => $next, 'home' => 1)); if ($post->update($errors)) { Message::Info(Text::get('admin-blog-info-add-home')); } else { Message::Error(Text::get('admin-blog-error-any-problem') . ':<br />' . \implode('<br />', $errors)); } } throw new Redirection('/admin/blog/list'); break; case 'remove_home': // se quita de la portada solamente $ok = false; if ($node != \GOTEO_NODE) { $ok = Model\Post::remove_node($id, $node); } else { $ok = Model\Post::remove($id, 'home'); } if ($ok) { Message::Info(Text::get('admin-blog-info-removecover')); } else { Message::Error(Text::get('admin-blog-error-cover-deletefail')); } throw new Redirection('/admin/blog/list'); break; // acciones footer (solo para superadmin y admins de goteo // acciones footer (solo para superadmin y admins de goteo case 'footer': if ($node == \GOTEO_NODE) { // lista de entradas en el footer // obtenemos los datos $posts = Model\Post::getAll('footer'); return new View('view/admin/index.html.php', array('folder' => 'blog', 'file' => 'footer', 'posts' => $posts)); } else { throw new Redirection('/admin/blog/list'); } break; case 'up_footer': if ($node == \GOTEO_NODE) { Model\Post::up($id, 'footer'); throw new Redirection('/admin/blog/footer'); } else { throw new Redirection('/admin/blog'); } break; case 'down_footer': if ($node == \GOTEO_NODE) { Model\Post::down($id, 'footer'); throw new Redirection('/admin/blog/footer'); } else { throw new Redirection('/admin/blog'); } break; case 'add_footer': if ($node == \GOTEO_NODE) { // siguiente orden $next = Model\Post::next('footer'); $post = new Model\Post(array('id' => $id, 'order' => $next, 'footer' => 1)); if ($post->update($errors)) { Message::Info(Text::get('admin-blog-info-footer-complete')); } else { Message::Error(Text::get('admin-blog-error-any-problem') . ':<br />' . \implode('<br />', $errors)); } } throw new Redirection('/admin/blog'); break; case 'remove_footer': if ($node == \GOTEO_NODE) { // se quita del footer solamente if (Model\Post::remove($id, 'footer')) { Message::Info(Text::get('admin-blog-info-footer-delete')); } else { Message::Error(Text::get('admin-blog-error-footer-deletefail')); } } throw new Redirection('/admin/blog/list'); break; } }
/** * Verifica que todo está correcto para publicar novedades * * @param type $project Instancia de proyecto de trabajo * @return \Goteo\Controller\Dashboard\Blog * @throws Redirection a Mis Proyectos si hay algo mal */ public static function verifyBlog($project) { $errors = array(); // tenemos proyecto de trabajo, comprobar si el proyecto esta en estado de tener blog if ($project->status < 3 || $project->status == 6) { Message::Error(Text::get('dashboard-project-blog-wrongstatus')); throw new Redirection('/dashboard/projects/summary'); } // si no tiene registro de blog se lo creamos $blog = Model\Blog::get($project->id); if (!$blog instanceof Model\Blog) { $blog = new Model\Blog(array('id' => '', 'type' => 'project', 'owner' => $project->id, 'active' => true, 'project' => $project->id, 'posts' => array())); if (!$blog->save($errors)) { Message::Error(Text::get('dashboard-project-blog-fail')); Message::Error(implode('<br />', $errors)); throw new Redirection('/dashboard/projects/summary'); } } elseif (!$blog->active) { Message::Error(Text::get('dashboard-project-blog-inactive')); throw new Redirection('/dashboard/projects/summary'); } return $blog; }
public function translates($option = 'overview', $action = 'list', $id = null) { $user = $_SESSION['user']; $errors = array(); $langs = \Goteo\Library\i18n\Lang::getAll(); if ($action == 'lang' && !empty($_POST['lang'])) { $_SESSION['translate_lang'] = $_POST['lang']; } elseif (empty($_SESSION['translate_lang'])) { $_SESSION['translate_lang'] = 'en'; } $projects = Model\User\Translate::getMyProjects($user->id); // al seleccionar controlamos: translate_type if ($action == 'select' && !empty($_POST['type'])) { unset($_SESSION['translate_project']); // quitamos el proyecto de traducción $type = $_POST['type']; if (!empty($_POST[$type])) { $_SESSION['translate_type'] = $type; $_SESSION['translate_' . $type] = $_POST[$type]; } else { $_SESSION['translate_type'] = 'profile'; } } // view data basico para esta seccion $viewData = array('menu' => self::menu(), 'section' => __FUNCTION__, 'option' => $option, 'action' => $action, 'langs' => $langs, 'projects' => $projects, 'errors' => $errors, 'success' => $success); // aqui, segun lo que este traduciendo, necesito tener un proyecto de trabajo, una convocatoria o mi perfil personal switch ($_SESSION['translate_type']) { case 'project': try { // si lo que tenemos en sesion no es una instancia de proyecto (es una id de proyecto) if ($_SESSION['translate_project'] instanceof Model\Project) { $project = Model\Project::get($_SESSION['translate_project']->id, $_SESSION['translate_lang']); } else { $project = Model\Project::get($_SESSION['translate_project'], $_SESSION['translate_lang']); } } catch (\Goteo\Core\Error $e) { $project = null; } if (!$project instanceof Model\Project) { Message::Error('Ha fallado al cargar los datos del proyecto'); $_SESSION['translate_type'] = 'profile'; throw new Redirection('/dashboard/translates'); } $_SESSION['translate_project'] = $project; $project->lang_name = $langs[$project->lang]->name; unset($viewData['langs'][$project->lang]); // quitamos el idioma original //// Control de traduccion de proyecto if ($option == 'updates') { // sus novedades $blog = Model\Blog::get($project->id); if ($action != 'edit') { $action = 'list'; } } // tratar lo que llega por post para guardar los datos if ($_SERVER['REQUEST_METHOD'] == 'POST') { switch ($option) { case 'profile': if ($action == 'save') { $user = Model\User::get($_POST['id'], $_SESSION['translate_lang']); $user->about_lang = $_POST['about']; $user->keywords_lang = $_POST['keywords']; $user->contribution_lang = $_POST['contribution']; $user->lang = $_SESSION['translate_lang']; $user->saveLang($errors); } break; case 'overview': if ($action == 'save') { $project->description_lang = $_POST['description']; $project->motivation_lang = $_POST['motivation']; $project->video_lang = $_POST['video']; $project->about_lang = $_POST['about']; $project->goal_lang = $_POST['goal']; $project->related_lang = $_POST['related']; $project->reward_lang = $_POST['reward']; $project->keywords_lang = $_POST['keywords']; $project->media_lang = $_POST['media']; $project->subtitle_lang = $_POST['subtitle']; $project->lang_lang = $_SESSION['translate_lang']; $project->saveLang($errors); } break; case 'costs': if ($action == 'save') { foreach ($project->costs as $key => $cost) { if (isset($_POST['cost-' . $cost->id . '-cost'])) { $cost->cost_lang = $_POST['cost-' . $cost->id . '-cost']; $cost->description_lang = $_POST['cost-' . $cost->id . '-description']; $cost->lang = $_SESSION['translate_lang']; $cost->saveLang($errors); } } } break; case 'rewards': if ($action == 'save') { foreach ($project->social_rewards as $k => $reward) { if (isset($_POST['social_reward-' . $reward->id . '-reward'])) { $reward->reward_lang = $_POST['social_reward-' . $reward->id . '-reward']; $reward->description_lang = $_POST['social_reward-' . $reward->id . '-description']; $reward->other_lang = $_POST['social_reward-' . $reward->id . '-other']; $reward->lang = $_SESSION['translate_lang']; $reward->saveLang($errors); } } foreach ($project->individual_rewards as $k => $reward) { if (isset($_POST['individual_reward-' . $reward->id . '-reward'])) { $reward->reward_lang = $_POST['individual_reward-' . $reward->id . '-reward']; $reward->description_lang = $_POST['individual_reward-' . $reward->id . '-description']; $reward->other_lang = $_POST['individual_reward-' . $reward->id . '-other']; $reward->lang = $_SESSION['translate_lang']; $reward->saveLang($errors); } } } break; case 'supports': if ($action == 'save') { // tratar colaboraciones existentes foreach ($project->supports as $key => $support) { if (isset($_POST['support-' . $support->id . '-support'])) { // guardamos los datos traducidos $support->support_lang = $_POST['support-' . $support->id . '-support']; $support->description_lang = $_POST['support-' . $support->id . '-description']; $support->lang = $_SESSION['translate_lang']; $support->saveLang($errors); // actualizar el Mensaje correspondiente, solamente actualizar $msg = Model\Message::get($support->thread); $msg->message_lang = "{$support->support_lang}: {$support->description_lang}"; $msg->lang = $_SESSION['translate_lang']; $msg->saveLang($errors); } } } break; case 'updates': if (empty($_POST['blog']) || empty($_POST['id'])) { break; } $post = Model\Blog\Post::get($_POST['id']); $post->title_lang = $_POST['title']; $post->text_lang = $_POST['text']; $post->media_lang = $_POST['media']; $post->legend_lang = $_POST['legend']; $post->lang = $_SESSION['translate_lang']; $post->saveLang($errors); $action = 'edit'; break; } } switch ($option) { case 'profile': $viewData['user'] = Model\User::get($project->owner, $_SESSION['translate_lang']); break; case 'overview': break; case 'costs': if ($_POST) { foreach ($_POST as $k => $v) { if (!empty($v) && preg_match('/cost-(\\d+)-edit/', $k, $r)) { $viewData[$k] = true; } } } break; case 'rewards': if ($_POST) { foreach ($_POST as $k => $v) { if (!empty($v) && preg_match('/((social)|(individual))_reward-(\\d+)-edit/', $k)) { $viewData[$k] = true; break; } } } break; case 'supports': if ($_POST) { foreach ($_POST as $k => $v) { if (!empty($v) && preg_match('/support-(\\d+)-edit/', $k, $r)) { $viewData[$k] = true; break; } } } break; // publicar actualizaciones // publicar actualizaciones case 'updates': $viewData['blog'] = $blog; if ($action == 'edit') { $post = Model\Blog\Post::get($id, $_SESSION['translate_lang']); $viewData['post'] = $post; } else { $posts = array(); foreach ($blog->posts as $post) { $posts[] = Model\Blog\Post::get($post->id, $_SESSION['translate_lang']); } $viewData['posts'] = $posts; } break; } $viewData['project'] = $project; //// FIN Control de traduccion de proyecto break; default: // profile $viewData['option'] = 'profile'; unset($langs['es']); if ($_SERVER['REQUEST_METHOD'] == 'POST') { if ($action == 'save') { $user = Model\User::get($_POST['id'], $_SESSION['translate_lang']); $user->about_lang = $_POST['about']; $user->keywords_lang = $_POST['keywords']; $user->contribution_lang = $_POST['contribution']; $user->lang = $_SESSION['translate_lang']; $user->saveLang($errors); } } $viewData['user'] = Model\User::get($user->id, $_SESSION['translate_lang']); } if (!empty($errors)) { Message::Error('HA HABIDO ERRORES: <br />' . implode('<br />', $errors)); } return new View('view/dashboard/index.html.php', $viewData); }