- Patch #1533022 by duellj, aspilicious: convert taxonomy.module entity classes to PSR-0.

8.0.x
Dries 2012-05-16 21:53:35 -04:00
parent 99243487d7
commit 98858def41
14 changed files with 481 additions and 435 deletions

View File

@ -208,8 +208,8 @@ class EntityController implements EntityControllerInterface {
* being loaded needs to be augmented with additional data from another
* table, such as loading node type into comments or vocabulary machine name
* into terms, however it can also support $conditions on different tables.
* See CommentController::buildQuery() or TaxonomyTermController::buildQuery()
* for examples.
* See Drupal\comment\CommentStorageController::buildQuery() or
* Drupal\taxonomy\TermStorageController::buildQuery() for examples.
*
* @param $ids
* An array of entity IDs, or FALSE to load all entities.

View File

@ -6,6 +6,7 @@
*/
use Drupal\node\Node;
use Drupal\taxonomy\Term;
/**
* Implements hook_help().
@ -470,7 +471,7 @@ function forum_permission() {
/**
* Implements hook_taxonomy_term_delete().
*/
function forum_taxonomy_term_delete(TaxonomyTerm $term) {
function forum_taxonomy_term_delete(Term $term) {
// For containers, remove the tid from the forum_containers variable.
$containers = variable_get('forum_containers', array());
$key = array_search($term->tid, $containers);

View File

@ -6,6 +6,7 @@
*/
use Drupal\node\Node;
use Drupal\taxonomy\Term;
/**
* Implements hook_help().
@ -268,7 +269,7 @@ function path_form_taxonomy_form_term_alter(&$form, $form_state) {
/**
* Implements hook_taxonomy_term_insert().
*/
function path_taxonomy_term_insert(TaxonomyTerm $term) {
function path_taxonomy_term_insert(Term $term) {
if (isset($term->path)) {
$path = $term->path;
$path['alias'] = trim($path['alias']);
@ -285,7 +286,7 @@ function path_taxonomy_term_insert(TaxonomyTerm $term) {
/**
* Implements hook_taxonomy_term_update().
*/
function path_taxonomy_term_update(TaxonomyTerm $term) {
function path_taxonomy_term_update(Term $term) {
if (isset($term->path)) {
$path = $term->path;
$path['alias'] = trim($path['alias']);
@ -306,7 +307,7 @@ function path_taxonomy_term_update(TaxonomyTerm $term) {
/**
* Implements hook_taxonomy_term_delete().
*/
function path_taxonomy_term_delete(TaxonomyTerm $term) {
function path_taxonomy_term_delete(Term $term) {
// Delete all aliases associated with this term.
path_delete(array('source' => 'taxonomy/term/' . $term->tid));
}

View File

@ -5,6 +5,8 @@
* Test module for Taxonomy hooks and functions not used in core.
*/
use Drupal\taxonomy\Term;
/**
* Implements hook_taxonomy_term_load().
*/
@ -20,7 +22,7 @@ function taxonomy_test_taxonomy_term_load(array $terms) {
/**
* Implements hook_taxonomy_term_insert().
*/
function taxonomy_test_taxonomy_term_insert(TaxonomyTerm $term) {
function taxonomy_test_taxonomy_term_insert(Term $term) {
if (!empty($term->antonym)) {
db_insert('taxonomy_term_antonym')
->fields(array(
@ -34,7 +36,7 @@ function taxonomy_test_taxonomy_term_insert(TaxonomyTerm $term) {
/**
* Implements hook_taxonomy_term_update().
*/
function taxonomy_test_taxonomy_term_update(TaxonomyTerm $term) {
function taxonomy_test_taxonomy_term_update(Term $term) {
if (!empty($term->antonym)) {
db_merge('taxonomy_term_antonym')
->key(array('tid' => $term->tid))
@ -48,7 +50,7 @@ function taxonomy_test_taxonomy_term_update(TaxonomyTerm $term) {
/**
* Implements hook_taxonomy_term_delete().
*/
function taxonomy_test_taxonomy_term_delete(TaxonomyTerm $term) {
function taxonomy_test_taxonomy_term_delete(Term $term) {
db_delete('taxonomy_term_antonym')
->condition('tid', $term->tid)
->execute();

View File

@ -0,0 +1,99 @@
<?php
/**
* @file
* Definition of Term.
*/
namespace Drupal\taxonomy;
use Drupal\entity\Entity;
/**
* Defines the taxonomy term entity.
*/
class Term extends Entity {
/**
* The taxonomy term ID.
*
* @var integer
*/
public $tid;
/**
* The taxonomy vocabulary ID this term belongs to.
*
* @var integer
*/
public $vid;
/**
* Name of the term.
*
* @var string
*/
public $name;
/**
* Description of the term.
*
* @var string
*/
public $description;
/**
* The text format name for the term's description.
*
* @var string
*/
public $format;
/**
* The weight of this term.
*
* This property stores the weight of this term in relation to other terms of
* the same vocabulary.
*
* @var integer
*/
public $weight = 0;
/**
* The parent term(s) for this term.
*
* This property is not loaded, but may be used to modify the term parents via
* Term::save().
*
* The property can be set to an array of term IDs. An entry of 0 means this
* term does not have any parents. When omitting this variable during an
* update, the existing hierarchy for the term remains unchanged.
*
* @var array
*/
public $parent;
/**
* The machine name of the vocabulary the term is assigned to.
*
* If not given, this value will be set automatically by loading the
* vocabulary based on the $entity->vid property.
*
* @var string
*/
public $vocabulary_machine_name;
/**
* Implements Drupal\entity\EntityInterface::id().
*/
public function id() {
return $this->tid;
}
/**
* Implements Drupal\entity\EntityInterface::bundle().
*/
public function bundle() {
return $this->vocabulary_machine_name;
}
}

View File

@ -0,0 +1,146 @@
<?php
/**
* @file
* Definition of TermStorageController.
*/
namespace Drupal\taxonomy;
use Drupal\entity\EntityInterface;
use Drupal\entity\EntityDatabaseStorageController;
/**
* Defines a Controller class for taxonomy terms.
*/
class TermStorageController extends EntityDatabaseStorageController {
/**
* Overrides Drupal\entity\EntityDatabaseStorageController::create().
*
* @param array $values
* An array of values to set, keyed by property name. A value for the
* vocabulary ID ('vid') is required.
*/
public function create(array $values) {
$entity = parent::create($values);
// Ensure the vocabulary machine name is initialized as it is used as the
// bundle key.
// @todo Move to Term::bundle() once field API has been converted
// to make use of it.
if (!isset($entity->vocabulary_machine_name)) {
$vocabulary = taxonomy_vocabulary_load($entity->vid);
$entity->vocabulary_machine_name = $vocabulary->machine_name;
}
// Save new terms with no parents by default.
if (!isset($entity->parent)) {
$entity->parent = array(0);
}
return $entity;
}
/**
* Overrides Drupal\entity\EntityDatabaseStorageController::buildQuery().
*/
protected function buildQuery($ids, $conditions = array(), $revision_id = FALSE) {
$query = parent::buildQuery($ids, $conditions, $revision_id);
$query->addTag('translatable');
$query->addTag('term_access');
// When name is passed as a condition use LIKE.
if (isset($conditions['name'])) {
$query_conditions = &$query->conditions();
foreach ($query_conditions as $key => $condition) {
if ($condition['field'] == 'base.name') {
$query_conditions[$key]['operator'] = 'LIKE';
$query_conditions[$key]['value'] = db_like($query_conditions[$key]['value']);
}
}
}
// Add the machine name field from the {taxonomy_vocabulary} table.
$query->innerJoin('taxonomy_vocabulary', 'v', 'base.vid = v.vid');
$query->addField('v', 'machine_name', 'vocabulary_machine_name');
return $query;
}
/**
* Overrides Drupal\entity\EntityDatabaseStorageController::cacheGet().
*/
protected function cacheGet($ids, $conditions = array()) {
$terms = parent::cacheGet($ids, $conditions);
// Name matching is case insensitive, note that with some collations
// LOWER() and drupal_strtolower() may return different results.
foreach ($terms as $term) {
if (isset($conditions['name']) && drupal_strtolower($conditions['name'] != drupal_strtolower($term->name))) {
unset($terms[$term->tid]);
}
}
return $terms;
}
/**
* Overrides Drupal\entity\EntityDatabaseStorageController::postDelete().
*/
protected function postDelete($entities) {
// See if any of the term's children are about to be become orphans.
$orphans = array();
foreach (array_keys($entities) as $tid) {
if ($children = taxonomy_term_load_children($tid)) {
foreach ($children as $child) {
// If the term has multiple parents, we don't delete it.
$parents = taxonomy_term_load_parents($child->tid);
// Because the parent has already been deleted, the parent count might
// be 0.
if (count($parents) <= 1) {
$orphans[] = $child->tid;
}
}
}
}
// Delete term hierarchy information after looking up orphans but before
// deleting them so that their children/parent information is consistent.
db_delete('taxonomy_term_hierarchy')
->condition('tid', array_keys($entities))
->execute();
if (!empty($orphans)) {
taxonomy_term_delete_multiple($orphans);
}
}
/**
* Overrides Drupal\entity\EntityDatabaseStorageController::postSave().
*/
protected function postSave(EntityInterface $entity, $update) {
if (isset($entity->parent)) {
db_delete('taxonomy_term_hierarchy')
->condition('tid', $entity->tid)
->execute();
$query = db_insert('taxonomy_term_hierarchy')
->fields(array('tid', 'parent'));
foreach ($entity->parent as $parent) {
$query->values(array(
'tid' => $entity->tid,
'parent' => $parent
));
}
$query->execute();
}
}
/**
* Implements Drupal\entity\EntityControllerInterface::resetCache().
*/
public function resetCache(array $ids = NULL) {
drupal_static_reset('taxonomy_term_count_nodes');
drupal_static_reset('taxonomy_get_tree');
drupal_static_reset('taxonomy_get_tree:parents');
drupal_static_reset('taxonomy_get_tree:terms');
drupal_static_reset('taxonomy_term_load_parents');
drupal_static_reset('taxonomy_term_load_parents_all');
drupal_static_reset('taxonomy_term_load_children');
parent::resetCache($ids);
}
}

View File

@ -0,0 +1,70 @@
<?php
/**
* @file
* Definition of Vocabulary.
*/
namespace Drupal\taxonomy;
use Drupal\entity\Entity;
/**
* Defines the taxonomy vocabulary entity.
*/
class Vocabulary extends Entity {
/**
* The taxonomy vocabulary ID.
*
* @var integer
*/
public $vid;
/**
* Name of the vocabulary.
*
* @var string
*/
public $name;
/**
* The vocabulary machine name.
*
* @var string
*/
public $machine_name;
/**
* Description of the vocabulary.
*
* @var string
*/
public $description;
/**
* The type of hierarchy allowed within the vocabulary.
*
* Possible values:
* - TAXONOMY_HIERARCHY_DISABLED: No parents.
* - TAXONOMY_HIERARCHY_SINGLE: Single parent.
* - TAXONOMY_HIERARCHY_MULTIPLE: Multiple parents.
*
* @var integer
*/
public $hierarchy = TAXONOMY_HIERARCHY_DISABLED;
/**
* The weight of this vocabulary in relation to other vocabularies.
*
* @var integer
*/
public $weight = 0;
/**
* Implements Drupal\entity\EntityInterface::id().
*/
public function id() {
return $this->vid;
}
}

View File

@ -0,0 +1,89 @@
<?php
/**
* @file
* Definition of VocabularyStorageController.
*/
namespace Drupal\taxonomy;
use Drupal\entity\EntityInterface;
use Drupal\entity\EntityDatabaseStorageController;
/**
* Defines a controller class for taxonomy vocabularies.
*/
class VocabularyStorageController extends EntityDatabaseStorageController {
/**
* Overrides Drupal\entity\EntityDatabaseStorageController::buildQuery().
*/
protected function buildQuery($ids, $conditions = array(), $revision_id = FALSE) {
$query = parent::buildQuery($ids, $conditions, $revision_id);
$query->addTag('translatable');
$query->orderBy('base.weight');
$query->orderBy('base.name');
return $query;
}
/**
* Overrides Drupal\entity\EntityDatabaseStorageController::postSave().
*/
protected function postSave(EntityInterface $entity, $update) {
if (!$update) {
field_attach_create_bundle('taxonomy_term', $entity->machine_name);
}
elseif ($entity->original->machine_name != $entity->machine_name) {
field_attach_rename_bundle('taxonomy_term', $entity->original->machine_name, $entity->machine_name);
}
}
/**
* Overrides Drupal\entity\EntityDatabaseStorageController::preDelete().
*/
protected function preDelete($entities) {
// Only load terms without a parent, child terms will get deleted too.
$tids = db_query('SELECT t.tid FROM {taxonomy_term_data} t INNER JOIN {taxonomy_term_hierarchy} th ON th.tid = t.tid WHERE t.vid IN (:vids) AND th.parent = 0', array(':vids' => array_keys($entities)))->fetchCol();
taxonomy_term_delete_multiple($tids);
}
/**
* Overrides Drupal\entity\EntityDatabaseStorageController::postDelete().
*/
protected function postDelete($entities) {
// Load all Taxonomy module fields and delete those which use only this
// vocabulary.
$taxonomy_fields = field_read_fields(array('module' => 'taxonomy'));
foreach ($taxonomy_fields as $field_name => $taxonomy_field) {
$modified_field = FALSE;
// Term reference fields may reference terms from more than one
// vocabulary.
foreach ($taxonomy_field['settings']['allowed_values'] as $key => $allowed_value) {
foreach ($entities as $vocabulary) {
if ($allowed_value['vocabulary'] == $vocabulary->machine_name) {
unset($taxonomy_field['settings']['allowed_values'][$key]);
$modified_field = TRUE;
}
}
}
if ($modified_field) {
if (empty($taxonomy_field['settings']['allowed_values'])) {
field_delete_field($field_name);
}
else {
// Update the field definition with the new allowed values.
field_update_field($taxonomy_field);
}
}
}
}
/**
* Implements Drupal\entity\DrupalEntityControllerInterface::resetCache().
*/
public function resetCache(array $ids = NULL) {
drupal_static_reset('taxonomy_vocabulary_get_names');
parent::resetCache($ids);
cache_clear_all();
}
}

View File

@ -5,6 +5,9 @@
* Administrative page callbacks for the taxonomy module.
*/
use Drupal\taxonomy\Term;
use Drupal\taxonomy\Vocabulary;
/**
* Form builder to list and manage vocabularies.
*
@ -101,7 +104,7 @@ function theme_taxonomy_overview_vocabularies($variables) {
/**
* Form builder for the vocabulary editing form.
*
* @param TaxonomyVocabulary|null $vocabulary
* @param Drupal\taxonomy\Vocabulary|null $vocabulary
* (optional) The taxonomy vocabulary entity to edit. If NULL or omitted, the
* form creates a new vocabulary.
*
@ -109,12 +112,12 @@ function theme_taxonomy_overview_vocabularies($variables) {
* @see taxonomy_form_vocabulary_submit()
* @see taxonomy_form_vocabulary_validate()
*/
function taxonomy_form_vocabulary($form, &$form_state, TaxonomyVocabulary $vocabulary = NULL) {
function taxonomy_form_vocabulary($form, &$form_state, Vocabulary $vocabulary = NULL) {
// During initial form build, add the entity to the form state for use
// during form building and processing. During a rebuild, use what is in the
// form state.
if (!isset($form_state['vocabulary'])) {
// Create a new TaxonomyVocabulary entity for the add form.
// Create a new Vocabulary entity for the add form.
if (!isset($vocabulary)) {
$vocabulary = entity_create('taxonomy_vocabulary', array(
// Default the new vocabulary to the site's default language. This is
@ -241,14 +244,14 @@ function taxonomy_form_vocabulary_submit($form, &$form_state) {
* Display a tree of all the terms in a vocabulary, with options to edit
* each one. The form is made drag and drop by the theme function.
*
* @param TaxonomyVocabulary $vocabulary
* @param Drupal\taxonomy\Vocabulary $vocabulary
* The taxonomy vocabulary entity to list terms for.
*
* @ingroup forms
* @see taxonomy_overview_terms_submit()
* @see theme_taxonomy_overview_terms()
*/
function taxonomy_overview_terms($form, &$form_state, TaxonomyVocabulary $vocabulary) {
function taxonomy_overview_terms($form, &$form_state, Vocabulary $vocabulary) {
global $pager_page_array, $pager_total, $pager_total_items;
// Check for confirmation forms.
@ -642,10 +645,10 @@ function theme_taxonomy_overview_terms($variables) {
/**
* Form function for the term edit form.
*
* @param TaxonomyTerm|null $term
* @param Drupal\taxonomy\Term|null $term
* (optional) The taxonomy term entity to edit. If NULL or omitted, the form
* creates a new term.
* @param TaxonomyVocabulary|null $vocabulary
* @param Drupal\taxonomy\Vocabulary|null $vocabulary
* (optional) A taxonomy vocabulary entity to create the term in. Required if
* the term is omitted.
*
@ -653,12 +656,12 @@ function theme_taxonomy_overview_terms($variables) {
* @see taxonomy_form_term_validate()
* @see taxonomy_form_term_submit()
*/
function taxonomy_form_term($form, &$form_state, TaxonomyTerm $term = NULL, TaxonomyVocabulary $vocabulary = NULL) {
function taxonomy_form_term($form, &$form_state, Term $term = NULL, Vocabulary $vocabulary = NULL) {
// During initial form build, add the term entity to the form state for use
// during form building and processing. During a rebuild, use what is in the
// form state.
if (!isset($form_state['term'])) {
// Create a new TaxonomyTerm entity for the add form.
// Create a new Term entity for the add form.
if (!isset($term)) {
$term = entity_create('taxonomy_term', array(
'vid' => $vocabulary->vid,

View File

@ -32,10 +32,10 @@ function hook_taxonomy_vocabulary_load(array $vocabularies) {
* Modules implementing this hook can act on the vocabulary object before it is
* inserted or updated.
*
* @param TaxonomyVocabulary $vocabulary
* @param Drupal\taxonomy\Vocabulary $vocabulary
* A taxonomy vocabulary entity.
*/
function hook_taxonomy_vocabulary_presave(TaxonomyVocabulary $vocabulary) {
function hook_taxonomy_vocabulary_presave(Drupal\taxonomy\Vocabulary $vocabulary) {
$vocabulary->foo = 'bar';
}
@ -45,10 +45,10 @@ function hook_taxonomy_vocabulary_presave(TaxonomyVocabulary $vocabulary) {
* Modules implementing this hook can act on the vocabulary object when saved
* to the database.
*
* @param TaxonomyVocabulary $vocabulary
* @param Drupal\taxonomy\Vocabulary $vocabulary
* A taxonomy vocabulary entity.
*/
function hook_taxonomy_vocabulary_insert(TaxonomyVocabulary $vocabulary) {
function hook_taxonomy_vocabulary_insert(Drupal\taxonomy\Vocabulary $vocabulary) {
if ($vocabulary->synonyms) {
variable_set('taxonomy_' . $vocabulary->vid . '_synonyms', TRUE);
}
@ -59,10 +59,10 @@ function hook_taxonomy_vocabulary_insert(TaxonomyVocabulary $vocabulary) {
*
* Modules implementing this hook can act on the vocabulary object when updated.
*
* @param TaxonomyVocabulary $vocabulary
* @param Drupal\taxonomy\Vocabulary $vocabulary
* A taxonomy vocabulary entity.
*/
function hook_taxonomy_vocabulary_update(TaxonomyVocabulary $vocabulary) {
function hook_taxonomy_vocabulary_update(Drupal\taxonomy\Vocabulary $vocabulary) {
$status = $vocabulary->synonyms ? TRUE : FALSE;
if ($vocabulary->synonyms) {
variable_set('taxonomy_' . $vocabulary->vid . '_synonyms', $status);
@ -76,13 +76,13 @@ function hook_taxonomy_vocabulary_update(TaxonomyVocabulary $vocabulary) {
* field_attach_delete_bundle() is called and before the vocabulary is actually
* removed from the database.
*
* @param TaxonomyVocabulary $vocabulary
* @param Drupal\taxonomy\Vocabulary $vocabulary
* The taxonomy vocabulary entity that is about to be deleted.
*
* @see hook_taxonomy_vocabulary_delete()
* @see taxonomy_vocabulary_delete()
*/
function hook_taxonomy_vocabulary_predelete(TaxonomyVocabulary $vocabulary) {
function hook_taxonomy_vocabulary_predelete(Drupal\taxonomy\Vocabulary $vocabulary) {
if (variable_get('taxonomy_' . $vocabulary->vid . '_synonyms', FALSE)) {
variable_del('taxonomy_' . $vocabulary->vid . '_synonyms');
}
@ -95,13 +95,13 @@ function hook_taxonomy_vocabulary_predelete(TaxonomyVocabulary $vocabulary) {
* field_attach_delete_bundle() has been called and after the vocabulary has
* been removed from the database.
*
* @param TaxonomyVocabulary $vocabulary
* @param Drupal\taxonomy\Vocabulary $vocabulary
* The taxonomy vocabulary entity that has been deleted.
*
* @see hook_taxonomy_vocabulary_predelete()
* @see taxonomy_vocabulary_delete()
*/
function hook_taxonomy_vocabulary_delete(TaxonomyVocabulary $vocabulary) {
function hook_taxonomy_vocabulary_delete(Drupal\taxonomy\Vocabulary $vocabulary) {
if (variable_get('taxonomy_' . $vocabulary->vid . '_synonyms', FALSE)) {
variable_del('taxonomy_' . $vocabulary->vid . '_synonyms');
}
@ -136,10 +136,10 @@ function hook_taxonomy_term_load(array $terms) {
* Modules implementing this hook can act on the term object before it is
* inserted or updated.
*
* @param TaxonomyTerm $term
* @param Drupal\taxonomy\Term $term
* A taxonomy term entity.
*/
function hook_taxonomy_term_presave(TaxonomyTerm $term) {
function hook_taxonomy_term_presave(Drupal\taxonomy\Term $term) {
$term->foo = 'bar';
}
@ -149,10 +149,10 @@ function hook_taxonomy_term_presave(TaxonomyTerm $term) {
* Modules implementing this hook can act on the term object when saved to
* the database.
*
* @param TaxonomyTerm $term
* @param Drupal\taxonomy\Term $term
* A taxonomy term entity.
*/
function hook_taxonomy_term_insert(TaxonomyTerm $term) {
function hook_taxonomy_term_insert(Drupal\taxonomy\Term $term) {
if (!empty($term->synonyms)) {
foreach (explode ("\n", str_replace("\r", '', $term->synonyms)) as $synonym) {
if ($synonym) {
@ -172,10 +172,10 @@ function hook_taxonomy_term_insert(TaxonomyTerm $term) {
*
* Modules implementing this hook can act on the term object when updated.
*
* @param TaxonomyTerm $term
* @param Drupal\taxonomy\Term $term
* A taxonomy term entity.
*/
function hook_taxonomy_term_update(TaxonomyTerm $term) {
function hook_taxonomy_term_update(Drupal\taxonomy\Term $term) {
hook_taxonomy_term_delete($term);
if (!empty($term->synonyms)) {
foreach (explode ("\n", str_replace("\r", '', $term->synonyms)) as $synonym) {
@ -198,12 +198,12 @@ function hook_taxonomy_term_update(TaxonomyTerm $term) {
* field_attach_delete() is called and before the term is actually removed from
* the database.
*
* @param TaxonomyTerm $term
* @param Drupal\taxonomy\Term $term
* The taxonomy term entity that is about to be deleted.
*
* @see taxonomy_term_delete()
*/
function hook_taxonomy_term_predelete(TaxonomyTerm $term) {
function hook_taxonomy_term_predelete(Drupal\taxonomy\Term $term) {
db_delete('term_synoynm')->condition('tid', $term->tid)->execute();
}
@ -213,12 +213,12 @@ function hook_taxonomy_term_predelete(TaxonomyTerm $term) {
* This hook is invoked from taxonomy_term_delete() after field_attach_delete()
* has been called and after the term has been removed from the database.
*
* @param TaxonomyTerm $term
* @param Drupal\taxonomy\Term $term
* The taxonomy term entity that has been deleted.
*
* @see taxonomy_term_delete()
*/
function hook_taxonomy_term_delete(TaxonomyTerm $term) {
function hook_taxonomy_term_delete(Drupal\taxonomy\Term $term) {
db_delete('term_synoynm')->condition('tid', $term->tid)->execute();
}

View File

@ -1,369 +0,0 @@
<?php
/**
* @file
* Entity classes and controllers for Taxonomy module.
*/
use Drupal\entity\Entity;
use Drupal\entity\EntityInterface;
use Drupal\entity\EntityDatabaseStorageController;
/**
* Defines the taxonomy term entity.
*/
class TaxonomyTerm extends Entity {
/**
* The taxonomy term ID.
*
* @var integer
*/
public $tid;
/**
* The taxonomy vocabulary ID this term belongs to.
*
* @var integer
*/
public $vid;
/**
* Name of the term.
*
* @var string
*/
public $name;
/**
* (optional) Description of the term.
*
* @var string
*/
public $description;
/**
* (optional) The text format name for the term's description.
*
* @var string
*/
public $format;
/**
* (optional) The weight of this term in relation to other terms of the same
* vocabulary.
*
* @var integer
*/
public $weight = 0;
/**
* (optional) The parent term(s) for this term.
*
* This property is not loaded, but may be used to modify the term parents via
* TaxonomyTerm::save().
*
* The property can be set to an array of term IDs. An entry of 0 means this
* term does not have any parents. When omitting this variable during an
* update, the existing hierarchy for the term remains unchanged.
*
* @var array
*/
public $parent;
/**
* (optional) The machine name of the vocabulary the term is assigned to. If
* not given, this value will be set automatically by loading the vocabulary
* based on the $entity->vid property.
*
* @var string
*/
public $vocabulary_machine_name;
/**
* Implements EntityInterface::id().
*/
public function id() {
return $this->tid;
}
/**
* Implements EntityInterface::bundle().
*/
public function bundle() {
return $this->vocabulary_machine_name;
}
}
/**
* Controller class for taxonomy terms.
*/
class TaxonomyTermController extends EntityDatabaseStorageController {
/**
* Overrides EntityDatabaseStorageController::create().
*
* @param array $values
* An array of values to set, keyed by property name. A value for the
* vocabulary ID ('vid') is required.
*/
public function create(array $values) {
$entity = parent::create($values);
// Ensure the vocabulary machine name is initialized as it is used as bundle
// key.
// @todo Move to TaxonomyTerm::bundle() once field API has been converted
// to make use of it.
if (!isset($entity->vocabulary_machine_name)) {
$vocabulary = taxonomy_vocabulary_load($entity->vid);
$entity->vocabulary_machine_name = $vocabulary->machine_name;
}
// Save new terms with no parents by default.
if (!isset($entity->parent)) {
$entity->parent = array(0);
}
return $entity;
}
/**
* Overrides EntityDatabaseStorageController::buildQuery().
*/
protected function buildQuery($ids, $conditions = array(), $revision_id = FALSE) {
$query = parent::buildQuery($ids, $conditions, $revision_id);
$query->addTag('translatable');
$query->addTag('term_access');
// When name is passed as a condition use LIKE.
if (isset($conditions['name'])) {
$query_conditions = &$query->conditions();
foreach ($query_conditions as $key => $condition) {
if ($condition['field'] == 'base.name') {
$query_conditions[$key]['operator'] = 'LIKE';
$query_conditions[$key]['value'] = db_like($query_conditions[$key]['value']);
}
}
}
// Add the machine name field from the {taxonomy_vocabulary} table.
$query->innerJoin('taxonomy_vocabulary', 'v', 'base.vid = v.vid');
$query->addField('v', 'machine_name', 'vocabulary_machine_name');
return $query;
}
/**
* Overrides EntityDatabaseStorageController::cacheGet().
*/
protected function cacheGet($ids, $conditions = array()) {
$terms = parent::cacheGet($ids, $conditions);
// Name matching is case insensitive, note that with some collations
// LOWER() and drupal_strtolower() may return different results.
foreach ($terms as $term) {
if (isset($conditions['name']) && drupal_strtolower($conditions['name'] != drupal_strtolower($term->name))) {
unset($terms[$term->tid]);
}
}
return $terms;
}
/**
* Overrides EntityDatabaseStorageController::postDelete().
*/
protected function postDelete($entities) {
// See if any of the term's children are about to be become orphans.
$orphans = array();
foreach (array_keys($entities) as $tid) {
if ($children = taxonomy_term_load_children($tid)) {
foreach ($children as $child) {
// If the term has multiple parents, we don't delete it.
$parents = taxonomy_term_load_parents($child->tid);
// Because the parent has already been deleted, the parent count might
// be 0.
if (count($parents) <= 1) {
$orphans[] = $child->tid;
}
}
}
}
// Delete term hierarchy information after looking up orphans but before
// deleting them so that their children/parent information is consistent.
db_delete('taxonomy_term_hierarchy')
->condition('tid', array_keys($entities))
->execute();
if (!empty($orphans)) {
taxonomy_term_delete_multiple($orphans);
}
}
/**
* Overrides EntityDatabaseStorageController::postSave().
*/
protected function postSave(EntityInterface $entity, $update) {
if (isset($entity->parent)) {
db_delete('taxonomy_term_hierarchy')
->condition('tid', $entity->tid)
->execute();
$query = db_insert('taxonomy_term_hierarchy')
->fields(array('tid', 'parent'));
foreach ($entity->parent as $parent) {
$query->values(array(
'tid' => $entity->tid,
'parent' => $parent
));
}
$query->execute();
}
}
/**
* Implements Drupal\entity\EntityControllerInterface::resetCache().
*/
public function resetCache(array $ids = NULL) {
drupal_static_reset('taxonomy_term_count_nodes');
drupal_static_reset('taxonomy_get_tree');
drupal_static_reset('taxonomy_get_tree:parents');
drupal_static_reset('taxonomy_get_tree:terms');
drupal_static_reset('taxonomy_term_load_parents');
drupal_static_reset('taxonomy_term_load_parents_all');
drupal_static_reset('taxonomy_term_load_children');
parent::resetCache($ids);
}
}
/**
* Defines the taxonomy vocabulary entity.
*/
class TaxonomyVocabulary extends Entity {
/**
* The taxonomy vocabulary ID.
*
* @var integer
*/
public $vid;
/**
* Name of the vocabulary.
*
* @var string
*/
public $name;
/**
* The vocabulary machine name.
*
* @var string
*/
public $machine_name;
/**
* (optional) Description of the vocabulary.
*
* @var string
*/
public $description;
/**
* The type of hierarchy allowed within the vocabulary.
*
* Possible values:
* - TAXONOMY_HIERARCHY_DISABLED: No parents.
* - TAXONOMY_HIERARCHY_SINGLE: Single parent.
* - TAXONOMY_HIERARCHY_MULTIPLE: Multiple parents.
*
* @var integer
*/
public $hierarchy = TAXONOMY_HIERARCHY_DISABLED;
/**
* (optional) The weight of this vocabulary in relation to other vocabularies.
*
* @var integer
*/
public $weight = 0;
/**
* Implements EntityInterface::id().
*/
public function id() {
return $this->vid;
}
}
/**
* Controller class for taxonomy vocabularies.
*/
class TaxonomyVocabularyController extends EntityDatabaseStorageController {
/**
* Overrides EntityDatabaseStorageController::buildQuery().
*/
protected function buildQuery($ids, $conditions = array(), $revision_id = FALSE) {
$query = parent::buildQuery($ids, $conditions, $revision_id);
$query->addTag('translatable');
$query->orderBy('base.weight');
$query->orderBy('base.name');
return $query;
}
/**
* Overrides EntityDatabaseStorageController::postSave().
*/
protected function postSave(EntityInterface $entity, $update) {
if (!$update) {
field_attach_create_bundle('taxonomy_term', $entity->machine_name);
}
elseif ($entity->original->machine_name != $entity->machine_name) {
field_attach_rename_bundle('taxonomy_term', $entity->original->machine_name, $entity->machine_name);
}
}
/**
* Overrides EntityDatabaseStorageController::preDelete().
*/
protected function preDelete($entities) {
// Only load terms without a parent, child terms will get deleted too.
$tids = db_query('SELECT t.tid FROM {taxonomy_term_data} t INNER JOIN {taxonomy_term_hierarchy} th ON th.tid = t.tid WHERE t.vid IN (:vids) AND th.parent = 0', array(':vids' => array_keys($entities)))->fetchCol();
taxonomy_term_delete_multiple($tids);
}
/**
* Overrides EntityDatabaseStorageController::postDelete().
*/
protected function postDelete($entities) {
// Load all Taxonomy module fields and delete those which use only this
// vocabulary.
$taxonomy_fields = field_read_fields(array('module' => 'taxonomy'));
foreach ($taxonomy_fields as $field_name => $taxonomy_field) {
$modified_field = FALSE;
// Term reference fields may reference terms from more than one
// vocabulary.
foreach ($taxonomy_field['settings']['allowed_values'] as $key => $allowed_value) {
foreach ($entities as $vocabulary) {
if ($allowed_value['vocabulary'] == $vocabulary->machine_name) {
unset($taxonomy_field['settings']['allowed_values'][$key]);
$modified_field = TRUE;
}
}
}
if ($modified_field) {
if (empty($taxonomy_field['settings']['allowed_values'])) {
field_delete_field($field_name);
}
else {
// Update the field definition with the new allowed values.
field_update_field($taxonomy_field);
}
}
}
}
/**
* Implements Drupal\entity\EntityControllerInterface::resetCache().
*/
public function resetCache(array $ids = NULL) {
drupal_static_reset('taxonomy_vocabulary_get_names');
parent::resetCache($ids);
cache_clear_all();
}
}

View File

@ -5,6 +5,5 @@ version = VERSION
core = 8.x
dependencies[] = options
dependencies[] = entity
files[] = taxonomy.entity.inc
files[] = taxonomy.test
configure = admin/structure/taxonomy

View File

@ -6,6 +6,8 @@
*/
use Drupal\node\Node;
use Drupal\taxonomy\Term;
use Drupal\taxonomy\Vocabulary;
/**
* Denotes that no term in the vocabulary has a parent.
@ -109,8 +111,8 @@ function taxonomy_entity_info() {
$return = array(
'taxonomy_term' => array(
'label' => t('Taxonomy term'),
'entity class' => 'TaxonomyTerm',
'controller class' => 'TaxonomyTermController',
'entity class' => 'Drupal\taxonomy\Term',
'controller class' => 'Drupal\taxonomy\TermStorageController',
'base table' => 'taxonomy_term_data',
'uri callback' => 'taxonomy_term_uri',
'fieldable' => TRUE,
@ -145,8 +147,8 @@ function taxonomy_entity_info() {
}
$return['taxonomy_vocabulary'] = array(
'label' => t('Taxonomy vocabulary'),
'entity class' => 'TaxonomyVocabulary',
'controller class' => 'TaxonomyVocabularyController',
'entity class' => 'Drupal\taxonomy\Vocabulary',
'controller class' => 'Drupal\taxonomy\VocabularyStorageController',
'base table' => 'taxonomy_vocabulary',
'entity keys' => array(
'id' => 'vid',
@ -426,17 +428,17 @@ function taxonomy_term_access($op, $term) {
/**
* Return the vocabulary name given the vocabulary object.
*/
function taxonomy_admin_vocabulary_title_callback(TaxonomyVocabulary $vocabulary) {
function taxonomy_admin_vocabulary_title_callback(Vocabulary $vocabulary) {
return check_plain($vocabulary->name);
}
/**
* Saves a vocabulary.
*
* @param TaxonomyVocabulary $vocabulary
* @param Drupal\taxonomy\Vocabulary $vocabulary
* The taxonomy vocabulary entity to be saved.
*/
function taxonomy_vocabulary_save(TaxonomyVocabulary $vocabulary) {
function taxonomy_vocabulary_save(Vocabulary $vocabulary) {
return $vocabulary->save();
}
@ -464,7 +466,7 @@ function taxonomy_vocabulary_delete_multiple(array $vids) {
/**
* Implements hook_taxonomy_vocabulary_update().
*/
function taxonomy_taxonomy_vocabulary_update(TaxonomyVocabulary $vocabulary) {
function taxonomy_taxonomy_vocabulary_update(Vocabulary $vocabulary) {
// Reflect machine name changes in the definitions of existing 'taxonomy'
// fields.
if (!empty($vocabulary->original->machine_name) && $vocabulary->original->machine_name != $vocabulary->machine_name) {
@ -497,7 +499,7 @@ function taxonomy_taxonomy_vocabulary_update(TaxonomyVocabulary $vocabulary) {
* term has multiple parents then the vocabulary will be given a hierarchy of
* TAXONOMY_HIERARCHY_MULTIPLE.
*
* @param TaxonomyVocabulary $vocabulary
* @param Drupal\taxonomy\Vocabulary $vocabulary
* A taxonomy vocabulary entity.
* @param $changed_term
* An array of the term structure that was updated.
@ -505,7 +507,7 @@ function taxonomy_taxonomy_vocabulary_update(TaxonomyVocabulary $vocabulary) {
* @return
* An integer that represents the level of the vocabulary's hierarchy.
*/
function taxonomy_check_vocabulary_hierarchy(TaxonomyVocabulary $vocabulary, $changed_term) {
function taxonomy_check_vocabulary_hierarchy(Vocabulary $vocabulary, $changed_term) {
$tree = taxonomy_get_tree($vocabulary->vid);
$hierarchy = TAXONOMY_HIERARCHY_DISABLED;
foreach ($tree as $term) {
@ -534,7 +536,7 @@ function taxonomy_check_vocabulary_hierarchy(TaxonomyVocabulary $vocabulary, $ch
/**
* Saves a term object to the database.
*
* @param TaxonomyTerm $term
* @param Drupal\taxonomy\Term $term
* The taxonomy term entity to be saved.
*
* @return
@ -542,7 +544,7 @@ function taxonomy_check_vocabulary_hierarchy(TaxonomyVocabulary $vocabulary, $ch
* (SAVED_UPDATED). When inserting a new term, $term->tid will contain the
* term ID of the newly created term.
*/
function taxonomy_term_save(TaxonomyTerm $term) {
function taxonomy_term_save(Term $term) {
return $term->save();
}
@ -569,7 +571,7 @@ function taxonomy_term_delete_multiple(array $tids) {
/**
* Generate an array for rendering the given term.
*
* @param TaxonomyTerm $term
* @param Drupal\taxonomy\Term $term
* A taxonomy term entity.
* @param $view_mode
* View mode, e.g. 'full', 'teaser'...
@ -580,7 +582,7 @@ function taxonomy_term_delete_multiple(array $tids) {
* @return
* An array as expected by drupal_render().
*/
function taxonomy_term_view(TaxonomyTerm $term, $view_mode = 'full', $langcode = NULL) {
function taxonomy_term_view(Term $term, $view_mode = 'full', $langcode = NULL) {
if (!isset($langcode)) {
$langcode = $GLOBALS['language_content']->langcode;
}
@ -655,10 +657,10 @@ function template_preprocess_taxonomy_term(&$variables) {
/**
* Returns whether the current page is the page of the passed-in term.
*
* @param TaxonomyTerm $term
* @param Drupal\taxonomy\Term $term
* A taxonomy term entity.
*/
function taxonomy_term_is_page(TaxonomyTerm $term) {
function taxonomy_term_is_page(Term $term) {
$page_term = menu_get_object('taxonomy_term', 2);
return (!empty($page_term) ? $page_term->tid == $term->tid : FALSE);
}
@ -989,7 +991,7 @@ function taxonomy_vocabulary_load_multiple($vids = array(), array $conditions =
* @param int $vid
* The vocabulary's ID.
*
* @return TaxonomyVocabulary|false
* @return Drupal\taxonomy\Vocabulary|false
* The taxonomy vocabulary entity, if exists, FALSE otherwise. Results are
* statically cached.
*
@ -1005,7 +1007,7 @@ function taxonomy_vocabulary_load($vid) {
* @param $name
* The vocabulary's machine name.
*
* @return TaxonomyVocabulary|false
* @return Drupal\taxonomy\Vocabulary|false
* The taxonomy vocabulary entity, if exists, FALSE otherwise. Results are
* statically cached.
*
@ -1022,7 +1024,7 @@ function taxonomy_vocabulary_machine_name_load($name) {
* @param $tid
* A term's ID
*
* @return TaxonomyTerm|false
* @return Drupal\taxonomy\Term|false
* A taxonomy term entity. Results are statically cached.
*/
function taxonomy_term_load($tid) {
@ -1035,7 +1037,7 @@ function taxonomy_term_load($tid) {
/**
* Helper function for array_map purposes.
*/
function _taxonomy_get_tid_from_term(TaxonomyTerm $term) {
function _taxonomy_get_tid_from_term(Term $term) {
return $term->tid;
}
@ -1349,13 +1351,13 @@ function taxonomy_field_formatter_prepare_view($entity_type, $entities, $field,
/**
* Title callback for term pages.
*
* @param TaxonomyTerm $term
* @param Drupal\taxonomy\Term $term
* A taxonomy term entity.
*
* @return
* The term name to be used as the page title.
*/
function taxonomy_term_title(TaxonomyTerm $term) {
function taxonomy_term_title(Term $term) {
return $term->name;
}
@ -1649,7 +1651,7 @@ function taxonomy_delete_node_index(Node $node) {
/**
* Implements hook_taxonomy_term_delete().
*/
function taxonomy_taxonomy_term_delete(TaxonomyTerm $term) {
function taxonomy_taxonomy_term_delete(Term $term) {
if (variable_get('taxonomy_maintain_index_table', TRUE)) {
// Clean up the {taxonomy_index} table when terms are deleted.
db_delete('taxonomy_index')->condition('tid', $term->tid)->execute();

View File

@ -5,13 +5,16 @@
* Page callbacks for the taxonomy module.
*/
use Drupal\taxonomy\Term;
use Drupal\taxonomy\Vocabulary;
/**
* Menu callback; displays all nodes associated with a term.
*
* @param TaxonomyTerm $term
* @param Drupal\taxonomy\Term $term
* The taxonomy term entity.
*/
function taxonomy_term_page(TaxonomyTerm $term) {
function taxonomy_term_page(Term $term) {
// Assign the term name as the page title.
drupal_set_title($term->name);
@ -60,10 +63,10 @@ function taxonomy_term_page(TaxonomyTerm $term) {
/**
* Generate the content feed for a taxonomy term.
*
* @param TaxonomyTerm $term
* @param Drupal\taxonomy\Term $term
* The taxonomy term entity.
*/
function taxonomy_term_feed(TaxonomyTerm $term) {
function taxonomy_term_feed(Term $term) {
$channel['link'] = url('taxonomy/term/' . $term->tid, array('absolute' => TRUE));
$channel['title'] = variable_get('site_name', 'Drupal') . ' - ' . $term->name;
// Only display the description if we have a single term, to avoid clutter and confusion.