تالار گفتمان nCIS.ir

نسخه‌ی کامل: کجای این تابع بازگشتی درست نیست؟ (حل شد)
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام استاد

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

<?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
<?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$ رو میفرستادین.
آره من اونو دیدم و اصلاح کردم. داشتم تاپیکو ویرایش میکردم که شما جوابو نوشتین. هنوزم خطا رو دارم.
وقتی بدون array_walk و به foreach معمولی صدا میزنید هم خطا دارین؟
بصورت معمولی هم که صدا زدم بازم خطا رو دارم.
آرایه 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 ));
با Tools::debug متغیر رو نمایش بدین ببینیم چی دارین.
این کد رو همون سطر اول تابع display نوشتم:
Tools::debug($comment,true);
خروجی این شد:
array
(
   'id' => '1'
   'name' => 'علی'
   'comment' => 'مطلب خوبی بود.'
   'create_time' => '1434808004'
)
همین 4 فیلد رو select کرده بودم.
خوب این الان یه آرایه است نه یه شئ. با foreach معمولی صدا میزنید هم همینو میگه؟
آره با foreach معمولی هم همین خطا رو دارم. با هر روشی که بخوام مقادیر آرایه comment رو نشون بدم، خطا میده.
مثل این روش:
foreach ($comments as $comment) {
   echo CHtml::encode($comment->name);
}
و این یکی:
array_walk($comments, 'Display');
توی پیام خصوصی تیم ویور بدین ببینم مشکل چیه. خیلی عجیبه.
مشکل حل شد.
فکر میکنم مشکل در فرق بین آرایه و آبجکت بود و اینکه خروجیهای createCommand و criteria با هم فرق دارند.
من برای select از createCommand استفاده کرده بودم که به نظر میرسید خروجی که بدست میاد فرقی با criteria نداره اما در عمل مشخص شد که با هم فرق دارند.
حالا که با criteria عمل select رو انجام دادم، همه دستورات و تابع بازگشتی بدرستی کار میکنند.
دوست عزیز، خروجی CDbCommand شئ اکتیو رکورد نیست، یه آرایه معمولیه. دقت کنید Wink