Ishte një rast i tillë, që një kampanjë (relativisht) e madhe kishte shumë zyre të largëta, ku ndodheshin një numër i konsiderueshëm përdoruesish. Të gjitha zyrat ishin të lidhura në një rrjet me një domain të përbashkët, çdo zyrë ishte përcaktuar në Active Directory (AD) si Njësi Organizative (OU), ku tashmë kishin qenë krijuar përdoruesit.
Duhej t'u jepeshin përdoruesve mundësinë për të marrë shpejt dhe pa shumë përpjekje të dhënat kontaktuese të punonjësit të nevojshëm nga AD, ndërsa administratorët e sistemit të liroheshin nga rutina e redaktimit të një skedari tekstual, i cili luante rolin e një libri adrese.
Nuk u gjetën zgjedhje të përshtatshme për zgjidhjen e detyrës së vendosur, prandaj duhej ta bënim gjithçka me duar dhe mendje.
Le tĂ« fillojmĂ« me atĂ« qĂ« fillimisht duhet tĂ« vendosim se çfarĂ« do tĂ« pĂ«rdorim, Ă«shtĂ« shumĂ« e thjeshtĂ« â libri pĂ«rfundimtar duhet tĂ« jetĂ« i aksesueshĂ«m pĂ«r tĂ« gjithĂ« pĂ«rdoruesit e domainit pĂ«rmes shfletuesit. E para qĂ« mĂ« vjen nĂ« mendje Ă«shtĂ« PHP nĂ« kombinim me ldap, kĂ«to do tâi pĂ«rdorim. NjĂ« plus i madh nĂ« pĂ«rdorimin e PHP-sĂ« e shoh si relativisht e thjeshtĂ« â çdo administrator sistemi qĂ« e kupton disi do tĂ« jetĂ« nĂ« gjendje, nĂ«se Ă«shtĂ« e nevojshme, tĂ« bĂ«jĂ« ndryshimet e nevojshme nĂ« kod pa e tepĂ«ruar shumĂ«.
Pra, le të fillojmë. Së pari, do të përcaktojmë parametrat e lidhjes me domainin:
$srv ="SERVER";
$srv_domain ="DOMAIN.COM";
$srv_login ="USERNAME@".$srv_domain;
$srv_password ="PASSWORD";
Hapi i radhĂ«s Ă«shtĂ« tĂ« pĂ«rcaktojmĂ« se nĂ« cilin OU do tĂ« kĂ«rkojmĂ« pĂ«rdoruesit. KĂ«tĂ« do ta bĂ«jmĂ« duke kapur vlerat nga $_GET[âplaceâ]. PĂ«r shembull, nĂ«se pĂ«rdoruesi kalon nĂ« adresĂ«n first, atĂ«herĂ« variablja $place do tĂ« ketĂ« vlerĂ«n first.
$place = (@$_GET['place']);
$doscript=true;
switch($place){
case "first" :
$dn ="OU=ou1,OU=DOMAIN,dc=DOMAIN,dc=COM";
break;
case "second":
$dn ="OU=ou2,OU=DOMAIN,dc=DOMAIN,dc=COM";
break;
// këtu mund të shtoni më shumë kushte.
default:
$doscript=false;
break;
}
if (!$doscript) include "main_table.html";
Variabla $doscript nevojitet pĂ«r tĂ« mbajtur vlerĂ«n â a kemi pĂ«rcaktuar OU-nĂ« nĂ« tĂ« cilĂ«n do tĂ« kĂ«rkojmĂ« pĂ«rdoruesit apo jo. NĂ«se nuk u gjetĂ«n pĂ«rputhje tĂ« listuara nĂ« «switch-case», atĂ«herĂ« $doscript=false, pjesa kryesore e skriptit nuk do tĂ« ekzekutohet, por do tĂ« shfaqet faqja fillestare «main_table.html» (pĂ«r tĂ« cilĂ«n do tĂ« flas nĂ« fund).
Nëse e kemi përcaktuar OU-në, atëherë kalojmë në veprime të tjera: fillojmë të konceptojmë faqen e librit për përdoruesin:
ndryshe nëse ($doscript) {
{echo "
<!DOCTYPE html>
<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
<link rel='shortcut icon' href='ico.png'>
<meta charset='windows-1251/ '>
Aktivizojmë stilet për një pamje më të këndshme (po, ato mund të ishin lidhur si një skedar css, por disa versione të IE nuk pranojnë stilet e vendosura në këtë mënyrë, prandaj na duhet të shkruajmë drejtpërdrejt në skenar):
*{text-align: center; font-family:tahoma; font-size:14px;}
a{text-decoration: none; color: #000;}
a:hover{text-decoration: underline; color: #0059FF;}
#bold{text-decoration: none; font-weight: 600;font-size:20px;}
#table,tr,td{border-style:solid;border-width:1px; border-collapse:collapse;padding:5px; height:22px;border-color:#7d7d7d;}
/* Radhët çifte */#table tbody tr:nth-child(odd){background: #fff;}
/* Radhët tek */ #table tbody tr:nth-child(even){background: #F7F7F7;}
#noborder{border-width: 0 px; border-style: none;}
#sp30px{text-indent: 30px;text-align: justify;}
#smallsize{font-family:tahoma; text-indent: 5px; text-align:left; font-size:12px;}
#top {background: #ffffff;
text-align: center;
left:0;
top:0px;
table-layout: fixed;
border-style:solid;
border-width:0px;
border-collapse:collapse;
padding:0px;
height:22px;
border: 0px;
z-index: 99999;
display:block;
width:80px;
opacity: 0.6;
filter: alpha(Opacity=60);
height:100%;
position:fixed;}
#top:hover{background: #afafaf;opacity: 100;filter: alpha(Opacity=100);text-decoration: none;color: #000000;}
.smalltext{padding-top: 1px;
padding-bottom: 1px;
text-align: bottom;
font-family:tahoma;
color: #a0a0a0;
line-height: 7px;
font-size: 10px;}
.smalltext:hover{color: #0000ff;}
.transition-rotate {position: relative;
z-index: 2;
margin: 0 auto;
padding: 5px;
text-align: center;
max-width: 500px;
cursor: pointer;
transition: 0.1s linear;}
.transition-rotate:hover {-webkit-transform: rotate(-2deg); transform: rotate(-2deg);}
#lineheight{
text-align: left;
line-height: 1px;
text-decoration: none;
font-weight: 600;
font-size:20px;}
Stilet përfundojnë, tani shkruajmë titullin e tabit dhe vizatojmë një lidhje të përshtatshme për kthim në faqen kryesore:
<title>Libri i adresave të «YourMegaCompanyName»</title>
</head>
<body style='background-color:#ffffff;'>";
}
echo "
<table id='top'><tr><td id='top'>
<a href='index.php?place=main' id='top' >
<br><br><br>
<img src='back_to_main.png' alt='' border='0' width='75' height='60'/>
<p>Në faqen kryesore</p></a>
</td></tr></table>
";
Definojmë filtrat e kërkimit për AD, dhe marrim të dhënat mbi OU:
$filter ="(&(objectcategory=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"; // të gjithë përdoruesit, përveç atyre të çaktivizuar.
$filter2 ="(objectCategory=OrganizationalUnit)"; // për të marrë informacionin mbi OU
$ds=ldap_connect($srv);
if ($ds) {
$r=ldap_bind($ds,$srv_login,$srv_password);;
ldap_set_option($ds,LDAP_OPT_REFERRALS, 0);
ldap_set_option($ds,LDAP_OPT_PROTOCOL_VERSION,3);
$sr=ldap_search($ds,$dn ,$filter );
ldap_sort($ds,$sr, "givenname");
$info = ldap_get_entries($ds, $sr);
$sr2=ldap_search($ds,$dn ,$filter2 );
$placeinfo = ldap_get_entries($ds, $sr2);
$PlaceName = $placeinfo[0]["l"][0]; // emri i vendit
$PlaceAddres = $placeinfo[0]["street"][0]; // adresa e vendit
$PlaceMail = $placeinfo[0]["description"][0]; // emaili i vendit
$PlacePhone = $placeinfo[0]["st"][0]; // telefoni i vendit
Pas kësaj, organizojmë pjesën e sipërme të faqes:
echo"<table align='center' height = '80'>
<td id='noborder' ><div id='lineheight'>". $PlaceName ."</div></td></tr>
<tr><td id='noborder' >". $PlaceAddres ."</td></tr>
</table>
<table align='center' id='table'>
<tr><td width='35' bgcolor = "#f0f0e4"> â </td>
<td width='300' bgcolor = "#f0f0e4"> Emri </td>
<td width='250' bgcolor = "#f0f0e4"> E-mail </td>
<td width='60' bgcolor = "#f0f0e4"> Telefon </td>
<td width='150' bgcolor = "#f0f0e4"> Mobile </td></tr>
<tr><td></td><td> Të dhënat OU </td><td>";
echo "<div class='transition-rotate'><a href="mailto:"" . $placemail .">" . $PlaceMail ." </a></div>";
echo "</td><td width='150'> " . $PlacePhone ." </td><td> - </td></tr>";
Pas kësaj, marrim në cikël dhe përpunojmë të dhënat e përdoruesve, duke fshehur disa (për shembull llogaritë e shërbimeve), thjesht duke shkruar "hide" në fushën "dhoma" në atributet e përdoruesit në AD, siç janë këta përdorues nuk do të shfaqen në regjistrin:
për ($i=0; $i<$info["count"];$i++) {
$UserHide = $info[$i]["physicaldeliveryofficename"][0];
if ($UserHide != 'hide') {
$UserName = $info[$i]["cn"][0]; //Emri i përdoruesit
$UserPosition = $info[$i]["title"][0]; // Pozita
$UserMail = $info[$i]["mail"][0]; //mail
if (!$UserMail)) $UserMail = "-"; //nëse nuk ka të dhëna për kutinë në AD, tregojmë një vizë
$UserIpPhone = $info[$i]["ipphone"][0]; //telefon ip
if (!$UserIpPhone) $UserIpPhone = "-"; //nëse nuk ka të dhëna për kutinë në AD, tregojmë një vizë
$UserMobile = $info[$i]["mobile"][0]; //mobile
if (!$UserMobile) $UserMobile = "-"; //nëse nuk ka të dhëna për kutinë në AD, tregojmë një vizë
Ndonjëherë, nëse ju nevojitet të merrni vlerën e një atributi tjetër, mbani mend (është e rëndësishme):
në kërkesë kalojmë emrin e atributit me shkronja të vogla shkronjash, përndryshe nuk do të funksionojë.
Dhe i fusim të dhënat e marra në tabelë:
echo "<tr>
<td>". $n+=1 ."</td>
<td> ". $UserName ."<br> <div class='smalltext'>". $UserPosition ."</div></td><td>"; \/\/\tEmri i përdoruesit dhe pozita
\tif ($UserMail !='-') echo "<div class='transition-rotate'><a href="mailto:'$UserMail'">$UserMail </a></div>"; \/\/ nëse përdoruesi ka e-mail krijojmë një lidhje për dërgimin e mesazhit
\telse echo "-"; \/\/nëse nuk ka e-mail - vendosim një shenjë.
\techo "<td> ". $UserIpPhone ." </td>
<td> ". $UserMobile ." </td></tr>";
\t}\n}\necho "</table>";
Pastaj e mbyllim lidhjen me ldap, ose tregojmë një mesazh për pamundësinë e lidhjes me serverin:
ldap_close($ds);
}
else echo "<h4>Nuk po mund të lidheni me serverin LDAP</h4>";
echo '<br><br><br></body></html>';}
Files «main_table.html» përbrenda përfaqëson një faqe të thjeshtë html me lidhje dhe duket përafërsisht kështu:
<head>
<link rel="shortcut icon" href="ico.png"/>
<meta charset="windows-1251"/>
<title>Libri i adresave të «YourMegaCompanyName»</title>
</head>
<body style='background-color:#ffffff;'>
<center><a href="index.php"><img border="none" src="logo.png"/></a></center>
<center><b>Vendet dhe zyra</b></center>
<br>
<table border="0" width="450" bgcolor="#dddddd" align="center" valign="middle" cellspacing="0">
<tr id="space"><td></td></tr>
<tr><td align="left" id="abz"><a href="index.php?place=ou1">OU1</a></td></tr>
<tr id="space"><td></td></tr>
<tr><td align="left" id="abz"><a href="index.php?place=ou2">OU2</a></td></tr>
</table></body></html>
NĂ«se ndokujt i ndihmon kodi im â do tĂ« jem i lumtur, pĂ«rdorini!
Gjithashtu mund ta redaktoni sipas dëshirës (ta përmirësoni/përkeqësoni) dhe ta shpërndani në çdo mënyrë.
Faleminderit për vëmendjen!
Burimi: habr.com
