登录 注册

登录

问题 告诉你如何将VM的关联商品的单向关联改成双向关联

更多
2009年12月17日 14:57 #1 作者: 南荒
在使用JOOMLA的Virtuemart的过程中,发现在添加产品时的关联商品有一个问题。关联只是单向的,那样就产生一个问题,如果在后期大量添加新产品时,只能让新的关联老的,如果让旧有商品同时也关联该新产品,必须去这个产品进行重新編辑,如果产品过多,这无疑工作量是非常大的。

如果能让新产品添加时能让老产品自动相互关联,这就要更改代码来实现,先查看了数据库VM的关联商品的表里面的关联结构,是一个商品的ID对应关联商品用|相隔。如果我在添加新产品时,添加进新产品的ID的相关联商品后,然后用将他对应的商品ID一个一个的进这个数据库进行检索。如果检索不到,插进关联。如果检索得到

则将其对应的产品ID取出再进行确认,如果已经存在,刚放过(虽然不可能存在,但还是检测一下好),如果不存在,则在尾部添加此ID,替换之前的数据。

找到administrator/components/com_virtuemart/class/ps_product.php打开,找到370行:

if( !empty($d["related_products"])) {
/* Insert Pipe separated Related Product IDs */
$related_products = vmGet( $d, "related_products" );
$q  = "INSERT INTO #__{vm}_product_relations ";
$q .= "(product_id, related_products) ";
$q .= "VALUES ('".$d["product_id"]."','".$db->getEscaped($related_products)."')";
$db->setQuery($q); $db->query();
$related_products_a = explode('|',$related_products);
$db3 =new ps_DB;
foreach ($related_products_a as $related_products_b){
$db->query("SELECT related_products FROM #__{vm}_product_relations WHERE product_id='$related_products_b'");
if($db->next_record()) {
$related_products_c = explode("|", $db->f("related_products"));
if (!in_array($d["product_id"],$related_products_c)){
$related_products_c[]=$d["product_id"];
$related_products_d=implode('|',$related_products_c);
$q  = "REPLACE INTO #__{vm}_product_relations (product_id, related_products)";
$q .= " VALUES( '".$related_products_b."', '$related_products_d') ";
$db3->query($q);
}
}else{
$q  = "INSERT INTO #__{vm}_product_relations ";
$q .= "(product_id, related_products) ";
$q .= "VALUES ('".$related_products_b."','".$db->getEscaped($d["product_id"])."')";
$db3->setQuery($q); $db3->query();
}
}

}

将以上语句代替之前的代码。便可实现关联商品的相互关联

nhuang.com
zhujianbo.com
QQ群:19675428
新浪微博:weibo.cn/388580
循着真理的脚步,追寻,亦不必停留

登录 或者   注册一个会员帐号 来参与讨论

更多
2009年12月17日 21:16 #2 作者: Joomla之门
楼主所谓的“关联”是什么意思?手动链接?还是自动链接?自动链接的根据是什么?是同类(例如“苹果”链接到“梨”),同质(“螺丝刀”链接到金属的“菜刀”),还是价格(100元以内)?

我觉得修改源代码有一个缺陷是:当用户下次升级 VM 时,可能会很麻烦。

能否单独开发一个模块,名为“相关商品”(Related Product),模块参数中,可以设置按价格范围关联,或者按厂家关联,或者按类别关联,或者按关键词(Meta 关键词)来关联。

将该模块发布到 VM 的每一个页面,应该可以实现大范围关联,从而给买家提供更多的购买机会。

付费下载 Joomla 3 扩展汉化版: 我要付费支持 Joomla 之门!

登录 或者   注册一个会员帐号 来参与讨论

更多
2009年12月17日 22:37 #3 作者: 南荒
因为本身VM的关联商品会显示在产品的页面的页脚 。这个是不需要设置的,每个产品都对应关联商品。这样会显示在该商品的页脚 ,但是一直是单向的,每个商品都需要手动设置。如果是添加新的产品,关联到老的产品倒没有问题,但是如果让那些老的产品关联到新添的商品却要再次手工确认。这段代码修改就解决这样的问题。这个没法通过插件来实现,只能能过修改代码来实现。

nhuang.com
zhujianbo.com
QQ群:19675428
新浪微博:weibo.cn/388580
循着真理的脚步,追寻,亦不必停留

登录 或者   注册一个会员帐号 来参与讨论

更多
2009年12月18日 00:07 #4 作者: Joomla之门
感谢 南荒 的解答。看来 VM 这个功能还有很大缺陷。希望他们在 VirtueMart v1.5 版本中能改进。

你的方法也可以提交给他们啊,这样全世界的用户都能享用 南荒 修改的新功能了。谢谢!

付费下载 Joomla 3 扩展汉化版: 我要付费支持 Joomla 之门!

登录 或者   注册一个会员帐号 来参与讨论