Yii Framework Forum: Lista kategorii i artukułów - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Lista kategorii i artukułów Rate Topic: -----

#1 User is offline   voitto 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 2
  • Joined: 10-June 11

Posted 07 July 2012 - 12:27 PM

Witam,
mój problem dotyczy tego, że mam 3 tabele.

Artykuły, Kategorie, ArtykułyKategorie
Tabela Artykuły PRIMARY id_article
Tabela Kategorie PRIMARY id_category
Tabela ArtykułyKategorie PRIMARY (id_article,id_category)

Każdy artykuł może należeć to wielu kategorii. W modelach wyrażone są odpowiednie relacje.

Chciałbym wyświetlać listę artykułów z możliwością wybierania np. za pomocą checkboxów z których kategorii mają pochodzić artykuły.

Oczywiście mogę to zrobić bez użycia komponentów, ale ciekawi mnie czy jest na to sposób z użyciem CGridView czy innego komponentu, bo takie proste relacje pisze się często więc wiele by to ułatwiło.
0

#2 User is offline   luk1999 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 35
  • Joined: 20-April 11
  • Location:Poland

Posted 10 July 2012 - 11:35 AM

Spróbuj coś takiego:

  • Wygeneruj model dla tabelki łącznikowej (ArticlesCategories) oraz CRUD dla niego. Trzeba będzie jeszcze uzupełnić metodę search tego modelu, dodając grupowanie i zmieniając obsługę pola categoryId:
    	public function search()
    	{
    		// Warning: Please modify the following code to remove attributes that
    		// should not be searched.
    
    		$criteria=new CDbCriteria;
    
    		$criteria->compare('id',$this->id);
    		$criteria->compare('articleId',$this->articleId);
                    if (is_array($this->categoryId)) {
                        $criteria->addInCondition('categoryId',$this->categoryId);
                    } else {
                        $criteria->compare('categoryId',$this->categoryId);
                    }
                    $criteria->group = 'articleId';
    
    		return new CActiveDataProvider($this, array(
    			'criteria'=>$criteria,
    		));
    	}
    

  • Do /protected/widgets/grid/ wrzuć klasę:
    <?php
    Yii::import('zii.widgets.grid.CDataColumn');
    
    class CDataColumnCategories extends CDataColumn {
    	protected function renderFilterCellContent()
    	{
    	    if(is_string($this->filter)) {
    		echo $this->filter;
                } else if($this->filter!==false && $this->grid->filter!==null && $this->name!==null && strpos($this->name,'.')===false)	{
                    if (isset($_GET['ArticlesCategories']['categoryId'])) {
                        $selectedValues = $_GET['ArticlesCategories']['categoryId'];
                    } else {
                        $selectedValues = null;
                    }
    		if (is_array($this->filter)) {
                        echo CHtml::checkBoxList($this->name, $selectedValues, $this->filter, array('id'=>false));
                    } else if($this->filter===null) {
    		    echo CHtml::activeTextField($this->grid->filter, $this->name, array('id'=>false));
                    }
    	     } else {
    		parent::renderFilterCellContent();
                 }
    	}
    
    }
    

  • CGridView w /protected/views/articlesCategories/admin.php powinien wyglądać podobnie:
    <?php $this->widget('zii.widgets.grid.CGridView', array(
    	'id'=>'articles-categories-grid',
    	'dataProvider'=>$model->search(),
    	'filter'=>$model,
    	'columns'=>array(
    	    'articleId',
                array(
                    'class' => 'application.widgets.grid.CDataColumnCategories',
                    'name' => 'ArticlesCategories[categoryId]',
                    'value' => '$data->category->name',            
                    'filter' => CHtml::listData(Categories::model()->findAll(), 'id', 'name'),
                ),
                array(
                    'name' => 'articleId',
                    'value' => '$data->article->title'
                ),
                array(
                    'header' => 'Treść',
                    'value' => 'mb_substr($data->article->text, 1, 100)'
                ),
                array(
    		'class'=>'CButtonColumn',
    	    ),
    	),
    )); ?>
    


Pewnie da się z tego wykombinować bardziej uniwersalne rozwiązanie. :)

Attached File  abc.jpg (96.54K)
Number of downloads: 16
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users