Magento使自定义属性'免运费'的产品自动添加到指定目录

Magento免运费

Magento产品添加了个自定义属性Free Shipping(免运费)。要实现当Free shipping属性的值为YES的时候,自动把产品指定到一个叫Free Shipping的目录。

P,前台还可以处理下,使有这属性值的产品添加标识条幅。如图,效果还是挺惹人喜的。

magento免运费属性的产品示例图

Magento产品自动添加到指定目录
我的处理办法是,重写“app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php”这个文件。

在_initProductSave方法里的

/**
* Initialize product categories
*/

这个步骤添加额外处理。

完整代码为:

// addEd at: 10:20 2011/7/30 by chen@sjolzy.cn
/*
    $productData['free_shipping']: 21 yes 20 no
    Free Shipping Specials category id: 31
*/
    $ifFreeShipping    = (int)$productData['free_shipping']===21?true:false;
    $freeShippingCategoryId    = 31;
    // addEd at: 10:20 2011/7/30 by chen@sjolzy.cn

if (null !== $categoryIds) {
    if (empty($categoryIds)) {
        $categoryIds = $ifFreeShipping?$freeShippingCategoryId:array();
    }else{
        $categoryIds = explode(',',$categoryIds);
        $categoryIds = $this->freeShippingCategoryIdProcess($freeShippingCategoryId,$ifFreeShipping,$categoryIds);
    }
    $product->setCategoryIds($categoryIds);
}else{    // addEd at: 10:20 2011/7/30 by chen@sjolzy.cn
    $categoryIds = Mage::getResourceSingleton('catalog/product')->getCategoryIds($product);
    if($categoryIds){
        $categoryIds    = is_array($categoryIds)?$categoryIds:array($categoryIds);
        $categoryIds    = $this->freeShippingCategoryIdProcess($freeShippingCategoryId,$ifFreeShipping,$categoryIds);
        $product->setCategoryIds($categoryIds);
    }
}    // addEd at: 10:20 2011/7/30 by chen@sjolzy.cn
 

另外添加的freeShippingCategoryIdProcess方法是

protected function freeShippingCategoryIdProcess($freeShippingCategoryId,$ifFreeShipping,$categoryIds){
    if(!$ifFreeShipping){
    $k = array_search($freeShippingCategoryId,$categoryIds);
    if(false!==$k){
        unset($categoryIds[$k]);
    }
    }else{
        $categoryIds[]    = $freeShippingCategoryId;
    }
    return implode(',',$categoryIds);
}

经过测试,达到预期效果,产品设置YES后自动添加到free shipping的目录,No了之后再取消。

解决Magento后台上传产品图片保存失败的问题

问题概述:Magento 1.5.1后台上传产品图片,点击上传,没效果,点击保存后更没数据(早期Magento版本貌似也有这种情况)。

出现JS错误:this.images.toJSON is not a function 在 /js/mage/adminhtml/product.js
行:122这个位置

经过一番努力二番调试三番四次不断纠结,总算解决问题这个保存上传图片失败的问题。

处理:在/js/mage/adminhtml/product.js这个js文件里,搜索“this.images.toJSON()”,在122行和177行这两处出现,均为“this.getElement('save').value = this.images.toJSON();”

把这两个地方的"this.images.toJSON()"替换成“Object.toJSON(this.images)”,保存后就解决问题。

PS,,MS某个插件引发Magento这个后台上传产品图片失败的问题。

JQuery和Prototype区别小结

jQuery使用得比较顺手也比较喜欢,不得已也要用Prototype,小小整理下区别。。

页面载入

  1. // JQuery
    
  2. $ ( document ). ready ( function () {
  3.         // Code
  4. });

 

  1. // JQuery Shorthand
    
  2. $ ( function () {
  3.         // Code
  4. });

 

  1. // Prototype
    
  2. document . observe ( 'dom:loaded' , function () {
  3.         // Code
  4. });

 

根据ID获取

  1. // JQuery
    
  2. $ ( "#idname" );
  1. // Prototype
    
    
  2. $ ( "idname" );

 

根据类名

  1. // JQuery
    
  2. $ ( ".classname" );
  1. // Prototype
    
    
  2. $$ ( '.classname' );

 

根据第一个符合的类名

  1. // JQuery
    
  2. $ ( ".classname:first-child" );
  1. // Prototype
    
    
  2. $$ ( '.classname' )[ 0 ];

 

根据ID绑定监听事件

  1. // JQuery 
    
  2. $ ( "#item" ). bind ( 'click' , function () {
  3.         // Code
  4. });
  5.  
  6. // JQuery Shorthand
  7. $ ( "#item" ). click ( function () {
  8.         // Code
  9. });
  1. // Prototype
    
  2. $ ( "#item" ). observe ( 'click' , function () {
  3.         // code
  4. });

 

根据符合的类名绑定监听事件

  1. $(".classname").bind('click',function(){
    
  2.         // code
  3. });
  4.  
  5. // JQuery Shorthand
  6. $ ( ".classname" ). click ( function () {
  7.         // code
  8. });

 

  1. // Prototype
    
  2. $$ ( ".classname" ). invoke ( 'observe' , 'click' , function () {
  3.         // code
  4. });

 

结束终止事件

  1. // JQuery
    
  2. $ ( "#id" ). click ( function () {
  3.  
  4.         //code
  5.         return false ;
  6. });
  1. // Prototype
    
  2. $ ( "id" ). observe ( 'click' , function ( e ) {
  3.         //code
  4.         Event . stop ( e );
  5. });

 

处理观察的元素

  1. // JQuery
    
  2. $ ( '#idname' ). click ( function () {
  3.         this . hide (); // Hide the item clicked
  4. });
  1. // Prototype
    
  2. $ ( 'idname' ). observe ( 'click' , function ( e ) {
  3.         el = e . findElement ;
  4.         el . hide (); // hide the item clicked
  5. });

 

根据ID操作类名

  1. // JQuery
    
  2. $ ( '#id' ). addClass ( 'red' );
  3. $ ( '#id' ). removeClass ( 'red' );
  1. // Prototype
    
  2. $ ( 'id' ). addClassName ( 'red' );
  3. $ ( 'id' ). removeClassName ( 'red' );

 

根据类名操作类名。。

  1. // JQuery
    
  2. $ ( '.class' ). addClass ( 'red' );
  3. $ ( '.class' ). removeClass ( 'red' );
  1. // Prototype
    
  2. $$ ( '.class' ). invoke ( 'addClassName' , 'red' );
  3. $$ ( '.class' ). invoke ( 'removeClassName' , 'red' );

 

AJAX请求和JSON应用

  1. $.get(url,function(data){
            alert(data . name );
    
  2. }, 'JSON' );

 

  1. // Prototype
    new   Ajax . Request ( url ,   {
  2.         method : 'get' ,
  3.         onSuccess : function ( transport , json ) {
  4.                 alert ( json . name );
  5.         }
  6. });

可以得出结论:jQuery和Prototype大部分是极为相似的,多用几次就都熟了。。

Magento在CMS page页面调用Contacts模块的联系我们

新建的magento cms页面要嵌入联系我们模块的做法:

后台编辑page页面,design内容设为

<reference name="content">
<block type="core/template" name="contactForm" template="contacts/form.phtml"/>
</reference>

最好复制个新文件,不影响原来的。

这样就能把Contacts联系模块
调用到cms页面了,但是提交后返回地址回到了“/contacts/index/”,而且没有操作提示信息。

怎木办。。

打开/app/code/core/Mage/Contacts/controllers/IndexController.php这个文件,在postAction做个处理,我的处理内容为

$referer    = $_SERVER['HTTP_REFERER'];
if(false!==strpos($referer,'contactez-nous')){
    Mage::getSingleton('customer/session')->addSuccess(Mage::helper('contacts')->__('Your inquiry was submitted and will be responded to as soon as possible. Thank you for contacting us.'));
    header( 'Location: ' . $referer );
    return;
}

判断CMS提交到contacts模块的url,符合的话进入处理流程,并返回到原URL。

另外返回后不会显示操作信息的解决办法是:

修改form.phtml文件,在头部加入一下代码:

<?php Mage::app()->getLayout()->getMessagesBlock()->setMessages(Mage::getSingleton('customer/session')->getMessages(true)); ?>

到这里就顺利处理好了Magento的CMS page页面调用联系我们。

标签: none

ajax请求报错Error loading content (NS_ERROR_DOCUMENT_NOT_CACHED)

ajax请求的时候,IE出现拒绝访问的错误,同域名无跨域,调试了半天还是调试不出问题?

FF调试看到错误信息:

Error loading content (NS_ERROR_DOCUMENT_NOT_CACHED)

text/html (NS_ERROR_DOM_BAD_URI)


如果也遇到这种情况,实在想不出啥原因了的话,看看是不是http://和https://的互访。

如果是,协议调一致问题就解决。

标签: AJAX, 跨域, http

Magento邮件发送的一段代码

$translate = Mage::getSingleton('core/translate');  
$translate->setTranslateInline(false);  

$storeId  = Mage::app()->getStore()->getId();  

$template ='15';
//这个$template的值是定义的邮件模板的ID,可以到后台->System->Transactional Emails 去获取邮件模板ID,也可以用magento默认的值,如 'contacts_email_email_template'

// magento默认用的这句 $sender=Mage::getStoreConfig('sales_email/order/identity', $storeId) ,使用magento后台配置的发送人
$identity=Mage::getStoreConfig('sales_email/order/identity', $storeId);
$recipient = array(
    'name'  => $identity,
    'email' => $identity.str_replace('www.', '@', $_SERVER['HTTP_HOST'])
);
//$recipient 是接受者邮件 和 名字

$sender  = array(  
    'name'  => 'Sjolzy',
    'email' => 'chen@sjolzy.cn'
);
//$sender 是发送者邮件 和 名字,

$mailTemplate = Mage::getModel('core/email_template')->load($template);  
$mailTemplate->setDesignConfig(array('area'=>'frontend', 'store'=>$storeId))
    ->sendTransactional(
        $template,
        $sender,
        $recipient['email'],
        $recipient['name'],
        $post// parameters to email
        //这里是传进邮件模板里面的变量, 在模板里面用 {{var param1 }}获取,如果传的是对象可以这样使用 {{var object.getId()}}
    );
$translate->setTranslateInline(true);
$mailTemplate->getSentSuccess();

标签: none