分类归档 magento

通过清心醉

php7.0.1-magento出现500错误

最近测试PHP7对magento的性能影响,结果出现500错误。一开始以为是伪静态出错搞的鬼,后来安装了个wordpress重写伪静态发现又没问题,后来GOOGLE了一翻:

在app/code/core/Mage/Core/Model/Layout.php文件里第555行:

$out .= $this->getBlock($callback[0])->$callback[1]();

修改为:$out .= $this->getBlock($callback[0])->{$callback[1]}();

就可以解决问题了。

通过清心醉

PHP开启INTL扩展之WINDOWS版

为了测试新的magento开源系统,所以在当前的WIN系统内安装了个WAMP快速部署环境.
安装完成之后,发现新的magento电子商城程序需要INTI的扩展支持
好吧,WINDOWS下的扩展开启比较简单,果断php.ini里打开extension=php_intl.dll
重启APACHE,发现还是存在对应的问题,提示扩展未开启
经过GOOGLE一翻,发现问题不在该扩展上,而是扩展以来的其他扩展文件的关系.
PHP的根目录有很多icu***50.dll文件 (50表示的是当前的PHP的版本,**为所有的文件名)
把文件复制到apache/bin/目录内,重启搞定!

更多直接打印phpinfo查看!

注: 新版MAGENTO为MAGNETO VER 2.0,如果需要进行二次开发建议使用UNIX,否则几万个文件,你的ZEND刷新项目就卡你一个多小时!

通过清心醉

Magento-B2B之htaccess多站共存

在这之前,作者来详细介绍下Magento系统的站点模式

一个Magento可以有无数个Code(网站唯一值)

然后在每个对应的站点里面又可以有无数个Website(网站店铺唯一)

在每个对应的店铺里可以有独立的不同语言

所以要实现B2B的前提,你能很好的区分网站和店铺和视图的差别。

然后每个不同的站都是独立化的。

因此需要htaccess文件来进行实现!

SetEnvIf Host www\.qingxinzui\.com MAGE_RUN_CODE=base
SetEnvIf Host www\.qingxinzui\.com MAGE_RUN_TYPE=website

SetEnvIf Host abc\.qingxinzui\.com MAGE_RUN_CODE=abc
SetEnvIf Host abc\.qingxinzui\.com MAGE_RUN_TYPE=website

SetEnvIf Host cba\.qingxinzui\.com MAGE_RUN_CODE=cba
SetEnvIf Host cba\.qingxinzui\.com MAGE_RUN_TYPE=website

假设作者现在的网站改成B2B模式,那么默认的CODE=base,TYPE=website

就是使用默认的站点-店铺-视图

否则根据不同的参数进行跳转到不同的站点。

我们来看index.php文件:

/* 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);

如果可以的话,也可以读取数据库的参数值来进行实现跳转,自己对index.php开始文件进行二次开发下就可以了

通过清心醉

magento开发|深入分析magento之创建分类

由于magento的EVA模型实在太多数据了,作者也没有那么多的时间去一个个查看数据字段的参数,现将创建(根)分类时所写入SQL的数据进行解释:

由于MAGENTO是使用自增ID的方式,如果我们要独立写添加分类的时候,就需要获取当前的最大ID值+1处理.

$ID=新增分类的ID,建议使用表内最大值+1;

$categoryname=分类名称

catalog_category_entity  1条主数据:
字段参数:
$ID==3==3==1==当前时间==当前时间 ==1/$ID==1==1

#注: 1/$ID是因为1为全站整目录,$ID表示是全站目录中的其中一个根目录.

catalog_category_entity_datetime 2条时间数据
字段参数:
自增ID==3==59==0==$ID==NULL
自增ID==3==60==0==$ID==NULL

catalog_category_entity_decimal 1条数据
字段参数:
自增ID==3==70==0==$ID==NULL
catalog_category_entity_int 6条数据
字段参数:
自增ID==3==42==0==$ID==0
自增ID==3==67==0==$ID==1
自增ID==3==50==0==$ID==NULL
自增ID==3==51==0==$ID==0
自增ID==3==68==0==$ID==0
自增ID==3==69==0==$ID==0

catalog_category_entity_text 5条数据
自增ID==3==44==0==$ID==NULL
自增ID==3==47==0==$ID==NULL
自增ID==3==48==0==$ID==NULL
自增ID==3==62==0==$ID==NULL
自增ID==3==65==0==$ID==NULL

catalog_category_entity_varchar 6条数据
自增ID==3==41==0==$ID==$categoryname
自增ID==3==46==0==$ID==NULL
自增ID==3==49==0==$ID==PRODUCTS
自增ID==3==58==0==$ID==NULL
自增ID==3==61==0==$ID==NULL
自增ID==3==43==0==$ID==$categoryname

通过清心醉

magento开发|magento建站|深入理解magento之分类产品筛选器

在magento后台管理分类,如果打开了magento指定的分类,可以查看当前分类内的产品信息,如果点击了筛选器,就会列出所有的产品列表
因为一个系统2个类型的网站店铺,所以要修改magento筛选的功能.
在magento/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php块文件里.

有这么一个方法:
protected function _prepareCollection()
{
if ($this->getCategory()->getId()) {
$this->setDefaultFilter(array(‘in_category’=>1));
}
$collection = Mage::getModel(‘catalog/product’)->getCollection()
->addAttributeToSelect(‘name’)
->addAttributeToSelect(‘sku’)
->addAttributeToSelect(‘price’)
->addStoreFilter($this->getRequest()->getParam(‘store’)) //获取的店铺ID
->joinField(‘position’,
‘catalog/category_product’,
‘position’,
‘product_id=entity_id’,
‘category_id=’.(int) $this->getRequest()->getParam(‘id’, 0),
‘left’);
$this->setCollection($collection);

if ($this->getCategory()->getProductsReadonly()) {
$productIds = $this->_getSelectedProducts();
if (empty($productIds)) {
$productIds = 0;
}
$this->getCollection()->addFieldToFilter(‘entity_id’, array(‘in’=>$productIds));
}

return parent::_prepareCollection();
}
上面的红字那行,自己写个获取站点店铺的方法,就可以完整的实现只提取当前店铺的产品!

切记:获取的店铺store必须为数字

通过清心醉

magento开发-建站|magento产品列表页关闭操作功能

今天一位外贸用户的网站管理员需要修改magento的用户权限,其实多简单的事啊,修改下magento用户组就可以了.但发现有个magento做的不是很好的,因为magento的权限里,产品列表页面有个操作功能,可以修改产品为删除.如果员工帐号出了问题直接就是批量的删除(也许你会说,打开产品一样可以删除啊,我相信没谁有那么多的时间无聊的去一个个删掉).为此作者受magento客户的要求修改了下管理页视图:

class Mage_Adminhtml_Block_Catalog_Product_Grid extends Mage_Adminhtml_Block_Widget_Grid

而且Mage_Adminhtml_Block_Widget_Grid使用的视图模板是:$this->setTemplate(‘widget/grid.phtml’);

(注:相关产品等表都是使用该视图模板,后期还要修改)

在grid.phtml模板文件里:

<?php if($this->getMassactionBlock()->isAvailable()): ?>
<?php echo $this->getMassactionBlockHtml() ?>
<?php endif ?>

你可以直接删除这些,但同时也会删除多选的功能,所以跟踪下代码进行修改:

public function getMassactionBlockHtml()
{
return $this->getChildHtml(‘massaction’);
}

好了,这引用了其他的视图模型:

文件在:magento/app/design/adminhtml/default/default/template/widget/grid/massaction.phtml

 

<?php //权限控制修改开始 ?>
<?php if(Mage::getFobAdmin()) {?>
<td>
<div class=”right”>
<div class=”entry-edit”>
<?php if ($this->getHideFormElement() !== true):?>
<form action=”” id=”<?php echo $this->getHtmlId() ?>-form” method=”post”>
<?php endif ?>
<?php echo $this->getBlockHtml(‘formkey’)?>
<fieldset>
<span class=”field-row”>
<label><?php echo $this->__(‘Actions’) ?></label>
<select id=”<?php echo $this->getHtmlId() ?>-select” class=”required-entry select absolute-advice local-validation”>
<option value=””></option>
<?php foreach($this->getItems() as $_item): ?>
<option value=”<?php echo $_item->getId() ?>”<?php echo ($_item->getSelected() ? ‘ selected=”selected”‘ : ”)?>><?php echo $_item->getLabel() ?></option>
<?php endforeach; ?>
</select>
</span>
<span class=”outer-span” id=”<?php echo $this->getHtmlId() ?>-form-hiddens”></span>
<span class=”outer-span” id=”<?php echo $this->getHtmlId() ?>-form-additional”></span>
<span class=”field-row”>
<?php echo $this->getApplyButtonHtml() ?>
</span>
</fieldset>
<?php if ($this->getHideFormElement() !== true):?>
</form>
<?php endif ?>
</div>

<div class=”no-display”>
<?php foreach($this->getItems() as $_item): ?>
<div id=”<?php echo $this->getHtmlId() ?>-item-<?php echo $_item->getId() ?>-block”>
<?php echo $_item->getAdditionalActionBlockHtml() ?>
</div>
<?php endforeach; ?>
</div>
</div>
</td>
<?php }?>
<?php //权限控制修改结束 ?>

通过清心醉

magento开发|magento打开产品列表的时候关闭操作栏的网站选择

magento打开产品列表的时候关闭操作栏的网站选择,因为如果不对这一块进行限制,服装站的管理员就可以调用数码站的产品.虽然说前几篇文章作者说了通过store来进行控制,但也不太好看,因此为了不必要的麻烦,对magento进行二次开发:magento/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Filter/Select.php

public function getHtml()
{
//该方法进行产品序表输出
$html = ‘<select name=”‘.$this->_getHtmlName().'” id=”‘.$this->_getHtmlId().'” class=”no-changes”>’;
$value = $this->getValue();
foreach ($this->_getOptions() as $option)
{
if($this->_getHtmlName()==’websites’ && !Mage::getFobAdmin()) //如果select的下拉为websites并且不是后台的超级管理员的话,直接中指
{
break;
}
if (is_array($option[‘value’]))
{
$html .= ‘<optgroup label=”‘ . $this->escapeHtml($option[‘label’]) . ‘”>’;
foreach ($option[‘value’] as $subOption)
{
$html .= $this->_renderOption($subOption, $value);
}
$html .= ‘</optgroup>’;
}
else
{
$html .= $this->_renderOption($option, $value);
}
}
$html.='</select>’;

return $html;
}

通过清心醉

magento开发|magento显示当前用户的站点管理

我们都知道magento可以多站点-多店铺-多语言化.两个网站之间,不能显示不属于当前网站的产品信息参数,因为我们要限制store;

magento/app/design/adminhtml/default/default/template/store/switcher.phtml文件里

就是进行循环的了,我们修改下部分的代码:在<?php foreach ($this->getStores($group) as $store): ?>里面

<?php
$store_name=$this->escapeHtml($website->getName()); //获取店铺名称
if($store_name==Mage::getSingleton(‘admin/session’)->getUser()->getUsername()) //如果是对应的用户进行输出
{
?>
<?php if ($showWebsite == false): ?>
<?php $showWebsite = true; ?>
<optgroup label=”<?php echo $this->escapeHtml($website->getName()) ?>”></optgroup>
<?php endif; ?>
<?php if ($showGroup == false): ?>
<?php $showGroup = true; ?>
<optgroup label=”&nbsp;&nbsp;&nbsp;<?php echo $this->escapeHtml($group->getName()) ?>”>
<?php endif; ?>
<option value=”<?php echo $this->escapeHtml($store->getId()) ?>”<?php if($this->getStoreId() == $store->getId()): ?> selected=”selected”<?php endif; ?>>&nbsp;&nbsp;&nbsp;&nbsp;<?php echo $this->escapeHtml($store->getName()) ?></option>
<?php }?>

<?php if(Mage::getFobAdmin()) {// 如果是管理员 ?>
<?php if ($showWebsite == false): ?>
<?php $showWebsite = true; ?>
<optgroup label=”<?php echo $this->escapeHtml($website->getName()) ?>”></optgroup>
<?php endif; ?>
<?php if ($showGroup == false): ?>
<?php $showGroup = true; ?>
<optgroup label=”&nbsp;&nbsp;&nbsp;<?php echo $this->escapeHtml($group->getName()) ?>”>
<?php endif; ?>
<option value=”<?php echo $this->escapeHtml($store->getId()) ?>”<?php if($this->getStoreId() == $store->getId()): ?> selected=”selected”<?php endif; ?>>&nbsp;&nbsp;&nbsp;&nbsp;<?php echo $this->escapeHtml($store->getName()) ?></option>
<?php }?>

第二个判断是因为管理员是管理整个MAGENTO的,所以权限不同,全部循环输出

 

通过清心醉

magento重置筛选器

前几篇文章作者写了magento后台打开产品页显示当前用户的产品,虽然产品管理页面有个重置筛选器不能查看到其他站点的数据.

但在产品的详细配置里,比如相关产品,超售产品等等,还是有数据库里的全部信息的.

今天就来作者来详细介绍下magento的重置筛选器.

magento的重置筛选器,是通过onclick事件进行触发:

我们来看看有哪些:

产品的管理页::productGridJsObject.resetFilter()

产品参数里的相关产品页::related_product_gridJsObject.resetFilter()

产品参数里的超售页::up_sell_product_gridJsObject.resetFilter()

产品参数里的交叉销售::cross_sell_product_gridJsObject.resetFilter()

细心的人会发现,该方法是通过组合进行的, 后面的方法都是resetFilter();

app/code/core/Mage/Adminhtml/Block/Widget/Grid.php里面有protected function _prepareLayout()方法

我们来看看相关的:

$this->setChild(‘reset_filter_button’,
$this->getLayout()->createBlock(‘adminhtml/widget_button’)
->setData(array(
‘label’ => Mage::helper(‘adminhtml’)->__(‘Reset Filter’),
‘onclick’ => $this->getJsObjectName().’.resetFilter()’,
))
);

productGridJsObject.resetFilter()的方法是在

magento/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php

里,看目录的命名应该就能知道了.至于后面的产品参数里的三个,作者稍后在进行写上.

通过清心醉

magento开发|magento后台打开产品页显示当前用户的产品

magento开发修改了后台对不同店铺的操作.假设老板请了员工A做数码产品,又请了B做服装产品.

而2个不同的产品类别分在了两个域名的站点上,这样A和B两个员工的产品互相之间就不能显示了.

因次我们对magnento二次开发,让他只显示对应的站点的产品信息.(后期还会对magento进行二次开发修改相关产品等参数).

在magento/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php里

有protected function _getStore()这一个获取店铺的方法

作者自己写了个封装,是用来判断用户类型和对应的可以修改的站点的

修改过后的方法为:

protected function _getStore()
{
if (Mage::getFobAdmin())
{
$storeId = (int) $this->getRequest()->getParam(‘store’, 0);
}
else
{
$data=Mage::getUserWebsites();
$storeId=$data[‘0’][‘website_id’];
unset($data);
}
return Mage::app()->getStore($storeId);
}

通过清心醉

magento开发|magento不同站点的分类禁止显示

今天magento开发的重点就是分类的权限限制.可能很多人不知道我为什么要这么修改magento的功能.

(用户要我给magento做两个分类,对应不同的网站,一个专卖数码产品一个专卖,所以上传的话为了避免另一个站的分类数据在产品选择分类那显示出来,最好的方法就是对magento二次开发了.)

好了,说开发吧:

产品分类筛选显示模板目录:
/app/esign/adminhtml/default/defalt/template/catalog/product/edit/categories.phtml

因为magento是使用AJAX进行请求的,所以,我们看不到太多的PHP的语句,基本都是JavaScript覆盖了.

在一开始就有个getRootNode(),是magento分类的全部参数.具体数据太多,自行打印可查看

在categories.phtml里进行foreach循环输出.

在JavaScript里有个bildCategoryTree(parent, config)的方法,里面就是循环输出分类

我们可以看到有个变量:var _node = Object.clone(config[i]);

通过for循环组合输出,可以看到里面包含了ID.

好了,有ID了就好办了;

比如作者不希望显示根分类为2的属性,作者修改了下该方法

function bildCategoryTree(parent, config){
if (!config) return null; //is no catagory
if (parent && config && config.length){
for (var i = 0; i < config.length; i++){
//config.length为根目录的数量
config[i].uiProvider = Ext.tree.CheckboxNodeUI;
var node;
var _node = Object.clone(config[i]);
if(_node[‘id’]==2)
{
// break;
}
else
{
if (_node.children && !_node.children.length) {
delete(_node.children);
node = new Ext.tree.AsyncTreeNode(_node);
} else {
node = new Ext.tree.TreeNode(config[i]);
}
parent.appendChild(node);
node.loader = node.getOwnerTree().loader;
if(config[i].children){
bildCategoryTree(node, config[i].children);
}
}
}
}
}

这样如果分类ID如果=2的话,系统就不会进行输出调用了.

因为要对应系统,所以我们需要根据数据库里的来屏蔽非当前站点分类

开发的话,自己写个模型来进行提取站点的根分类

数据库对应的表段为:

core_store //站点信息参数
core_store_group //站点分类参数

至于要如何获取站点的store_id,作者前面的文章已经有说(强制增加站点);

根据store_id来提取分类就可以了.

通过清心醉

magento开发|magento强制关闭产品上传网站选择

前文作者说了magento强制给产品增加网站,不过那是由后端控制器中进行操作的.

由于magento后台一般没有什么主题化,所以主题这一块也要修改下.

因为默认的网站已经通过后端控制器完成,所以显示的时候就需要关闭掉网站这一块(具体左边的网站就不关闭了)

app/design/adminhtml/default/default/template/catalog/product/edit/websites.phtml文件里

我们可以看到foreach ($this->getWebsiteCollection() as $_website):

这里就是循环输出对应网站的选项,还包括多语言(多店铺视图)的选择提示,直接注释掉就完事了.

通过清心醉

magento开发|magento强制给产品增加网站

magento上传产品的时候,会需要自己选择产品在哪个网站的显示.

如果我有A\B两个站,那么就必须要两个都勾选择.这时候,只有二次开发magento才能满足我们的需求了:

magento上传产品(包括修改magento产品)的时候,都是以数组product的类型POST到product控制器里.

而product又是一个数组,里面会有[“website_ids”]参数,查看下参数原体:

[“website_ids”]=> array(2) { [0]=> string(1) “1” [1]=> string(1) “2” }这么一个二维数组.

因为作者给A\B两个站都是产品的网站,所以会有两个数值,参数1/2表示网站的website信息.

如此一来,我们可以关闭magento上传产品时选择分类的功能,在product控制器里进行强制增加

$productData[‘website_ids’][‘0’]=”1″;$productData[‘website_ids’][‘1’]=”2″;

这样在写入数据库的时候,就可以完整的实现自动添加到对应网站的功能了.

 

 

通过清心醉

Magento安全漏洞修复脚本

magento最近出了个新的漏洞补丁,以8月4日进行脚本的下载修复:

到https://www.magentocommerce.com/download下在对应版本的

至于补丁的安装:

https://info2.magento.com/rs/magentoenterprise/images/Installing-a-Patch-for-Magento-Community-Edition.pdf

Please upload the patch into your Magento root directory and run the appropriate SSH command:
For patch files with the file extension .sh:
sh patch_file_name.sh
Example: sh PATCH_SUPEE-1868_CE_1.7.0.2_v1.sh
For patch files with the file extension .patch:
patch –p0 < patch_file_name.patch
Once that is done, refresh the cache in the Admin under “System > Cache Management” so that the changes will be reflected. We highly recommend you test all patches in a test environment before taking them live.
For further instructions, see: Installing a Patch for Community Edition

以下为magento1.8-1.9的安全补丁:magento1.8-1.9

通过清心醉

magento开发-magento关闭编译文件的执行

Magento有一种功能叫代码重写,比如我们需要修改magento的核心url功能.

一般magento核心的文件都是在/app/code/core/mage里面.

需要修改的话复制到/app/code/local/mage…对应的文件夹里面

修改过的文件可以实现效果,但速度非常的慢.因为Magento要跑遍core和local目录.

而magento编译功能可以把修改过后的编译成新的文件(即有新的功能),如果一来加快使用文件的速度.

但如果使用了编译,如果要进行magento的二次开发的功能的时候,每次修改过后都要进行编译过,影响了速度

include/config.php文件里:

define(‘COMPILER_INCLUDE_PATH’, dirname(__FILE__).DIRECTORY_SEPARATOR.’src’);

把这行注释掉,就可以不使用编译后的文件了.而是直接使用核心文件.

通过清心醉

magento开发-为产品URL强制添加用户名

我们都知道,magento可以通过块/控制器直接来操作模型进行数据库的操作.

magento产品添加,要想强制在URL上添加用户名,必须要找到块类

流程是:控制器->布局->通过Block引用

居然有提到布局,那么就肯定会有xml的布局配置文件

adminhtml里有个catalog.xml配置文件:

<adminhtml_catalog_product_new>
<update handle=”editor”/>
<reference name=”content”>
<block type=”adminhtml/catalog_product_edit” name=”product_edit”></block>
</reference>
<reference name=”left”>
<block type=”adminhtml/catalog_product_edit_tabs” name=”product_tabs”></block>
</reference>
<reference name=”js”>
<block type=”adminhtml/catalog_product_edit_js” template=”catalog/product/js.phtml” name=”catalog_product_js”></block>
<block type=”core/template” template=”catalog/wysiwyg/js.phtml”/>
</reference>
</adminhtml_catalog_product_new>

这是后台添加新产品的一个实现功能

adminhtml/catalog_product_edit 好了,在这我们就知道块文件在哪了

adminhtml/block/catalog/product/edit.phtml

class Mage_Adminhtml_Block_Catalog_Product_Edit extends Mage_Adminhtml_Block_Widget
{
public function __construct()
{
parent::__construct();
$this->setTemplate(‘catalog/product/edit.phtml’);
$this->setId(‘product_edit’);
}

….

}

构造方法里就强制调用了模板,这样就简单操作了.

form action=”<?php echo $this->getSaveUrl() ?>

在Edit.php块里可以看到:

public function getValidationUrl()
{
return $this->getUrl(‘*/*/validate’, array(‘_current’=>true));
}

public function getSaveUrl()
{
return $this->getUrl(‘*/*/save’, array(‘_current’=>true, ‘back’=>null));
}

一个是AJAX提交JSON修改产品方法,一个是保存的方法即新增加产品.

不知道提交的控制器是否一样,暂时先不管,首先我们为新增加的产品的URL进行截获.

/adminhtml/controllers/catalog/productcontroller.php文件里

protected function _initProductSave()方法里有个

$productData = $this->getRequest()->getPost(‘product’);

处理接收POST过来的product的数组,打印可以查看.

在写个方法来进行URL_KEY的对比:

public static function setProductUrlMall($key)
{
/**
* 暂时不对中文字符串URL进行截取修改
*/
$data; //组合的URL;
$userid=Mage::getSingleton(‘admin/session’)->getUser()->getUserId();
$text=”fob-“.$userid.”-“;
$textleng=strlen($text); //查看mall+用户ID的长度
$keyleng=strlen($key); //查看url_key的长度
if ($keyleng<=$textleng) //如果传递过来的都小于默认,那肯定就要重新组合了.
{
$data=”$text”.”$key”;
return $data;
}
else
{ //如果URL的长度大于默认数字
$tempkey=substr($key, 0,$textleng); //提取URL与默认值相同长度的前X位
if ($tempkey==$text)
{
//如果前X位与默认值相同,那表示已经存在了
return $key;
}
else
{
$data=”$text”.”$key”;
return $key;
}
}
}

 

然后修改_initProductSave()的方法:

$urlkey=Mage::setProductUrlMall($productData[‘url_key’]); //将URL传递给方法进行判断组合.

unset($productData[‘url_key’]);
$productData[‘url_key’]=$urlkey;

 

通过清心醉

magento开发-后台获取管理员的名字和ID

magento开发后台,我们需要捕抓管理员的名字和ID值

如果是在头部,可以使用

$this->getUser()->getUserId() //获取管理员ID

$this->getUser()->getUsername() //获取管理员名

作者5月份时候有写过块功能

头部header.phtml文件是存在块功能的;

block/page/header.php块文件里可以看到:

public function getUser()
{
return Mage::getSingleton(‘admin/session’)->getUser();
}

这里面封装了一个获取管理员的SESSION参数的方法;

那如果我想在magento的页脚下显示用户名,是否也可以直接使用$this->getUser()->getUsername()调用呢?

答案是不允许的,因为块文件block/page/footer.php文件里没有function getUser()的方法,当然有时候我们为了不过于的频繁修改,可以考虑直接修改核心,在footer.php块功能里增加该方法

或者直接在需要使用的地方使用Mage::getSingleton(‘admin/session’)->getUser() ->getUsername();来获取

通过清心醉

magento开发-magento提取产品

网站的二次开发,基于商城的莫过于是提取产品了.magento开发也一样,今天对magento进行二次开发,对magento提取产品的大概细节进行了编写.以下为实际编写代码.

$_products = $this->getProductCollection(); //获取产品信息
var_dump($_products->getItems()); die(“数据提取完毕”);
//getItems()方法里已经获取了所有的产品信息参数,但这里获取的产品的URL只是域名后半部分
//所以

foreach($_products->getItems() as $product) //二维数组foreach循环提取
{
echo “</br>产品的URL为:”.$product->getProductUrl(); //输出独里的URL
//应该是在这里面为URL进行了拼接
//如果改成var_dump($product); 就能看到$product其实就是一个对象:数据格式为:
/*
object(Mage_Catalog_Model_Product)#271 (32)
{
[“_cacheTag”:protected]=> string(15) “catalog_product”
[“_eventPrefix”:protected]=> string(15) “catalog_product”
[“_eventObject”:protected]=> string(7) “product”
[“_canAffectOptions”:protected]=> bool(false)
[“_typeInstance”:protected]=> NULL
[“_typeInstanceSingleton”:protected]=> NULL
[“_linkInstance”:protected]=> NULL
[“_customOptions”:protected]=> array(0) { }
[“_urlModel”:protected]=> NULL
[“_errors”:protected]=> array(0) { }
[“_optionInstance”:protected]=> NULL
[“_options”:protected]=> array(0) { }
[“_reservedAttributes”:protected]=> NULL
[“_isDuplicable”:protected]=> bool(true)
[“_calculatePrice”:protected]=> bool(true)
[“_defaultValues”:protected]=> array(0) { }
[“_storeValuesFlags”:protected]=> array(0) { }
[“_lockedAttributes”:protected]=> array(0) { }
[“_isDeleteable”:protected]=> bool(true)
[“_isReadonly”:protected]=> bool(false)
[“_resourceName”:protected]=> string(15) “catalog/product”
[“_resource”:protected]=> NULL
[“_resourceCollectionName”:protected]=> string(26) “catalog/product_collection”
[“_dataSaveAllowed”:protected]=> bool(true)
[“_isObjectNew”:protected]=> NULL
[“_data”:protected]=> array(35)
{
[“entity_id”]=> string(1) “7”
[“entity_type_id”]=> string(1) “4”
[“attribute_set_id”]=> string(1) “4”
[“type_id”]=> string(6) “simple”
[“sku”]=> string(1) “7”
[“has_options”]=> string(1) “0”
[“required_options”]=> string(1) “0”
[“created_at”]=> string(19) “2013-03-12 00:48:01”
[“updated_at”]=> string(19) “2013-03-12 00:49:26”
[“cat_index_position”]=> string(1) “0”
[“price”]=> string(8) “885.0000”
[“tax_class_id”]=> string(1) “0”
[“final_price”]=> string(8) “885.0000”
[“minimal_price”]=> string(8) “885.0000”
[“min_price”]=> string(8) “885.0000”
[“max_price”]=> string(8) “885.0000”
[“tier_price”]=> NULL
[“news_from_date”]=> string(19) “2013-03-11 00:00:00”
[“news_to_date”]=> string(19) “2019-03-11 00:00:00”
[“name”]=> string(13) “cba的产品3”
[“url_key”]=> string(5) “cba-3”
[“msrp_enabled”]=> string(1) “2”
[“msrp_display_actual_price_type”]=> string(1) “4”
[“small_image”]=> string(12) “no_selection”
[“thumbnail”]=> string(12) “no_selection”
[“short_description”]=> string(13) “cba的产品3”
[“special_price”]=> NULL
[“msrp”]=> NULL
[“special_from_date”]=> NULL
[“special_to_date”]=> NULL
[“status”]=> string(1) “1”
[“do_not_use_category_id”]=> bool(true)
[“request_path”]=> string(10) “cba-3.html”
[“is_salable”]=> string(1) “1”
[“stock_item”]=> object(Varien_Object)#281 (7)
{
[“_data”:protected]=> array(1)
{
[“is_in_stock”]=> string(1) “1”
}
[“_hasDataChanges”:protected]=> bool(false)
[“_origData”:protected]=> NULL
[“_idFieldName”:protected]=> NULL
[“_isDeleted”:protected]=> bool(false)
[“_oldFieldsMap”:protected]=> array(0) { }
[“_syncFieldsMap”:protected]=> array(0) { }
}
}
[“_hasDataChanges”:protected]=> bool(true)
[“_origData”:protected]=> NULL
[“_idFieldName”:protected]=> string(9) “entity_id”
[“_isDeleted”:protected]=> bool(false)
[“_oldFieldsMap”:protected]=> array(0) { }
[“_syncFieldsMap”:protected]=> array(0) { }
}
*/
}

通过清心醉

Magento重写URL之重建索引

前几天写了个中文URL的插件,包括中文及其他字符允许

比如作者的网店  点击查看MAGENTO之URL

其实重写过后,重新刷新索引或者没用,这时候

用phpmyadmin进入magento数据库

找到core_url_rewrite表段,然后选择”清空”

之后重新在后台进行索引即可!

通过清心醉

Magento 开发实例七(模型Model)资源安装配置

本来先要写数据库的增删改查的,但如果懂PHP的朋友们看了前面的文章,相信都能想到办法了。所以先说说资源的配置问题,下文再写详细的增删改查。

作者提醒:永远不要相信国内搜索的数据,如果真的想认真学开发,好好GOOGLE看看国外正宗的开源教程,或者多看Magento的核心代码的编写规范以及插件的规范。作者就因为误信国内的数据,所以资源配置都得最后来弄。

正文开始:app.tar

Magento都是由配置文件做系统的支撑的。

读取modules所有的模块配置->

读取所有模块里的etc目录里的配置文件(比如config.xml)->

根据etc目录里的配置文件分配路由、资源等(需要的时候调用出来)->

然后就是MVC的访问操作了。就是作者前面几篇文章所说

 

其实,Magento当读取到etc/config.xml文件的时候,会查看有没有setup节点,如果有,执行安装,一般来说都是只执行一次,所以一会我们写的代码里要有中指。

 

首先增加安装配置:

<mymodule_setup>

<setup>

<module>Mage_Mymodule</module>

</setup>

<connection>

<use>core_setup</use>

</connection>

</mymodule_setup>

 

定义个module_setupsetup里直接使用module,表示直接使用模块里的mysql4-install.0.1.0.php文件

 

在这里作者要特别说明下,<setup><module>Mage_Mymodule</module></setup>

看这名字就知道,是项目名/模块(插件名)

至于<connection><use>core_setup</use></connection>

 

我们可以追踪到app/code/core/Mage/Core/Model/Resource/Setup文件

class Mage_Core_Model_Resource_Setup

{

const DEFAULT_SETUP_CONNECTION = ‘core_setup’;

const VERSION_COMPARE_EQUAL = 0;

const VERSION_COMPARE_LOWER = -1;

const VERSION_COMPARE_GREATER = 1;

 

const TYPE_DB_INSTALL = ‘install’;

const TYPE_DB_UPGRADE = ‘upgrade’;

const TYPE_DB_ROLLBACK = ‘rollback’;

const TYPE_DB_UNINSTALL = ‘uninstall’;

const TYPE_DATA_INSTALL = ‘data-install’;

const TYPE_DATA_UPGRADE = ‘data-upgrade’;

………

………

}

一般来说我们是需要配置个类继承该类来进行安装的,但由于作者在<setup>节点里直接使用的是模块的名称而不是<class>(比如配置的Blog就是class),这时候Magento会自动找到sql目录里的mysql4-install.0.1.0.php文件。

 

这要特别说明下的就是

Config.xml里有个配置文件的版本:

<modules>

<Mage_Mymodule>

<version>1.1.1</version>

</Mage_Mymodule>

</modules>

 

但我们mysql4-install.0.1.0文件,是不受那个版本的影响,如果需要默认安装,必须要有mysql4-install.0.1.0.php

 

Mage/Mymodule/sql/mymodule_setup/Mysql4-install.0.1.0.php

#目录里的mymodule_setup是我们前面定义的,可以看config.xml文件

#写入下面的

<?php

echo “类名是:”.get_class($this).”</br>”;

die(“exit”);

 

在这里我们一定要加个die();否则流程走了一次,就不走了哦!

而且后面我们执行有SQL的操作的时候,也加个DIE好点,看数据库里存在数据了再把DIE关闭.

这时候只要一刷新缓存:

2015-05-03

看到了吧,作者没定义任何类,系统自动使用核心的Setup类,就是作者前面说的app/code/core/Mage/Core/Model/Resource/Setup文件。

 

动起来吧:让我们用资源配置来安装数据表/字段并且写入数据:

首先我们要确保数据库里没有blog表哦

2015-05-03-01

修改mysql4-install-0.1.0.php

#注:请保留die(“exit”);

 

<?php

echo “类名是:”.get_class($this).”</br>”;

$installer=$this; #把类重新赋值,也可以直接使用$this,这不是强制的,但只是命名规范而已

$installer->startSetup(); #启动安装方法,可以在app/code/core/Mage/Core/Model/Resource/Setup里查看到

$table=$installer->getTable(‘mymodule/blog’);#添加表名称,如果有前缀,会自动增加哦.

$sql=”CREATE TABLE $table(id int primary key auto_increment,name varchar(128),phone varchar(128))”;

$intosql=”INSERT INTO $table(name,phone)VALUES(‘qingxinzui’,’13823819185′)”;

$installer->run($sql);

$installer->run(intosql);

$installer->endSetup();

die(“安装成功!”);

 

然后我们刷新下页面

 

类名是:Mage_Core_Model_Resource_Setup
安装成功!

 

看看MYSQL里吧

是不是已经有了你想要的表和字段内容了?

 

这时候我们就可以把die(“安装成功!”);取消掉了

同时删除magento数据库里的blog表和字段

重新走一遍。

 

如果你是和作者一样的走法你会发现,刷新后,直接返回主页了,其实是因为数据已经写入成功,已经没有DIE中止了。

这时候再看数据库里,blog表和字段内容都存在的。

资源配置安装完成。

 

如果我们需要升级

修改config.xml文件里的版本号

比如作者修改为1.1.2

然后创建个mysql4-upgrade-1.1.1-1.1.2.php

 

这有些会迷惑的,我们一开始安装的时候文件名是mysql4-install-0.1.0.php

怎么这是1.1.1

0.1.0是默认安装,当写入到数据库之后(可以在core_resource看)版本实际是以config.xml里的<version>写入的

所以我们要针对当前的<version>来进行命名升级

 

mysql4-upgrade-1.1.1-1.1.2.php文件写入:

 

<?php

echo “类名是:”.get_class($this).”</br>”;

$installer=$this; #把类重新赋值,也可以直接使用$this,这不是强制的,但只是命名规范而已

$installer->startSetup();

$table=$installer->getTable(‘mymodule/blog’);

$intosql=”INSERT INTO $table(name,phone)VALUES(‘qingxinzui1′,’13823819185’)”;

$installer->run($intosql);

$installer->endSetup();

die(“安装成功!”);

 

我们一样加个die看是否有写入

如果blog表里多一行数据,说明成功。

这时候我们在关闭DIE,让系统再执行一次,如此一来我们应该有3行数据了。

 

以后我们需要再进行升级模块(插件)

只需要看config.xml里的配置文件的<version>是多少

然后在模块(插件)的sql目录里创建对应的文件

mysql4-upgrade-<version>-新的<version>.php

如:mysql4-upgrade-1.1.1-1.1.2.php

这时候别忘记了把config.xml里的也修改成1.1.2

现在的版本你要不确定可以core_resource表里看。