メインコンテンツに移動

メインナビゲーション

  • ホーム
  • サイトマップ
  • ビデオ
  • ご連絡

パンくず

  • ホーム
  • Drupal8 : モジュール(pathauto)の設定にエイリアスを翻訳しないように設定の注意

Drupal8 : モジュール(pathauto)の設定にエイリアスを翻訳しないように設定の注意

drupal
module usage

モジュール(pathauto)より記事のタイトルをURLに設定

  • モジュール(pathauto)より、記事にタイトル、サマリなどをURLにするエイリアスの作成ができる
    pathautoより記事のタイトルをURLに変換
  • 但し、このモジュールの設定にある「URL エイリアスを生成する前に翻訳を行う」をチェックすると、日本語の漢字がアルファベットに変換してしまうことになります
    エイリアスの翻訳結果

モジュール(pathauto)の各設定項目を注意

  • URLエイリアス作成関連の設定:ホーム » 管理 » 環境設定 » 検索とメタデータ » URL エイリアス » 設定
  • 設定項目に「URL エイリアスを生成する前に翻訳を行う」がありますが、これをチェックしないようしてください
    エイリアス作成前に翻訳する設定
     
drupal
SEO
module usage

記事のタイトルをURLに追加するのは有効なSEO対策の一つはとなります

  • 環境:Drupal7.54、Pathauto:7.x-1.3
  • モジュール(path:コアーに含まれている)一つ一つで記事のタイトルをURLに書き換えるのはできます
    • URLエイリアス管理画面(ホーム » 管理 » 環境設定 » 検索とメタデータ)で「エイリアス追加」リンクをクリックして、エイリアスURLの作成ができます
  • 記事などが作成する際に、自動的にURLエイリアス作成はPasthautoで行います
    • URLエイリアス管理画面(ホーム » 管理 » 環境設定 » 検索とメタデータ)の「パターン」タブで各種コンテンツのURLのエイリアス生成パターンを設定します(Tokenの利用が可能)
  • Pathautoのインストール、有効化、使用方法はビデオを参考してください

既存の記事のURLエイリアスをバッチで作成する必要があります

  • Pathautoインストール、有効化では、既存の記事のURLのエイリアスを作成するこはありません
  • URLエイリアス管理画面(ホーム » 管理 » 環境設定 » 検索とメタデータ)の「一括生成」タブで変換する必要なコンテンツタイプを選んでURLエイリアス作成バッチを起動します
Embedded thumbnail for Drupalのモジュール(Pathauto)でコンテンツタイプ別のURLパターン作成
drupal
customization
development
menu

hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。

実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。

ワイドカードが二つのパタン

パタン1: ワイドカードのみの

  • このパタンは比較的に単純で、分かりやすいです
  • URLにあるワイドカードの部分を直接に「page callback」関数に定義された関数の引数として渡します。
    function [my-module-name]_menu() {
      $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
        'title' => t('Facebook settings'),
        'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
        'page arguments' => array(1),               //パスの1番目(0から)を引数に
        ・・・・,
      );
    
    function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
      $user = user_load($uid);
      ・・・
    }
  • URIに指定された('page arugments'=>array(1))部分(%:uid)をページ定義関数(fboauth_user_form($uid))の引数にします

パタン2: ワイドカード+ファンクション名

  • このパタンは「Auto-loader Whitcarts」と言います
  • 例: $items['user/%user/fboauth'] = array( ・・・・・ )ではワイドカード'%'とファンクションuserと一緒に定義されています。
  • パスにあるワイドカードの部分を呼びされたページ定義関数に直接に渡すのではないです
  • ワイドカードを引数として、定義されたファンクションよりUserオブジェクトをロードして、ページ定義関数に渡します
  • 上記の例では、Drupalの固有関数(user)を利用していたため、独自にそのローダー関数の定義は不要となります。
  • 以下の例では、独自のローダー(custom_obj_load())を定義しています
  • スペシャルオブジェクトローダーの関数名は: ワードカードの後ろに定義したオブジェクト名(ここは: custom_obj)+'_load' => custom_obj_load($obj_id)となります
drupal
form
menu

Drupalのhook_menu()がカスタムページ作成時によく使用されます

  • Drupalのサイトにページを追加する手段はいろいろあります
  • モジュールでページを追加し、メニューをGUIで設定することができます
    • モジュール(Views)で検索結果をページとして表示することができます(主に表示系のページ、入力フォームはなし)
    • モジュール(Panels)で各種要素を集めてページを作成します(主に表示系のページ、入力フォームなし)
    • モジュール(Web Form)でコンタクト/アンケートなどのフォームページを作成(フォーム系、入力して、データをサーバーに送信して保存)
  • プログラミングでページを作成する場合にhook_menu()を実装する必要があります
    • hook_menu()を実装時に、いろいろなパラメーター設定が紛らわしくて、注意する必要があります
    • Drupalのhook_menuでのURL設定にワイドカードの利用
    • Drupalのhook_menuでのユーザーロール別アクセス権限管理
    • 今回は、「page callback」パラメーターを詳細を説明します

Drupalのhook_menu()のパラメーター「page callback」が直接にページの呼び出しと「drupal_get_form」を介してページを呼び出す

  • ここは、ajaxで動作するチェックボックスを例として上げます
    • チェックボックスをクリックすると、ajaxでサーバーと交信する
      function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
      
          global $user ;
      
          //  データがすでに存在するか否かのチェック
          $my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
          //   ajaxコールバック時に使用するパラメーター
          $form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
          $form_state['ch_vocabulary'] = $entity ;  
      
          // ajaxのチェックボックスフォーム定義
          $form['ch_voca_form']=array(
              '#type' => 'checkbox',
              '#disabled' => $user->uid == 0 ? true : false ,
              '#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
              '#default_value' => count($my_voca_result)>0 ? 1 : 0,
              '#ajax' => array(
                  'callback' => 'add_to_my_vocabulary_callback',
                  'wrapper' => 'ch-voca-check-op-'.$entity->vid,
                  'method' => 'replace',
                  'effect' => 'fade',
              ),
          );
          return $form ;
      }
      
      // ajaxのコールバック関数
      function add_to_my_vocabulary_in_views($form, $form_state){
      
          global $user;
      
          $entity = $form_state['ch_vocabulary'] ;
      
          // DBにデータがある場合に削除処理
          if( $form_state['has_my_voca_result'] ) {
              db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
              //  チェックボックスのラベルを「Add」に変更
              return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
          }
      
          // データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
          $my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
          $my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
          $my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
          ....   //各種フィールド、プロパティのセット
          $my_voca_wrapper->save();   // コピーされたデータの保存
      
          //  チェックボックスのラベルを「Remove」に変更
          return  t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
      }
  • hook_menu()が直接にajaxのチェックボックスフォームを呼び出す場合、ajaxの動作しません
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
            'title' => 'Copy and Remove',
            'page callback' => 'ajax_add_to_my_vocabulary',
            'page arguments' => array(array(), array(), 2) ,
            'access arguments' => array('create my vocabulary'),
      );
    }
    • ajaxのチェックボックスフォーム「ajax_add_to_my_vocabulary」が表示されますが、<form>要素がなくて、ajaxの動作はしません
      hook_menuが直接のフォームを呼び出す場合<form>要素が作成されずチェックボックスの動作はしない
  • hook_menu()が"drupal_get_form"を介してにajaxのチェックボックスフォームを呼び出す場合、ajaxの動作は正常です
    YOUR_MODULE_NAME_menu(){
      $items['your/path/%entity'] = array(
       'title' => 'Copy and Remove', 
       'page callback' => 'drupal_get_form', 
       'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
       'access arguments' => array('create my vocabulary'), 
      ); 
    }
    • 作成されたフォームに"<form>"要素およびajaxの要素が含まれているのでajaxが正常に動作します
      hook_menuが"drupal_get_form"を介してフォームを呼び出す場合に"<form>"要素が含まれてajaxが正常に動作

結論:表示系ページは直接に呼び出し、入力フォーム系は"drupal_get_form"を介して呼び出す

  • hook_menu()を実装時に、呼び出すページの性質によりページの呼び出す方法を決めます
    • 表示系ページ(データ更新なし)の場合は直接に呼び出せばよいです
    • 入力フォーム系のページは"drupal_get_form"を介して呼び出します
  • 表示系か、フォーム系かを区別せず、いつも"drupal_get_form"を介して呼び出しても構わないです
  • "drupal_get_form"がフォーム構築のプロセスが含まているので、フォームの要素構築するには必要です
    • drupa_get_form, drupal_prepare_form, drupal_retrieve_formの違い
    • これを使用する場合少し(どのぐらいは測定していないが)遅いかもしれないです
ホーム

古松

検索

Article Category

  • apache(7)
  • css(19)
  • drupal(295)
  • Electron(4)
  • html(34)
  • javascript(27)
  • laravel(4)
  • linux(5)
  • macOS(2)
  • mysql(13)
  • php(19)
  • python(4)
  • SEO(12)
  • video(72)
  • Visual Studio Code(4)
  • windows(13)
  • wordpress(32)