আপনার কাছে হুক_মেনু () অ্যাক্সেস কলব্যাকের উদাহরণ রয়েছে?


18

আমি উদাহরণগুলি প্রকল্পটি ডাউনলোড করেছি , তবে মেনু_ নমুনা মডিউলে সমস্ত access callbackসেট করা আছে true.. এটি কীভাবে কাজ করে তা বোঝা শক্ত।

আমার উদাহরণে, আমার মেনো এন্ট্রি নোডগুলিতে দৃশ্যমান হওয়া উচিত, তবে কেবল সেই ভূমিকাগুলির জন্য যা তার নিজের নোড সম্পাদনা করার অনুমতি পেয়েছে।

আমি অ্যাক্সেস কলব্যাকের আরও কিছুটা ভারবস উদাহরণ খুঁজে পাচ্ছি না।

কারও কি আছে?

উত্তর:


12

সম্পাদনা: আমি "নিজস্ব নোড সম্পাদনা করুন" অনুমতি সম্পর্কে অংশটি মিস করেছি, কারণ তখন আপনাকে অবশ্যই অনুমতিটি যাচাই করতে হবে না তবে সেই নোডটি বর্তমান ব্যবহারকারীর অন্তর্গত if আমি নীচে আমার উদাহরণ আপডেট করেছি তবে আমি উপরের ব্যাখ্যাটি যেমন ছিল তেমন রেখে দিচ্ছি।

নোড / নিডের নীচে আপনার মেনু এন্ট্রি (যেমন নোড / 1234 / কিছু)? তারপরে আপনার সম্ভবত একটি কাস্টম অ্যাক্সেস কলব্যাকের প্রয়োজনও নেই।

যদি আপনি নীচের উদাহরণের মতো আপনার মেনু পথটিকে সংজ্ঞায়িত করেন তবে আপনি যদি বৈধ নোডটি দেখছেন তবে এটি কেবল অ্যাক্সেস কলব্যাক (এবং তাই আপনার পৃষ্ঠা কলব্যাক) কল করবে।

'node/%node/something'

এর অর্থ হ'ল উপরের উদাহরণের জন্য এটি নোড_লোড (1234) কল করবে এবং কেবলমাত্র কোনও বৈধ নোড অবজেক্ট ফেরত থাকলে অবিরত থাকবে। সুতরাং আপনি যথারীতি অ্যাক্সেস আর্গুমেন্টগুলি দিয়ে আপনার অনুমতিটি সংজ্ঞায়িত করতে পারেন।

এটি বলেছিল, অ্যাক্সেস কলব্যাক লেখা সত্যিই সহজ। এটি কেবলমাত্র একটি ফাংশন যা অ্যাক্সেস আর্গুমেন্টগুলিতে আপনি যে কোনও যুক্তিই সংজ্ঞায়িত করবেন তা পাবেন। উদাহরণস্বরূপ, ডিফল্ট এক্সেস কলব্যাক হয় user_access () এবং আপনি সংজ্ঞায়িত আপনার অ্যাক্সেস আর্গুমেন্ট পছন্দ 'access arguments' => array('a permission string'), এটা নিম্নলিখিত কল স্থাপিত হবে: user_access('a permission string')

আপনার যদি একাধিক যুক্তি থাকে তবে এগুলি আপনার ফাংশনে দ্বিতীয়, তৃতীয় এবং তত্ক্ষণিক হিসাবে পাস হবে। বর্তমানে সক্রিয় নোড অ্যাক্সেস করতে আপনি মেনু_জেট_বজেক্ট () ব্যবহার করতে পারেন ।

সুতরাং আপনি নিজের অ্যাক্সেস কলব্যাকটি এভাবে লিখতে পারেন তবে আবার এটির তৈরির প্রয়োজনও পড়তে পারে না।

function yourmodule_access_check() {
  global $user;
  $node = menu_get_object();

  return $node && $node->uid == $user->uid && user_access('edit own ' . $node->type . ' content');
}

অনুমতি স্ট্রিংকে হার্ডকোডিংয়ের পরিবর্তে আপনি এটিকে ফাংশন বা যা কিছু করতে চান তার পক্ষে যুক্তি হিসাবে পাস করতে পারেন।


শেষ উদাহরণটি কখনই অর্জন করতে পারেনি: $items['node/%node/edit']['access callback'] = 'admin_access_only'; এবং $node = menu_get_object();কলব্যাক এফএন এর সাথে এবং $nodeকখনই কিছুই ফেরেনি । পরিবর্তে আমি $node = node_load(arg(1)); যা কাজ করেছি তা ব্যবহার করেছি ... আরও ব্যাখ্যাগুলি সত্যই স্বাগত জানানো হবে
কোজো

19

ড্রপাল নিজেই কোড লেখার একটি উদাহরণ।

সহজ উদাহরণ হ'ল aggregator_menu () , যা নিম্নলিখিত কোডটি ধারণ করে।

  $items['admin/config/services/aggregator'] = array(
    'title' => 'Feed aggregator', 
    'description' => "Configure which content your site aggregates from other sites, how often it polls them, and how they're categorized.", 
    'page callback' => 'aggregator_admin_overview', 
    'access arguments' => array('administer news feeds'), 
    'weight' => 10, 
    'file' => 'aggregator.admin.inc',
  );
  $items['admin/config/services/aggregator/add/feed'] = array(
    'title' => 'Add feed', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('aggregator_form_feed'), 
    'access arguments' => array('administer news feeds'), 
    'type' => MENU_LOCAL_ACTION, 
    'file' => 'aggregator.admin.inc',
  );

এই ক্ষেত্রে, অ্যাক্সেস কলব্যাকটি হ'ল ডিফল্ট ( ইউজার_অ্যাক্সেস () ), এবং অ্যাক্সেস আর্গুমেন্টগুলি অনুমতিটির জন্য স্ট্রিং সহ একটি অ্যারে হয়। কোড অনুমতি ছাড়াও চেক করতে পারে না; যদি চেক করার অনুমতিগুলি দুটি হয়, বা চেক করার শর্তগুলি কেবল অনুমতি নয়, তবে অ্যাক্সেস কলব্যাকটি একটি কাস্টমসহ অন্যটি হওয়া উচিত।

নোড_মেনু () এমন কিছু মেনু সংজ্ঞা দেয় যা অ্যাক্সেস কলব্যাক ডিফল্টর চেয়ে আলাদা। ফাংশনটিতে নিম্নলিখিত কোড রয়েছে।

  foreach (node_type_get_types() as $type) {
    $type_url_str = str_replace('_', '-', $type->type);
    $items['node/add/' . $type_url_str] = array(
      'title' => $type->name, 
      'title callback' => 'check_plain', 
      'page callback' => 'node_add', 
      'page arguments' => array($type->type), 
      'access callback' => 'node_access', 
      'access arguments' => array('create', $type->type), 
      'description' => $type->description, 
      'file' => 'node.pages.inc',
    );
  }

অ্যাক্সেস কলব্যাক ( নোড_একসেস () ) হিসাবে সংজ্ঞায়িত ফাংশনটি নিম্নলিখিতটি:

function node_access($op, $node, $account = NULL) {
  $rights = &drupal_static(__FUNCTION__, array());

  if (!$node || !in_array($op, array('view', 'update', 'delete', 'create'), TRUE)) {
    // If there was no node to check against, or the $op was not one of the
    // supported ones, we return access denied.
    return FALSE;
  }
  // If no user object is supplied, the access check is for the current user.
  if (empty($account)) {
    $account = $GLOBALS['user'];
  }

  // $node may be either an object or a node type. Since node types cannot be
  // an integer, use either nid or type as the static cache id.

  $cid = is_object($node) ? $node->nid : $node;

  // If we've already checked access for this node, user and op, return from
  // cache.
  if (isset($rights[$account->uid][$cid][$op])) {
    return $rights[$account->uid][$cid][$op];
  }

  if (user_access('bypass node access', $account)) {
    $rights[$account->uid][$cid][$op] = TRUE;
    return TRUE;
  }
  if (!user_access('access content', $account)) {
    $rights[$account->uid][$cid][$op] = FALSE;
    return FALSE;
  }

  // We grant access to the node if both of the following conditions are met:
  // - No modules say to deny access.
  // - At least one module says to grant access.
  // If no module specified either allow or deny, we fall back to the
  // node_access table.
  $access = module_invoke_all('node_access', $node, $op, $account);
  if (in_array(NODE_ACCESS_DENY, $access, TRUE)) {
    $rights[$account->uid][$cid][$op] = FALSE;
    return FALSE;
  }
  elseif (in_array(NODE_ACCESS_ALLOW, $access, TRUE)) {
    $rights[$account->uid][$cid][$op] = TRUE;
    return TRUE;
  }

  // Check if authors can view their own unpublished nodes.
  if ($op == 'view' && !$node->status && user_access('view own unpublished content', $account) && $account->uid == $node->uid && $account->uid != 0) {
    $rights[$account->uid][$cid][$op] = TRUE;
    return TRUE;
  }

  // If the module did not override the access rights, use those set in the
  // node_access table.
  if ($op != 'create' && $node->nid) {
    if (module_implements('node_grants')) {
      $query = db_select('node_access');
      $query->addExpression('1');
      $query->condition('grant_' . $op, 1, '>=');
      $nids = db_or()->condition('nid', $node->nid);
      if ($node->status) {
        $nids->condition('nid', 0);
      }
      $query->condition($nids);
      $query->range(0, 1);

      $grants = db_or();
      foreach (node_access_grants($op, $account) as $realm => $gids) {
        foreach ($gids as $gid) {
          $grants->condition(db_and()
            ->condition('gid', $gid)
            ->condition('realm', $realm)
          );
        }
      }
      if (count($grants) > 0) {
        $query->condition($grants);
      }
      $result =  (bool) $query
        ->execute()
        ->fetchField();
      $rights[$account->uid][$cid][$op] = $result;
      return $result;
    }
    elseif (is_object($node) && $op == 'view' && $node->status) {
      // If no modules implement hook_node_grants(), the default behavior is to
      // allow all users to view published nodes, so reflect that here.
      $rights[$account->uid][$cid][$op] = TRUE;
      return TRUE;
    }
  }

  return FALSE;
}

তিনটি বিষয় লক্ষ্য করা যায়:

  • "অ্যাক্সেস আর্গুমেন্ট" দিয়ে ঘোষিত আর্গুমেন্টগুলি একই ক্রমে ফাংশনে প্রেরণ করা হবে; ফাংশনটি তৃতীয় প্যারামিটার ব্যবহার করে কারণ এটি কেবল অ্যাক্সেস কলব্যাক ব্যবহার করা হয়নি।
  • TRUEব্যবহারকারীর মেনুতে অ্যাক্সেস FALSEথাকলে এবং যদি ব্যবহারকারীর মেনুতে অ্যাক্সেস না থাকে তবে ফাংশনটি ফিরে আসে ।
  • অ্যাক্সেস কলব্যাক এছাড়াও ব্যবহার করা যেতে পারে যখন নির্দিষ্ট পরিস্থিতিতে মেনুটি প্রদর্শিত হবে।

একটি কাস্টম access callbackফাংশন ঘোষণা করার সময় , এটি আপনার .moduleফাইলে অবশ্যই থাকতে পারে বলে মনে হয়, কারণ দ্রুপাল এটি fileঘোষণায় খুঁজে পেতে পারে না (কমপক্ষে আমার জন্য)।
tyler.frankenstein
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.