mirror of
https://github.com/processwire/processwire.git
synced 2025-08-16 03:34:33 +02:00
Update Field getFieldgroups() and getTemplates() methods to pull from DB rather than API (to avoid loading all templates/fieldgroups) and move the code from Field class into Fields class.
This commit is contained in:
@@ -914,29 +914,7 @@ class Field extends WireData implements Saveable, Exportable {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public function getFieldgroups($getCount = false) {
|
public function getFieldgroups($getCount = false) {
|
||||||
|
return $this->wire()->fields->getFieldgroups($this, $getCount);
|
||||||
$fieldgroups = $this->wire()->fieldgroups;
|
|
||||||
$items = $getCount ? null : $this->wire(new FieldgroupsArray()); /** @var FieldgroupsArray $items */
|
|
||||||
$count = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* note: all fieldgroups load on the foreach($fieldgroups) so this code doesn't seem necessary?
|
|
||||||
if($fieldgroups->useLazy()) {
|
|
||||||
$fieldgroups->loadLazyItemsByValue('fields_id', $this->settings['id']);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
foreach($fieldgroups as $fieldgroup) {
|
|
||||||
foreach($fieldgroup as $field) {
|
|
||||||
if($field->id == $this->id) {
|
|
||||||
if($items) $items->add($fieldgroup);
|
|
||||||
$count++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $getCount ? $count : $items;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -949,29 +927,9 @@ class Field extends WireData implements Saveable, Exportable {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public function getTemplates($getCount = false) {
|
public function getTemplates($getCount = false) {
|
||||||
$templates = $this->wire()->templates;
|
return $this->wire()->fields->getTemplates($this, $getCount);
|
||||||
if($getCount) {
|
|
||||||
$count = 0;
|
|
||||||
foreach($templates as $template) {
|
|
||||||
if($template->hasField($this)) $count++;
|
|
||||||
}
|
|
||||||
return $count;
|
|
||||||
}
|
|
||||||
/** @var TemplatesArray $items */
|
|
||||||
$items = $this->wire(new TemplatesArray());
|
|
||||||
$fieldgroups = $this->getFieldgroups();
|
|
||||||
foreach($templates as $template) {
|
|
||||||
foreach($fieldgroups as $fieldgroup) {
|
|
||||||
if($template->fieldgroups_id == $fieldgroup->id) {
|
|
||||||
$items->add($template);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $items;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the default value for this field (if set), or null otherwise.
|
* Return the default value for this field (if set), or null otherwise.
|
||||||
*
|
*
|
||||||
|
@@ -260,6 +260,7 @@ class Fields extends WireSaveableItems {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public function getAll() {
|
public function getAll() {
|
||||||
|
if($this->useLazy()) $this->loadAllLazyItems();
|
||||||
return $this->getWireArray();
|
return $this->getWireArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1310,6 +1311,116 @@ class Fields extends WireSaveableItems {
|
|||||||
if($this->tableTools === null) $this->tableTools = $this->wire(new FieldsTableTools());
|
if($this->tableTools === null) $this->tableTools = $this->wire(new FieldsTableTools());
|
||||||
return $this->tableTools;
|
return $this->tableTools;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the list of Fieldgroups using given field.
|
||||||
|
*
|
||||||
|
* #pw-internal
|
||||||
|
*
|
||||||
|
* @param Field|int|string Field to get fieldgroups for
|
||||||
|
* @param bool $getCount Get count rather than FieldgroupsArray? (default=false) 3.0.182+
|
||||||
|
* @return FieldgroupsArray|int WireArray of Fieldgroup objects or count if requested
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function getFieldgroups($field, $getCount = false) {
|
||||||
|
|
||||||
|
$fieldId = $this->_fieldId($field);
|
||||||
|
$fieldgroups = $this->wire()->fieldgroups;
|
||||||
|
$items = $getCount ? null : $this->wire(new FieldgroupsArray()); /** @var FieldgroupsArray $items */
|
||||||
|
$ids = array();
|
||||||
|
$count = 0;
|
||||||
|
|
||||||
|
$sql = "SELECT fieldgroups_id FROM fieldgroups_fields WHERE fields_id=:fields_id";
|
||||||
|
$query = $this->wire()->database->prepare($sql);
|
||||||
|
$query->bindValue(':fields_id', $fieldId, \PDO::PARAM_INT);
|
||||||
|
$query->execute();
|
||||||
|
|
||||||
|
while($row = $query->fetch(\PDO::FETCH_NUM)) {
|
||||||
|
$id = (int) $row[0];
|
||||||
|
$ids[$id] = $id;
|
||||||
|
}
|
||||||
|
|
||||||
|
$query->closeCursor();
|
||||||
|
|
||||||
|
foreach($ids as $id) {
|
||||||
|
$fieldgroup = $fieldgroups->get($id);
|
||||||
|
if(!$fieldgroup) continue;
|
||||||
|
if($items) $items->add($fieldgroup);
|
||||||
|
$count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $getCount ? $count : $items;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the list of of Templates using given field.
|
||||||
|
*
|
||||||
|
* #pw-internal
|
||||||
|
*
|
||||||
|
* @param Field|int|string Field to get templates for
|
||||||
|
* @param bool $getCount Get count rather than FieldgroupsArray? (default=false)
|
||||||
|
* @return TemplatesArray|int WireArray of Template objects or count when requested.
|
||||||
|
* @since 3.0.195
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function getTemplates($field, $getCount = false) {
|
||||||
|
|
||||||
|
$fieldId = $this->_fieldId($field);
|
||||||
|
$templates = $this->wire()->templates;
|
||||||
|
$items = $getCount ? null : $this->wire(new TemplatesArray()); /** @var TemplatesArray $items */
|
||||||
|
$count = 0;
|
||||||
|
$ids = array();
|
||||||
|
|
||||||
|
if(!$fieldId) return $items;
|
||||||
|
|
||||||
|
$sql =
|
||||||
|
"SELECT fieldgroups_fields.fieldgroups_id, templates.id AS templates_id " .
|
||||||
|
"FROM fieldgroups_fields " .
|
||||||
|
"JOIN templates ON templates.fieldgroups_id=fieldgroups_fields.fieldgroups_id " .
|
||||||
|
"WHERE fieldgroups_fields.fields_id=:fields_id";
|
||||||
|
|
||||||
|
$query = $this->wire()->database->prepare($sql);
|
||||||
|
$query->bindValue(':fields_id', $fieldId, \PDO::PARAM_INT);
|
||||||
|
$query->execute();
|
||||||
|
|
||||||
|
while($row = $query->fetch(\PDO::FETCH_ASSOC)) {
|
||||||
|
$id = (int) $row['templates_id'];
|
||||||
|
$ids[$id] = $id;
|
||||||
|
}
|
||||||
|
|
||||||
|
$query->closeCursor();
|
||||||
|
|
||||||
|
foreach($ids as $id) {
|
||||||
|
$template = $templates->get($id);
|
||||||
|
if(!$template) continue;
|
||||||
|
if($items) $items->add($template);
|
||||||
|
$count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $getCount ? $count : $items;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return field ID for given value (Field, field name, field ID) or 0 if none
|
||||||
|
*
|
||||||
|
* #pw-internal
|
||||||
|
*
|
||||||
|
* @param Field|string|int $field
|
||||||
|
* @return int
|
||||||
|
* @since 3.0.195
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function _fieldId($field) {
|
||||||
|
if($field instanceof Field) {
|
||||||
|
$fieldId = $field->id;
|
||||||
|
} else if(ctype_digit("$field")) {
|
||||||
|
$fieldId = (int) $field;
|
||||||
|
} else {
|
||||||
|
$field = $this->get($field);
|
||||||
|
$fieldId = $field ? $field->id : 0;
|
||||||
|
}
|
||||||
|
return $fieldId;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user