public function onRun() { $categories = ProductAttributes::select('value')->where('key', 'category')->groupBy('value')->get(); // @see https://octobercms.com/docs/database/collection $orderBy = $this->property('orderBy'); if ($orderBy == 'slug:orderBy') { $orderBy = $this->param('orderBy'); } switch ($orderBy) { case 'name': $categories = $categories->sort(function ($c1, $c2) { return strcmp($c1->value, $c2->value); }); break; } $this->categories = $categories; $this->addCss("styles/index.css"); return parent::onRun(); }
public function onRun() { $this->product = Product::findOrFail($this->param('id')); // $this->addCss("styles/index.css"); return parent::onRun(); }
public function onRun() { // $products = Product::where('active', true)->orderBy('url', 'ASC')->get(); $products = Product::all(); // @see https://octobercms.com/docs/database/collection // remove items without a log $products = $products->filter(function ($product) { return $product->lastLog(); }); if ($this->property('active') !== '' && $this->property('active') !== null) { $filter = (int) $this->property('active'); if ($filter == 'slug:active') { $filter = (int) $this->param('active'); } $products = $products->filter(function ($product) use($filter) { return $product->active == $filter; }); } if ($this->property('category')) { $filter = $this->property('category'); if ($filter == 'slug:category') { $filter = $this->param('category'); } if ($filter == ':all') { $products = $products->filter(function ($product) use($filter) { return 1; }); } elseif ($filter == ':uncategorized') { $products = $products->filter(function ($product) use($filter) { $hasCtg = $product->productAttributes() && $product->productAttributes()['category'] && $product->productAttributes()['category']->value; return !$hasCtg; }); } else { $products = $products->filter(function ($product) use($filter) { return $product->productAttributes() && $product->productAttributes()['category'] && $product->productAttributes()['category']->value == $filter; }); } } if ($this->property('spider')) { $filter = $this->property('spider'); if ($filter == 'slug:spider') { $filter = $this->param('spider'); } $products = $products->filter(function ($product) use($filter) { return $product->spider == $filter; }); } if ($this->property('showOnlyWithPrice')) { $filter = $this->property('showOnlyWithPrice'); if ($filter == 'slug:showOnlyWithPrice') { $filter = $this->param('showOnlyWithPrice'); } $products = $products->filter(function ($product) use($filter) { switch ($filter) { case 'min': return $product->lastLog()->price == $product->minPrice(); break; case 'max': return $product->lastLog()->price == $product->maxPrice(); break; case 'min:10%': $diff = $product->maxPrice() - $product->minPrice(); return $product->lastLog()->price <= $product->minPrice() + $diff * 0.1; break; case 'min:25%': $diff = $product->maxPrice() - $product->minPrice(); return $product->lastLog()->price <= $product->minPrice() + $diff * 0.25; break; case 'min:50%': $diff = $product->maxPrice() - $product->minPrice(); return $product->lastLog()->price <= $product->minPrice() + $diff * 0.5; break; default: throw new \Exception("Invalid value for showOnlyWithPrice"); } }); } $orderBy = $this->property('orderBy'); if ($orderBy == 'slug:orderBy') { $orderBy = $this->param('orderBy'); } switch ($orderBy) { case 'name': $products = $products->sort(function ($p1, $p2) { return strcmp($p1->name, $p2->name); }); break; case 'price': $products = $products->sort(function ($p1, $p2) { return $p1->lastLog()->price - $p2->lastLog()->price; }); break; case 'quantity': $products = $products->sort(function ($p1, $p2) { if ($p1->productAttributes() && $p1->productAttributes()['quantity']) { return (double) $p1->productAttributes()['quantity']->value - (double) $p2->productAttributes()['quantity']->value; } return 0; }); break; case 'pricePerUnit': $products = $products->sort(function ($p1, $p2) { $ret = 0; if ($ret == 0 && $p1->productAttributes() && isset($p1->productAttributes()['quantity']) && $p1->productAttributes()['quantity']->value && $p2->productAttributes() && isset($p2->productAttributes()['quantity']) && $p2->productAttributes()['quantity']->value && $p1->lastLog()->price && $p2->lastLog()->price) { $pu1 = (double) $p1->lastLog()->price / (double) $p1->productAttributes()['quantity']->value; $pu2 = (double) $p2->lastLog()->price / (double) $p2->productAttributes()['quantity']->value; return ($pu1 - $pu2) * 100; // usort should return integer numbers, so that 1.99 != 1.01 } if ($ret == 0) { if ($p1->lastLog() && $p2->lastLog()) { $ret = $p1->lastLog()->price - $p2->lastLog()->price; } } return $ret; }); break; case 'category,pricePerUnit': $products = $products->sort(function ($p1, $p2) { $ret = 0; if ($ret == 0) { if ($p1->productAttributes() && $p1->productAttributes()['category'] && $p1->productAttributes()['category']->value && $p2->productAttributes() && $p2->productAttributes()['category'] && $p2->productAttributes()['category']->value) { $ret = strcmp($p1->productAttributes()['category']->value, $p2->productAttributes()['category']->value); } } if ($ret == 0 && $p1->productAttributes() && isset($p1->productAttributes()['quantity']) && $p1->productAttributes()['quantity']->value && $p2->productAttributes() && isset($p2->productAttributes()['quantity']) && $p2->productAttributes()['quantity']->value && $p1->lastLog()->price && $p2->lastLog()->price) { $pu1 = (double) $p1->lastLog()->price / (double) $p1->productAttributes()['quantity']->value; $pu2 = (double) $p2->lastLog()->price / (double) $p2->productAttributes()['quantity']->value; return ($pu1 - $pu2) * 100; // usort should return integer numbers, so that 1.99 != 1.01 } if ($ret == 0) { if ($p1->lastLog() && $p2->lastLog()) { $ret = $p1->lastLog()->price - $p2->lastLog()->price; } } return $ret; }); break; case 'quantity,price': $products = $products->sort(function ($p1, $p2) { $ret = 0; if ($ret == 0 && $p1->productAttributes() && isset($p1->productAttributes()['category']) && $p1->productAttributes()['category']->value && $p2->productAttributes() && isset($p2->productAttributes()['category']) && $p2->productAttributes()['category']->value) { $ret = strcmp($p1->productAttributes()['category']->value, $p2->productAttributes()['category']->value); } if ($ret == 0 && $p1->productAttributes() && isset($p1->productAttributes()['quantity']) && $p1->productAttributes()['quantity']->value && $p2->productAttributes() && isset($p2->productAttributes()['quantity']) && $p2->productAttributes()['quantity']->value) { $ret = (double) $p1->productAttributes()['quantity']->value - (double) $p2->productAttributes()['quantity']->value; } if ($ret == 0) { if ($p1->lastLog() && $p2->lastLog()) { $ret = $p1->lastLog()->price - $p2->lastLog()->price; } } return $ret; }); $stats = array(); foreach ($products as $p1) { if ($p1->productAttributes() && isset($p1->productAttributes()['quantity']) && $p1->productAttributes()['quantity']->value) { $stats[$p1->productAttributes()['quantity']->value]['price'][] = $p1->lastLog()->price; } } foreach ($products as $p1) { if ($p1->productAttributes() && isset($p1->productAttributes()['quantity']) && $p1->productAttributes()['quantity']->value) { $this->markedElements[$p1->id] = array('priceMin' => min($stats[$p1->productAttributes()['quantity']->value]['price']) == $p1->lastLog()->price, 'priceMax' => max($stats[$p1->productAttributes()['quantity']->value]['price']) == $p1->lastLog()->price); } } break; } #var_dump($products);die(); $this->products = $products; $this->addCss("styles/index.css"); return parent::onRun(); }