web-dev-qa-db-ja.com

Drupal 8のノードIDからリンクを作成する

私はDrupal 8をチェックアウトし、記事のノードIDに基づいてリンクを生成しようとします。Drupal 7では次のようになります。

$options = array('absolute' => TRUE);
$nid = 1; // Node ID
$url = url('node/' . $nid, $options);

これにより、正しいURLエイリアスを持つ絶対リンクが作成されます。

したがって、url()関数は非推奨のようです。 Drupal-8の方法は何ですか?私にとって本当に基本的な機能のように見えますが、有用な参照が見つかりませんでした。

18
Nicensin

\Drupal\Core\Url クラス、特に fromRoute 静的メソッドを使用する必要があります。 Drupal 8は、実際のURLパスと異なる名前を持つルートを使用します。あなたの場合、使用するルートは、ノードエンティティの正規ルートです:entity.node.canonical\Drupal\Core\Url::fromRoute()は文字列ではなくオブジェクトを返しますURLを文字列として取得するには、その toString() メソッドを呼び出す必要があります。

$options = ['absolute' => TRUE];
$url = \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 1], $options);
$url = $url->toString();

静的メソッドは簡単にテストできません。$url->toString()は初期化されたコンテナを必要とします。 url_generator サービスの UrlGeneratorInterface::generateFromRoute() への呼び出しで静的メソッドを置き換えることができます。

$options = ['absolute' => TRUE];
$url = $this->url_generator->generateFromRoute('entity.node.canonical', ['node' => 1], $options);
$url = $url->toString();

残念ながら、このメソッドは@internalとマークされているため、ユーザーコードで使用することは想定されていません(つまり、outside Drupal core)。

34
Pierre Buyle

絶対URLを作成:

$options = ['absolute' => TRUE];
$url_object = Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => $nid], $options);
// will output http://example.com/path-to-my-node

絶対リンクオブジェクトを作成します。

$options = ['absolute' => TRUE, 'attributes' => ['class' => 'this-class']];
$node_title = Drupal\Core\Render\Markup::create('<span>' . $node_title . '</span>');
$link_object = Drupal\Core\Link::createFromRoute($node_title, 'entity.node.canonical', ['node' => $nid], $options);
// will output <a href="http://example.com/path-to-my-node" class="this-class"><span>My Node's Title</span></a>
5
leymannx

ノードオブジェクトを完全にロードした場合は、$node->toUrl()を呼び出すだけで必要なURLを取得できます。デフォルトでは、ノードの正規URL(node/NID)を返しますが、Nodeエンティティ定義にリストされている他のURLを構築することは可能です( Drupal\node\Entity\Node.php)を参照してください。他のエンティティタイプについても同様です。

$options = ['absolute' => TRUE];
$view_link = Link::fromTextAndUrl(t('View'), $node->toUrl('canonical', $options));
$edit_link = Link::fromTextAndUrl(t('Edit'), $node->toUrl('edit-form', $options));
$delete_link = Link::fromTextAndUrl(t('Delete'), $node->toUrl('delete-form', $options));
3
ya.teck

hehe、これはフィールドからURLを取得するという点でたわごとです(そのURLを取得するTwigバージョン)

フィールド内のURL(およびタイトル)が必要な場合は、クラスのオブジェクトに到達する必要があります:Drupal\Core\Url

drupal_entity(Twig Tweaks)でノードを取得した場合、次のようになります:(「tab」をそのノードとして使用します)tab ['#node']。field_link

これにより、以下が使用できます。

tab ['#node']。field_link.uri-> the URI(URIはURLではありません)

tab ['#node']。field_link.title->タイトル

しかし、それで終わりではありません。

Drupal\link\Plugin\Field\FieldType\LinkItemにアクセスすることをお勧めします:

tab ['#node']。field_link.get(0)

tab ['#node']。field_link [0]

(両方とも同じことをする)

次に、最も興味深いものにアクセスできます。

tab ['#node']。field_tab_link [0] .getUrl()aDrupal\Core\Urlオブジェクト。

このオブジェクトには、そのノードテンプレートファイル内から次の行を使用してアクセスすることもできます。content.field_link [0] ['#url'](これもDrupal\Core\Urlオブジェクトです)

そのオブジェクトにはメソッドがあります:

  • isExternal()->外部へのリンク(つまり http://cnn.com
  • isRouted()->サイト内へのリンク
  • getRouteName()->ルートの名前
  • getRouteParameters()->値の配列を提供します。ここで(そのノードのIDを取得します)あなたは['node' => ID ]

次のように使用する必要があります。

{% set tabURL = tab['#node'].field_link[0].getUrl() %}

{% if tabURL.isExternal() %}
    {% set link_path = tab['#node'].field_tab_link.uri %}

{% elseif tabURL.isRouted() %}
    {% set link_path = path(tabURL.getRouteName(), tabURL.getRouteParameters()) %} {# /node/12 #}

{% endif %}
2
red777

ここにノード編集リンクに対する私の答えがあります。

$nodeInfo = $entity->get('nid')->getValue();
$nodeId = $nodeInfo[0]['value'];
$options = ['absolute' => TRUE];
$url = \Drupal\Core\Url::fromRoute('entity.node.edit_form', ['node' => $nodeId], $options);
$url = $url->toString();
1
Sawant Akshay

Drupal\Core\Url;クラスを使用する必要があります。

$url= Url::fromRoute('root', $route_parameters=array());

$link = \Drupal::l(t('label'), $url);  

例:

引数を渡す場合

$url = Url::fromRoute('test.page', $route_parameters = array('test' => 1));

さもないと

$url = Url::fromRoute('test.page');
$link = \Drupal::l(t('Label'), $url);
0