Example #1
0
	/**
	 * 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&hellip;','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("&nbsp;",$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' => '&nbsp;&raquo; ',
					'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;
		}
	}
Example #2
0
	/**
	 * 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('&bull;',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;
		}
	}
Example #3
0
/**
 * 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;
}