it-swarm.asia

كيفية الحصول على عنوان URL صالح لحقل ارتباط من داخل Twig؟

لدي حقل ارتباط باسم field_my_link (اسم الجهاز).

ضمن قالب Twig يمكنني الحصول على قيمة URL للرابط بهذا:

{{ node.field_my_link.uri }}

إذا كان داخل عنوان URL للرابط يوجد external URL ، على سبيل المثال http://example.com إنه يعمل بشكل جيد.

ولكن ، إذا كان داخل عنوان URL للرابط ، هناك = داخلي عنوان URL ، على سبيل المثال "/node/11" ، أحصل على قيمة مثل هذه:

"internal:/node/11"

باستخدام البادئة "internal:".

كيف يمكنني الحصول على صالح URL؟

على سبيل المثال ، إذا كان عنوان URL للرابط هو "http://example.com" أريد "http://example.com" (هذا يعمل بالفعل) ، إذا كان عنوان URL للرابط هو "/node/11" ، فأريد عنوان URL النسبي "/node/11" ، إذا كان عنوان URL للرابط هو "<front>" أريد عنوان URL "/" ، إلخ.


تحرير

يمكنني الحصول على القيمة التي أريدها في دالة ما قبل المعالجة PHP ، باستخدام ما يلي:

$url = $variables['node']->get('field_my_link')->first()->getUrl();

كيف يمكنني الوصول إلى نفس القيمة داخل قالب Twig؟

أعلم أنه يمكنني القيام بذلك ضمن وظيفة المعالجة المسبقة:

$variables['my_url'] = $url;

ثم قم بالوصول إلى عنوان url في Twig باستخدام {{ my_url }} ، لكنني أتجنب كتابة وظيفة معالجة مسبقة في كل مرة يكون لدي حقل ارتباط.

34
Andrea

ستترجم PHP من التعديل الأخير إلى twig مثل هذا:

{{ node.field_my_link.0.url }}

يعمل هذا على هذا النحو ، 0 يُرجع العنصر الأول من قائمة عناصر الحقل ، ويحصل url على كائن url ولأن twig سيجعل هذا الكائن كسلسلة سيؤدي ذلك إلى استدعاء الأسلوب السحري toString () وإخراج عنوان url كقيمة سلسلة.

ما عليك سوى استخدام url ، لأن twig يبحث تلقائيًا عن الطريقة getxyz() إذا لم تكن هناك خاصية بهذا الاسم xyz.

42
4k4

يمكنك الوصول إلى عنصر مصفوفة التجسيد مباشرة ، في حالتك:

{{ node.field_my_link[0]['#url'] }}
19
Tim

يجب عليك تغطية كلتا الحالتين: عناوين URL الخارجية والداخلية.

دعنا أولاً نتحقق مما إذا كان عنوان URL خارجيًا ونطبعه ببساطة *.uri.

إذا كانت داخلية فعلينا أن ننقل اسم مسارها ومعلماتها من خلال وظيفة دروبال path($name, $parameters, $options) .

{% if node.field_link.0.url.external %}
  <a href="{{ node.field_link.uri }}">
    {{ node.field_link.title }}
  </a>
{% else %}
  <a href="{{ path(node.field_link.0.url.routeName, node.field_link.0.url.routeParameters) }}">
    {{ node.field_link.title }}
  </a>
{% endif %}
13
leymannx

كان علي القيام بذلك في حقل الارتباط في كتلة. نجح هذا:

{{ content.field_my_link[0]['#url']|render }}
9
cbovard

أعلم أنها مشاركة قديمة ولكن مع الإصدار الأخير من Drupal 8 (8.6) يمكنك عرض عنوان url مباشرة لكل من الإصدار (خارجي وداخلي:

node.field_link.0.url

وإذا كنت بحاجة إلى معرفة ما إذا كان الرابط خارجيًا أم لا (لحالتي كان الهدف) ، يمكنك استخدام ذلك:

node.field_link.0.url.external

مثال:

<a href="{{ node.field_link.0.url }}" title="Title" target="{{ node.field_link.0.url.external ? '_blank' : '_self' }}"
6
AnTSaSk

يمكنك أيضًا استخدام شيء مثل التالي ، كل هذا يتوقف على نوع الكائن الذي تستخرجه واسم الحقل ، وفي حالتي كانت فقرة مع حقل يسمى link_link (رابط_الحقول) وعمل ما يلي:

{{ paragraph.field_link.get(0).getUrl().toString() }}
3
Israel Morales

في الفقرة ، للحصول على رابط الرابط واسم الرابط -

<a href="{{ content.FIELD_LINK_NAME[0]['#url']|render }}">
   {{ content.FIELD_LINK_NAME[0]['#title']|render }}
</a>
1
Wasim Khan

أنا أعلم أنه فظيع ، ولكن إذا لم ينجح أي شيء آخر:

{{ link|replace({'internal:':''}) }}

موقفي: الوصول إلى حقل ارتباط عبر قالب طرق عرض تم تجاوزه: views-view-fields.html.twig

كان علي الحصول على المتغير من:

row._entity.field_machine_name.value.0.uri

(لقد تخليت عن محاولة استخدام المتغير fields ، يمكنك على ما يبدو الحصول على خاصية . content من ذلك ، ولكن ليس كثيرًا )

… .field_machine_name.value عبارة عن مصفوفة مسطحة ، والتي تحتوي فقط على مفتاح uri ، وليس url ، و لا يبدو أن الفلاتر المذكورة في إجابات أخرى (toString () ، وما إلى ذلك) تعمل هنا.

0
William Turrell