Izveidojiet pielāgotu ziņas veidu (pielāgots ziņas veids) ar pielāgotām kategorijām (pielāgota taksonomija). Tiešraides meklēšana vietnē Bitrix

28.02.2024

Galvenie mērķi:

  • ieviest meklēšanu tā, lai pēc meklēšanas vaicājuma ievadīšanas rindā zem šīs rindas tiktu parādīti meklēšanas rezultāti
  • Rezultāta pieprasījumam vajadzētu notikt tikai pēc meklēšanas vaicājuma ievadīšanas

Labi, ejam!

Aptuvens paša bloka izkārtojums ar meklēšanas rindiņu un div segvārdu, kur mēs pievienosim meklēšanas rezultātus:

Jo Meklēšana ir pieejama vietnes galvenē, pievienosim atbilstošos meklēšanas skriptus un rezultātu stilu:

//izgriež meklēšanu: $APPLICATION->AddHeadScript("/search/ajax_search.js"); $APPLICATION->AddHeadScript("/search/jquery.mCustomScrollbar.js"); $APPLICATION->SetAdditionalCSS(SITE_TEMPLATE_PATH . "/css/ajax_search.css"); $APPLICATION->SetAdditionalCSS(SITE_TEMPLATE_PATH. "/css/jquery.mCustomScrollbar.min.css");

Tagad apskatīsim, kas atrodas mūsu ajax_search.js:

Funkcija get_result ()( //notīrīt meklēšanas rezultātus $("#search_result").html(""); //vēl nav saņēmuši meklēšanas rezultātus — parādīt priekšielādētāju $("#search_result").append("

"); $.ajax(( tips: "POST", url: "/search/ajax_search.php", dati: "q="+q, dataType: "json", panākumi: function(json)( //clear) priekšielādētājs $("#search_result").html("") $("#search_result").append("); "); //pievienojiet katru json masīva elementu div ar class="live-search" (varat izmantot savu izkārtojumu) $.each(json, function(index, elements) ( $("#search_result" ).find (.tiešraides meklēšana").append(" "+element.TITLE+""+element.BODY_FORMATED+""); //console.log (element.BODY_FORMATED); )); //stila ritināšana $(".tiešraides meklēšana").mCustomScrollbar(( scrollInertia: 500 )); ) )); ) var taimeris = 0; var q = ""; $(dokuments).ready(function() ( $("#q").keyup(function() ( q = this.value; clearTimeout(taimer); taimeris = setTimeout(get_result, 1000) ; )); $("#reset_live_search").click(function() ( $("#search_result").html(""); ));

keyup funkcija mēs saucam par get_result() funkciju, kas faktiski aizpilda div segvārdu ar id="search_result" Ajax.

mCustomScrollbar ir tikai stila izsaukums (to var izslēgt).

Mēs saņemam datus no /search/ajax_search.php JSON formātā.

Ar JS komponentu viss ir skaidrs, tagad redzēsim, kas notiek ajax_search.php:

Search(masīvs("VAUKĀJUMS" => $q, "SITE_ID" => LANG, "MODULE_ID" => "iblock", "CHECK_DATES" => "Y", "PARAM2" => "8")); $rezultāts = masīvs(); while ($res = $obSearch->GetNext())( $id = $res["ITEM_ID"]; //ja sadaļa ir atrasta: if (strripos($id, "S")!==false)( $result_item ["TITLE"] = $result_item["URL"] = $result_item["BODY_FORMATED"] = $res["TITLE_FORMATED"]; ) //ja nav S, tad else( $result_item["TITLE"] = $res["TITLE"]; $result_item["URL"] = $res["URL"]; $result_item[" BODY_FORMATED" ] = $res["BODY_FORMATED"]; $rezultāts = $rezultāts ) ) echo json_encode($result); ) ?>

Šajā gadījumā meklēšana tiek veikta ar Bitrix CSearch klases meklēšanas metodi. PARAM2 ierakstām, kurā informācijas blokā meklējam. Mēs ievietojam meklēšanas rezultātus $result masīvā. Lūdzu, ņemiet vērā, ka $res['ITEM_ID'] var ietvert vai nu vienumu, vai sadaļu. Atkarībā no tā, ko mēs atradām, sadaļā $result_item['BODY_FORMATED'] mēs ievietojam sadaļas nosaukumu vai teksta fragmentu no atrastā informācijas bloka elementa.

No autora: Sveiki draugi. Šajā rakstā mēs turpināsim vietnes reāllaika meklēšanu. Kas ir tiešā meklēšana? Jūs ar to saskaraties vienmēr, kad kaut ko meklējat Google vai Yandex. Tiklīdz jūs sākat rakstīt meklēšanas vaicājumu, meklētājprogramma nekavējoties sāk jums piedāvāt iespējas, no kurām jūs varat izvēlēties tikai piemērotāko. Ērta lieta, vai ne? Mēģināsim īstenot ko līdzīgu.

Pašreizējā raksta avota failus varat lejupielādēt no . Raksta pirmo daļu varat atrast vietnē.

Tātad pirmajā daļā mēs sagatavojām datu bāzi, kas tiks izmantota tiešai meklēšanai, kā arī pievienojām jQuery UI bibliotēkas automātiskās pabeigšanas logrīku mūsu lapas meklēšanas laukam. Pagaidām logrīks darbojas ar testa datiem, bet tagad mēs to labosim.

Vispirms norādīsim citu logrīka datu avotu, tas būs, teiksim, search.php fails, kas mums arī ir jāizveido.

$(funkcija())( $("#meklēšana").autocomplete(( avots: "search.php", )); ));

Tagad meklēšanas laukā ierakstīšu jebkuru rakstzīmi un apskatīšu, kas notiek pārlūkprogrammas konsolē.

Kā redzat, GET pieprasījums tiek nosūtīts ar termina parametru, kura vērtība ir meklēšanas laukā ievadītā virkne. Šajā gadījumā viss notiek asinhroni, nepārlādējot lapu, t.i. Tiek izmantots AJAX.

Lieliski, tagad atliek tikai pieņemt ienākošo meklēšanas pieprasījumu un sniegt uz to atbildi. Lai to izdarītu, jums būs jāizveido savienojums ar datu bāzes serveri un jāuzraksta vienkāršs kods, kas pēc pieprasījuma saņem datus no datu bāzes. Kods failā search.php būs aptuveni šāds:

$db = mysqli_connect("localhost", "root", "", "world") or die("Nav savienojuma ar datu bāzi"); mysqli_set_charset($db, "utf8") or die ("Savienojuma kodējums nav iestatīts"); /** * automātiskā meklēšana " %($search)%" LIMIT 10"; $res = mysqli_query($db, $query); $result_search = masīvs(); while($row = mysqli_fetch_assoc($res))( $result_search = masīvs("label" " => $rinda["Nosaukums"]); atgriezties $result_search; ) if(!empty($_GET["term"]))( $search = search_autocomplete(); exit(json_encode($search)); )

$ db = mysqli_connect ( "localhost", "root", "" , "world") vai mirst ( "Nav savienojuma ar datu bāzi") ;

mysqli_set_charset($db, "utf8") vai die( "Savienojuma kodējums nav iestatīts") ;

* meklēt automātiskās pabeigšanas daļas

funkcija search_autocomplete() (

globālais$db;

$meklēšana = trim(mysqli_real_escape_string($db, $_GET["term"]));

$res = mysqli_query($db, $query);

$rezultāta_meklēšana = masīvs();

while ($row = mysqli_fetch_assoc($res)) (

$result_search = masīvs("label" => $row["Nosaukums"]) ;

atgriezties $result_search;

if (! tukšs ($ _GET [ "termins" ] ) ) (

$meklēšana = meklēšanas_automātiskā pabeigšana();

iziet(json_encode($meklēt));

Lūdzu, ņemiet vērā, ka funkcijai search_autocomplete, kas saņem datus pēc pieprasījuma, šie dati ir jāatgriež noteiktā formātā, tai ir jābūt masīvam ar etiķešu taustiņiem un atrasto pilsētu vērtībām. Pēc funkcijas izsaukšanas dati ir jāpārvērš JSON formātā.

Atliek pārbaudīt mūsu tiešās meklēšanas darbību. Lai to izdarītu, tāpat kā iepriekšējo reizi, ierakstīsim tikai vienu burtu — a:

Lieliski! Atbildot uz to, saņēmām duci pilsētu, kuru nosaukumos bija ievadītais burts. Ja turpināsim rakstīt nosaukumu, opciju saraksts mainīsies, t.i. ar katru vēstuli tiks nosūtīts jauns AJAX pieprasījums.

Autors Ibrahims Diallo

Publicēts 2014. gada 2. jūlijā ~ 16 minūtes lasītas

Meklēšana ir svarīga tīmekļa vietnes funkcija. Kad mani daži lasītāji vēlas meklēt kādu konkrētu fragmentu manā emuārā, viņi izmanto meklēšanas lodziņu. Agrāk to nodrošināja Google meklēšana, taču kopš tā laika esmu to nomainījis uz savu mājās gatavoto versiju nevis tāpēc, ka varētu darīt labāk, bet gan tāpēc, ka tas bija interesants izaicinājums.

Ja jūs steidzaties un vienkārši vēlaties, lai jūsu vietne būtu meklējama, dariet to, ko es darīju iepriekš, izmantojiet Google.

// Search.php failā $term = isset($_GET["query"])?$_GET["query"]: ""; $term = urlencode($term); $vietne = urlencode("www.jusuvietne.lv"); $redirect = "https://www.google.com/search?q=site%3A($website)+($term)"; header("Atrašanās vieta: $redirect"); Izeja;

Tas, ko tas dara, ir diezgan vienkārši. Iegūstiet lietotāja nodoto vienumu un pārsūtiet to uz Google meklēšanas lapu. Ierobežojiet meklēšanas rezultātu līdz mūsu pašreizējam domēnam, meklēšanas vaicājumā izmantojot atslēgvārdu site:. Visas jūsu lapas, kuras ir indeksējis Google, tagad būs pieejamas, izmantojot meklēšanu. Ja tomēr vēlaties veikt meklēšanu mājās, turpiniet lasīt.

Pašdarināts meklēšanas risinājums

Pirms turpināt, mēģiniet izmantot šī emuāra meklēšanas lodziņu. Tas izmanto to pašu procesu, ko es aprakstīšu tālāk. Ja jūtat, ka tas ir tas, ko vēlaties, lūdzu, turpiniet lasīt.

Šis risinājums ir paredzēts mazām vietnēm. Es izmantoju LIKE ar aizstājējzīmēm abos galos, kas nozīmē, ka jūsu meklēšanu nevar indeksēt. Tas nozīmē, ka risinājums darbosies labi jūsu emuāram vai personiskajai vietnei, kurā nav daudz datu, un tas var kļūt ļoti lēns.

Piezīme: Ja jums ir 5000 emuāra ierakstu, jums joprojām viss ir kārtībā. .

Mēs ņemsim šī emuāra struktūru kā atsauci. Katram emuāra ierakstam ir:

  • Nosaukums p_title
  • URL p_url
  • Kopsavilkums p_summary
  • Ziņas saturs p_content
  • Un kategorijas kategorijas.birkas nosaukums

Katram laukam, kas atbilst mūsu meklēšanas vienumam, mēs piešķirsim tam punktu. Rezultāts tiks noteikts, pamatojoties uz spēles svarīgumu:

// precīza termina atbilstība ir atrodama virsrakstā $scoreFullTitle = 6; // atbilst nosaukumam daļā $scoreTitleKeyword = 5; // precīzas terminu atbilstības ir atrodamas kopsavilkumā $scoreFullSummary = 5; // atbilst kopsavilkuma daļai $scoreSummaryKeyword = 4; // precīzas terminu atbilstības ir atrodamas saturā $scoreFullDocument = 4; // atbilst dokumentam daļā $scoreDocumentKeyword = 3; // atbilst kategorijai $scoreCategoryKeyword = 2; // atbilst url $scoreUrlKeyword = 1;

Pirms sākam, ir daži vārdi, kas neveicina meklēšanu, un tie ir jānoņem. Piemērs "in","it","a","the","of" ... . Mēs tos izfiltrēsim un nekautrējieties pievienot jebkuru vārdu, kas, jūsuprāt, ir nebūtisks. Vēl viena lieta ir tā, ka mēs vēlamies ierobežot mūsu vaicājuma garumu. Mēs nevēlamies, lai lietotājs meklēšanas laukā uzrakstītu romānu un avarētu mūsu MySQL serveri.

// Noņemiet nevajadzīgos vārdus no meklēšanas vienuma un atgrieziet tos kā masīva funkciju filterSearchKeys($query)( $query = trim(preg_replace("/(\s+)+/", " ", $query)); $words = array( // paplašiniet šo sarakstu ar vārdiem $list = array("in","it","a","of","vai","jūs", "viņš","es","mēs","viņi","viņa","bet","tas","tas","tie","tad" foreach(eksplode("); ", $query) kā $key)(if (in_masīvs($key, $list))(turpināt; ) $vārdi = $key; if ($c >= 15)( break; ) $c++ ; ) atgriež $words ) // ierobežo vārdus rakstzīmju skaits funkcija limitChars($query, $limit = 200)( return substr($query, 0,$limit); )

Mūsu palīgfunkcijas tagad var ierobežot rakstzīmju skaitu un filtrēt nederīgus vārdus. Veids, kā mēs īstenosim savu algoritmu, ir norādīt punktu skaitu katru reizi, kad mēs atrodam atbilstību. Mēs saskaņosim vārdus, izmantojot frāzi if, un sakrāsim punktus, saskaņojot vairāk vārdu. Beigās mēs varam izmantot šo rezultātu, lai sakārtotu rezultātus

Piezīme: Es neparādīšu, kā izveidot savienojumu ar MySQL datu bāzi. Ja jums ir problēmas ar efektīvu savienojumu ar datu bāzi, iesaku izlasīt šo.

Vispirms piešķirsim savai funkcijai struktūru. Piezīme. Es atstāju vietturus, lai mēs varētu ieviest sadaļas atsevišķi.

Funkciju meklēšana($query)( $query = trim($query); if (mb_strlen($query)===0)( // nav nepieciešama tukša meklēšana, vai ne? return false; ) $query = limitChars($query) // Svēršanas rādītāji $scoreFullKeyword = 2 = filtrs SearchKeys( $escQuery = DB::escape ($query) = masīvs( $docSQL = masīvs(); p_id,p.p_title,p.p_date_publiced,p Kopsavilkums ".implode(" + ", $sumSQL) .")+ (-- dokuments ".implode(" + ", $docSQL).")+ (-- tags/kategorija ".implode(" + ", $ categorySQL).")+ (-- url ". implode(" + ", $urlSQL).")) kā atbilstība NO ziņas p WHERE p.status = "publicēts" IR atbilstība >

Vaicājumā visi rādītāji tiks summēti kā atbilstības mainīgais, un mēs varam to izmantot, lai kārtotu rezultātus.

Atbilstība pilniem gadījumiem

Vispirms pārliecināmies, ka mums ir daži atslēgvārdi, pēc tam pievienojam vaicājumu.

If (count($keywords) > 1)( $titleSQL = "if (p_title LIKE "%".$escQuery."%",($scoreFullTitle),0)"; $sumSQL = "if (p_summary LIKE "%" .$escQuery."%",($scoreFullSummary),0)"; $docSQL = "if (p_content LIKE "%".$escQuery."%",($scoreFullDocument),0)"; )

Tie ir mači ar augstāku rezultātu. Ja meklēšanas vienums atbilst rakstam, kurā tie ir ietverti, būs lielāka iespēja, ka tie tiks parādīti augšpusē.

Atbilstošie atslēgvārdi

Mēs pārbaudām visus atslēgvārdus un pārbaudām, vai tie atbilst kādam no laukiem. Kategorijas atbilstībai es izmantoju apakšvaicājumu, jo ziņai var būt vairākas kategorijas.

Foreach($keywords kā $key)( $titleSQL = "if (p_title LIKE "%.DB::escape($key)."%",($scoreTitleKeyword),0)"; $sumSQL = "if (p_summary LIKE "%".DB::escape($key).."%",($scoreSummaryKeyword),0)"; $docSQL = "if (p_content LIKE "%".DB::escape($key)."% ",($scoreDocumentKeyword),0)"; $urlSQL = "if (p_url LIKE "%".DB::escape($key).%",($scoreUrlKeyword),0)"; $categorySQL = "ja ( (SELECT count(category.tag_id) NO kategorijas JOIN post_category ON post_category.tag_id = category.tag_id WHERE post_category.post_id = p.post_id UN category.name = "".DB::escape($key)."") > 0 ,($scoreCategoryKeyword),0)";)

Kā norādīja komentētājs tālāk, mums ir jāpārliecinās, ka šie mainīgie nav tukši masīvi, pretējā gadījumā vaicājums neizdosies.

// Vienkārši, ja tas ir tukšs, pievienojiet 0 if (empty($titleSQL))( $titleSQL = 0; ) if (empty($sumSQL))( $sumSQL = 0; ) if (empty($docSQL))( $docSQL = 0; ) if (empty($urlSQL))( $urlSQL = 0; ) if (empty($tagSQL))( $tagSQL = 0; )

Beigās visi vaicājumi tiek savienoti un summēti, lai noteiktu ziņas atbilstību meklēšanas vienumam.

// Noņemiet nevajadzīgos vārdus no meklēšanas vienuma un atgrieziet tos kā masīva funkciju filterSearchKeys($query)( $query = trim(preg_replace("/(\s+)+/", " ", $query)); $words = array( // paplašiniet šo sarakstu ar vārdiem $list = array("in","it","a","of","vai","jūs", "viņš","es","mēs","viņi","viņa","bet","tas","tas","tie","tad" foreach(eksplode("); ", $query) kā $key)(if (in_masīvs($key, $list))(turpināt; ) $vārdi = $key; if ($c >= 15)( break; ) $c++ ; ) atgriež $words ; ) // ierobežo vārdus rakstzīmju skaits function limitChars($query, $limit = 200)( return substr($query, 0,$limit); ) function search($query)( $query = trim ($query); if (mb_strlen($query)===0)( // nav nepieciešama tukša meklēšana? return false; ) $query = limitChars($query) // Svēršanas rādītāji $scoreFullTitle = 6 $; scoreFullKeyword = 4; $keywords = filterSearchKeys($query); $escQuery = DB::escape($query); // skatiet piezīmi iepriekš, lai iegūtu db objektu $titleSQL = array(); $sumSQL = masīvs(); $docSQL = masīvs(); $kategorijaSQL = masīvs(); $urlSQL = masīvs(); /** Atbilstoši pilni gadījumi **/ if (count($keywords) > 1)( $titleSQL = "if (p_title LIKE "%".$escQuery."%",($scoreFullTitle),0)"; $sumSQL = "if (p_summary LIKE "%".$escQuery."%",($scoreFullSummary),0)"; $docSQL = "if (p_content LIKE "%".$escQuery."%",($scoreFullDocument), 0)"; ) /** Atbilstoši atslēgvārdi **/ foreach($keywords kā $key)( $titleSQL = "if (p_title LIKE "%".DB::escape($key)."%",($scoreTitleKeyword ),0)"; $sumSQL = "if (p_summary LIKE "%".DB::escape($key)."%",($scoreSummaryKeyword),0)"; $docSQL = "if (p_content LIKE "%" ".DB::escape($key).."%",($scoreDocumentKeyword),0)" $urlSQL = "if (p_url LIKE "%.DB::escape($key).."%", ( $scoreUrlKeyword),0)"; $categorySQL = "if ((SELECT count(category.tag_id) NO kategorijas JOIN post_category ON post_category.tag_id = category.tag_id WHERE post_category.post_id = p.post_id UN category.name = "") DB::escape($key)."") > 0,($scoreCategoryKeyword),0)"; ) // Ja tas ir tukšs, pievienojiet 0 if (empty($titleSQL))( $titleSQL = 0 ) if (empty($sumSQL))($sumSQL = 0; ) if (tukšs($docSQL))( $docSQL = 0; ) if (empty($urlSQL))( $urlSQL = 0; ) if (empty($tagSQL))( $tagSQL = 0; ) $sql = " SELECT p.p_id,p.p_title,p.p_date_publiced,p.p_url, p.p_summary,p.p_content,p.thumbnail, ((-- Virsraksta rezultāts ".implode(" + ", $titleSQL). ")+ (-- Kopsavilkums ".implode(" + ", $sumSQL).")+ (-- dokuments ".implode(" + ", $docSQL).")+ (-- tags/kategorija ".implode" (" + ", $categorySQL) atbilstība DESC,p.page_views DESC LIMIT 25"; $rezultti = DB::query($sql); if (!$results)( return false; ) return $results; )

Tagad jūsu search.php fails var izskatīties šādi:

$term = isset($_GET["vaicājums"])?$_GET["vaicājums"]: ""; $meklēšanas_rezultāti = meklēšana($terms); if (!$search_results) ( atbalss "Nav rezultātu"; iziet; ) // Šeit izdrukājiet lapu ar rezultātiem.

Mēs izveidojām vienkāršu meklēšanas algoritmu, kas spēj apstrādāt pietiekami daudz satura. Es patvaļīgi izvēlējos katras spēles rezultātu, jūtieties brīvi pielāgot to kaut ko tādu, kas jums vislabāk atbilst. Un vienmēr ir vietas uzlabojumiem.

Ieteicams izsekot lietotāju meklēšanas vienumam, tādējādi varat redzēt, vai lielākā daļa lietotāju meklē vienu un to pašu. Ja ir modelis, varat saglabāt viņiem ceļojumu un vienkārši saglabāt rezultātus kešatmiņā, izmantojot Memcached.

Ja vēlaties redzēt šo meklēšanas algoritmu darbībā, turpiniet un mēģiniet meklēt rakstu meklēšanas lodziņā lapas augšpusē. Esmu pievienojis papildu funkcijas, piemēram, tās daļas atgriešanu, kurā tekstā tika atrasta atbilstība. Jūtieties brīvi pievienot savas funkcijas.

Vai jums patika šis raksts? Varat abonēt, lai lasītu vēl satriecošākus. .

Saistībā ar to šeit ir daži interesanti raksti.

Ja ir kāda lieta, ko tīmekļa serveris dara katru dienu, tas ir savienojuma izveide ar datu bāzi. Es izmantoju PHP jau daudzus gadus, taču, ja jūs lūdzat man uzrakstīt skriptu, lai izgūtu datus no datu bāzes, es nevarētu to izdarīt, neatgriežoties pie Ultimate PHP rokasgrāmatas, lai vispirms atrastu dažus piemērus.

Pirms dažiem mēnešiem es atjaunināju savu PHP versiju. PHP 5.4–5.5. Man nekad agrāk nebija problēmu ar PHP atjaunināšanu. Es rūpīgi sekoju tās attīstībai un cenšos noņemt savas novecojušās funkcijas ilgi pirms to oficiālās noņemšanas. Taču šoreiz mani pieķēra nejauši. Bēdīgākā iemesla dēļ tas klusībā salauza daļu no manas vietnes.

Komentāri (45)

Zariels 2015. gada 12. augusts:

Īans Mustafa 2015. gada 26. septembris:

Rob 2015. gada 29. septembris:

adeem 2016. gada 11. februāris:

Ivans Venediktovs 2016. gada 9. aprīlis.

Šajā rakstā es parādīšu, kā jūs varat izveidot daudzlīmeņu izvēlne PHP un MySQL. Protams, jūs varat izdomāt daudzas iespējas, kā to izveidot, taču, spriežot pēc jūsu jautājumu skaita par šo tēmu, jums ir nepieciešams piemērs. Un es to sniegšu šajā rakstā. Ļaujiet man uzreiz atzīmēt, ka šim rakstam ir jēga tikai tiem, kas zina PHP un zina, kā ar to strādāt MySQL. Visiem pārējiem tas vispirms ir jāiziet vai jāizlasa dažas grāmatas PHP un MySQL.

Vispirms datu bāzē izveidosim tabulu ar šādiem laukiem:

  • id- unikāls identifikators.
  • virsraksts- enkura saites izvēlnē.
  • saite- adrese, uz kuru vedīs izvēlnes vienums.
  • vecāku_id- vecāku ID. Ja nav vecāka vienuma, tad tas būs NULL (vai arī varat ievietot 0).

Esam sakārtojuši tabulu, tagad ir pienācis laiks PHP kods. Pilns PHP kods ir norādīts zemāk:

$mysqli = jauns mysqli("localhost", "root", "", "db"); // Izveidojiet savienojumu ar datu bāzi
$result_set = $mysqli->query("SELECT * FROM `menu`"); // Tabulā ar izvēlni atlasiet visus ierakstus
$preces = masīvs(); // Masīvs izvēlnes vienumiem
while (($rinda = $result_set->fetch_assoc()) != false) $items[$row["id"]] = $rinda; // Aizpildiet masīvu ar paraugu no datu bāzes
$bērni = masīvs(); // Masīvs bērnu elementu saskaņošanai ar vecākiem
foreach ($items kā $item) (
if ($item["parent_id"]) $bērni[$item["id"]] = $prece["parent_id"]; // Aizpildiet masīvu
}
funkcija printItem($item, $items, $childrens) (
/* Parādīt izvēlnes vienumu */
atbalss"

  • ";
    atbalss "".$item["nosaukums"]."";
    $ul = nepatiess; // Vai bērni tika renderēti?
    kamēr (patiess) (
    /* Bezgalīga cilpa, kurā mēs meklējam visus bērnus */
    $atslēga = masīva_meklēšana($vienums["id"], $bērni); // Meklē bērnu elementu
    if (!$key) (
    /* Bērni nav atrasti */
    ja ($ul) atbalss ""; // Ja tika parādīti bērnu elementi, aizveriet sarakstu
    pārtraukums; // Iziet no cilpas
    }
    unset($bērni[$atslēga]); // Noņemiet atrasto elementu (lai tas vairs netiktu parādīts)
    ja (!$ul) (
    atbalss"
      "; // Sāciet iekšējo sarakstu, ja vēl nav pakārtotu elementu
      $ul = patiess; // Uzstādiet karogu
      }
      echo printItem($preces[$key], $preces, $childrens); // Rekursīvi parādīt visus pakārtotos elementus
      }
      atbalss"";
      }
      ?>

      Šis kods pilnībā darbojas, taču jums jāsaprot, ka neviens šādā veidā neraksta (jo īpaši, izvadot caur atbalss HTML tagi). Un jūsu uzdevums ir ņemt algoritmu no šī koda, bet ne pašu kodu. Un pēc tam pievienojiet šo algoritmu savam dzinējam. Es mēģināju rūpīgi komentēt izvades kodu daudzlīmeņu izvēlne PHP un MySQL, bet, protams, tas nav tas pārskatāmākais un prasa diezgan labas sākotnējās zināšanas. Ja jūs joprojām labi nezināt PHP un MySQL, tad es ļoti iesaku vispirms to iziet cauri

      veidne

      Tās veidnes nosaukums, pēc kuras ir jāparāda vietnes meklēšanas rezultāti. XSLT veidņu dzinējā ignorēts.

      Search_string

      Meklēšanas frāze. Ja vērtība nav norādīta, tā tiek ņemta no pieprasījuma, kas nosūtīts, izmantojot meklēšanas formu.

      Search_types

      Meklēšanas hierarhisko tipu identifikatoru saraksts (norādīts, atdalot ar atstarpi). Ja vērtība nav norādīta, meklēšana tiek veikta visos veidos.

      Search_branches

      Sadaļu saraksts, kurās tiks veikta meklēšana (norādīta ar atstarpi). Ja vērtība nav norādīta, meklēšana tiek veikta visās sadaļās. Parametrs var pieņemt gan lapu ID, gan to URL.

      uz_lapu

      Rezultātu skaits vienā lapā. Ja parametrs nav norādīts, tiks ņemta moduļa "Meklēt" iestatījumos norādītā vērtība.

      %Kopā%

      Parāda kopējo ziņu vienumu skaitu plūsmā. Var izmantot makro % sistēmas numpages()%.

      %per_page%

      Parāda parametra per_page vērtību. Var izmantot makro % sistēmas numpages()%.

      %list-class-first%

      ja elements ir pirmais, izvada "pirmais"

      %list-class-last%

      ja elements ir pēdējais, izvada "pēdējais"

      %list-class-odd%

      ja elements ir pāra, drukā "nepāra"

      %list-class-paven%

      ja elements ir nepāra, drukā "pāra"

      %list-position%

      ievieto sarakstā sērijas numuru

      search_empty_result

      Izmanto, ja meklēšanas rezultātā netika atrasta neviena lapa. Šajā gadījumā šis bloks tiek izvadīts bloka vietā meklēšanas_bloks .

      %last_search_string%

      Parāda iepriekšējo meklēšanas vaicājumu, ja tāds bija.

      search_block_line_quant

      Izvada atdalītāju, kas tiek ievietots starp meklēšanas rezultātiem.

      Lietošanas piemēri

      Atrastas %total% lapas.

      %lines%

      %sistēmas lapas(%kopā%, %per_page%)%

      BEIGAS; $FORMS ["search_block_line"] =<< %num%. %name%%context%

      BEIGAS; $FORMS ["search_empty_result"] =<<Atvainojiet. Šim pieprasījumam nekas netika atrasts.

      BEIGAS; ?>