sublime3 ocultar panel lateral + ver archivo actual en arbol de archivos

ir a
preferences->key bindings

y copiar las sgts sentencias dentro del sublime.keymap-User

// Toggle the Sidebar
{ "keys": ["ctrl+\\"], "command": "toggle_side_bar" }, 
// BONUS: Reveal current file on the sidebar tree
{ "keys": ["ctrl+shift+r"], "command": "reveal_in_side_bar" },



curso vue laravel paginacion

1-Modificar el controlador para que en el metodo index(el de listar) se devuelva una respuesta
que contemple las variables necesarias para la paginacion
2-Crear un componente que lea las variables que devuelve el controler y maneje la paginacion
3-Registrar el componente de paginacion en el app.js


CategoriaController.php:

public function index(Request $request)
    {
       
        $categorias = Categoria::paginate(3);
        $response = [
            'pagination' => [
                'total' => $categorias->total(),
                'per_page' => $categorias->perPage(),
                'current_page' => $categorias->currentPage(),
                'last_page' => $categorias->lastPage(),
                'from' => $categorias->firstItem(),
                'to' => $categorias->lastItem()
            ],
            'data' => $categorias
        ];
        return response()->json($response);
    }


creamos en resources/js/components/PaginationComponent.vue:
(la parte de html usa el estilo de coreui)

<template>
    <nav>
      <ul class="pagination">
        <li class="page-item">
            <a class="page-link" @click.prevent="changePage(pagination.current_page - 1)" :disabled="pagination.current_page <= 1">Ant</a>
        </li>
        <li v-for="page in pages" class="page-item" :class="isCurrentPage(page) ? 'active' : ''">
                <a class="page-link" @click.prevent="changePage(page)">{{ page }}</a>
        </li>
        <li class="page-item">
            <a class="page-link" @click.prevent="changePage(pagination.current_page + 1)" :disabled="pagination.current_page >= pagination.last_page">Sig</a>
        </li>
      </ul>
    </nav>
   
</template>

<style>
    .pagination {
        margin-top: 40px;
    }
</style>

<script>
    export default {
        props: ['pagination', 'offset'],
        methods: {
            isCurrentPage(page) {
                return this.pagination.current_page === page;
            },
            changePage(page) {
                if (page > this.pagination.last_page) {
                    page = this.pagination.last_page;
                }
                this.pagination.current_page = page;
                this.$emit('paginate');
            }
        },
        computed: {
            pages() {
                let pages = [];
                let from = this.pagination.current_page - Math.floor(this.offset / 2);
                if (from < 1) {
                    from = 1;
                }
                let to = from + this.offset - 1;
                if (to > this.pagination.last_page) {
                    to = this.pagination.last_page;
                }
                while (from <= to) {
                    pages.push(from);
                    from++;
                }
                return pages;
            }
        }
    }
</script>


en app.js

Vue.component('pagination', require('./components/PaginationComponent.vue'));

ya se puede usar el componente, dentro del componente de categoria que maneja toda la grilla de categorias

<pagination v-if="pagination.last_page > 1" :pagination="pagination" :offset="5" @paginate="fetchRecords()"></pagination>
...
<script>
    export default {
        data(){
            return {
                nombre:'',
                descripcion:'',
                arrayCategorias:[],
                modal:0,
                tituloModal:'',
                accion:'',
                errors:[],
                categoria_id:0,
                pagination: {
                    'current_page': 1
                }
            }
        },
        mounted() {
              this.fetchRecords();
        },
        methods:{
            fetchRecords() {
                axios.get('/categorias?page=' + this.pagination.current_page)
                .then(response => {
                    //console.log(response);
                    this.arrayCategorias = response.data.data.data;
                    this.pagination = response.data.pagination;
                })
                .catch(error => {
                    console.log(error.response.data);
                });
            },

curso vue laravel crud

ejemplo CRUD Categoria

creamos un componente para categoria, resources/js/components/CategoriaComponent.vue
que manejara todo el modulo crud de Categoria

en resources/js/app.js

hacemos referencia al componente y definimos el tag "categoria" para referrirnos al componente

Vue.component('categoria', require('./components/CategoriaComponent.vue'));


el componente tiene las sgts partes:
template: aqui va todo el html
script: codigo javascript
style: estilos particulares a usarse en este componente

para el CREAR

dentro del template tendremos un boton que abrira una ventana modal con los campos para registrar una nueva categoria

 <button type="button" @click="abrirModal('registrar')" class="btn btn-secondary" >
                            <i class="icon-plus"></i>&nbsp;Nuevo
 </button>

y la estructura de la ventana modal
    <div class="modal fade"  tabindex="-1" :class="{'mostrar':modal}" role="dialog" aria-labelledby="myModalLabel" style="display: none;" aria-hidden="true">
            <h4 class="modal-title" v-text="tituloModal"></h4>
 <input type="text" v-model="nombre" class="form-control" >
     <input type="text" v-model="descripcion" class="form-control" >
      <div v-show="errors.length" class="form-group row">
                                    <div class="col-md-12">
                                        <div  class="alert alert-danger" role="alert" v-for="error in errors" v-text="error">
                                            
                                        </div>
                                    </div>

                                </div>                            
<button type="button" class="btn btn-secondary" @click="cerrarModal()">Cerrar</button>
                            <button type="button" v-if="accion=='guardar'" @click="registrarCategoria()" class="btn btn-primary">Guardar</button>
                                       

entonces en la seccion de script

 export default {
        data(){
            return {
                nombre:'',
                descripcion:'',
                modal:0,
                tituloModal:'',
                accion:'',
                errors:[]
            }
        },
        methods:{
           registrarCategoria(){
                if(!this.validarCategoria()){
                    return;
                }
                let me=this;
                axios.post('/categorias/registrar',{
                    'nombre':me.nombre,
                    'descripcion':me.descripcion
                }).then(function (response) {
                // handle success
                    me.cerrarModal();
                    me.listarCategorias();
                })
                .catch(function (error) {
                // handle error
                    console.log(error);
                });
            },
            abrirModal(accion,data=[]){
                switch(accion){
                    case 'registrar':
                    {
                      this.modal = 1;
                      this.nombre = '';
                      this.descripcion = '';
                      this.tituloModal = 'Registrar nueva categoria';
                      this.accion='guardar';
                      //console.log('registrar');
                      break;
                    }
            
        }

donde:

 modal:0, // indica si se muestra (1) o no (0) la ventana modal
                tituloModal:'', //titulo de la ventana modal, es variable porque se usara el mismo para actualizar
                accion:'', //accion actual, registrar o actualizar
                errors:[] // array con los mensajes de error



para ACTUALIZAR

tenemos un icono de editar por cada registro del listado

<tr v-for="categoria in arrayCategorias.data" :key="categoria.id">
                                    <td>
                                        <button type="button" class="btn btn-warning btn-sm"
                                        @click="abrirModal('actualizar',categoria)" >
                                          <i class="icon-pencil"></i>
                                        </button> &nbsp;

en este caso le enviamos los datos de categoria actual para llenar los campos del formulario de la ventana modal.

y en la ventana modal cuando se abra el boton dira actualizar y llamara a actualizarCAtegoria
 <button type="button" v-if="accion=='actualizar'" @click="actualizarCategoria()"class="btn btn-primary">Actualizar</button>


abrirModal(accion,data=[]){
                switch(accion){
                    case 'actualizar':
                    {
                      this.modal = 1;
                      this.nombre = data['nombre'];
                      this.descripcion = data['descripcion'];
                      this.tituloModal = 'Actualizar categoria';
                      this.categoria_id = data['id'];
                      
                      this.accion='actualizar';
                      //console.log('registrar');
                      break;
                    }
                }
            }
 actualizarCategoria(){
                if(!this.validarCategoria()){
                    return;
                }
                let me=this;
                axios.put('/categorias/actualizar',{
                    'nombre':me.nombre,
                    'descripcion':me.descripcion,
                    'id':me.categoria_id,

                }).then(function (response) {
                // handle success
                    me.cerrarModal();
                    me.listarCategorias();
                })
                .catch(function (error) {
                // handle error
                    console.log(error);
                });
            },


en nuestro archivo de rutas routes/web.php

tenemos

Route::get('/categorias', ['uses'=>'CategoriaController@index']);
Route::post('/categorias/registrar', ['uses'=>'CategoriaController@store']);
Route::put('/categorias/actualizar', ['uses'=>'CategoriaController@update']);

entonces, el problema es que si desde la url apuntamos a esas rutas
por ejemplo http://localhost:8000/categorias

escupira en el browser en forma de json la categorias de la tabla.
entonces le vamos a agregar una minima seguridad, haciendo que cada uno de los metodos del controller solo respondan si la peticion fue hecha a traves de una llamada ajax. de lo contrario se redirigira a la pagina raiz

en la primera linea del cuerpo de cada metodo agregar:

if(!$request->ajax()) return redirect("/");





curl ubuntu

si tienes un archivo que haga llamadas curl

para ejecutarlo

php -f miarchivo.php

si te sale
PHP Fatal error: Call to undefined function curl_init()

quiere decir que no está instalado el modulo de curl, esto tambien se puede comprobar
<?php var_dump(extension_loaded('curl')); ?>

y si da false,

sudo apt-get install php7.1-curl

para versiones de php 7.1.x

curso vue.js laravel conceptos

es un framework javascript progresivo para crear interfaces de usuario pudiendo agregarsela a la parte de tu aplicacion que necesites que sea mas intuitiva e interactiva.diviendo una pagina web en componentes reutilizables (con su propio html, css y javascript).
vue.js es reactivo es decir que si si la data se modifica el front que la muestra tambien(data binding)

https://vuejs.org/v2/guide/installation.html

descargamos la version de desarrollo y la de produccion(es la de desarrollo minificada y sin comentarios) haciendo clik sobre ambas opciones,
y la guardamos dentro de una carpeta de nuestra aplicacion (llamada por ejemplo js)

https://getbootstrap.com/docs/4.1/getting-started/introduction/

copiamos de esta pagina la direccion cdn de bootstrap

<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css" integrity="sha384-Smlep5jCw/wG7hdkwQ/Z5nLIefveQRIY9nfy6xoR1uRYBtpZgI6339F5dgvm/e9B" crossorigin="anonymous">

y lo pegamos en el head de nuestro proyecto.





curso vue.js laravel crear proyecto

crear un db a traves de phpmyadmin

http://localhost/phpmyadmin/

la llamaremos dbsistemalaravel

instalar laravel

composer global require "laravel/installer"

vamos a la ruta_xampp/htdocs

y por la consola creamos el proyecto asi
laravel new sislaravel

luego abrimos el proyecto(carpeta) en nuestro editor
duplicamos el archivo .env.example y lo lllamamos .env

luego generamos una key de encriptacion a traves de la consola

php artisan key:generate

luego podemos levantar el servidor interno

php artisan serve

y acceder a nuestra aplicacion a traves de la sgt url

http://127.0.0.1:8000/




linux ubuntu mint actualizar chrome

 desde una terminal: $ sudo apt update $ sudo apt install google-chrome-stable