1
0
mirror of https://github.com/processwire/processwire.git synced 2025-08-07 15:26:54 +02:00

Minor code improvements in various classes, mostly phpdoc related

This commit is contained in:
Ryan Cramer
2022-09-12 11:15:53 -04:00
parent 6262fcdff8
commit f6558c25ac
12 changed files with 296 additions and 216 deletions

View File

@@ -532,7 +532,7 @@ class Field extends WireData implements Saveable, Exportable {
foreach(array('viewRoles', 'editRoles') as $roleType) {
if(!is_array($data[$roleType])) $data[$roleType] = array();
$roleNames = array();
foreach($data[$roleType] as $key => $roleID) {
foreach($data[$roleType] as $roleID) {
$role = $roles->get($roleID);
if(!$role || !$role->id) continue;
$roleNames[] = $role->name;
@@ -675,7 +675,7 @@ class Field extends WireData implements Saveable, Exportable {
*/
public function setFieldtype($type) {
if(is_object($type) && $type instanceof Fieldtype) {
if($type instanceof Fieldtype) {
// good for you
} else if(is_string($type)) {
@@ -997,7 +997,7 @@ class Field extends WireData implements Saveable, Exportable {
}
}
if($locked && $locked === 'hidden') {
if($locked === 'hidden') {
// Inputfield should not be shown
$inputfield->collapsed = Inputfield::collapsedHidden;
} else if($locked) {
@@ -1098,7 +1098,8 @@ class Field extends WireData implements Saveable, Exportable {
}
if(!$fieldgroupContext || count($allowContext)) {
/** @var InputfieldWrapper $inputfields */
$inputfields = $this->wire(new InputfieldWrapper());
if(!$fieldgroupContext) $inputfields->head = $this->_('Field type details');
$inputfields->attr('title', $this->_('Details'));
@@ -1111,12 +1112,14 @@ class Field extends WireData implements Saveable, Exportable {
if(!$fieldtypeInputfields) $fieldtypeInputfields = $this->wire(new InputfieldWrapper());
$configArray = $this->type->getConfigArray($this);
if(count($configArray)) {
/** @var InputfieldWrapper $w */
$w = $this->wire(new InputfieldWrapper());
$w->importArray($configArray);
$w->populateValues($this);
$fieldtypeInputfields->import($w);
}
foreach($fieldtypeInputfields as $inputfield) {
/** @var Inputfield $inputfield */
if($fieldgroupContext && !in_array($inputfield->name, $allowContext)) continue;
$inputfields->append($inputfield);
unset($remainingNames[$inputfield->name]);
@@ -1139,6 +1142,7 @@ class Field extends WireData implements Saveable, Exportable {
if(count($inputfields)) $wrapper->append($inputfields);
}
/** @var InputfieldWrapper $inputfields */
$inputfields = $this->wire(new InputfieldWrapper());
$dummyPage = $this->wire()->pages->get('/'); // only using this to satisfy param requirement
@@ -1157,17 +1161,21 @@ class Field extends WireData implements Saveable, Exportable {
}
$inputfields->attr('title', $this->_('Input'));
$inputfields->attr('id+name', 'inputfieldConfig');
/** @var InputfieldWrapper $inputfieldInputfields */
$inputfieldInputfields = $inputfield->getConfigInputfields();
if(!$inputfieldInputfields) $inputfieldInputfields = $this->wire(new InputfieldWrapper());
if(!$inputfieldInputfields) {
/** @var InputfieldWrapper $inputfieldInputfields */
$inputfieldInputfields = $this->wire(new InputfieldWrapper());
}
$configArray = $inputfield->getConfigArray();
if(count($configArray)) {
/** @var InputfieldWrapper $w */
$w = $this->wire(new InputfieldWrapper());
$w->importArray($configArray);
$w->populateValues($this);
$inputfieldInputfields->import($w);
}
foreach($inputfieldInputfields as $i) {
/** @var Inputfield $i */
if($fieldgroupContext && !in_array($i->name, $allowContext)) continue;
$inputfields->append($i);
unset($remainingNames[$i->name]);

View File

@@ -65,7 +65,7 @@ class Fieldgroup extends WireArray implements Saveable, Exportable, HasLookupIte
*
*/
public function isValidItem($item) {
return is_object($item) && $item instanceof Field;
return $item instanceof Field;
}
/**
@@ -87,10 +87,11 @@ class Fieldgroup extends WireArray implements Saveable, Exportable, HasLookupIte
* #pw-internal
*
* @param $item
* @return int|string
* @return int
*
*/
public function getItemKey($item) {
/** @var Field $item */
return $item->id;
}
@@ -116,15 +117,16 @@ class Fieldgroup extends WireArray implements Saveable, Exportable, HasLookupIte
*
* #pw-group-manipulation
*
* @param Field|string $field Field object, field name or id.
* @param Field|string $item Field object, field name or id.
* @return $this
* @throws WireException
*
*/
public function add($field) {
public function add($item) {
$field = $item;
if(!is_object($field)) $field = $this->wire()->fields->get($field);
if($field && $field instanceof Field) {
if($field instanceof Field) {
if(!$field->id) {
throw new WireException("You must save field '$field' before adding to Fieldgroup '$this->name'");
}
@@ -149,13 +151,14 @@ class Fieldgroup extends WireArray implements Saveable, Exportable, HasLookupIte
*
* #pw-group-manipulation
*
* @param Field|string $field Field object or field name, or id.
* @param Field|string $key Field object or field name, or id.
* @return bool True on success, false on failure.
*
*/
public function remove($field) {
if(!is_object($field)) $field = $this->wire('fields')->get($field);
public function remove($key) {
$field = $key;
if(!is_object($field)) $field = $this->wire()->fields->get($field);
if(!$this->getField($field->id)) return false;
if(!$field) return true;
@@ -205,7 +208,7 @@ class Fieldgroup extends WireArray implements Saveable, Exportable, HasLookupIte
*/
public function softRemove($field) {
if(!is_object($field)) $field = $this->wire('fields')->get($field);
if(!is_object($field)) $field = $this->wire()->fields->get($field);
if(!$this->getField($field->id)) return false;
if(!$field) return true;
@@ -238,7 +241,7 @@ class Fieldgroup extends WireArray implements Saveable, Exportable, HasLookupIte
*
*/
public function getField($key, $useFieldgroupContext = false) {
if(is_object($key) && $key instanceof Field) $key = $key->id;
if($key instanceof Field) $key = $key->id;
if(is_string($key) && ctype_digit("$key")) $key = (int) $key;
if($this->isValidKey($key)) {
@@ -248,6 +251,7 @@ class Fieldgroup extends WireArray implements Saveable, Exportable, HasLookupIte
$value = null;
foreach($this as $field) {
/** @var Field $field */
if($field->name == $key) {
$value = $field;
break;
@@ -291,9 +295,9 @@ class Fieldgroup extends WireArray implements Saveable, Exportable, HasLookupIte
*
*/
public function hasFieldContext($field, $namespace = '') {
if(is_object($field) && $field instanceof Field) $field = $field->id;
if($field instanceof Field) $field = $field->id;
if(is_string($field) && !ctype_digit($field)) {
$field = $this->wire('fields')->get($field);
$field = $this->wire()->fields->get($field);
$field = $field && $field->id ? $field->id : 0;
}
if(isset($this->fieldContexts[(int) $field])) {
@@ -349,7 +353,10 @@ class Fieldgroup extends WireArray implements Saveable, Exportable, HasLookupIte
if($key == 'fields') return $this;
if($key == 'fields_id') {
$values = array();
foreach($this as $field) $values[] = $field->id;
foreach($this as $field) {
/** @var Field $field */
$values[] = $field->id;
}
return $values;
}
if($key == 'removedFields') return $this->removedFields;
@@ -429,7 +436,7 @@ class Fieldgroup extends WireArray implements Saveable, Exportable, HasLookupIte
*
*/
public function save() {
$this->wire('fieldgroups')->save($this);
$this->wire()->fieldgroups->save($this);
return $this;
}
@@ -460,8 +467,7 @@ class Fieldgroup extends WireArray implements Saveable, Exportable, HasLookupIte
*
*/
public function getExportData() {
/** @var Fieldgroups $fieldgroups */
$fieldgroups = $this->wire('fieldgroups');
$fieldgroups = $this->wire()->fieldgroups;
return $fieldgroups->getExportData($this);
}
@@ -562,6 +568,7 @@ class Fieldgroup extends WireArray implements Saveable, Exportable, HasLookupIte
}
foreach($this as $field) {
/** @var Field $field */
// for named multi-field retrieval
if($multiMode && !isset($fieldInputfields[$field->id])) continue;
@@ -612,7 +619,7 @@ class Fieldgroup extends WireArray implements Saveable, Exportable, HasLookupIte
continue;
}
} else if($field->modal && $field->type instanceof FieldtypeFieldsetOpen) {
} else if($field->get('modal') && $field->type instanceof FieldtypeFieldsetOpen) {
// field requires modal
$inModalGroup = $field->name;
@@ -629,6 +636,7 @@ class Fieldgroup extends WireArray implements Saveable, Exportable, HasLookupIte
// start a new container
$inputfield = $field->getInputfield($page, $contextStr);
if(!$inputfield) $inputfield = $this->wire(new InputfieldWrapper());
/** @var Inputfield|InputfieldWrapper $inputfield */
if($inputfield->collapsed == Inputfield::collapsedHidden) continue;
$container->add($inputfield);
$containers[] = $container;
@@ -655,7 +663,7 @@ class Fieldgroup extends WireArray implements Saveable, Exportable, HasLookupIte
if($multiMode) {
// add to container in requested order
foreach($fieldInputfields as $fieldID => $inputfield) {
foreach($fieldInputfields as /* $fieldID => */ $inputfield) {
if($inputfield) $container->add($inputfield);
}
}
@@ -686,7 +694,7 @@ class Fieldgroup extends WireArray implements Saveable, Exportable, HasLookupIte
*
*/
public function getNumTemplates() {
return $this->wire('fieldgroups')->getNumTemplates($this);
return $this->wire()->fieldgroups->getNumTemplates($this);
}
/**
@@ -756,7 +764,7 @@ class Fieldgroup extends WireArray implements Saveable, Exportable, HasLookupIte
*
*/
public function saveContext() {
return $this->wire('fieldgroups')->saveContext($this);
return $this->wire()->fieldgroups->saveContext($this);
}
}

View File

@@ -136,7 +136,7 @@ class Fieldgroups extends WireSaveableItemsLookup {
$templates = $this->wire()->templates;
$num = 0;
foreach($templates->getAllValues('fieldgroups_id', 'id') as $templateId => $fieldgroupId) {
foreach($templates->getAllValues('fieldgroups_id', 'id') as /* $templateId => */ $fieldgroupId) {
if($fieldgroupId == $fieldgroup->id) $num++;
}
@@ -180,6 +180,7 @@ class Fieldgroups extends WireSaveableItemsLookup {
if(!$useLazy && !is_object($fieldgroup)) $fieldgroup = $this->get($fieldgroup);
if($fieldgroup instanceof Fieldgroup) {
foreach($fieldgroup as $field) {
/** @var Field $field */
$fieldNames[$field->id] = $field->name;
}
return $fieldNames;
@@ -231,10 +232,13 @@ class Fieldgroups extends WireSaveableItemsLookup {
foreach($this->wire()->templates as $template) {
if($template->fieldgroup->id !== $fieldgroup->id) continue;
foreach($fieldgroup->removedFields as $field) {
/** @var Field $field */
// make sure the field is valid to delete from this template
$error = $this->isFieldNotRemoveable($field, $fieldgroup, $template);
if($error !== false) throw new WireException("$error Save of fieldgroup changes aborted.");
if($field->type) $field->type->deleteTemplateField($template, $field);
/** @var Fieldtype $fieldtype */
$fieldtype = $field->type;
if($fieldtype) $fieldtype->deleteTemplateField($template, $field);
$fieldgroup->finishRemove($field);
$fieldsRemoved[] = $field;
}
@@ -308,7 +312,8 @@ class Fieldgroups extends WireSaveableItemsLookup {
public function ___delete(Saveable $item) {
$templates = array();
foreach($this->wire('templates') as $template) {
foreach($this->wire()->templates as $template) {
/** @var Template $template */
if($template->fieldgroup->id == $item->id) $templates[] = $template->name;
}
@@ -330,7 +335,7 @@ class Fieldgroups extends WireSaveableItemsLookup {
*
*/
public function deleteField(Field $field) {
$database = $this->wire('database');
$database = $this->wire()->database;
$query = $database->prepare("DELETE FROM fieldgroups_fields WHERE fields_id=:fields_id"); // QA
$query->bindValue(":fields_id", $field->id, \PDO::PARAM_INT);
$result = $query->execute();
@@ -389,6 +394,7 @@ class Fieldgroups extends WireSaveableItemsLookup {
$fields = array();
$contexts = array();
foreach($fieldgroup as $field) {
/** @var Field $field */
$fields[] = $field->name;
$fieldContexts = $fieldgroup->getFieldContextArray();
if(isset($fieldContexts[$field->id])) {
@@ -450,18 +456,19 @@ class Fieldgroups extends WireSaveableItemsLookup {
// figure out which fields should be removed
foreach($fieldgroup as $field) {
/** @var Field $field */
$fieldNames[$field->name] = $field->name;
if(!in_array($field->name, $data['fields'])) {
$fieldgroup->remove($field);
$label = "-$field->name";
$return['fields']['new'] .= $label . "\n";;
$return['fields']['new'] .= $label . "\n";
$rmFields[] = $field->name;
}
}
// figure out which fields should be added
foreach($data['fields'] as $name) {
$field = $this->wire('fields')->get($name);
$field = $this->wire()->fields->get($name);
if(in_array($name, $rmFields)) continue;
if(!$field) {
$error = sprintf($this->_('Unable to find field: %s'), $name);
@@ -566,7 +573,7 @@ class Fieldgroups extends WireSaveableItemsLookup {
*/
public function isFieldNotRemoveable(Field $field, Fieldgroup $fieldgroup, Template $template = null) {
if(is_null($template)) $template = $this->wire('templates')->get($fieldgroup->name);
if(is_null($template)) $template = $this->wire()->templates->get($fieldgroup->name);
if(($field->flags & Field::flagGlobal) && (!$template || !$template->noGlobal)) {
if($template && $template->getConnectedField()) {

View File

@@ -402,10 +402,10 @@ class PageFinder extends Wire {
// protected $extraJoins = array();
// protected $nativeWheres = array(); // where statements for native fields, to be reused in subselects where appropriate.
public function __get($key) {
if($key === 'includeMode') return $this->includeMode;
if($key === 'checkAccess') return $this->checkAccess;
return parent::__get($key);
public function __get($name) {
if($name === 'includeMode') return $this->includeMode;
if($name === 'checkAccess') return $this->checkAccess;
return parent::__get($name);
}
/**
@@ -455,7 +455,6 @@ class PageFinder extends Wire {
*/
protected function initSelectors(Selectors $selectors, array $options) {
$maxStatus = null;
$limit = 0; // for getTotal auto detection
$start = 0;
$limitSelector = null;
@@ -485,7 +484,6 @@ class PageFinder extends Wire {
);
foreach($selectors as $key => $selector) {
/** @var Selector $selector */
$fieldName = $selector->field;
$operator = $selector->operator;
@@ -690,6 +688,7 @@ class PageFinder extends Wire {
if(($operator === '!=' && !$selector->not) || ($selector->not && $operator === '=')) {
// NOT MATCH condition: replace with bitwise AND NOT selector
/** @var Selector $s */
$s = $this->wire(new SelectorBitwiseAnd('status', $qty > 1 ? $values : reset($values)));
$s->not = true;
$not = true;
@@ -790,6 +789,7 @@ class PageFinder extends Wire {
if(is_string($selectors) || is_array($selectors)) {
list($s, $selectors) = array($selectors, $this->wire(new Selectors()));
/** @var Selectors $selectors */
$selectors->init($s);
} else if(!$selectors instanceof Selectors) {
throw new PageFinderException("find() requires Selectors object, string or array");
@@ -1162,7 +1162,6 @@ class PageFinder extends Wire {
$o['getTotal'] = true;
$o['loadPages'] = false;
$o['returnVerbose'] = false;
/** @var Selectors $sel */
$sel = clone $selectors;
foreach($sel as $s) {
if($s->field == 'limit' || $s->field == 'start') $sel->remove($s);
@@ -1242,7 +1241,7 @@ class PageFinder extends Wire {
$fieldtypeLang = $languages ? $fieldtypes->get("{$fieldName}Language") : null;
foreach($this->fields as $f) {
/** @var Field $f */
if($findExtends) {
// allow any Fieldtype that is an instance of given one, or extends it
if(!wireInstanceOf($f->type, $fieldtype)
@@ -1431,6 +1430,7 @@ class PageFinder extends Wire {
} else {
$s = '';
}
/** @var Selectors $_selectors */
$_selectors = $this->wire(new Selectors($s));
$_selector = $_selectors->create(implode('.', $parts), $selector->operator, $selector->values);
$_selectors->add($_selector);
@@ -1679,7 +1679,7 @@ class PageFinder extends Wire {
$this->pageArrayData['joinFields'] = array(); // identify whether each field supported autojoin
foreach($opts['joinFields'] as $joinField) {
$joinField = $this->fields->get($joinField);
if(!$joinField || !$joinField instanceof Field) continue;
if(!$joinField instanceof Field) continue;
$joinTable = $database->escapeTable($joinField->getTable());
if(!$joinTable || !$joinField->type) continue;
if($joinField->type->getLoadQueryAutojoin($joinField, $query)) {
@@ -1829,7 +1829,7 @@ class PageFinder extends Wire {
// without this section the query would still work, but a blank value must actually be present in the field
$isEmptyValue = $fieldtype->isEmptyValue($field, $value);
$useEmpty = $isEmptyValue || $operator[0] === '<' || ((int) $value < 0 && $operator[0] === '>');
if($useEmpty && $fieldtype && strpos($subfield, 'data') === 0) { // && !$fieldtype instanceof FieldtypeMulti) {
if($useEmpty && strpos($subfield, 'data') === 0) { // && !$fieldtype instanceof FieldtypeMulti) {
if($isEmptyValue) $numEmptyValues++;
if(in_array($operator, array('=', '!=', '<', '<=', '>', '>='))) {
// we only accommodate this optimization for single-value selectors...
@@ -1990,7 +1990,7 @@ class PageFinder extends Wire {
// what groups should be OR'd together
$sqls = array();
foreach($this->extraOrSelectors as $groupName => $selectorGroup) {
foreach($this->extraOrSelectors as /* $groupName => */ $selectorGroup) {
$n = 0;
$sql = "\tpages.id IN (\n";
foreach($selectorGroup as $selectors) {
@@ -2243,6 +2243,7 @@ class PageFinder extends Wire {
if($user->isGuest()) {
// guest
foreach($this->templates as $template) {
/** @var Template $template */
if($template->guestSearchable || !$template->useRoles) {
$yesTemplates[$template->id] = $template;
continue;
@@ -2262,6 +2263,7 @@ class PageFinder extends Wire {
}
foreach($this->templates as $template) {
/** @var Template $template */
if($template->guestSearchable || !$template->useRoles) {
$yesTemplates[$template->id] = $template;
continue;
@@ -2276,6 +2278,7 @@ class PageFinder extends Wire {
// determine which templates the user is not allowed to access
foreach($this->templates as $template) {
/** @var Template $template */
if(!isset($yesTemplates[$template->id])) $noTemplates[$template->id] = $template;
}
@@ -2338,7 +2341,6 @@ class PageFinder extends Wire {
* @return string
*/
protected function ___getQueryAllowedTemplatesWhere(DatabaseQuerySelect $query, $where) {
if($query) {}
return $where;
}
@@ -2460,7 +2462,7 @@ class PageFinder extends Wire {
$value = "COUNT($tableAlias.data)";
}
} else if(is_object($blankValue) && ($blankValue instanceof PageArray || $blankValue instanceof Page)) {
} else if($blankValue instanceof PageArray || $blankValue instanceof Page) {
// If it's a FieldtypePage, then data isn't worth sorting on because it just contains an ID to the page
// so we also join the page and sort on it's name instead of the field's "data" field.
if(!$subValue) $subValue = 'name';
@@ -2498,7 +2500,7 @@ class PageFinder extends Wire {
} else {
// regular field, just sort by data column
$value = "$tableAlias." . ($subValue ? $subValue : "data"); ;
$value = "$tableAlias." . ($subValue ? $subValue : "data");
}
}
@@ -2560,6 +2562,7 @@ class PageFinder extends Wire {
if($this->supportsLanguagePageNames()) {
$langNames = array();
foreach($this->languages as $language) {
/** @var Language $language */
if(!$language->isDefault()) $langNames[$language->id] = "name" . (int) $language->id;
}
if(!count($langNames)) $langNames = null;
@@ -2622,7 +2625,7 @@ class PageFinder extends Wire {
//$query->join("pages AS $alias ON ($lastAlias.parent_id=$alias.id AND $alias.name='$part')");
$bindKey = $query->bindValueGetKey($part);
$sql = "pages AS $alias ON ($lastAlias.parent_id=$alias.id AND ($alias.name=$bindKey";
if($langNames) foreach($langNames as $id => $name) {
if($langNames) foreach($langNames as /* $id => */ $name) {
// $status = "status" . (int) $id;
// $sql .= " OR ($alias.$name='$part' AND $alias.$status>0) ";
$bindKey = $query->bindValueGetKey($part);
@@ -2848,16 +2851,16 @@ class PageFinder extends Wire {
}
} else if(!$database->isOperator($operator)) {
$this->syntaxError("Operator '$operator' is not supported for '$field'.");
$s = '';
$this->syntaxError("Operator '$operator' is not supported for '$field'.");
} else if($this->isModifierField($field)) {
$this->syntaxError("Modifier '$field' is not allowed here");
$s = '';
$this->syntaxError("Modifier '$field' is not allowed here");
} else if(!$this->pagesColumnExists($field)) {
$this->syntaxError("Field '$field' is not a known field, column or selector modifier");
$s = '';
$this->syntaxError("Field '$field' is not a known field, column or selector modifier");
} else {
$not = false;
@@ -3181,7 +3184,7 @@ class PageFinder extends Wire {
/**
* Returns the templates ID, if it was part of the selector
*
* @return int
* @return int|null
*
*/
public function getTemplatesID() {
@@ -3223,12 +3226,11 @@ class PageFinder extends Wire {
protected function isPageField($fieldName, $literal = false) {
$is = false;
$field = null;
if($fieldName === 'parent' || $fieldName === 'children') {
return $fieldName; // early exit
} else if(is_object($fieldName) && $fieldName instanceof Field) {
} else if($fieldName instanceof Field) {
$field = $fieldName;
} else if(is_string($fieldName) && strpos($fieldName, '.')) {
@@ -3261,7 +3263,7 @@ class PageFinder extends Wire {
$is = $literal ? false : true;
} else {
$test = $field->type->getBlankValue(new NullPage(), $field);
if(is_object($test) && ($test instanceof Page || $test instanceof PageArray)) {
if($test instanceof Page || $test instanceof PageArray) {
$is = $literal ? false : true;
}
}
@@ -3333,6 +3335,7 @@ class PageFinder extends Wire {
self::$pagesColumns[$instanceID] = array();
if($this->supportsLanguagePageNames()) {
foreach($this->languages as $language) {
/** @var Language $language */
if($language->isDefault()) continue;
self::$pagesColumns[$instanceID]["name$language->id"] = true;
self::$pagesColumns[$instanceID]["status$language->id"] = true;
@@ -3420,16 +3423,11 @@ class PageFinder extends Wire {
);
$data = array_merge($_data, $data);
/** @var array $fields */
$fields = $data['fields'];
/** @var string $subfields */
$subfields = $data['subfields'];
/** @var Selector $selector */
$selector = $data['selector'];
/** @var DatabaseQuerySelect $query */
$query = $data['query'];
/** @var Wire|null $value */
$value = $this->wire($fieldName);
$fields = $data['fields']; /** @var array $fields */
$subfields = $data['subfields']; /** @var string $subfields */
$selector = $data['selector']; /** @var Selector $selector */
$query = $data['query']; /** @var DatabaseQuerySelect $query */
$value = $this->wire($fieldName); /** @var Wire|null $value */
if($value) {
// found an API var
@@ -3450,7 +3448,10 @@ class PageFinder extends Wire {
if($this->getQueryOwnerField($fieldName, $data)) return true;
return false;
/** @var bool|int|Field $value Hooks can modify return value to be Field */
$value = false;
return $value;
}
/**
@@ -3466,16 +3467,11 @@ class PageFinder extends Wire {
if(substr($fieldName, -7) !== '__owner') return false;
/** @var array $fields */
$fields = $data['fields'];
/** @var string $subfields */
$subfields = $data['subfields'];
/** @var Selectors $selectors */
$selectors = $data['selectors'];
/** @var Selector $selector */
$selector = $data['selector'];
/** @var DatabaseQuerySelect $query */
$query = $data['query'];
$fields = $data['fields']; /** @var array $fields */
$subfields = $data['subfields']; /** @var string $subfields */
$selectors = $data['selectors']; /** @var Selectors $selectors */
$selector = $data['selector']; /** @var Selector $selector */
$query = $data['query']; /** @var DatabaseQuerySelect $query */
if(empty($subfields)) $this->syntaxError("When using owner a subfield is required");
@@ -3493,6 +3489,7 @@ class PageFinder extends Wire {
// determine which templates are using $ownerFieldName
$templateIDs = array();
foreach($this->templates as $template) {
/** @var Template $template */
if($template->hasField($ownerFieldName)) {
$templateIDs[$template->id] = $template->id;
}

View File

@@ -187,6 +187,7 @@ abstract class Selector extends WireData {
*
*/
public function __construct($field, $value) {
parent::__construct();
$this->set('not', false);
$this->set('group', null); // group name identified with 'group_name@' before a field name
$this->set('quote', ''); // if $value in quotes, this contains either: ', ", [, {, or (, indicating quote type (set by Selectors class)
@@ -268,7 +269,7 @@ abstract class Selector extends WireData {
if($forceString === 1) {
$value = reset($value);
} else {
$value = $this->wire('sanitizer')->selectorValue($value);
$value = $this->wire()->sanitizer->selectorValue($value);
}
}
return $value;
@@ -373,7 +374,7 @@ abstract class Selector extends WireData {
public function getValue($type = '') {
$value = $this->value;
if($type == 'string') {
if(is_array($value)) $value = $this->wire('sanitizer')->selectorValue($value);
if(is_array($value)) $value = $this->wire()->sanitizer->selectorValue($value);
} else if($type == 'array') {
if(!is_array($value)) $value = array($value);
} else if($this->quote == '[') {
@@ -533,10 +534,15 @@ abstract class Selector extends WireData {
// prepare the value we are comparing
if(is_object($value)) {
if($this->wire('languages') && $value instanceof LanguagesValueInterface) $value = (string) $value;
else if($value instanceof WireData) $value = $value->get($field);
else if($value instanceof WireArray && is_string($field) && !strpos($field, '.')) $value = (string) $value; // 123|456|789, etc.
else if($value instanceof Wire) $value = $value->$field;
if($this->wire()->languages && $value instanceof LanguagesValueInterface) {
$value = (string) $value;
} else if($value instanceof WireData) {
$value = $value->get($field);
} else if($value instanceof WireArray && is_string($field) && !strpos($field, '.')) {
$value = (string) $value; // 123|456|789, etc.
} else if($value instanceof Wire) {
$value = $value->$field;
}
$value = (string) $value;
}
@@ -928,7 +934,7 @@ class SelectorContainsWords extends Selector {
protected function match($value1, $value2) {
$hasAll = true;
$words = $this->wire()->sanitizer->wordsArray($value2);
foreach($words as $key => $word) if(!preg_match('/\b' . preg_quote($word) . '\b/i', $value1)) {
foreach($words as $word) if(!preg_match('/\b' . preg_quote($word) . '\b/i', $value1)) {
$hasAll = false;
break;
}
@@ -955,7 +961,7 @@ class SelectorContainsWordsPartial extends Selector {
protected function match($value1, $value2) {
$hasAll = true;
$words = $this->wire()->sanitizer->wordsArray($value2);
foreach($words as $key => $word) {
foreach($words as $word) {
if(!preg_match('/\b' . preg_quote($word) . '/i', $value1)) {
$hasAll = false;
break;
@@ -984,7 +990,7 @@ class SelectorContainsWordsLike extends Selector {
protected function match($value1, $value2) {
$hasAll = true;
$words = $this->wire()->sanitizer->wordsArray($value2);
foreach($words as $key => $word) {
foreach($words as $word) {
if(stripos($value1, $word) === false) {
$hasAll = false;
break;
@@ -1016,7 +1022,7 @@ class SelectorContainsWordsLive extends Selector {
$hasAll = true;
$words = $this->wire()->sanitizer->wordsArray($value2);
$lastWord = array_pop($words);
foreach($words as $key => $word) {
foreach($words as $word) {
if(!preg_match('/\b' . preg_quote($word) . '\b/i', $value1)) {
// full-word match
$hasAll = false;
@@ -1065,7 +1071,7 @@ class SelectorContainsAnyWords extends Selector {
protected function match($value1, $value2) {
$hasAny = false;
$words = $this->wire()->sanitizer->wordsArray($value2);
foreach($words as $key => $word) {
foreach($words as $word) {
if(stripos($value1, $word) !== false) {
if(preg_match('!\b' . preg_quote($word) . '\b!i', $value1)) {
$hasAny = true;
@@ -1096,7 +1102,7 @@ class SelectorContainsAnyWordsPartial extends Selector {
protected function match($value1, $value2) {
$hasAny = false;
$words = $this->wire()->sanitizer->wordsArray($value2);
foreach($words as $key => $word) {
foreach($words as $word) {
if(stripos($value1, $word) !== false) {
if(preg_match('!\b' . preg_quote($word) . '!i', $value1)) {
$hasAny = true;
@@ -1127,7 +1133,7 @@ class SelectorContainsAnyWordsLike extends Selector {
protected function match($value1, $value2) {
$hasAny = false;
$words = $this->wire()->sanitizer->wordsArray($value2);
foreach($words as $key => $word) {
foreach($words as $word) {
if(stripos($value1, $word) !== false) {
$hasAny = true;
break;
@@ -1285,7 +1291,7 @@ class SelectorContainsAdvanced extends SelectorContains {
$words = $this->wire()->sanitizer->wordsArray($value, array(
'keepChars' => array('+', '-', '*')
));
foreach($words as $key => $word) {
foreach($words as $word) {
$type = substr($word, 0, 1);
$partial = substr($word, -1) === '*';
if($type !== '+' && $type !== '-') $type = '';

View File

@@ -125,7 +125,7 @@ class Selectors extends WireArray {
public function init($selector) {
if(is_array($selector)) {
$this->setSelectorArray($selector);
} else if(is_object($selector) && $selector instanceof Selector) {
} else if($selector instanceof Selector) {
$this->add($selector);
} else {
$this->setSelectorString($selector);
@@ -174,13 +174,15 @@ class Selectors extends WireArray {
*
*/
public function isValidItem($item) {
return is_object($item) && $item instanceof Selector;
return $item instanceof Selector;
}
/**
* Per WireArray interface, return a blank Selector
*
* #pw-internal
*
* @return Selector
*
*/
public function makeBlankItem() {
@@ -213,12 +215,13 @@ class Selectors extends WireArray {
} else {
if(is_array($value)) $value = implode('|', $value);
if(is_array($field)) $field = implode('|', $field);
$debug = $this->wire('config')->debug ? "field='$field', value='$value', selector: '$this->selectorStr'" : "";
$debug = $this->wire()->config->debug ? "field='$field', value='$value', selector: '$this->selectorStr'" : "";
if(empty($operator)) $operator = '[empty]';
throw new WireException("Unknown Selector operator: '$operator' -- was your selector value properly escaped? $debug");
}
}
$class = wireClassName(self::$selectorTypes[$operator], true);
/** @var Selector $selector */
$selector = $this->wire(new $class($field, $value));
if($not) $selector->not = true;
return $selector;
@@ -279,7 +282,7 @@ class Selectors extends WireArray {
protected function extractGroup(&$str) {
$group = null;
$pos = strpos($str, '@');
if($pos === false) return $group;
if($pos === false) return null;
if($pos === 0) {
$group = '';
$str = substr($str, 1);
@@ -421,7 +424,7 @@ class Selectors extends WireArray {
* @param string $str String to extract value from, $str will be modified if extraction successful
* @param string $openingQuote Opening quote character, if string has them, blank string otherwise
* @param string $closingQuote Closing quote character, if string has them, blank string otherwise
* @return mixed Returns found value if successful, boolean false if not
* @return false|string|string[] Returns found value if successful, boolean false if not
*
*/
protected function extractValueQuick(&$str, $openingQuote, $closingQuote) {
@@ -507,6 +510,8 @@ class Selectors extends WireArray {
*
*/
protected function extractValue(&$str, &$quote) {
$sanitizer = $this->wire()->sanitizer;
$str = trim($str);
if(!strlen($str)) return '';
@@ -577,7 +582,7 @@ class Selectors extends WireArray {
$op = self::$operatorChars[$str[$on]] . $op;
}
// if something valid does prefix the operator, cancel the operator
if(!$on || !$this->wire('sanitizer')->fieldName($str[$on])) $op = '';
if(!$on || !$sanitizer->fieldName($str[$on])) $op = '';
// if an operator came before the quote, and it closes somewhere,
// we will allow the embedded double quote
if(strlen($op) && self::isOperator($op) && strrpos($str, '"') > $n) {
@@ -713,7 +718,7 @@ class Selectors extends WireArray {
$subname = '';
}
if(!in_array($name, $this->allowedParseVars)) return false;
if(strlen($subname) && $this->wire('sanitizer')->fieldName($subname) !== $subname) return false;
if(strlen($subname) && $this->wire()->sanitizer->fieldName($subname) !== $subname) return false;
return true;
}
@@ -924,7 +929,7 @@ class Selectors extends WireArray {
*/
protected function makeSelectorArrayItem($key, $data, $dataType = '') {
$sanitizer = $this->wire('sanitizer');
$sanitizer = $this->wire()->sanitizer;
$sanitize = 'selectorValue';
$fields = array();
$values = array();
@@ -982,9 +987,9 @@ class Selectors extends WireArray {
$data['value'] = array();
}
if(isset($data['whitelist']) && $data['whitelist'] !== null) {
if(isset($data['whitelist'])) {
$whitelist = $data['whitelist'];
if(is_object($whitelist) && $whitelist instanceof WireArray) $whitelist = explode('|', (string) $whitelist);
if($whitelist instanceof WireArray) $whitelist = explode('|', (string) $whitelist);
if(!is_array($whitelist)) $whitelist = array($whitelist);
}
@@ -1071,7 +1076,7 @@ class Selectors extends WireArray {
// convert WireArray types to an array of $_values
if(count($_values) === 1) {
$value = reset($_values);
if(is_object($value) && $value instanceof WireArray) {
if($value instanceof WireArray) {
$_values = explode('|', (string) $value);
}
}

View File

@@ -1811,13 +1811,19 @@ class WireHttp extends Wire {
}
/**
* Set http response code and text
* Set http response code and text (internal use)
*
* This is public only in case a hook wants to modify an http response value,
* for instance translating one http code to another for some purpose. If used
* by a hook, it should be called after the WireHttp::send() method.
*
* #pw-internal
*
* @param int $code
* @param string $text
*
*/
protected function setHttpCode($code, $text = '') {
public function setHttpCode($code, $text = '') {
if(empty($text)) $text = isset($this->httpCodes[$code]) ? $this->httpCodes[$code] : '?';
$this->httpCode = $code;
$this->httpCodeText = $text;

View File

@@ -6,7 +6,7 @@
* For more details about how Process modules work, please see:
* /wire/core/Process.php
*
* ProcessWire 3.x, Copyright 2018 by Ryan Cramer
* ProcessWire 3.x, Copyright 2022 by Ryan Cramer
* https://processwire.com
*
* Optional GET variables:
@@ -36,8 +36,8 @@ class ProcessPageClone extends Process {
'title' => 'Clone',
'parent' => 'page',
'status' => Page::statusHidden,
)
);
)
);
}
/**
@@ -70,7 +70,7 @@ class ProcessPageClone extends Process {
*
*/
public function ready() {
$this->adminUrl = $this->wire('config')->urls->admin;
$this->adminUrl = $this->wire()->config->urls->admin;
$this->pageListActionLabel = $this->_('Copy'); // Action label that appears in PageList
$this->addHookAfter("ProcessPageListActions::getExtraActions", $this, 'hookPageListActions');
$this->addHookAfter("ProcessPageListActions::processAction", $this, 'hookProcessExtraAction');
@@ -119,14 +119,15 @@ class ProcessPageClone extends Process {
*
*/
public function ___execute() {
$input = $this->wire()->input;
$this->headline($this->_('Copy Page')); // Headline
$error = $this->_("Unable to load page");
$id = (int) $this->wire('input')->get('id');
if(!$id) throw new WireException($error);
$this->page = $this->wire('pages')->get($id);
$id = (int) $input->get('id');
if($id < 2) throw new WireException($error);
$this->page = $this->wire()->pages->get($id);
if($this->page->id < 2) throw new WireException($error);
if(!$this->hasPermission($this->page)) throw new WirePermissionException($error);
if($this->wire('input')->post('submit_clone')) $this->process();
if($input->post('submit_clone')) $this->process();
return $this->render();
}
@@ -165,8 +166,7 @@ class ProcessPageClone extends Process {
*/
protected function getSuggestedNameAndTitle(Page $page) {
/** @var Pages $pages */
$pages = $this->wire('pages');
$pages = $this->wire()->pages;
$name = $pages->names()->uniquePageName(array(
'name' => $page->name,
@@ -194,6 +194,7 @@ class ProcessPageClone extends Process {
$languages = $this->wire()->languages;
if($languages && $languages->hasPageNames()) {
foreach($languages as $language) {
/** @var Language $language */
if($language->isDefault()) continue;
$value = $page->get("name$language");
if(!strlen($value)) continue;
@@ -212,11 +213,11 @@ class ProcessPageClone extends Process {
*/
protected function ___buildForm() {
/** @var Page $page */
$page = $this->page;
$modules = $this->wire()->modules;
/** @var InputfieldForm $form */
$form = $this->modules->get("InputfieldForm");
$form = $modules->get("InputfieldForm");
$form->attr('action', './?id=' . $page->id);
$form->attr('method', 'post');
$form->description = sprintf($this->_("This will make a copy of %s"), $page->path); // Form description/headline
@@ -225,23 +226,22 @@ class ProcessPageClone extends Process {
$suggested = $this->getSuggestedNameAndTitle($page);
/** @var InputfieldPageTitle $titleField */
$titleField = $this->modules->get("InputfieldPageTitle");
$titleField = $modules->get("InputfieldPageTitle");
$titleField->attr('name', 'clone_page_title');
$titleField->attr('value', $suggested['title']);
$titleField->label = $this->_("Title of new page"); // Label for title field
/** @var InputfieldPageName $nameField */
$nameField = $this->modules->get("InputfieldPageName");
$nameField = $modules->get("InputfieldPageName");
$nameField->attr('name', 'clone_page_name');
$nameField->attr('value', $suggested['name']);
$nameField->parentPage = $page->parent;
/** @var Languages $languages */
$languages = $this->wire('languages');
$languages = $this->wire()->languages;
$useLanguages = $languages;
if($useLanguages) {
/** @var Field $title */
$title = $this->wire('fields')->get('title');
$title = $this->wire()->fields->get('title');
$titleUseLanguages = $title
&& $page->template->fieldgroup->hasField($title)
&& $title->getInputfield($page)->getSetting('useLanguages');
@@ -249,6 +249,7 @@ class ProcessPageClone extends Process {
if($titleUseLanguages) $titleField->useLanguages = true;
if($nameUseLanguages) $nameField->useLanguages = true;
foreach($languages as $language) {
/** @var Language $language */
if($language->isDefault()) continue;
if($titleUseLanguages) {
/** @var LanguagesPageFieldValue $pageTitle */
@@ -274,7 +275,7 @@ class ProcessPageClone extends Process {
$form->add($nameField);
/** @var InputfieldCheckbox $field */
$field = $this->modules->get("InputfieldCheckbox");
$field = $modules->get("InputfieldCheckbox");
$field->attr('name', 'clone_page_unpublished');
$field->attr('value', 1);
$field->label = $this->_("Make the new page unpublished?");
@@ -284,7 +285,7 @@ class ProcessPageClone extends Process {
if($page->numChildren && $this->user->hasPermission('page-clone-tree', $page)) {
/** @var InputfieldCheckbox $field */
$field = $this->modules->get("InputfieldCheckbox");
$field = $modules->get("InputfieldCheckbox");
$field->attr('name', 'clone_page_tree');
$field->attr('value', 1);
$field->label = $this->_("Copy children too?");
@@ -295,14 +296,14 @@ class ProcessPageClone extends Process {
}
/** @var InputfieldSubmit $field */
$field = $this->modules->get("InputfieldSubmit");
$field = $modules->get("InputfieldSubmit");
$field->attr('name', 'submit_clone');
$form->add($field);
$redirectPageID = (int) $this->wire('input')->get('redirect_page');
$redirectPageID = (int) $this->wire()->input->get('redirect_page');
if($redirectPageID) {
/** @var InputfieldHidden $field */
$field = $this->wire('modules')->get('InputfieldHidden');
$field = $modules->get('InputfieldHidden');
$field->attr('name', 'redirect_page');
$field->attr('value', $redirectPageID);
$form->add($field);
@@ -330,6 +331,7 @@ class ProcessPageClone extends Process {
$page = clone $this->page;
$input = $this->input;
$languages = $this->wire()->languages;
$originalName = $page->name;
$this->session->CSRF->validate();
@@ -344,8 +346,9 @@ class ProcessPageClone extends Process {
$page->addStatus(Page::statusUnpublished);
}
if($nameField->useLanguages) {
foreach($this->wire('languages') as $language) {
if($nameField->useLanguages && $languages) {
foreach($languages as $language) {
/** @var Language $language */
$valueAttr = $language->isDefault() ? "value" : "value$language->id";
$nameAttr = $language->isDefault() ? "name" : "name$language->id";
$value = $nameField->get($valueAttr);
@@ -363,8 +366,9 @@ class ProcessPageClone extends Process {
throw new WireException(sprintf($this->_("Unable to clone page %s"), $page->path));
}
if($titleField->getSetting('useLanguages') && is_object($clone->title)) {
foreach($this->wire('languages') as $language) {
if($titleField->getSetting('useLanguages') && is_object($clone->title) && $languages) {
foreach($languages as $language) {
/** @var Language $language */
$valueAttr = $language->isDefault() ? "value" : "value$language->id";
$value = $titleField->get($valueAttr);
/** @var LanguagesPageFieldValue $cloneTitle */
@@ -375,7 +379,7 @@ class ProcessPageClone extends Process {
$clone->title = $titleField->value;
}
$this->wire('pages')->save($clone, array('adjustName' => true));
$this->wire()->pages->save($clone, array('adjustName' => true));
$this->message(sprintf($this->_('Cloned page "%1$s" to "%2$s"'), $originalName, $clone->name));
@@ -383,7 +387,7 @@ class ProcessPageClone extends Process {
$redirectID = (int) $input->post('redirect_page');
if($redirectID) {
$redirectPage = $this->wire('pages')->get($redirectID);
$redirectPage = $this->wire()->pages->get($redirectID);
if($redirectPage->viewable()) {
$redirectURL = $redirectPage->url();
}
@@ -427,7 +431,7 @@ class ProcessPageClone extends Process {
);
if($clone->id) {
$result['message'] = $this->wire('sanitizer')->unentities(
$result['message'] = $this->wire()->sanitizer->unentities(
sprintf($this->_('Cloned to: %s'), $clone->path)
);
} else {
@@ -468,8 +472,10 @@ class ProcessPageClone extends Process {
)
);
if($this->wire('languages')) {
foreach($this->wire('languages') as $language) {
$languages = $this->wire()->languages;
if($languages) {
foreach($languages as $language) {
/** @var Language $language */
if($language->isDefault()) continue;
if(!empty($suggested["name$language"])) {
$cloneOptions['set']["name$language"] = $suggested["name$language"];
@@ -480,7 +486,7 @@ class ProcessPageClone extends Process {
$cloneTree = false; // clone tree mode not allowed in ajax mode
try {
$clone = $this->wire('pages')->clone($page, $page->parent, $cloneTree, $cloneOptions);
$clone = $this->wire()->pages->clone($page, $page->parent, $cloneTree, $cloneOptions);
} catch(\Exception $e) {
$error = $e->getMessage();
$clone = new NullPage();

View File

@@ -22,10 +22,11 @@ class PageBookmarks extends Wire {
protected $labels = array();
/**
* @param Process $process
* @param Process|ProcessPageEdit $process
*
*/
public function __construct(Process $process) {
parent::__construct();
$this->process = $process;
$this->labels = array(
'bookmarks' => $this->_('Bookmarks'),
@@ -42,19 +43,23 @@ class PageBookmarks extends Wire {
*
*/
public function initNavJSON(array $options = array()) {
$pages = $this->wire()->pages;
$user = $this->wire()->user;
$modules = $this->wire()->modules;
$bookmarkFields = array();
$bookmarksArray = array();
$rolesArray = array();
$data = $this->wire('modules')->getModuleConfigData($this->process);
$data = $modules->getModuleConfigData($this->process);
$iconKey = isset($options['iconKey']) ? $options['iconKey'] : '_icon';
$classKey = isset($options['classKey']) ? $options['classKey'] : '_class';
$options['classKey'] = $classKey;
$options['iconKey'] = $iconKey;
if(!isset($options['defaultIcon'])) $options['defaultIcon'] = 'arrow-circle-right';
foreach($this->wire('user')->roles as $role) {
if($role->name == 'guest') continue;
foreach($this->wire()->user->roles as $role) {
if($role->name === 'guest') continue;
$value = isset($data["bookmarks"]["_$role->id"]) ? $data["bookmarks"]["_$role->id"] : array();
if(empty($value)) continue;
$bookmarkFields[$role->name] = $value;
@@ -64,7 +69,7 @@ class PageBookmarks extends Wire {
$n = 0;
foreach($bookmarkFields as $name => $bookmarkIDs) {
$bookmarks = count($bookmarkIDs) ? $this->wire('pages')->getById($bookmarkIDs) : array();
$bookmarks = count($bookmarkIDs) ? $pages->getById($bookmarkIDs) : array();
$role = isset($rolesArray[$name]) ? $rolesArray[$name] : null;
foreach($bookmarks as $page) {
if($this->process == 'ProcessPageEdit' && !$page->editable()) continue;
@@ -81,14 +86,14 @@ class PageBookmarks extends Wire {
}
if(empty($options['add'])) {
if($this->wire('user')->isSuperuser()) {
if($user->isSuperuser()) {
$options['add'] = 'bookmarks/?role=0';
$options['addLabel'] = $this->labels['bookmarks'];
$options['addIcon'] = 'bookmark-o';
} else {
$options['add'] = null;
}
} else if($this->wire('user')->isSuperuser()) {
} else if($user->isSuperuser()) {
$add = $this->wire(new WireData());
$add->set('_icon', 'bookmark-o');
$add->set('title', $this->labels['bookmarks']);
@@ -108,7 +113,7 @@ class PageBookmarks extends Wire {
if(!isset($options['iconKey'])) $options['iconKey'] = '_icon';
if(empty($options['edit'])) {
$options['edit'] = $this->wire('config')->urls->admin . 'page/edit/?id={id}';
$options['edit'] = $this->wire()->config->urls->admin . 'page/edit/?id={id}';
}
return $options;
@@ -121,10 +126,11 @@ class PageBookmarks extends Wire {
*
*/
public function listBookmarks() {
$config = $this->wire('config');
$config->styles->add($config->urls->ProcessPageEdit . 'PageBookmarks.css');
$superuser = $this->wire('user')->isSuperuser();
$sanitizer = $this->wire()->sanitizer;
$config = $this->wire()->config;
$config->styles->add($config->urls('ProcessPageEdit') . 'PageBookmarks.css');
$superuser = $this->wire()->user->isSuperuser();
$out = '';
$options = $this->initNavJSON();
$noneHeadline = $this->_('There are currently no bookmarks defined');
@@ -136,7 +142,7 @@ class PageBookmarks extends Wire {
$icon = $item->_icon ? "<i class='fa fa-fw fa-$item->_icon'></i> " : "";
$out .=
"<li class='$item->_class'>" .
"<a href='$url'>$icon" . $this->wire('sanitizer')->entities1($item->get('title|name')) . "</a>" .
"<a href='$url'>$icon" . $sanitizer->entities1($item->get('title|name')) . "</a>" .
"</li>";
}
@@ -148,7 +154,8 @@ class PageBookmarks extends Wire {
}
if($superuser) {
$button = $this->wire('modules')->get('InputfieldButton');
/** @var InputfieldButton $button */
$button = $this->wire()->modules->get('InputfieldButton');
$button->href = "./?role=0";
$button->value = $this->labels['edit-bookmarks'];
$button->icon = 'edit';
@@ -168,17 +175,20 @@ class PageBookmarks extends Wire {
*/
public function editBookmarksForm() {
$modules = $this->wire('modules');
$roleID = $this->wire('input')->get('role');
if(is_null($roleID) && $this->wire('input')->get('id') == 'bookmarks') $roleID = 0;
$modules = $this->wire()->modules;
$input = $this->wire()->input;
$roles = $this->wire()->roles;
$roleID = $input->get('role');
if(is_null($roleID) && $input->get('id') === 'bookmarks') $roleID = 0;
$roleID = (int) $roleID;
if(!$this->wire('user')->isSuperuser()) throw new WirePermissionException("Superuser required to define bookmarks");
if(!$this->wire()->user->isSuperuser()) throw new WirePermissionException("Superuser required to define bookmarks");
$moduleInfo = $modules->getModuleInfo($this->process);
$this->process->breadcrumb('../', $this->_($moduleInfo['title']));
$this->process->breadcrumb('./', $this->labels['bookmarks']);
$role = $roleID ? $this->wire('roles')->get($roleID) : $this->wire('pages')->newNullPage();
$role = $roleID ? $roles->get($roleID) : $this->wire()->pages->newNullPage();
if($roleID && !$role->id) throw new WireException("Unknown role");
$allLabel = $this->_('everyone'); // All roles
$data = $modules->getModuleConfigData($this->process);
@@ -188,6 +198,7 @@ class PageBookmarks extends Wire {
$this->process->headline($headline);
$this->process->browserTitle($title);
/** @var InputfieldForm $form */
$form = $modules->get('InputfieldForm');
$form->action = "./?role=$role->id";
$form->addClass('InputfieldFormConfirm');
@@ -195,6 +206,7 @@ class PageBookmarks extends Wire {
$form->appendMarkup = "<p style='clear:both' class='detail'><br /><i class='fa fa-info-circle ui-priority-secondary'></i> " .
$this->_('Note that only superusers are able to see this editor.') . "</p>";
/** @var InputfieldPageListSelectMultiple $field */
$field = $modules->get('InputfieldPageListSelectMultiple');
$field->attr('name', 'bookmarks');
$field->label = $title;
@@ -205,8 +217,8 @@ class PageBookmarks extends Wire {
$class = $role->id ? '' : 'ui-state-disabled';
$out = "<ul class='PageListActions actions'><li><a class='$class' href='./?role=0'>$allLabel</a></li>";
foreach($this->wire('roles') as $r) {
if($r->name == 'guest') continue;
foreach($roles as $r) {
if($r->name === 'guest') continue;
$class = $r->id == $role->id ? 'ui-state-disabled' : '';
$o = "<a class='$class' href='./?role=$r->id'>$r->name</a>";
$out .= "<li>$o</li>";
@@ -221,20 +233,21 @@ class PageBookmarks extends Wire {
$field->attr('value', $value);
$form->add($field);
/** @var InputfieldSubmit $submit */
$submit = $modules->get('InputfieldSubmit');
$submit->attr('name', 'submit_save_bookmarks');
$submit->showInHeader();
$form->add($submit);
if($this->wire('input')->post('submit_save_bookmarks')) {
if($form->isSubmitted('submit_save_bookmarks')) {
// save bookmarks
$form->processInput($this->wire('input')->post);
$form->process();
$bookmarks = $field->attr('value');
// clear out bookmarks for roles that no longer exist
foreach($data["bookmarks"] as $_roleID => $_bookmarks) {
foreach($data['bookmarks'] as $_roleID => $_bookmarks) {
if($_roleID == "_0") continue;
$r = $this->wire('roles')->get((int) ltrim($_roleID, '_'));
if(!$r->id) unset($data["bookmarks"][$_roleID]);
$r = $roles->get((int) ltrim($_roleID, '_'));
if(!$r->id) unset($data['bookmarks'][$_roleID]);
}
// update bookmarks for role
$data["bookmarks"]["_$role->id"] = $bookmarks;
@@ -242,7 +255,7 @@ class PageBookmarks extends Wire {
$modules->saveModuleConfigData($this->process, $data);
$this->message($this->_('Saved bookmarks'));
$this->wire('session')->redirect("./?role=$role->id");
$this->wire()->session->location("./?role=$role->id");
}
return $form;
@@ -256,9 +269,10 @@ class PageBookmarks extends Wire {
*
*/
public function editBookmarks() {
$roleID = $this->wire('input')->get('role');
$input = $this->wire()->input;
$roleID = $input->get('role');
if(is_null($roleID)) {
if($this->wire('input')->get('id') == 'bookmarks') {
if($input->get('id') === 'bookmarks') {
// ok
} else {
return $this->listBookmarks();
@@ -293,7 +307,8 @@ class PageBookmarks extends Wire {
*
*/
public function addConfigInputfields(InputfieldWrapper $inputfields) {
$field = $this->wire('modules')->get('InputfieldCheckbox');
/** @var InputfieldCheckbox $field */
$field = $this->wire()->modules->get('InputfieldCheckbox');
$field->attr('name', 'useBookmarks');
$field->label = $this->_('Allow use of bookmarks?');
$field->description = $this->_('Bookmarks enable you to create shortcuts to pages from this module, configurable by user role. Useful for large applications.');

View File

@@ -176,7 +176,7 @@ class ProcessPageLister extends Process implements ConfigurableModule {
*/
public function __construct() {
parent::__construct();
if(!$this->wire('page')) return;
if(!$this->wire()->page) return;
$this->defaultColumns = array('title', 'template', 'parent', 'modified', 'modified_users_id');
@@ -343,7 +343,7 @@ class ProcessPageLister extends Process implements ConfigurableModule {
*
*/
public function init() {
if(!$this->wire('page')) return;
if(!$this->wire()->page) return;
$input = $this->wire()->input;
$config = $this->wire()->config;
@@ -614,12 +614,16 @@ class ProcessPageLister extends Process implements ConfigurableModule {
$filters = $input->post('filters');
if($filters !== null && $filters !== 'ignore') {
$is = $this->getInputfieldSelector();
$is->processInput($input->post);
$selector = $this->sessionGet("selector");
if($selector != $is->value) {
$this->sessionSet("selector", $is->value);
$this->sessionSet("pageNum", 1);
$input->setPageNum(1);
try {
$is->processInput($input->post);
$selector = $this->sessionGet("selector");
if($selector != $is->value) {
$this->sessionSet("selector", $is->value);
$this->sessionSet("pageNum", 1);
$input->setPageNum(1);
}
} catch(\Exception $e) {
$this->error($e->getMessage());
}
}
@@ -1209,6 +1213,7 @@ class ProcessPageLister extends Process implements ConfigurableModule {
$template = explode('|', $matches[1]);
$templatesAPI = $this->wire()->templates;
foreach($template as $t) {
/** @var Template $t */
$t = $templatesAPI->get($t);
if($t instanceof Template) $templates[] = $t;
}
@@ -1429,7 +1434,7 @@ class ProcessPageLister extends Process implements ConfigurableModule {
$noEntities = false;
$language = $languages ? $this->identifyLanguage($name, true) : null;
if($language && $language->id == $this->wire('user')->language->id) $language = null;
if($language && $language->id == $this->wire()->user->language->id) $language = null;
if($language) $languages->setLanguage($language);
if(strpos($name, '.')) list($name, $subname) = explode('.', $name, 2);
@@ -1538,7 +1543,9 @@ class ProcessPageLister extends Process implements ConfigurableModule {
$vfull = $v;
if($this->imageWidth || $this->imageHeight) $v = $v->size($this->imageWidth, $this->imageHeight);
$alt = $vfull->basename . ($vfull->description ? ' - ' . $sanitizer->entities1($vfull->description) : "");
$v = "<a href='$vfull->URL' title='$alt' class='lister-lightbox'><img alt='$alt' src='$v->URL' style='margin: 4px 4px 4px 0' /></a>";
$v =
"<a href='$vfull->URL' title='$alt' class='lister-lightbox'>" .
"<img alt='$alt' src='$v->URL' style='margin: 4px 4px 4px 0' /></a>";
$isImage = true;
} else if($v instanceof Pagefile) {
@@ -1990,10 +1997,15 @@ class ProcessPageLister extends Process implements ConfigurableModule {
foreach($this->wire()->notices as $notice) {
/** @var Notice $notice */
$noticeText = $notice->text;
if(!($notice->flags & Notice::allowMarkup)) {
$noticeText = $sanitizer->entities1($notice->text);
}
if($notice instanceof NoticeError) {
$out .= "<p class='ui-state-error-text'>$notice->text</p>";
$out .= "<p class='ui-state-error-text'>$noticeText</p>";
} else {
if(self::debug) $out .= "<p class='ui-state-highlight'>$notice->text</p>";
// report non-error notifications only when debug constant active
if(self::debug) $out .= "<p class='ui-state-highlight'>$noticeText</p>";
}
}
@@ -2045,9 +2057,9 @@ class ProcessPageLister extends Process implements ConfigurableModule {
$this->resetLister();
$this->message($this->_('All settings have been reset.'));
if(strpos($this->wire()->input->urlSegmentStr, '/reset/')) {
$this->wire()->session->redirect('../');
$this->wire()->session->location('../');
} else {
$this->wire()->session->redirect('./');
$this->wire()->session->location('./');
}
}
@@ -2094,7 +2106,7 @@ class ProcessPageLister extends Process implements ConfigurableModule {
*
*/
public function ___execute() {
if(!$this->wire('page')) return '';
if(!$this->wire()->page) return '';
$modules = $this->wire()->modules;
$input = $this->wire()->input;
@@ -2106,7 +2118,7 @@ class ProcessPageLister extends Process implements ConfigurableModule {
if($this->renderResults) {
$out = $this->renderResults();
if(self::debug) {
foreach($this->wire('database')->queryLog() as $n => $item) {
foreach($this->wire()->database->queryLog() as $n => $item) {
$out .= "<p>$n. $item</p>";
}
}
@@ -2182,7 +2194,7 @@ class ProcessPageLister extends Process implements ConfigurableModule {
} else if($this->template && ($parent = $this->template->getParentPage(true))) {
if($parent->id) {
$action = "?parent_id={$parent->id}"; // defined parent
$action = "?parent_id=$parent->id"; // defined parent
} else {
$action = "?template_id={$this->template->id}"; // multiple possible parents
}

View File

@@ -9,7 +9,7 @@
* For more details about how Process modules work, please see:
* /wire/core/Process.php
*
* ProcessWire 3.x, Copyright 2016 by Ryan Cramer
* ProcessWire 3.x, Copyright 2022 by Ryan Cramer
* https://processwire.com
*
*
@@ -30,7 +30,7 @@ class ProcessPageSort extends Process {
'version' => 100,
'permanent' => true,
'permission' => 'page-edit',
);
);
}
/**
@@ -49,23 +49,32 @@ class ProcessPageSort extends Process {
*
*/
public function ___execute() {
$input = $this->wire()->input;
$pages = $this->wire()->pages;
$sort = $input->post('sort');
if($this->config->demo) throw new WireException($this->_("Your change was not saved because this site is in demo mode"));
if(!isset($_POST['sort'])) throw new WireException($this->_("This Process is only accessible via POST"));
if($this->config->demo) {
throw new WireException($this->_("Your change was not saved because this site is in demo mode"));
}
if($sort === null) {
throw new WireException($this->_("This Process is only accessible via POST"));
}
$this->session->CSRF->validate(); // throws exception if invalid
$input = $this->wire('input');
$this->user = $this->wire('user');
$this->user = $this->wire()->user;
$this->ids = array();
$ids = explode(',', $input->post->sort);
$ids = explode(',', $sort);
foreach($ids as $sort => $id) $this->ids[(int) $sort] = (int) $id;
if(!count($this->ids)) return;
unset($ids);
$this->parent_id = (int) $input->post->parent_id;
$this->move_id = (int) $input->post->id;
$this->parent_id = (int) $input->post('parent_id');
$this->move_id = (int) $input->post('id');
$parentPage = $this->wire('pages')->get($this->parent_id);
$movePage = $this->wire('pages')->get($this->move_id);
$parentPage = $pages->get($this->parent_id);
$movePage = $pages->get($this->move_id);
if($movePage->id < 2 || !$parentPage->id) return;
$this->movePage($movePage, $parentPage);
@@ -131,7 +140,7 @@ class ProcessPageSort extends Process {
}
$changes = 0;
$database = $this->wire('database');
$database = $this->wire()->database;
// locate the 'sort' value of the current first sorted item, to use as our starting point
// (in case sorting in a pagination other than 1)
@@ -166,10 +175,9 @@ class ProcessPageSort extends Process {
$page->save();
$parent->trackChange('children');
$parent->save();
$this->wire('pages')->sorted($page, false, $changes);
$this->wire()->pages->sorted($page, false, $changes);
if($changes) $this->message("Updated sort for $changes pages", Notice::log);
}
}

View File

@@ -8,7 +8,7 @@
* For more details about how Process modules work, please see:
* /wire/core/Process.php
*
* ProcessWire 3.x, Copyright 2018 by Ryan Cramer
* ProcessWire 3.x, Copyright 2022 by Ryan Cramer
* https://processwire.com
*
*/
@@ -25,7 +25,7 @@ class ProcessPageTrash extends Process {
'summary' => __('Handles emptying of Page trash', __FILE__), // getModuleInfo summary
'version' => 103,
'permanent' => true,
);
);
}
/**
@@ -34,8 +34,8 @@ class ProcessPageTrash extends Process {
*/
public function ___execute() {
if(!$this->wire('user')->isSuperuser()) throw new WirePermissionException();
$input = $this->wire('input');
if(!$this->wire()->user->isSuperuser()) throw new WirePermissionException();
$input = $this->wire()->input;
$timeLimit = abs((int) $input->post('time_limit'));
if($timeLimit > 0) $this->session->setFor($this, 'timeLimit', $timeLimit);
@@ -53,7 +53,7 @@ class ProcessPageTrash extends Process {
'timeLimit' => $timeLimit > 0 ? $timeLimit : self::defaultTimeLimit,
);
$result = $this->wire('pages')->emptyTrash($options);
$result = $this->wire()->pages->emptyTrash($options);
if(self::debug) $this->warning($result);
$error = false;
@@ -73,13 +73,15 @@ class ProcessPageTrash extends Process {
$error = true;
}
$session = $this->wire()->session;
if($error) {
$this->session->warning($message);
$this->session->redirect('./');
$session->warning($message);
$session->redirect('./');
} else {
// redirect to admin root after emptying trash
$this->session->message($message);
$this->session->redirect($this->wire('config')->urls('admin'));
$session->message($message);
$session->redirect($this->wire()->config->urls('admin'));
}
return ''; // unreachable due to redirects above
@@ -90,19 +92,19 @@ class ProcessPageTrash extends Process {
*
*/
protected function render() {
// $trashPages = $this->pages->get($this->config->trashPageID)->children("limit=2, status<" . Page::statusMax);
$modules = $this->wire()->modules;
$trashTotal = $this->pages->trasher()->getTrashTotal();
/** @var InputfieldForm $form */
$form = $this->modules->get("InputfieldForm");
$form = $modules->get("InputfieldForm");
$form->attr('action', './');
$form->attr('method', 'post');
if(!$trashTotal) return "<h2>" . $this->_("The trash is empty") . "</h2>";
/** @var InputfieldCheckbox $field */
$field = $this->modules->get("InputfieldCheckbox");
$field = $modules->get("InputfieldCheckbox");
$field->attr('name', 'confirm_empty');
$field->attr('value', 1);
$field->label2 = $this->_('Empty the trash (confirm)');
@@ -116,7 +118,7 @@ class ProcessPageTrash extends Process {
$form->add($field);
/** @var InputfieldMarkup $field */
$field = $this->modules->get("InputfieldMarkup");
$field = $modules->get("InputfieldMarkup");
$field->label = $this->_('Pages in the trash');
$field->icon = 'list';
$field->collapsed = Inputfield::collapsedYes;
@@ -128,7 +130,7 @@ class ProcessPageTrash extends Process {
$form->add($field);
/** @var InputfieldInteger $f */
$f = $this->modules->get('InputfieldInteger');
$f = $modules->get('InputfieldInteger');
$f->attr('name', 'time_limit');
$f->label = $this->_('Time limit (in seconds)');
$timeLimit = (int) $this->session->getFor($this, 'timeLimit');
@@ -138,18 +140,18 @@ class ProcessPageTrash extends Process {
$form->add($f);
/** @var InputfieldSubmit $field */
$field = $this->modules->get("InputfieldSubmit");
$field = $modules->get("InputfieldSubmit");
$field->attr('name', 'submit_empty');
$field->showInHeader(true);
$field->icon = 'trash';
$form->add($field);
/** @var InputfieldSubmit $field */
$field = $this->modules->get("InputfieldButton");
/** @var InputfieldButton $field */
$field = $modules->get("InputfieldButton");
$field->attr('name', 'submit_cancel');
$field->setSecondary(true);
$field->value = $this->_('Cancel');
$field->href = $this->wire('config')->urls->admin;
$field->href = $this->wire()->config->urls->admin;
$field->icon = 'times';
$form->add($field);