Bagaimana saya menggunakan hook_views_query_alter ()?

20

Mengikuti apa yang dilaporkan dalam dokumentasi untuk hook_views_query_alter () , saya membuat file bernama alterform.views.incdan memasukkannya ke dalam modul yang diaktifkan yang disebut alterform. Saya menambahkan kode berikut dalam. alterform.views.incTapi itu tidak berhasil.

function alterform_views_query_alter(&$view, &$query) {
  switch($view->name) {
    case 'myViewName':  
      echo 'test test'; // test       
      $query->orderby[0] = "FIELD(node.type, 'story', 'page', 'productTypeC', 'productTypeD') ASC";
      $query->orderby[1] = "node_title ASC";
      break;
  }
}

mengapa itu tidak menghasilkan "tes tes"? Apa yang salah dengan kode saya?

masih belum ada hasil tes dan tampilan. apa yang salah dengan kode saya? Terima kasih

menikmati hidup
sumber
Tidak pernah menggunakannya, tetapi apakah mungkin Anda harus memasukkan / memerlukan bagian alterform.views.incdalam modul Anda dan Anda tidak melakukannya?
nonsenz
saya telah memasukkan alterform.views.inc di file modul alterform saya
enjoylife
bagaimana memasukkan / memerlukan alterform.views.inc di dalam modul Anda? terima kasih
selamat menikmati

Jawaban:

22

Kanan. Untuk "melakukan" apa pun dengan tampilan dalam modul, Anda harus mengimplementasikan hook_views_api. Tanpa ini, modul Anda tidak akan dikenali oleh Views, at all, ever (AFAIK).

Silakan tambahkan yang berikut ini ke kode modul Anda:

/**
 * Implementation of hook_views_api().
 */
function alterform_views_api() { // your module name into hook_views_api
  return array(
    'api' => 2,
    // might not need the line below, but in any case, the last arg is the name of your module
    'path' => drupal_get_path('module', 'alterform'),
  );
}

Ini harus memperbaikinya sehingga modul Anda setidaknya dikenali, maka Anda dapat mulai men-debug-nya :)

Cara yang baik untuk mulai men-debug tampilan (yaitu langkah bayi) adalah meluruskannya dpm($view);di awal fungsi tampilan yang Anda laksanakan. Dalam kebanyakan kasus, itu akan membuang info ke layar yang akan membantu Anda melihat di mana Anda berada. Sarankan melakukan ini dengan devel.module diinstal / dihidupkan.

Sunting: Ini mengasumsikan Tampilan 2 dan Drupal 6. Anda sebaiknya bertanya apakah itu bukan senjata pilihan Anda.

NikLP
sumber
Ini berfungsi dengan baik :)
kalidasan
4

Anda dapat menguji 3 hal:

  • kosongkan cache Anda
  • unduh dan aktifkan Devel ,
  • gunakan dpm()sebagai gantiecho()
  • tes $view->namedengandpm()
Manu
sumber
saya telah membersihkan cache, dan echo $ view-> name. tetapi masih belum ada keluaran tentang nama tampilan di blok tampilan.
enjoylife
aneh. Saya biasanya tidak bergantung pada gema ... Ngomong-ngomong saya perhatikan ada sedikit kesalahan dalam kode Anda, ada "}" yang seharusnya tidak menjadi ... kesalahan tempel?
Manu
tetapi ketika saya print_r ($ views) masih belum ada output tentang tit di blok views.
enjoylife
print_r ($ views) tidak boleh mencetak apa pun kecuali print_r ($ view) ya. Apakah Anda meletakkan ini sebelum beralih?
Manu
3

Anda perlu meletakkan file yourmodule.views.inc di direktori modul, bukan di dalam subdirektori, atau Views tidak dapat mengambilnya secara otomatis.

seperti shaneonabike
sumber
2
    $query->orderby[0] = "FIELD(node.type, 'story', 'page', 'productTypeC', 'productTypeD') ASC";

seharusnya

    $query->orderby[0]['field'] = "field_name ASC";
berjemur
sumber
1

jika Anda menggunakan direktori untukmodule.views.inc, Anda perlu menyebutkan path-nya di file module, menggunakan kode yang mirip dengan yang berikut:

    'path' => drupal_get_path('module', 'mymodule') . '/subdirectory/';
berjemur
sumber