7

我想在magento网站上使用这个移动检测php文件,我想知道插入php文件并在其他子模板中使用它的最佳方法,因为magento结构对我来说仍然有点棘手。

基本上我有这样的东西 main-template.phtml 和 header.phtml

main-template.phtml 内容是

<?php
    include_once 'Mobile_Detect.php';
    $detect = new Mobile_Detect();
    echo $this->getChildHtml('head');
?>
<?php if ( $detect->isMobile() ) { //condition nr.2 ?>
    <meta name="mobileMain" content="this is for mobile">
<?php } else {?>
    <meta name="NOTmobileMAIN" content="this is not for mobile">
<?php } ?>

header.phtml 内容是

<?php if ( $detect->isMobile() ) { //condition nr.1 ?>
    <meta name="mobile" content="this is for mobile">
<?php } else {?>
    <meta name="NOTmobile" content="this is not for mobile">
<?php } ?>

当我在浏览器中加载 main-template.phtml 时,第二个条件有效,但第一个条件抛出错误“在非对象上调用成员函数 isMobile() ”。

将 Mobile_Detect.php 包含在我的 main-template.phtml 中一次,然后能够在我的所有子文件(如 header.phtml)中运行该条件的最佳方法是什么,这些子文件也将插入到 main-template.phtml 中?

谢谢!

4

4 回答 4

17

如果您命名该文件Detect.php并将其放在一个名为 的新文件夹中magento/lib/Mobile/,那么您将能够自动加载该类而无需使用require_onceinclude

path_to_magento
  \-- app
  |     \-- code
  |     \-- design
  |     \-- etc
  \-- lib
  |     \-- Mobile
  |     |     \-- Detect.php    
  |     \-- Varien
  |     \-- Zend
  \-- skin

MyModule 的控制器

<?php
    class My_Module_SomeController extends Mage_Core_Controller_Front_Action
    {
        public function indexAction()
        {
            // Will be automatically loaded from lib/Mobile/Detect.php
            $detect = new Mobile_Detect();

            if ( $detect->isMobile() ) {
                // Do something mobile-friendly
            } else {
                // Do something not
            }
        }
    }

index.php - 使用移动检测来加载适合移动设备的商店视图

<?php
    # Lots of stuff above...

    require_once $mageFilename;

    #Varien_Profiler::enable();

    if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE'])) {
        Mage::setIsDeveloperMode(true);
    }

    #ini_set('display_errors', 1);

    umask(0);

    // This will automatically look in lib/Mobile/Detect.php
    $detect = new Mobile_Detect();

    // Now you can change this store view, i.e. change your entire theme
    if ( $detect->isMobile() ) {
        // Check if a mobile store exists and prepare to load it
        $code = empty($_SERVER['MAGE_RUN_CODE']) ? 'mobile' : $_SERVER['MAGE_RUN_CODE'].'_mobile';
        if ( Mage::app()->getStore($code) ) {
            $_SERVER['MAGE_RUN_CODE'] = 'mobile';
            $_SERVER['MAGE_RUN_TYPE'] = 'store';
        }
    }

    /* Store or website code */
    $mageRunCode = isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] : '';

    /* Run store or run website */
    $mageRunType = isset($_SERVER['MAGE_RUN_TYPE']) ? $_SERVER['MAGE_RUN_TYPE'] : 'store';

    Mage::run($mageRunCode, $mageRunType);
于 2012-11-18T06:02:13.420 回答
1

为什么不将您的 PHP 类包含为 Block 类?

创建/重命名您的 PHP 类,如:Yourcompany_Yourmodule_Block_Mobiledetection 扩展 Mage_Core_Block_Template 并将其放在模块的 Block 目录中(我希望您有一个模块)

在您的皮肤/模板模块的目录中创建一个专用模板文件,并在其中复制/粘贴您的特定 HTML

在模块的布局文件中链接块类和 phtml 文件。

这是在 magento 中构建模块的标准方法。

于 2012-11-17T17:55:23.187 回答
0

您是否尝试过使用实际的类本身:

<?php
if ( Mobile_Detect::isMobile() ) { //condition nr.1
    echo '<meta name="mobile" content="this is for mobile">';
} else {
    echo '<meta name="NOTmobile" content="this is not for mobile">';
}?>
于 2012-11-17T17:45:48.997 回答
0

您的问题是您将类加载到您的正文中而不是您的标题中,因此您在技术上尝试在该类甚至加载到您的 header.phtml 文件之前使用该类。

简而言之,将您的 include_once 移动到您的标题中

于 2012-11-17T17:46:45.273 回答