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

نسخه‌ی کامل: اشکال در ایجاد کوئری برای اختصاص برچسب در پروژه blog
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
من در نوشتن کوئری در کلاس اکتیو رکورد برای جداول posts- posttags - tags دچار اشکال هستم و با مراجعه به مستندات مختلف نتوانستم رفع اشکال نمایم.
من کدهای زیر را در postsController.php  نوشته ام و در حالت های مختلف بررسی کرده ام ولی نتوانستم نتیجه بگیرم
لطفا راهنمایی فرمائید


    public function actionDefinTags($id)
    {

        if(!($posts = Posttags::model()->findByPk($id))) {
         throw new CHttpException(404, 'برچسب موردنظر یافت نشد.');
        }
       // $tag=Tags::model()->findAll(array('order'=>'name','condition'=>'confirmed=1'));
        //echo Tools::debug($tag);
/*        $posts = Posttags::model()->with(
          array(
              'tags'=>array(
                     'condition'=>'posttags.post_d=:postID and posttags.tag_id=tag.id',
                           'params'=>array(
                              ':postID=1'
                            )
                       )
                   )                    
                )->findAll();
*/
//        $posts = Yii::app()->db->createCommand()->select('*')->from('posttags p')->join('tags g', 'p.tag_id=g.id')->where('p.post_id=:postid', array(':postid'=>$id))->queryAll();
        echo Tools::debug($posts) ;
        $this->render('defintags', compact('posts','id'));
        
    }

خوب شما بگین چه کاری میخواین انجام بدین تا درمورد روشش راهنمایی کنیم.
من میخواهم برای هر پست برچسب اختصاص بدهم و پروژه blog را کامل کنم
برای اختصاص برچسب، باید ابتدا برچسبها رو بخونید و توی فرم بگذارین (فرضاً با CheckBox) و id اون رو بعنوان value بگذارین. فرض کنید چنین چیزی توی ویو هست:
<?php foreach(Tags::model()->findAll('confirmed=1') as $tag) : ?>
<label><input name="tagIds[]" value="<?php echo $tag->id; ?>" /> <?php echo CHtml::encode($tag->name); ?></label>
<?php endforeach; ?>
حالا توی صفحه مقصد فرم، اینطوری باید برچسبهای انتخاب شده رو به پست نسبت بدین:
foreach($_POST['tagIds'] as $tagId) {
    $postTag = new Posttags;
    $postTag->post_id = $model->id;
    $postTag->tag_id = $tagId;
    $postTag->confirmed = 1;
    $postTag->save();
}
با تشکر
من در ویوی مربوط کد زیر را قرار دادم
<?php echo $form->dropDownList($model, 'id', $model->TagOptions, array('name'=>'tagIds','class'=>'form-control','multiple'=>true,'size'=>'8')); ?>

و در postController.php کد زیر را قرار دادم
      if(isset($_POST['tagIds'])) {
       foreach($_POST['tagIds'] as $tagId) {
           $postTag = new Posttags;
           $postTag->post_id = $model->id;
           $postTag->tag_id = $tagId;
           $postTag->confirmed = 1;
           $postTag->save();
       }

درج برچسب برای پستهایی که برچسب نداشتند بخوبی انجام شد.
و درج برچسب جدید نیز بخوبی انجام شد.
و برای نشان دادن برچسب پستهایی که قبلا دارای برچسب بوده اند چگونه آنها را در dropDownList که  در حالت multiple است نشان بدهیم
و در موقع ذخیره برای جلوگیری از خطا چگونه از ذخیره برچسب های تکراری جلوگیری کنیم
لطفا راهنمایی فرمائید
با تشکر
id برچسبهایی که قبلاً انتخاب شدن رو توی یک آرایه بگذارین و بعنوان پارامتر selected به متد dropDownList از form$ بدین.

درموقع ذخیره کردن هم دو راه برای جلوگیری از خطا دارین:
1- حذف تمام برچسبهای قبلی یک موضوع و ثبت مجدد برچسبهای انتخابی
2- تبدیل post_id و tag_id به کلید اصلی ترکیبی (در جدول posttags) که باعث میشه نتونید برای یک موضوع، یک برچسب رو بیش از یکبار ثبت کنید.
(18-03-1394، 09:39 ب.ظ)ADMIN نوشته: [ -> ]id برچسبهایی که قبلاً انتخاب شدن رو توی یک آرایه بگذارین و بعنوان پارامتر selected به متد dropDownList از form$ بدین.

درموقع ذخیره کردن هم دو راه برای جلوگیری از خطا دارین:
1- حذف تمام برچسبهای قبلی یک موضوع و ثبت مجدد برچسبهای انتخابی
2- تبدیل post_id و tag_id به کلید اصلی ترکیبی (در جدول posttags) که باعث میشه نتونید برای یک موضوع، یک برچسب رو بیش از یکبار ثبت کنید.

با سلام و تشکر
من کد زیر را برای تهیه آرایه مورد نظر در ویو مربوط قرار دادم
$selectedtags=Posttags::model()->findAll(array('condition'=>'post_id=:postId', 'params'=>array(':postId'=>$model->id)));
$AT=array();
foreach($selectedtags as $stag){
   $AT[]=$stag['tag_id'];
}
و در form->dropDownList$ برای متدی که شما فرمودید بصورت زیر انجام دادم ولی موثر نبود حتما اشتباه متوجه شدم

            <?php echo $form->dropDownList($model, 'id', $model->PosttagOptions, 
                   array('name'=>'tagIds','class'=>'form-control','multiple'=>true,'size'=>'8',
                   'options' => array('$AT'=>array('selected'=>true))));
           ?>

لطفا راهنمایی کنید
با تشکر
فرض کنید میخواین dropDownList درست کنید و گزینه های انتخابی کاربر، انتخاب شده باشن. خوب چنین کدی اینکار رو انجام میده:
<?php $options = array(); ?>
<?php foreach($model->tags as $tag) : ?>
<?php $options[$tag->id] = array('selected' => 'selected', 'label' => $tag['name']); ?>
<?php endforeach; ?>
<?php echo $form->dropDownList($model, 'tagIds', $model->posttagOptions, array(
   'class' => 'form-control',
   'multiple' => 'multiple',
   'size' => 8,
   'options' => $options,
)); ?>
سلام
از راهنمایی شما ممنونم
نتیجه درست بود ولی در عمل dropdownlist یک باگ و اشکالی وجود دارد و آن نمایش یک انتخاب است در حالیکه باید در شروع کار هیچ گزینه ای انتخاب نشده است این اشکال بصورت تصادفی و برای هر پست ، مختلف است و در تمام مراحل بعدی برای آن پست مانند بروز رسانی نیز همواره نمایش داده میشود. به نظر من اشکال dropdownlist است و راه حل این باگ را نمیدانم از توجه شما متشکرم
من توی چندتا پروژه استفاده کردم و مشکلی نداشتم تا حالا. شاید توی پیاده سازی یا ساختار جداول یه تغییری وجود داشته باشه ولی در کل مشکل خاصی نباید پیش بیاد. برای اطلاعات بیشتر اینجا رو بخونید: http://www.yiiframework.com/doc/api/1.1/...ist-detail