wagnerwagner / merx

Merx is a plugin to create online shops with Kirby.
https://merx.wagnerwagner.de
104 stars 10 forks source link

Improve price field for `Page must have a price field.` error #40

Closed afbora closed 2 years ago

afbora commented 3 years ago

Getting following error when you use calculated price on product models.

Page must have a price field.

https://github.com/wagnerwagner/merx/blob/master/src/Cart.php#L47

Can be use isNotEmpty() method instead of exists()


} elseif (!$page->price()->isNotEmpty()) {
  throw new \Exception('Page must have a price field.');
}
tobiasfabian commented 3 years ago

$page->price() has to be a Field. I assume your $page->price() returns a float?

The price method of your product model should look something like this.

// site/models/product.php
class ProductPage extends Page {
// …
    public function price(): \Kirby\Cms\Field
    {
        $price = 999.99;
        return new \Kirby\Cms\Field($this, 'price', $price);
    }
// …
}

Incidentally, I'm working on an improvement to this right now. In a future update floats will be allowed for $page->price(), but for now you have to return a field.

afbora commented 3 years ago

No, I'm using Field but I've no price field in product.yml. In my application: price = number of items in the package * unit price. So I've to use custom price method.


public function price()
{
  return new Field($this, 'number', (float)($this->unitPrice()->float() * $this->inPackage()->int()));
}
tobiasfabian commented 3 years ago

You can try to change the second parameter of field from number to price.

public function price()
{
  return new Field($this, 'price', (float)($this->unitPrice()->float() * $this->inPackage()->int()));
}
afbora commented 3 years ago

No luck.. ->exists() method checks the parent ->content() method and results:

$page->price(); // 1490
$page->content(); // No exists price field in content
tobiasfabian commented 3 years ago

Okay, this is a bug and needs further testing.

A quick solution could be to use two arguments with the $cart->add() method to avoid the ->exists() method.

$cart->add('nice-shoes', []);
tobiasfabian commented 2 years ago

Hey @afbora,

I removed the price check for product pages. This should solve your problem. You can try it with 1.6.0-beta.2.