Подтвердить что ты не робот

Сделайте ajax-вызов активного каталога и потяните фотографии эскизов, используя сообщение

Я хочу получить информацию из активного каталога (например, миниатюрные фотографии) с помощью сообщения.

<?php
/**
 * Get a list of users from Active Directory.
 */
$ldap_password = $_POST['password'];
$ldap_username = $_POST['username'];
$server = 'ldap://xxxxxxxxxxxxxxxxxxxxxx';
$domain = 'xxxxxxxxxxxxxxxxx';
$port       = 389;
$ldap_connection = ldap_connect($server, $port);

if (FALSE === $ldap_connection){
    // Uh-oh, something is wrong...
}

// We have to set this option for the version of Active Directory we are using.
ldap_set_option($ldap_connection, LDAP_OPT_PROTOCOL_VERSION, 3) or die('Unable to set LDAP protocol version');
ldap_set_option($ldap_connection, LDAP_OPT_REFERRALS, 0); // We need this for doing an LDAP search.

if (TRUE === ldap_bind($ldap_connection, $ldap_username.$domain, $ldap_password)){
    $ldap_base_dn = "OU=Employees,OU=Accounts,OU=xxxxx,DC=xxxxxx,DC=xxxxxxx,DC=com";
    $search_filter = '(&(objectCategory=person)(samaccountname=*))';
    $attributes = array();
    $attributes[] = 'givenname';
    $attributes[] = 'mail';
    $attributes[] = 'samaccountname';
    $attributes[] = 'sn';
    $result = ldap_search($ldap_connection, $ldap_base_dn, $search_filter, $attributes);
    $maxPageSize = 1000;
    if (FALSE !== $result){
        $entries = ldap_get_entries($ldap_connection, $result);
        for ($x=0; $x<$entries['count']; $x++){
            if (!empty($entries[$x]['givenname'][0]) &&
                 !empty($entries[$x]['mail'][0]) &&
                 !empty($entries[$x]['samaccountname'][0]) &&
                 !empty($entries[$x]['sn'][0]) &&
                 'Shop' !== $entries[$x]['sn'][0] &&
                 'Account' !== $entries[$x]['sn'][0]){
                $ad_users[strtoupper(trim($entries[$x]['samaccountname'][0]))] = array('email' => strtolower(trim($entries[$x]['mail'][0])),'first_name' => trim($entries[$x]['givenname'][0]),'last_name' => trim($entries[$x]['sn'][0]));
            }
        }
    }
    ldap_unbind($ldap_connection); // Clean up after ourselves.
}

$message .= "Retrieved ". count($ad_users) ." Active Directory users\n";
?>

Я попытался использовать http://localhost:8666/web1/activedirectory.php, чтобы увидеть, возвращает ли он что-либо, но возвращает следующую ошибку, поскольку результат равен > 1000.

Предупреждение: ldap_search(): Частичные результаты поиска возвращены: Sizelimit превышен в C:\xampp\htdocs\web1\activedirectory.php в строке 28

Примечание: переменная Undefined: сообщение в C:\xampp\htdocs\web1\activedirectory.php в строке 46

ниже - jquery, где я хочу связать файл .php с указанным выше файлом:

$('.leaderboard li').on('click', function () {
    $.ajax({
        url: "../popupData/activedirectory.php", // php file with link to the active directory.
        type: "POST",
        data: {id:$(this).find('.parent-div').data('id')},
        success: function(data){
            console.log(data);
            data = JSON.parse(data);
            $('#popup').fadeIn();
            //call for the thumbnail photo
            // etc ..
        },
        error: function(){
            alert('failed, possible script does not exist');
        }
    });
});
4b9b3361

Ответ 1

ПЕРВЫЙ ВОПРОС:

Вы должны добавить элемент img вместо этого, чтобы установить текст следующим образом:

$('#imagesofBadges').append('<img src="'  + data[0].BadgeImage + '"/>');

ВТОРОЙ ВОПРОС:

При добавлении изображений добавьте атрибут класса, чтобы вы могли получить их с помощью jQuery с помощью этого имени класса следующим образом:

var $img = $('<img src="'  + data[0].BadgeImage + '"/>'); // create the image
$img.addClass('badge-image'); // add the class .badge-image to it
$('#imagesofBadges').append($img); // append it

Теперь вы можете получить эти изображения с помощью селектора, например:

$('#imagesofBadges .badge-image'); // will fetch all the elements that have the class .badge-image that are inside #imagesofBadges.

EDIT:

если вы хотите удалить все изображения внутри #imagesofBadges, прежде чем добавлять новые, используйте это:

// fetch all the images inside #imagesofBadges and remove them
$('#imagesofBadges img').remove();
// append the new image
$('#imagesofBadges').append('<img src="'  + data[0].BadgeImage + '"/>');

Ответ 2

Прежде всего, полученная вами ошибка не имеет ничего общего с POST, AJAX или PHP. Это вызвано слишком общим запросом LDAP:

ldap_search(): Partial search results returned: Size limit exceeded

Каждый вызов jQuery может возвращать только один образ, поэтому вам нужно получить миниатюры по одному, и каждый вызов должен искать и возвращать только одну запись (т.е. READ, а не ПОИСК).

Это означает, что вам нужно отправить свой идентификатор пользователя в вызове PHP, чтобы script мог знать, какой эскиз для возврата... и это вы делаете.

Но PHP не использует эту информацию. Вы ищете все имена, что означает, что он не может работать в любом случае, но он даже не запускается, потому что поиск LDAP захлебывается.

$search_filter = '(&(objectCategory=person)(samaccountname=*))';

В приведенной выше строке вам нужно добавить некоторый фильтр. Например, является ли имя ID, которое вы получаете в таблице лидеров, имя учетной записи SAM? Если это так, вы можете сделать что-то вроде

$kid = 'NonExistingAccount';
if (preg_match('#SAM_NAME_MATCHING_REGEX#', $_POST['id'])) {
    $kid = $_POST['id'];
}
$search_filter = "(&(objectCategory=person)(samaccountname={$kid}))";

и обязательно получите только одну запись. В этот момент вы можете извлечь извлечение изображения (которое, если память используется в формате растрового изображения), и преобразовать его в форму, подходящую для jQuery:

$bitmap = $entries[0]['picture'];
// Some error checking would probably be good
$gd     = imageCreateFromString($bitmap);
// Here you'll probably want to resize your image. Create
// another GD object with ImageCreateTrueColor and use imageCopyResampled
// with the appropriate size.

// Then, inform jQuery that a PNG is coming along
header('Content-Type: image/png');
// and send the PNG
imagePNG($gd);
// and nothing else (shouldn't matter, but you never know, and anyway...).
exit();

Пример

У вас есть раздел HTML, содержащий несколько элементов (скажем, ваших сотрудников).

ОЧЕНЬ ВАЖНО: этот раздел будет сгенерирован PHP с использованием поиска LDAP, чтобы у вас была необходимая информация. Возможно, вам придется разбивать страницы на поиск LDAP, чтобы избежать слишком большого количества возвращаемых результатов (и ошибки), как и раньше.

Но как только вы это сделаете, у вас будет различающееся имя каждого пользователя.

<ul class="leaderboard">
   ...
   <li data-dn="CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=COM">
       <img class="placeholder" />
           <span class="cn">Jeff Smith</span>
           <span class="ou">Sales</span>
   </li>
   ...
</ul>

В приведенном выше примере вы читаете "Jeff Smith" и т.д. из поиска LDAP. Но вы не можете легко разместить изображение там с PHP, HTML не позволяет (хорошо, он делает это, так как этот ответ на аналогичный вопрос, как ваш показывает, но скажите, что вы предпочитайте не делать этого), поэтому вместо этого вы помещаете вместо него подходящий размер с помощью CSS.

Вы также можете поместить анимированный GIF, который говорит "загрузка..." на изображении.

Чтобы сделать вещи более эффективными, вы сохраняете в атрибуте data-dn DN каждого результата.

При нажатии или onload(), или если у вас есть пейджинг AJAX на странице, вы получаете все изображения. Это очень похоже на код, который у вас уже есть.

$('.leaderboard li').on('click', function () {
    // Get the image. This returns nothing if it has already been loaded.
    var img = $(this).find('img.placeholder');
    if (img.length === 0) { return; }
    var dn = $(this).attr('data-dn');

    // Load image from its DN.
    // See https://stackoverflow.com/questions/4285042/asychronously-load-images-with-jquery
    img.src = 'load-image.php?dn=' + dn;
});

load-image.php script получит $_GET['dn'] и потребует выполнить чтение LDAP используя поставляемый DN и получить соответствующий атрибут изображения.

Затем вы просто выводите его с помощью функции header() и image*(), которую вы предпочитаете (например, imageJPEG() или imagePNG()).

Вы можете сделать это в AJAX и отправить изображения, закодированные как base64 (код в ссылке выше), но это сложнее, и время, когда вы сохраняете отправку только одного вызова вместо двадцати для двадцати изображений, быстро теряется с интересом, когда вам нужно отправить по JPEG файлам, закодированным как base64 вместо двоичного, с увеличением на 5-10%, если ваш веб-сервер gz-кодирует base64 (или увеличение на 33%, если это не так).

Ответ 3

Используйте что-то вроде

$('#imagesofBadges').append($("<img>").prop("src", data[0].BadgeImage));