{"id":1108,"date":"2018-05-25T17:35:44","date_gmt":"2018-05-25T23:35:44","guid":{"rendered":"https:\/\/www.emanuelpaxtian.com\/?p=1108"},"modified":"2018-05-26T10:45:53","modified_gmt":"2018-05-26T16:45:53","slug":"carrito-de-compras-con-php","status":"publish","type":"post","link":"https:\/\/emanuelpaxtian.com\/blog\/carrito-de-compras-con-php\/","title":{"rendered":"Carrito de compras con php"},"content":{"rendered":"<p>Vamos a ver como\u00a0<strong>crear un carrito de compras con php<\/strong>, no es muy complicado, pero al haber varios m\u00e9todos se puede hacer un poco m\u00e1s lioso.<\/p>\n<p>Como podremos ver todo tiene su l\u00f3gica, tendremos un\u00a0<strong>m\u00e9todo<\/strong>\u00a0para cada una de las funcionalidades de un\u00a0<strong>carrito de compras<\/strong>\u00a0convencional, insertar, actualizar, eliminar etc, as\u00ed que antes de comenzar veamos un listado de los m\u00e9todos y funciones m\u00e1s importantes y que hacen<span id=\"more-3896\"><\/span>:<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><strong>El m\u00e9todo add<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Pasando un array de clave valor nos insertar\u00e1 un producto dentro del carrito, si ese producto ya existe lo que hace es actualizar la cantidad de unidades.<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><strong>La funci\u00f3n remove_producto<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Pasando un unique_id, que no es m\u00e1s que un identificador \u00fanico de cada producto que conseguimos encriptando con md5 la id del producto, eliminar\u00e1 por completo todas las unidades de ese producto.<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><strong>El m\u00e9todo get_content<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Nos devuelve un array con todos los productos del carrito y la informaci\u00f3n de cada uno de ellos.<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><strong>El m\u00e9todo precio_total<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Devuelve el precio total del carrito de compras, por defecto, si el carrito est\u00e1 vac\u00edo el valor es de 0.<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><strong>El m\u00e9todo art\u00edculos_total<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Devuelve el n\u00famero total de art\u00edculos del carrito, por defecto, si el carrito est\u00e1 vac\u00edo el valor es de 0.<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><strong>La funci\u00f3n destroy<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Elimina por completo el carrito de compras, una vez hecho, nuestro carrito tendr\u00e1 valor NULL.<\/p>\n<h2>Clase carrito de compras con php<\/h2>\n<p>Toda nuestra l\u00f3gica estar\u00e1 dentro de una clase que llamaremos Carrito.class.php, as\u00ed que creo que es un buen momento de crear un proyecto vac\u00edo y dentro crear ese archivo, una vez hecho podemos a\u00f1adir el siguiente c\u00f3digo con el que nuestro carrito quedar\u00e1 implementado.<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n&lt;?php\r\nsession_start();\r\nclass Carrito\r\n{\r\n    \/\/aqu\u00ed guardamos el contenido del carrito\r\n    private $carrito = array();\r\n    \/\/seteamos el carrito exista o no exista en el constructor\r\n    public function __construct()\r\n    {\r\n        if(!isset($_SESSION&#x5B;&quot;carrito&quot;]))\r\n        {\r\n            $_SESSION&#x5B;&quot;carrito&quot;] = null;\r\n            $this-&gt;carrito&#x5B;&quot;precio_total&quot;] = 0;\r\n            $this-&gt;carrito&#x5B;&quot;articulos_total&quot;] = 0;\r\n        }\r\n        $this-&gt;carrito = $_SESSION&#x5B;'carrito'];\r\n    }\r\n    \/\/a\u00f1adimos un producto al carrito\r\n    public function add($articulo = array())\r\n    {\r\n        \/\/primero comprobamos el articulo a a\u00f1adir, si est\u00e1 vac\u00edo o no es un \r\n        \/\/array lanzamos una excepci\u00f3n y cortamos la ejecuci\u00f3n\r\n        if(!is_array($articulo) || empty($articulo))\r\n        {\r\n            throw new Exception(&quot;Error, el articulo no es un array!&quot;, 1);\r\n        }\r\n        \/\/nuestro carro necesita siempre un id producto, cantidad y precio articulo\r\n        if(!$articulo&#x5B;&quot;id&quot;] || !$articulo&#x5B;&quot;cantidad&quot;] || !$articulo&#x5B;&quot;precio&quot;])\r\n        {\r\n            throw new Exception(&quot;Error, el articulo debe tener un id, cantidad y precio!&quot;, 1);\r\n        }\r\n        \/\/nuestro carro necesita siempre un id producto, cantidad y precio articulo\r\n        if(!is_numeric($articulo&#x5B;&quot;id&quot;]) || !is_numeric($articulo&#x5B;&quot;cantidad&quot;]) || !is_numeric($articulo&#x5B;&quot;precio&quot;]))\r\n        {\r\n            throw new Exception(&quot;Error, el id, cantidad y precio deben ser n\u00fameros!&quot;, 1);\r\n        }\r\n        \/\/debemos crear un identificador \u00fanico para cada producto\r\n        $unique_id = md5($articulo&#x5B;&quot;id&quot;]);\r\n        \/\/creamos la id \u00fanica para el producto\r\n        $articulo&#x5B;&quot;unique_id&quot;] = $unique_id;\r\n        \/\/si no est\u00e1 vac\u00edo el carrito lo recorremos \r\n        if(!empty($this-&gt;carrito))\r\n        {\r\n            foreach ($this-&gt;carrito as $row)\r\n            {\r\n                \/\/comprobamos si este producto ya estaba en el \r\n                \/\/carrito para actualizar el producto o insertar\r\n                \/\/un nuevo producto\t\r\n                if($row&#x5B;&quot;unique_id&quot;] === $unique_id)\r\n                {\r\n                    \/\/si ya estaba sumamos la cantidad\r\n                    $articulo&#x5B;&quot;cantidad&quot;] = $row&#x5B;&quot;cantidad&quot;] + $articulo&#x5B;&quot;cantidad&quot;];\r\n                }\r\n            }\r\n        }\r\n        \/\/evitamos que nos pongan n\u00fameros negativos y que s\u00f3lo sean n\u00fameros para cantidad y precio\r\n        $articulo&#x5B;&quot;cantidad&quot;] = trim(preg_replace('\/(&#x5B;^0-9\\.])\/i', '', $articulo&#x5B;&quot;cantidad&quot;]));\r\n        $articulo&#x5B;&quot;precio&quot;] = trim(preg_replace('\/(&#x5B;^0-9\\.])\/i', '', $articulo&#x5B;&quot;precio&quot;]));\r\n        \/\/a\u00f1adimos un elemento total al array carrito para \r\n        \/\/saber el precio total de la suma de este art\u00edculo\r\n        $articulo&#x5B;&quot;total&quot;] = $articulo&#x5B;&quot;cantidad&quot;] * $articulo&#x5B;&quot;precio&quot;];\r\n        \/\/primero debemos eliminar el producto si es que estaba en el carrito\r\n        $this-&gt;unset_producto($unique_id);\r\n        \/\/\/ahora a\u00f1adimos el producto al carrito\r\n        $_SESSION&#x5B;&quot;carrito&quot;]&#x5B;$unique_id] = $articulo;\r\n        \/\/actualizamos el carrito\r\n        $this-&gt;update_carrito();\r\n        \/\/actualizamos el precio total y el n\u00famero de art\u00edculos del carrito\r\n        \/\/una vez hemos a\u00f1adido el producto\r\n        $this-&gt;update_precio_cantidad();\r\n    }\r\n    \/\/m\u00e9todo que actualiza el precio total y la cantidad\r\n    \/\/de productos total del carrito\r\n    private function update_precio_cantidad()\r\n    {\r\n        \/\/seteamos las variables precio y art\u00edculos a 0\r\n        $precio = 0;\r\n        $articulos = 0;\r\n        \/\/recorrecmos el contenido del carrito para actualizar\r\n        \/\/el precio total y el n\u00famero de art\u00edculos\r\n        foreach ($this-&gt;carrito as $row)\r\n        {\r\n            $precio += ($row&#x5B;'precio'] * $row&#x5B;'cantidad']);\r\n            $articulos += $row&#x5B;'cantidad'];\r\n        }\r\n        \/\/asignamos a articulos_total el n\u00famero de art\u00edculos actual\r\n        \/\/y al precio el precio actual\r\n        $_SESSION&#x5B;'carrito']&#x5B;&quot;articulos_total&quot;] = $articulos;\r\n        $_SESSION&#x5B;'carrito']&#x5B;&quot;precio_total&quot;] = $precio;\r\n        \/\/refrescamos \u00e9l contenido del carrito para que qued\u00e9 actualizado\r\n        $this-&gt;update_carrito();\r\n    }\r\n    \/\/m\u00e9todo que retorna el precio total del carrito\r\n    public function precio_total()\r\n    {\r\n        \/\/si no est\u00e1 definido el elemento precio_total o no existe el carrito\r\n        \/\/el precio total ser\u00e1 0\r\n        if(!isset($this-&gt;carrito&#x5B;&quot;precio_total&quot;]) || $this-&gt;carrito === null)\r\n        {\r\n            return 0;\r\n        }\r\n        \/\/si no es n\u00famerico lanzamos una excepci\u00f3n porque no es correcto\r\n        if(!is_numeric($this-&gt;carrito&#x5B;&quot;precio_total&quot;]))\r\n        {\r\n            throw new Exception(&quot;El precio total del carrito debe ser un n\u00famero&quot;, 1);\r\n        }\r\n        \/\/en otro caso devolvemos el precio total del carrito\r\n        return $this-&gt;carrito&#x5B;&quot;precio_total&quot;] ? $this-&gt;carrito&#x5B;&quot;precio_total&quot;] : 0;\r\n    }\r\n    \/\/m\u00e9todo que retorna el n\u00famero de art\u00edculos del carrito\r\n    public function articulos_total()\r\n    {\r\n        \/\/si no est\u00e1 definido el elemento articulos_total o no existe el carrito\r\n        \/\/el n\u00famero de art\u00edculos ser\u00e1 de 0\r\n        if(!isset($this-&gt;carrito&#x5B;&quot;articulos_total&quot;]) || $this-&gt;carrito === null)\r\n        {\r\n            return 0;\r\n        }\r\n        \/\/si no es n\u00famerico lanzamos una excepci\u00f3n porque no es correcto\r\n        if(!is_numeric($this-&gt;carrito&#x5B;&quot;articulos_total&quot;]))\r\n        {\r\n            throw new Exception(&quot;El n\u00famero de art\u00edculos del carrito debe ser un n\u00famero&quot;, 1);\r\n        }\r\n        \/\/en otro caso devolvemos el n\u00famero de art\u00edculos del carrito\r\n        return $this-&gt;carrito&#x5B;&quot;articulos_total&quot;] ? $this-&gt;carrito&#x5B;&quot;articulos_total&quot;] : 0;\r\n    }\r\n    \/\/este m\u00e9todo retorna el contenido del carrito\r\n    public function get_content()\r\n    {\r\n        \/\/asignamos el carrito a una variable\r\n        $carrito = $this-&gt;carrito;\r\n        \/\/debemos eliminar del carrito el n\u00famero de art\u00edculos\r\n        \/\/y el precio total para poder mostrar bien los art\u00edculos\r\n        \/\/ya que estos datos los devuelven los m\u00e9todos \r\n        \/\/articulos_total y precio_total\r\n        unset($carrito&#x5B;&quot;articulos_total&quot;]);\r\n        unset($carrito&#x5B;&quot;precio_total&quot;]);\r\n        return $carrito == null ? null : $carrito;\r\n    }\r\n    \/\/m\u00e9todo que llamamos al insertar un nuevo producto al \r\n    \/\/carrito para eliminarlo si existia, as\u00ed podemos insertarlo\r\n    \/\/de nuevo pero actualizado\r\n    private function unset_producto($unique_id)\r\n    {\r\n        unset($_SESSION&#x5B;&quot;carrito&quot;]&#x5B;$unique_id]);\r\n    }\r\n    \/\/para eliminar un producto debemos pasar la clave \u00fanica\r\n    \/\/que contiene cada uno de ellos\r\n    public function remove_producto($unique_id)\r\n    {\r\n        \/\/si no existe el carrito\r\n        if($this-&gt;carrito === null)\r\n        {\r\n            throw new Exception(&quot;El carrito no existe!&quot;, 1);\r\n        }\r\n        \/\/si no existe la id \u00fanica del producto en el carrito\r\n        if(!isset($this-&gt;carrito&#x5B;$unique_id]))\r\n        {\r\n            throw new Exception(&quot;La unique_id $unique_id no existe!&quot;, 1);\r\n        }\r\n        \/\/en otro caso, eliminamos el producto, actualizamos el carrito y \r\n        \/\/el precio y cantidad totales del carrito\r\n        unset($_SESSION&#x5B;&quot;carrito&quot;]&#x5B;$unique_id]);\r\n        $this-&gt;update_carrito();\r\n        $this-&gt;update_precio_cantidad();\r\n        return true;\r\n    }\r\n    \/\/eliminamos el contenido del carrito por completo\r\n    public function destroy()\r\n    {\r\n        unset($_SESSION&#x5B;&quot;carrito&quot;]);\r\n        $this-&gt;carrito = null;\r\n        return true;\r\n    }\r\n    \/\/actualizamos el contenido del carrito\r\n    public function update_carrito()\r\n    {\r\n        self::__construct();\r\n    }\r\n}\r\n<\/pre>\n<p>Para entender el funcionamiento del carrito es suficiente con repasar el c\u00f3digo las veces necesarias, hasta que logremos entender el funcionamiento y la l\u00f3gica ya que est\u00e1 explicado en cada apartado de forma muy muy clara.<\/p>\n<p>Para poder hacer uso del carrito, lo primero es crear una nueva instancia, lo que nos devolver\u00e1 un carrito vac\u00edo y valor 0 tanto al precio como al n\u00famero de art\u00edculos.<\/p>\n<p>Crear un nuevo carrito<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">$carrito = new Carrito();<\/pre>\n<p>A\u00f1adir un producto al carrito<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n\/\/array que crea un producto\r\n$articulo = array(\r\n\t\t&quot;id&quot;\t\t\t=&gt;\t\t14,\r\n\t\t&quot;cantidad&quot;\t\t=&gt;\t\t3,\r\n\t\t&quot;precio&quot;\t\t=&gt;\t\t50,\r\n\t\t&quot;nombre&quot;\t\t=&gt;\t\t&quot;camisetas&quot;\r\n\t);\r\n\r\n\/\/a\u00f1adir el producto\r\n\/\/$carrito-&gt;add($articulo);\r\n<\/pre>\n<p>Eliminar un producto por su unique_id<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n\r\n$carrito-&gt;remove_producto(&quot;45c48cce2e2d7fbdea1afc51c7c6ad26&quot;);\r\n<\/pre>\n<p>Ese es el aspecto de un campo unique_id de cada producto.<\/p>\n<p>Obtener el contenido del carrito<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n$carrito-&gt;get_content();\r\n<\/pre>\n<p>Obtener el precio total del carrito<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n$carrito-&gt;precio_total();\r\n<\/pre>\n<p>Obtener el n\u00famero de art\u00edculos del carrito<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n$carrito-&gt;articulos_total();\r\n<\/pre>\n<p>Eliminar el contenido del carrito<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n$carrito-&gt;destroy();\r\n<\/pre>\n<p>Una vez creado el carrito y a\u00f1adido alg\u00fan producto, simplemente podemos mostrar los art\u00edculos de la siguiente forma.<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n\r\n\/\/asignamos a $carro el m\u00e9todo get_content() que contiene el contenido del carrito\r\n$carro = $carrito-&gt;get_content();\r\nif($carro)\r\n{\r\n\tforeach($carro as $producto)\r\n\t{\r\n\t\techo $producto&#x5B;&quot;id&quot;];\r\n\t\techo &quot;&lt;br \/&gt;&quot;;\r\n\t\techo $producto&#x5B;&quot;unique_id&quot;];\r\n\t\techo &quot;&lt;br \/&gt;&quot;;\r\n\t\techo $producto&#x5B;&quot;cantidad&quot;];\r\n\t\techo &quot;&lt;br \/&gt;&quot;;\r\n\t\techo $producto&#x5B;&quot;precio&quot;];\r\n\t\techo &quot;&lt;br \/&gt;&quot;;\r\n\t\techo $producto&#x5B;&quot;nombre&quot;];\r\n\t\techo &quot;&lt;br \/&gt;&quot;;\r\n\t}\r\n}\r\n\r\n<\/pre>\n<p>Y eso es todo, no tiene m\u00e1s misterio un carrito de compras con php, s\u00f3lo necesitamos juntar los ingredientes que necesitemos y ya est\u00e1, espero que te sea de utilidad, por lo menos para seguir aprendiendo php si est\u00e1s en ese camino.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vamos a ver como\u00a0crear un carrito de compras con php, no es muy complicado, pero al haber varios m\u00e9todos se puede hacer un poco m\u00e1s lioso. Como podremos ver todo&hellip;<\/p>\n","protected":false},"author":1,"featured_media":1110,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-1108","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php"],"_links":{"self":[{"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/posts\/1108","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/comments?post=1108"}],"version-history":[{"count":1,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/posts\/1108\/revisions"}],"predecessor-version":[{"id":1109,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/posts\/1108\/revisions\/1109"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/media\/1110"}],"wp:attachment":[{"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/media?parent=1108"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/categories?post=1108"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/tags?post=1108"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}