Laravel
Alguna otra forma de usar una funcion del controllador en la vista?
No me gusta tener que poner esto arriba del todo en la vista, se puede hacer algo directamente desde el controlador sin tener que modificar el objeto recibido de la consulta del modelo?
<?php use App\Http\Controllers\PostController; ?>
para después usar
@foreach...
{!! PostController::print($post) !!}
No tiene sentido que se pudiera usar funciones del controlador de la vista? xD
#10119 Desde el controlador le pasas los datos que la vista necesita.
Si quieres que el server corra una serie de codigo cuando el usuario interactua con la pagina, tu amigo es JavaScript y deberias crear un endpoint or usar el template engine y pedir un template.
#10121
Otro ejemplo seria el "enviado hace X minutos"
{{ \Carbon\Carbon::parse($post->created_at)->diffForHumans() }}
Antes de mandar $post a la vista, lo suyo seria recorrerlo en el controlador, modificar created_at/añadir nuevo campo "ago" de cada post con el valor nuevo? Tampoco me convence xD
#10122 de ahí es donde he sacado lo que he puesto, pero no me acaba de convencer, por eso vine aquí en busca algo distinto.
#10123 Todo lo que sea parsear datos o modificarlos se hace en el controller, como mucho en las vistas puedes crear helpers para cambiar la manera que enseñas los datos, por ejemplo uno que te enseñe la fecha con X formato.
#10119 A ver, para lo que comentas de utilizar una variable en vista, tienes varias opciones.
cargas la vista desde el controller y pasas una variable, luego haces el bucle.
$posts = $posts->all(); return view('blog.index', [ 'posts' => $posts ]);
Creas un helper y llamas al helper con getPosts() o algo similar.
Te bajas este package de widgets
Creas una regla en app/Providers/AppServiceProvider
view()->composer('posts.sidebar', function($view){ $view->with('archives', \\App\\Post::archives()); });
En este ejemplo indicas que la variable
archives
está disponible cuando se utilice la vistaposts.sidebar
(todo son ejemplos diferentes, no 4 pasos del mismo ejemplo)
#10123 Sobre lo que comentas de carbon, si la llamada la haces directamente con eloquent (no se muchas otras formas de hacerlo sin complicarte la vida), todos los campos de tiempo son instancias de carbon, de forma que te puedes ahorrar todo el parse. En cualquier caso, si no tuvieras la instancia directamente, recomiendo hacer el helper en este caso, una función a la cual le mandas el time, o datetime, o timestamp o lo que sea, y ya pasas a carbon y devuelves. Te ahorrarás mucho spaguetti.
#10126 No es lo óptimo, pero a veces el tiempo no es abundante y hay que hacer chapucillas.
Tu eres muy crack de CI no? Por curiosidad, como te montas por ejemplo un footer para toda la web que tenga las últimas noticias? Helper? Widget?
#10127 pues mismamente así
<?php
class ControllerNoticias extends CI_Controller {
function __construct() {
parent::__construct();
$this->load->database();
$this->load->model('modelNoticias');
}
public function getNoticias(){
$data['noticias'] = $this->modelNoticias->getNoticias();
$this->load->view('head.php');
$this->load->view('main.php');
$this->load->view('footer.php', $data);
}
}
#10128 Vale, pero cuando visitas la home o contacto, ya no te van a salir las noticias, eso es lo que quería decir con "footer para toda la web".
#10130 ah para toda la web? Pues me lo llevo al autoload general
$autoload['model'] = array('modelNoticias');
y luego simplemente le pasas el data a cada vista en la que quieras el footer
$this->load->view('footer.php', $data);
#10127 Pues algo así:
class MY_Controller extends CI_Controller{
public response_data = array();
public function __construct(){
parent::__construct();
$this->load->model('noticias_model');
$this->response_data['news_latest'] = $this->noticias_model->get_latest();
}
}
Luego en cualquier vista de un controlador que extienda a "MY_Controller":
<?php foreach($this->response_data['news_latest'] as $new) : ?>
<h2><?= $new->title ?></h2>
<p><?= $new->subtitle ?></p>
<?php endforeach ?>
El truco es: Si seteas una variable pública en el controlador (o en las clases padres), ésta sera accesible desde las vistas, de manera que en lugar de llamar a la función desde la vista, lo que debes hacer es llamarla desde el controlador y almacenar el resultado en una variable que sea accesible desde la vista (variable pública en el controlador). En caso de que lo quieras en toda la web, te mascas un controller en la carpeta CORE que extienda al controlador principal de CI y ya está xD.
Tengo hecho mi pequeño "framework" con esto y me hace putas maravillas.
#10132 Espero que cuando hagas una web las urls no sean: http://www.eXtreM3.com/ControllerNoticias/FuncionVerNoticia/javascript-ha-muerto
#10136 claro que no, faltaría el index.php y el id de la noticia.
http://www.eXtreM3.com/index.php/ControllerNoticias/FuncionVerNoticia/666/javascript-ha-muerto