İki görüş birliği nasıl oluşturulur?


36

Bir kullanıcının düğümlerini ve yorumları "post date" ile sıralanmış bir sendika almaya çalışıyorum. Bu gönderi , D6 için sanal alan projelerine bağlantı veriyor ancak 7 için hiçbir şey yok.

Bu gönderi , hook_views_pre_execute () ve D6'da bir SQL UNION kullanma örneğine sahiptir. Bu D7 için 3 manzaralı çalışmıyor.

Ben merlinofchaos' geldi comment

Şimdi Drupal'ın yeni sorgu oluşturucusunu kullandığımız için, sorgu değiştirmek ya da değiştirmek zorunda olduğunuz bir SelectQuery nesnesidir. Daha fazla bilgi için Drupal 7'nin yeni veritabanı katmanına bakın.

Birisi, iki görüşü birleştirmek için bunun veya başka bir çözümün nasıl yapılacağına dair bir örneği var mı?


bu gerçek bir cevaptan çok bir fikirdir: kullanıcılara göre, hem düğümlere hem de yorumlara katılacak bir görünüm yaratabilmelisiniz. İlk denememde bunu yapamadım, çünkü görüşler kullanıcıdan kullanıcıdan komaya olan ilişkiyi sunmuyor. Ancak bunu değiştirmek kolay olmalı. (ya da sadece bir şeyi unuttum).
mojzis

Aşağıdaki cevapla aynı cevabı bence: kt iki bağlamsal filtre gerektirecektir (content.author = kullanıcı giriş yaptı VEYA yorum.author = kullanıcı giriş yaptı).
uwe

Ben öyle düşünmüyorum :) Ben düğümlere ve yorumlara katılan, kullanıcılara dayalı bir görünüm demek. ancak kullanıcı ile yorum arasındaki ilişkide bir sorun olduğunu hissediyorum - yorumları göstermeyi başaramadım.
mojzis

Sadece tahmin ediyorum ama aynı anda birden fazla varlık türünü indekslemek için searchapi kullanamazsınız? Bir kere ona sahipseniz ve her iki bölüm tarafından kullanılan bir alana sahipseniz, böyle bir manzara elde etmek için bunu kullanabilirsiniz.
Daniel Wehner

1
Drupal 7 için 'Views Unionize' adlı bir sanal alan projesi var, lütfen drupal.org/sandbox/jalama/1785294 adresini ziyaret edin ,
Anoop Joseph

Yanıtlar:


15

İşte çalışan ve test edilmiş bir örnek:

/**
 * Implements hook_views_pre_execute().
 */
function mymodule_views_pre_execute(view &$view) {
  if ($view->name == 'my_view') {
    $query1 = &$view->build_info['query'];

    // Basic setup of the second query.
    $query2 = db_select('another_table', 'at')
      ->condition('some_field', 0, '>')
      ->condition('some_other_field', 12345);

    // The number of fields (and their aliases) must match query1.
    // Get the details with:
    // dpm($query1->getFields());
    $query2->addField('at', 'some_field', 'alias1');
    $query2->addField('at', 'some_other_field', 'alias2');
    $query2->addField('at', 'some_other_field2', 'alias3');
    $query2->addField('at', 'some_other_field3', 'alias4');

    // Verify that queries are very similar.
    // dpq($query1);
    // dpq($query2);

    // Matrimony.
    $query1 = $query2->union($query1, 'UNION ALL');

    // Manual test.
    // dpm($query1->execute()->fetchAll());

  }
}

Bu, çoğu görünüm için çalışır. Ancak bazı stil eklentileri bu teknikle çalışmayan süslü şeyler yapabilir (Takvim modülü size bakıyorum).



2

SQL UNION'ları oluşturmak için db_query () işlevini kullandım ve daha sonra theme () işlevini kullanan çağrı cihazları da dahil olmak üzere bir tablo düzenine dönüştürdüm.

Kullanıcı için varsayılan görünümler gibi görünüyor. Diğer yararı da sorguyu çok fazla optimize edebilmemdi. "Arkadaşımın faaliyetlerini" gösteriyorum ve bunun için görünümler kullanırsanız arkadaşlarınızın bir listesini oluşturacak ve 50'den fazla veya 100 kayda sahipseniz çok yavaş olan bir SQL "IN" deyiminde kullanacaksınız.

Bu arkadaş listesini yalnızca son x günde siteye giriş yapmış olanlarla daraltabilirim.

Bu bir kod örneğidir:

  // Two queries are required (friendships can be represented in 2 ways in the
  // same table). No point making two db calls though so a UNION it is.

  // Build up the first query.
  $query = db_select('flag_friend', 'f')
    ->condition('f.uid', $account->uid)
    ->condition('u.login', $timestamp, '>');
  $query->addExpression('f.friend_uid', 'uid');
  $query->innerJoin('users', 'u', 'u.uid = f.friend_uid');

  // Build up the second query.
  $query2 = db_select('flag_friend', 'f')
    ->condition('f.friend_uid', $account->uid)
    ->condition('u.login', $timestamp, '>');
  $query2->addExpression('f.uid', 'uid');
  $query2->innerJoin('users', 'u', 'u.uid = f.uid');

  // Return the results of the UNIONed queries.
  return $query->union($query2)->execute()->fetchCol();

1

Gelecekte referans olarak, aynı tabloyu temel alan iki görüşü nasıl birleştirdim. Aynı ilkelere, aynı alandaki farklı tablolara dayanan görüşler için de geçerli olmalıdır.

Aşağıdaki durumda, format işlenen varlık olarak ayarlandığından sadece id seçilir. Ancak, alanlarla gidiyorsanız, aşağıdaki zaman damgası eklediğim için daha az alan içeren sorguya her zaman başka yapay alanlar ekleyebilirsiniz.

/**
 * Implements hook_views_pre_execute().
 */
function MY_MODULE_views_pre_execute(&$view) {
  if ($view->name == 'VIEW_1' && $view->current_display == 'DISPLAY_OF_VIEW_1') {

    $view2 = views_get_view('VIEW_2');
    $view2->build('DISPLAY_OF_VIEW_2');

    $view->build_info['query']
    ->fields('table_alias', array('timestamp'))
    ->union(
        $view2->build_info['query']
        ->range()
        ->fields('table_alias', array('timestamp'))
        ->orderBy('timestamp', 'DESC')
    );

    $view->build_info['count_query']
    ->union(
        $view2->build_info['count_query']
        ->range()
    );
  };
}

0

Bu satırlar boyunca bir şey hayal ediyorum:

/** 
* Implements hook_views_pre_execute().
*/     
function mymodule_views_pre_execute(&$view) {
  if ($view->name == 'myview') {
    $query = $view->query;
    $other_view = views_get_view('otherview');
    $other_query = $other_view->query;
    $query = $query->union($other_query);
    $view->query = $query;
  }
}

Yine de test etmedim.

Yardımcı olabilecek bazı bağlantılar:

http://api.drupal.org/api/drupal/includes!database!select.inc/function/SelectQueryInterface%3A%3Aunion/7

http://drupal.org/node/557318#comment-1991910


1
Bu tamamen işe yaramaz görünmüyor. $ view-> query, Views'ın sorguyu oluşturmak için kullandığı ara nesnedir. SelectQuery $ view-> build_info ['query'] şeklindedir. Buna göre düzenlediğinizde, "Ölümcül hata: Tanımsız yöntem SelectQuery :: render_pager () işlevini çağırın" hatasının ötesine geçemiyorum.
mpdonadio



Bunun işe yarayabilmesinin tek yolu, her iki görüşün de neredeyse tamamen aynı olması.
Dalin

0

Bir görünümü başka bir görünüme alan olarak yerleştirmenize izin veren Görüntüleme Alanı Görünümü adı verilen bir modüle rastladım . Bunu henüz kendim denemedim, ancak size yardımcı olabilir.


2
Görünümler Alan Görünümü gerçekten hem yorumlar hem de düğümler alabilse de, alanlar arasında sıralama yapmanın bir yolu olduğuna inanmıyorum.
Letharion,

0

EntityFieldQuery Arka Uç Görünümleri aynı anda birden fazla varlık türleri için destek sorgulama. Bu nedenle hem düğümleri hem de yorumları sorgulamak için kullanılabilir olması gerekir. Her iki varlık türü uidde yazarlarına bağlanmak için bir özellik kullanır, bu nedenle API düzeyinde EntityFieldQuery :: propertyCondition () , tek bir kullanıcıdan düğümleri ve yorumları seçmek için kullanılabilir olmalıdır. Sanırım arka uçtaki görünümler aynı özelliği sağlıyor.


onlar gibi görünüyor sadece sorgu birden kuruluşlara özelliği kaldırıldı: drupal.org/node/1564740
uwe

0

Farklı bir yaklaşım , düğümlerin ve yorumların yayınlarını oluşturmak (URL'deki kullanıcı tanımlayıcısının bağlamsal bir filtresini kullanarak) ve ardından iki yayınları yeni bir yayında birleştirin ve bunu posta tarihine göre görüntüleyin.


-2

Kullanılan Global: PHP alanları? Teybi birleştirmek için bunları bir araya getirerek, ikisini birleştiren bir Görünümü kullanabilirsiniz.

İçeriği olan bir İçerik Görünümü oluşturun: Başlık ve İçerik: Yorumlar alanları (ekrandan hariç).

Hangisinin daha yeni olduğunu, en son güncelleme tarihini veya kullanıcı tarafından son yorum tarihini hesaplayan bir PHP alanı ekleyin ve alanın değerini o tarihe ayarlayın. Bu alanı bir sıralama koşulu olarak ekleyin.

Yoruma veya düğüme bağlantı veren benzer bir alan ekleyin.

Bana iyi geliyor!


ilginç fikir. İki bağlamsal filtre gerektirir (content.author = kullanıcı girişi yaptı VEYA yorum.author = kullanıcı girişi yaptı).
uwe

Bu konuda epik bir iyileşme elde etmek umuduyla ...;)
Johnathan Elmore

2
Bu yaklaşımın getirdiği performans korkutucu olurdu. Gerçekleştirilen veri tabanı sorgularının sayısı astronomik duruma düşebilir.
Rider_X
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.