I have made a function that displays on checkout the total savings based on product discounts but I would like it to show the percentage saved above the order total, and if possible show it inside of a box.
Code:
function wc_discount_total() {
global $woocommerce;
$discount_total = 0;
foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values) {
$_product = $values['data'];
if ( $_product->is_on_sale() ) {
$regular_price = $_product->get_regular_price();
$sale_price = $_product->get_sale_price();
$discount = ($regular_price - $sale_price) * $values['quantity'];
$discount_total += $discount;
}
}
if ( $discount_total > 0 ) {
echo '<tr class="cart-discount">
<th>'. __( 'Your Savings', 'woocommerce' ) .'</th>
<td data-title=" '. __( 'You Saved', 'woocommerce' ) .' ">'
. wc_price( $discount_total + $woocommerce->cart->discount_cart ) .'</td>
</tr>';
}
}
add_action( 'woocommerce_cart_totals_after_order_total', 'wc_discount_total', 99);
add_action( 'woocommerce_review_order_after_order_total', 'wc_discount_total', 99);
How my current checkout looks like:
Zoomed:
How I would like it to look:
If there is a discount on that order, then you could add another table row tag and calculate the percentage. So it'd be something like this:
add_action('woocommerce_cart_totals_after_order_total', 'wc_discount_total', 99);
add_action('woocommerce_review_order_after_order_total', 'wc_discount_total', 99);
function wc_discount_total()
{
global $woocommerce;
$discount_total = 0;
foreach ($woocommerce->cart->get_cart() as $cart_item_key => $values) {
$_product = $values['data'];
if ($_product->is_on_sale()) {
$regular_price = $_product->get_regular_price();
$sale_price = $_product->get_sale_price();
$discount = ($regular_price - $sale_price) * $values['quantity'];
$discount_total += $discount;
}
}
if ($discount_total > 0) {
echo '<tr class="cart-discount">
<th>' . __('Your Savings', 'woocommerce') . '</th>
<td data-title=" ' . __('You Saved', 'woocommerce') . ' ">'
. wc_price($discount_total + $woocommerce->cart->discount_cart) . '</td>
</tr>';
$total = WC()->cart->cart_contents_total;
$total_saved = wc_price($discount_total + $woocommerce->cart->discount_cart);
$percentage_saved = round(($total_saved * 100) / $total);
echo '<tr class="cart-percentage-discount">
<th>' . __('Percentage Saved', 'woocommerce') . '</th>
<td data-title=" ' . __('You Saved', 'woocommerce') . ' ">' . esc_html($percentage_saved . "%") . '</td>
</tr>';
}
}
I'm trying to solve issue about displaying price in wordpress woocomerce. The preview site (loop) works fine also the single product page prices shows well. Only the variable price doesn't change with selection field. The main problem why I create filter for prices is displaying price with tax and without. My code look like :
add_filter('woocommerce_get_price_html', 'edit_price_display', 10, 2);
function edit_price_display() {
global $product;
$price = $product->get_price();
$tax_rates = WC_Tax::get_rates( $product->get_tax_class() );
if (!empty($tax_rates)) {
$tax_rate = reset($tax_rates);
}
if($product->is_type( 'simple' ) && is_numeric($price)) {
$price_incl_tax = $price + round($price * ( $tax_rate['rate'] / 100 ), 2);
$price_incl_tax = wc_price($price_incl_tax);
$price = wc_price($price);
$display_price = '<span class="price">';
$display_price .= '<span class="amount">' . $price_incl_tax .' s DPH </span>';
$display_price .= '<br>';
$display_price .= '<span class="amount">' . $price .' bez DPH </span>';
$display_price .= '</span>';
return $display_price;
}
if($product->is_type( 'variable' ) && is_numeric($price) && !is_single()) {
$minmax = array( $product->get_variation_price( 'min', true ), $product->get_variation_price( 'max', true ) );
if($minmax[0] == $minmax[1]){
$price_incl_tax = $minmax[0] + round($minmax[0] * ( $tax_rate['rate'] / 100 ), 2);
$price_incl_tax = wc_price($price_incl_tax);
$price = wc_price($minmax[0]);
$display_price = '<span class="price">';
$display_price .= '<span class="amount">' . $price_incl_tax .' s DPH </span>';
$display_price .= '<br>';
$display_price .= '<span class="amount">' . $price .' bez DPH </span>';
$display_price .= '</span>';
}
if($minmax[0] != $minmax[1]){
$price_incl_tax_min = $minmax[0] + round($minmax[0] * ( $tax_rate['rate'] / 100 ), 2);
$price_incl_tax_min = wc_price($price_incl_tax_min);
$price_incl_tax_max = $minmax[1] + round($minmax[1] * ( $tax_rate['rate'] / 100 ), 2);
$price_incl_tax_max = wc_price($price_incl_tax_max);
$price_excl_tax_min = wc_price($minmax[0]);
$price_excl_tax_max = wc_price($minmax[1]);
$display_price = '<span class="price">';
$display_price .= '<span class="amount">' .$price_incl_tax_min. ' - ' .$price_incl_tax_max. ' s DPH </span>';
$display_price .= '<br>';
$display_price .= '<span class="amount">' . $price_excl_tax_min .' - '.$price_excl_tax_max.' bez DPH </span>';
$display_price .= '</span>';
}
return $display_price;
}
if($product->is_type( 'variable' ) && is_numeric($price) && is_single()) {
return $product->price; // Issue is right her !
}
if( $price == '' || $price == '-' ) {
$display_price = '<span class="amount">Cena na dopyt</span>';
return $display_price;
}
}
I think the problem is in (multidimensional) array filling. Because the variation.php file handling the price show up for variable product. In the variation we can see something like :
<script type="text/template" id="tmpl-variation-template">
<div class="woocommerce-variation-description">{{{ data.variation.variation_description }}}</div>
<div class="woocommerce-variation-price">{{{ data.variation.price_html }}}</div>
<div class="woocommerce-variation-availability">{{{ data.variation.availability_html }}}</div>
</script>
But I have no idea how that mentioned array looks like ?
It is not the best solution to modify riginal loop/price.php file but it is quick. The final code looks like:
global $product;
if ( $price_html = $product->get_price_html() ) {
$price = $product->get_price();
$tax_rates = WC_Tax::get_rates( $product->get_tax_class() );
if (!empty($tax_rates)) {
$tax_rate = reset($tax_rates);
}
if ( '' === $price || 0 == $price ) {
$display_price = $price_html;
}
if($product->is_type( 'simple' ) && is_numeric($price)) {
$price_incl_tax = round($price * (1 + ($tax_rate['rate'] / 100) ), 2);
$price_incl_tax = wc_price($price_incl_tax);
$price = wc_price($price);
$display_price = '<span class="price">';
$display_price .= '<span class="amount">' . $price_incl_tax .' s DPH </span>';
$display_price .= '<br>';
$display_price .= '<span class="amount">' . $price .' bez DPH </span>';
$display_price .= '</span>';
}
if($product->is_type( 'variable' ) && is_numeric($price) && $price > 0) {
$minmax = array( $product->get_variation_price( 'min', true ), $product->get_variation_price( 'max', true ) );
if($minmax[0] == $minmax[1]){
$price_excl_tax = round($minmax[0] / (1 + ($tax_rate['rate'] / 100) ), 2);
$price_excl_tax = wc_price($price_excl_tax);
$price = wc_price($minmax[0]);
$display_price = '<span class="price">';
$display_price .= '<span class="amount">' . $price .' s DPH </span>';
$display_price .= '<br>';
$display_price .= '<span class="amount">' . $price_excl_tax .' bez DPH </span>';
$display_price .= '</span>';
}
if($minmax[0] != $minmax[1]){
$price_excl_tax_min = round($minmax[0] / (1 + ($tax_rate['rate'] / 100) ), 2);
$price_excl_tax_min = wc_price($price_excl_tax_min);
$price_excl_tax_max = round($minmax[1] / (1 + ($tax_rate['rate'] / 100) ), 2);
$price_excl_tax_max = wc_price($price_excl_tax_max);
$price_incl_tax_min = wc_price($minmax[0]);
$price_incl_tax_max = wc_price($minmax[1]);
$display_price = '<span class="price">';
$display_price .= '<span class="amount">' .$price_incl_tax_min. ' - ' .$price_incl_tax_max. ' s DPH </span>';
$display_price .= '<br>';
$display_price .= '<span class="amount">' . $price_excl_tax_min .' - '.$price_excl_tax_max.' bez DPH </span>';
$display_price .= '</span>';
}
}
echo $display_price;
}
And for single product page use shortcode {price_excluding_tax} as price suffix located in woocommerce tax.
I am using the Divi Theme.
The shortcode is working, however it is displaying directly under the header rather than where I place the shortcode within the Divi Builder.
I read more about WP shortcodes and it looked like we should be using return rather than echo, but when I change it to return it does not display at all on the page.
Thanks!
function breadcrumb() {
$delimiter = '»'; // delimiter between crumbs
$home = 'Home'; // text for the 'Home' link
$showCurrent = 1; // 1 - show current post/page title in breadcrumbs, 0 - don't show
$before = '<span class="current">'; // tag before the current crumb
$after = '</span>'; // tag after the current crumb
global $post;
$homeLink = get_bloginfo('url');
echo '<div id="crumbs">' . $home . ' ' . $delimiter . ' ';
if (is_single() && !is_attachment()) {
if (get_post_type() != 'post') {
$post_type = get_post_type_object(get_post_type());
$slug = $post_type->rewrite;
return '' . $post_type->labels->singular_name . '';
if ($showCurrent == 1) {
return ' ' . $delimiter . ' ' . $before . get_the_title() . $after;
}
} else {
$cat = get_the_category();
$cat = $cat[0];
$cats = get_category_parents($cat, true, ' ' . $delimiter . ' ');
if ($showCurrent == 0) {
$cats = preg_replace("#^(.+)\s$delimiter\s$#", "$1", $cats);
}
echo $cats;
if ($showCurrent == 1) {
echo $before . get_the_title() . $after;
}
}
} elseif (!is_single() && !is_page() && get_post_type() != 'post' && !is_404()) {
$post_type = get_post_type_object(get_post_type());
return $before . $post_type->labels->singular_name . $after;
} elseif (is_attachment()) {
$parent = get_post($post->post_parent);
$cat = get_the_category($parent->ID);
$cat = $cat[0];
return get_category_parents($cat, true, ' ' . $delimiter . ' ');
echo '' . $parent->post_title . '';
if ($showCurrent == 1) {
echo ' ' . $delimiter . ' ' . $before . get_the_title() . $after;
}
} elseif (is_page() && !$post->post_parent) {
if ($showCurrent == 1) {
return $before . get_the_title() . $after;
}
} elseif (is_page() && $post->post_parent) {
$parent_id = $post->post_parent;
$breadcrumbs = array();
while ($parent_id) {
$page = get_page($parent_id);
$breadcrumbs[] = '' . get_the_title($page->ID) . '';
$parent_id = $page->post_parent;
}
$breadcrumbs = array_reverse($breadcrumbs);
for ($i = 0; $i < count($breadcrumbs); $i++) {
return $breadcrumbs[$i];
if ($i != count($breadcrumbs)-1) {
return ' ' . $delimiter . ' ';
}
}
if ($showCurrent == 1) {
return ' ' . $delimiter . ' ' . $before . get_the_title() . $after;
}
}
return '</div>';
}
function breadcrumb() {
$delimiter = '»'; // delimiter between crumbs
$home = 'Home'; // text for the 'Home' link
$showCurrent = 1; // 1 - show current post/page title in breadcrumbs, 0 - don't show
$before = '<span class="current">'; // tag before the current crumb
$after = '</span>'; // tag after the current crumb
global $post;
$homeLink = get_bloginfo('url');
$bredcrumb = '<div id="crumbs">' . $home . ' ' . $delimiter . ' ';
if (is_single() && !is_attachment()) {
if (get_post_type() != 'post') {
$post_type = get_post_type_object(get_post_type());
$slug = $post_type->rewrite;
$bredcrumb .='' . $post_type->labels->singular_name . '';
if ($showCurrent == 1) {
$bredcrumb .=' ' . $delimiter . ' ' . $before . get_the_title() . $after;
}
} else {
$cat = get_the_category();
$cat = $cat[0];
$cats = get_category_parents($cat, true, ' ' . $delimiter . ' ');
if ($showCurrent == 0) {
$cats = preg_replace("#^(.+)\s$delimiter\s$#", "$1", $cats);
}
$bredcrumb .= $cats;
if ($showCurrent == 1) {
$bredcrumb .= $before . get_the_title() . $after;
}
}
} elseif (!is_single() && !is_page() && get_post_type() != 'post' && !is_404()) {
$post_type = get_post_type_object(get_post_type());
$bredcrumb .= $before . $post_type->labels->singular_name . $after;
} elseif (is_attachment()) {
$parent = get_post($post->post_parent);
$cat = get_the_category($parent->ID);
$cat = $cat[0];
$bredcrumb .= get_category_parents($cat, true, ' ' . $delimiter . ' ');
$bredcrumb .= '' . $parent->post_title . '';
if ($showCurrent == 1) {
$bredcrumb .= ' ' . $delimiter . ' ' . $before . get_the_title() . $after;
}
} elseif (is_page() && !$post->post_parent) {
if ($showCurrent == 1) {
$bredcrumb .= $before . get_the_title() . $after;
}
} elseif (is_page() && $post->post_parent) {
$parent_id = $post->post_parent;
$breadcrumbs = array();
while ($parent_id) {
$page = get_page($parent_id);
$breadcrumbs[] = '' . get_the_title($page->ID) . '';
$parent_id = $page->post_parent;
}
$breadcrumbs = array_reverse($breadcrumbs);
for ($i = 0; $i < count($breadcrumbs); $i++) {
$bredcrumb .= $breadcrumbs[$i];
if ($i != count($breadcrumbs)-1) {
$bredcrumb .= ' ' . $delimiter . ' ';
}
}
if ($showCurrent == 1) {
$bredcrumb .= ' ' . $delimiter . ' ' . $before . get_the_title() . $after;
}
}
$bredcrumb .= '</div>';
echo $bredcrumb;
return $bredcrumb;
When i put the following into to my functions.php it crashes my entire site.
the purpose of this function is to change
elseif ( $method->id !== 'free_shipping' ) {
$label .= ' (' . __( '**Free**', 'woocommerce' ) . ')';
to this...
elseif ( $method->id !== 'free_shipping' ) {
$label .= ' (' . __( '**To Be Calculated**', 'woocommerce' ) . ')';
When i change the one word in the original woocommerce/includes/wc-cart-functions.php it works perfectly. I don't want it to be overwritten with an update.
/**
* Get a shipping methods full label including price
* #param object $method
* #return string
*/
function wc_cart_totals_shipping_method_label( $method ) {
$label = $method->label;
if ( $method->cost > 0 ) {
if ( WC()->cart->tax_display_cart == 'excl' ) {
$label .= ': ' . wc_price( $method->cost );
if ( $method->get_shipping_tax() > 0 && WC()->cart->prices_include_tax ) {
$label .= ' <small>' . WC()->countries->ex_tax_or_vat() . '</small>';
}
} else {
$label .= ': ' . wc_price( $method->cost + $method->get_shipping_tax() );
if ( $method->get_shipping_tax() > 0 && ! WC()->cart->prices_include_tax ) {
$label .= ' <small>' . WC()->countries->inc_tax_or_vat() . '</small>';
}
}
} elseif ( $method->id !== 'free_shipping' ) {
$label .= ' (' . __( 'To Be Calculated', 'woocommerce' ) . ')';
}
return apply_filters( 'woocommerce_cart_shipping_method_full_label', $label, $method );
}
if you are using latest woo commerce then following filter will be helpful to you.
add_filter( 'woocommerce_cart_shipping_method_full_label', 'remove_local_pickup_free_label', 10, 2 );
function remove_local_pickup_free_label($full_label, $method){
$full_label = str_replace("(Free)","(TBD)",$full_label);
return $full_label;
}
You should rebuild the function through the filter. Using str_replace will not work on translated installs, unless each language is checked in the replacement.
function ua_woocommerce_cart_shipping_method_full_label( $label, $method ) {
$label = $method->label;
if ( $method->cost > 0 ) {
if ( WC()->cart->tax_display_cart == 'excl' ) {
$label .= ': ' . wc_price( $method->cost );
if ( $method->get_shipping_tax() > 0 && WC()->cart->prices_include_tax ) {
$label .= ' <small class="tax_label">' . WC()->countries->ex_tax_or_vat() . '</small>';
}
} else {
$label .= ': ' . wc_price( $method->cost + $method->get_shipping_tax() );
if ( $method->get_shipping_tax() > 0 && ! WC()->cart->prices_include_tax ) {
$label .= ' <small class="tax_label">' . WC()->countries->inc_tax_or_vat() . '</small>';
}
}
}
return $label;
}
add_filter( 'woocommerce_cart_shipping_method_full_label', 'ua_woocommerce_cart_shipping_method_full_label', 10, 2 );
On this site (link to product page: http://www.boatingsupplynow.com/product_info.php?cPath=979_1044&products_id=29943) the images appear stretched.
I have applied 2 different image stretch contribution fixes, neither seem to work. I have attached a screenshot of my images settings on the admin side. Please help!!
<?php
/*
$Id$
osCommerce, Open Source E-Commerce Solutions
http://www.oscommerce.com
Copyright (c) 2010 osCommerce
Released under the GNU General Public License
*/
////
// The HTML href link wrapper function
function tep_href_link($page = '', $parameters = '', $connection = 'NONSSL', $add_session_id = true, $search_engine_safe = true) {
global $request_type, $session_started, $SID;
$page = tep_output_string($page);
if (!tep_not_null($page)) {
die('</td></tr></table></td></tr></table><br /><br /><font color="#ff0000"><strong>Error!</strong></font><br /><br /><strong>Unable to determine the page link!<br /><br />');
}
if ($connection == 'NONSSL') {
$link = HTTP_SERVER . DIR_WS_HTTP_CATALOG;
} elseif ($connection == 'SSL') {
if (ENABLE_SSL == true) {
$link = HTTPS_SERVER . DIR_WS_HTTPS_CATALOG;
} else {
$link = HTTP_SERVER . DIR_WS_HTTP_CATALOG;
}
} else {
die('</td></tr></table></td></tr></table><br /><br /><font color="#ff0000"><strong>Error!</strong></font><br /><br /><strong>Unable to determine connection method on a link!<br /><br />Known methods: NONSSL SSL</strong><br /><br />');
}
if (tep_not_null($parameters)) {
$link .= $page . '?' . tep_output_string($parameters);
$separator = '&';
} else {
$link .= $page;
$separator = '?';
}
while ( (substr($link, -1) == '&') || (substr($link, -1) == '?') ) $link = substr($link, 0, -1);
// Add the session ID when moving from different HTTP and HTTPS servers, or when SID is defined
if ( ($add_session_id == true) && ($session_started == true) && (SESSION_FORCE_COOKIE_USE == 'False') ) {
if (tep_not_null($SID)) {
$_sid = $SID;
} elseif ( ( ($request_type == 'NONSSL') && ($connection == 'SSL') && (ENABLE_SSL == true) ) || ( ($request_type == 'SSL') && ($connection == 'NONSSL') ) ) {
if (HTTP_COOKIE_DOMAIN != HTTPS_COOKIE_DOMAIN) {
$_sid = tep_session_name() . '=' . tep_session_id();
}
}
}
if (isset($_sid)) {
$link .= $separator . tep_output_string($_sid);
}
while (strstr($link, '&&')) $link = str_replace('&&', '&', $link);
if ( (SEARCH_ENGINE_FRIENDLY_URLS == 'true') && ($search_engine_safe == true) ) {
$link = str_replace('?', '/', $link);
$link = str_replace('&', '/', $link);
$link = str_replace('=', '/', $link);
} else {
$link = str_replace('&', '&', $link);
}
return $link;
}
////
// The HTML image wrapper function
// Replaces original OScommerce img tag's with call-to image.php(GD-library imagecopyresampled)
// JPG, BMP images will optimized prior to downloading
// GIF, PNG will not be optimized
// Frank Swayze 09/28/2008
function tep_image($src, $alt = '', $width = '', $height = '', $parameters = '', $stretch='false') {
if ( (empty($src) || ($src == DIR_WS_IMAGES)) && (IMAGE_REQUIRED == 'false') ) {
return false;
}
$img_type = exif_imagetype($src);
// alt is added to the img tag even if it is null to prevent browsers from outputting
// the image filename as default
// calculate any missing dimensions from function call. Necessary if image is to be resized.
if (empty($width) || empty($height)) {
if ($image_size = #getimagesize($src)) {
if (empty($width) && !empty($height)) {
$ratio = $height / $image_size[1];
$width = intval($image_size[0] * $ratio);
} elseif (!empty($width) && empty($height)) {
$ratio = $width / $image_size[0];
$height = intval($image_size[1] * $ratio);
} elseif (empty($width) && empty($height)) {
$width = $image_size[0];
$height = $image_size[1];
}
} elseif (IMAGE_REQUIRED == 'false') {
return false;
}
}
if (($img_type != IMAGETYPE_GIF && $img_type != IMAGETYPE_PNG) && (!(file_exists(DIR_FS_CATALOG . $src)) || filesize(DIR_FS_CATALOG . $src) > 30)) { // if checks for existance of file and skips resizing for files less than 3000bytes( 3 Kb)
$image = '<img src="image.php?src=' . htmlspecialchars($src) . '&width=' . htmlspecialchars($width) . '&height=' . htmlspecialchars($height) . '"';
} else {
$image = '<img src="' . htmlspecialchars($src) . '" width="' . htmlspecialchars($width) . '" height="' . htmlspecialchars($height) . '"';
}
$image .= ' border="0" alt="' . htmlspecialchars($alt) . '"';
if (!empty($alt)) {
$image .= ' title=" ' . htmlspecialchars($alt) . ' "';
}
if (!empty($parameters)) $image .= ' ' . $parameters;
$image .= '>';
return $image;
}
////
// The HTML form submit button wrapper function
// Outputs a button in the selected language
function tep_image_submit($image, $alt = '', $parameters = '') {
global $language;
$image_submit = '<input type="image" src="' . tep_output_string(DIR_WS_LANGUAGES . $language . '/images/buttons/' . $image) . '" alt="' . tep_output_string($alt) . '"';
if (tep_not_null($alt)) $image_submit .= ' title=" ' . tep_output_string($alt) . ' "';
if ( (CONFIG_CALCULATE_IMAGE_SIZE == 'true') )
{
if ($image_size = #getimagesize($src))
{
if (empty($width) && tep_not_null($height))
{
if (($image_size[1] < $height) && ($stretch=='false'))
{
// EC - if width hasn't been passed in, the image height is smaller than the setting, and stretch is false, use original dimensions
$width=$image_size[0];
$height=$image_size[1];
}
else
{
// EC - if width hasn't been passed, and the image height is larger than the setting, height ends up as the setting and width is modified to suit
$ratio = $height / $image_size[1];
$width = $image_size[0] * $ratio;
}
}
elseif (tep_not_null($width) && empty($height))
{
// EC - if height hasn't been passed in, the image width is smaller than the setting, and stretch is false, use original dimensions
if (($image_size[0] < $width) && ($stretch=='false'))
{
$width=$image_size[0];
$height=$image_size[1];
}
else
{
// EC - if height hasn't been passed, and the image width is larger than the setting, width ends up as the setting and height is modified to suit
$ratio = $width / $image_size[0];
$height = $image_size[1] * $ratio;
}
}
elseif (empty($width) && empty($height))
{
// EC - if neither height nor width are passed in, just use the original dimensions
$width = $image_size[0];
$height = $image_size[1];
}
//EC - added the following elseif for calculating based on stretch/no-stretch
elseif (tep_not_null($width) && tep_not_null($height))
{
if ((($image_size[0] > $width) || ($image_size[1] > $height)) && ($stretch=='false'))
{
// EC - if width and height are both passed in, either original height or width are larger than the setting, and stretch is false, resize both dimensions to suit
$new_ratio=$height / $width;
$image_ratio=$image_size[1] / $image_size[0];
if ($new_ratio >= $image_ratio)
{
$height=$image_size[1]*($width/$image_size[0]);
}
else
{
$width=$image_size[0]*($height/$image_size[1]);
}
}
elseif ($stretch=='false')
{
// EC - if we got here, both width and height have been passed in, both original height and width are smaller than setting, and stretch is set to false. So just use original dimensions.
$width=$image_size[0];
$height=$image_size[1];
}
}
}
elseif (IMAGE_REQUIRED == 'false')
{
return false;
}
}
if (tep_not_null($width) && tep_not_null($height)) {
$image .= ' width="' . tep_output_string($width) . '" height="' . tep_output_string($height) . '"';
}
if (tep_not_null($parameters)) $image_submit .= ' ' . $parameters;
$image_submit .= ' />';
return $image_submit;
}
////
// Output a function button in the selected language
function tep_image_button($image, $alt = '', $parameters = '') {
global $language;
return tep_image(DIR_WS_LANGUAGES . $language . '/images/buttons/' . $image, $alt, '', '', $parameters);
}
////
// Output a separator either through whitespace, or with an image
function tep_draw_separator($image = 'pixel_black.gif', $width = '100%', $height = '1') {
return tep_image(DIR_WS_IMAGES . $image, '', $width, $height);
}
////
// Output a form
function tep_draw_form($name, $action, $method = 'post', $parameters = '', $tokenize = false) {
global $sessiontoken;
$form = '<form name="' . tep_output_string($name) . '" action="' . tep_output_string($action) . '" method="' . tep_output_string($method) . '"';
if (tep_not_null($parameters)) $form .= ' ' . $parameters;
$form .= '>';
if ( ($tokenize == true) && isset($sessiontoken) ) {
$form .= '<input type="hidden" name="formid" value="' . tep_output_string($sessiontoken) . '" />';
}
return $form;
}
////
// Output a form input field
function tep_draw_input_field($name, $value = '', $parameters = '', $type = 'text', $reinsert_value = true) {
global $HTTP_GET_VARS, $HTTP_POST_VARS;
$field = '<input type="' . tep_output_string($type) . '" name="' . tep_output_string($name) . '"';
if ( ($reinsert_value == true) && ( (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) || (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) ) ) {
if (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) {
$value = stripslashes($HTTP_GET_VARS[$name]);
} elseif (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) {
$value = stripslashes($HTTP_POST_VARS[$name]);
}
}
if (tep_not_null($value)) {
$field .= ' value="' . tep_output_string($value) . '"';
}
if (tep_not_null($parameters)) $field .= ' ' . $parameters;
$field .= ' />';
return $field;
}
////
// Output a form password field
function tep_draw_password_field($name, $value = '', $parameters = 'maxlength="40"') {
return tep_draw_input_field($name, $value, $parameters, 'password', false);
}
////
// Output a selection field - alias function for tep_draw_checkbox_field() and tep_draw_radio_field()
function tep_draw_selection_field($name, $type, $value = '', $checked = false, $parameters = '') {
global $HTTP_GET_VARS, $HTTP_POST_VARS;
$selection = '<input type="' . tep_output_string($type) . '" name="' . tep_output_string($name) . '"';
if (tep_not_null($value)) $selection .= ' value="' . tep_output_string($value) . '"';
if ( ($checked == true) || (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name]) && (($HTTP_GET_VARS[$name] == 'on') || (stripslashes($HTTP_GET_VARS[$name]) == $value))) || (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name]) && (($HTTP_POST_VARS[$name] == 'on') || (stripslashes($HTTP_POST_VARS[$name]) == $value))) ) {
$selection .= ' checked="checked"';
}
if (tep_not_null($parameters)) $selection .= ' ' . $parameters;
$selection .= ' />';
return $selection;
}
////
// Output a form checkbox field
function tep_draw_checkbox_field($name, $value = '', $checked = false, $parameters = ' style="background:none;border:0px;"') {
return tep_draw_selection_field($name, 'checkbox', $value, $checked, $parameters);
}
////
// Output a form radio field
function tep_draw_radio_field($name, $value = '', $checked = false, $parameters = ' style="background:none;border:0px;"') {
return tep_draw_selection_field($name, 'radio', $value, $checked, $parameters);
}
////
// Output a form textarea field
// The $wrap parameter is no longer used in the core xhtml template
function tep_draw_textarea_field($name, $wrap, $width, $height, $text = '', $parameters = '', $reinsert_value = true) {
global $HTTP_GET_VARS, $HTTP_POST_VARS;
$field = '<textarea name="' . tep_output_string($name) . '" cols="' . tep_output_string($width) . '" rows="' . tep_output_string($height) . '"';
if (tep_not_null($parameters)) $field .= ' ' . $parameters;
$field .= '>';
if ( ($reinsert_value == true) && ( (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) || (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) ) ) {
if (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) {
$field .= tep_output_string_protected(stripslashes($HTTP_GET_VARS[$name]));
} elseif (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) {
$field .= tep_output_string_protected(stripslashes($HTTP_POST_VARS[$name]));
}
} elseif (tep_not_null($text)) {
$field .= tep_output_string_protected($text);
}
$field .= '</textarea>';
return $field;
}
////
// Output a form hidden field
function tep_draw_hidden_field($name, $value = '', $parameters = '') {
global $HTTP_GET_VARS, $HTTP_POST_VARS;
$field = '<input type="hidden" name="' . tep_output_string($name) . '"';
if (tep_not_null($value)) {
$field .= ' value="' . tep_output_string($value) . '"';
} elseif ( (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) || (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) ) {
if ( (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) ) {
$field .= ' value="' . tep_output_string(stripslashes($HTTP_GET_VARS[$name])) . '"';
} elseif ( (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) ) {
$field .= ' value="' . tep_output_string(stripslashes($HTTP_POST_VARS[$name])) . '"';
}
}
if (tep_not_null($parameters)) $field .= ' ' . $parameters;
$field .= ' />';
return $field;
}
////
// Hide form elements
function tep_hide_session_id() {
global $session_started, $SID;
if (($session_started == true) && tep_not_null($SID)) {
return tep_draw_hidden_field(tep_session_name(), tep_session_id());
}
}
////
// Output a form pull down menu
function tep_draw_pull_down_menu($name, $values, $default = '', $parameters = '', $required = false) {
global $HTTP_GET_VARS, $HTTP_POST_VARS;
$field = '<select name="' . tep_output_string($name) . '"';
if (tep_not_null($parameters)) $field .= ' ' . $parameters;
$field .= '>';
if (empty($default) && ( (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) || (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) ) ) {
if (isset($HTTP_GET_VARS[$name]) && is_string($HTTP_GET_VARS[$name])) {
$default = stripslashes($HTTP_GET_VARS[$name]);
} elseif (isset($HTTP_POST_VARS[$name]) && is_string($HTTP_POST_VARS[$name])) {
$default = stripslashes($HTTP_POST_VARS[$name]);
}
}
for ($i=0, $n=sizeof($values); $i<$n; $i++) {
$field .= '<option value="' . tep_output_string($values[$i]['id']) . '"';
if ($default == $values[$i]['id']) {
$field .= ' selected="selected"';
}
$field .= '>' . tep_output_string($values[$i]['text'], array('"' => '"', '\'' => ''', '<' => '<', '>' => '>')) . '</option>';
}
$field .= '</select>';
if ($required == true) $field .= TEXT_FIELD_REQUIRED;
return $field;
}
////
// Creates a pull-down list of countries
function tep_get_country_list($name, $selected = '', $parameters = '') {
$countries_array = array(array('id' => '', 'text' => PULL_DOWN_DEFAULT));
$countries = tep_get_countries();
for ($i=0, $n=sizeof($countries); $i<$n; $i++) {
$countries_array[] = array('id' => $countries[$i]['countries_id'], 'text' => $countries[$i]['countries_name']);
}
return tep_draw_pull_down_menu($name, $countries_array, $selected, $parameters);
}
////
// Output a jQuery UI Button
function tep_draw_button($title = null, $icon = null, $link = null, $priority = null, $params = null) {
static $button_counter = 1;
$types = array('submit', 'button', 'reset');
if ( !isset($params['type']) ) {
$params['type'] = 'submit';
}
if ( !in_array($params['type'], $types) ) {
$params['type'] = 'submit';
}
if ( ($params['type'] == 'submit') && isset($link) ) {
$params['type'] = 'button';
}
if (!isset($priority)) {
$priority = 'secondary';
}
$button ='';
$button .= '<span class="tdbLink">';
if ( ($params['type'] == 'button') && isset($link) ) {
$button .= '<a id="tdb' . $button_counter . '" href="' . $link . '"';
if ( isset($params['newwindow']) ) {
$button .= ' target="_blank"';
}
} else {
$button .= '<button id="tdb' . $button_counter . '" type="' . tep_output_string($params['type']) . '"';
}
if ( isset($params['params']) ) {
$button .= ' ' . $params['params'];
}
$button .= '>'. $title;
if ( ($params['type'] == 'button') && isset($link) ) {
$button .= '</a>';
} else {
$button .= '</button>';
}
$button .= '</span><script type="text/javascript">$("#tdb' . $button_counter . '").button(';
$args = array();
if ( isset($icon) ) {
if ( !isset($params['iconpos']) ) {
$params['iconpos'] = 'left';
}
if ( $params['iconpos'] == 'left' ) {
$args[] = 'icons:{primary:"ui-icon-' . $icon . '"}';
} else {
$args[] = 'icons:{secondary:"ui-icon-' . $icon . '"}';
}
}
if (empty($title)) {
$args[] = 'text:false';
}
if (!empty($args)) {
$button .= '{' . implode(',', $args) . '}';
}
$button .= ').addClass("ui-priority-' . $priority . '").parent().removeClass("tdbLink");</script>';
$button_counter++;
return $button;
}
?>
I've never liked the image-stretch "fix" contributions. I've always preferred using a thumbnail generator, due to the varying image sizes within different pages on the catalog side.
Try this contribution, after restoring your files to a version previous to the two add-ons you've installed. Instead of fitting an image to a specific size, a package like this will create resampled and appropriately sized copies of the original image, based on the dimensions required by the tep_image parameters.
Another benefit of a method like this that's often overlooked is that also helps to save on bandwidth and reduce page load times. If you upload a 2800px X 1400px image for a product, that file is most likely going to be a multiple MB image. Each time that image is requested on the catalog side, the full file must be downloaded to the browser before any sizing is done, based on the width and height attributes of the IMG tag. The advantage of using thumbnails is that each thumbnail is resampled for its size. Thus, if your product listing only requires a 200px X 100px image, a 200px X 100px image is crafted from the 2800px X 1400px image you uploaded. Depending on your settings, your images could be in the low-KB range.