magento 2.0 新版 全新发布,完全不同的架构,全新的运行环境

magento 2.0 新版2015年11月17号全新发布,完全不同的架构,全新的运行环境

Web servers
Apache 2.2 or 2.4
In addition, the apache mod_rewrite module must be enabled. mod_rewrite enables the server to perform URL rewriting. For more information, see our Apache documentation.
nginx 1.8 (or latest stable version)
Database
MySQL 5.6 (Oracle or Percona)
PHP
5.6.x
5.5.x
里面的文件架构也完全不同,旧的插件及模板,应该是不能使用了。

magento在支付时地址栏数据重新进入时无数据的解决

magento在用户注册或支付成功前,用户退出支付流程或支付失败,再进入到支付流程的地址部分,之前输入的内容消失,解决办法如下:
1、 在template/checkout/onepage/Process.php
对于bill与shipping位置,相应增加
Mage::getSingleton(‘core/session’)->setShippingId($this->getShipping()->GetId());
Mage::getSingleton(‘core/session’)->setBillId($this->getBilling()->GetId());
2、在template/checkout/onepage/billing.phtml
头部增加以下代码
$tempaddress=$this->getAddress();
try
{
if(!$tempaddress->getId())
{
$tempadid=Mage::getSingleton(‘core/session’)->getBillId();
if($tempadid)
{
$tempaddress = Mage::getModel(‘sales/quote_address’)->load($tempadid);
}
}
}catch (Exception $e) { }

在网站站相应调用地址的变量$this->getAddress()换成$tempaddress即可。
3、在template/checkout/onepage/shipping.phtml
上述类似操作即可

这用用户在进出支付流程时,再进入就不用再次输入这些资料,降低用户的麻烦

关于网站恢复的记录

由于之前网站是托管与他人的空间上,突然一天不能访问,之前只备份的数据库,没备份相应的图片资料,所以网站之前的内容以纯文字方式表述了。

magento目录产品数据1001条的限制解决

magento目录产品数据可以批量导入超入1001条的产品,但如果对产品目录进行保存,就会发现只有1001条的产品了,
解决这个有两种思路,
一种是改服务器配置,但这个改动可能会引发ddos的风险,所以弃之
第二是改magento的核心代码,改动如下:
app/code/core/Mage/Adminhtml/controllers/Catalog/CategoryController.php文件中

parse_str($data['category_products'], $products);
改成
$cat_products_split = explode('&', $data['category_products']);
foreach($cat_products_split as $row) {
    $arr = array();
    parse_str($row, $arr); //This will always work
    list($k, $v) = each($arr);
    if (!empty($k) && !empty($v)) {
        $products[$k] = $v;
    }
}
即可解决后台保存超过1001个产品的问题

if (isset($data['category_products']) &&
                !
$category->getProductsReadonly()) {
                $products 
= array();
                
parse_str($data['category_products']$products);
                
$category->setPostedProducts($products);
            
}

换成

if (isset($data['category_products']) &&
            !
$category->getProductsReadonly()) {
            $products 
= array();
            
$records preg_split('/&/',$data['category_products'],-1,PREG_SPLIT_NO_EMPTY);
            if(
count($records) > 0){
                
foreach($records as $record){
                    $record 
trim($record);
                    if(
preg_match('/([0-9]*)=([0-9]*)/',$record,$matches)){
                        $products[$matches[1]] 
$matches[2];
                    
}
                }
            }
            $category
->setPostedProducts($products);
        
}
可以解决之一个方案在某些情况下,产品变0的问题

 

 

magento因.htaccess配置问题造成网站无法访问的解决

如果在webmin/virtualmin中安装magento,因近期webmin/virtualmin升级,造成全新安装的服务器使用迁移magento代码,会因.htaccess配置问题造成网站无法访问
解决方法:
1、根目录下的.htaccess
将Options +FollowSymLinks  换成 Options +SymLinksifOwnerMatch

2、media目录下的.htaccess
如果有这个文件,将两个option对应换成如下
Options ExecCGI Includes IncludesNOEXEC Indexes MultiViews SymLinksIfOwnerMatch -Indexes

Options +SymLinksifOwnerMatch
即可!

magento中目录url多层变成单层的方法

magento中目录url多层变成单成的方法,app/code/core/Mage/Catalog/Model/Url.php这个php文件,找到

if (null === $parentPath) {

$parentPath = $this->getResource()->getCategoryParentPath($category);

}

elseif ($parentPath == ‘/’) {

$parentPath = ”;

}

把上面的代码修改为:

//if (null === $parentPath) {
//$parentPath = $this->getResource()->getCategoryParentPath($category);
//}
//elseif ($parentPath == ’/') {
$parentPath = ”;
//}

magento的.net c#环境下调用v2 soap接口时发现urn:Magento的associativeMultiArray错误解决

magento的.net c#环境下调用v2 soap接口时发现以下错误:
自定义工具错误: 无法导入 Web 服务/架构。无法从命名空间“urn:Magento”导入绑定“Mage_Api_Model_Server_V2_HandlerBinding”。 无法导入操作“catalogProductCreate”。 缺少数据类型“urn:Magento:associativeMultiArray”。
这是magento的一个bug
解决方法是:
/app/code/core/Mage/Api/etc/wdsl2.xml
中的某个complexType块的下方增加如下内容即可

<complexType name="associativeMultiArray">
                <all>
                    <element name="associativeArray" type="typens:associativeArray" minOccurs="0" />
                </all>
 </complexType>

magento的soap v2接口在.net c#调用时出现响应text/html,应为text/xml的错误解决

magento在.net c#调用v2 soap接口时,在login验证时,出现,“客户端发现响应内容类型为“text/html”,但应为“text/xml”。\r\n请求失败,错误信息为:\r\n–\r\n<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n                <SOAP-ENV:Body>\n                <SOAP-ENV:Fault>\n                <faultcode>0</faultcode>\n ”
的错误。
经过排查,是没有安装php-soap插件引用的
在centos环境下yum -y install php-soap即可完全安装。

magento几种全页缓冲加速Full Page Cache插件试用心得

magento的速度确实比较慢,但有全页缓冲,速度很快的
由于全页缓冲插件很多,最终的效果也不一至,我把我使用及测试过的种插件介绍如下,
其实所有的全页缓冲插件都能启到加速的作用,但最关键的在用户登录、增加增物车及一些需要动态变化时,全页缓冲插件可能会出问题。
1、Lightspeed Full Page Caching   500美元
http://www.magentocommerce.com/magento-connect/lightspeed-full-page-caching.html
这个插件分成两个部分,一个是块和页缓冲,这个有一定的加速作用,但是提高的部分不是很大,插件本身也少,不涉及核心文件,单买需要225美元,性价很差,不建议使用。
另一个部分就是真正的Full Page Caching了,需要将要目录的index.php换成lightspeed.php,是加速了很多,但是兼容性差,而且无法单独控制页的某个部分不缓冲。用了一段时间后,不用了。
http://www.tinybrick.com/magento-modules/performance/magento-speed-booster-module.html
这个插件有序列号保护,但代码开源,很容易破解

2、Mgt Full Page Cache   349欧元
http://www.mgt-commerce.com/speed-up-magento-by-full-page-cache.html
这个加速插的加速性能也不错,但是需要修改核心文件,增加local.xml中的配置,代码有深度加密,好处是支持apc,memcache,xcahe等加速方式,但最至命的是无法提供指定页或块不加速的功能,用了一段时间后,不用了。

3、Zoom Full-Page Cache 免费
http://www.magentocommerce.com/magento-connect/zoom-full-page-cache-1742.html
这个免费插件不错,支持magento自身需要动态缓冲的块不更新,如top.link等,后台有一个可以管理缓冲面页的地方,有缓冲的都会记录下来,基本上接近即能加速又能一些块不更新的功能,但是使用过程中发现,他无法的自定义块指定不缓冲,而且不缓冲的块都是以ajax方式,在正常缓冲代码显示后,动态跳出显示,会造成整个页跳一下,影响视觉,对于不介意这个的可以使用,推荐大家。

4、I-Speed: Performance Booster免费
http://www.magentocommerce.com/magento-connect/zoom-full-page-cache-1742.html
这个免费插件,具体不知什么原因,我没成功起来放弃,感觉好像没什么加速,

5、PageCache powered by Varnish 免费
http://www.magentocommerce.com/magento-connect/pagecache-powered-by-varnish.html
这个插件,加速后的效果不错,他需要与varnish功能配合,在正常访问时,加速是相当的块,但是在网站环境发生变化,如登录、注册、增加购物车后,缓冲就失效了,如果不介意这个,倒也可以用。

6、Turpentine – Varnish Cache 免费
http://www.magentocommerce.com/magento-connect/turpentine-6332.html  
这个也是varnish配合的插件,但是与PageCache powered by Varnish 相比,控制性少了些,缺点也是一样的。

7、Memcached缓冲,这个应是系统级缓冲
Memcached 是高效开源缓存机制被广泛应用到很多站点的缓存服务器。Memcached经常和MySQL服务器安装在同台服务器上,但由于数据库服务器经常需要很大内存,而Memcached对内存的需求也很大,因此这里就会有内存的瓶颈。在一些情况下,Memcached其实是从数据库服务器上分离出来,运行在独立的服务器上的,这样就避免了和数据库服务器竞争内存的情况。这个我也测试过,加速非常的快,致使一点就是但是在网站环境发生变化,如登录、注册、增加购物车后,面页上相关无法跟随变化。

8、Brim's Full Page Cache  149美元
http://www.magentocommerce.com/magento-connect/full-page-cache-7153.html
这个插件,不影响核心文件,涉及的文件自成体系,可以通过在xml定义块中增加不缓冲的语法,即可达到在全页缓冲时局部更新,其它功能测试正常,加速效果也理想,代码无加密,可以正常使用。

9、Full Page Cache Pro   349美元
http://www.magentocommerce.com/magento-connect/full-page-cache-multi-level-5450.html
这个插件涉及文件比较多,特别是js文件,安装后,系统后台崩溃了,无法测试了。

10、Full Cache  299美元
http://www.magentocommerce.com/magento-connect/catalog/product/view/id/14800/s/full-cache-9622/
这个插件,不影响核心文件,涉及的文件自成体系,可以在后台配置中直接对不需要缓冲的块进行定义,也可对url有指定元素的页不缓冲,而且有调试功能,可以在页上标注缓冲的情况,以便与我们进行了解。加速性能也很好。

11、另外还有一些apc加速,xcache加速,apc加速我试过了,没什么感觉,不知是否有其它问题。
12、memcached配合magento,在local.xml中增加相应的配置,那个速度叫做快啊,太快了,可惜网页局部信息无法根据状态更新。
13、另外还有google的pagespeed加速,这个加速只涉及到如图片,css等方面,不是代码架构层次的加速
14、网站本身的加速,最好是开启目录及产品的flat的功能,将eav方式转成平面方式,以加快网站对数据库的访问。

从上述个人体验上看,推荐8的Brim's Full Page Cache和10的Full Cache ,这两个,当然网站插件装多了,可能会冲突,大家在测试时注意。

magento如何根据sku显示产品销售量

magento根据sku显示产品销售量,这个功能最好放在产品页中显示
如果放在产品目录及列表页中显示,估计需要动用较多的数据库资源,没加速缓冲时谨慎使用。
以下是示范代码

 
 $sku = nl2br($_product->getSku());
                $_productCollection = Mage::getResourceModel('reports/product_collection')
             ->addOrderedQty()
             ->addAttributeToFilter('sku', $sku)
             ->setOrder('ordered_qty', 'desc')
             ->getFirstItem();
             $product = $_productCollection;
 
             echo 'Already Bought: '.(int)$product->ordered_qty; 



或者是以下方式,大同小异

function  getQuantityOrderedBySku($sku)
{
    try {
     $_product = Mage::getResourceModel('reports/product_collection')
       ->addOrderedQty()
       ->addAttributeToFilter('sku', $sku)
       ->setOrder('ordered_qty', 'desc')
       ->getFirstItem();
     if (!$_product) {
       throw new Exception('No product matches the given SKU');
     }
     return (int)$_product->getOrderedQty();
     }
     catch (Exception $e) {
     return 0;
     }
}