जांचें कि उपयोगकर्ता किसी थीम में लॉग-इन है या नहीं


16

Drupal 7 में हम केवल यह जांच सकते हैं कि वर्तमान उपयोगकर्ता किसी थीम में लॉग-इन $GLOBAL['user']->uidकर रहा है या नहीं user_is_logged_in()

यदि कोई उपयोगकर्ता Drupal 8 में पेज टेम्पलेट में लॉग-इन कर रहा है, तो मैं कैसे जांच सकता हूं?

एक समाधान को मैन्युअल रूप से जांचना है hook_preprocess_page(), लेकिन चूंकि यह बहुत लोकप्रिय है, मुझे लगता है कि ड्रुपल ट्विग थीम इंजन के लिए डिफ़ॉल्ट रूप से कुछ प्रदान करता है।

जवाबों:


26

यदि आप केवल वर्तमान उपयोगकर्ता की जांच करने के लिए लॉग-इन कर रहे हैं, तो आप उपयोग कर सकते हैं $variables['logged_in'], जो आम तौर पर सभी टेम्पलेट फ़ाइलों में उपलब्ध है।

उदाहरण के लिए, mark.html.twig फ़ाइल निम्न कोड का उपयोग करती है, हालांकि केवल प्रलेखित चर है status

{% if logged_in %}
  {% if status is constant('MARK_NEW') %}
    <span class="marker">{{ 'New'|t }}</span>
  {% elseif status is constant('MARK_UPDATED') %}
    <span class="marker">{{ 'Updated'|t }}</span>
  {% endif %}
{% endif %}

चर को स्पष्ट रूप से अन्य टेम्पलेट फाइलों, जैसे कि html.html.twig , page.html.twig , और node.html.twig में प्रलेखित किया गया है

चर सभी टेम्प्लेट फ़ाइलों में उपलब्ध है, क्योंकि यह _template_preprocess_default_variables()उस इनवोक user_template_preprocess_default_variables_alter()(एक कार्यान्वयन hook_template_preprocess_default_variables_alter()) में आरंभिक है , जिसमें निम्नलिखित कोड शामिल हैं।

  $user = \Drupal::currentUser();

  $variables['user'] = clone $user;
  // Remove password and session IDs, since themes should not need nor see them.
  unset($variables['user']->pass, $variables['user']->sid, $variables['user']->ssid);

  $variables['is_admin'] = $user->hasPermission('access administration pages');
  $variables['logged_in'] = $user->isAuthenticated();

_template_preprocess_default_variables()द्वारा बुलाया जाता है template_preprocess(), जो कि थीम के रूप में कार्यान्वित थीम हुक के लिए कहा जाता है; यह गारंटी देता है कि चर सभी टेम्प्लेट फ़ाइलों में उपलब्ध है।

ध्यान रखें कि मैक्रोज़ की वर्तमान टेम्प्लेट चर तक पहुंच नहीं है , इसलिए logged_inमैक्रो के कोड में एक्सेस करने की कोशिश का कोई प्रभाव नहीं पड़ेगा।
Drupal कोर मॉड्यूल से उपयोग की जाने वाली टेम्पलेट फ़ाइलों के बीच, मैक्रो का उपयोग करने वाले हैं:

  • menu.html.twig

    {% macro menu_links(items, attributes, menu_level) %}
      {% import _self as menus %}
      {% if items %}
        {% if menu_level == 0 %}
          <ul{{ attributes }}>
        {% else %}
          <ul>
        {% endif %}
        {% for item in items %}
          <li{{ item.attributes }}>
            {{ link(item.title, item.url) }}
            {% if item.below %}
              {{ menus.menu_links(item.below, attributes, menu_level + 1) }}
            {% endif %}
          </li>
        {% endfor %}
        </ul>
      {% endif %}
    {% endmacro %}
  • पुस्तक-tree.html.twig

    {% macro book_links(items, attributes, menu_level) %}
      {% import _self as book_tree %}
      {% if items %}
        {% if menu_level == 0 %}
          <ul{{ attributes }}>
        {% else %}
          <ul>
        {% endif %}
        {% for item in items %}
          <li{{ item.attributes }}>
            {{ link(item.title, item.url) }}
            {% if item.below %}
              {{ book_tree.book_links(item.below, attributes, menu_level + 1) }}
            {% endif %}
          </li>
        {% endfor %}
        </ul>
      {% endif %}
    {% endmacro %}
  • मेनू - toolbar.html.twig

    {% macro menu_links(items, attributes, menu_level) %}
      {% import _self as menus %}
      {% if items %}
        {% if menu_level == 0 %}
          <ul{{ attributes.addClass('toolbar-menu') }}>
        {% else %}
          <ul class="toolbar-menu">
        {% endif %}
        {% for item in items %}
          {%
            set classes = [
              'menu-item',
              item.is_expanded ? 'menu-item--expanded',
              item.is_collapsed ? 'menu-item--collapsed',
              item.in_active_trail ? 'menu-item--active-trail',
            ]
          %}
          <li{{ item.attributes.addClass(classes) }}>
            {{ link(item.title, item.url) }}
            {% if item.below %}
              {{ menus.menu_links(item.below, attributes, menu_level + 1) }}
            {% endif %}
          </li>
        {% endfor %}
        </ul>
      {% endif %}
    {% endmacro %}

उदाहरण के लिए, अंतिम मैक्रो को निम्न कोड के साथ बदलने से अपेक्षित परिणाम नहीं होगा।

{% macro menu_links(items, attributes, menu_level) %}
  {% import _self as menus %}
  {% if items %}
    {% if menu_level == 0 %}
      <ul{{ attributes.addClass('toolbar-menu') }}>
    {% else %}
      <ul class="toolbar-menu">
    {% endif %}
    {% for item in items %}
      {%
        set classes = [
          'menu-item',
          logged_in ? 'menu-item--logged-in-user',
          item.is_expanded ? 'menu-item--expanded',
          item.is_collapsed ? 'menu-item--collapsed',
          item.in_active_trail ? 'menu-item--active-trail',
        ]
      %}
      <li{{ item.attributes.addClass(classes) }}>
        {{ link(item.title, item.url) }}
        {% if item.below %}
          {{ menus.menu_links(item.below, attributes, menu_level + 1) }}
        {% endif %}
      </li>
    {% endfor %}
    </ul>
  {% endif %}
{% endmacro %}

The variable is surely available in all the template filesमुझे डर है कि आप इस बारे में गलत हैं। यदि टेम्पलेट टिप्पणियों में इसका उल्लेख नहीं करता है, तो एक कारण होना चाहिए, है ना? क्योंकि मैंने menu.html.twig (जिसमें टिप्पणियों में इसका उल्लेख नहीं है) पर काम किया और काम नहीं किया। ट्विग एक्सटेंडर का उपयोग करते समय यह काम करता है।
कोई Sssweat

_template_preprocess_default_variables()को प्रत्येक टेम्पलेट ड्रुपल आउटपुट के लिए कहा जाता है, इसलिए इसमें जो चर जोड़े जाते हैं वे सभी टेम्पलेट फ़ाइलों में मौजूद होते हैं। दस्तावेज़ीकरण सभी डिफ़ॉल्ट चर का दस्तावेजीकरण नहीं करता है, जहाँ तक मैं देख सकता हूँ।
kiamlaluno

2
@kiamlaluno जब भी आपके पास खाली समय हो, {% if logged_in %}menu.html.twig पर प्रयास करें और आप देखेंगे कि यह काम नहीं करता है। मेरे लिए काम नहीं किया।
नहीं Sssweat

6

आप ट्विग एक्सटेंडर मॉड्यूल के साथ हो सकते हैं । इसके प्रोजेक्ट पेज से उद्धरण:

नई ट्विग एक्सटेंशन (फ़िल्टर और फ़ंक्शंस) को जोड़ने के लिए एक सरल प्लगइन सिस्टम जोड़ें। नए प्लगइन्स को जोड़ने के लिए "twig.extensions" के लिए एक नया सेवा प्रदाता प्रदान करता है।

कार्य: is_user_logged_in

अगर उपयोगकर्ता लॉग इन है, तो जांचें।

{% if user_is_logged_in() %}
Hello user
{% else %}
Please login
{% endif %}

केवल 57 उपयोग और बीटा :(। हो सकता है कि आपका बेहतर समाधान है '$ var [' is_login '] =! \ Drupal :: currentUser () -> isAnonymous (); `preprocess_page में? आपकी राय क्या है?
Yusef

2
उस कार्यक्षमता के लिए किसी मॉड्यूल की आवश्यकता नहीं है, क्योंकि ड्रुपल कोर पहले से ही है। मेरा जवाब देखिए।
kiamlaluno

@kiamlaluno हां, मैं आपसे सहमत हूं, यह आवश्यकता बहुत लोकप्रिय है और मुझे यकीन है कि ड्रुपल ने इसके लिए कुछ प्रदान किया था।
युसेफ

1

logged_inMenu.twig.html से उपयोग करने की कोशिश करने वाले हर व्यक्ति के लिए ; आपको menus.menu_links()मैक्रो के बाहर से इसे कॉल करने की आवश्यकता है क्योंकि logged_inवैरिएबल मैक्रो के दायरे से बाहर है।


1

आप जाँच सकते हैं कि उपयोगकर्ता ऐसा प्रमाणित है:

उदाहरण के लिए, मैंने themename.theme में निम्न फ़ंक्शन बनाया है।

# Function to get user logged info
function tropical_preprocess_page(&$variables){
  // if user is authenticated
  if($variables['user']->isAuthenticated()){
    # gets username
  $user_logged_in_name = $variables['user']->getDisplayName();
  # creates value to ouput in the DOM & capitalize first letter
  $variables['user_logged_in_name'] = ucfirst($user_logged_in_name);

  # gets user email
  $user_email = $variables['user']->getEmail();
  $variables['user_email'] = $user_email;

  // get user picture
  $user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());
  $variables['user_picture'] = $user->get('user_picture')->entity->url();

  // Check if user is logged in
  $user_logged = $variables['user']->isAuthenticated();
  $variables['user_logged'] = $user_logged;
  }
}

उसके बाद, आप Twig फ़ाइल के भीतर तर्क बना सकते हैं जैसे:

<div class="user-logged-greeting">
  {% if user_logged %}
    <h2>Welcome back, {{ user_logged_in_name }}!</h2>
    <p>The email for this user is: <strong>{{ user_email }}<strong></p>
    <img src="{{ user_picture }}" width="50" height="50">
  {% endif %}
</div>

यदि उपयोगकर्ता लॉग इन है, तो आपको उपयोगकर्ता नाम, ईमेल और अवतार चित्र के साथ शुभकामना संदेश मिलेगा। यदि उपयोगकर्ता लॉग इन नहीं है, तो यह कुछ भी नहीं दिखाएगा।

मुझे पता है कि अगर मदद करता है और / या अगर मैं बेहतर समझ के लिए इस पोस्ट को संपादित कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.