月度归档 2015年8月25日

通过清心醉

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的,所以权限不同,全部循环输出

 

通过清心醉

opencart开发|opencart建站|opencart分类强制添加seo-keyword

上文说了,opencart产品的大概流程是在product控制器里,add的方法中,引用

$this->model_catalog_product->addProduct($this->request->post);

opencart的分类也是差不多,在category控制器里的add方法中:

public function addCategory($data) 我们同样可以强制添加

SEO有两种方式:目录和文件

分类的权重比文件高,所以不能以.html做后缀,所以我们强制添加SEO-KEYWORD的时候,一定要注意.

而且分类一般都不会重复的,如果重复也很麻烦,可以读取重写记录记性判断,存在则使用”-“+ID的方式组合.

和修改产品一样,如果你能看懂作者前一篇文章,那么修改的方法你已经很清楚了.在这就不进行过多的介绍了.

通过清心醉

opencart开发|opencart建站|opencart产品强制添加seo-keyword

上文说了opencart的SEO优化,现在作者要讲的就是以产品的名称作为opencart产品的seo-keyword.

因为作者只考虑新增加产品即Add,所以晚点再看Edit修改产品是否会导致seo-keyword变更.

在product控制器里,add的方法中,引用了这么一句

$this->model_catalog_product->addProduct($this->request->post);

我们在对应的模型方法里找到该方法:

if (isset($data[‘keyword’])) {
$this->db->query(“INSERT INTO ” . DB_PREFIX . “url_alias SET query = ‘product_id=” . (int)$product_id . “‘, keyword = ‘” . $this->db->escape($data[‘keyword’]) . “‘”);
}

如果keyword的变量存在则写入重写URL,简单了.修改一下:

首先定义个私有成员:

private $name;

因为产品的名称是在数组$data[‘product_description’]里,而该方法里就有对该数组进行foreach循环

foreach ($data[‘product_description’] as $language_id => $value) {
$this->db->query(“INSERT INTO ” . DB_PREFIX . “product_description SET product_id = ‘” . (int)$product_id . “‘, language_id = ‘” . (int)$language_id . “‘, name = ‘” . $this->db->escape($value[‘name’]) . “‘, description = ‘” . $this->db->escape($value[‘description’]) . “‘, tag = ‘” . $this->db->escape($value[‘tag’]) . “‘, meta_title = ‘” . $this->db->escape($value[‘meta_title’]) . “‘, meta_description = ‘” . $this->db->escape($value[‘meta_description’]) . “‘, meta_keyword = ‘” . $this->db->escape($value[‘meta_keyword’]) . “‘”);
$tempname=$value[‘name’]; //提取产品名称
for ($i=0 ; $i<strlen($tempname); $i++)
{
if ($tempname[$i]==’ ‘||$tempname[$i]==’,’||$tempname[$i]==’,’||$tempname[$i]==’。’||$tempname[$i]==’ ‘)
{
//对上述字符进行转化。
$tempname[$i]=’-‘;
}
}
$this->name=$tempname.”-“.”$product_id”.”.html”;
}

然后修改过$data[‘keyword’]的操作

删除if (!isset($data[‘keyword’])) 判断,

直接写入MYSQL:
$this->db->query(“INSERT INTO ” . DB_PREFIX . “url_alias SET query = ‘product_id=” . (int)$product_id . “‘, keyword = ‘” . $this->db->escape($this->name) . “‘”);

这样不添加keyword的情况下,一样会生成对应的URL.

通过清心醉

opencart开发|opencart SEO优化

今天用opencart建站,发现opencart对SEO的问题,发现有3个是需要对opencart二次开发的.

第一:产品URL带有父类的URL,这样会出现过多的重复页;

第二:产品添加的时候如果SEOKEY不填写则会以动态形式写入;

第三:分类和第二个一样,必须填写SEOKEY.

耐何上传产品的小妹妹不懂啥叫SEO,对网站的认识也比较少,自己辛苦下,进行下开发:  请确保后台开启了高级URL Rewrite’s(伪静态)

先说第一点:针对opencart去除父类url的方法:

前台控制器里的common的核心里有个seo_url.php

foreach ($data as $key => $value) {
if (isset($data[‘route’])) {
if (($data[‘route’] == ‘product/product’ && $key == ‘product_id’) || (($data[‘route’] == ‘product/manufacturer/info’ || $data[‘route’] == ‘product/product’) && $key == ‘manufacturer_id’) || ($data[‘route’] == ‘information/information’ && $key == ‘information_id’)) {
$query = $this->db->query(“SELECT * FROM ” . DB_PREFIX . “url_alias WHERE `query` = ‘” . $this->db->escape($key . ‘=’ . (int)$value) . “‘”);

if ($query->num_rows && $query->row[‘keyword’]) {
//$url .= ‘/’ . $query->row[‘keyword’];
$url = ‘/’ . $query->row[‘keyword’];
unset($data[$key]);
}
} elseif ($key == ‘path’) {
$categories = explode(‘_’, $value);

foreach ($categories as $category) {
$query = $this->db->query(“SELECT * FROM ” . DB_PREFIX . “url_alias WHERE `query` = ‘category_id=” . (int)$category . “‘”);

if ($query->num_rows && $query->row[‘keyword’]) {
//$url .= ‘/’ . $query->row[‘keyword’];
$url = ‘/’ . $query->row[‘keyword’];
} else {
$url = ”;

break;
}
}

unset($data[$key]);
}
}
}

通过清心醉

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

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

通过清心醉

opencart开发|opencart修改产品的添加方式

opencart产品上传一样是麻烦.前文作者说了opencart修改分类的添加方式,产品也是一样的.

看返回的模板:$this->response->setOutput($this->load->view(‘catalog/product_form.tpl’, $data));

简单,模板文件直接暴露,找到后,修改需要的就OK了.

通过清心醉

opencart开发|opencart修改分类的添加方式

opencart的后台虽然很简结,但对于新手来说,上传产品添加分类会很矛盾

有些必须添加带有*号的放后面,不认真去熟悉就没办法好好的使用.

(关于这点magento做的比较好,使用了JS来红色显示未写入数据的行数)

首先是针对分类:

在category.php的分类控制器里:

不管是Edit还是Add的方法

最后都是使用了getForm()的方法来显示视图

而该方法最终使用了$this->response->setOutput($this->load->view(‘catalog/category_form.tpl’, $data));

这一块模板里就包含了新分类/修改分类等表单,直接找到自己需要的修改位置或者删除不需要的就OK了.

 

通过清心醉

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);
}

通过清心醉

opencart配置config.php文件

opencart的配置文件都是使用绝对的目录类型,如此以来修改opencart的域名或者换服务器之后,目录不同就要修改opencart的全部配置参数,优化方法当然很简单拉:

修改opencart根目录的config.php 和 admin/config.php文件

作者只拿出一种来,看不懂的请慢慢研究PHP

$dir=’F:\xampp\html’;
$host=’http://127.0.0.1:82/’;
/**
* 目录变量,注意结构
* WIN平台为\
* UNIX平台为/
*/
define(‘HTTP_SERVER’, $host);
define(‘HTTPS_SERVER’, $host);
//DIR
define(‘DIR_APPLICATION’, $dir.’/catalog/’);
define(‘DIR_SYSTEM’, $dir.’/system/’);
define(‘DIR_LANGUAGE’, $dir.’/catalog/language/’);
define(‘DIR_TEMPLATE’, $dir.’/catalog/view/theme/’);
define(‘DIR_CONFIG’,$dir. ‘/system/config/’);
define(‘DIR_IMAGE’, $dir.’/image/’);
define(‘DIR_CACHE’, $dir.’/system/cache/’);
define(‘DIR_DOWNLOAD’, $dir.’/system/download/’);
define(‘DIR_UPLOAD’, $dir.’/system/upload/’);
define(‘DIR_MODIFICATION’, $dir.’/system/modification/’);
define(‘DIR_LOGS’, $dir.’/system/logs/’);

通过清心醉

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();来获取