Hiho,
like the title says: IE 7 wont display page if in iframe and Your plugin is active. To be exact it will show the Page as long as you wont press the Ok Button on the Cannot Open Page Dialogbox.
Reason: Script inside body element in an iframe throws that error.
Fix:
$scripttxt as class var
in constructor
add_action('wp_footer', array($this, '__footer'));
in class
function __footer()
{
echo $this->scripttxt;
}
and in function __displayDynamicMap
put all strings from '<script type="text/.... onwards till return in a temp var and set new classvar before return
$this->scripttxt = $scripttxt;
changed content.php
<?php
class bingMapsForWordpressContent
{
.
.
.
/**
* Script which gets put in the Footer
* @var string
* @access public
*/
var $scripttxt = "";
.
.
.
/**
* PHP4 constructor
* @access public
* @return void
*/
function bingMapsForWordpressContent()
{
// Get options
$options = get_option('bing_maps_for_wordpress');
// Only run if we have an API key
if(isset($options['api']) AND $options['api'] != '')
{
// Header action - to load up Bing maps JavaScript
add_action('wp_head', array($this, '__header'));
// Set the API key
$this->apiKey = $options['api'];
// Add shortcode handler
add_shortcode('bingMap', array($this, 'shortcode'));
add_action('wp_footer', array($this, '__footer'));
}
}
.
.
.
/**
* Display a dynamic Bing map
* @access private
* @return string
*/
function __displayDynamicMap()
{
if(!$this->lat AND !$this->long) return '<div class="bingMapsForWordpressContainer">'.__('Unknown location').'</div>';
// Display DIV to put the map in
$string = '<div class="bingMapsForWordpressContainer">';
// Display title if we've specified one
if(isset($this->atts['title']) AND $this->atts['title'] != '')
{
$string .= '<span class="bingMapsForWordpressTitle">'.$this->atts['title'].'</span>';
}
$string .= '<div id="bingMapsForWordpress'.$this->mapCount.'" class="bingMapsForWordpress" style="position:relative; width:'.$this->atts['width'].'px; height:'.$this->atts['height'].'px;"></div></div>';
// Work out if we have pushpins
$pushpins = array();
foreach($this->atts as $key => $val)
{
if(preg_match('/^pp[0-9]+/', $key))
{
$pushpins[$key] = $val;
}
}
// Work out if we have pushpin titles
$pushpinst = array();
foreach($this->atts as $key => $val)
{
if(preg_match('/^ppt[0-9]+/', $key))
{
$pushpinst[$key] = $val;
}
}
// Work out if we have pushpin descriptions
$pushpinsd = array();
foreach($this->atts as $key => $val)
{
if(preg_match('/^ppd[0-9]+/', $key))
{
$pushpinsd[$key] = $val;
}
}
// Work out if we have pushpin links
$pushpinsl = array();
foreach($this->atts as $key => $val)
{
if(preg_match('/^ppl[0-9]+/', $key))
{
$pushpinsl[$key] = $val;
}
}
$scripttxt = "";
if(isset($this->atts['navi']) AND $this->atts['navi'] != 'yes'){
$scripttxt .= '<style>#MSVE_navAction_container { display:none; }</style>';
}
// Initialize a Bing Map, set its initial lat/long & zoom
$scripttxt .= '<script type="text/javascript">map = new VEMap(\'bingMapsForWordpress'.$this->mapCount.'\');map.SetCredentials("'.$this->apiKey.'");map.LoadMap(new VELatLong('.$this->lat.', '.$this->long.', 0, VEAltitudeMode.RelativeToGround), '.$this->atts['zoomDynamic'].', VEMapStyle.'.$this->maptypesDynamic[strtolower($this->atts['maptype'])].', false, VEMapMode.Mode2D, true, 1);var layer = new VEShapeLayer();';
if(!isset($this->atts['pp']))
{
// If we haven't specified a "pp" attribute, display one where we've centered the map
if (isset($this->atts['locationtitle']) AND $this->atts['locationtitle'] != '')
{
$pptitle = $this->atts['locationtitle']; //set pin title as locationtitle if set in shortcode
} else {
$pptitle = $this->atts['location']; //if location title isn't set, use location as pin title
}
// If a location link is set build the link
if (isset($this->atts['locationlink']) AND $this->atts['locationlink'] != '')
{
$linkstring = '<a href=';
$linkstring .= $this->atts['locationlink'];
$linkstring .= '>';
$linkstring .= $pptitle;
$linkstring .= '</a>';
$pptitle = $linkstring;
}
$scripttxt .= 'var pin = new VEShape(VEShapeType.Pushpin,map.GetCenter());pin.SetTitle("'.$pptitle.'");';
if(isset($this->atts['description']) AND $this->atts['description'] != '') $scripttxt .= 'pin.SetDescription("'.$this->atts['description'].'");';
$scripttxt .= 'layer.AddShape(pin);';
// Set the pushpin attribute for later use
$this->atts['pp'] = $this->atts['location'];
} else
{
// Check if we haven't turned off the pushpin
if($this->atts['pp'] != 'false')
{
// Resolve pushpin location
$pushpinLocation = $this->__resolveLocation(rawurlencode($this->atts['pp']));
if($pushpinLocation)
{
// Add the pushpin to the layer
$scripttxt .= 'var pin = new VEShape(VEShapeType.Pushpin,new VELatLong('.$pushpinLocation['lat'].', '.$pushpinLocation['long'].'));pin.SetTitle("'.$this->atts['pp'].'");';
if(isset($this->atts['description']) AND $this->atts['description'] != '') $string .= 'pin.SetDescription("'.$this->atts['description'].'");';
$scripttxt .= 'layer.AddShape(pin);';
}
}
}
// Any other pushpins
foreach($pushpins as $key => $val)
{
$pushpinLocation = $this->__resolveLocation(rawurlencode($val));
if($pushpinLocation)
{
// build the IDs for ppt, ppd, and ppl from pp
// I believe this could be improved to be more efficient
$pptid = 'ppt';
$ppdid = 'ppd';
$pplid = 'ppl';
$pptid .= substr($key, -1);
$ppdid .= substr($key, -1);
$pplid .= substr($key, -1);
if (isset($pushpinst[$pptid]) AND $pushpinst[$pptid] != '')
{
$pptmessage = $pushpinst[$pptid]; //set the title to ppt if ppt is set
} else
{
$pptmessage = $val; //if ppt is not set, use location as pin title
}
if (isset($pushpinsd[$ppdid]) AND $pushpinsd[$ppdid] != '')
{
$ppdmessage = $pushpinsd[$ppdid]; //set the pin description if ppd is set and not blank
}
if (isset($pushpinsl[$pplid]) AND $pushpinsl[$pplid] != '')
{
//build the pin link if ppl is set
$pplmessage = '<a href=';
$pplmessage .= $pushpinsl[$pplid];
$pplmessage .= '>';
$pplmessage .= $pptmessage;
$pplmessage .= '</a>';
$pptmessage = $pplmessage;
}
$scripttxt .= 'var pin = new VEShape(VEShapeType.Pushpin,new VELatLong('.$pushpinLocation['lat'].', '.$pushpinLocation['long'].'));pin.SetTitle("'.$pptmessage.'");';
if(isset($ppdmessage) AND $ppdmessage != '') $scripttxt .= 'pin.SetDescription("'.$ppdmessage.'");';
//unset variables to prevent data being used on further pins where data is not set
unset($pptmessage);
unset($ppdmessage);
unset($pplmessage);
}
$scripttxt .= 'layer.AddShape(pin);';
}
// Don't re-work out the bounding box if we have 1 pushpin, or we're in birdseye mode
if(
$this->atts['maptype'] != "birdseye" AND
(($this->atts['pp'] != "false" AND count($pushpins) > 0) OR
($this->atts['pp'] == "false" AND count($pushpins) > 1))
)
{
// Add shape, get bounding rectangle, and set the map view based on it
$scripttxt .= 'map.AddShapeLayer(layer);rect = layer.GetBoundingRectangle();map.SetMapView(rect);'
;
} else
{
// Just add the shape to the map
$scripttxt .= 'map.AddShapeLayer(layer);';
}
if(empty($pushpins))
{
// No pushpins - set the zoom level
$scripttxt .= 'map.SetZoomLevel('.$this->atts['zoomDynamic'].');';
}
$scripttxt .= '</script>';
$this->scripttxt = $scripttxt;
return $string;
}
/**
* Load the Bing map controls JavaScript
* @access private
* @return void
*/
function __header()
{
echo '<script type="text/javascript" src="http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.3"></script>';
}
/**
* Load the Bing map controls JavaScript
* @access private
* @return void
*/
function __footer()
{
echo $this->scripttxt;
}
}