public function __construct() { parent::__construct(); $this->name = __('Database', 'Shopp'); $this->_table = ShoppDatabaseObject::tablename($this->_table); $this->_metatable = ShoppDatabaseObject::tablename($this->_metatable); }
public function screen() { if (!current_user_can('shopp_promotions')) { wp_die(__('You do not have sufficient permissions to access this page.')); } $table = ShoppDatabaseObject::tablename(ShoppPromo::$table); $defaults = array('page' => false, 'status' => false, 'type' => false, 'paged' => 1, 'per_page' => 20, 's' => ''); $args = array_merge($defaults, $_GET); extract($args, EXTR_SKIP); $url = add_query_arg(array_merge($_GET, array('page' => $this->page)), admin_url('admin.php')); $f = array('action', 'selected', 's'); $url = remove_query_arg($f, $url); $pagenum = absint($paged); $start = $per_page * ($pagenum - 1); $where = array(); if (!empty($s)) { $where[] = "name LIKE '%{$s}%'"; } if ($status) { $datesql = ShoppPromo::activedates(); switch (strtolower($status)) { case 'active': $where[] = "status='enabled' AND {$datesql}"; break; case 'inactive': $where[] = "status='enabled' AND NOT {$datesql}"; break; case 'enabled': $where[] = "status='enabled'"; break; case 'disabled': $where[] = "status='disabled'"; break; } } if ($type) { switch (strtolower($type)) { case 'catalog': $where[] = "target='Catalog'"; break; case 'cart': $where[] = "target='Cart'"; break; case 'cartitem': $where[] = "target='Cart Item'"; break; } } $select = sDB::select(array('table' => $table, 'columns' => 'SQL_CALC_FOUND_ROWS *', 'where' => $where, 'orderby' => 'created DESC', 'limit' => "{$start},{$per_page}")); $Promotions = sDB::query($select, 'array'); $count = sDB::found(); $num_pages = ceil($count / $per_page); $ListTable = ShoppUI::table_set_pagination($this->id, $count, $num_pages, $per_page); $states = array('active' => __('Active', 'Shopp'), 'inactive' => __('Not Active', 'Shopp'), 'enabled' => __('Enabled', 'Shopp'), 'disabled' => __('Disabled', 'Shopp')); $types = array('catalog' => __('Catalog Discounts', 'Shopp'), 'cart' => __('Cart Discounts', 'Shopp'), 'cartitem' => __('Cart Item Discounts', 'Shopp')); $num_pages = ceil($count / $per_page); $page_links = paginate_links(array('base' => add_query_arg('pagenum', '%#%'), 'format' => '', 'total' => $num_pages, 'current' => $pagenum)); include $this->ui('discounts.php'); }
/** * Overloads the default load to update location details after load * * @author Jonathan Davis * @since 1.2 * * @param integer $id The ID to lookup the record by * @param string $key The column to use for matching the ID against * @return boolean True if successfully loaded, false otherwise **/ public function load($id = false, $key = 'id') { if ('customer' == $key) { $loaded = parent::load(array('customer' => $id, 'type' => $this->type)); } else { $loaded = parent::load($id, $key); } $this->locate(); return $loaded; }
function query() { extract($this->options, EXTR_SKIP); $where = array(); $where[] = "o.created BETWEEN '" . sDB::mkdatetime($starts) . "' AND '" . sDB::mkdatetime($ends) . "'"; $where = join(" AND ", $where); $id = $this->timecolumn('o.created'); $orders_table = ShoppDatabaseObject::tablename('purchase'); $purchased_table = ShoppDatabaseObject::tablename('purchased'); $query = "SELECT CONCAT({$id}) AS id,\n\t\t\t\t\t\t\tUNIX_TIMESTAMP(o.created) as period,\n\t\t\t\t\t\t\tSUM( ( SELECT SUM(p.quantity) FROM {$purchased_table} AS p WHERE o.id = p.purchase ) ) AS items,\n\t\t\t\t\t\t\tCOUNT(DISTINCT o.id) AS orders,\n\t\t\t\t\t\t\tSUM(o.subtotal) as subtotal,\n\t\t\t\t\t\t\tSUM(o.discount) as discounts\n\t\t\t\t\tFROM {$orders_table} AS o\n\t\t\t\t\tWHERE {$where}\n\t\t\t\t\tGROUP BY CONCAT({$id})"; return $query; }
function query() { extract($this->options, EXTR_SKIP); $where = array(); $where[] = "o.created BETWEEN '" . sDB::mkdatetime($starts) . "' AND '" . sDB::mkdatetime($ends) . "'"; $where[] = "o.txnstatus IN ('authed', 'captured', 'CHARGED')"; $where = join(" AND ", $where); $id = $this->timecolumn('o.created'); $orders_table = ShoppDatabaseObject::tablename('purchase'); $purchased_table = ShoppDatabaseObject::tablename('purchased'); $query = "SELECT CONCAT({$id}) AS id,\n\t\t\t\t\t\t\tUNIX_TIMESTAMP(o.created) AS period,\n\t\t\t\t\t\t\tCOUNT(DISTINCT o.id) AS orders,\n\t\t\t\t\t\t\tSUM(o.subtotal) AS subtotal,\n\t\t\t\t\t\t\tSUM(o.tax) AS tax,\n\t\t\t\t\t\t\tSUM(o.freight) AS shipping,\n\t\t\t\t\t\t\tSUM(o.discount) AS discounts,\n\t\t\t\t\t\t\tSUM(o.total) AS total,\n\t\t\t\t\t\t\tAVG(o.total) AS orderavg,\n\t\t\t\t\t\t\tSUM( (SELECT SUM(p.quantity) FROM {$purchased_table} AS p WHERE o.id = p.purchase) ) AS items,\n\t\t\t\t\t\t\t(SELECT AVG(p.unitprice) FROM {$purchased_table} AS p WHERE o.id = p.purchase) AS itemavg\n\t\t\t\t\tFROM {$orders_table} AS o\n\t\t\t\t\tWHERE {$where}\n\t\t\t\t\tGROUP BY CONCAT({$id})"; return $query; }
public function query() { extract($this->options, EXTR_SKIP); $where = array(); $where[] = "o.created BETWEEN '" . sDB::mkdatetime($starts) . "' AND '" . sDB::mkdatetime($ends) . "'"; $where[] = "o.txnstatus IN ('authed', 'captured', 'CHARGED')"; $where = join(" AND ", $where); $id = $this->timecolumn('o.created'); $orders_table = ShoppDatabaseObject::tablename('purchase'); $purchased_table = ShoppDatabaseObject::tablename('purchased'); $query = "SELECT CONCAT({$id}) AS id,\n\t\t\t\t\t\t\tUNIX_TIMESTAMP(o.created) as period,\n\t\t\t\t\t\t\tCOUNT(DISTINCT o.id) AS orders,\n\t\t\t\t\t\t\tSUM(o.subtotal) as subtotal,\n\t\t\t\t\t\t\tSUM(o.tax) as tax,\n\t\t\t\t\t\t\tSUM(p1.taxable) as taxable,\n\t\t\t\t\t\t\tAVG(p2.rate) as rate\n\t\t\t\t\tFROM {$orders_table} AS o\n\t\t\t\t\tLEFT JOIN (SELECT purchase, SUM(p.total) as taxable FROM {$purchased_table} AS p WHERE p.unittax > 0 GROUP BY purchase) p1 ON p1.purchase = o.id\n\t\t\t\t\tLEFT JOIN (SELECT purchase, AVG(p.unittax/p.unitprice) as rate FROM {$purchased_table} AS p WHERE p.unittax > 0 GROUP BY purchase) p2 ON p2.purchase = o.id\n\t\t\t\t\tWHERE {$where}\n\t\t\t\t\tGROUP BY CONCAT({$id})"; return $query; }
public function screen() { $Shopp = Shopp::object(); if (!current_user_can('shopp_settings_checkout')) { wp_die(__('You do not have sufficient permissions to access this page.')); } $purchasetable = ShoppDatabaseObject::tablename(ShoppPurchase::$table); $next = sDB::query("SELECT IF ((MAX(id)) > 0,(MAX(id)+1),1) AS id FROM {$purchasetable} LIMIT 1"); $next_setting = shopp_setting('next_order_id'); if ($next->id > $next_setting) { $next_setting = $next->id; } $term_recount = false; if (!empty($_POST['save'])) { check_admin_referer('shopp-setup-management'); $next_order_id = $_POST['settings']['next_order_id'] = intval($_POST['settings']['next_order_id']); if ($next_order_id >= $next->id) { if (sDB::query("ALTER TABLE {$purchasetable} AUTO_INCREMENT=" . sDB::escape($next_order_id))) { $next_setting = $next_order_id; } } $_POST['settings']['order_shipfee'] = Shopp::floatval($_POST['settings']['order_shipfee']); // Recount terms when this setting changes if (isset($_POST['settings']['inventory']) && $_POST['settings']['inventory'] != shopp_setting('inventory')) { $term_recount = true; } shopp_set_formsettings(); $this->notice(Shopp::__('Management settings saved.'), 'notice', 20); } if ($term_recount) { $taxonomy = ProductCategory::$taxon; $terms = get_terms($taxonomy, array('hide_empty' => 0, 'fields' => 'ids')); if (!empty($terms)) { wp_update_term_count_now($terms, $taxonomy); } } $states = array(__('Map the label to an order state:', 'Shopp') => array_merge(array('' => ''), Lookup::txnstatus_labels())); $statusLabels = shopp_setting('order_status'); $statesLabels = shopp_setting('order_states'); $reasonLabels = shopp_setting('cancel_reasons'); if (empty($reasonLabels)) { $reasonLabels = array(__('Not as described or expected', 'Shopp'), __('Wrong size', 'Shopp'), __('Found better prices elsewhere', 'Shopp'), __('Product is missing parts', 'Shopp'), __('Product is defective or damaaged', 'Shopp'), __('Took too long to deliver', 'Shopp'), __('Item out of stock', 'Shopp'), __('Customer request to cancel', 'Shopp'), __('Item discontinued', 'Shopp'), __('Other reason', 'Shopp')); } $promolimit = array('1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '15', '20', '25'); $lowstock = shopp_setting('lowstock_level'); if (empty($lowstock)) { $lowstock = 0; } include $this->ui('management.php'); }
/** * shopp_orders - get a list of purchases * * @api * @since 1.2 * * @param mixed $from (optional) mktime or SQL datetime, get purchases after this date/time. * @param mixed $to (optional) mktime or SQL datetime, get purchased before this date/time. * @param bool $items (optional default:true) load purchased items into the records, slightly slower operation * @param array $customers (optional) list of int customer ids to limit the purchases to. All customers by default. * @param int $limit (optional default:false) maximimum number of results to get, false for no limit * @param string $order (optional default:DESC) DESC or ASC, for sorting in ascending or descending order. * @param string $orderby (optional) The column used to sort records * @param bool $paidonly (optional) Restrict to orders where payment has been completed * @param bool $downloads (optional) Restrict to orders that have downloads * @return array of Purchase objects **/ function shopp_orders($from = false, $to = false, $items = true, array $customers = array(), $limit = false, $order = 'DESC', $orderby = 'id', $paidonly = false, $downloads = false) { $pt = ShoppDatabaseObject::tablename(ShoppPurchase::$table); $pd = ShoppDatabaseObject::tablename(ShoppPurchased::$table); $op = '<'; $where = array(); $dateregex = '/^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9]) (?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/'; foreach (array($from, $to) as $datetime) { if (!$datetime) { continue; } if (1 == preg_match($dateregex, $datetime)) { $where[] = "'{$datetime}' {$op} p.created"; } else { if (is_int($datetime)) { $where[] = "FROM_UNIXTIME({$datetime}) {$op} p.created"; } } $op = '>='; } if (!empty($customers)) { $set = sDB::escape(implode(',', $customers)); $where[] = "0 < FIND_IN_SET(p.customer,'" . $set . "')"; } if ($paidonly) { $where[] = "p.txnstatus='captured'"; } if ($items && $downloads) { $where[] = " pd.download > 0"; } $where = empty($where) ? '' : 'WHERE ' . implode(' AND ', $where); if ((int) $limit > 0) { $limit = " LIMIT {$limit}"; } else { $limit = ''; } if (!in_array(strtolower($orderby), array('id', 'created', 'modified'))) { $orderby = 'id'; } if ($items) { $query = "SELECT pd.* FROM {$pd} AS pd INNER JOIN {$pt} AS p ON pd.purchase = p.id {$where} " . $limit; $purchased = sDB::query($query, 'array', '_shopp_order_purchased'); $orders = sDB::query("SELECT * FROM {$pt} WHERE FIND_IN_SET(id,'" . join(',', array_keys($purchased)) . "') ORDER BY {$orderby} " . ('DESC' == $order ? 'DESC' : 'ASC'), 'array', '_shopp_order_purchase', $purchased); } else { $query = "SELECT * FROM {$pt} AS p {$where} ORDER BY {$orderby} " . ('DESC' == $order ? 'DESC' : 'ASC') . $limit; $orders = sDB::query($query, 'array', '_shopp_order_purchase'); } return $orders; }
function query() { $this->options = array_merge(array('orderby' => 'orders', 'order' => 'desc'), $this->options); extract($this->options, EXTR_SKIP); $where = array(); $where[] = "o.created BETWEEN '" . sDB::mkdatetime($starts) . "' AND '" . sDB::mkdatetime($ends) . "'"; $where[] = "o.txnstatus IN ('authed','captured')"; $where = join(" AND ", $where); if (!in_array($order, array('asc', 'desc'))) { $order = 'desc'; } if (!in_array($orderby, array('orders', 'sold', 'grossed'))) { $orderby = 'orders'; } $ordercols = "{$orderby} {$order}"; $id = "o.cardtype"; $purchase_table = ShoppDatabaseObject::tablename('purchase'); $query = "SELECT CONCAT({$id}) AS id,\n\t\t\t\t\t\t\tCOUNT(DISTINCT o.id) AS orders,\n\t\t\t\t\t\t\tSUM(o.total) AS grossed\n\t\t\t\t\tFROM {$purchase_table} AS o\n\t\t\t\t\tWHERE {$where}\n\t\t\t\t\tGROUP BY CONCAT({$id}) ORDER BY {$ordercols}"; return $query; }
function query() { $this->options = array_merge(array('orderby' => 'orders', 'order' => 'desc'), $this->options); extract($this->options, EXTR_SKIP); $where = array(); $where[] = "o.created BETWEEN '" . sDB::mkdatetime($starts) . "' AND '" . sDB::mkdatetime($ends) . "'"; $where = join(" AND ", $where); if (!in_array($order, array('asc', 'desc'))) { $order = 'desc'; } if (!in_array($orderby, array('orders', 'sold', 'grossed'))) { $orderby = 'orders'; } $ordercols = "{$orderby} {$order}"; $id = 'c.id'; $purchase_table = ShoppDatabaseObject::tablename('purchase'); $purchased_table = ShoppDatabaseObject::tablename('purchased'); $customer_table = ShoppDatabaseObject::tablename('customer'); $query = "SELECT {$id} AS id,\n\t\t\t\t\t\t\tCONCAT(c.firstname,' ',c.lastname) AS customer,\n\t\t\t\t\t\t\tSUM( (SELECT SUM(p.quantity) FROM {$purchased_table} AS p WHERE o.id = p.purchase) ) AS sold,\n\t\t\t\t\t\t\tCOUNT(DISTINCT o.id) AS orders,\n\t\t\t\t\t\t\tSUM(o.total) AS grossed\n\t\t\t\t\tFROM {$purchase_table} as o\n\t\t\t\t\tINNER JOIN {$customer_table} AS c ON c.id=o.customer\n\t\t\t\t\tWHERE {$where}\n\t\t\t\t\tGROUP BY {$id} ORDER BY {$ordercols}"; return $query; }
function query() { $this->options = array_merge(array('orderby' => '(pr.stock/pr.stocked)', 'order' => 'ASC'), $this->options); extract($this->options, EXTR_SKIP); $where = array(); $where[] = "pr.inventory='on'"; $where = join(" AND ", $where); if (!in_array(strtoupper($order), array('ASC', 'DESC'))) { $order = 'DESC'; } if (!in_array(strtolower($orderby), array('inventory'))) { $orderby = '(pr.stock/pr.stocked)'; } $ordercols = "{$orderby} {$order}"; $id = "pr.product,' ',pr.id"; $product_table = WPDatabaseObject::tablename(ShoppProduct::$table); $summary_table = ShoppDatabaseObject::tablename(ProductSummary::$table); $price_table = ShoppDatabaseObject::tablename('price'); $query = "SELECT CONCAT({$id}) AS id,\n\t\t\t\t\t\t\tCONCAT(p.post_title,' ',pr.label) AS product,\n\t\t\t\t\t\t\tpr.stock AS inventory,\n\t\t\t\t\t\t\tpr.stocked AS stocked,\n\t\t\t\t\t\t\t(pr.stock/pr.stocked)*100 AS level\n\t\t\t\t\tFROM {$price_table} AS pr\n\t\t\t\t\tJOIN {$product_table} AS p ON p.ID=pr.product\n\t\t\t\t\tWHERE {$where}\n\t\t\t\t\tGROUP BY CONCAT({$id}) ORDER BY {$ordercols}"; return $query; }
public function query() { $this->options = array_merge(array('orderby' => 'orders', 'order' => 'desc'), $this->options); extract($this->options, EXTR_SKIP); $where = array(); $where[] = "o.created BETWEEN '" . sDB::mkdatetime($starts) . "' AND '" . sDB::mkdatetime($ends) . "'"; $where[] = "orders.txnstatus IN ('authed','captured')"; $where = join(" AND ", $where); if (!in_array($order, array('asc', 'desc'))) { $order = 'desc'; } if (!in_array($orderby, array('orders', 'sold', 'grossed'))) { $orderby = 'orders'; } $ordercols = "{$orderby} {$order}"; $id = "o.product,' ',o.price"; $purchase_table = ShoppDatabaseObject::tablename('purchase'); $purchased_table = ShoppDatabaseObject::tablename('purchased'); $product_table = WPDatabaseObject::tablename(ShoppProduct::$table); $price_table = ShoppDatabaseObject::tablename('price'); $query = "SELECT CONCAT({$id}) AS id,\n\t\t\t\t\t\t\tCONCAT(p.post_title,' ', IF(pr.context != 'product',pr.label,'')) AS product,\n\t\t\t\t\t\t\tpr.sku as sku,\n\t\t\t\t\t\t\tSUM(o.quantity) AS sold,\n\t\t\t\t\t\t\tCOUNT(DISTINCT o.purchase) AS orders,\n\t\t\t\t\t\t\tSUM(o.total) AS grossed\n\t\t\t\t\tFROM {$purchased_table} AS o INNER JOIN {$purchase_table} AS orders ON orders.id=o.purchase\n\t\t\t\t\tJOIN {$product_table} AS p ON p.ID=o.product\n\t\t\t\t\tJOIN {$price_table} AS pr ON pr.id=o.price\n\t\t\t\t\tWHERE {$where}\n\t\t\t\t\tGROUP BY CONCAT({$id}) ORDER BY {$ordercols}"; return $query; }
public function query($request = array()) { $defaults = array('status' => false, 's' => false, 'start' => false, 'end' => false); $request = array_merge($defaults, $_GET); extract($request); if (!empty($start)) { list($month, $day, $year) = explode('/', $start); $start = mktime(0, 0, 0, $month, $day, $year); } if (!empty($end)) { list($month, $day, $year) = explode('/', $end); $end = mktime(23, 59, 59, $month, $day, $year); } $where = array(); $joins = array(); if (!empty($status) || $status === '0') { $where[] = "status='" . sDB::escape($status) . "'"; } if (!empty($s)) { $s = stripslashes($s); $search = array(); if (preg_match_all('/(\\w+?)\\:(?="(.+?)"|(.+?)\\b)/', $s, $props, PREG_SET_ORDER) > 0) { foreach ($props as $query) { $keyword = sDB::escape(!empty($query[2]) ? $query[2] : $query[3]); switch (strtolower($query[1])) { case "txn": $search[] = "txnid='{$keyword}'"; break; case "company": $search[] = "company LIKE '%{$keyword}%'"; break; case "gateway": $search[] = "gateway LIKE '%{$keyword}%'"; break; case "cardtype": $search[] = "cardtype LIKE '%{$keyword}%'"; break; case "address": $search[] = "(address LIKE '%{$keyword}%' OR xaddress='%{$keyword}%')"; break; case "city": $search[] = "city LIKE '%{$keyword}%'"; break; case "province": case "state": $search[] = "state='{$keyword}'"; break; case "zip": case "zipcode": case "postcode": $search[] = "postcode='{$keyword}'"; break; case "country": $search[] = "country='{$keyword}'"; break; case "promo": case "discount": $meta_table = ShoppDatabaseObject::tablename(ShoppMetaObject::$table); $joins[$meta_table] = "INNER JOIN {$meta_table} AS discounts ON discounts.parent = o.id AND discounts.name='discounts' AND discounts.context='purchase'"; $search[] = "discounts.value LIKE '%{$keyword}%'"; break; } } if (empty($search)) { $search[] = "(o.id='{$s}' OR CONCAT(firstname,' ',lastname) LIKE '%{$s}%')"; } $where[] = "(" . join(' OR ', $search) . ")"; } elseif (strpos($s, '@') !== false) { $where[] = "email='" . sDB::escape($s) . "'"; } else { $where[] = "(o.id='{$s}' OR CONCAT(firstname,' ',lastname) LIKE '%" . sDB::escape($s) . "%')"; } } if (!empty($start) && !empty($end)) { $where[] = '(UNIX_TIMESTAMP(o.created) >= ' . $start . ' AND UNIX_TIMESTAMP(o.created) <= ' . $end . ')'; } if (!empty($customer)) { $where[] = "customer=" . intval($customer); } $where = !empty($where) ? "WHERE " . join(' AND ', $where) : ''; $purchasetable = ShoppDatabaseObject::tablename(ShoppPurchase::$table); $purchasedtable = ShoppDatabaseObject::tablename(ShoppPurchased::$table); $offset = $this->set * $this->limit; $c = 0; $columns = array(); $purchasedcols = false; $discountcols = false; $addoncols = false; foreach ($this->selected as $column) { $columns[] = "{$column} AS col" . $c++; if (false !== strpos($column, 'p.')) { $purchasedcols = true; } if (false !== strpos($column, 'discounts')) { $discountcols = true; } if (false !== strpos($column, 'addons')) { $addoncols = true; } } if ($purchasedcols) { $FROM = "FROM {$purchasedtable} AS p INNER JOIN {$purchasetable} AS o ON o.id=p.purchase"; } else { $FROM = "FROM {$purchasetable} AS o"; } if ($discountcols) { $meta_table = ShoppDatabaseObject::tablename(ShoppMetaObject::$table); $joins[$meta_table] = "LEFT JOIN {$meta_table} AS discounts ON discounts.parent = o.id AND discounts.name='discounts' AND discounts.context='purchase'"; } if ($addoncols) { $meta_table = ShoppDatabaseObject::tablename(ShoppMetaObject::$table); $joins[$meta_table . '_2'] = "LEFT JOIN {$meta_table} AS addons ON addons.parent = p.id AND addons.type='addon' AND addons.context='purchased'"; } $joins = join(' ', $joins); $query = "SELECT " . join(",", $columns) . " {$FROM} {$joins} {$where} ORDER BY o.created ASC LIMIT {$offset},{$this->limit}"; $this->data = sDB::query($query, 'array'); }
/** * Adds the save_post event to Shopp custom post saves * * @author Jonathan Davis * @since 1.2 * * @return void **/ function save() { parent::save(); do_action('save_post', $this->id, get_post($this->id)); }
/** * Renders the bestselling products dashboard widget * * @author Jonathan Davis * @since 1.0 * * @return void **/ public static function inventory_widget($args = false) { $warnings = array('none' => __('OK', 'Shopp'), 'warning' => __('warning', 'Shopp'), 'critical' => __('critical', 'Shopp'), 'backorder' => __('backorder', 'Shopp')); $defaults = array('before_widget' => '', 'before_title' => '', 'widget_name' => '', 'after_title' => '', 'after_widget' => ''); $args = array_merge($defaults, (array) $args); extract($args, EXTR_SKIP); $pt = ShoppDatabaseObject::tablename(ShoppPrice::$table); $setting = shopp_setting('lowstock_level'); $where = array(); $where[] = "pt.stock < pt.stocked AND pt.stock/pt.stocked < {$setting}"; $where[] = "(pt.context='product' OR pt.context='variation') AND pt.type != 'N/A'"; $loading = array('columns' => "pt.id AS stockid,IF(pt.context='variation',CONCAT(p.post_title,': ',pt.label),p.post_title) AS post_title,pt.sku AS sku,pt.stock,pt.stocked", 'joins' => array($pt => "LEFT JOIN {$pt} AS pt ON p.ID=pt.product"), 'where' => $where, 'groupby' => 'pt.id', 'orderby' => '(pt.stock/pt.stocked) ASC', 'published' => false, 'pagination' => false, 'limit' => 25); $Collection = new ProductCollection(); $Collection->load($loading); $productscreen = add_query_arg(array('page' => ShoppAdmin::pagename('products')), admin_url('admin.php')); echo $before_widget; echo $before_title; echo $widget_name; echo $after_title; ?> <table><tbody> <?php foreach ($Collection->products as $product) { $product->lowstock($product->stock, $product->stocked); ?> <tr> <td class="amount"><?php echo abs($product->stock); ?> </td> <td><span class="stock lowstock <?php echo $product->lowstock; ?> "><?php echo $warnings[$product->lowstock]; ?> </span></td> <td><a href="<?php echo esc_url(add_query_arg('id', $product->id, $productscreen)); ?> "><?php echo $product->name; ?> </a></td> <td><a href="<?php echo esc_url(add_query_arg('view', 'inventory', $productscreen)); ?> "><?php echo $product->sku; ?> </a></td> </tr> <?php } ?> </tbody></table> <?php echo $after_widget; }
public function management() { $Shopp = Shopp::object(); if (!current_user_can('shopp_settings_checkout')) { wp_die(__('You do not have sufficient permissions to access this page.')); } $purchasetable = ShoppDatabaseObject::tablename(ShoppPurchase::$table); $next = sDB::query("SELECT IF ((MAX(id)) > 0,(MAX(id)+1),1) AS id FROM {$purchasetable} LIMIT 1"); $next_setting = shopp_setting('next_order_id'); if ($next->id > $next_setting) { $next_setting = $next->id; } if (!empty($_POST['save'])) { check_admin_referer('shopp-setup-management'); $next_order_id = $_POST['settings']['next_order_id'] = intval($_POST['settings']['next_order_id']); if ($next_order_id >= $next->id) { if (sDB::query("ALTER TABLE {$purchasetable} AUTO_INCREMENT=" . sDB::escape($next_order_id))) { $next_setting = $next_order_id; } } shopp_set_formsettings(); $this->notice(Shopp::__('Management settings saved.'), 'notice', 20); } $states = array(__('Map the label to an order state:', 'Shopp') => array_merge(array('' => ''), Lookup::txnstatus_labels())); $statusLabels = shopp_setting('order_status'); $statesLabels = shopp_setting('order_states'); $reasonLabels = shopp_setting('cancel_reasons'); if (empty($reasonLabels)) { $reasonLabels = array(__('Not as described or expected', 'Shopp'), __('Wrong size', 'Shopp'), __('Found better prices elsewhere', 'Shopp'), __('Product is missing parts', 'Shopp'), __('Product is defective or damaaged', 'Shopp'), __('Took too long to deliver', 'Shopp'), __('Item out of stock', 'Shopp'), __('Customer request to cancel', 'Shopp'), __('Item discontinued', 'Shopp'), __('Other reason', 'Shopp')); } include $this->ui('management.php'); }
public function loadby_dkey($key) { $pricetable = ShoppDatabaseObject::tablename(ShoppPrice::$table); $Purchased = new ShoppPurchased($key, 'dkey'); if (!empty($Purchased->id)) { // Handle purchased line-item downloads $Purchase = new ShoppPurchase($Purchased->purchase); $record = sDB::query("SELECT download.* FROM {$this->_table} AS download INNER JOIN {$pricetable} AS pricing ON pricing.id=download.parent WHERE pricing.id={$Purchased->price} AND download.context='price' AND download.type='download' ORDER BY modified DESC LIMIT 1"); $this->populate($record); $this->expopulate(); $this->purchased = $Purchased->id; } else { // Handle purchased line-item meta downloads (addon downloads) $this->load(array('context' => 'purchased', 'type' => 'download', 'name' => $key)); $this->expopulate(); $this->purchased = $this->parent; } $this->etag = $key; }
function __construct($parent = false, $context = 'product', $type = false, $sort = 'sortorder') { $this->_table = ShoppDatabaseObject::tablename(self::$table); $params = array('parent' => $parent, 'context' => $context); if ($type !== false) { $params['type'] = $type; } if ($parent !== false) { $this->load($params); } }
public function loader($workflow = false) { if (!current_user_can('shopp_products')) { return; } add_screen_option('per_page', array('label' => __('Products Per Page', 'Shopp'), 'default' => 20, 'option' => 'edit_' . ShoppProduct::$posttype . '_per_page')); $per_page_option = get_current_screen()->get_option('per_page'); $defaults = array('cat' => false, 'paged' => 1, 'per_page' => $per_page_option['default'], 's' => '', 'sl' => '', 'matchcol' => '', 'view' => $this->view, 'is_inventory' => false, 'is_trash' => false, 'is_bestselling' => false, 'categories_menu' => false, 'inventory_menu' => false, 'lowstock' => 0, 'columns' => '', 'orderby' => '', 'order' => '', 'where' => array(), 'joins' => array()); $args = array_merge($defaults, $_GET); if (false !== ($user_per_page = get_user_option($per_page_option['option']))) { $args['per_page'] = $user_per_page; } extract($args, EXTR_SKIP); $url = ShoppAdminController::url($_GET); $subs = array('all' => array('label' => Shopp::__('All'), 'where' => array("p.post_status!='trash'")), 'published' => array('label' => Shopp::__('Published'), 'where' => array("p.post_status='publish'")), 'drafts' => array('label' => Shopp::__('Drafts'), 'where' => array("p.post_status='draft'")), 'onsale' => array('label' => Shopp::__('On Sale'), 'where' => array("s.sale='on' AND p.post_status != 'trash'")), 'featured' => array('label' => Shopp::__('Featured'), 'where' => array("s.featured='on' AND p.post_status != 'trash'")), 'bestselling' => array('label' => Shopp::__('Bestselling'), 'where' => array("p.post_status!='trash'", BestsellerProducts::threshold() . " < s.sold"), 'order' => 'bestselling'), 'inventory' => array('label' => Shopp::__('Inventory'), 'where' => array("s.inventory='on' AND p.post_status != 'trash'")), 'trash' => array('label' => Shopp::__('Trash'), 'where' => array("p.post_status='trash'"))); if (!shopp_setting_enabled('inventory')) { unset($subs['inventory']); } switch ($view) { case 'inventory': if (shopp_setting_enabled('inventory')) { $is_inventory = true; } else { Shopp::redirect(add_query_arg('view', null, $url), true); } break; case 'trash': $is_trash = true; break; case 'bestselling': $is_bestselling = true; break; } if ($is_inventory) { $per_page = 50; } $pagenum = absint($paged); $start = $per_page * ($pagenum - 1); $where = $subs[$this->view]['where']; if (!empty($s)) { $SearchResults = new SearchResults(array('search' => $s, 'nostock' => 'on', 'published' => 'off', 'paged' => -1)); $SearchResults->load(); $ids = array_keys($SearchResults->products); $where[] = "p.ID IN (" . join(',', $ids) . ")"; } if (!empty($cat)) { global $wpdb; $joins[$wpdb->term_relationships] = "INNER JOIN {$wpdb->term_relationships} AS tr ON (p.ID=tr.object_id)"; $joins[$wpdb->term_taxonomy] = "INNER JOIN {$wpdb->term_taxonomy} AS tt ON (tr.term_taxonomy_id=tt.term_taxonomy_id AND tt.term_id={$cat})"; if (-1 == $cat) { unset($joins[$wpdb->term_taxonomy]); $joins[$wpdb->term_relationships] = "LEFT JOIN {$wpdb->term_relationships} AS tr ON (p.ID=tr.object_id)"; $where[] = 'tr.object_id IS NULL'; } } // Detect custom taxonomies $taxonomies = array_intersect(get_object_taxonomies(ShoppProduct::$posttype), array_keys($_GET)); if (!empty($taxonomies)) { foreach ($taxonomies as $n => $taxonomy) { global $wpdb; $term = get_term_by('slug', $_GET[$taxonomy], $taxonomy); if (!empty($term->term_id)) { $joins[$wpdb->term_relationships . '_' . $n] = "INNER JOIN {$wpdb->term_relationships} AS tr{$n} ON (p.ID=tr{$n}.object_id)"; $joins[$wpdb->term_taxonomy . '_' . $n] = "INNER JOIN {$wpdb->term_taxonomy} AS tt{$n} ON (tr{$n}.term_taxonomy_id=tt{$n}.term_taxonomy_id AND tt{$n}.term_id={$term->term_id})"; } } } if (!empty($sl) && shopp_setting_enabled('inventory')) { switch ($sl) { case "ns": foreach ($where as &$w) { $w = str_replace("s.inventory='on'", "s.inventory='off'", $w); } $where[] = "s.inventory='off'"; break; case "oos": $where[] = "(s.inventory='on' AND s.stock = 0)"; break; case "ls": $ls = shopp_setting('lowstock_level'); if (empty($ls)) { $ls = '0'; } $where[] = "(s.inventory='on' AND s.lowstock != 'none')"; break; case "is": $where[] = "(s.inventory='on' AND s.stock > 0)"; } } $lowstock = shopp_setting('lowstock_level'); // Setup queries $pd = WPDatabaseObject::tablename(ShoppProduct::$table); $pt = ShoppDatabaseObject::tablename(ShoppPrice::$table); $ps = ShoppDatabaseObject::tablename(ProductSummary::$table); $orderdirs = array('asc', 'desc'); if (in_array($order, $orderdirs)) { $orderd = strtolower($order); } else { $orderd = 'asc'; } if (isset($subs[$this->view]['order'])) { $order = $subs[$this->view]['order']; } $ordercols = ''; switch ($orderby) { case 'name': $order = 'title'; if ('desc' == $orderd) { $order = 'reverse'; } break; case 'price': $order = 'lowprice'; if ('desc' == $orderd) { $order = 'highprice'; } break; case 'date': $order = 'newest'; if ('desc' == $orderd) { $order = 'oldest'; } break; case 'sold': $ordercols = 's.sold ' . $orderd; break; case 'gross': $ordercols = 's.grossed ' . $orderd; break; case 'inventory': $ordercols = 's.stock ' . $orderd; break; case 'sku': $ordercols = 'pt.sku ' . $orderd; break; } if (in_array($this->view, array('onsale', 'featured', 'inventory'))) { $joins[$ps] = "INNER JOIN {$ps} AS s ON p.ID=s.product"; } $loading = array('where' => $where, 'joins' => $joins, 'limit' => "{$start},{$per_page}", 'load' => array('categories', 'coverimages'), 'published' => false, 'order' => $order, 'nostock' => true); if (!empty($ordercols)) { unset($loading['order']); $loading['orderby'] = $ordercols; } if ($is_inventory) { // Override for inventory products $where[] = "(pt.context='product' OR pt.context='variation') AND pt.type != 'N/A'"; $loading = array('columns' => "pt.id AS stockid,IF(pt.context='variation',CONCAT(p.post_title,': ',pt.label),p.post_title) AS post_title,pt.sku AS sku,pt.stock AS stock", 'joins' => array_merge(array($pt => "LEFT JOIN {$pt} AS pt ON p.ID=pt.product"), $joins), 'where' => $where, 'groupby' => 'pt.id', 'orderby' => str_replace('s.', 'pt.', $ordercols), 'limit' => "{$start},{$per_page}", 'nostock' => true, 'published' => false); } // Override loading product meta and limiting by pagination in the workflow list if ($workflow) { unset($loading['limit']); $loading['ids'] = true; $loading['pagination'] = false; $loading['load'] = array(); } $this->products = new ProductCollection(); $this->products->load($loading); // Overpagination protection, redirect to page 1 if the requested page doesn't exist $num_pages = ceil($this->products->total / $per_page); if ($paged > 1 && $paged > $num_pages) { Shopp::redirect(add_query_arg('paged', null, $url)); } // Return a list of product keys for workflow list requests if ($workflow) { return $this->products->worklist(); } // Get sub-screen counts $subcounts = Shopp::cache_get('shopp_product_subcounts', 'shopp_admin'); if ($subcounts) { foreach ($subcounts as $name => $total) { if (isset($subs[$name])) { $subs[$name]['total'] = $total; } } } else { $subcounts = array(); foreach ($subs as $name => &$subquery) { $subquery['total'] = 0; $query = array('columns' => "count(*) AS total", 'table' => "{$pd} as p", 'joins' => array(), 'where' => array()); $query = array_merge($query, $subquery); $query['where'][] = "p.post_type='shopp_product'"; if (in_array($name, array('onsale', 'bestselling', 'featured', 'inventory'))) { $query['joins'][$ps] = "INNER JOIN {$ps} AS s ON p.ID=s.product"; } $query = sDB::select($query); $subquery['total'] = sDB::query($query, 'auto', 'col', 'total'); $subcounts[$name] = $subquery['total']; } Shopp::cache_set('shopp_product_subcounts', $subcounts, 'shopp_admin'); } $this->subs = $subs; }
/** * Destroy the entire product search index * * @api * @since 1.3 * * @return void **/ function shopp_empty_search_index() { $index_table = ShoppDatabaseObject::tablename(ContentIndex::$table); if (sDB::query("DELETE FROM {$index_table}")) { return true; } return false; }
public function storage() { $Shopp = Shopp::object(); $Storage = $Shopp->Storage; $Storage->settings(); // Load all installed storage engines for settings UIs if (!empty($_POST['save'])) { check_admin_referer('shopp-system-storage'); shopp_set_formsettings(); // Re-initialize Storage Engines with new settings $Storage->settings(); $this->notice(Shopp::__('Shopp system settings saved.')); } elseif (!empty($_POST['rebuild'])) { $assets = ShoppDatabaseObject::tablename(ProductImage::$table); $query = "DELETE FROM {$assets} WHERE context='image' AND type='image'"; if (sDB::query($query)) { $updated = __('All cached images have been cleared.', 'Shopp'); } } // Build the storage options menu $storage = $engines = $storageset = array(); foreach ($Storage->active as $module) { $storage[$module->module] = $module->name; $engines[$module->module] = sanitize_title_with_dashes($module->module); $storageset[$module->module] = $Storage->get($module->module)->settings; } $Storage->ui(); // Setup setting UIs $ImageStorage = false; $DownloadStorage = false; if (isset($_POST['image-settings'])) { $ImageStorage = $Storage->get(shopp_setting('image_storage')); } if (isset($_POST['download-settings'])) { $DownloadStorage = $Storage->get(shopp_setting('product_storage')); } add_action('shopp_storage_engine_settings', array($Storage, 'templates')); include $this->ui('storage.php'); }
/** * Interface processor for the customer list screen * * Handles processing customer list actions and displaying the * customer list screen * * @author Jonathan Davis * @return void **/ function memeberships() { $Shopp = Shopp::object(); $defaults = array('page' => false, 'deleting' => false, 'delete' => false, 'pagenum' => 1, 'per_page' => 20, 's' => ''); $args = array_merge($defaults, $_GET); extract($args, EXTR_SKIP); if ($page == $this->Admin->pagename('memberships') && !empty($deleting) && !empty($delete) && is_array($delete)) { foreach ($delete as $deletion) { $MemberPlan = new MemberPlan($deletion); $MemberPlan->delete(); } } if (!empty($_POST['save'])) { check_admin_referer('shopp-save-membership'); if ($_POST['id'] != "new") { $MemberPlan = new MemberPlan($_POST['id']); } else { $MemberPlan = new MemberPlan(); } $MemberPlan->updates($_POST); $MemberPlan->save(); $MemberPlan->load_stages(); $stages = array_keys($MemberPlan->stages); // Process updates foreach ($_POST['stages'] as $i => $stage) { if (empty($stage['id'])) { $Stage = new MemberStage($MemberPlan->id); $stage['parent'] = $MemberPlan->id; } else { $Stage = new MemberStage($MemberPlan->id, $stage['id']); } $Stage->updates($stage); $Stage->sortorder = $i; $Stage->save(); $Stage->content = array(); $stage_updates[] = $Stage->id; // If the stage data did not save, go to the next stage record if (empty($Stage->id)) { continue; } foreach ($stage['rules'] as $type => $rules) { foreach ($rules as $rule) { $AccessRule = new MemberAccess($Stage->id, $type, $rule['access']); if (empty($AccessRule->id)) { $AccessRule->save(); } // If access rule applies to all content, skip content cataloging if (strpos($AccessRule->value, '-all') !== false) { continue; } // Catalog content access rules for this access taxonomy foreach ($rule['content'] as $id => $name) { $CatalogEntry = new MemberContent($id, $AccessRule->id, $Stage->id); if (empty($CatalogEntry->id)) { $CatalogEntry->save(); } $Stage->content[$AccessRule->id][$id] = $name; } // endforeach $rule['content'] } // endforeach $rules } // endforeach $stage['rules'] $Stage->save(); // Secondary save for specific content rules } // endforeach $_POST['stages'] } $stageids = array_diff($stages, $stage_updates); if (!empty($stageids)) { $stagelist = join(',', $stageids); // Delete Catalog entries $ContentRemoval = new MemberContent(); sDB::query("DELETE FROM {$ContentRemoval->_table} WHERE 0 < FIND_IN_SET(parent,'{$stagelist}')"); // Delete Access taxonomies $AccessRemoval = new MemberAccess(); sDB::query("DELETE FROM {$AccessRemoval->_table} WHERE 0 < FIND_IN_SET(parent,'{$stagelist}')"); // Remove old stages $StageRemoval = new MemberStage(); sDB::query("DELETE FROM {$StageRemoval->_table} WHERE 0 < FIND_IN_SET(id,'{$stagelist}')"); } $pagenum = absint($pagenum); if (empty($pagenum)) { $pagenum = 1; } if (!$per_page || $per_page < 0) { $per_page = 20; } $index = $per_page * ($pagenum - 1); if (!empty($start)) { $startdate = $start; list($month, $day, $year) = explode("/", $startdate); $starts = mktime(0, 0, 0, $month, $day, $year); } if (!empty($end)) { $enddate = $end; list($month, $day, $year) = explode("/", $enddate); $ends = mktime(23, 59, 59, $month, $day, $year); } $membership_table = ShoppDatabaseObject::tablename(MemberPlan::$table); $MemberPlan = new MemberPlan(); $where = ''; // if (!empty($s)) { // $s = stripslashes($s); // if (preg_match_all('/(\w+?)\:(?="(.+?)"|(.+?)\b)/',$s,$props,PREG_SET_ORDER)) { // foreach ($props as $search) { // $keyword = !empty($search[2])?$search[2]:$search[3]; // switch(strtolower($search[1])) { // case "company": $where .= ((empty($where))?"WHERE ":" AND ")."c.company LIKE '%$keyword%'"; break; // case "login": $where .= ((empty($where))?"WHERE ":" AND ")."u.user_login LIKE '%$keyword%'"; break; // case "address": $where .= ((empty($where))?"WHERE ":" AND ")."(b.address LIKE '%$keyword%' OR b.xaddress='%$keyword%')"; break; // case "city": $where .= ((empty($where))?"WHERE ":" AND ")."b.city LIKE '%$keyword%'"; break; // case "province": // case "state": $where .= ((empty($where))?"WHERE ":" AND ")."b.state='$keyword'"; break; // case "zip": // case "zipcode": // case "postcode": $where .= ((empty($where))?"WHERE ":" AND ")."b.postcode='$keyword'"; break; // case "country": $where .= ((empty($where))?"WHERE ":" AND ")."b.country='$keyword'"; break; // } // } // } elseif (strpos($s,'@') !== false) { // $where .= ((empty($where))?"WHERE ":" AND ")."c.email='$s'"; // } else $where .= ((empty($where))?"WHERE ":" AND ")." (c.id='$s' OR CONCAT(c.firstname,' ',c.lastname) LIKE '%$s%' OR c.company LIKE '%$s%')"; // // } // if (!empty($starts) && !empty($ends)) $where .= ((empty($where))?"WHERE ":" AND ").' (UNIX_TIMESTAMP(c.created) >= '.$starts.' AND UNIX_TIMESTAMP(c.created) <= '.$ends.')'; $count = sDB::query("SELECT count(*) as total FROM {$MemberPlan->_table} AS c {$where}"); $query = "SELECT *\n\t\t\t\t\tFROM {$MemberPlan->_table}\n\t\t\t\t\tWHERE parent='{$MemberPlan->parent}'\n\t\t\t\t\t\tAND context='{$MemberPlan->context}'\n\t\t\t\t\t\tAND type='{$MemberPlan->type}'\n\t\t\t\t\tLIMIT {$index},{$per_page}"; $MemberPlans = sDB::query($query, 'array'); $num_pages = ceil($count->total / $per_page); $page_links = paginate_links(array('base' => add_query_arg('pagenum', '%#%'), 'format' => '', 'total' => $num_pages, 'current' => $pagenum)); $authentication = shopp_setting('account_system'); include SHOPP_ADMIN_PATH . "/memberships/memberships.php"; }
public function query($request = array()) { if (empty($request)) { $request = $_GET; } if (!empty($request['start'])) { list($month, $day, $year) = explode("/", $request['start']); $starts = mktime(0, 0, 0, $month, $day, $year); } if (!empty($request['end'])) { list($month, $day, $year) = explode("/", $request['end']); $ends = mktime(0, 0, 0, $month, $day, $year); } $where = "WHERE c.id IS NOT NULL "; if (isset($request['s']) && !empty($request['s'])) { $where .= " AND (id='{$request['s']}' OR firstname LIKE '%{$request['s']}%' OR lastname LIKE '%{$request['s']}%' OR CONCAT(firstname,' ',lastname) LIKE '%{$request['s']}%' OR transactionid LIKE '%{$request['s']}%')"; } if (!empty($request['start']) && !empty($request['end'])) { $where .= " AND (UNIX_TIMESTAMP(c.created) >= {$starts} AND UNIX_TIMESTAMP(c.created) <= {$ends})"; } $customer_table = ShoppDatabaseObject::tablename(Customer::$table); $billing_table = ShoppDatabaseObject::tablename(BillingAddress::$table); $shipping_table = ShoppDatabaseObject::tablename(ShippingAddress::$table); $offset = $this->set * $this->limit; $c = 0; $columns = array(); foreach ($this->selected as $column) { $columns[] = "{$column} AS col" . $c++; } $query = "SELECT " . join(",", $columns) . " FROM {$customer_table} AS c LEFT JOIN {$billing_table} AS b ON c.id=b.customer LEFT JOIN {$shipping_table} AS s ON c.id=s.customer {$where} GROUP BY c.id ORDER BY c.created ASC LIMIT {$offset},{$this->limit}"; $this->data = sDB::query($query, 'array'); }
/** * Provides markup for a unordered list widget of recent shoppers * * @api `shopp('storefront.recent-shoppers')` * @since 1.1 * * @param string $result The output * @param array $options The options * - **abbr**: `firstname` (firstname,lastname) Choose which name to abbreviate to maintain customer privacy * - **city**: `on` (on,off) Include the customer's city name * - **state**: `on` (on,off) Include the customer's state abbreviation * - **avatar**: `on` (on,off) Include the customer's avatar * - **size**: `48` Set the size of the customer avatar shown * - **show**: `5` Set the limit of the number of recent shoppers to show * @param ShoppStorefront $O The working object * @return string The markup for the widget **/ public static function recent_shoppers($result, $options, $O) { $defaults = array('abbr' => 'firstname', 'city' => true, 'state' => true, 'avatar' => true, 'size' => 48, 'show' => 5); $options = array_merge($defaults, $options); extract($options); $pt = ShoppDatabaseObject::tablename(ShoppPurchase::$table); $shoppers = sDB::query("SELECT firstname,lastname,email,city,state FROM {$pt} AS pt GROUP BY customer ORDER BY created DESC LIMIT {$show}", 'array'); if (empty($shoppers)) { return ''; } $_ = array(); $_[] = '<ul>'; foreach ($shoppers as $shopper) { if ('' == $shopper->firstname . $shopper->lastname) { continue; } if ('lastname' == $abbr) { $name = "{$shopper->firstname} " . $shopper->lastname[0] . "."; } else { $name = $shopper->firstname[0] . ". {$shopper->lastname}"; } $img = ''; if ($avatar) { $img = get_avatar($shopper->email, $size, '', $name); } $loc = ''; if ($state || $province) { $loc = $shopper->state; } if ($city) { $loc = "{$shopper->city}, {$loc}"; } $_[] = "<li><div>{$img}</div>{$name} <em>{$loc}</em></li>"; } $_[] = '</ul>'; return join('', $_); }
/** * Retrieves the number of orders in each customized order status label * * @author Jonathan Davis * @return void **/ public function status_counts() { $table = ShoppDatabaseObject::tablename(ShoppPurchase::$table); $labels = shopp_setting('order_status'); if (empty($labels)) { return false; } $status = array(); $alltotal = sDB::query("SELECT count(*) AS total FROM {$table}", 'auto', 'col', 'total'); $r = sDB::query("SELECT status,COUNT(status) AS total FROM {$table} GROUP BY status ORDER BY status ASC", 'array', 'index', 'status'); $all = array('' => __('All Orders', 'Shopp')); $labels = $all + $labels; foreach ($labels as $id => $label) { $_ = new StdClass(); $_->label = $label; $_->id = $id; $_->total = 0; if (isset($r[$id])) { $_->total = (int) $r[$id]->total; } if ('' === $id) { $_->total = $alltotal; } $status[$id] = $_; } return $status; }
public function smart(array $options = array()) { $id = urldecode($options['id']); $Promo = new ShoppPromo($id); $this->name = $Promo->name; $this->slug = $this->uri = sanitize_title_with_dashes($this->name); $pricetable = ShoppDatabaseObject::tablename(ShoppPrice::$table); $this->loading['where'] = array("p.id IN (SELECT product FROM {$pricetable} WHERE 0 < FIND_IN_SET({$Promo->id},discounts))"); }
function populate($data) { // Populate normally parent::populate($data); // Remap values data to real properties $values = $this->value; foreach ($values as $property => $data) { $this->{$property} = stripslashes_deep($data); } unset($this->value); }
/** * Marks an individual product for summary recalculation * * Recalculating t * * @author Jonathan Davis * @since 1.3 * * @param integer $id The product ID to update * @return boolean True if successful, false otherwise **/ public static function rebuild($id) { $id = intval($id); $table = ShoppDatabaseObject::tablename(ProductSummary::$table); return sDB::query("UPDATE {$table} SET modified='" . self::RECALCULATE . "' WHERE product={$id} LIMIT 1"); }
/** * Interface processor for the customer editor * * Handles rendering the interface, processing updated customer details * and handing saving them back to the database * * @author Jonathan Davis * @return void **/ public function screen() { if (!current_user_can('shopp_customers')) { wp_die(__('You do not have sufficient permissions to access this page.')); } $Customer = $this->load(); if ($Customer->exists()) { $purchase_table = ShoppDatabaseObject::tablename(ShoppPurchase::$table); $r = sDB::query("SELECT count(id) AS purchases,SUM(total) AS total FROM {$purchase_table} WHERE customer='{$Customer->id}' LIMIT 1"); $Customer->orders = $r->purchases; $Customer->total = $r->total; } $regions = ShoppLookup::country_zones(); include $this->ui('editor.php'); }
/** * Determines the minimum stock level of the item and its addons * * @author Jonathan Davis * @since 1.1 * * @return int The amount of stock available **/ public function getstock() { $stock = apply_filters('shopp_cartitem_stock', false, $this); if ($stock !== false) { return $stock; } $table = ShoppDatabaseObject::tablename(ShoppPrice::$table); $ids = array($this->priceline); if (!empty($this->addons)) { foreach ($this->addons as $addon) { if (Shopp::str_true($addon->inventory)) { $ids[] = $addon->id; } } } $result = db::query("SELECT min(stock) AS stock FROM {$table} WHERE 0 < FIND_IN_SET(id,'" . join(',', $ids) . "')"); if (isset($result->stock)) { return $result->stock; } return $this->option->stock; }