Jump to content
php.lv forumi

Kategorijas un sub-kategorijas


Bilty

Recommended Posts

Labdien, saskāros ar nopietnu problēmu izstrādājot vienu lapu. Tātad ir nepieciešams kaut kas tāds : 

 

 

http://prntscr.com/3tef6b

 

 

Pašlaik esmu ticis tik tālu : http://prntscr.com/3tefd2 

 

Viss jau būtu ok, caur admincp pievienoju kategoriju - kas nonāk category table un pēc tam caur admin cp pievienoju attiecgi subkategoriju : 

 

Taču, kā jau redzams bildē #2, subkategorija var būt tikai viena, respektīvi, ja piemēram pievino vairākas subkategorijas vienai kategorijai, tad iet kkas tāds : 

 

Kategorija #1 

  • Sub kategorija #1

Kategorija #1 

  • Sub kategorija #2

Nevis : 

 

Kategorija #1 

 

  • sub kategorija #1
  • sub kategorija #2

 

Tabulas : 

Priekš subkat - http://prntscr.com/3teg5c 

 

Priekš kategorijām : http://prntscr.com/3teg85

 

 

Un izvelku rezultātus : 


<div id='cssmenu'>
<ul>
<?php

$q = mysql_query("SELECT `category`.`name`, `globcat`.`catname` FROM `category` LEFT JOIN `globcat` ON `category`.`parent_id` = `globcat`.`id`") or die(mysql_error());

while ($row = mysql_fetch_assoc($q)) {
	# code...
?>
   <li class='has-sub'><a href='#'><span><?php echo $row['catname'];?></span></a>
      <ul>
         <li><a href='#'><span><?php echo $row['name'];?></span></a></li>
      </ul>  
   </li>
<?php
}


?>

</ul>
</div>

Ceru uz palīdzību, paldies :))

Link to comment
Share on other sites

Ar to query nedabūsi tādu struktūru.

 

Es darītu tā, ka uztaisītu 2 atsevišķus kverijus, vienu uz `category` tabulu un otru uz `globcat`, 

pēc tam ar php foreach ietu cauri pirmajam masīvam, un iekšā uztaisītu otru foreach, kas balstoties uz parent_id, izvelk subitemus.

 

Apmēram tā:

<?php

$globcats = array();
$q = mysql_query("SELECT * FROM `globcat`") or die(mysql_error());
while ($row = mysql_fetch_assoc($q)) {
  array_push($globcats, $row);
}

$subcats = array();
$q = mysql_query("SELECT * FROM `category`") or die(mysql_error());
while ($row = mysql_fetch_assoc($q)) {
  array_push($subcats, $row);
}


?><div id='cssmenu'>
<ul>
<?php foreach ($globcats as $globcat): ?>
   <li class='has-sub'><a href='#'><span><?php echo $globcat['catname'];?></span></a>
      <ul>
         <?php foreach ($subcats as $subcat): ?>
           <?php if ($subcat['parent_id'] == $globcat['id']): ?>
             <li><a href='#'><span><?php echo $subcat['name'];?></span></a></li>
           <?php endif; ?>
         <?php endforeach; ?>
      </ul>  
   </li>
<?php endforeach; ?>
</ul>
</div>
Edited by gurkjis
Link to comment
Share on other sites

 

Ar to query nedabūsi tādu struktūru.

 

Es darītu tā, ka uztaisītu 2 atsevišķus kverijus, vienu uz `category` tabulu un otru uz `globcat`, 

pēc tam ar php foreach ietu cauri pirmajam masīvam, un iekšā uztaisītu otru foreach, kas balstoties uz parent_id, izvelk subitemus.

 

Apmēram tā:

<?php

$globcats = array();
$q = mysql_query("SELECT * FROM `globcat`") or die(mysql_error());
while ($row = mysql_fetch_assoc($q)) {
  array_push($globcats, $row);
}

$subcats = array();
$q = mysql_query("SELECT * FROM `category`") or die(mysql_error());
while ($row = mysql_fetch_assoc($q)) {
  array_push($subcats, $row);
}


?><div id='cssmenu'>
<ul>
<?php foreach ($globcats as $globcat): ?>
   <li class='has-sub'><a href='#'><span><?php echo $globcat['catname'];?></span></a>
      <ul>
         <?php foreach ($subcats as $subcat): ?>
           <?php if ($subcat['parent_id'] == $globcat['id']): ?>
             <li><a href='#'><span><?php echo $subcat['name'];?></span></a></li>
           <?php endif; ?>
         <?php endforeach; ?>
      </ul>  
   </li>
<?php endforeach; ?>
</ul>
</div>

Milzīgs tev paldies. Kaut kā būs jātlīdzīna... PALDIES

Link to comment
Share on other sites

Ok ja gribi atlīdzināt, tad ņem vērā un centies realizēt šādas lietas, lai pasauli padarītu labāku:

 

1. maksimāli, kur notiek kaut kāda datu sagatavošana, vai izvilkšana no db, to liec pirms templeita izvadīšanas

2. varbūt labāk paņem kādu frameworku, kurā būtu vienkārši lietojams ORM, nevis pliku php aiztiec un raksti primitīvus kverijus ar roku

3. kāpēc 1. līmeņa un 2. līmeņa kategorijas Tev ir atsevišķās tabulās ? Tām taču ir kopēja nozīme un loģika, var likt vienā tabulā... Tādā gadījumā pietiktu ar 1 kveriju.

Link to comment
Share on other sites

Ok ja gribi atlīdzināt, tad ņem vērā un centies realizēt šādas lietas, lai pasauli padarītu labāku:

 

1. maksimāli, kur notiek kaut kāda datu sagatavošana, vai izvilkšana no db, to liec pirms templeita izvadīšanas

2. varbūt labāk paņem kādu frameworku, kurā būtu vienkārši lietojams ORM, nevis pliku php aiztiec un raksti primitīvus kverijus ar roku

3. kāpēc 1. līmeņa un 2. līmeņa kategorijas Tev ir atsevišķās tabulās ? Tām taču ir kopēja nozīme un loģika, var likt vienā tabulā... Tādā gadījumā pietiktu ar 1 kveriju.

Nevarēju īsti izdomāt, kā... Jo man ir select kur ir visas kategorijas. Tev ir skype ?:)

Link to comment
Share on other sites

āh, ORMam pat nevajag veselu frameworku, man pašam patika lietot http://redbeanphp.com/ - super ērts.

 

Modernos PHP frameworkus neesmu lietojis, bet esmu lasījis, ka labi ir http://laravel.com/ un http://fuelphp.com/ 

 

Manā skatījumā, iesācējam labs frameworks ir tāds, kurš ir viegli apgūstams un lietojams.

Taču šajā jautājumā varbūt citi foruma biedri varētu ko ieteikt.

Link to comment
Share on other sites

$mainCategories = Db::prepare('SELECT `id`, `name` FROM `categories` WHERE `parent_id` = 0')->fetchAll(); // array()

$subCategoryStmt = Db::prepare('SELECT `name` FROM `categories` WHERE `parent_id` = ?');

 

foreach ($mainCategories as $category)

{

$category['subcategories'] = $subCategoryStmt->fetchAll(array($category['id'])); // array()

}

?>

<div id="cssmenu">

<ul>

<?php foreach ($mainCategories as $mainCategory) { ?>

<li<?php if (!empty($mainCategory['subcategories'])) { echo ' class="has-sub"'; } ?>>

<a href="#">

<span><?php echo htmlspecialchars($mainCategory['name']); ?></span><!-- te reāli var mierīgi iztikt bez spana -->

</a>

<?php if (!empty($mainCategory['subcategories'])) { ?>

<ul>

<?php foreach ($mainCategory['subcategories'] as $subcategory) { ?>

<li>

<a href="#">

<span><?php echo htmlspecialchars($subcategory['name']); ?></span><!-- te reāli var mierīgi iztikt bez spana -->

</a>

</li>

<?php } ?>

</ul>

<?php } ?>

</li>

<?php } ?>

</ul>

</div>

Edited by jurchiks
Link to comment
Share on other sites

$mainCategories = Db::prepare('SELECT `id`, `name` FROM `categories` WHERE `parent_id` = 0')->fetchAll(); // array()
$subCategoryStmt = Db::prepare('SELECT `name` FROM `categories` WHERE `parent_id` = ?');

foreach ($mainCategories as $category)
{
    $category['subcategories'] = $subCategoryStmt->fetchAll(array($category['id'])); // array()
}
?>
<div id="cssmenu">
	<ul>
		<?php foreach ($mainCategories as $mainCategory) { ?>
		<li<?php if (!empty($mainCategory['subcategories'])) { echo ' class="has-sub"'; } ?>>
			<a href="#">
				<span><?php echo htmlspecialchars($mainCategory['name']); ?></span><!-- te reāli var mierīgi iztikt bez spana -->
			</a>
			<?php if (!empty($mainCategory['subcategories'])) { ?>
				<ul>
					<?php foreach ($mainCategory['subcategories'] as $subcategory) { ?>
					<li>
						<a href="#">
							<span><?php echo htmlspecialchars($subcategory['name']); ?></span><!-- te reāli var mierīgi iztikt bez spana -->
						</a>
					</li>
					<?php } ?>
				</ul>
			<?php } ?>
		</li>
		<?php } ?>
	</ul>
</div>

Paldies :) Interesanti apskatīties visus variantus! 

Link to comment
Share on other sites

Kā varētu vislabāk vēl iedalīt vispār šādai navigācijai? Piemēram, uzspiežot - Kategorija - subkategorija uz kādas no subkategorijam, lai taa atveraas kaut kada lapa un tur rādas visas preces zem šīs subkategorijas. 

<?php

$globcats = array();
$q = mysql_query("SELECT * FROM `globcat`") or die(mysql_error());
while ($row = mysql_fetch_assoc($q)) {
  array_push($globcats, $row);
}

$subcats = array();
$q = mysql_query("SELECT * FROM `category`") or die(mysql_error());
while ($row = mysql_fetch_assoc($q)) {
  array_push($subcats, $row);
}


?><div id='cssmenu'>
<ul>
<?php foreach ($globcats as $globcat): ?>
   <li class='has-sub'><a href='#'><span><?php echo $globcat['catname'];?></span></a>
      <ul>
         <?php foreach ($subcats as $subcat): ?>
           <?php if ($subcat['parent_id'] == $globcat['id']): ?>
             <li><a href='#'><span><?php echo $subcat['name'];?></span></a></li>
           <?php endif; ?>
         <?php endforeach; ?>
      </ul>  
   </li>
<?php endforeach; ?>
</ul>
</div>

tieši šim

Edited by Bilty
Link to comment
Share on other sites

It kā izdomāju risinājumu, tātad izveidojot papildfailu, teiksim cat.php 

 

mērķis tāds : uzspiežot uz kādas no navigācijas iespējam, teiksim Kokmateriāli (kategorija) - ozols (subkat) , tad, lai lietotājs tiktu pārmests uz

 

Mans links pagaidām : 

localhost/parkets/cat&Apgaismojums&Sveces

 

cat - faila nosaukums

Apgaismojums - padotā kategorija no navigācijas

Sveces - Apgaismojuma subkategorija

 

Kā, lai tagad pieprasīto rezultātu apstrādā? 

 

ķipa select * from ... where category_name = 'Apgaismojums' AND sub_cat = Sveces

Edited by Bilty
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...