2017-01-24 11 views
13

Tôi muốn truy xuất thông tin từ thư mục hoạt động (chẳng hạn như ảnh thu nhỏ) bằng bài đăng.Thực hiện cuộc gọi ajax đến thư mục hoạt động và kéo ảnh thu nhỏ bằng cách sử dụng bài đăng

<?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"; 
?> 

Tôi đã thử sử dụng http://localhost:8666/web1/activedirectory.php để xem có trả về gì không nhưng trả về lỗi sau là kết quả> 1000.

Cảnh báo: ldap_search(): kết quả tìm kiếm phần trả về: Sizelimit vượt trong C: \ xampp \ htdocs \ web1 \ activedirectory.php trên đường dây 28

Notice: Undefined biến: Thông điệp trong C: \ xampp \ htdocs \ web1 \ activedirectory.php trên đường dây 46

dưới đây là jquery nơi tôi muốn liên kết các tập tin .php đến tập tin trên:

$('.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'); 
     } 
    }); 
}); 
+1

bạn có quen thuộc với thẻ không? – Cashbee

Trả lời

11

câu hỏi đầu tiên:

Bạn cần phải nối thêm một yếu tố img insteadt của thiết lập các văn bản như thế này:

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

câu hỏi thứ hai:

Khi phụ thêm những hình ảnh thêm một thuộc tính lớp để bạn có thể tìm nạp chúng bằng jQuery sử dụng tên lớp như thế này:

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 

Bây giờ bạn có thể lấy những hình ảnh sử dụng một selector như thế này:

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

EDIT:

nếu bạn muốn loại bỏ tất cả những hình ảnh bên trong #imagesofBadges trước phụ thêm một ứng dụng mới này:

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

Điều gì đang xảy ra ở đây? Rất nhiều câu trả lời của một câu hỏi lạ nhưng có vẻ như mọi người đều trả lời một câu hỏi khác. Bạn đã nhận được từ 'huy hiệu' ở đâu? –

+0

@shukshin.ivan chỉnh sửa (bản chính) đã được đưa ra cho câu hỏi. Kiểm tra sửa đổi các chỉnh sửa. –

+0

Cảm ơn, có vẻ như tôi không điên rồ =) –

0

Sử dụng một cái gì đó như

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

Bạn có thể đăng mã cho phần thứ hai không, tôi không chắc tôi hiểu câu hỏi của bạn. –

6

Trước hết, lỗi bạn nhận được không liên quan gì đến POST, AJAX hoặc PHP. Nó được gây ra bởi sự truy vấn LDAP là quá chung chung:

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

Mỗi cuộc gọi jQuery chỉ có thể trở lại một hình ảnh, vì vậy bạn cần phải lấy lại hình thu nhỏ từng người một, và mỗi cuộc gọi nhu cầu để tìm kiếm và chỉ trả lại một bản ghi (tức là một READ, không phải là TÌM KIẾM).

Điều này có nghĩa là bạn cần gửi cùng ID người dùng của mình trong lệnh PHP để tập lệnh có thể biết hình thu nhỏ nào cần trả lại ... và điều này bạn thực hiện.

Nhưng PHP không sử dụng thông tin đó.Bạn tìm kiếm tất cả các tên, điều đó có nghĩa là nó không thể hoạt động được, nhưng nó thậm chí không khởi động được vì quá trình tìm kiếm LDAP.

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

Trong dòng trên, bạn cần thêm một số bộ lọc. Ví dụ: tên ID bạn có nhận được trong bảng thành tích tên tài khoản SAM không? Nếu có, bạn có thể làm điều gì đó như

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

và đảm bảo chỉ lấy một bản ghi. Vào thời điểm đó, bạn có thể đi về giải nén hình ảnh (mà nếu bộ nhớ phục vụ là ở định dạng bitmap), và chuyển nó sang một hình thức thích hợp cho 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(); 

Ví dụ

Bạn có một phần HTML có chứa một số yếu tố (nhân viên của bạn).

RẤT QUAN TRỌNG: phần này sẽ được PHP tạo bằng cách sử dụng tìm kiếm LDAP để bạn có thông tin bắt buộc. Bạn có thể cần phải phân trang tìm kiếm LDAP để tránh quá nhiều kết quả được trả lại (và một lỗi), như trước đây.

Nhưng một khi bạn làm điều này, bạn sẽ có tên phân biệt của mỗi người dùng.

<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> 

Ở trên, bạn đọc 'Jeff Smith', v.v. từ tìm kiếm LDAP. Nhưng bạn không thể dễ dàng đặt một hình ảnh ở đó từ PHP, HTML không cho phép nó (okay, it does, as this answer to a similar question as yours shows, nhưng nói rằng bạn không thích), vì vậy bạn đặt một trình giữ chỗ thay vì với kích thước thích hợp bằng cách sử dụng CSS.

Bạn cũng có thể đặt GIF động có nội dung "đang tải ..." trong hình ảnh.

Để làm cho mọi thứ hiệu quả hơn bạn lưu trong thuộc tính data-dn the DN of each result.

Hoặc khi nhấp hoặc tải() hoặc nếu bạn có phân trang AJAX khi thay đổi trang, bạn sẽ truy xuất tất cả hình ảnh. Điều này rất giống với mã bạn đã có.

$('.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; 
}); 

Kịch bản load-image.php sẽ nhận $_GET['dn'] và sẽ yêu cầu để thực hiện một LDAP read sử dụng DN cung cấp, và lấy các thuộc tính hình ảnh thích hợp.

Sau đó, bạn chỉ cần xuất nó với header() và chức năng image*() bạn thích (ví dụ: imageJPEG() hoặc imagePNG()).

Bạn có thể làm điều này trong AJAX và gửi ảnh được mã hóa dưới dạng base64 (mã trong liên kết ở trên), nhưng phức tạp hơn và thời gian bạn lưu chỉ gửi một cuộc gọi thay vì hai mươi cho hai mươi hình ảnh bị mất ngay lập tức , khi bạn cần gửi các tệp JPEG được mã hóa dưới dạng base64 thay vì nhị phân, với kích thước tăng 5-10% nếu máy chủ web của bạn gz-mã hóa base64 (hoặc tăng 33% kích thước khi không).

Các vấn đề liên quan