magento网站后台无法打开解决办法

一批magento网站从win系统转移到linux系统后,出现网站后台无法登录,提示错误:

Recoverable Error: Argument 1 passed to Mage_Eav_Model_Entity_Abstract::setConnection() must be an instance of Zend_Db_Adapter_Abstract, boolean given, called in /var/www/html/uggbootsky.com/app/code/core/Mage/Sales/Model/Mysql4/Order.php on line 44 and defined in /var/www/html/uggbootsky.com/app/code/core/Mage/Eav/Model/Entity/Abstract.php on line 151


判断错误原因可能是:由于Win系统和Linux系统下字符格式造成的问题,无法获取到订单配置文件,之前都是在Win系统中,直接修改配置,一些 xml 的配置文件。 怀疑这些文件格式不兼容,到Linux下无法读取,所以,无法打开订单表。

 

解决办法

1、建立一个新的网站程序。

2、将旧站的模板,配置,图片等等拷贝到新目录中。(注意要拷贝 .htaccess 文件)。

3、使用旧库,及相同的加密Key。

4、进入后台,重新设置样式。

5、新网站程序能正常进入后台,操作正常,订单,目录,商品资料无丢失。

6、问题解决!

 

Ps, 另外这种解决方案会造成的magento安装的一些新闻插件、支付插件等插件的丢失,需要重新安装。

Linux 目录结构以及作用详解

1、什么是文件系统

当您使用Linux的时候,如果您通过ls –l / 就会发现,在/下包涵很多的目录,比如etc、usr、var、bin ... ... 等目录,而在这些目录中,我们进去看看,发现也有很多的目录或文件。文件系统在Linux下看上去就象树形结构,所以我们可以把文件系统的结构形象的称为 树形结构。
Linux文件系统的最顶端是/,我们称/为Linux的root,也就是 Linux操作系统的文件系统。Linux的文件系统的入口就是/,所有的目录、文件、设备都在/之下,/就是Linux文件系统的组织者,也是最上级的 领导者。

2、文件系统的类型

Linux有四种基本文件系统类型:普通文件、目录 文件、连接文件和特殊文件,可用file命令来识别。

普通文件:如文本文件、C语言元代码、SHELL脚本、二进制的可执行文件等,可 用cat、less、more、vi、emacs来察看内容,用mv来改名。

目录文件:包括文件名、子目录名及其指针。它是Linux 储存文件名的唯一地方,可用ls列出目录文件。

连接文件:是指向同一索引节点的那些目录条目。用ls来查看是,连接文件的标志用l开头, 而文件面后以"->"指向所连接的文件。

特殊文件:Linux的一些设备如磁盘、终端、打印机等都在文件系统中表示出来,则一类 文件就是特殊文件,常放在/dev目录内。例如,软驱A称为/dev/fd0。Linux无C:的概念,而是用/dev/had来自第一硬盘。

3、 目录结构的详细解说

文件系统的组织结构分析,我们能分析什么呢?也就是当我们列/目录时,所看到的 /usr、/etc ... ... /var 等目录是做什么用的,这些目录是不是有些特定的用途。无论哪个哪个版本的Linux系统,都有这些目录,这些目录应该是标准的。当然各个Linux发行版 本也会存在一些小小的差异,但总体来说,大体还是差不多。

言归正传,下面飘扬将讲到本文最核心的部分:Linux文件系统的目录结构。

/ Linux文件系统的入口,也是处于最高一级的目录;

/bin 系统所需要的那些命令位于此目录,比如 ls、cp、mkdir等命令;功能和/usr/bin类似,这个目录中的文件都是可执行的、普通用户都可以使用的命令。作为基础系统所需要的最基础的命 令就是放在这里。

/boot Linux的内核及引导系统程序所需要的文件目录,比如 vmlinuz initrd.img 文件都位于这个目录中。在一般情况下,GRUB或LILO系统引导管理器也位于这个目录;

/dev 设备文件存储目录,比如声卡、磁盘... ...

/etc 系统配置文件的所在地,一些服务器的配置文件也在这里;比如用户帐号及密码配置文件;

/home 普通用户家目录默认存放目录;

/lib 库文件存放目录

/lost+found 在ext2或ext3文件系统中,当系统意外崩溃或机器意外关机,而产生一些文件碎片放在这里。当系统启动的过程中fsck工具会检查这里,并修复已经损 坏的文件系统。 有时系统发生问题,有很多的文件被移到这个目录中,可能会用手工的方式来修复,或移到文件到原来的位置上。

/mnt 这个目录一般是用于存放挂载储存设备的挂载目录的,比如有cdrom 等目录。可以参看/etc/fstab的定义。有时我们可以把让系统开机自动挂载文件系统,把挂载点放在这里也是可以的。主要看/etc/fstab中怎 么定义了;比如光驱可以挂载到/mnt/cdrom 。

/opt 表示的是可选择的意思,有些软件包也会被安装在这里,也就是自定义软件包,比如在Fedora Core 5.0中,OpenOffice就是安装在这里。有些我们自己编译的软件包,就可以安装在这个目录中;通过源码包安装的软件,可以通过 ./configure --prefix=/opt/目录 。

/proc 操作系统运行时,进程信息及内核信息(比如cpu、硬盘分区、内存信息等)存放在这里。/proc目录伪装的文件系统proc的挂载目录,proc并不是 真正的文件系统,它的定义可以参见 /etc/fstab 。

/root Linux超级权限用户root的家目录;

/sbin 大多是涉及系统管理的命令的存放,是超级权限用户root的可执行命令存放地,普通用户无权限执行这个目录下的命令,这个目录和/usr/sbin; /usr/X11R6/sbin或/usr/local/sbin目录是相似的;我们记住就行了,凡是目录sbin中包含的都是root权限才能执行的。

/tmp 临时文件目录,有时用户运行程序的时候,会产生临时文件。/tmp就用来存放临时文件的。/var/tmp目录和这个目录相似。

/usr 这个是系统存放程序的目录,比如命令、帮助文件等。这个目录下有很多的文件和目录。当我们安装一个Linux发行版官方提供的软件包时,大多安装在这里。 如果有涉及服务器配置文件的,会把配置文件安装在/etc目录中。/usr目录下包括涉及字体目录/usr/share/fonts ,帮助目录 /usr/share/man或/usr/share/doc,普通用户可执行文件目录/usr/bin 或/usr/local/bin 或/usr/X11R6/bin ,超级权限用户root的可执行命令存放目录,比如 /usr/sbin 或/usr/X11R6/sbin 或/usr/local/sbin 等;还有程序的头文件存放目录/usr/include。

/var 这个目录的内容是经常变动的,看名字就知道,我们可以理解为vary的缩写,/var下有/var/log 这是用来存放系统日志的目录。/var/www目录是定义Apache服务器站点存放目录;/var/lib 用来存放一些库文件,比如MySQL的,以及MySQL数据库的的存放地。

ThinkPHP去除url中的index.php

例如你的原路径是 http://localhost/test/index.php/index/add
那么现在的地址是 http://localhost/test/index/add
如何去掉index.php呢?

1.httpd.conf配置文件中加载了mod_rewrite.so模块  //在APACHE里面去配置

#LoadModule rewrite_module modules/mod_rewrite.so把前面的警号去掉

2.AllowOverride None 讲None改为 All      //在APACHE里面去配置 (注意其他地方的AllowOverride也统统设置为ALL)
<Directory "D:/server/apache/cgi-bin">
AllowOverride none  改   AllowOverride ALL
Options None
Order allow,deny
Allow from all
</Directory>

3.确保URL_MODEL设置为2,在项目的配置文件里写
return Array(
   'URL_MODEL' => '2',
);

4 .htaccess文件必须放到跟目录下
这个文件里面加:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
补充:在windows下不能建立以点开头的文件,你可以先随便建立一个文件
然后在DOS在操作 rename xxxx.xxxx   .htaccess

Magento 移站(手工架站)步骤

一些情况下,我们不想用安装方式来架设 Magento 网站,而想手动架站。

步骤如下:

1、建立数据库。要点数据库要建立 UTF8格式连接串为utf8_general_ci。
2、导入数据库。要点:要记得关闭外键检查,或者使用导入SQL文件方式。set FOREIGN_KEY_CHECKS=0;
3、修改数据配置文件,为你的域名。表名:core_config_data
4、修改数据配置文件为你的网站环境。文件名:app/etc/local.xml。
5、如果你是商店配置,记得修改入口文件,即:index.php。

要点:$mageRunCode = isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] : 'XX';

这里填入你的store view 的code 。

6、清空缓存要点:删除 var/cache var/session var/tmp 几个文件夹。
7、目录权限。 几个目录必须要有写权限。 chmod o+w var/ media/ app/etc/ -R 及 chmod g+w var/ media/ app/etc -R
 

深入理解Magento的配置系统

第一章 - Magento强大的配置系统

Magento的配置系统就像是Magento的心脏,支撑着Magento的运行。这套配置系统掌管着几乎所有“module/model/class/template/etc”。它把整个Magento系统抽象出来,用一个配置文件来描述。这里的“配置文件”并不是一个物理上存在的文件,而是Magento根据当前的系统状态动态生成的一段XML。大数的PHP开发者并不习惯于这样抽象,因为它增加的编程的复杂性。但是这样的抽象提供了无与伦比的灵活性,允许你覆盖几乎任何系统的默认行为。

首先,让我们写一个简单的插件来看看这个所谓的“配置文件”长什么样。虽然我已经提供的现成的代码,但是还是建议你自己建立这个插件,把整个流程走一遍有助于你的理解。
设置插件目录结构

我们将要创建一个Magento的模块【译者注: Magento的插件不叫plug-in,叫module,翻译成模块】。Magento的模块phpxml文件组成,目的是扩展或者覆盖系统的行为,比如为订单增加数据模型,更改一个方法,或者增加一个全新的功能。【译者注:Magento自带的那些功能也都是基于模块的,比如用户注册,商品展示,结账流程等等。Magento给我的感觉就是一切皆模块,和Eclipse的插件体系结构有点像】

数Magento的系统模块的结构和我们将要构建的插件的结构是一样的。Magento的系统模块在以下目录
app/code/core/Mage
每一个子目录都是一个单独的模块。这些模块是由Magento官方开发的。我们安装完Magento以后,所使用功能就是来自这些模块。我们自己创建模块应该放在如下目录
app/code/local/Packagename
“Packagename”应该是一个唯一的字符串" title="字符串">字符串,用来标识你的代码。通常人们使用公司名字作为Packagename,比如
app/code/local/Microsoft
由于我在做我自己的Magento项目,我将使用我自己的域名“Alanstormdotcom”。 然后,我们要创建以下目录结构
app/code/local/Alanstormdotcom/Configviewer/Block
app/code/local/Alanstormdotcom/Configviewer/controllers
app/code/local/Alanstormdotcom/Configviewer/etc
app/code/local/Alanstormdotcom/Configviewer/Helper
app/code/local/Alanstormdotcom/Configviewer/Model
app/code/local/Alanstormdotcom/Configviewer/sql
你的插件并不一定需要包含以上所有的目录,但是为了以后开发方便,我们还是在一开始就把目录创建好。接下来我们要创建两个文件,一个是config.xml,放在etc目录下面
app/code/local/Alanstormdotcom/Configviewer/etc/config.xml
文件内容如下
<config> 
<modules>
       <Alanstormdotcom_Configviewer>
         <version>0.1.0</version>
       </Alanstormdotcom_Configviewer>
</modules>
</config>
第二个文件需要在如下位置创建
app/etc/modules/Alanstormdotcom_Configviewer.xml
第二个文件应该遵循如下命名规则“Packagename_Modulename.xml”,文件内容如下
<config>
<modules>
       <Alanstormdotcom_Configviewer>
         <active>true</active>
         <codePool>local</codePool>
       </Alanstormdotcom_Configviewer>
</modules>
</config> 
我们先不管这些文件是干什么的,以后会解释。建立好这两个文件以后,你的模块的骨架就已经完成了。Magento已经知道你的模块存在,但是现在你的模块不会做任何事情。我们来确认一下Magento确实装载了你的模块
清空Magento缓存
后台管理界面,进入 System->Configuration->Advanced
展开“Disable Modules Output”
确认“Alanstormdotcom_Configviewer”显示出来了
如果你看到“Alanstormdotcom_Configviewer”,那么恭喜你,你已经成功创建了你第一个Magento模块
创建模块逻辑

我们之前创建模块不会做任何事情,下面我们来为这个模块加入逻辑
1. 检查“showConfig”查询字符串" title="字符串">字符串是否存在
2. 如果“showConfig”存在,那么检查“showConfigFormat”查询字符串" title="字符串">字符串是否存在
3. 如果“showConfigFormat”存在,那么输出指定格式配置信息,否则输出默认格式配置信息
4. 终止执行流程
首先更改我们的config.xml文件
<config>
<modules>...</modules>
<global>
       <events>
         <controller_front_init_routers>
            <observers>
                   <alanstormdotcom_configviewer_model_observer>
                     <type>singleton</type>                         
                     <class>Alanstormdotcom_Configviewer_Model_Observer</class>
                     <method>checkForConfigRequest</method>
                   </alanstormdotcom_configviewer_model_observer>
            </observers>
         </controller_front_init_routers>
       </events>
</global>
</config>
然后创建如下文件
Alanstormdotcom/Configviewer/Model/Observer.php
输入以下内容
<?php
class Alanstormdotcom_Configviewer_Model_Observer {
       const FLAG_SHOW_CONFIG = 'showConfig';
       const FLAG_SHOW_CONFIG_FORMAT = 'showConfigFormat';    

       private $request;

       publicfunction checkForConfigRequest($observer) {       
         $this->request = $observer->getEvent()->getData('front')->getRequest();
         if($this->request->{self::FLAG_SHOW_CONFIG} === 'true'){
            $this->setHeader();
            $this->outputConfig();
         }
       }

       private function setHeader() {
         $format" title="format">format = isset($this->request->{self::FLAG_SHOW_CONFIG_FORMAT}) ?
         $this->request->{self::FLAG_SHOW_CONFIG_FORMAT} : 'xml';                               
         switch($format" title="format">format){
            case 'text':
                   header("Content-Type: text/plain");
                   break;
            default:
                   header("Content-Type: text/xml");
         }          
       }

       private function outputConfig() {          
         die(Mage::app()->getConfig()->getNode()->asXML());    
       }
}
?>
好了,代码编辑结束。清空你的Magento缓存,例如输入如下URL
//sjolzy.cn/?showConfig=true
【译者注: 根据文中的配置,不难看出任何指向Magento的URL加了“?showConfig=true”以后,都会输出同样的内容,正常的执行流程会被终止。】
配置文件分析

打开上述URL,你应该看到一个巨大的XML文件。这个文件描述了当前Magento系统状态。它列出了所有的模块数据模型,事件,监听器等等。举个例子,如果你搜索如下字符串" title="字符串">字符
Configviewer_Model_Observer
你会发现刚刚你创建的那个被列出来了。Magento会解析每个模块config.xml,并把它们包含在这个全局配置中。
这个配置文件有啥用?

到目前为止,我们所作的事情似乎没什么意义,但是这个配置文件却是理解Magento的关键因素。你创建的每一个模块都会被加到这个配置文件中,任何时候,你需要调用一个系统功能的时候,Magento都会通过这个配置文件来查询相应的模块功能。举个简单的例子,如果你懂MVC的话,你应该和“helper class”之概念的打过交道
$helper_salesrule = new Mage_SalesRule_Helper();
Magento抽象了PHP的声明方式。在Magento系统中,上面的代码等同于
$helper_salesrule = Mage::helper('salesrule');
Magento将通过以下逻辑来处理这行代码
配置文件查找<helpers />标签
在<helpers />里面查找 <salesrule />标签
在<sales />里面查找 <class />标签
实例化从#3找到的(Mage_SalesRule_Helper)
Magento总是通过配置文件获得名,这个逻辑看起来有些复杂,但这样做的优点也很明显,我们可以不需要更改Magento的代码就能更改Magento的核心功能。【译者注: 在这个例子中,我们可以通过修改配置文件用我们自己的SalesRule_Helper替换原来那个】这种高度抽象的编程方式php中并不常见,但是它可以让你清晰的扩展或者替换系统的某一部分。

magento控制器机制

 

 

magento的请求周期(request cycle)

magento对某个URL的请求是如何被翻译成到某个特定模块的执行呢?我们来看一下下面的这个URL:

http://example.com/magento/(index.php)/customer/account/index/

以反斜杠为分隔符,URL分成以下这几部分:

http://example.com   域名

magento                   URL前缀

(index.php)               不一定会有这个部分。当你使用apacherewrite功能时可以省略掉index.php

customer                   模块

account                     前台控制器

index                         action名,通常默认为index

要追踪一个对magento请求的执行过程并非易事,原因在于以下两点:
1、使用了router
2、使用了dispatch机制

首先是由默认的前端控制器接受请求,它会将请求参数和内部的router列表进行匹配,如果匹配成功,那么就会将请求交给另一个新的前端控制器(由请求参数和router匹配所得到的模块中的创建)。通常最后的(MVC型)控制器是一个"Front Action"对象,它里面定义了一系列的有关业务逻辑的method(方法)。这个对象最后会根据请求参数来决定调用哪 一个action method来处理请求,在处理完后将请求标识为"dispatched"。

 


认识magento的module(模块)

module是magento最重要的部分。在magento站点中的任何一个操作,无论是在前台还是后台都是通过模块来实现的。在magento中一个模块是由下列这几项的的一项或项组成:配置文件数据库" title="数据库">数据库相关的sql文件,呈现对象(rendering objects),辅助(helper class),数据模型和动作控制器(action controller)。

magento中的模块是放在什么位置,我们开发的模块应该放在什么地方?magento引入了代码池(code pool)和包(package)两个概念。细心的你可以已经发现app/code下有三个目录,这是magento提供的代码池。其中所有magento自带的模块被放到core当中,而local则用来保存我们自己开发的模块,community则用来存放我们集成到magento中的第三方插件代码,不过这个文件夹有可能在后来的版本中淘汰掉。你可能已经发现magento的模块不是直接放在代码池core目录下,而是放在core代码目录下的Mage目录中。magento将代码池下的目录称作包,目的不仅仅是将相关的模块用包分组,更重要的是通过将某个包下面的所有模块名都使用包名为前缀(如Mage包下的所有模块名前缀是Mage_)规范来达到名字空间的作用,使开发人员免去名重复的困扰。

参看下面的目录结构和相关的代码中定义的名:
- App/    
|- code/      
| |- community/
| |- core/
| | |- Mage/
| | |- Zend/
| |- local/
|- design/ 
|- etc/

下面是magento中的catalog模块目录结构:
- Mage/            包名
|- Catalog/       模块
| |- Block/         呈现对象(rendering objects)
| |- Helper/       辅助(helper class) 
| |- Model/        数据模型。负责数据操作
| |- controllers/ 动作控制器(action controller)
| |- etc/             配置文件
| |- sql/              数据库" title="数据库">数据库相关的sql文件


blocks: blocks是一组用来协调模板文件模型的对象,每个block对应一个模板文件模板文件是指以.phtml扩展名" title="扩展名">扩展名的文件,其实就是一个普通的在html中嵌入php代码文件)。每一次的magento请求实际上是处理一系列的block对象和相应的模板文件。所有的block继承Mage_Core_Block_Template(它继承Mage_Core_Block_Abstract),它的主要方法是toHtml(),它通过调用renderView()来将模板文件翻译成html代码。magento默认不使用任何的模板引擎" title="模板引擎">模板引擎,而是直接使用php。所有renderView()事实上只是简单的调用include包含模板文件而以,如果你想使用其它的模板引擎" title="模板引擎">模板引擎,你可以通过修改Mage_Core_Block_Template的renderView()方法来实现。


controllers: controller是所有业务逻辑的起点。每个controller都继承Mage_Core_Controller_Varien_Action,它实际只是zend的Zend_Controller_Action的简单修改版本,包括下面三个主要的方法


• dispatch($action)
• preDispatch()
postDispatch()

helper: 重要的是__(两个下划线)和htmlEscape方法。__用来翻译字符串" title="字符串">字符串,几乎可以在任何一个对象内调用

配置文件模块配置文件存放在该模块目录下的etc目录下。通常会有三个配置文件,其中config.xml是会直接影响到模块的动作。还有两个system.xml和convert.xml会自动生成供你在使用管理后台form表单

在magento中的一切都可视为模块。甚至magento本身也是在zend框架下开发出的一个模块模块本身可以有配置文件数据库" title="数据库">数据设置,这样开发人员就可以对magento进一步扩展