Как и большинство личностей, пользующихся VM, столкнулся с задачей требующей вывода определенного типа товара в категории.
Решений не нашел ни в одном ру\инг-нете. Но нашел интересное решение на одном украинском сайте. Собственно заюзал, но одно место в коде у меня не проходит, поэтому возможно с чей то помощью найдется фри решение для риторического вопроса.
---------------------------------------------------------------------------
-------------------- У меня: VM 1.1.8 | JM 1.5.22 --------------------
---------------------------------------------------------------------------
файл shop.browse.php
После
require_once(CLASSPATH . 'ps_product_attribute.php' );
$ps_product_attribute = new ps_product_attribute;
добавить
require_once(CLASSPATH . 'ps_product_type.php' );
$ps_product_type = new ps_product_type;
после
$product_s_desc = $db_browse->f("product_s_desc");
if( empty($product_s_desc) && $product_parent_id!=0 ) {
$product_s_desc = $dbp->f("product_s_desc"); // Use product_s_desc from Parent Product
}
добавить
$flerd_product_id = $db_browse->f("product_id");
$product_type = $ps_product_type->list_product_type_shopbrowse($flerd_product_id);
после
$products[$i]['product_s_desc'] = $product_s_desc;
добавить
$products[$i]['product_type'] = $product_type;
файл browser_2.php (или другой файл который используется для отображения списка товаров)
<?php echo $product_type ?>
файл ps_product_type
class vm_ps_product_type {
/* */
function list_product_type_shopbrowse($product_id) {
global $VM_LANG;
$tpl = vmTemplate::getInstance();
if (!$this->product_in_product_type($product_id)) {
return "";
}
// $dbag = product_types;
$dbag = new ps_DB;
// $dba = Attributes of product_type param, holds product_id and values assign to each param;
$dba = new ps_DB;
// $dbp = Parameters of product_type, holds definitions of each parameter, but not value ;
$dbp = new ps_DB;
$html ="";
$q = "SELECT * FROM #__{vm}_product_product_type_xref ";
$q .= "LEFT JOIN #__{vm}_product_type USING (product_type_id) ";
$q .= "WHERE product_id='$product_id' AND product_type_publish='Y' ";
$q .= "ORDER BY product_type_list_order";
$dbag->query( $q );
$q = "SELECT * FROM #__{vm}_product_type_parameter ";
$q .= "WHERE product_type_id=";
$pt = 0; //product_type counter;
//print_r($dbag->loadObjectList());
while ($dbag->next_record()) {
$product_type_id = $dbag->f("product_type_id");
$q2 = "SELECT * FROM #__{vm}_product_type_".$dbag->f("product_type_id");
$q2 .= " WHERE product_id='$product_id'";
$dbp->query($q2);
$dba->query($q.$dbag->f("product_type_id")." ORDER BY parameter_list_order");
$product_type_param = array();
while ($dba->next_record()) {
$obj_name = $dba->f("parameter_name");
// print_r($obj_name."n");
$product_type_param[$obj_name]["parameter_label"] = $dba->f("parameter_label");
$product_type_param[$obj_name]["parameter_description"] = $dba->f("parameter_description");
$product_type_param[$obj_name]["parameter_value"] = $dbp->f($dba->f("parameter_name"));
$product_type_param[$obj_name]["parameter_unit"] = $dba->f("parameter_unit");
}
$product_types[$product_type_id] = $product_type_param;
}
$tpl->set( 'product_types', $product_types );
$html .= $tpl->fetch( 'common/product_type_shopbrowse.tpl.php' );
return $html;
}
}
файл shop.browse в начало
class fmx_parametr{
var $product_types;
var $product_type_id;
var $product_type_parametr;
function __construct($product_types, $product_type_id, $product_type_parametr){
$this->product_types = $product_types;
$this->product_type_id = $product_type_id;
$this->product_type_parametr = $product_type_parametr;
}
function checktype($product_type_id){
if(array_key_exists($product_type_id, $this->product_types)){
return true;
}
return false;
}
function checkparametr(){
$product_type_id = $this->product_type_id;
$product_type_parametr = $this->product_type_parametr;
if($this->checktype($product_type_id)){
$params = $this->product_types[$product_type_id];
if(array_key_exists($product_type_parametr, $params)){
if($params[$product_type_parametr]['parameter_value'] != ""){
return true;
}
}
}
return false;
}
function val($name){
$product_type_id = $this->product_type_id;
$product_type_parametr = $this->product_type_parametr;
return $this->product_types[$product_type_id][$product_type_parametr]["parameter_".$name];
}
}
файл common/product_type_shopbrowse.tpl.php
<?php if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' ); ?>
<?php if( empty($product_types)) return;
$p1 = new fmx_parametr($product_types, 1, "otdelka");
$p2 = new fmx_parametr($product_types, 1, "razmer");
?>
<?php if($p2->checkparametr()):?>
<div> <?php echo $p2->val("label")?>: <?php echo $p2->val("value"); ?></div>
<?php endif; ?>
<?php if($p1->checkparametr()):?>
<div> <?php echo $p1->val("label")?>: <?php echo $p1->val("value"); ?></div>
<?php endif; ?>
-------------------------------------------------------------------------------------------------------
------------------------------- ТЕПЕРЬ МОЙ ОПЫТ ------------------------------------------------
-------------------------------------------------------------------------------------------------------
1. Для вывода категории использую таблицу однастрочную browse_listtable.tpl.php
2. Пункт где про файл ps_product_type и добавить class vm_ps_product_type...: У меня заработало только при вставке предлагаемого кода в заместо:
class vm_ps_product_type {
/**
* Validates the Input Parameters onBeforeProductTypeAdd
* @author Zdenek Dvorak
* @param array $d
* @return boolean
*/
function validate_add(&$d) {
global $VM_LANG;
if (empty($d["product_type_name"])) {
$GLOBALS['vmLogger']->err( $VM_LANG->_('VM_PRODUCT_TYPE_ERR_NAME') );
return False;
}
else {
return True;
}
}
3. Файла common/product_type_shopbrowse.tpl.php у меня не существует, поэтому собственно создал (права поставил..)
4. В browse_listtable.tpl.php добавил:
$data[$row][] = $product['product_type'];
после
if( _SHOW_PRICES && $auth['show_prices'] ) {
$data[$row][] = $product['product_price'];
}
5. В итоге у меня отлично отображаются все параметры типа товара.
6. Текст без изменений от первоисточника ( ссыль нужна ?? )
-------------------------------------------------------------------------------------------------------
------------------------------- СМЫСЛ ------------------------------------------------------------
-------------------------------------------------------------------------------------------------------
В предлагаемом коде понятно, что стандартный $product_type заменяется на $p1, $p2, что конечно очень заманчиво, но вот у меня например это не прокатывает. Поэтому надеюсь что местные золотые руки не из жопы не пройдут мимо поста и подведут к нему итог.