PDA

View Full Version : حرفه ای: قسمت مجموعه در زیر مجموعه برای ساختن موضوعات



armsoftpc
پنج شنبه 19 آبان 1390, 19:21 عصر
به نام خدا
با سلام
من در قسمت نمایش پدر و فرزند زیر هم دیگر مشکل دارم ، چگونه هر فرزندی را زیر پدر خود نمایش دهیم ، حتی اگه بین آن ها موضوعی درج شود و آن موضوع خود بچه ی پدری باشد.
ممکن است منظور من را متوجه نشده باشید، اما به کد زیر دقت کنید:


<?php
function arm_nbsp($n_id) {
$x='';
$result=arm_query("select depth from `cats` where cat_id='$n_id'");
$row=$result->fetch_array();
$p=$row[0];
for($i=0; $i<$p; $i++) {
$x.="&nbsp;&nbsp;&nbsp;";
}
return $x;
}


if(isset($_POST["a_cat_id"]))
{
@$cat_id=$_POST["a_cat_id"];
@$cat_name=$_POST["a_cat_name"];
@$parent_id=$_POST["a_parent_id"];

$q_depth=arm_query("select depth from cats where cat_id='$parent_id'");
$f_depth=$q_depth->fetch_array();
$f_depth=$f_depth[0];

if($parent_id==0) {
$cat_depth=0;
echo "<br /> شرط اول اجرا شد";
}
else {
$cat_depth=$f_depth;
$cat_depth=$cat_depth+1;
echo "<br /> شرط دوم اجرا شد";
}
echo "<br />عمق: ".$cat_depth;

arm_query("insert into cats value ('$cat_id', '$parent_id', '$cat_name', '$cat_depth')");
}
/*$arm_var=new ARM_DB;
$arm_var=$arm_var->getnewid();*/
?>
<form action="index.php" method="post">
شناسه موضوع:<input type="text" name="a_cat_id"><br>
نام موضوع:<input type="text" name="a_cat_name"><br>
<?php
$result=arm_query("select * from cats order by depth");
echo "زير مجموعه: <select name='a_parent_id' dir='rtl'>";
echo '<option value="0" selected="selected">&mdash; مادر دسته &mdash;</option><br>';

for($i=0; $i<$result->num_rows; $i++) {
$row = $result->fetch_object();
$r_cat_id=$row->cat_id;
$r_cat_name=$row->cat_name;

echo '<option value="'.$r_cat_id.'">'.arm_nbsp($r_cat_id).$r_cat_name.'</option><br>';
}
echo '</select>';

?><br />
<input type="submit" value="ارسال" />
</form>

در ضمن تابع arm_query همان برابر تابع mysql_query است.
دوستان یه بار این کد را اجرا کنند ، همانطور که می بینید کد مشکل ندارد اما مجموعه در زیر مجموعه خود نمایش داده نمی شود.
کد زیر هم sql جدول هایی که به آن متصل می شود است:

CREATE TABLE `cats` (
`cat_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`parent_id` int(11) NOT NULL DEFAULT '0',
`cat_name` varchar(255) NOT NULL DEFAULT '',
`depth` int(5) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`cat_id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
INSERT INTO `cats` VALUES (1,0,'بازی',0);
INSERT INTO `cats` VALUES (2,1,'استراتژیک',1);
INSERT INTO `cats` VALUES (3,1,'ماجرایی',1);
INSERT INTO `cats` VALUES (4,2,'جنگهای صلیبی',2);
INSERT INTO `cats` VALUES (5,0,'نرم افزار',0);
INSERT INTO `cats` VALUES (6,5,'شبکه',1);
INSERT INTO `cats` VALUES (7,5,'برنامه نویسی',1);
INSERT INTO `cats` VALUES (8,5,'گرافیک',1);
INSERT INTO `cats` VALUES (9,0,'موسیقی',0);
INSERT INTO `cats` VALUES (10,5,'فارسی',1);
INSERT INTO `cats` VALUES (11,3,'شیکاگو',2);
INSERT INTO `cats` VALUES (12,10,'سالنامه سلامت',2);

اینم فیلمی از کار:
77708

armsoftpc
شنبه 21 آبان 1390, 18:15 عصر
به نام خدا
با سلام
یعنی این کد ، این قدر سخته که دوستان هیچ راهنمایی نمی کنند.:افسرده:
کد زیر هم هین کار را می کنه ولی در دیتابیس به جای فیلد depth ، نام اون به children تغییر کرده که دو عدد 0 و 1 را می گیرد(بولین).

<?php
$table_width = '580';
class treenode
{
// each node in the tree has member variables containing
// all the data for a post except the body of the message
public $m_postid;
public $m_title;
public $m_children;
public $m_childlist;
public $m_depth;
public $m_group;

public function __construct($postid, $title, $children,
$expand, $depth, $expanded, $sublist)
{
$this->m_postid = $postid;
$this->m_title = $title;
$this->m_children =$children;
$this->m_childlist = array();
$this->m_depth = $depth;
$this->m_group= array();

if(($sublist||$expand) && $children)
{
$result=arm_query("select * from cats where parent_id = $postid order by cat_id", 1, "درخواست را نمی تواند اجرا کند", 0);

for ($count=0; $row = @$result->fetch_assoc(); $count++)
{
if(@$sublist||@$expanded[ $row['cat_id'] ] == true)
$expand = true;
else
$expand = true;
$this->m_childlist[$count]= new treenode($row['cat_id'],$row['cat_name'],
$row['children'], $expand,
$depth+1, $expanded, $sublist);
}
}
}

public function _group() {
array_push($this->m_group,$this->m_title);
$mums_di=sizeof($this->m_group);
for($ii=0; ($ii<$this->m_group); $ii++) {
$depo[$ii]=$this->m_group;
}
return $depo;
}

function display($row, $sublist = false)
{

if($this->m_depth>-1)
{
//color alternate rows
echo '<tr><td bgcolor = ';
if ($row%2)
echo "'#cccccc'>";
else
echo "'#ffffff'>";

// indent replies to the depth of nesting
$f='';
for($i = 0; $i<$this->m_depth; $i++)
{
//echo "<img src = '".ARM_IMG."/spacer.gif' height='22' width ='22' alt = '' valign = 'bottom' />";
$f.="&nbsp;&nbsp;&nbsp;";
echo $f;
}




/*
// display + or - or a spacer
if ( !$sublist && $this->m_children && sizeof($this->m_childlist))
{
// we are expanded - offer button to collapse
echo "<a href = 'index.php?collapse=".$this->m_postid."#$this->m_postid'>
<img src = '".ARM_IMG."/minus.gif' valign = 'bottom' height = 22 width = 22 alt = 'Collapse Thread' border = 0 />
</a>";
}
else if(!$sublist && $this->m_children)
{
// we are collapsed - offer button to expand
echo "<a href = 'index.php?expand=".$this->m_postid."#$this->m_postid'>
<img src ='".ARM_IMG."/plus.gif' height='22' width='22' alt = 'Expand Thread' border=0 />
</a>";
}
else
{
// we have no children, or are in a sublist, do not give button
echo "<img src ='".ARM_IMG."/spacer.gif' height = 22 width = 22 alt = '' valign = 'bottom' />";
}*/
$this->m_group[$row]="$this->m_title";

/*echo "<a name=$this->m_postid>
<a href = 'view_post.php?postid=$this->m_postid'>$this->m_title".'</a></a>';
echo '</td></tr>';*/
print_r( $this->m_group);

$row++; // increment row counter to alternate colors
}

$num_children = sizeof($this->m_childlist);
for($i = 0; $i<$num_children; $i++)
{
$row = $this->m_childlist[$i]->display($row, $sublist);
}

return $row;
}

};
اگه امکان داره ، توی cms ها و برنامه هایی که خودشون نوشتن ، این قسمت از کدشون را که در مورد مجموعه هاست ، برای بنده بزارن یا حداقل یه راهنمایی خوب بکنند.
خیلی نیاز دارم.
موفق باشید.

Arthas1990
شنبه 21 آبان 1390, 22:53 عصر
اگه تعداد depth هات مشخصه ازشون سلکت بگیر و همه رو جوین کن

اگه 3 تاست م3 زیر بنویسش

SELECT cats . * , ctname, ctname2
FROM `cats`
LEFT JOIN (

SELECT cat_id, cat_name AS ctname,parent_id as pid2
FROM cats
WHERE depth =1
) AS tbl2 ON cats.parent_id = tbl2.cat_id
LEFT JOIN (

SELECT cat_id, cat_name AS ctname2
FROM cats
WHERE depth =0
) AS tbl1 ON tbl2.pid2= tbl1.cat_id



امیدوارم کمکی کرده باشم

armsoftpc
چهارشنبه 25 آبان 1390, 15:47 عصر
به نام خدا
با سلام
با تشکر از این که پاسخ دادید ، اما کدتون به کارم نیومد و اصلا کار من ربطی به mysql ندارد و اصل کار ما با php است ، در ضمن فیلد dept که در کد بالا هم قرار داده بودم هم لازم نداریم و فقط به فیلد های cat_id, paren_id, cat_name احتیاج داریم ، همچینین ما می خواهیم کدی بنویسیم که n زیر مجموعه و پدر داشته باشد نه 3 تا!
دوستان هم که خدا شکر هیچ کمکی نمی کنند .:خجالت:
به کار پروژه خودتون هم می خوره! چون این کد خیلی مهمه.
موفق باشید.

pejman_view
چهارشنبه 25 آبان 1390, 16:39 عصر
سلام دوست من armsoftpc

نمی دانم چرا اینقدر ناراحتی اما به این فکر کنید ممکن است این دوستانی که نام بردی هم اکنون در سایت آنلاین نباشند. و مشکل شما هم اصلاً سخت نیست! فقط یک کم خلاقیت و فکر می خواد که همه این برنامه نویس ها هم که نام بردی مثل شما همین کار رو می کنند من هم برای شما کد با اون چیزهایی که می خواستی نوشتم... و توضیحاتم بصورت کامنت اوردم.



<?php
// Store categories in an array for use later:
$tasks = array();
while (list($cat_id, $parent_id, $cat_name) = mysqli_fetch_array($r, MYSQLI_NUM)) {
// Add to the array:
$tasks[] = array('cat_id' => $cat_id, 'parent_id' => $parent_id, 'cat_name' => $cat_name);
}

// Sort categories by parent_id:
function parent_sort ($x, $y) {
return ($x['parent_id'] > $y['parent_id']);
}
usort ($tasks, 'parent_sort');
// Display all the categories:
echo '<h3>categories</h3><ul>';
foreach ($tasks as $cat) {
echo "<li>{$cat['cat_name']}</li>\n";
}
echo '</ul>';

?>

armsoftpc
چهارشنبه 25 آبان 1390, 23:31 عصر
به نام خدا
با سلام

نمی دانم چرا اینقدر ناراحتی
ناراحت نیستم ، به مشکل برخوردم.

اما به این فکر کنید ممکن است این دوستانی که نام بردی هم اکنون در سایت آنلاین نباشند.
یعنی در ظرف این یه هفته هیچ کدوم آنلاین نشده اند، اسامی حذف شد.


فقط یک کم خلاقیت و فکر می خواد که همه این برنامه نویس ها هم که نام بردی مثل شما همین کار رو می کنند من هم برای شما کد با اون چیزهایی که می خواستی نوشتم... و توضیحاتم بصورت کامنت اوردم.
با عرض خسته نباشید ، اما کد شما هم اشکال داره ، چون فرزند ها را زیر پدرشون لیست نمی کنه ، البته این نکته رو بگم که مشکل من چند ساعت پیش حل شد.
موفق باشید.

pejman_view
پنج شنبه 26 آبان 1390, 00:37 صبح
یعنی در ظرف این یه هفته هیچ کدوم آنلاین نشده اند، اسامی حذف شد.

ببخشید شاید آن ها هم مانند من این تاپیک را ندیده بودند



با عرض خسته نباشید ، اما کد شما هم اشکال داره ، چون فرزند ها را زیر پدرشون لیست نمی کنه ، البته این نکته رو بگم که مشکل من چند ساعت پیش حل شد.

درسته الان کد با دقت نگاه کردم اون کار رو نمی کنه اون یه ذره پیچیده تره اما نه زیاد! اون هم خواستید توضیح بدم بگید تا براتون توضیح بدم.
و خوشحالم که تونستید مشکلتون رو برطرف کنید دفعه بعد اگر دیدید کسی جواب نمی داد به خودم پیام خصوصی بده لینک تاپیکتو بده تا جایی که در توانم باشه کمکتون می کنم.

با تشکر