示例#1
0
文件: post.php 项目: 4bs4/marifa
 /**
  * Creamos un nuevo post.
  * @param int $post ID del post a editar.
  */
 public function action_editar($post)
 {
     // Verificamos usuario logueado.
     if (!Usuario::is_login()) {
         $_SESSION['flash_error'] = 'Debes iniciar sessión para poder editar posts.';
         Request::redirect('/usuario/login');
     }
     // Limpio la entrada
     $post = (int) $post;
     // Cargo el post.
     $model_post = new Model_Post($post);
     // Verifico exista.
     if (!$model_post->existe()) {
         $_SESSION['flash_error'] = 'El post especificado no se encuentra disponible.';
         Request::redirect('/');
     }
     // No podemos editar posts borrados.
     if ($model_post->estado == Model_Post::ESTADO_BORRADO) {
         $_SESSION['flash_error'] = 'El post especificado no se encuentra disponible.';
         Request::redirect('/post/index/' . $post);
     }
     // Verifico el usuario y el permiso de edición para terceros.
     if (Usuario::$usuario_id !== $model_post->usuario_id && !Usuario::permiso(Model_Usuario_Rango::PERMISO_POST_EDITAR)) {
         $_SESSION['flash_error'] = 'No tienes los permisos necesarios para realizar esa edición.';
         Request::redirect('/post/index/' . $post);
     }
     // Asignamos el título.
     $this->template->assign('title', 'Editar post');
     // Cargamos la vista.
     $view = View::factory('post/editar');
     $view->assign('post', $post);
     // Seteo permisos especiales.
     $view->assign('permisos_especiales', Usuario::permiso(Model_Usuario_Rango::PERMISO_POST_FIJAR_PROMOVER));
     // Cargamos valores por defecto.
     $view->assign('titulo', $model_post->titulo);
     $view->assign('contenido', $model_post->contenido);
     $view->assign('categoria', $model_post->categoria()->seo);
     $view->assign('privado', $model_post->privado);
     $view->assign('patrocinado', $model_post->sponsored);
     $view->assign('sticky', $model_post->sticky);
     $view->assign('comentar', $model_post->comentar);
     $view->assign('tags', implode(', ', $model_post->etiquetas()));
     // Elementos por defecto.
     foreach (array('error_titulo', 'error_contenido', 'error_categoria', 'error_tags') as $k) {
         $view->assign($k, FALSE);
     }
     // Listado de categorias.
     $model_categoria = new Model_Categoria();
     $view->assign('categorias', $model_categoria->lista());
     // Menu.
     $this->template->assign('master_bar', parent::base_menu('posts'));
     $this->template->assign('top_bar', Controller_Home::submenu('index'));
     // Asignamos la vista.
     $this->template->assign('contenido', $view->parse());
     if (Request::method() == 'POST') {
         $error = FALSE;
         // Obtenemos los datos y seteamos valores.
         foreach (array('titulo', 'contenido', 'categoria', 'tags') as $k) {
             ${$k} = isset($_POST[$k]) ? $_POST[$k] : '';
             $view->assign($k, ${$k});
         }
         // Obtenemos los checkbox.
         foreach (array('privado', 'patrocinado', 'sticky', 'comentar') as $k) {
             ${$k} = isset($_POST[$k]) ? $_POST[$k] == 1 : FALSE;
             $view->assign($k, ${$k});
         }
         // Verificamos el titulo.
         if (!preg_match('/^[a-zA-Z0-9áéíóú\\-,\\.:\\s]{6,60}$/D', $titulo)) {
             $view->assign('error_titulo', 'El formato del título no es correcto.');
             $error = TRUE;
         }
         // Verificamos el contenido.
         $contenido_clean = preg_replace('/\\[.*\\]/', '', $contenido);
         if (!isset($contenido_clean[20]) || isset($contenido[5000])) {
             $view->assign('error_contenido', 'El contenido debe tener entre 20 y 5000 caractéres.');
             $error = TRUE;
         }
         unset($contenido_clean);
         // Verificamos la categoria.
         $model_categoria = new Model_Categoria();
         if (!$model_categoria->existe_seo($categoria)) {
             $view->assign('error_categoria', 'La categoría seleccionada es incorrecta.');
             $error = TRUE;
         } else {
             $model_categoria->load_by_seo($categoria);
             $categoria_id = $model_categoria->id;
         }
         unset($model_categoria);
         // Quito espacios adicionales a las etiquetas.
         $tags = preg_replace('/\\s+/', ' ', trim($tags));
         // Verificamos las etiquetas.
         if (!preg_match('/^[a-zA-Z0-9áéíóúñÑÁÉÍÓÚ, ]{0,}$/D', $tags)) {
             $view->assign('error_tags', 'Las etiquetas ingresadas con son alphanuméricas..');
             $error = TRUE;
         }
         // Procedemos a crear el post.
         if (!$error) {
             // Evitamos XSS.
             $contenido = htmlentities($contenido, ENT_NOQUOTES, 'UTF-8');
             // Formateamos los campos.
             $titulo = trim(preg_replace('/\\s+/', ' ', $titulo));
             // Obtengo el listado de etiquetas.
             $tags = explode(',', $tags);
             foreach ($tags as $k => $v) {
                 $tags[$k] = trim($v);
                 if ($tags[$k] == '') {
                     unset($tags[$k]);
                 }
             }
             // Obtengo listado a agregar, quitar y mantener.
             $delta_etiquetas = array_intersect($model_post->etiquetas(), $tags);
             $etiquetas_eliminadas = array_diff($model_post->etiquetas(), $delta_etiquetas);
             $etiquetas_nuevos = array_diff($tags, $delta_etiquetas);
             unset($tags, $delta_etiquetas);
             $datos = array('titulo' => $titulo, 'contenido' => $contenido, 'categoria_id' => $categoria_id, 'privado' => $privado, 'sponsored' => $patrocinado, 'sticky' => $sticky, 'comentar' => $comentar);
             // Verifico parámetros especiales.
             if (!Usuario::permiso(Model_Usuario_Rango::PERMISO_POST_FIJAR_PROMOVER)) {
                 unset($datos['sponsored'], $datos['sticky']);
             }
             // Actualizo los parámetros.
             $rst = $model_post->actualizar_campos($datos);
             // Actualizo las etiquetas.
             if (is_array($etiquetas_eliminadas) && count($etiquetas_eliminadas) > 0) {
                 $rst = $rst || $model_post->borrar_etiqueta($etiquetas_eliminadas);
             }
             if (is_array($etiquetas_nuevos) && count($etiquetas_nuevos) > 0) {
                 $rst = $rst || $model_post->agregar_etiqueta($etiquetas_nuevos);
             }
             // Emito suceso para el usuario.
             if ($rst) {
                 $model_suceso = new Model_Suceso();
                 if (Usuario::$usuario_id != $model_post->usuario_id) {
                     $model_suceso->crear($model_post->usuario_id, 'post_editado', TRUE, $model_post->id, Usuario::$usuario_id);
                     $model_suceso->crear(Usuario::$usuario_id, 'post_editado', FALSE, $model_post->id, Usuario::$usuario_id);
                 } else {
                     $model_suceso->crear($model_post->usuario_id, 'post_editado', FALSE, $model_post->id, Usuario::$usuario_id);
                 }
             }
             // Informo que todo fue correcto.
             $_SESSION['flash_success'] = 'Actualización del post correcta.';
         }
     }
     // Menu.
     $this->template->assign('master_bar', parent::base_menu('posts'));
     $this->template->assign('top_bar', Controller_Home::submenu('nuevo'));
     // Asignamos la vista.
     $this->template->assign('contenido', $view->parse());
 }