it-swarm.asia

كيفية إنشاء رمز مخصص برمجياً في وحدة نمطية

كيف يمكنك إنشاء رمز مميز برمجيًا؟ أرغب في إضافة بعض الرموز المميزة لوحدتي.

23
Lucy

في Drupal 6 ، تستخدم [hook_token_values() .

سيسمح لك هذا الخطاف بإنشاء رموز مميزة. يمكنك إنشاؤها في النطاق العالمي أو يمكنك استخدام كائن مثل العقدة ، أو مستخدم لتحديد القيم.

يجب عليك أيضًا استخدام [hook_token_list() لتوضيح رموزك.

وثائق token.api واضحة تمامًا.

function my_user_token_values($type, $object = NULL, $options = array()) {
  if ($type == 'user') {
    $user = $object;
    $tokens['name']      = $user->name;
    $tokens['mail']      = $user->mail;
    return $tokens;
  }
}

لن أنشر X كل شيء ولكن يجب أن يمنحك ذلك فكرة عالية المستوى.

7
Jeremy French

في Drupal 7 يعد رمز التعامل مع الرموز المميزة جزءًا من Drupal الوحدة الأساسية.

الخطافات التي تحتاجها وحدات الرمز المميز لتنفيذها هي:

  • hook_token_info () هو الخطاف الذي يوفر معلومات حول الرموز المميزة التي تنفذها الوحدة النمطية.
  • hook_tokens () هو الخطاف الذي يجب تنفيذه لتوفير القيم الفعلية التي تحل محل الرموز المميزة.

يمكن للوحدات الأخرى تغيير تنفيذ الرمز المميز المقدم من الوحدة باستخدام hook_token_info_alter () و hook_tokens_alter () .

بشكل مختلف عن وحدة Token ، فإن الرمز الموجود في Drupal يسمح بإنشاء محتوى الرمز فقط عند الضرورة القصوى. في Drupal 6 ، فإن وحدة Token اطلب من الوحدات التي تنفذ الرموز المميزة جميع القيم الخاصة برمزهم المميز باستخدام hook_token_values() ؛ وهذا يعني أنه يمكن للوحدة النمطية حساب قيمة الرمز المميز والتي لا تكون مطلوبة بعد ذلك للرموز المميزة التي يتم استبدالها. في Drupal 7 ، يتلقى تنفيذ hook_tokens()$tokens ، صفيفًا من الرموز المراد استبدالها ، كحجة ؛ عندئذٍ يمكن للوحدة النمطية حساب قيمة الرمز المميز ، مع العلم أنها سوف يستخدم.

الوظيفة التي تستخدم في Drupal 7 لاستبدال الرموز المميزة بقيمتها هي token_replace () ، وهي الوظيفة الوحيدة المستخدمة لاستبدال الرموز المميزة بقيمها.

الاختلاف الآخر بين وحدة الرمز المميز لـ Drupal 6 والرمز الموجود في Drupal 7 هي:

  • في Drupal 7 ، [node: author] تُرجع اسم المؤلف ؛ [node: author: mail] تُرجع عنوان البريد الإلكتروني المرتبط بمؤلف العقدة ، و [node: author: url] يعرض عنوان URL لملف تعريف المستخدم لمؤلف العقدة. بمعنى آخر ، من الممكن استخدام [node: author: xyz] ، حيث يكون "xyz" أحد الرموز المميزة التي تم إرجاعها لكائن مستخدم.
  • في Drupal 7 ، لا توجد رموز أولية ؛ يحصل تنفيذ hook_tokens() على معلمة تخبرك عندما يحتاج محتوى الرمز إلى التعقيم ؛ عندما يكون الرمز المميز القيمة لا تحتاج إلى التعقيم ، لا يتم تمرير المحتوى إلى الوظائف check_plain() أو filter_xss().
  • في Drupal 7 ، لا توجد أي وظيفة تُظهر قائمة الرموز المميزة المتاحة. إذا كانت الوحدة النمطية بحاجة إلى إظهار قائمة الرموز المميزة المتاحة ، فيجب عليها إنشاء قائمة الرموز المميزة نفسها و اعرضه في وصف حقل النموذج ؛ وبدلاً من ذلك ، يمكنه استخدام وظيفة السمة التي لا تزال متاحة في وحدة Token.
20
kiamlaluno

كنت أرغب في إضافة رمز مميز جديد إلى معلومات الموقع قسم الرموز المميزة ، يسمى اسم المدينة. هكذا فعلت في Drupal 7.

 /**
 * Implements hook_token_info().
 */
function my_module_token_info() {

  // Add tokens.
  $site['city_name'] = array(
    'name' => t('Token Name'),
    'description' => t('Token Description'),
  );

  return array(
    'tokens' => array(
      'site' => $site,
    ),
  );
}

/**
 * Implements hook_tokens().
 */
function my_module_tokens($type, $tokens, array $data = array(), array $options = array()) {
  $replacements = array();

 if ($type == 'site') {
    foreach ($tokens as $name => $original) {
      switch ($name) {
        case 'city_name':
          $city_name = variable_get('city_name');
          $replacements[$original] = $sanitize ? check_plain($city_name) : $city_name;
          break;
      }
    }
  }

  // Return the replacements.
  return $replacements;
}
8
Lee Woodman

For Drupal 8 ، مثال باستخدام كائن العقدة:

يمكنك وضع الرموز المميزة في وحدتك على mymodule.tokens.inc باستخدام hook_token_info () لتسجيلها و hook_tokens () لبيانات الاستبدال.

إذا كنت تريد إنشاء رمز مميز لنوع رمز مميز موجود ، مثل العقد ، فستحتاج إلى وضع الرمز المميز داخل الصفيف ضمن hook_token_info (). ارجع إلى node.tokens.inc في وحدة العقدة لمعرفة ما تبني عليه.

mymodule.tokens.inc:

<?php

use Drupal\Core\Render\BubbleableMetadata;
use Drupal\image\Entity\ImageStyle;

/**
 * Implements hook_token_info().
 */
function mymodule_token_info() {
  $info = array();

  $info['tokens']['node']['custom_title'] = [
    'name' => t("Custom Title"),
    'description' => t("a custom node title token"),
  ];
  // Return them.
  return $info;
}

/**
 * Implements hook_tokens().
 */
function mymodule_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) {

  $replacements = array();
  if ($type == 'node') {
    foreach ($tokens as $name => $original) {
      // Find the desired token by name
      switch ($name) {
        case '$data['node']':
          $node = $data['node'];
          $replacements[$original] = $node->label();
          break;
      }
    }
  }
  // Return the replacements.
  return $replacements;
}
4
oknate

For Drupal 8

// We need to include the needed class for tokens.

use Drupal\Core\Render\BubbleableMetadata;

/**
 * Implements hook_token_info().
 */
function modulename_token_info() {
  $info = array();
  // Add any new tokens.
  $info['tokens']['customtokentype']['customtoken'] = t('Telling drupal that you define custom token');
  // Return them.
  return $info;
}

/**
 * Implements hook_tokens().
 */
function modulename_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) {
  $replacements = array();
  $simple = $data["customanything"];
  if ($type == 'customtokentype') {
    foreach ($tokens as $name => $original) {
      // Find the desired token by name
      switch ($name) {
        case 'customtoken':
          $new = $simple;
          $replacements[$original] = $new;
          break;
      }
    }
  }   
  // Return the replacements.
  return $replacements;
}

يتطلب الحصول على قيمة الرموز المميزة في وظيفتك رمزًا مشابهًا للرمز التالي.

$token = \Drupal::token();
$message_html = "hello my custom token is replaced see it here [customtokentype:customtoken]";

// Token data.
$data = array('customanything' => $tosendtotokens);
$message_html = $token->replace($message_html, $data);
3
Karthikeyan Manivasagam