2016-04-29 15 views
0

PHPコード形式を使用してブロック内にカスタムコードを追加して、そのブロックを特定のページに表示しました。私はDevelのPHPページでうまく動作するすべてのものをチェックしましたが、内容はページに表示されません。次のコードは、宛先ノードのフィールド値を取得します。DrupalでPHPコード形式を使用してカスタムブロックのコンテンツを表示する方法8

$refer = $_SERVER[HTTP_REFERER]; 
    $parsed = parse_url($refer); 
    $alias = array_pop($parsed); 
    $dst = \Drupal::service('path.alias_manager')->getPathByAlias($alias , $langcode); 
    $nid = array_pop(explode('/', $dst)); 
    $dest_node = node_load($nid); 

    $body = $dest_node->get('body')->getValue(); 
    print $body; //have tried other printing methods also but invain 

これは質問を明確にします。 ありがとう

答えて

0

Develでは正常に動作しますか?私はちょうどあなたのコードを実行しようとしましたが、この行きました:

$body = $dest_node->get('body')->getValue(); 

戻りアレイ

代わりにこれを使用してみてください:

$node = \Drupal::service('current_route_match')->getParameter('node'); 

全体:すべての

$body = $dest_node->body->value; 
+0

毎回動作するのではなく、何度か動作します。 – Zubi

+0

@ Zubiこれはノードのページ(すなわち、 "node/123"またはエイリアス)でのみ機能します。つまり、これらのノードのページでいつか正確に動作するということです(一部のノードでは動作し、一部のノードでは動作しません)。ページが一種のビューであれば、明らかに機能しません。 – tulvit

+0

この行のエラーを示すログを確認しました '$ nid = array_pop(explode( '/'、$ dst));' 厳密な警告:変数はeval()で参照渡しする必要があります – Zubi

0

まず、コードのあなたの最初のブロック(現在のノードを取得)はちょうど1行に置き換えることができますブロックは、以下のように変更することができる。

if ($node = \Drupal::service('current_route_match')->getParameter('node')) { 
    print $node->body->value; 
} 

PS PHPテキストフィルタを使うのは間違いです。必要なブロックを提供する独自のカスタムモジュールを簡単に作成できます。このファイルMyBlock.phpmy_moduleという名前のカスタムモジュール内/src/Plugin/Block/ディレクトリに配置する必要があります

/** 
* @file 
* Contains \Drupal\my_module\Plugin\Block\MyBlock. 
*/ 

namespace Drupal\my_module\Plugin\Block; 

use Drupal\Core\Block\BlockBase; 

/** 
* Provides my super block. 
* 
* @Block(
* id = "my_module_block", 
* admin_label = @Translation("My Block"), 
* category = @Translation("My Module"), 
*) 
*/ 

class MyBlock extends BlockBase{ 

    /** 
    * Builds and returns the renderable array for this block plugin. 
    * 
    * @return array 
    * A renderable array representing the content of the block. 
    * 
    * @see \Drupal\block\BlockViewBuilder 
    */ 
    public function build() { 
    if ($node = \Drupal::service('current_route_match')->getParameter('node')) { 
     return [ '#markup' => $node->body->value ]; 
    } 
    } 
} 

:最も簡単なブロックプラグインは、数行のコードが必要です。