私はDrupal 8をチェックアウトし、記事のノードIDに基づいてリンクを生成しようとします。Drupal 7では次のようになります。
$options = array('absolute' => TRUE);
$nid = 1; // Node ID
$url = url('node/' . $nid, $options);
これにより、正しいURLエイリアスを持つ絶対リンクが作成されます。
したがって、url()関数は非推奨のようです。 Drupal-8の方法は何ですか?私にとって本当に基本的な機能のように見えますが、有用な参照が見つかりませんでした。
\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)。
絶対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>
ノードオブジェクトを完全にロードした場合は、$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));
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オブジェクトです)
そのオブジェクトにはメソッドがあります:
次のように使用する必要があります。
{% 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 %}
ここにノード編集リンクに対する私の答えがあります。
$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();
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);