【问题标题】:Drupal 7 - Ubercart - Attributes in Views FieldsDrupal 7 - Ubercart - 视图字段中的属性
【发布时间】:2012-08-18 03:36:19
【问题描述】:

我的产品具有“颜色”和“强度”属性。我试图将这些属性下列出的选项作为视图字段,以便我可以将它们用作过滤器。例如,按颜色和强度排序。

我在谷歌上四处寻找,只能找到 Drupal 6 的模块。有人知道 7 的任何东西吗?

【问题讨论】:

    标签: attributes drupal-7 views drupal-modules ubercart


    【解决方案1】:

    就像在上一篇文章中所说的那样,我有 2 个属性“颜色”和“强度”,我需要匹配这些属性以进行精确的产品匹配,但 ubercart 没有任何东西,所以我将它们写入 URL 以作为变量获取语句1 和 2,因此例如一个同时选择了两个属性的 URL 如下所示:

    www.website.com/node/68?1=96&2=7

    有时会设置一个变量但不会设置另一个变量,因此我还必须使用 % 通配符来弥补这一点。这是该部分的代码

    //  Since PHP's serialize function sometimes serializes in the incorrect order,
    //  here we manually build the comparison key
    //  Additionally append the image links urls with provided strength/color data
    
    if( isset( $_REQUEST['1'] ) ) {
        $_1 = $_REQUEST['1'];
        if( $_1 !== '%' ) $url[] = "1=$_1";
    } else $_1 = '%';
    
    if( isset( $_REQUEST['2'] ) ) {
        $_2 = $_REQUEST['2'];
        if( $_2 !== '%' ) $url[] = "2=$_2";
    } else $_2 = '%';
    
    $combination = "a:2:{i:1;s:";
    $combination .= $_1 == '%' ? '%:"%";' : strlen($_1) . ':"' . $_1 . '";';
    $combination .= "i:2;s:";
    $combination .= $_2 == '%' ? '%:"%";' : strlen($_2) . ':"' . $_2 . '";';
    $combination .= '}';
    
    // if some products don't have a second attribute at all
    $combination2 = "a:1:{i:1;s:";
    $combination2 .= $_1 == '%' ? '%:"%"' : strlen($_1) . ':"' . $_1 . '";';
    $combination2 .= ';}';
    

    在下面我必须做一些额外的查询,比如是否设置了分类并检查是否设置了一些动态属性,这就是WHERE 存储在变量中的原因。坦率地说,他们只会让任何人感到困惑,所以我把他们排除在外。但是为了您的利益,您只需要查询它的下一部分。

    $where = "WHERE (pa.combination LIKE :pattern1 OR pa.combination LIKE :pattern2) AND s.stock IS NOT NULL";
    $comparison = array( ':pattern1' => $combination,
                         ':pattern2' => $combination2 );
    
    $filtered = db_query(
        "
            SELECT pa.nid, pa.model, pa.combination, n.title, p.sell_price, f.uri
            FROM {uc_product_adjustments} pa
            LEFT JOIN {node} n ON pa.nid = n.nid
            LEFT JOIN {uc_products} p ON pa.nid = p.nid
            LEFT JOIN {field_data_uc_product_image} i ON i.entity_type = 'node' AND i.entity_id = n.nid
            LEFT JOIN {file_managed} f ON f.fid = i.uc_product_image_fid
            LEFT JOIN {uc_product_stock} s ON pa.model = s.sku AND s.stock <> '0'
            $where
        ",
        $comparison
    );
    

    最后循环遍历结果并将它们存储在一个普通数组中

    foreach( $filtered as $i => $record ) {
        if( is_int( array_search( $record->nid, $nids ) ) ) continue;
        else {
            $nids[] = $record->nid;
            $result[] = $record;
        }
    }
    

    此代码检查与当前库存的任何属性值匹配的任何产品

    【讨论】:

      【解决方案2】:

      您可以看看这些沙盒项目:UC Views Attributes WorkUC attribute views

      我正在寻找类似的功能,因为似乎不可能将 UC 属性放入视图中。我现在无法测试自己,因为这个周末我有一个项目的截止日期,但我很高兴收到您的反馈。

      【讨论】:

      • 我最终自己编写了 SQL 查询。如果您想查看它的代码,请大声疾呼。
      • 我也在大喊大叫!
      猜你喜欢
      • 2011-07-07
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      • 2013-08-29
      • 2011-12-03
      • 2012-06-10
      • 2011-03-11
      相关资源
      最近更新 更多