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'); }
/** * @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(); }
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()); }
/** * 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]); }
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)); }
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()); }
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; }
/** * @param integer $termId * @return boolean */ public function hasChildren($termId) { return TaxonomyTerms::find()->where("parent_id = {$termId}")->exists(self::getDb()); }
/** * @return \yii\db\ActiveQuery */ public function getTaxonomyTerms() { return $this->hasMany(TaxonomyTerms::className(), ['taxonomy_id' => 'id']); }
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'); }