/** * ecart('catalog','...') tags * * @since 1.0 * @version 1.1 * @see http://docs.ecartlugin.net/Catalog_Tags * * @param string $property The property to handle * @param array $options (optional) The tag options to process * @return mixed **/ function tag ($property,$options=array()) { global $Ecart; $Storefront =& EcartStorefront(); switch ($property) { case "url": return ecarturl(false,'catalog'); break; case "display": case "type": return $this->type; break; case "is-landing": case "is-catalog": return (is_ecart_page('catalog') && $this->type == "catalog"); break; case "is-category": return (is_ecart_page('catalog') && $this->type == "category"); break; case "is-product": return (is_ecart_page('catalog') && $this->type == "product"); break; case "is-cart": return (is_ecart_page('cart')); break; case "is-checkout": return (is_ecart_page('checkout')); break; case "is-account": return (is_ecart_page('account')); break; case "tagcloud": if (!empty($options['levels'])) $levels = $options['levels']; else $levels = 7; if (empty($this->tags)) $this->load_tags(); $min = -1; $max = -1; foreach ($this->tags as $tag) { if ($min == -1 || $tag->products < $min) $min = $tag->products; if ($max == -1 || $tag->products > $max) $max = $tag->products; } if ($max == 0) $max = 1; $string = '<ul class="ecart tagcloud">'; foreach ($this->tags as $tag) { $level = floor((1-$tag->products/$max)*$levels)+1; $link = ECART_PRETTYURLS?ecarturl("tag/$tag->name"):ecarturl(array('ecart_tag'=>$tag->name)); $string .= '<li class="level-'.$level.'"><a href="'.$link.'" rel="tag">'.$tag->name.'</a></li> '; } $string .= '</ul>'; return $string; break; case "hascategories": case "has-categories": $showsmart = isset($options['showsmart'])?$options['showsmart']:false; if (empty($this->categories)) $this->load_categories(array('where'=>'true'),$showsmart); if (count($this->categories) > 0) return true; else return false; break; case "categories": if (!isset($this->_category_loop)) { reset($this->categories); $Ecart->Category = current($this->categories); $this->_category_loop = true; } else { $Ecart->Category = next($this->categories); } if (current($this->categories) !== false) return true; else { unset($this->_category_loop); reset($this->categories); return false; } break; case "category-list": $defaults = array( 'title' => '', 'before' => '', 'after' => '', 'class' => '', 'exclude' => '', 'orderby' => 'name', 'order' => 'ASC', 'depth' => 0, 'childof' => 0, 'parent' => false, 'showall' => false, 'linkall' => false, 'linkcount' => false, 'dropdown' => false, 'hierarchy' => false, 'products' => false, 'wraplist' => true, 'showsmart' => false ); $options = array_merge($defaults,$options); extract($options, EXTR_SKIP); $this->load_categories(array("ancestry"=>true,"where"=>array("(pd.status='publish' OR pd.id IS NULL)"),"orderby"=>$orderby,"order"=>$order),$showsmart); $string = ""; $depthlimit = $depth; $depth = 0; $exclude = explode(",",$exclude); $classes = ' class="ecart_categories'.(empty($class)?'':' '.$class).'"'; $wraplist = value_is_true($wraplist); if (value_is_true($dropdown)) { if (!isset($default)) $default = __('Select category…','Ecart'); $string .= $title; $string .= '<form><select name="ecart_cats" id="ecart-categories-menu"'.$classes.'>'; $string .= '<option value="">'.$default.'</option>'; foreach ($this->categories as &$category) { // If the parent of this category was excluded, add this to the excludes and skip if (!empty($category->parent) && in_array($category->parent,$exclude)) { $exclude[] = $category->id; continue; } if (!empty($category->id) && in_array($category->id,$exclude)) continue; // Skip excluded categories if ($category->total == 0 && !isset($category->smart) && !$category->_children) continue; // Only show categories with products if ($depthlimit && $category->depth >= $depthlimit) continue; if (value_is_true($hierarchy) && $category->depth > $depth) { $parent = &$previous; if (!isset($parent->path)) $parent->path = '/'.$parent->slug; } if (value_is_true($hierarchy)) $padding = str_repeat(" ",$category->depth*3); $category_uri = empty($category->id)?$category->uri:$category->id; $link = ECART_PRETTYURLS?ecarturl("category/$category->uri"):ecarturl(array('ecart_category'=>$category_uri)); $total = ''; if (value_is_true($products) && $category->total > 0) $total = ' ('.$category->total.')'; $string .= '<option value="'.$link.'">'.$padding.$category->name.$total.'</option>'; $previous = &$category; $depth = $category->depth; } $string .= '</select></form>'; $script = "$('#ecart-categories-menu').change(function (){"; $script .= "document.location.href = $(this).val();"; $script .= "});"; add_storefrontjs($script); } else { $string .= $title; if ($wraplist) $string .= '<ul'.$classes.'>'; foreach ($this->categories as &$category) { if (!isset($category->total)) $category->total = 0; if (!isset($category->depth)) $category->depth = 0; // If the parent of this category was excluded, add this to the excludes and skip if (!empty($category->parent) && in_array($category->parent,$exclude)) { $exclude[] = $category->id; continue; } if (!empty($category->id) && in_array($category->id,$exclude)) continue; // Skip excluded categories if ($depthlimit && $category->depth >= $depthlimit) continue; if (value_is_true($hierarchy) && $category->depth > $depth) { $parent = &$previous; if (!isset($parent->path)) $parent->path = $parent->slug; if (substr($string,-5,5) == "</li>") // Keep everything but the $string = substr($string,0,-5); // last </li> to re-open the entry $active = ''; if (isset($Ecart->Category->uri) && !empty($parent->slug) && preg_match('/(^|\/)'.$parent->path.'(\/|$)/',$Ecart->Category->uri)) { $active = ' active'; } $subcategories = '<ul class="children'.$active.'">'; $string .= $subcategories; } if (value_is_true($hierarchy) && $category->depth < $depth) { for ($i = $depth; $i > $category->depth; $i--) { if (substr($string,strlen($subcategories)*-1) == $subcategories) { // If the child menu is empty, remove the <ul> to avoid breaking standards $string = substr($string,0,strlen($subcategories)*-1).'</li>'; } else $string .= '</ul></li>'; } } $category_uri = empty($category->id)?$category->uri:$category->id; $link = ECART_PRETTYURLS?ecarturl("category/$category->uri"):ecarturl(array('ecart_category'=>$category_uri)); $total = ''; if (value_is_true($products) && $category->total > 0) $total = ' <span>('.$category->total.')</span>'; $current = ''; if (isset($Ecart->Category->slug) && $Ecart->Category->slug == $category->slug) $current = ' class="current"'; $listing = ''; if ($category->total > 0 || isset($category->smart) || $linkall) $listing = '<a href="'.$link.'"'.$current.'>'.$category->name.($linkcount?$total:'').'</a>'.(!$linkcount?$total:''); else $listing = $category->name; if (value_is_true($showall) || $category->total > 0 || isset($category->smart) || $category->_children) $string .= '<li'.$current.'>'.$listing.'</li>'; $previous = &$category; $depth = $category->depth; } if (value_is_true($hierarchy) && $depth > 0) for ($i = $depth; $i > 0; $i--) { if (substr($string,strlen($subcategories)*-1) == $subcategories) { // If the child menu is empty, remove the <ul> to avoid breaking standards $string = substr($string,0,strlen($subcategories)*-1).'</li>'; } else $string .= '</ul></li>'; } if ($wraplist) $string .= '</ul>'; } return $string; break; case "views": if (isset($Ecart->Category->controls)) return false; $string = ""; $string .= '<ul class="views">'; if (isset($options['label'])) $string .= '<li>'.$options['label'].'</li>'; $string .= '<li><button type="button" class="grid"></button></li>'; $string .= '<li><button type="button" class="list"></button></li>'; $string .= '</ul>'; return $string; case "orderby-list": if (isset($Ecart->Category->controls)) return false; if (isset($Ecart->Category->loading['order']) || isset($Ecart->Category->loading['orderby'])) return false; $menuoptions = Category::sortoptions(); // Don't show custom product order for smart categories if (isset($Ecart->Category->smart)) unset($menuoptions['custom']); $title = ""; $string = ""; $dropdown = isset($options['dropdown'])?$options['dropdown']:true; $default = $Ecart->Settings->get('default_product_order'); if (empty($default)) $default = "title"; if (isset($options['default'])) $default = $options['default']; if (isset($options['title'])) $title = $options['title']; if (value_is_true($dropdown)) { if (isset($Ecart->Flow->Controller->browsing['orderby'])) $default = $Ecart->Flow->Controller->browsing['orderby']; $string .= $title; $string .= '<form action="'.esc_url($_SERVER['REQUEST_URI']).'" method="get" id="ecart-'.$Ecart->Category->slug.'-orderby-menu">'; if (!ECART_PRETTYURLS) { foreach ($_GET as $key => $value) if ($key != 'ecart_orderby') $string .= '<input type="hidden" name="'.$key.'" value="'.$value.'" />'; } $string .= '<select name="ecart_orderby" class="ecart-orderby-menu">'; $string .= menuoptions($menuoptions,$default,true); $string .= '</select>'; $string .= '</form>'; } else { $link = ""; $query = ""; if (strpos($_SERVER['REQUEST_URI'],"?") !== false) list($link,$query) = explode("\?",$_SERVER['REQUEST_URI']); $query = $_GET; unset($query['ecart_orderby']); $query = http_build_query($query); if (!empty($query)) $query .= '&'; foreach($menuoptions as $value => $option) { $label = $option; $href = esc_url($link.'?'.$query.'ecart_orderby='.$value); $string .= '<li><a href="'.$href.'">'.$label.'</a></li>'; } } return $string; break; case "breadcrumb": $defaults = array( 'separator' => ' » ', 'depth' => 7 ); $options = array_merge($defaults,$options); extract($options); if (isset($Ecart->Category->controls)) return false; if (empty($this->categories)) $this->load_categories(array('outofstock' => true)); $category = false; if (isset($Ecart->Flow->Controller->breadcrumb)) $category = $Ecart->Flow->Controller->breadcrumb; $trail = false; $search = array(); if (isset($Ecart->Flow->Controller->search)) $search = array('search'=>$Ecart->Flow->Controller->search); $path = explode("/",$category); if ($path[0] == "tag") { $category = "tag"; $search = array('tag'=>urldecode($path[1])); } $Category = Catalog::load_category($category,$search); if (!empty($Category->uri)) { $type = "category"; if (isset($Category->tag)) $type = "tag"; $category_uri = isset($Category->smart)?$Category->slug:$Category->id; $link = ECART_PRETTYURLS? ecarturl("$type/$Category->uri") : ecarturl(array_merge($_GET,array('ecart_category'=>$category_uri,'ecart_pid'=>null))); $filters = false; if (!empty($Ecart->Cart->data->Category[$Category->slug])) $filters = ' (<a href="?ecart_catfilters=cancel">'.__('Clear Filters','Ecart').'</a>)'; if (!empty($Ecart->Product)) $trail .= '<li><a href="'.$link.'">'.$Category->name.(!$trail?'':$separator).'</a></li>'; elseif (!empty($Category->name)) $trail .= '<li>'.$Category->name.$filters.(!$trail?'':$separator).'</li>'; // Build category names path by going from the target category up the parent chain $parentkey = (!empty($Category->id) && isset($this->categories['_'.$Category->id]->parent)? '_'.$this->categories['_'.$Category->id]->parent:'_0'); while ($parentkey != '_0' && $depth-- > 0) { $tree_category = $this->categories[$parentkey]; $link = ECART_PRETTYURLS? ecarturl("category/$tree_category->uri"): ecarturl(array_merge($_GET,array('ecart_category'=>$tree_category->id,'ecart_pid'=>null))); $trail = '<li><a href="'.$link.'">'.$tree_category->name.'</a>'. (empty($trail)?'':$separator).'</li>'.$trail; $parentkey = '_'.$tree_category->parent; } } $pages = $Ecart->Settings->get('pages'); $trail = '<li><a href="'.ecarturl().'">'.$pages['catalog']['title'].'</a>'.(empty($trail)?'':$separator).'</li>'.$trail; return '<ul class="breadcrumb">'.$trail.'</ul>'; break; case "searchform": ob_start(); get_search_form(); $content = ob_get_contents(); ob_end_clean(); preg_match('/^(.*?<form[^>]*>)(.*?)(<\/form>.*?)$/is',$content,$_); list($all,$open,$content,$close) = $_; $markup = array( $open, $content, '<div><input type="hidden" name="catalog" value="true" /></div>', $close ); return join('',$markup); break; case "search": global $wp; $defaults = array( 'type' => 'hidden', 'option' => 'ecart', 'blog_option' => __('Search the blog','Ecart'), 'shop_option' => __('Search the shop','Ecart'), 'label_before' => '', 'label_after' => '', 'checked' => false ); $options = array_merge($defaults,$options); extract($options); $searching = is_search(); // Flag when searching (the blog or ecart) $shopsearch = ($Storefront !== false && $Storefront->searching); // Flag when searching ecart $allowed = array("accesskey","alt","checked","class","disabled","format", "id", "minlength","maxlength","readonly","required","size","src","tabindex","title","value"); $options['value'] = ($option == "ecart"); // Reset the checked option unset($options['checked']); // If searching the blog, check the non-store search option if ($searching && !$shopsearch && $option != "ecart") $options['checked'] = "checked"; // If searching the storefront, mark the store search option if ($shopsearch && $option == "ecart") $options['checked'] = "checked"; // Override any other settings with the supplied default 'checked' option if (!$searching && $checked) $options['checked'] = $checked; switch ($type) { case "checkbox": $input = '<input type="checkbox" name="catalog"'.inputattrs($options,$allowed).' />'; break; case "radio": $input = '<input type="radio" name="catalog"'.inputattrs($options,$allowed).' />'; break; case "menu": $allowed = array("accesskey","alt","class","disabled","format", "id", "readonly","required","size","tabindex","title"); $input = '<select name="catalog"'.inputattrs($options,$allowed).'>'; $input .= '<option value="">'.$blog_option.'</option>'; $input .= '<option value="1"'.($shopsearch || (!$searching && $option == 'ecart')?' selected="selected"':'').'>'.$shop_option.'</option>'; $input .= '</select>'; break; default: $allowed = array("alt","class","disabled","format","id","readonly","title","value"); $input = '<input type="hidden" name="catalog"'.inputattrs($options,$allowed).' />'; break; } $before = (!empty($label_before))?'<label>'.$label_before:'<label>'; $after = (!empty($label_after))?$label_after.'</label>':'</label>'; return $before.$input.$after; break; case "zoom-options": $defaults = array( // Colorbox 1.3.15 'transition' => 'elastic', // The transition type. Can be set to 'elastic', 'fade', or 'none'. 'speed' => 350, // Sets the speed of the fade and elastic transitions, in milliseconds. 'href' => false, // This can be used as an alternative anchor URL or to associate a URL for non-anchor elements such as images or form buttons. Example: $('h1').colorbox({href:'welcome.html'}) 'title' => false, // This can be used as an anchor title alternative for ColorBox. 'rel' => false, // This can be used as an anchor rel alternative for ColorBox. This allows the user to group any combination of elements together for a gallery, or to override an existing rel so elements are not grouped together. Example: $('#example a').colorbox({rel:'group1'}) Note: The value can also be set to 'nofollow' to disable grouping. 'width' => false, // Set a fixed total width. This includes borders and buttons. Example: '100%', '500px', or 500 'height' => false, // Set a fixed total height. This includes borders and buttons. Example: '100%', '500px', or 500 'innerWidth' => false, // This is an alternative to 'width' used to set a fixed inner width. This excludes borders and buttons. Example: '50%', '500px', or 500 'innerHeight' => false, // This is an alternative to 'height' used to set a fixed inner height. This excludes borders and buttons. Example: '50%', '500px', or 500 'initialWidth' => 300, // Set the initial width, prior to any content being loaded. 'initialHeight' => 100, // Set the initial height, prior to any content being loaded. 'maxWidth' => false, // Set a maximum width for loaded content. Example: '100%', 500, '500px' 'maxHeight' => false, // Set a maximum height for loaded content. Example: '100%', 500, '500px' 'scalePhotos' => true, // If 'true' and if maxWidth, maxHeight, innerWidth, innerHeight, width, or height have been defined, ColorBox will scale photos to fit within the those values. 'scrolling' => true, // If 'false' ColorBox will hide scrollbars for overflowing content. This could be used on conjunction with the resize method (see below) for a smoother transition if you are appending content to an already open instance of ColorBox. 'iframe' => false, // If 'true' specifies that content should be displayed in an iFrame. 'inline' => false, // If 'true' a jQuery selector can be used to display content from the current page. Example: $('#inline').colorbox({inline:true, href:'#myForm'}); 'html' => false, // This allows an HTML string to be used directly instead of pulling content from another source (ajax, inline, or iframe). Example: $.colorbox({html:'<p>Hello</p>'}); 'photo' => false, // If true, this setting forces ColorBox to display a link as a photo. Use this when automatic photo detection fails (such as using a url like 'photo.php' instead of 'photo.jpg', 'photo.jpg#1', or 'photo.jpg?pic=1') 'opacity' => 0.85, // The overlay opacity level. Range: 0 to 1. 'open' => false, // If true, the lightbox will automatically open with no input from the visitor. 'returnFocus' => true, // If true, focus will be returned when ColorBox exits to the element it was launched from. 'preloading' => true, // Allows for preloading of 'Next' and 'Previous' content in a shared relation group (same values for the 'rel' attribute), after the current content has finished loading. Set to 'false' to disable. 'overlayClose' => true, // If false, disables closing ColorBox by clicking on the background overlay. 'escKey' => true, // If false, will disable closing colorbox on esc key press. 'arrowKey' => true, // If false, will disable the left and right arrow keys from navigating between the items in a group. 'loop' => true, // If false, will disable the ability to loop back to the beginning of the group when on the last element. 'slideshow' => false, // If true, adds an automatic slideshow to a content group / gallery. 'slideshowSpeed' => 2500, // Sets the speed of the slideshow, in milliseconds. 'slideshowAuto' => true, // If true, the slideshow will automatically start to play. 'slideshowStart' => __('start slideshow','Ecart'), // Text for the slideshow start button. 'slideshowStop' => __('stop slideshow','Ecart'), // Text for the slideshow stop button 'previous' => __('previous','Ecart'), // Text for the previous button in a shared relation group (same values for 'rel' attribute). 'next' => __('next','Ecart'), // Text for the next button in a shared relation group (same values for 'rel' attribute). 'close' => __('close','Ecart'), // Text for the close button. The 'Esc' key will also close ColorBox. // Text format for the content group / gallery count. {current} and {total} are detected and replaced with actual numbers while ColorBox runs. 'current' => sprintf(__('image %s of %s','Ecart'),'{current}','{total}'), 'onOpen' => false, // Callback that fires right before ColorBox begins to open. 'onLoad' => false, // Callback that fires right before attempting to load the target content. 'onComplete' => false, // Callback that fires right after loaded content is displayed. 'onCleanup' => false, // Callback that fires at the start of the close process. 'onClosed' => false // Callback that fires once ColorBox is closed. ); $options = array_diff($options, $defaults); $js = 'var cbo = '.json_encode($options).';'; add_storefrontjs($js,true); break; case "catalog-products": if ($property == "catalog-products") $Ecart->Category = new CatalogProducts($options); case "new-products": if ($property == "new-products") $Ecart->Category = new NewProducts($options); case "featured-products": if ($property == "featured-products") $Ecart->Category = new FeaturedProducts($options); case "onsale-products": if ($property == "onsale-products") $Ecart->Category = new OnSaleProducts($options); case "bestsellers-products": if ($property == "bestsellers-products") $Ecart->Category = new BestsellerProducts($options); case "bestseller-products": if ($property == "bestseller-products") $Ecart->Category = new BestsellerProducts($options); case "bestselling-products": if ($property == "bestselling-products") $Ecart->Category = new BestsellerProducts($options); case "random-products": if ($property == "random-products") $Ecart->Category = new RandomProducts($options); case "tag-products": if ($property == "tag-products") $Ecart->Category = new TagProducts($options); case "related-products": if ($property == "related-products") $Ecart->Category = new RelatedProducts($options); case "search-products": if ($property == "search-products") $Ecart->Category = new SearchResults($options); case "category": if ($property == "category") { if (isset($options['name'])) $Ecart->Category = new Category($options['name'],'name'); else if (isset($options['slug'])) $Ecart->Category = new Category($options['slug'],'slug'); else if (isset($options['id'])) $Ecart->Category = new Category($options['id']); } if (isset($options['reset'])) return (get_class($Ecart->Requested) == "Category"?($Ecart->Category = $Ecart->Requested):false); if (isset($options['title'])) $Ecart->Category->name = $options['title']; if (isset($options['show'])) $Ecart->Category->loading['limit'] = $options['show']; if (isset($options['pagination'])) $Ecart->Category->loading['pagination'] = $options['pagination']; if (isset($options['order'])) $Ecart->Category->loading['order'] = $options['order']; if (isset($options['load'])) return true; if (isset($options['controls']) && !value_is_true($options['controls'])) $Ecart->Category->controls = false; if (isset($options['view'])) { if ($options['view'] == "grid") $Ecart->Category->view = "grid"; else $Ecart->Category->view = "list"; } ob_start(); if (isset($Ecart->Category->slug) && file_exists(ECART_TEMPLATES."/category-{$Ecart->Category->slug}.php")) include(ECART_TEMPLATES."/category-{$Ecart->Category->slug}.php"); elseif (isset($Ecart->Category->id) && file_exists(ECART_TEMPLATES."/category-{$Ecart->Category->id}.php")) include(ECART_TEMPLATES."/category-{$Ecart->Category->id}.php"); else include(ECART_TEMPLATES."/category.php"); $content = ob_get_contents(); ob_end_clean(); $Ecart->Category = false; // Reset the current category if (isset($options['wrap']) && value_is_true($options['wrap'])) $content = ecartdiv($content); return $content; break; case "product": if (isset($options['name'])) $Ecart->Product = new Product($options['name'],'name'); else if (isset($options['slug'])) $Ecart->Product = new Product($options['slug'],'slug'); else if (isset($options['id'])) $Ecart->Product = new Product($options['id']); if (isset($options['reset'])) return (get_class($Ecart->Requested) == "Product"?($Ecart->Product = $Ecart->Requested):false); if (isset($Ecart->Product->id) && isset($Ecart->Category->slug)) { $Category = clone($Ecart->Category); if (isset($options['load'])) { if ($options['load'] == "next") $Ecart->Product = $Category->adjacent_product(1); elseif ($options['load'] == "previous") $Ecart->Product = $Category->adjacent_product(-1); } else { if (isset($options['next']) && value_is_true($options['next'])) $Ecart->Product = $Category->adjacent_product(1); elseif (isset($options['previous']) && value_is_true($options['previous'])) $Ecart->Product = $Category->adjacent_product(-1); } } if (isset($options['load'])) return true; ob_start(); if (file_exists(ECART_TEMPLATES."/product-{$Ecart->Product->id}.php")) include(ECART_TEMPLATES."/product-{$Ecart->Product->id}.php"); else include(ECART_TEMPLATES."/product.php"); $content = ob_get_contents(); ob_end_clean(); return $content; break; case "sideproduct": $content = false; $source = isset($options['source'])?$options['source']:'product'; if ($source == "product" && isset($options['product'])) { // Save original requested product if ($Ecart->Product) $Requested = $Ecart->Product; $products = explode(",",$options['product']); if (!is_array($products)) $products = array($products); foreach ($products as $product) { $product = trim($product); if (empty($product)) continue; if (preg_match('/^\d+$/',$product)) $Ecart->Product = new Product($product); else $Ecart->Product = new Product($product,'slug'); if (empty($Ecart->Product->id)) continue; if (isset($options['load'])) return true; ob_start(); if (file_exists(ECART_TEMPLATES."/sideproduct-{$Ecart->Product->id}.php")) include(ECART_TEMPLATES."/sideproduct-{$Ecart->Product->id}.php"); else include(ECART_TEMPLATES."/sideproduct.php"); $content .= ob_get_contents(); ob_end_clean(); } // Restore original requested Product if (!empty($Requested)) $Ecart->Product = $Requested; else $Ecart->Product = false; } if ($source == "category" && isset($options['category'])) { // Save original requested category if ($Ecart->Category) $Requested = $Ecart->Category; if ($Ecart->Product) $RequestedProduct = $Ecart->Product; if (empty($options['category'])) return false; $Ecart->Category = Catalog::load_category($options['category']); $Ecart->Category->load_products($options); if (isset($options['load'])) return true; foreach ($Ecart->Category->products as $product) { $Ecart->Product = $product; ob_start(); if (file_exists(ECART_TEMPLATES."/sideproduct-{$Ecart->Product->id}.php")) include(ECART_TEMPLATES."/sideproduct-{$Ecart->Product->id}.php"); else include(ECART_TEMPLATES."/sideproduct.php"); $content .= ob_get_contents(); ob_end_clean(); } // Restore original requested category if (!empty($Requested)) $Ecart->Category = $Requested; else $Ecart->Category = false; if (!empty($RequestedProduct)) $Ecart->Product = $RequestedProduct; else $Ecart->Product = false; } return $content; break; } }
/** * Provides ecart('checkout') template API functionality * * @since 1.0 * * @return mixed **/ function tag ($property,$options=array()) { global $Ecart,$wp; $pages = $Ecart->Settings->get('pages'); $base = $Ecart->Settings->get('base_operations'); $countries = $Ecart->Settings->get('target_markets'); $process = get_query_var('ecart_proc'); $select_attrs = array('title','required','class','disabled','required','size','tabindex','accesskey'); $submit_attrs = array('title','class','value','disabled','tabindex','accesskey'); if (!isset($options['mode'])) $options['mode'] = "input"; switch ($property) { case "url": $link = ecarturl(false,'checkout',$this->security()); // Pass any arguments along $args = $_GET; unset($args['page_id'],$args['acct']); $link = esc_url(add_query_arg($args,$link)); if ($process == "confirm-order") $link = apply_filters('ecart_confirm_url',$link); else $link = apply_filters('ecart_checkout_url',$link); return $link; break; case "function": if (!isset($options['shipcalc'])) $options['shipcalc'] = '<img src="'.ECART_ADMIN_URI.'/icons/updating.gif" alt="'.__('Updating','Ecart').'" width="16" height="16" />'; $regions = Lookup::country_zones(); $base = $Ecart->Settings->get('base_operations'); $js = "var regions = ".json_encode($regions).",". "SHIPCALC_STATUS = '".$options['shipcalc']."',". "d_pm = '".sanitize_title_with_dashes($this->paymethod)."',". "pm_cards = {};"; foreach ($this->payoptions as $handle => $option) { if (empty($option->cards)) continue; $js .= "pm_cards['".$handle."'] = ".json_encode($option->cards).";"; } add_storefrontjs($js,true); if (!empty($options['value'])) $value = $options['value']; else $value = "process"; $output = '<div><input type="hidden" name="checkout" value="'.$value.'" /></div>'; if ($value == "confirmed") $output = apply_filters('ecart_confirm_form',$output); else $output = apply_filters('ecart_checkout_form',$output); return $output; break; case "errors": case "error": $Errors = &EcartErrors(); if (!$Errors->exist(ECART_COMM_ERR)) return false; $errors = $Errors->get(ECART_COMM_ERR); $defaults = array( 'before' => '<li>', 'after' => '</li>' ); $options = array_merge($defaults,$options); extract($options); $result = ""; foreach ((array)$errors as $error) if (!$error->blank()) $result .= $before.$error->message(true).$after; return $result; break; case "cart-summary": ob_start(); include(ECART_TEMPLATES."/summary.php"); $content = ob_get_contents(); ob_end_clean(); // If inside the checkout form, strip the extra <form> tag so we don't break standards // This is ugly, but necessary given the different markup contexts the cart summary is used in $Storefront =& EcartStorefront(); if ($Storefront !== false && $Storefront->checkout) $content = preg_replace('/<\/?form.*?>/','',$content); return $content; break; case "loggedin": return $this->Customer->login; break; case "notloggedin": return (!$this->Customer->login && $Ecart->Settings->get('account_system') != "none"); break; case "email-login": // Deprecating case "loginname-login": // Deprecating case "account-login": if (!isset($options['autocomplete'])) $options['autocomplete'] = "off"; if (!empty($_POST['account-login'])) $options['value'] = $_POST['account-login']; return '<input type="text" name="account-login" id="account-login"'.inputattrs($options).' />'; break; case "password-login": if (!isset($options['autocomplete'])) $options['autocomplete'] = "off"; if (!empty($_POST['password-login'])) $options['value'] = $_POST['password-login']; return '<input type="password" name="password-login" id="password-login" '.inputattrs($options).' />'; break; case "submit-login": // Deprecating case "login-button": $string = '<input type="hidden" name="process-login" id="process-login" value="false" />'; $string .= '<input type="submit" name="submit-login" id="submit-login" '.inputattrs($options).' />'; return $string; break; case "firstname": if ($options['mode'] == "value") return $this->Customer->firstname; if (!empty($this->Customer->firstname)) $options['value'] = $this->Customer->firstname; return '<input type="text" name="firstname" id="firstname" '.inputattrs($options).' />'; break; case "lastname": if ($options['mode'] == "value") return $this->Customer->lastname; if (!empty($this->Customer->lastname)) $options['value'] = $this->Customer->lastname; return '<input type="text" name="lastname" id="lastname" '.inputattrs($options).' />'; break; case "email": if ($options['mode'] == "value") return $this->Customer->email; if (!empty($this->Customer->email)) $options['value'] = $this->Customer->email; return '<input type="text" name="email" id="email" '.inputattrs($options).' />'; break; case "loginname": if (!isset($options['autocomplete'])) $options['autocomplete'] = "off"; if ($options['mode'] == "value") return $this->Customer->loginname; if (!empty($this->Customer->loginname)) $options['value'] = $this->Customer->loginname; return '<input type="text" name="loginname" id="login" '.inputattrs($options).' />'; break; case "password": if (!isset($options['autocomplete'])) $options['autocomplete'] = "off"; if ($options['mode'] == "value") return strlen($this->Customer->password) == 34?str_pad('•',8):$this->Customer->password; if (!empty($this->Customer->password)) $options['value'] = $this->Customer->password; return '<input type="password" name="password" id="password" '.inputattrs($options).' />'; break; case "confirm-password": if (!isset($options['autocomplete'])) $options['autocomplete'] = "off"; if (!empty($this->Customer->_confirm_password)) $options['value'] = $this->Customer->_confirm_password; return '<input type="password" name="confirm-password" id="confirm-password" '.inputattrs($options).' />'; break; case "phone": if ($options['mode'] == "value") return $this->Customer->phone; if (!empty($this->Customer->phone)) $options['value'] = $this->Customer->phone; return '<input type="text" name="phone" id="phone" '.inputattrs($options).' />'; break; case "organization": case "company": if ($options['mode'] == "value") return $this->Customer->company; if (!empty($this->Customer->company)) $options['value'] = $this->Customer->company; return '<input type="text" name="company" id="company" '.inputattrs($options).' />'; break; case "marketing": if ($options['mode'] == "value") return $this->Customer->marketing; if (!empty($this->Customer->marketing)) $options['value'] = $this->Customer->marketing; $attrs = array("accesskey","alt","checked","class","disabled","format", "minlength","maxlength","readonly","size","src","tabindex", "title"); $input = '<input type="hidden" name="marketing" value="no" />'; $input .= '<input type="checkbox" name="marketing" id="marketing" value="yes" '.inputattrs($options,$attrs).' />'; return $input; break; case "customer-info": $defaults = array( 'name' => false, // REQUIRED 'info' => false, 'mode' => false, 'title' => '', 'type' => 'hidden', 'value' => '', 'cols' => '30', 'rows' => '3', 'options' => '' ); $op = array_merge($defaults,$options); extract($op); // Allowed input types $allowed_types = array("text","hidden","password","checkbox","radio","textarea","menu"); // Input types that can override option-specified value with the loaded data value $value_override = array("text","hidden","password","textarea","menu"); /// Allowable attributes for textarea inputs $textarea_attrs = array('accesskey','title','tabindex','class','disabled','required'); if (!$name) { // Iterator for order data if (!isset($this->_customer_info_loop)) { reset($this->Customer->info->named); $this->_customer_info_loop = true; } else next($this->Customer->info->named); if (current($this->Customer->info->named) !== false) return true; else { unset($this->_customer_info_loop); return false; } } if (isset($this->Customer->info->named[$name])) $info = $this->Customer->info->named[$name]; if ($name && $mode == "value") return $info; if (!in_array($type,$allowed_types)) $type = 'hidden'; if (empty($title)) $title = $name; $id = 'customer-info-'.sanitize_title_with_dashes($name); if (in_array($type,$value_override) && !empty($info)) $value = $info; switch (strtolower($type)) { case "textarea": return '<textarea name="info['.$name.']" cols="'.$cols.'" rows="'.$rows.'" id="'.$id.'" '.inputattrs($op,$textarea_attrs).'>'.$value.'</textarea>'; break; case "menu": if (is_string($options)) $options = explode(',',$options); return '<select name="info['.$name.']" id="'.$id.'" '.inputattrs($op,$select_attrs).'>'.menuoptions($options,$value).'</select>'; break; default: return '<input type="'.$type.'" name="info['.$name.']" id="'.$id.'" '.inputattrs($op).' />'; break; } break; // SHIPPING TAGS case "shipping": return (!empty($this->shipped)); break; case "shipping-address": if ($options['mode'] == "value") return $this->Shipping->address; if (!empty($this->Shipping->address)) $options['value'] = $this->Shipping->address; return '<input type="text" name="shipping[address]" id="shipping-address" '.inputattrs($options).' />'; break; case "shipping-xaddress": if ($options['mode'] == "value") return $this->Shipping->xaddress; if (!empty($this->Shipping->xaddress)) $options['value'] = $this->Shipping->xaddress; return '<input type="text" name="shipping[xaddress]" id="shipping-xaddress" '.inputattrs($options).' />'; break; case "shipping-city": if ($options['mode'] == "value") return $this->Shipping->city; if (!empty($this->Shipping->city)) $options['value'] = $this->Shipping->city; return '<input type="text" name="shipping[city]" id="shipping-city" '.inputattrs($options).' />'; break; case "shipping-province": case "shipping-state": if ($options['mode'] == "value") return $this->Shipping->state; if (!isset($options['selected'])) $options['selected'] = false; if (!empty($this->Shipping->state)) { $options['selected'] = $this->Shipping->state; $options['value'] = $this->Shipping->state; } $output = false; $country = $base['country']; if (!empty($this->Shipping->country)) $country = $this->Shipping->country; if (!array_key_exists($country,$countries)) $country = key($countries); $regions = Lookup::country_zones(); $states = $regions[$country]; if (isset($options['options']) && empty($states)) $states = explode(",",$options['options']); if (isset($options['type']) && $options['type'] == "text") return '<input type="text" name="shipping[state]" id="shipping-state" '.inputattrs($options).'/>'; $classname = isset($options['class'])?$options['class']:''; $label = (!empty($options['label']))?$options['label']:''; $options['disabled'] = 'disabled'; $options['class'] = ($classname?"$classname ":"").'disabled hidden'; $output .= '<select name="shipping[state]" id="shipping-state-menu" '.inputattrs($options,$select_attrs).'>'; $output .= '<option value="">'.$label.'</option>'; if (is_array($states) && !empty($states)) $output .= menuoptions($states,$options['selected'],true); $output .= '</select>'; unset($options['disabled']); $options['class'] = $classname; $output .= '<input type="text" name="shipping[state]" id="shipping-state" '.inputattrs($options).'/>'; return $output; break; case "shipping-postcode": if ($options['mode'] == "value") return $this->Shipping->postcode; if (!empty($this->Shipping->postcode)) $options['value'] = $this->Shipping->postcode; return '<input type="text" name="shipping[postcode]" id="shipping-postcode" '.inputattrs($options).' />'; break; case "shipping-country": if ($options['mode'] == "value") return $this->Shipping->country; if (!empty($this->Shipping->country)) $options['selected'] = $this->Shipping->country; else if (empty($options['selected'])) $options['selected'] = $base['country']; $output = '<select name="shipping[country]" id="shipping-country" '.inputattrs($options,$select_attrs).'>'; $output .= menuoptions($countries,$options['selected'],true); $output .= '</select>'; return $output; break; case "same-shipping-address": $label = __("Same shipping address","Ecart"); if (isset($options['label'])) $label = $options['label']; $checked = ' checked="checked"'; if (isset($options['checked']) && !value_is_true($options['checked'])) $checked = ''; $output = '<label for="same-shipping"><input type="checkbox" name="sameshipaddress" value="on" id="same-shipping" '.$checked.' /> '.$label.'</label>'; return $output; break; case "residential-shipping-address": $label = __("Residential shipping address","Ecart"); if (isset($options['label'])) $label = $options['label']; if (isset($options['checked']) && value_is_true($options['checked'])) $checked = ' checked="checked"'; $output = '<label for="residential-shipping"><input type="hidden" name="shipping[residential]" value="no" /><input type="checkbox" name="shipping[residential]" value="yes" id="residential-shipping" '.$checked.' /> '.$label.'</label>'; return $output; break; // BILLING TAGS case "billing-required": // DEPRECATED case "card-required": if ($this->Cart->Totals->total == 0) return false; foreach ($Ecart->Gateways->active as $gateway) if (!empty($gateway->cards)) return true; return false; break; case "billing-address": if ($options['mode'] == "value") return $this->Billing->address; if (!empty($this->Billing->address)) $options['value'] = $this->Billing->address; return '<input type="text" name="billing[address]" id="billing-address" '.inputattrs($options).' />'; break; case "billing-xaddress": if ($options['mode'] == "value") return $this->Billing->xaddress; if (!empty($this->Billing->xaddress)) $options['value'] = $this->Billing->xaddress; return '<input type="text" name="billing[xaddress]" id="billing-xaddress" '.inputattrs($options).' />'; break; case "billing-city": if ($options['mode'] == "value") return $this->Billing->city; if (!empty($this->Billing->city)) $options['value'] = $this->Billing->city; return '<input type="text" name="billing[city]" id="billing-city" '.inputattrs($options).' />'; break; case "billing-province": case "billing-state": if ($options['mode'] == "value") return $this->Billing->state; if (!isset($options['selected'])) $options['selected'] = false; if (!empty($this->Billing->state)) { $options['selected'] = $this->Billing->state; $options['value'] = $this->Billing->state; } $output = false; $country = $base['country']; if (!empty($this->Billing->country)) $country = $this->Billing->country; if (!array_key_exists($country,$countries)) $country = key($countries); $regions = Lookup::country_zones(); $states = $regions[$country]; if (isset($options['options']) && empty($states)) $states = explode(",",$options['options']); if (isset($options['type']) && $options['type'] == "text") return '<input type="text" name="billing[state]" id="billing-state" '.inputattrs($options).'/>'; $classname = isset($options['class'])?$options['class']:''; $label = (!empty($options['label']))?$options['label']:''; $options['disabled'] = 'disabled'; $options['class'] = ($classname?"$classname ":"").'disabled hidden'; $output .= '<select name="billing[state]" id="billing-state-menu" '.inputattrs($options,$select_attrs).'>'; $output .= '<option value="">'.$label.'</option>'; if (is_array($states) && !empty($states)) $output .= menuoptions($states,$options['selected'],true); $output .= '</select>'; unset($options['disabled']); $options['class'] = $classname; $output .= '<input type="text" name="billing[state]" id="billing-state" '.inputattrs($options).'/>'; return $output; break; case "billing-postcode": if ($options['mode'] == "value") return $this->Billing->postcode; if (!empty($this->Billing->postcode)) $options['value'] = $this->Billing->postcode; return '<input type="text" name="billing[postcode]" id="billing-postcode" '.inputattrs($options).' />'; break; case "billing-country": if ($options['mode'] == "value") return $this->Billing->country; if (!empty($this->Billing->country)) $options['selected'] = $this->Billing->country; else if (empty($options['selected'])) $options['selected'] = $base['country']; $output = '<select name="billing[country]" id="billing-country" '.inputattrs($options,$select_attrs).'>'; $output .= menuoptions($countries,$options['selected'],true); $output .= '</select>'; return $output; break; case "billing-card": if ($options['mode'] == "value") return str_repeat('X',strlen($this->Billing->card)-4) .substr($this->Billing->card,-4); $options['class'] = isset($options['class']) ? $options['class'].' paycard':'paycard'; if (!empty($this->Billing->card)) { $options['value'] = $this->Billing->card; $this->Billing->card = ""; } if (!isset($options['autocomplete'])) $options['autocomplete'] = "off"; return '<input type="text" name="billing[card]" id="billing-card" '.inputattrs($options).' />'; break; case "billing-cardexpires-mm": if ($options['mode'] == "value") return date("m",$this->Billing->cardexpires); $options['class'] = isset($options['class']) ? $options['class'].' paycard':'paycard'; if (!isset($options['autocomplete'])) $options['autocomplete'] = "off"; if (!empty($this->Billing->cardexpires)) $options['value'] = date("m",$this->Billing->cardexpires); return '<input type="text" name="billing[cardexpires-mm]" id="billing-cardexpires-mm" '.inputattrs($options).' />'; break; case "billing-cardexpires-yy": if ($options['mode'] == "value") return date("y",$this->Billing->cardexpires); $options['class'] = isset($options['class']) ? $options['class'].' paycard':'paycard'; if (!isset($options['autocomplete'])) $options['autocomplete'] = "off"; if (!empty($this->Billing->cardexpires)) $options['value'] = date("y",$this->Billing->cardexpires); return '<input type="text" name="billing[cardexpires-yy]" id="billing-cardexpires-yy" '.inputattrs($options).' />'; break; case "billing-cardtype": if ($options['mode'] == "value") return $this->Billing->cardtype; $options['class'] = isset($options['class']) ? $options['class'].' paycard':'paycard'; if (!isset($options['selected'])) $options['selected'] = false; if (!empty($this->Billing->cardtype)) $options['selected'] = $this->Billing->cardtype; $cards = array(); foreach ($this->paycards as $paycard) $cards[$paycard->symbol] = $paycard->name; $label = (!empty($options['label']))?$options['label']:''; $output = '<select name="billing[cardtype]" id="billing-cardtype" '.inputattrs($options,$select_attrs).'>'; $output .= '<option value="" selected="selected">'.$label.'</option>'; $output .= menuoptions($cards,$options['selected'],true); $output .= '</select>'; $js = array(); $js[] = "var paycards = {};"; foreach ($this->paycards as $handle => $paycard) { $js[] = "paycards['".$handle."'] = ".json_encode($paycard).";"; } add_storefrontjs(join("",$js), true); return $output; break; case "billing-cardholder": if ($options['mode'] == "value") return $this->Billing->cardholder; $options['class'] = isset($options['class']) ? $options['class'].' paycard':'paycard'; if (!isset($options['autocomplete'])) $options['autocomplete'] = "off"; if (!empty($this->Billing->cardholder)) $options['value'] = $this->Billing->cardholder; return '<input type="text" name="billing[cardholder]" id="billing-cardholder" '.inputattrs($options).' />'; break; case "billing-cvv": if (!isset($options['autocomplete'])) $options['autocomplete'] = "off"; if (!empty($_POST['billing']['cvv'])) $options['value'] = $_POST['billing']['cvv']; $options['class'] = isset($options['class']) ? $options['class'].' paycard':'paycard'; return '<input type="text" name="billing[cvv]" id="billing-cvv" '.inputattrs($options).' />'; break; case "billing-xcsc-required": $Gateways = $Ecart->Gateways->active; foreach ($Gateways as $Gateway) { foreach ((array)$Gateway->settings['cards'] as $card) { $PayCard = Lookup::paycard($card); if (!empty($PayCard->inputs)) return true; } } return false; break; case "billing-xcsc": if (empty($options['input'])) return; $input = $options['input']; $cards = array(); $valid = array(); // Collect valid card inputs for all gateways foreach ($this->payoptions as $payoption) { foreach ($payoption->cards as $card) { $PayCard = Lookup::paycard($card); if (empty($PayCard->inputs)) continue; $cards[] = $PayCard->symbol; foreach ($PayCard->inputs as $field => $size) $valid[$field] = $size; } } if (!array_key_exists($input,$valid)) return; if (!empty($_POST['billing']['xcsc'][$input])) $options['value'] = $_POST['billing']['xcsc'][$input]; $options['class'] = isset($options['class']) ? $options['class'].' paycard xcsc':'paycard xcsc'; if (!isset($options['autocomplete'])) $options['autocomplete'] = "off"; $string = '<input type="text" name="billing[xcsc]['.$input.']" id="billing-xcsc-'.$input.'" '.inputattrs($options).' />'; return $string; break; case "billing-xco": return; break; // DEPRECATED case "billing-localities": $rates = $Ecart->Settings->get("taxrates"); foreach ((array)$rates as $rate) if (isset($rate['locals']) && is_array($rate['locals'])) return true; return false; break; case "billing-locale": if ($options['mode'] == "value") return $this->Billing->locale; if (!isset($options['selected'])) $options['selected'] = false; if (!empty($this->Billing->locale)) { $options['selected'] = $this->Billing->locale; $options['value'] = $this->Billing->locale; } if (empty($options['type'])) $options['type'] = "menu"; $output = false; $rates = $Ecart->Settings->get("taxrates"); foreach ($rates as $rate) if (is_array($rate['locals'])) $locales[$rate['country'].$rate['zone']] = array_keys($rate['locals']); add_storefrontjs('var locales = '.json_encode($locales).';',true); $Taxes = new CartTax(); $rate = $Taxes->rate(false,true); $localities = array_keys($rate['locals']); $label = (!empty($options['label']))?$options['label']:''; $output = '<select name="billing[locale]" id="billing-locale" '.inputattrs($options,$select_attrs).'>'; $output .= menuoptions($localities,$options['selected']); $output .= '</select>'; return $output; break; case "has-data": case "hasdata": return (is_array($this->data) && count($this->data) > 0); break; case "order-data": case "orderdata": $defaults = array( 'name' => false, // REQUIRED 'data' => false, 'mode' => false, 'title' => '', 'type' => 'hidden', 'value' => '', 'cols' => '30', 'rows' => '3', 'options' => '' ); $op = array_merge($defaults,$options); extract($op); // Allowed input types $allowed_types = array("text","hidden","password","checkbox","radio","textarea","menu"); // Input types that can override option-specified value with the loaded data value $value_override = array("text","hidden","password","textarea","menu"); /// Allowable attributes for textarea inputs $textarea_attrs = array('accesskey','title','tabindex','class','disabled','required'); if (!$name) { // Iterator for order data if (!isset($this->_data_loop)) { reset($this->data); $this->_data_loop = true; } else next($this->data); if (current($this->data) !== false) return true; else { unset($this->_data_loop); return false; } } if (isset($this->data[$name])) $data = $this->data[$name]; if ($name && $mode == "value") return $data; if (!in_array($type,$allowed_types)) $type = 'hidden'; if (empty($title)) $title = $name; $id = 'order-data-'.sanitize_title_with_dashes($name); if (in_array($type,$value_override) && !empty($data)) $value = $data; switch (strtolower($type)) { case "textarea": return '<textarea name="data['.$name.']" cols="'.$cols.'" rows="'.$rows.'" id="'.$id.'" '.inputattrs($op,$textarea_attrs).'>'.$value.'</textarea>'; break; case "menu": if (is_string($options)) $options = explode(',',$options); return '<select name="data['.$name.']" id="'.$id.'" '.inputattrs($op,$select_attrs).'>'.menuoptions($options,$value).'</select>'; break; default: return '<input type="'.$type.'" name="data['.$name.']" id="'.$id.'" '.inputattrs($op).' />'; break; } break; case "data": if (!is_array($this->data)) return false; $data = current($this->data); $name = key($this->data); if (isset($options['name'])) return $name; return $data; break; case "submit": if (!isset($options['value'])) $options['value'] = __('Submit Order','Ecart'); $options['class'] = isset($options['class'])?$options['class'].' checkout-button':'checkout-button'; $wrapclass = ''; if (isset($options['wrapclass'])) $wrapclass = ' '.$options['wrapclass']; $buttons = array('<input type="submit" name="process" id="checkout-button" '.inputattrs($options,$submit_attrs).' />'); if (!$this->Cart->orderisfree()) $buttons = apply_filters('ecart_checkout_submit_button',$buttons,$options,$submit_attrs); $_ = array(); foreach ($buttons as $label => $button) $_[] = '<span class="payoption-button payoption-'.sanitize_title_with_dashes($label).($label === 0?$wrapclass:'').'">'.$button.'</span>'; return join("\n",$_); break; case "confirm-button": if (empty($options['errorlabel'])) $options['errorlabel'] = __('Return to Checkout','Ecart'); if (empty($options['value'])) $options['value'] = __('Confirm Order','Ecart'); $button = '<input type="submit" name="confirmed" id="confirm-button" '.inputattrs($options,$submit_attrs).' />'; $return = '<a href="'.ecarturl(false,'checkout',$this->security()).'"'.inputattrs($options,array('class')).'>'. $options['errorlabel'].'</a>'; if (!$this->validated) $markup = $return; else $markup = $button; return apply_filters('ecart_checkout_confirm_button',$markup,$options,$submit_attrs); break; case "local-payment": return true; break; // DEPRECATED case "xco-buttons": return; break; // DEPRECATED case "payoptions": case "payment-options": case "paymentoptions": if ($this->Cart->orderisfree()) return false; $payment_methods = apply_filters('ecart_payment_methods',count($this->payoptions)); if ($payment_methods <= 1) return false; // Skip if only one gateway is active $defaults = array( 'default' => false, 'exclude' => false, 'type' => 'menu', 'mode' => false ); $options = array_merge($defaults,$options); extract($options); unset($options['type']); if ("loop" == $mode) { if (!isset($this->_pay_loop)) { reset($this->payoptions); $this->_pay_loop = true; } else next($this->payoptions); if (current($this->payoptions) !== false) return true; else { unset($this->_pay_loop); return false; } return true; } $excludes = array_map('sanitize_title_with_dashes',explode(",",$exclude)); $payoptions = array_keys($this->payoptions); $payoptions = array_diff($payoptions,$excludes); $paymethod = current($payoptions); if ($default !== false && !isset($this->_paymethod_selected)) { $default = sanitize_title_with_dashes($default); if (in_array($default,$payoptions)) $paymethod = $default; } if ($this->paymethod != $paymethod) { $this->paymethod = $paymethod; $processor = $this->payoptions[$this->paymethod]->processor; if (!empty($processor)) $this->processor($processor); } $output = ''; switch ($type) { case "list": $output .= '<span><ul>'; foreach ($payoptions as $value) { if (in_array($value,$excludes)) continue; $payoption = $this->payoptions[$value]; $options['value'] = $value; $options['checked'] = ($this->paymethod == $value)?'checked':false; if ($options['checked'] === false) unset($options['checked']); $output .= '<li><label><input type="radio" name="paymethod" '.inputattrs($options).' /> '.$payoption->label.'</label></li>'; } $output .= '</ul></span>'; break; case "hidden": if (!isset($options['value']) && $default) $options['value'] = $this->paymethod; $output .= '<input type="hidden" name="paymethod"'.inputattrs($options).' />'; break; default: $output .= '<select name="paymethod" '.inputattrs($options,$select_attrs).'>'; foreach ($payoptions as $value) { if (in_array($value,$excludes)) continue; $payoption = $this->payoptions[$value]; $selected = ($this->paymethod == $value)?' selected="selected"':''; $output .= '<option value="'.$value.'"'.$selected.'>'.$payoption->label.'</option>'; } $output .= '</select>'; break; } return $output; break; case "payoption": case "payment-option": case "paymentoption": $payoption = current($this->payoptions); $defaults = array( 'labelpos' => 'after', 'labeling' => false, 'type' => 'hidden', ); $options = array_merge($defaults,$options); extract($options); if (value_is_true($return)) return $payoption; $types = array('radio','checkbox','hidden'); if (!in_array($type,$types)) $type = 'hidden'; if (empty($options['value'])) $options['value'] = key($this->payoptions); $_ = array(); if (value_is_true($labeling)) $_[] = '<label>'; if ($labelpos == "before") $_[] = $payoption->label; $_[] = '<input type="'.$type.'" name="paymethod"'.inputattrs($options).' />'; if ($labelpos == "after") $_[] = $payoption->label; if (value_is_true($labeling)) $_[] = '</label>'; return join("",$_); break; case "gatewayinputs": case "gateway-inputs": return apply_filters('ecart_checkout_gateway_inputs',false); break; case "completed": if (empty($Ecart->Purchase->id) && $this->purchase !== false) { $Ecart->Purchase = new Purchase($this->purchase); $Ecart->Purchase->load_purchased(); return (!empty($Ecart->Purchase->id)); } return false; break; case "receipt": if (!empty($Ecart->Purchase->id)) return $Ecart->Purchase->receipt(); break; } }
/** * Adds JavaScript to be included in the footer on ecarting pages * * @since 1.1 * * @param string $script JavaScript fragment * @param boolean $global (optional) Include the script in the global namespace * @return void **/ function add_storefrontjs ($script,$global=false) { $Storefront =& EcartStorefront(); if ($Storefront === false) return; if ($global) { if (!isset($Storefront->behaviors['global'])) $Storefront->behaviors['global'] = array(); $Storefront->behaviors['global'][] = trim($script); } else $Storefront->behaviors[] = $script; }