I made a mistake in the second line.
public function listen_injectRedirects() {
$products_ship_free = false;
if (!GLOBALS['free_shipping']) {
define('TEXT_CHOOSE_SHIPPING_METHOD', TEXT_CHOOSE_SHIPPING_METHOD_NO_PFS);
define('TEXT_ENTER_SHIPPING_INFORMATION', TEXT_ENTER_SHIPPING_INFORMATION_NO_PFS);
return;
}
foreach ($_SESSION['cart']->get_products() as $product) {
if (1 == $product['ship_free']) {
$ship_free_count += $product['quantity'];
}
}
if (($GLOBALS['total_weight'] == 0) && ($GLOBALS['total_count'] == 0)) {
$products_ship_free = true;
$GLOBALS['free_shipping'] = true;
if (!defined('FREE_SHIPPING_TITLE')) {
include 'includes/languages/' . $_SESSION['language'] . '/modules/order_total/ot_shipping.php';
}
}
define('TEXT_CHOOSE_SHIPPING_METHOD', ($products_ship_free ? sprintf(PRODUCTS_SHIP_FREE_COUNT, $ship_free_count); : TEXT_CHOOSE_SHIPPING_METHOD_NO_PFS));
define('TEXT_ENTER_SHIPPING_INFORMATION', ((!$products_ship_free && ($ship_free_count > 0)) ? sprintf(PRODUCTS_SHIP_FREE_COUNT_ONLY, $ship_free_count) : TEXT_ENTER_SHIPPING_INFORMATION_NO_PFS));
}
Note that this assumes that you've modified the shoppingCart->get_products method to return the 'ship_free' column.