Advertisement
Guest User

Untitled

a guest
Mar 30th, 2013
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.28 KB | None | 0 0
  1. <?php
  2. /*
  3. * 2007-2013 PrestaShop
  4. *
  5. * NOTICE OF LICENSE
  6. *
  7. * This source file is subject to the Academic Free License (AFL 3.0)
  8. * that is bundled with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://opensource.org/licenses/afl-3.0.php
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@prestashop.com so we can send you a copy immediately.
  14. *
  15. * DISCLAIMER
  16. *
  17. * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
  18. * versions in the future. If you wish to customize PrestaShop for your
  19. * needs please refer to http://www.prestashop.com for more information.
  20. *
  21. * @author PrestaShop SA <contact@prestashop.com>
  22. * @copyright 2007-2013 PrestaShop SA
  23. * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
  24. * International Registered Trademark & Property of PrestaShop SA
  25. */
  26.  
  27. if (!defined('_PS_VERSION_'))
  28. exit;
  29.  
  30. class Gsitemap extends Module
  31. {
  32. private $_html = '';
  33. private $_postErrors = array();
  34.  
  35. public function __construct()
  36. {
  37. $this->name = 'gsitemap';
  38. $this->tab = 'seo';
  39. $this->version = '1.9';
  40. $this->author = 'PrestaShop';
  41. $this->need_instance = 0;
  42.  
  43. parent::__construct();
  44.  
  45. $this->displayName = $this->l('Google sitemap');
  46. $this->description = $this->l('Generate your Google sitemap file.');
  47.  
  48. if (!defined('GSITEMAP_FILE'))
  49. define('GSITEMAP_FILE', dirname(__FILE__).'/../../sitemap.xml');
  50. }
  51.  
  52. public function uninstall()
  53. {
  54. file_put_contents(GSITEMAP_FILE, '');
  55. return parent::uninstall();
  56. }
  57.  
  58. private function _postValidation()
  59. {
  60. file_put_contents(GSITEMAP_FILE, '');
  61. if (!($fp = fopen(GSITEMAP_FILE, 'w')))
  62. $this->_postErrors[] = sprintf($this->l('Cannot create %ssitemap.xml file..'), realpath(dirname(__FILE__.'/../..')).'/');
  63. else
  64. fclose($fp);
  65. }
  66.  
  67. private function getUrlWith($url, $key, $value)
  68. {
  69. if (empty($value))
  70. return $url;
  71. if (strpos($url, '?') !== false)
  72. return $url.'&'.$key.'='.$value;
  73. return $url.'?'.$key.'='.$value;
  74. }
  75.  
  76. private function _postProcess()
  77. {
  78. Configuration::updateValue('GSITEMAP_ALL_CMS', (int)Tools::getValue('GSITEMAP_ALL_CMS'));
  79. Configuration::updateValue('GSITEMAP_ALL_PRODUCTS', (int)Tools::getValue('GSITEMAP_ALL_PRODUCTS'));
  80.  
  81. if (Shop::isFeatureActive())
  82. $res = $this->generateSitemapIndex();
  83. else
  84. $res = $this->generateSitemap(Configuration::get('PS_SHOP_DEFAULT'), GSITEMAP_FILE);
  85.  
  86. $this->_html .= '<h3 class="'. ($res ? 'conf confirm' : 'alert error') .'" style="margin-bottom: 20px">';
  87. $this->_html .= $res ? $this->l('Sitemap file generated.') : $this->l('Error while creating sitemap file.');
  88. $this->_html .= '</h3>';
  89. }
  90.  
  91. /**
  92. * Generate sitemap index to reference the sitemap of each shop
  93. *
  94. * @return bool
  95. */
  96. public function generateSitemapIndex()
  97. {
  98. $xmlString = <<<XML
  99. <?xml version="1.0" encoding="UTF-8" ?>
  100. <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
  101. xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
  102. </sitemapindex>
  103. XML;
  104. $xml = new SimpleXMLElement($xmlString);
  105.  
  106. $sql = 'SELECT s.id_shop, su.domain, su.domain_ssl, CONCAT(su.physical_uri, su.virtual_uri) as uri
  107. FROM '._DB_PREFIX_.'shop s
  108. INNER JOIN '._DB_PREFIX_.'shop_url su ON s.id_shop = su.id_shop AND su.main = 1
  109. WHERE s.active = 1
  110. AND s.deleted = 0
  111. AND su.active = 1';
  112. if (!$result = Db::getInstance()->executeS($sql))
  113. return false;
  114.  
  115. $res = true;
  116. foreach ($result as $row)
  117. {
  118. $info = pathinfo(GSITEMAP_FILE);
  119. $filename = $info['filename'].'-'.$row['id_shop'].'.'.$info['extension'];
  120.  
  121. $replaceUrl = array('http://'.$row['domain'].$row['uri'], ((Configuration::get('PS_SSL_ENABLED')) ? 'https://' : 'http://').$row['domain_ssl'].$row['uri']);
  122.  
  123. $last = $this->generateSitemap($row['id_shop'], $info['dirname'].'/'.$filename, $replaceUrl);
  124. if ($last)
  125. {
  126. $this->_addSitemapIndexNode($xml, 'http://'.$row['domain'].(($row['uri']) ? $row['uri'] : '/').$filename, date('Y-m-d'));
  127. }
  128. $res &= $last;
  129. }
  130.  
  131. $fp = fopen(GSITEMAP_FILE, 'w');
  132. fwrite($fp, $xml->asXML());
  133. fclose($fp);
  134.  
  135. return $res && file_exists(GSITEMAP_FILE);
  136. }
  137.  
  138. /**
  139. * Generate a sitemap for a shop
  140. *
  141. * @param int $id_shop
  142. * @param string $filename
  143. * @return bool
  144. */
  145. private function generateSitemap($id_shop, $filename = '', $replace_url = array())
  146. {
  147. $langs = Language::getLanguages();
  148. $shop = new Shop($id_shop);
  149. if (!$shop->id)
  150. return false;
  151.  
  152. $xmlString = <<<XML
  153. <?xml version="1.0" encoding="UTF-8" ?>
  154. <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
  155. xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
  156. </urlset>
  157. XML;
  158.  
  159. $xml = new SimpleXMLElement($xmlString);
  160.  
  161. if (Configuration::get('PS_REWRITING_SETTINGS') && count($langs) > 1)
  162. foreach($langs as $lang)
  163. {
  164. $this->_addSitemapNode($xml, Tools::getShopDomain(true, true).__PS_BASE_URI__.$lang['iso_code'].'/', '1.00', 'daily', date('Y-m-d'));
  165. }
  166. else
  167. $this->_addSitemapNode($xml, Tools::getShopDomain(true, true).__PS_BASE_URI__, '1.00', 'daily', date('Y-m-d'));
  168.  
  169. /* Product Generator */
  170. $sql = 'SELECT p.id_product, pl.link_rewrite, DATE_FORMAT(IF(ps.date_upd,ps.date_upd,ps.date_add), \'%Y-%m-%d\') date_upd, pl.id_lang, cl.`link_rewrite` category, ean13, i.id_image, il.legend legend_image, (
  171. SELECT MIN(level_depth)
  172. FROM '._DB_PREFIX_.'product p2
  173. '.Shop::addSqlAssociation('product', 'p2').'
  174. LEFT JOIN '._DB_PREFIX_.'category_product cp2 ON p2.id_product = cp2.id_product
  175. LEFT JOIN '._DB_PREFIX_.'category c2 ON cp2.id_category = c2.id_category
  176. WHERE p2.id_product = p.id_product AND product_shop.`active` = 1 AND c2.`active` = 1) AS level_depth
  177. FROM '._DB_PREFIX_.'product p
  178. LEFT JOIN '._DB_PREFIX_.'product_shop ps ON (ps.id_product = p.id_product AND ps.id_shop = '.(int)$id_shop.')
  179. LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (p.id_product = pl.id_product)
  180. LEFT JOIN '._DB_PREFIX_.'category_lang cl ON (ps.id_category_default = cl.id_category AND pl.id_lang = cl.id_lang AND cl.id_shop = '.(int)$id_shop.')
  181. LEFT JOIN '._DB_PREFIX_.'image i ON p.id_product = i.id_product
  182. LEFT JOIN '._DB_PREFIX_.'image_lang il ON (i.id_image = il.id_image)
  183. LEFT JOIN '._DB_PREFIX_.'lang l ON (pl.id_lang = l.id_lang)
  184. WHERE l.`active` = 1
  185. AND ps.`active` = 1
  186. AND ps.id_shop = '.(int)$id_shop.'
  187. '.(Configuration::get('GSITEMAP_ALL_PRODUCTS') ? '' : 'HAVING level_depth IS NOT NULL').'
  188. ORDER BY pl.id_product, pl.id_lang ASC';
  189.  
  190. $resource = Db::getInstance(_PS_USE_SQL_SLAVE_)->query($sql);
  191.  
  192. // array used to know which product/image was already added (blacklist)
  193. $done = null;
  194. $sitemap = null;
  195.  
  196. // iterates on the products, to gather the image ids
  197. while ($product = Db::getInstance()->nextRow($resource))
  198. {
  199. // if the product has not been added
  200. $id_product = $product['id_product'];
  201. if (!isset($done[$id_product][(int)($product['id_lang'])]['added']))
  202. {
  203. // priority
  204. if (($priority = 0.7 - ($product['level_depth'] / 10)) < 0.1)
  205. $priority = 0.1;
  206.  
  207. // adds the product
  208. $tmpLink = $this->context->link->getProductLink($product, $product['link_rewrite'], $product['category'], $product['ean13'], (int)($product['id_lang']), $id_shop, 0, true);
  209. $sitemap = $this->_addSitemapNode($xml, $tmpLink, $priority, 'weekly', substr($product['date_upd'], 0, 10));
  210.  
  211. // considers the product has added
  212. $done[$id_product][(int)($product['id_lang'])]['added'] = true;
  213. }
  214.  
  215. // if the image has not been added
  216. $id_image = $product['id_image'];
  217. if (!isset($done[$id_product][$id_image]) && $id_image)
  218. {
  219. if (!isset($done[$id_product][$id_image]) && $id_image && $product['id_lang']==4)
  220. // adds the image
  221. $this->_addSitemapNodeImage($sitemap, $product);
  222.  
  223. // considers the image as added
  224. $done[$id_product][$id_image] = true;
  225. }
  226. }
  227.  
  228. /* Categories Generator */
  229. if (Configuration::get('PS_REWRITING_SETTINGS'))
  230. $categories = Db::getInstance()->executeS('
  231. SELECT c.id_category, c.level_depth, link_rewrite, DATE_FORMAT(IF(date_upd,date_upd,date_add), \'%Y-%m-%d\') AS date_upd, cl.id_lang
  232. FROM '._DB_PREFIX_.'category c
  233. LEFT JOIN '._DB_PREFIX_.'category_lang cl ON c.id_category = cl.id_category
  234. LEFT JOIN '._DB_PREFIX_.'lang l ON cl.id_lang = l.id_lang
  235. WHERE l.`active` = 1 AND c.`active` = 1 AND c.id_category != 1
  236. ORDER BY cl.id_category, cl.id_lang ASC');
  237. else
  238. $categories = Db::getInstance()->executeS(
  239. 'SELECT c.id_category, c.level_depth, DATE_FORMAT(IF(date_upd,date_upd,date_add), \'%Y-%m-%d\') AS date_upd
  240. FROM '._DB_PREFIX_.'category c
  241. ORDER BY c.id_category ASC');
  242.  
  243.  
  244. foreach($categories as $category)
  245. {
  246. if (($priority = 0.9 - ($category['level_depth'] / 10)) < 0.1)
  247. $priority = 0.1;
  248.  
  249. $tmpLink = Configuration::get('PS_REWRITING_SETTINGS') ?
  250. $this->context->link->getCategoryLink((int)$category['id_category'], $category['link_rewrite'], (int)$category['id_lang'])
  251. : $this->context->link->getCategoryLink((int)$category['id_category']);
  252. $this->_addSitemapNode($xml, htmlspecialchars($tmpLink), $priority, 'weekly', substr($category['date_upd'], 0, 10));
  253. }
  254.  
  255. /* CMS Generator */
  256. if (Configuration::get('GSITEMAP_ALL_CMS') || !Module::isInstalled('blockcms'))
  257. $sql_cms = '
  258. SELECT DISTINCT '.(Configuration::get('PS_REWRITING_SETTINGS') ? 'cl.id_cms, cl.link_rewrite, cl.id_lang' : 'cl.id_cms').
  259. ' FROM '._DB_PREFIX_.'cms_lang cl
  260. LEFT JOIN '._DB_PREFIX_.'lang l ON (cl.id_lang = l.id_lang)
  261. WHERE l.`active` = 1
  262. ORDER BY cl.id_cms, cl.id_lang ASC';
  263. else if (Module::isInstalled('blockcms'))
  264. $sql_cms = '
  265. SELECT DISTINCT '.(Configuration::get('PS_REWRITING_SETTINGS') ? 'cl.id_cms, cl.link_rewrite, cl.id_lang' : 'cl.id_cms').
  266. ' FROM '._DB_PREFIX_.'cms_block_page b
  267. LEFT JOIN '._DB_PREFIX_.'cms_lang cl ON (b.id_cms = cl.id_cms)
  268. LEFT JOIN '._DB_PREFIX_.'lang l ON (cl.id_lang = l.id_lang)
  269. WHERE l.`active` = 1
  270. ORDER BY cl.id_cms, cl.id_lang ASC';
  271.  
  272. $cmss = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql_cms);
  273. foreach($cmss as $cms)
  274. {
  275. $tmpLink = Configuration::get('PS_REWRITING_SETTINGS') ?
  276. $this->context->link->getCMSLink((int)$cms['id_cms'], $cms['link_rewrite'], false, (int)$cms['id_lang'])
  277. : $this->context->link->getCMSLink((int)$cms['id_cms']);
  278. $this->_addSitemapNode($xml, $tmpLink, '0.8', 'daily');
  279. }
  280.  
  281. /* Add classic pages (contact, best sales, new products...) */
  282. $pages = array(
  283. 'supplier' => false,
  284. 'manufacturer' => false,
  285. 'new-products' => false,
  286. 'prices-drop' => false,
  287. 'stores' => false,
  288. 'authentication' => true,
  289. 'best-sales' => false,
  290. 'contact-form' => true);
  291.  
  292. // Don't show suppliers and manufacturers if they are disallowed
  293. if (!Module::getInstanceByName('blockmanufacturer')->id && !Configuration::get('PS_DISPLAY_SUPPLIERS'))
  294. unset($pages['manufacturer']);
  295.  
  296. if (!Module::getInstanceByName('blocksupplier')->id && !Configuration::get('PS_DISPLAY_SUPPLIERS'))
  297. unset($pages['supplier']);
  298.  
  299. // Generate nodes for pages
  300. if(Configuration::get('PS_REWRITING_SETTINGS'))
  301. foreach ($pages as $page => $ssl)
  302. foreach($langs as $lang)
  303. $this->_addSitemapNode($xml, $this->context->link->getPageLink($page, $ssl, $lang['id_lang']), '0.5', 'monthly');
  304. else
  305. foreach($pages as $page => $ssl)
  306. $this->_addSitemapNode($xml, $this->context->link->getPageLink($page, $ssl), '0.5', 'monthly');
  307.  
  308. $xml_string = $xml->asXML();
  309.  
  310. // Replace URL in XML strings by real shops URL
  311. if ($replace_url)
  312. $xml_string = str_replace(array(Tools::getShopDomain(true).__PS_BASE_URI__, Tools::getShopDomainSsl(true).__PS_BASE_URI__), $replace_url, $xml_string);
  313.  
  314. $fp = fopen($filename, 'w');
  315. fwrite($fp, $xml_string);
  316. fclose($fp);
  317.  
  318. return file_exists($filename);
  319. }
  320.  
  321. private function _addSitemapIndexNode($xml, $loc, $last_mod)
  322. {
  323. $sitemap = $xml->addChild('sitemap');
  324. $sitemap->addChild('loc', htmlspecialchars($loc));
  325. $sitemap->addChild('lastmod', $last_mod);
  326. return $sitemap;
  327. }
  328.  
  329. private function _addSitemapNode($xml, $loc, $priority, $change_freq, $last_mod = NULL)
  330. {
  331. $sitemap = $xml->addChild('url');
  332. $sitemap->addChild('loc', htmlspecialchars($loc));
  333. $sitemap->addChild('priority', number_format($priority,1,'.',''));
  334. if ($last_mod)
  335. $sitemap->addChild('lastmod', $last_mod);
  336. $sitemap->addChild('changefreq', $change_freq);
  337. return $sitemap;
  338. }
  339.  
  340. private function _addSitemapNodeImage($xml, $product)
  341. {
  342. $image = $xml->addChild('image', null, 'http://www.google.com/schemas/sitemap-image/1.1');
  343. $image->addChild('loc', htmlspecialchars($this->context->link->getImageLink($product['link_rewrite'], (int)$product['id_product'].'-'.(int)$product['id_image'])), 'http://www.google.com/schemas/sitemap-image/1.1');
  344.  
  345. $legend_image = preg_replace('/(&+)/i', '&amp;', $product['legend_image']);
  346. $image->addChild('caption', $legend_image, 'http://www.google.com/schemas/sitemap-image/1.1');
  347. $image->addChild('title', $legend_image, 'http://www.google.com/schemas/sitemap-image/1.1');
  348. }
  349.  
  350. private function _displaySitemap()
  351. {
  352. if (Shop::isFeatureActive())
  353. {
  354. $sql = 'SELECT s.id_shop, su.domain, su.domain_ssl, CONCAT(su.physical_uri, su.virtual_uri) as uri
  355. FROM '._DB_PREFIX_.'shop s
  356. INNER JOIN '._DB_PREFIX_.'shop_url su ON s.id_shop = su.id_shop AND su.main = 1
  357. WHERE s.active = 1
  358. AND s.deleted = 0
  359. AND su.active = 1';
  360. if (!$result = Db::getInstance()->executeS($sql))
  361. return '';
  362.  
  363. $this->_html .= '<h2>'.$this->l('Sitemap index').'</h2>';
  364. $this->_html .= '<p>'.$this->l('Your Google sitemap file is online at the following address:').'<br />
  365. <a href="'.Tools::getShopDomain(true, true).__PS_BASE_URI__.'sitemap.xml" target="_blank"><b>'.Tools::getShopDomain(true, true).__PS_BASE_URI__.'sitemap.xml</b></a></p><br />';
  366.  
  367. $info = pathinfo(GSITEMAP_FILE);
  368. foreach ($result as $shop)
  369. {
  370. $filename = $info['dirname'].'/'.$info['filename'].'-'.$shop['id_shop'].'.'.$info['extension'];
  371. if (file_exists($filename) && filesize($filename))
  372. {
  373. $fp = fopen($filename, 'r');
  374. $fstat = fstat($fp);
  375. fclose($fp);
  376. $xml = simplexml_load_file($filename);
  377.  
  378. $nbPages = count($xml->url);
  379. $sitemap_uri = 'http://'.$shop['domain'].$shop['uri'].$info['filename'].'-'.$shop['id_shop'].'.'.$info['extension'];
  380.  
  381. $this->_html .= '<h2>'.$this->l('Sitemap for: ').$shop['domain'].$shop['uri'].'</h2>';
  382. $this->_html .= '<p>'.$this->l('Your Google sitemap file is online at the following address:').'<br />
  383. <a href="'.$sitemap_uri.'" target="_blank"><b>'.$sitemap_uri.'</b></a></p><br />';
  384.  
  385. $this->_html .= $this->l('Update:').' <b>'.utf8_encode(strftime('%A %d %B %Y %H:%M:%S',$fstat['mtime'])).'</b><br />';
  386. $this->_html .= $this->l('Filesize:').' <b>'.number_format(($fstat['size']*.000001), 3).'MB</b><br />';
  387. $this->_html .= $this->l('Indexed pages:').' <b>'.$nbPages.'</b><br /><br />';
  388. }
  389. }
  390. }
  391. elseif (file_exists(GSITEMAP_FILE) && filesize(GSITEMAP_FILE))
  392. {
  393. $fp = fopen(GSITEMAP_FILE, 'r');
  394. $fstat = fstat($fp);
  395. fclose($fp);
  396. $xml = simplexml_load_file(GSITEMAP_FILE);
  397.  
  398. $nbPages = count($xml->url);
  399.  
  400. $this->_html .= '<p>'.$this->l('Your Google sitemap file is online at the following address:').'<br />
  401. <a href="'.Tools::getShopDomain(true, true).__PS_BASE_URI__.'sitemap.xml" target="_blank"><b>'.Tools::getShopDomain(true, true).__PS_BASE_URI__.'sitemap.xml</b></a></p><br />';
  402.  
  403. $this->_html .= $this->l('Update:').' <b>'.utf8_encode(strftime('%A %d %B %Y %H:%M:%S',$fstat['mtime'])).'</b><br />';
  404. $this->_html .= $this->l('Filesize:').' <b>'.number_format(($fstat['size']*.000001), 3).'MB</b><br />';
  405. $this->_html .= $this->l('Indexed pages:').' <b>'.$nbPages.'</b><br /><br />';
  406. }
  407. }
  408.  
  409. private function _displayForm()
  410. {
  411. if (Tools::usingSecureMode())
  412. $domain = Tools::getShopDomainSsl(true);
  413. else
  414. $domain = Tools::getShopDomain(true);
  415.  
  416. $this->_html .= '
  417. <form action="'.Tools::htmlentitiesUTF8($_SERVER['REQUEST_URI']).'" method="post">
  418. <div style="margin:0 0 20px 0;">
  419. <input type="checkbox" name="GSITEMAP_ALL_PRODUCTS" id="GSITEMAP_ALL_PRODUCTS" style="vertical-align: middle;" value="1" '.(Configuration::get('GSITEMAP_ALL_PRODUCTS') ? 'checked="checked"' : '').' /> <label class="t" for="GSITEMAP_ALL_PRODUCTS">'.$this->l('Sitemap also includes products from inactive categories.').'</label>
  420. </div>
  421. <div style="margin:0 0 20px 0;">
  422. <input type="checkbox" name="GSITEMAP_ALL_CMS" id="GSITEMAP_ALL_CMS" style="vertical-align: middle;" value="1" '.(Configuration::get('GSITEMAP_ALL_CMS') ? 'checked="checked"' : '').' /> <label class="t" for="GSITEMAP_ALL_CMS">'.$this->l('Sitemap also includes CMS pages not found in a CMS block.').'</label>
  423. </div>
  424. <input name="btnSubmit" class="button" type="submit"
  425. value="'.((!file_exists(GSITEMAP_FILE)) ? $this->l('Generate a sitemap file.') : $this->l('Update the sitemap file.')).'" />
  426. </form><br />
  427. <h2>'.$this->l('Use cron job to re-build the sitemap:').'</h2>
  428. <p>
  429. <b>'.$domain.__PS_BASE_URI__.'modules/gsitemap/gsitemap-cron.php?&token='.substr(Tools::encrypt('gsitemap/cron'),0,10).'&GSITEMAP_ALL_CMS='.((int)Configuration::get('GSITEMAP_ALL_CMS')).'&GSITEMAP_ALL_PRODUCTS='.((int)Configuration::get('GSITEMAP_ALL_PRODUCTS')).'</b>
  430. </p>';
  431. }
  432.  
  433. public function getContent()
  434. {
  435. if (Tools::isSubmit('btnSubmit'))
  436. {
  437. $this->_postValidation();
  438. if (!count($this->_postErrors))
  439. $this->_postProcess();
  440. else
  441. foreach ($this->_postErrors as $err)
  442. $this->_html .= '<div class="alert error">'.$err.'</div>';
  443. }
  444.  
  445. $this->_html .= '
  446. <fieldset>
  447. <legend>'.$this->l('Search Engine Optimization (SEO).').'</legend>
  448. <br />
  449. '.$this->l('See').' <a href="http://www.google.com/support/webmasters/bin/answer.py?hl=en&answer=156184&from=40318&rd=1" style="font-weight:bold;text-decoration:underline;" target="_blank">
  450. '.$this->l('This page').'</a> '.$this->l('For more information').'
  451. <br />';
  452.  
  453. $this->_displaySitemap();
  454. $this->_displayForm();
  455.  
  456. $this->_html .= '</fieldset>';
  457. return $this->_html;
  458. }
  459.  
  460. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement