प्रोग्राम उपयोगकर्ता को "सक्रिय" कैसे सेट करें


8

क्या सभी उपयोगकर्ताओं को सक्रिय रूप से प्रोग्राम करना संभव है?

यह समस्या इसलिए उत्पन्न होती है क्योंकि मैं अपने उपयोगकर्ताओं को दृश्यों का उपयोग करके प्रदर्शित करने का प्रयास कर रहा हूं, लेकिन क्योंकि मेरे माइग्रेट किए गए उपयोगकर्ता "अवरुद्ध" हैं, मैं उन्हें दृश्य में उजागर नहीं कर सकता।

क्या कोई उपयोगकर्ता को स्थिति को सक्रिय करने के लिए कोड का एक स्निपेट या एक ट्यूटोरियल प्रदान कर सकता है?

यह वह कोड है जिसे मुझे शुरुआत में निष्पादित करना होगा।

define('DRUPAL_ROOT', getcwd()); 
$_SERVER['REMOTE_ADDR'] = "localhost"; 
require_once DRUPAL_ROOT . '/includes/bootstrap.inc'; 
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); 

// Set the active DB 
db_set_active('sage'); 

जवाबों:


7

मैं निम्नलिखित कोड का उपयोग करूंगा।

$query = new EntityFieldQuery();

$result = $query->entityCondition('entity_type', 'user')
  ->propertyCondition('status', 0)
  // Avoid loading the anonymous user.
  ->propertyCondition('uid', 0, '<>')
  // Comment out the next line if you need to enable also the super user.
  ->propertyCondition('uid', 1, '<>')
  ->execute();

if (isset($result['user'])) {
  // Disable the email sent when the user account is enabled.
  // Use this code if you don't use the code marked with (1).
  // $old_value = variable_get('user_mail_status_activated_notify', TRUE);
  // variable_set('user_mail_status_activated_notify', FALSE);

  $uids = array_keys($result['user']);
  $users = entity_load('user', $uids);

  foreach ($users as $uid => $user) {
    $user->status = 1;
    $original = clone $user;      // (1)
    $user->original = $original;  // (1)
    user_save($user);
  }
  // Restore the value of the Drupal variable.
  // Use this code if you don't use the code marked with (1).
  // variable_set('user_mail_status_activated_notify', $old_value);
}
  • कोड केवल उन खातों को लोड करता है जो सक्षम नहीं हैं। पहले से सक्षम खातों को लोड करना बेकार है।
  • कोड अनाम उपयोगकर्ता खाते को लोड करने से बचता है, जो कि वास्तविक खाता नहीं है।
  • क्लाइव सही है जब वह कहता है कि user_save () Drupal का उपयोग करके सक्षम उपयोगकर्ताओं को एक ईमेल भेज सकता है। फ़ंक्शन से उपयोग किया जाने वाला कोड निम्नलिखित है।

    // Send emails after we have the new user object.
    if ($account->status != $account->original->status) {
      // The user's status is changing; conditionally send notification email.
      $op = $account->status == 1 ? 'status_activated' : 'status_blocked';
      _user_mail_notify($op, $account);
    }
    

    मेरे कोड के साथ, स्थिति $account->status != $account->original->statusसत्यापित नहीं है, और ईमेल नहीं भेजा गया है। विकल्प के रूप में, आप FALSEकॉल करने से पहले Drupal वैरिएबल "user_mail_status_activated_notify" का मान सेट कर सकते हैं user_save(), जैसा कि कोड में दिखाया गया है। उस Drupal वैरिएबल के मान को बदलने का एक वैश्विक प्रभाव होगा, और यह तब काम नहीं करेगा जब अन्य कोड इसके मान को बदलता है TRUE। ऑब्जेक्ट $user->originalकी एक प्रति पर सेट करना $userएकमात्र तरीका है जिससे यह सुनिश्चित किया जा सकता है कि कॉल user_save()उपयोगकर्ता को किसी भी ईमेल को प्रभावी रूप से भेजने के लिए नहीं है, उपयोगकर्ता वस्तुओं के लिए मेरे कोड के साथ सहेजा जा रहा है।


@kiamlaluno, मैंने आपके कोड का उपयोग किया है, लेकिन मुझे त्रुटियां भी हो रही हैं। मैंने अपनी पोस्ट को अपडेट कर दिया है, क्या आपके पास गलत विचार हो सकता है?
chlong

@ लंबे समय तक अगर मुझे ठीक से याद है कि आपका sageडेटाबेस नॉन ड्रुपल है तो क्या ऐसा नहीं है? यदि हां, तो db_set_active()कोड को चलाने से पहले कॉल को हटा दें
क्लाइव

@ मेरे कोड का उपयोग करने पर मुझे कोई अपवाद नहीं मिलता है। सुनिश्चित करें कि आप जिस डेटाबेस का उपयोग कर रहे हैं (जिसमें एक सेट है db_set_active()) में ड्रुपल से स्थापित टेबल हैं।
kiamlaluno

@kiamlaluno, मेरा 'ऋषि' डेटाबेस एक ड्रुपल डेटाबेस है, इसमें ड्रुपल टेबल के सभी शामिल हैं। लेकिन मैं 'db_set_active ()' - EDIT के बिना चलने की कोशिश करूंगा: 'db_set_active ()' के बिना कोड ठीक चलेगा, लेकिन मेरे 'sage' डेटाबेस में उपयोगकर्ता संशोधित नहीं हैं। EDIT2: आपका कोड वास्तव में काम करता है, लेकिन इसने केवल मेरी डिफ़ॉल्ट साइट में उपयोगकर्ताओं की स्थिति बदल दी, जो कि मैं नहीं चाहता :(
लंबा

@chlong यदि "ऋषि" एक Drupal साइट के साथ एक Drupal डेटाबेस सहयोगी है, तो उस साइट से कोड निष्पादित करने का प्रयास करें; यदि आपको एक ही त्रुटि मिलती है, तो डेटाबेस प्रभावी रूप से सभी आवश्यक तालिकाओं को शामिल नहीं करता है। जहाँ तक मुझे पता है, db_set_active()किसी भी क्वेरी के विफल होने का कारण नहीं है।
kiamlaluno

7

आप के संयोजन का उपयोग कर सकते हैं user_load_multiple()और user_save()अद्यतन करने के लिए statusउपयोगकर्ताओं की संपत्ति:

$uids = db_query('SELECT uid FROM {users}')->fetchCol();
foreach (user_load_multiple($uids) as $account) {
  $account->status = 1;
  user_save($account);
}

यह ध्यान में रखने योग्य है कि आपके द्वारा अपने खाते की स्थिति के उपयोगकर्ताओं को सूचित करने के लिए आपके द्वारा निर्धारित किसी भी मेल अधिसूचना को इस पद्धति का उपयोग करके लागू किया जाएगा।

यदि आप नहीं चाहते कि ऐसा हो तो मुझे लगता है कि आपको सीधे {users}तालिका में जाना होगा और स्थिति को मैन्युअल रूप से सेट करना होगा (अनुशंसित नहीं):

db_update('users')
  ->fields(array('status' => 1))
  ->execute();

2

इस तरह आप सक्रिय करने के लिए सभी उपयोगकर्ता की स्थिति निर्धारित कर सकते हैं।

$users = entity_load('user');
foreach ($users as $user) {
  if ($user->uid != 0) {
    $user->status = 1;
    entity_save('user', $user);
  }
}

entity_save()इकाई एपीआई मॉड्यूल से कार्यान्वित किया जाता है ।

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