Ejemplo n.º 1
0
 protected function joinTables()
 {
     /** @var ActiveRecord $model */
     $model = new $this->owner->modelClass();
     /** @var ActiveRecord $this->owner */
     $this->getQuery()->leftJoin($this->taxonomy->table, $this->taxonomy->table . '.object_id = ' . $model::tableName() . '.id')->leftJoin(TaxonomyTerms::tableName(), TaxonomyTerms::tableName() . '.id = ' . $this->taxonomy->table . '.term_id');
 }
Ejemplo n.º 2
0
 /**
  * @param array $tags
  * @return \yii\base\Component
  */
 public function hasTags($tags = [])
 {
     $this->joinTables();
     if (!empty($tags)) {
         $this->getQuery()->andFilterWhere([TaxonomyTerms::tableName() . '.term' => $tags]);
     }
     return $this->getQuery();
 }
Ejemplo n.º 3
0
 public function getTerms($object_id, $name = [])
 {
     $query = (new Query())->select(TaxonomyTerms::tableName() . '.term, ' . $this->getTable() . '.value')->from(TaxonomyTerms::tableName())->innerJoin($this->getTable(), $this->getTable() . '.term_id = taxonomy_terms.id and ' . $this->getTable() . '.object_id=:object_id', [':object_id' => $object_id])->andFilterWhere([TaxonomyTerms::tableName() . '.term' => $name]);
     foreach ($query->all() as $v) {
         $result[$v['term']] = $v['value'];
     }
     return isset($result) ? $result : [];
 }
 public function hasProp($name, $value = null)
 {
     $this->joinTables();
     if (!empty($name)) {
         $this->getQuery()->andFilterWhere([TaxonomyTerms::tableName() . '.term' => $name]);
     }
     if (!empty($value)) {
         $this->getQuery()->andFilterWhere([$this->taxonomy->table . '.value' => $value]);
     }
     return $this->getQuery();
 }
 public function down()
 {
     $this->dropTable(TaxonomyTerms::tableName());
     $this->dropTable(TaxonomyDef::tableName());
 }
Ejemplo n.º 6
0
 /**
  * Displays a single TaxonomyDef model.
  * @param integer $id
  * @return mixed
  */
 public function actionView($id)
 {
     $termProvider = new ActiveDataProvider(['query' => TaxonomyTerms::find()->andFilterWhere(['taxonomy_id' => $id]), 'sort' => ['defaultOrder' => ['total_count' => SORT_DESC]]]);
     return $this->render('view', ['model' => $this->findModel($id), 'termProvider' => $termProvider]);
 }
Ejemplo n.º 7
0
 public function testCategories()
 {
     // 1. Add category taxonomy
     $taxonomy = new TaxonomyDef();
     $taxonomy->name = 'test_categories';
     $taxonomy->class = CategoryTerm::className();
     $taxonomy->data_table = 'sample_categories';
     $taxonomy->ref_table = SampleTable::className();
     // 2. Create data table
     $categoryTerm = Yii::createObject($taxonomy->attributes);
     $migration = $categoryTerm->install();
     $this->runMigration($migration);
     $categoryTerm = $this->getTaxonomy()->getTerm($taxonomy->name);
     $this->tester->assertTrue($categoryTerm->isInstalled(), 'The taxonomy must be installed.');
     // 3. Add a root category without an object id
     $rootTermName = 'root';
     $categoryTerm->addTerm(null, [$rootTermName]);
     $categoryTerm = $this->getTaxonomy()->getTerm($taxonomy->name, true);
     $rootTerm = $categoryTerm->getTaxonomyTerm($rootTermName);
     $terms = $categoryTerm->getTerms(null);
     // Check whether everything is properly inserted
     $this->tester->assertEquals(0, $categoryTerm->total_count);
     $this->tester->assertEquals(0, $rootTerm->total_count);
     $this->tester->assertEquals(1, count($terms));
     $this->tester->assertEquals($rootTermName, $terms[0]);
     // Check for parents
     $this->tester->assertNull($categoryTerm->getParent($terms[0]));
     $this->tester->assertFalse($categoryTerm->hasParent($terms[0]));
     // Check for children
     $this->tester->assertEmpty($categoryTerm->getChildren($terms[0]));
     $this->tester->assertFalse($categoryTerm->hasChildren($terms[0]));
     // 4. Add child to the root
     $childTermName1 = 'child1';
     $categoryTerm->addTerm(null, [$rootTermName => $childTermName1]);
     $categoryTerm = $this->getTaxonomy()->getTerm($taxonomy->name, true);
     $childTerm1 = $categoryTerm->getTaxonomyTerm($childTermName1);
     $terms = $categoryTerm->getTerms(null);
     // Check whether everything is properly inserted
     $this->tester->assertEquals(0, $categoryTerm->total_count);
     $this->tester->assertEquals(0, $childTerm1->total_count);
     $this->tester->assertEquals(2, count($terms));
     $this->tester->assertContains($childTermName1, $terms);
     // Check for parents
     $this->tester->assertTrue($categoryTerm->hasParent($childTermName1));
     $this->tester->assertEquals($rootTermName, $categoryTerm->getParent($childTermName1));
     // Check for children
     $this->tester->assertEmpty($categoryTerm->getChildren($childTermName1));
     $this->tester->assertFalse($categoryTerm->hasChildren($childTermName1));
     // Check the children of the root
     $rootChildren = $categoryTerm->getChildren($rootTermName);
     $this->tester->assertTrue($categoryTerm->hasChildren($rootTermName));
     $this->tester->assertEquals(1, count($rootChildren));
     $this->tester->assertContains($childTermName1, $rootChildren);
     // 5. Test adding more than one child at a time
     $childTermName2 = 'child2';
     $childTermName3 = 'child3';
     $categoryTerm->addTerm(null, [$rootTermName => [$childTermName2, $childTermName3]]);
     $categoryTerm = $this->getTaxonomy()->getTerm($taxonomy->name, true);
     $terms = $categoryTerm->getTerms(null);
     // Test whether all child terms are attached to the root
     $this->tester->assertEquals(4, count($terms));
     $this->tester->assertEquals(3, count($categoryTerm->getChildren($rootTermName)));
     // 6. Test adding term to an existing object
     $rootTermName2 = 'root2';
     $categoryTerm->addTerm(1, $rootTermName2);
     // Add a term as a string, not as an array
     $categoryTerm = $this->getTaxonomy()->getTerm($taxonomy->name, true);
     $rootTerm2 = $categoryTerm->getTaxonomyTerm($rootTermName2);
     // Check whether everything is properly inserted
     $terms = $categoryTerm->getTerms(1);
     $this->tester->assertEquals(1, count($terms));
     $this->tester->assertContains($rootTermName2, $terms);
     // Check the counters
     $this->tester->assertEquals(1, $categoryTerm->total_count);
     $this->tester->assertEquals(1, $rootTerm2->total_count);
     // Check whether all terms will be returned
     $terms = $categoryTerm->getTerms(null);
     $this->tester->assertEquals(5, count($terms));
     // Add child
     $childTermName4 = 'child4';
     $categoryTerm->addTerm(1, [$rootTermName2 => $childTermName4]);
     $categoryTerm = $this->getTaxonomy()->getTerm($taxonomy->name, true);
     $rootTerm2 = $categoryTerm->getTaxonomyTerm($rootTermName2);
     $childTerm4 = $categoryTerm->getTaxonomyTerm($childTermName4);
     $terms = $categoryTerm->getTerms(1);
     $this->tester->assertEquals(2, count($terms));
     $this->tester->assertEquals(2, $categoryTerm->total_count);
     $this->tester->assertEquals(1, $rootTerm2->total_count);
     $this->tester->assertEquals(1, $childTerm4->total_count);
     // 7. Loop detection test. Add the root as a child of one of the children
     $exceptionTrown = false;
     try {
         $categoryTerm->addTerm(null, [$childTermName3 => $rootTermName]);
     } catch (Exception $ex) {
         $exceptionTrown = true;
     }
     $this->tester->assertTrue($exceptionTrown);
     // 8. Adding two hierarchies at once
     TaxonomyTerms::deleteAll();
     $categoryTerm->addTerm(null, [$rootTermName => [$childTermName1, $childTermName2], $rootTermName2]);
     $categoryTerm = $this->getTaxonomy()->getTerm($taxonomy->name, true);
     $terms = $categoryTerm->getTerms(null);
     $this->tester->assertEquals(4, count($terms));
 }
Ejemplo n.º 8
0
 public function hasChildren($term)
 {
     $parentTerm = $this->getTaxonomyTerm($term);
     if (!$parentTerm) {
         return false;
     }
     return (new Query())->from(TaxonomyTerms::tableName())->where("parent_id = {$parentTerm->id}")->exists(self::getDb());
 }
Ejemplo n.º 9
0
 public function getTaxonomyTerm($name, $create = true)
 {
     $term = TaxonomyTerms::findOne(['term' => $name, 'taxonomy_id' => $this->id]);
     if ($create and !isset($term)) {
         $term = new TaxonomyTerms();
         $term->taxonomy_id = $this->id;
         $term->term = $name;
         $term->total_count = 0;
         $term->save();
     }
     return $term;
 }
Ejemplo n.º 10
0
 /**
  * @param integer $termId
  * @return boolean
  */
 public function hasChildren($termId)
 {
     return TaxonomyTerms::find()->where("parent_id = {$termId}")->exists(self::getDb());
 }
Ejemplo n.º 11
0
 /**
  * @return \yii\db\ActiveQuery
  */
 public function getTaxonomyTerms()
 {
     return $this->hasMany(TaxonomyTerms::className(), ['taxonomy_id' => 'id']);
 }
Ejemplo n.º 12
0
 public function getTerms($object_id, $name = [])
 {
     $query = (new Query())->select(TaxonomyTerms::tableName() . '.term, ' . $this->getTable() . '.value')->from(TaxonomyTerms::tableName())->innerJoin($this->getTable(), $this->getTable() . '.term_id = taxonomy_terms.id and ' . $this->getTable() . '.object_id=:object_id', [':object_id' => $object_id])->andFilterWhere([TaxonomyTerms::tableName() . '.term' => $name]);
     return ArrayHelper::map($query->all(), 'term', 'value');
 }