رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
کجای این تابع بازگشتی درست نیست؟ (حل شد)
#1
سلام استاد

در فراخوانی این تابع چه مشکلی وجود دارد؟

<?php function Display($comment){
    $name= CHtml::encode($comment->name);
    $date= JDF::jdate('l Y/m/d - h:i.a',$comment->create_time);
    $body= nl2br(CHtml::encode($comment->comment ));
    echo <<<EOT
    <div class="panel panel-info">
    <h3 class="panel-heading">{$name}</h3>
    <p class="text-muted">نوشته شده در تاریخ {$date}</p>
    <p class="panel-body">{$body}
EOT;
    $criteria= new CDbCriteria();
    $criteria->addColumnCondition(array('parent_id'=>$comment->id,'cnfirm=1'));
    $criteria->order='id ASC';
    $comments=  Comments::model()->findAll($criteria);
    if($comments){
        array_walk($comments, 'Display');
    }
    echo <<<EOT
    </p>
    </div>
EOT;
}
?>
<?php if($comments): ?>
       <div class="well">
           <h2>نظرات کاربران</h2>
           <hr />
               <?php array_walk($comments, 'Display'); ?>
       </div>
   <?php endif; ?>
خطا اینه:
نقل قول:Trying to get property of non-object
پاسخ
تشکر شده توسط:
#2
<?php function Display($comment)
{
    $name = CHtml::encode($comment->name);
    $date = JDF::jdate('l Y/m/d - h:i.a',$comment->create_time);
    $body = nl2br(CHtml::encode($comment->comment ));
    echo <<<EOT
    <div class="panel panel-info">
    <h3 class="panel-heading">{$name}</h3>
    <p class="text-muted">نوشته شده در تاریخ {$date}</p>
    <p class="panel-body">{$body}
EOT;
    $criteria = new CDbCriteria;
    $criteria->addColumnCondition(array('parent_id'=>$comment->id,'cnfirm=1'));
    $criteria->order ='id ASC';
    $comments = Comments::model()->findAll($criteria);
    if($comments) {
       array_walk($comments, 'Display');
    }
    echo <<<EOT
    </p>
    </div>
EOT;
} ?>
<?php if($comments): ?>
<div class="well">
    <h2>نظرات کاربران</h2>
    <hr />
    <?php array_walk($comments, 'Display'); ?>
</div>
<?php endif; ?>

اون پایین یه عنصر تکی رو فرستادین برای array_walk که باید کل آرایه comments$ رو میفرستادین.
پاسخ
تشکر شده توسط: amir21
#3
آره من اونو دیدم و اصلاح کردم. داشتم تاپیکو ویرایش میکردم که شما جوابو نوشتین. هنوزم خطا رو دارم.
پاسخ
تشکر شده توسط:
#4
وقتی بدون array_walk و به foreach معمولی صدا میزنید هم خطا دارین؟
پاسخ
تشکر شده توسط:
#5
بصورت معمولی هم که صدا زدم بازم خطا رو دارم.
آرایه comment رو توی تابع دارم ولی وقتی دستورات زیر رو مینویسم خطا میده:
echo CHtml::encode($comment->name);
echo JDF::jdate('l Y/m/d - h:i.a',$comment->create_time);
echo nl2br(CHtml::encode($comment->comment ));
پاسخ
تشکر شده توسط:
#6
با Tools::debug متغیر رو نمایش بدین ببینیم چی دارین.
پاسخ
تشکر شده توسط:
#7
این کد رو همون سطر اول تابع display نوشتم:
Tools::debug($comment,true);
خروجی این شد:
array
(
   'id' => '1'
   'name' => 'علی'
   'comment' => 'مطلب خوبی بود.'
   'create_time' => '1434808004'
)
همین 4 فیلد رو select کرده بودم.
پاسخ
تشکر شده توسط:
#8
خوب این الان یه آرایه است نه یه شئ. با foreach معمولی صدا میزنید هم همینو میگه؟
پاسخ
تشکر شده توسط:
#9
آره با foreach معمولی هم همین خطا رو دارم. با هر روشی که بخوام مقادیر آرایه comment رو نشون بدم، خطا میده.
مثل این روش:
foreach ($comments as $comment) {
   echo CHtml::encode($comment->name);
}
و این یکی:
array_walk($comments, 'Display');
پاسخ
تشکر شده توسط:
#10
توی پیام خصوصی تیم ویور بدین ببینم مشکل چیه. خیلی عجیبه.
پاسخ
تشکر شده توسط:
#11
مشکل حل شد.
فکر میکنم مشکل در فرق بین آرایه و آبجکت بود و اینکه خروجیهای createCommand و criteria با هم فرق دارند.
من برای select از createCommand استفاده کرده بودم که به نظر میرسید خروجی که بدست میاد فرقی با criteria نداره اما در عمل مشخص شد که با هم فرق دارند.
حالا که با criteria عمل select رو انجام دادم، همه دستورات و تابع بازگشتی بدرستی کار میکنند.
پاسخ
تشکر شده توسط:
#12
دوست عزیز، خروجی CDbCommand شئ اکتیو رکورد نیست، یه آرایه معمولیه. دقت کنید Wink
پاسخ
تشکر شده توسط: abdollah110110




کاربران در حال بازدید این موضوع: 1 مهمان