رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
اشکال در ایجاد کوئری برای اختصاص برچسب در پروژه blog
#1
من در نوشتن کوئری در کلاس اکتیو رکورد برای جداول 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'));
        
    }

پاسخ
تشکر شده توسط:
#2
خوب شما بگین چه کاری میخواین انجام بدین تا درمورد روشش راهنمایی کنیم.
پاسخ
تشکر شده توسط:
#3
من میخواهم برای هر پست برچسب اختصاص بدهم و پروژه blog را کامل کنم
پاسخ
تشکر شده توسط:
#4
برای اختصاص برچسب، باید ابتدا برچسبها رو بخونید و توی فرم بگذارین (فرضاً با 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();
}
پاسخ
تشکر شده توسط: hfaal , meysam1366
#5
با تشکر
من در ویوی مربوط کد زیر را قرار دادم
<?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 است نشان بدهیم
و در موقع ذخیره برای جلوگیری از خطا چگونه از ذخیره برچسب های تکراری جلوگیری کنیم
لطفا راهنمایی فرمائید
با تشکر
پاسخ
تشکر شده توسط:
#6
id برچسبهایی که قبلاً انتخاب شدن رو توی یک آرایه بگذارین و بعنوان پارامتر selected به متد dropDownList از form$ بدین.

درموقع ذخیره کردن هم دو راه برای جلوگیری از خطا دارین:
1- حذف تمام برچسبهای قبلی یک موضوع و ثبت مجدد برچسبهای انتخابی
2- تبدیل post_id و tag_id به کلید اصلی ترکیبی (در جدول posttags) که باعث میشه نتونید برای یک موضوع، یک برچسب رو بیش از یکبار ثبت کنید.
پاسخ
تشکر شده توسط: hfaal
#7
(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))));
           ?>

لطفا راهنمایی کنید
با تشکر
پاسخ
تشکر شده توسط:
#8
فرض کنید میخواین 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,
)); ?>
پاسخ
تشکر شده توسط:
#9
سلام
از راهنمایی شما ممنونم
نتیجه درست بود ولی در عمل dropdownlist یک باگ و اشکالی وجود دارد و آن نمایش یک انتخاب است در حالیکه باید در شروع کار هیچ گزینه ای انتخاب نشده است این اشکال بصورت تصادفی و برای هر پست ، مختلف است و در تمام مراحل بعدی برای آن پست مانند بروز رسانی نیز همواره نمایش داده میشود. به نظر من اشکال dropdownlist است و راه حل این باگ را نمیدانم از توجه شما متشکرم
پاسخ
تشکر شده توسط:
#10
من توی چندتا پروژه استفاده کردم و مشکلی نداشتم تا حالا. شاید توی پیاده سازی یا ساختار جداول یه تغییری وجود داشته باشه ولی در کل مشکل خاصی نباید پیش بیاد. برای اطلاعات بیشتر اینجا رو بخونید: http://www.yiiframework.com/doc/api/1.1/...ist-detail
پاسخ
تشکر شده توسط: hfaal




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