magento生产erp系统开始进行数据同步

magento生产erp系统开始进行数据同步,这两天主要就是做这事,将magento的订单,产品,客户数据通过magento soap v2 api webserver接口,同步到ms sql server数据库中,当然是针对网站群的,这只是第一步,倒这些数据到了本地,还要将其根据设置的格式倒入到erp中,形成后期管理的数据基础。
这两天通过.net的项目代码,在原有zen-cart同步代码的基础上,基本上完成新增magento同步代码的核心部分。还要继续调试中。

zen-cart多语言提交Merchant Center或google base的注意事项

以日语为例,zencart的google base插件,会将产品说明,标题进行字符序列化,如果是英文就没事,还会给这些数据加上cdata标签,其实这些不是很必要,于是我自己该写了class\google_base.php的相应函数,如

function google_base_sanita($str, $rt=false) {
           	  $str = str_replace(array("\t" , "\n", "\r"), ' ', $str);
	  $str = strip_tags($str);
 $str = str_replace(array("\t" , "\n", "\r", "&nbsp;", "<li>", "</li>", "<p>", "</p>", "<br />", "<blockquote>", "</blockquote>", "<tr>", "</tr>"), ' ', $str);
$str = preg_replace('/\s\s+/', ' ', $str);
 $str = str_replace("&quot;", "\"", $str);
$str = str_replace(array("&amp;", "&"), "AMPERSAN", $str);
$str = preg_replace('/AMPERSAN[A-Za-z0-9#]{1,10};/', '', $str);
 $str = str_replace("AMPERSAN", "&", $str);

      $in = $out = array();
      $in[] = "&reg;"; $out[] = '(r)';
      $in[] = "&copy;"; $out[] = '(c)';
      $in[] = "&trade;"; $out[] = '(tm)';
      if($rt) {
        $str = str_replace(" ", "&nbsp;", $str);
        $str = str_replace("&nbsp;", "", $str);
      }
      $str = str_replace(array("&lt;", "&gt;"), array("<", ">"), $str);
      $str = trim($str);
      return $str;
    }

    // sanitizes code for XML
    function google_base_xml_sanitizer($str, $cdata = false) {
       $str = $this->google_base_sanita($str);

      $str = trim($str);
      return $str;
    }

这样生成的xml文件,就可以直接看到google base 或Merchant Center能接受的格式,并且我们直接看xml也能看到相应的文字信息
这里提醒一下,google base 或Merchant Center支持的国家多了几个,有日本和中国,还有其它一些。
这里还要提醒一下,google base 或Merchant Center上提交数据,最好是在有做这个网站广告的adwords的帐户上操作,不然google会提示因政策原因,提交失败。我搞了半天才知道这个“秘密”。
即使最终生成xml文件,里面依然会有很多问题,在向google base 或Merchant Center提交后,根据提示,逐个进行解决!
google base 或Merchant Center发布的最长有效期是30天,这个要注意,zencart上默认设置是365天,要改掉,不然会被google base 或Merchant Center提示有问题。

将magento地址选择栏中主要国家提前显示的方法

将magento地址选择栏,如果把网站主要的客户所在国家放在最前面.
看了一下代码,发现由Mage_Directory_Block_Data的getRegionHtmlSelect()提取数据,他调用Mage_Directory_Model_Mysql4_Country_Collection这个类中的toOptionArray()组装整理国家数据,最简单的方法就是修改toOptionArray()这个函数,如

public function toOptionArray($emptyLabel = ' ')
    {
        $options = $this->_toOptionArray('country_id', 'name', array('title'=>'iso2_code'));

        $sort = array();
        foreach ($options as $index=>$data) {
            $name = Mage::app()->getLocale()->getCountryTranslation($data['value']);
            if (!empty($name)) {
                $sort[$name] = $data['value'];
            }
        }

        ksort($sort);
        $options = array();
        $options[] = array(
               'value' => 'US',
               'label' => "United States"
            );
        $options[] = array(
               'value' => 'GB',
               'label' => "United Kingdom"
            );

        $options[] = array(
               'value' => 'JP',
               'label' => "Japan"
            );

        $options[] = array(
               'value' => '',
               'label' => "------------------"
            );

        foreach ($sort as $label=>$value) {
			if($value!="US" and  $value!="GB" and  $value!="JP" )
            $options[] = array(
               'value' => $value,
               'label' => $label
            );
        }

        if (count($options)>0 && $emptyLabel !== false) {
            array_unshift($options, array('value'=>'', 'label'=>$emptyLabel));
        }
        return $options;
    }

即可显示出如下效果:

将这个文件拷到local对应的目录下即可运行了.
 

magento如何设置邮件发送服务

magento系统自带邮件发送服务,这个功能是利用主机或vps的sendmail的功能来实现的,但如果想用外部的邮件服务就没办法了,如smtp的邮件,如gmail等.
这里介绍一个免费的支付smtp,gmail等第三方邮件传送插件,

ASchroder.com SMTP Pro Email – Free and Easy Magento Emailing for SMTP, Gmail or Google Apps email.

Extension Key:magento-community/ASchroder_SMTPPro
以下是设置图:

.net c#如何调用引用magento webservice api接口正确方法

magento webservice  api有两种接口,一种是soap,另外一种是v2_soap,从实际情况看,soap这种方式主要供php等之类使用,调用的webservice soap地址格式如下:

http://www.exampledomain.com/shop/index.php/api/soap/?wsdl
如果.net c# 使用这种格式,在调用login时就会出现如下错误:

客户端发现响应内容类型为“text/html”,但应为“text/xml”。请求失败

经过了解,原来java和.net使用magento webservice api soap的接口,用的是magento的v2_soap,地址调用格式如下:
http://www.exampledomain.com/shop/index.php/api/v2_soap/?wsdl

在soap中,调用相应的magento的api,用是的call方式调用相关的函数,
如:
$proxy->call($sessionId, ‘sales_order.info’, ‘100000003’));

而v2_soap中,java或.net,是直接调用相应的函数,
如:
proxy.salesOrderInfo(sessionId, “100000003”);

还是有区别的,大家不要误入岐途!

修改magento默认加入购物车数量正确方法

magento系统默认的加入购物车输入框的数量是空的,这里我们让magento的add to cart 显示默认数量为1,网上别人介绍的方法是修改的文件位于你所使用的magento模板文件夹所在的位置。一般在template/catalog/product/view/addtocart.phtml.根据跟踪,上述方法也是可以,实际上magento已经内置对这个的支持.
cataloginventory/item_options/min_sale_qty,magento实际是根据这个参数判断的,在后台system\Inventory\Product Stock Options\Minimum Qty Allowed in Shopping Cart中即可配置,如下图所示:

Upsell products with scroller插件改成当前产品目录所有清单

Upsell products with scroller 插件是将magento中的up sell product中按卷动的方式进行左右点击显示,由于个人原因,准备将其改成当前产品目录中所有产品。原先效果如下:

改动后的效果如下:

核心代码,是在app/code/community/My/Iupsell/Block/Catalog/Product/List/Upsell.php增加一个代码,即可替换原有功能,当然你也可以重新写一个块,在保留up sell原有显示的基础上,增加一个左右卷动的功能。

protected function _prepareData()
    {
        $getcategory_product = Mage::getModel('catalog/category')->load(Mage::registry('product')->getCategoryId());
         /* @var $product Mage_Catalog_Model_Product */
        $this->_itemCollection =  $getcategory_product->getProductCollection () ;
//		$_category_name=$getcategory_product.getName();
        Mage::getResourceSingleton('checkout/cart')->addExcludeProductFilter($this->_itemCollection,
            Mage::getSingleton('checkout/session')->getQuoteId()
        );

		$this->_addProductAttributesAndPrices($this->_itemCollection);
	    Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($this->_itemCollection);

        if ($this->getItemLimit('listscoll') > 0) {
            $this->_itemCollection->setPageSize($this->getItemLimit('listscoll'));
        }

        $this->_itemCollection->load();

        foreach ($this->_itemCollection as $product) {
            $product->setDoNotUseCategoryId(true);
        }

        return $this;
    }

Magento EasyTabs插件升级成产品说明内定义标签

Magento EasyTabs是一个将magento产品页内几个要素用标签页tabs的形式进行展示.
主要是产品说明,产品附加说明,评论,推荐商品等,用tabs的形式进行组织,
但是zen-cart的一个与些类似的插件,可以在产品说明内容中定义标签,这样比较容易扩展,而magento EasyTabs却没这功能,与是我升级了这个插件,核心代码就是一段,我把全部代码贴出来.
app/design/frontend/default/default/template/easytabs/tabs.phtml

$_temp_products_description_class=Mage::getBlockSingleton('catalog/product_view_description')->getProduct();
$_description_text=$_temp_products_description_class->getDescription();	

	$FindEnd 	= explode("<!--@EndTabs@-->", $_description_text); 	// Find where the EndTabs override is reached
		$CstmTags 	= explode("<!--%", $FindEnd[0]);			// Parse Custom Tags up to the EndTabs tag
        $ZenTags     = explode("<!--#", $FindEnd[0]);            // Parse Zen Tags up to the EndTabs tag

			$sName[0]='Description';
			$sText[0] = '';
			if (count($CstmTags) >= 1) {
			if ($CstmTags[0] != "") { // check for text before the tabs
				$sName[0]='Description';
				$sText[0] = $CstmTags[0];
			}
			//Create a tab for each custom tag
			for ($g = 1; $g < count($CstmTags); $g++) {
				$sTmp = explode("%-->", $CstmTags[$g]);
				$sName[$g] = $sTmp[0];
				$sText[$g] = $sTmp[1];

            	}
		}

?>

<ul class="tabs">
    <?php

		 foreach ($this->getTabs() as $_index => $_tab): ?>
        <?php if($this->getChildHtml($_tab['alias']) && strlen(strip_tags(trim($this->getChildHtml($_tab['alias']))))>0): ?>
        	<?php
				$tab_title = $_tab['title'];
        		$tab_is_custom = strpos($_tab['alias'], 'custom');
				$tab_is_cms= strpos($_tab['alias'], 'cms');
				if($tab_is_custom === 0){
        			$tab_is_tmp_id =  substr($_tab['alias'], 6);
        			$tab_is_custom_id = (!empty($tab_is_tmp_id)) ? $tab_is_tmp_id : '';
					$tab_title = Mage::getStoreConfig('easy_tabs/custom/customtabname'.$tab_is_custom_id);
        		} elseif($tab_is_cms === 0) {
					$tab_is_tmp_id =  substr($_tab['alias'], 3);
        			$tab_is_custom_id = (!empty($tab_is_tmp_id)) ? $tab_is_tmp_id : '';
					$tab_title = Mage::getStoreConfig('easy_tabs/customcms/tabnamecms'.$tab_is_custom_id);
        		} 

				if('description_tabbed'==$_tab['alias']) {
					for ($a = 0; $a < count($sName); $a++) {   ?>
					<li id="product_tabs_<?php echo $sName[$a].'_tabbed'; ?>" <?php echo (!$_index && $a==0) ? 'class="active first"' : '' ?>><a href="#"><?php echo $this->__($sName[$a]); ?></a></li>
		<?php 		}
				}
				else {  ?>
				<li id="product_tabs_<?php echo $_tab['alias'] ?>" <?php echo !$_index ? 'class="active first"' : '' ?>><a href="#"><?php echo $tab_title; ?></a></li>
	   <?php 	}     	?>

        <?php endif; ?>
    <?php endforeach; ?>
</ul>
<div class="padder">
    <?php foreach ($this->getTabs() as $_index => $_tab): ?>
        <?php if($this->getChildHtml($_tab['alias'])):
			if('description_tabbed'==$_tab['alias']) {
					for ($a = 0; $a < count($sText); $a++) {   ?>
          		  <div id="product_tabs_<?php echo $sName[$a].'_tabbed'; ?>_contents"><?php echo $this->helper('catalog/output')->productAttribute($_temp_products_description_class, $sText[$a], 'description'); ?></div>
			<?php 	 }
				} else {  ?>
				<div id="product_tabs_<?php echo $_tab['alias'] ?>_contents"><?php echo $this->getChildHtml($_tab['alias']); ?></div>
		   <?php 	} 	?>
        <?php endif; ?>
    <?php endforeach; ?>
</div>

将这段代码放到文件对应的部分就可以了,然后在产品说明中定义大致如下的:
The Nokia 2610 is an easy to use device that combines multiple messaging options including email, instant messaging, and more. You can even download MP3 ringtones, graphics, and games straight to the phone, or surf the Internet with Cingular's MEdia Net service.
<!–%begin%–>
It's the perfect complement to Cingular service for those even remotely interested in mobile Web capabilities in an affordable handset.<br><br>

<!–%Design%–>
<b>Design</b><br>
Compact and stylish, the 2610 features a candybar design sporting a bright 128 x 128 pixel display capable of displaying over 65,000 colors. Most of the phone's features and on-screen menus are controlled by a center toggle on the control pad. A standard hands-free headphone jack is provided, as are volume control keys, and there's even a "Go-To" button that can be assigned by the user for quick access to favorite applications. Lastly, the included speakerphone allows you to talk handsfree, and because the phone sports an internal antenna, there's nothing to snag or break off.

其中<!–%begin%–>和<!–%Design%–>是标签头的语法,效果图如下:

当然,还可以像zen-cart那个tabs插件那样,功能更强点,但相想实际运行中,上述的功能就够了,大家可以试试.
以下是下载地址和magento-connect.
http://www.magentocommerce.com/magento-connect/TemplatesMaster/extension/1725/magento-easytabs
magento-community/magento_easy_tabs

修复magento的bug并重写一个helper辅助类

修复magento的bug并重写一个helper辅助类,magento的demo产品中,以nokia 2610产品说明中有In Depth项目,代码如下:

<ul>
<ul class"disc">
<li>Integrated camera with video recorder to capture those special moments<br></li>
<li>Enriched data connections for complete mobile access via Email, MMS, and MEdia Net<br></li>
<li> Personalize with downloadable MP3 and polyphonic Ring tones, Games, and Graphics<br></li>
<li>Use AIM, Yahoo! and MSN Messenger to stay in touch on the go<br></li>
<li>Mobile Internet browser and email</li>
</ul>

但是前台显示却是

从图中看,显示解析错误,他把html字符全部按文字显示出来了,
经过查找,发现在template/catalog/product/view/attributes.phtml中进行显示,调用的是

<td class="data"><?php echo $_helper->productAttribute($_product, $_data['value'], $_data['code']) ?></td>

$helper->productAttribute,使用的是Mage_Catalog_Helper_Output类,从 productAttribute函数中将
$attributeHtml = $this->escapeHtml($attributeHtml); 这行删除即可,但为了不改动magento的核心,以我将这个helper类进行重写,
在这里进行说明的原因是因为大家公布的代码大都是module或block或event的重写,但Helper提重写介绍,基本没有.

一,etc/config.xml


<?xml version="1.0"?>
<config>
    <modules>
        <Custom_Custom>
            <version>0.1.0</version>
        </Custom_Custom>
    </modules>

	<global>
		<helpers>
			<catalog>
				<rewrite>
					<output>Custom_Custom_Helper_Output</output>
				</rewrite>
			</catalog>
		</helpers>

	</global>
</config>

二 helper\Output.php

<?php

class Custom_Custom_Helper_Output extends Mage_Catalog_Helper_Output
{
    public function productAttribute($product, $attributeHtml, $attributeName)
    {
        $attribute = Mage::getSingleton('eav/config')->getAttribute('catalog_product', $attributeName);
        if ($attribute && $attribute->getId() && ($attribute->getFrontendInput() != 'media_image')
            && (!$attribute->getIsHtmlAllowedOnFront() && !$attribute->getIsWysiwygEnabled())) {
                if ($attribute->getFrontendInput() != 'price') {
                    $attributeHtml = $attributeHtml;
                }
                if ($attribute->getFrontendInput() == 'textarea') {
                    $attributeHtml = nl2br($attributeHtml);
                }
        }
        if ($attribute->getIsHtmlAllowedOnFront() && $attribute->getIsWysiwygEnabled()) {
            if (Mage::helper('catalog')->isUrlDirectivesParsingAllowed()) {
                $attributeHtml = $this->_getTemplateProcessor()->filter($attributeHtml);
            }
        }

        $attributeHtml = $this->process('productAttribute', $attributeHtml, array(
            'product'   => $product,
            'attribute' => $attributeName
        ));

        return $attributeHtml;
    }

}

注意上述代码中的 $attributeHtml = $attributeHtml; 这行,就是修改的
然后刷新cache,重新进和产品页看到如下效果