예제 #1
0
 /**
  * Provides a product quantity input for adding the product to the shopping cart
  *
  * @api `shopp('product.quantity')`
  * @since 1.0
  *
  * @param string       $result  The output
  * @param array        $options The options
  * - **input**: `text` (text,menu) The type of quantity input field to generate
  * - **label**: A label to show with the input field
  * - **labelpos**: `before` (before,after) The position of the label, `before` or `after` the input
  * - **options**: `1-15,20,25,30,40,50,75,100` Used with the `menu` setting for the **input** option to generate the available quantity options.
  *   -Options are separated by commas and a range of options can be specified by using a dash (1-15) to generate all of the options from the beginning of the range to the end of the range
  * - **autocomplete**: (on, off) Specifies whether an `<input>` element should have autocomplete enabled
  * - **accesskey**: Specifies a shortcut key to activate/focus an element. Linux/Windows: `[Alt]`+`accesskey`, Mac: `[Ctrl]``[Opt]`+`accesskey`
  * - **alt**: Specifies an alternate text for images (only for type="image")
  * - **checked**: Specifies that an `<input>` element should be pre-selected when the page loads (for type="checkbox" or type="radio")
  * - **class**: The class attribute specifies one or more class-names for an element
  * - **disabled**: Specifies that an `<input>` element should be disabled
  * - **format**: Specifies special field formatting class names for JS validation
  * - **minlength**: Sets a minimum length for the field enforced by JS validation
  * - **maxlength**: Specifies the maximum number of characters allowed in an `<input>` element
  * - **placeholder**: Specifies a short hint that describes the expected value of an `<input>` element
  * - **readonly**: Specifies that an input field is read-only
  * - **required**: Adds a class that specified an input field must be filled out before submitting the form, enforced by JS
  * - **size**: Specifies the width, in characters, of an `<input>` element
  * - **src**: Specifies the URL of the image to use as a submit button (only for type="image")
  * - **tabindex**: Specifies the tabbing order of an element
  * - **cols**: Specifies the visible width of a `<textarea>`
  * - **rows**: Specifies the visible number of lines in a `<textarea>`
  * - **title**: Specifies extra information about an element
  * - **value**: `1` Specifies the value of the `<input>` element
  * @param ShoppProduct $O       The working object
  * @return string The input markup
  **/
 public static function quantity($result, $options, $O)
 {
     if (!shopp_setting_enabled('shopping_cart')) {
         return '';
     }
     if (shopp_setting_enabled('inventory') && $O->outofstock) {
         return '';
     }
     $inputs = array('text', 'menu');
     $defaults = array('value' => 1, 'input' => 'text', 'labelpos' => 'before', 'label' => '', 'options' => '1-15,20,25,30,40,50,75,100', 'size' => false);
     $options = array_merge($defaults, $options);
     $attributes = $options;
     extract($attributes);
     $select_attrs = array('title', 'required', 'class', 'disabled', 'required', 'size', 'tabindex', 'accesskey');
     unset($attributes['label']);
     // Interferes with the text input value when passed to inputattrs()
     $labeling = empty($label) ? '' : '<label for="quantity-' . $O->id . '">' . $label . '</label>';
     if (!isset($O->_prices_loop)) {
         reset($O->prices);
     }
     $variation = current($O->prices);
     if (!shopp_setting_enabled('download_quantity') && !empty($O->prices)) {
         $downloadonly = true;
         foreach ($O->prices as $variant) {
             if ('Download' != $variant->type && 'N/A' != $variant->type) {
                 $downloadonly = false;
             }
         }
         if ($downloadonly) {
             return '';
         }
     }
     $_ = array();
     if ("before" == $labelpos) {
         $_[] = $labeling;
     }
     if ("menu" == $input) {
         if (Shopp::str_true($O->inventory) && isset($O->max['stock']) && $O->max['stock'] == 0) {
             return "";
         }
         if (strpos($options, ",") !== false) {
             $options = explode(",", $options);
         } else {
             $options = array($options);
         }
         $qtys = array();
         foreach ((array) $options as $v) {
             if (strpos($v, "-") !== false) {
                 $v = explode("-", $v);
                 if ($v[0] >= $v[1]) {
                     $qtys[] = $v[0];
                 } else {
                     for ($i = $v[0]; $i < $v[1] + 1; $i++) {
                         $qtys[] = $i;
                     }
                 }
             } else {
                 $qtys[] = $v;
             }
         }
         $_[] = '<select name="products[' . $O->id . '][quantity]" id="quantity-' . $O->id . '"' . inputattrs($attributes, $select_attrs) . '>';
         foreach ($qtys as $qty) {
             $amount = $qty;
             if ($variation && 'Donation' == $variation->type && Shopp::str_true($variation->donation['var'])) {
                 if ($variation->donation['min'] == "on" && $amount < $variation->price) {
                     continue;
                 }
                 $amount = money($amount);
                 $value = $variation->price;
             } else {
                 if (Shopp::str_true($O->inventory) && $amount > $O->max['stock']) {
                     continue;
                 }
             }
             $selected = $qty == $value ? ' selected="selected"' : '';
             $_[] = '<option' . $selected . ' value="' . $qty . '">' . $amount . '</option>';
         }
         $_[] = '</select>';
     } elseif (Shopp::valid_input($input)) {
         if ($variation && 'Donation' == $variation->type && Shopp::str_true($variation->donation['var'])) {
             if ($variation->donation['min']) {
                 $attributes['value'] = $variation->price;
             }
             $attributes['class'] .= " currency";
         }
         $_[] = '<input type="' . $input . '" name="products[' . $O->id . '][quantity]" id="quantity-' . $O->id . '"' . inputattrs($attributes) . ' />';
     }
     if ("after" == $labelpos) {
         $_[] = $labeling;
     }
     return join("\n", $_);
 }
예제 #2
0
 /**
  * Provides the quantity selector and current cart item quantity
  *
  * @api `shopp('cartitem.quantity')`
  * @since 1.0
  *
  * @param string        $result  The output
  * @param array         $options The options
  * - **input**: (menu, text, hidden) Sets the type of input element to render. Menu for a `<select>` menu, text for text box, hidden for a hidden input
  * - **options**: `1-15,20,25,30,35,40,45,50,60,70,80,90,100` Defines the default options when **input** is set to `menu`. Values are separated by commas. Ranges will automatically generate number options within the range.
  * - **autocomplete**: (on, off) Specifies whether an `<input>` element should have autocomplete enabled
  * - **accesskey**: Specifies a shortcut key to activate/focus an element. Linux/Windows: `[Alt]`+`accesskey`, Mac: `[Ctrl]``[Opt]`+`accesskey`
  * - **alt**: Specifies an alternate text for images (only for type="image")
  * - **checked**: Specifies that an `<input>` element should be pre-selected when the page loads (for type="checkbox" or type="radio")
  * - **class**: The class attribute specifies one or more class-names for an element
  * - **disabled**: Specifies that an `<input>` element should be disabled
  * - **format**: Specifies special field formatting class names for JS validation
  * - **minlength**: Sets a minimum length for the field enforced by JS validation
  * - **maxlength**: Specifies the maximum number of characters allowed in an `<input>` element
  * - **placeholder**: Specifies a short hint that describes the expected value of an `<input>` element
  * - **readonly**: Specifies that an input field is read-only
  * - **required**: Adds a class that specified an input field must be filled out before submitting the form, enforced by JS
  * - **size**: `5` Specifies the width, in characters, of an `<input>` element
  * - **src**: Specifies the URL of the image to use as a submit button (only for type="image")
  * - **tabindex**: Specifies the tabbing order of an element
  * - **cols**: Specifies the visible width of a `<textarea>`
  * - **rows**: Specifies the visible number of lines in a `<textarea>`
  * - **title**: Specifies extra information about an element
  * - **value**: Specifies the value of an `<input>` element
  * @param ShoppCartItem $O       The working object
  * @return string The cart item quantity or quantity element markup
  **/
 public static function quantity($result, $options, $O)
 {
     $result = $O->quantity;
     if ('Donation' === $O->type && 'on' === $O->donation['var']) {
         return $result;
     }
     if ('Subscription' === $O->type || 'Membership' === $O->type) {
         return $result;
     }
     if ('Download' === $O->type && !shopp_setting_enabled('download_quantity')) {
         return $result;
     }
     if (isset($options['input']) && 'menu' === $options['input']) {
         if (!isset($options['value'])) {
             $options['value'] = $O->quantity;
         }
         if (!isset($options['options'])) {
             $values = '1-15,20,25,30,35,40,45,50,60,70,80,90,100';
         } else {
             $values = $options['options'];
         }
         if (strpos($values, ',') !== false) {
             $values = explode(',', $values);
         } else {
             $values = array($values);
         }
         $qtys = array();
         foreach ($values as $value) {
             if (false !== strpos($value, '-')) {
                 $value = explode("-", $value);
                 if ($value[0] >= $value[1]) {
                     $qtys[] = $value[0];
                 } else {
                     for ($i = $value[0]; $i < $value[1] + 1; $i++) {
                         $qtys[] = $i;
                     }
                 }
             } else {
                 $qtys[] = $value;
             }
         }
         $result = '<select name="items[' . $O->_id . '][quantity]">';
         foreach ($qtys as $qty) {
             $result .= '<option' . ($qty == $O->quantity ? ' selected="selected"' : '') . ' value="' . $qty . '">' . $qty . '</option>';
         }
         $result .= '</select>';
     } elseif (isset($options['input']) && Shopp::valid_input($options['input'])) {
         if (!isset($options['size'])) {
             $options['size'] = 5;
         }
         if (!isset($options['value'])) {
             $options['value'] = $O->quantity;
         }
         $result = '<input type="' . $options['input'] . '" name="items[' . $O->_id . '][quantity]" id="items-' . $O->_id . '-quantity" ' . inputattrs($options) . '/>';
     } else {
         $result = $O->quantity;
     }
     return $result;
 }
예제 #3
0
/**
 * @deprecated Use Shopp::valid_input()
 **/
function valid_input($type)
{
    return Shopp::valid_input($type);
}