من در نوشتن کوئری در کلاس اکتیو رکورد برای جداول 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 است و راه حل این باگ را نمیدانم از توجه شما متشکرم