Jump to content
php.lv forumi

Kategorijas un sub-kategorijas


Recommended Posts

Posted

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

Posted (edited)

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
Posted

 

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

Posted

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.

Posted

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 ?:)

Posted

Ar individuālām konsultācijām nenodarbojos. 

Kad saliksi 1. un 2. līmeņa kat. vienā tabulā, tad arī būs 1 selektā, tikai 1. līmenim parent_id būs 0.

Posted

Ar individuālām konsultācijām nenodarbojos. 

Kad saliksi 1. un 2. līmeņa kat. vienā tabulā, tad arī būs 1 selektā, tikai 1. līmenim parent_id būs 0.

Kuru frameworku tu ieteiktu sākt lietot kā pirmo?

Posted

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

Posted (edited)

$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
Posted
$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! 

Posted (edited)

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
Posted (edited)

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
Posted

kategorijas gan urlī, gan kverijā norādi ar id... pēc nosaukuma nevajag identificēt.

 

Katrai precei jābūt category_id, pēc tās arī tad taisi selectu un iegūsi preces,kas ir šajā kategorijā.

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