drupal7學習筆記—–(持續更新中…)

awen1983發表於2019-05-10

最近折騰了一下drupal7,大概的瞭解了一下,頭昏那個腦漲啊。找網上的介紹倒是一大堆,但大多是e文的,中文的一半都是一知半解的敘述。 與痛苦和糾結中總結了一些經驗,幾記錄下來備用。具體如下:

一  安裝相關

  1 安裝drupal超時(主要是安裝中文翻譯的時候)

  方法一:
  修改php.ini檔案:memory_limit = 256M (依實際情況設定)
  方法二:
  開啟sitesdefaultsettings.php檔案,在最後增加以下兩行:
  ini_set(‘memory_limit’, ’256M’); //加大php的記憶體 也可以在php.ini中設定
  ini_set(‘max_execution_time’, 2000); //加大頁面執行時間 php.ini中的預設值是30 (秒)

二  主題相關

  1 主題出問題後強制恢復系統預設主題

UPDATE system SET status = 0 WHERE type = `theme`; 
UPDATE system SET status=1 WHERE type=`theme` AND (name = `seven` OR name = `bartik`); 
TRUNCATE cache; 
TRUNCATE cache_block; 
TRUNCATE cache_bootstrap; 
TRUNCATE cache_field; 
TRUNCATE cache_filter; 
TRUNCATE cache_form; 
TRUNCATE cache_image; 
TRUNCATE cache_menu; 
TRUNCATE cache_path; 
TRUNCATE cache_page; 
TRUNCATE cache_update; 
TRUNCATE cache_views; 
TRUNCATE cache_views_data;

  2 獲取當前頁的模版檔案列表

  在你使用的當前主題資料夾下有個template.php,在其中的xxxxx_process_page方法程式碼塊中(沒有就建立)增加一下程式碼:

var_dump($variables[`theme_hook_suggestions`]);

  這樣你隨便開啟某個頁面就會在頁首列印出該頁獲取的模版檔案的順序以及模版檔名稱,一目瞭然,注意系統載入的優先順序順序是倒序的。而不用去翻n多文件,實驗n次,糾結n次了。。。,明眼人可能看出來了,變數列表中的theme_hook_suggestions就是模版資訊陣列。你其實可以隨便修改定製的。。。呃,慎重,最好按照後面一個小結的方法來增加。

  3 自定義模板檔名稱

  有時候你想根據特定的格式來獲取模版檔案。舉個例子,如果你想根據內容型別來制定模版,那麼你可以同樣在template.php中xxxxx_process_page方法中增加一下程式碼

 //增加模版選擇器
if (!empty($variables[`node`])) {
    $node = $variables[`node`];
    $variables[`theme_hook_suggestions`][] = `page__type__` . $node->type;
}

  這樣當drupal開啟某內容的頁面時,將優先使用你定義的模版檔案,是不是貌似很吊?當然更改之後記得清空系統自己的快取,要不然它依然會載入之前預設的模板,只需執行一下:

delete from cache

  

  另外值得一提的是HOOK的複寫,上面的xxxxx_process_page其實就是 hook_process_HOOK的複寫,而drupal載入這些HOOK的順序如下:

     template_preprocess()
        template_preprocess_hello()
        helloModule_preprocess()
        helloModule_preprocess_hello()
        phptemplate_preprocess()
        phptemplate_preprocess_hello()
        helloTheme_preprocess()
        helloTheme_preprocess_hello()
        template_process()
  所以你可以自己斟酌在哪裡複寫,當然你也可以集中管理,例如我的專案中我是這麼寫的:
function diantang_process(&$variables,$hook){
  $node = $variables[`node`];
  switch ($hook) {
    case `comment`:
      $variables[`theme_hook_suggestions`][]=`comment__`.$node->type;
      break;
    case `page`:
      if (!empty($variables[`node`])){
        $variables[`theme_hook_suggestions`][] = `page__type__` . $node->type;
      }
    break;
    default:
      break;
  }
}

 

  4 動態改變當前頁面所對應的選單項

  依然是在xxxxx_process_page中增加以下程式碼:

if (!empty($variables[`node`])) {
    $node = $variables[`node`];
    //所有的 `selftype` 型別的node的menu設定成為其對應的tag的選單項
    switch ($variables[`node`]->type) {
      case `selftype`:
        $tid=$variables[`node`]->field_tags_news[`und`][0][`tid`];
        menu_set_active_item(`taxonomy/term/`.$tid);
      break;
    }
  }

  這樣,如果當前頁面的內容型別是selftype的話,那麼當前啟用的選單就將是該內容型別對應的標籤。其中menu_set_active_item中設定的是 選單項的系統地址。

三 一些常用的方法

  1 獲取,node中自定義的欄位
  $node= node_load(12);
  $items = field_get_items(`node`, $node, `field_image`);
  2 獲取node中自定義欄位的可以render顯示的陣列:
  $node= node_load(12);
  $items = field_get_items(`node`, $node, `field_image`);
  $output = field_view_value(`node`, $node, `field_image`, $items[0]);
  print render($output);
  3 獲取node中某檔案欄位(圖片,媒體)的地址
  $node= node_load(12);
  $items = field_get_items(`node`, $node, `field_image`);
  $url= file_create_url($items[0][“uri”])
  4 drupal 中現在已經內建了jquery和jqueryui模組,但是jquery至增加了core,比如我們要加一個tabs;
  drupal_add_library(`system`, `ui.tabs`);
  drupal_add_js(`jQuery(document).ready(function(){jQuery( “#mytabs” ).tabs();});`, `inline`);

 

  5 drupal中常用的模組api
  // node
  node_load($nid = NULL, $vid = NULL, $reset = FALSE);
  node_load_multiple($nids = array(), $conditions = array(), $reset = FALSE);

 

  // user
  user_load($uid, $reset = FALSE);
  user_load_multiple($uids = array(), $conditions = array(), $reset = FALSE);

 

  // menu tree
  menu_tree_all_data($menu_name, $link = NULL, $max_depth = NULL);
  menu_tree_page_data($menu_name, $max_depth = NULL, $only_active_trail = FALSE);

 

  // term
  taxonomy_term_load($tid) : object
  taxonomy_term_load_multiple($tids = array(), $conditions = array()) : array
  taxonomy_get_tree($vid, $parent = 0, $max_depth = NULL, $load_entities = FALSE) : array

 

  // block
  block_load($module, $delta);

四  一些資料庫操作

       // select
    db_select(`node`, `n`)
        ->extend(`PagerDefault`)->limit(5)
        ->fields(`n`);
    $statement->fetchField();
    
    db_query_range(`SELECT n.nid, n.title, n.created
      FROM {node} n WHERE n.uid = :uid`, 0, 10, array(`:uid` => $uid));

    // insert
    $fields = array(`nid` => 1, `title` => `my title`, `body` => `my body`);
    db_insert(`node`)->fields($fields)->execute();

    // update
    db_update(`example`)
      ->condition(`id`, $id)
      ->fields(array(`field2` => 10))
      ->execute();

    // select
    $query = db_select(`comment`, `c`)
      ->fields(`c`, array(`subject`, `name`))
      ->fields(`n`, array(`title`))
      ->extend(`PagerDefault`)->limit(5)
      ->condition(`n.type`, array(`article`), `IN`)
      ->orderBy(`c.cid`, `DESC`);
    $query->join(`node`, `n`, `n.nid = c.nid`);
    $statement = $query->execute();

    $query = db_select(`node`, `n`)->fields(`n`, array(`title`))->distinct();
    $query->join(`taxonomy_index`, `t`, `t.nid = n.nid`);
    $or = db_or()->condition(`n.uid`, $authorId)->condition(`t.tid`, $cats, `IN`);
    $query->condition($or)->execute();

    // fetch
    foreach ($query->execute() as $object) {
      echo $object->name;
    }    

 

 

 

 


相關文章