mirror of
https://github.com/processwire/processwire.git
synced 2025-08-12 01:34:31 +02:00
Improvements to InputfieldPage
This commit is contained in:
@@ -242,7 +242,7 @@ class InputfieldPage extends Inputfield implements ConfigurableModule {
|
|||||||
|
|
||||||
if($findPagesSelector) {
|
if($findPagesSelector) {
|
||||||
$selector = $findPagesSelector;
|
$selector = $findPagesSelector;
|
||||||
if($editPage && $editPage->id) $selector = self::getFindPagesSelector($editPage, $selector);
|
if($editPage && $editPage->id) $selector = self::populateFindPagesSelector($editPage, $selector);
|
||||||
if(!$page->matches($selector)) {
|
if(!$page->matches($selector)) {
|
||||||
// failed in-memory check, attempt $page->count() check...
|
// failed in-memory check, attempt $page->count() check...
|
||||||
$selector .= ", id=$page->id";
|
$selector .= ", id=$page->id";
|
||||||
@@ -366,7 +366,7 @@ class InputfieldPage extends Inputfield implements ConfigurableModule {
|
|||||||
} else if($findPagesSelector) {
|
} else if($findPagesSelector) {
|
||||||
// a find() selector
|
// a find() selector
|
||||||
$instance = $this->processInputMode ? $this : null;
|
$instance = $this->processInputMode ? $this : null;
|
||||||
$selector = self::getFindPagesSelector($page, $findPagesSelector, $instance);
|
$selector = self::populateFindPagesSelector($page, $findPagesSelector, $instance);
|
||||||
$children = $pages->find($selector);
|
$children = $pages->find($selector);
|
||||||
|
|
||||||
} else if($this->findPagesCode) {
|
} else if($this->findPagesCode) {
|
||||||
@@ -420,7 +420,7 @@ class InputfieldPage extends Inputfield implements ConfigurableModule {
|
|||||||
* @return string
|
* @return string
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
protected static function getFindPagesSelector(Page $page, $selector, $inputfield = null) {
|
protected static function populateFindPagesSelector(Page $page, $selector, $inputfield = null) {
|
||||||
|
|
||||||
// if an $inputfield is passed in, then we want to retrieve dependent values directly
|
// if an $inputfield is passed in, then we want to retrieve dependent values directly
|
||||||
// from the form, rather than from the $page
|
// from the form, rather than from the $page
|
||||||
@@ -459,6 +459,85 @@ class InputfieldPage extends Inputfield implements ConfigurableModule {
|
|||||||
return $selector;
|
return $selector;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a page finding selector from all configured properties
|
||||||
|
*
|
||||||
|
* @param array $options
|
||||||
|
* @return string|array
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function createFindPagesSelector(array $options = array()) {
|
||||||
|
|
||||||
|
$defaults = array(
|
||||||
|
'page' => null, // optional $page for context (for selectors where it might matter)
|
||||||
|
'findRaw' => false, // include properties only recognized by $pages->findRaw()?
|
||||||
|
'getArray' => false, // return array rather than string?
|
||||||
|
);
|
||||||
|
|
||||||
|
$options = array_merge($defaults, $options);
|
||||||
|
|
||||||
|
$id = $this->getSetting('parent_id');
|
||||||
|
if($id) {
|
||||||
|
if(is_array($id)) $id = implode('|', $id);
|
||||||
|
$selector['parent_id'] = $id;
|
||||||
|
}
|
||||||
|
|
||||||
|
$ids = $this->getTemplateIDs();
|
||||||
|
if(count($ids)) {
|
||||||
|
$selector['templates_id'] = implode('|', $ids);
|
||||||
|
} else {
|
||||||
|
$id = $this->getSetting('template_id');
|
||||||
|
if(is_array($id)) $id = implode('|', $id);
|
||||||
|
if($id) $selector['templates_id'] = $id;
|
||||||
|
}
|
||||||
|
|
||||||
|
$findPagesCode = $this->getSetting('findPagesCode');
|
||||||
|
if(strlen($findPagesCode) && $options['page'] && empty($selector['parent_id'])) {
|
||||||
|
// via teppokoivula: use findPagesCode to return single parent page
|
||||||
|
$parent = $this->findPagesCode($options['page']);
|
||||||
|
if($parent instanceof Page) $selector['parent_id'] = $parent->id;
|
||||||
|
}
|
||||||
|
|
||||||
|
$s = $this->getSetting('findPagesSelector');
|
||||||
|
if(!strlen($s)) $s = $this->getSetting('findPagesSelect');
|
||||||
|
if(strlen($s)) {
|
||||||
|
if($options['page']) $s = self::populateFindPagesSelector($options['page'], $s, $this);
|
||||||
|
// @todo getstring vs getarray
|
||||||
|
$selector['selector'] = $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($this->getSetting('allowUnpub')) {
|
||||||
|
$selector['include'] = 'unpublished';
|
||||||
|
} else {
|
||||||
|
$selector['include'] = 'hidden';
|
||||||
|
}
|
||||||
|
|
||||||
|
if($options['findRaw']) {
|
||||||
|
$labelFieldName = $this->getSetting('labelFieldName');
|
||||||
|
$labelFieldFormat = $this->getSetting('labelFieldFormat');
|
||||||
|
if(strlen($labelFieldFormat) && $labelFieldName === '.') {
|
||||||
|
// @todo find raw does not support labelFieldFormat
|
||||||
|
$selector['field'] = "$labelFieldFormat";
|
||||||
|
} else if($labelFieldName) {
|
||||||
|
$selector['field'] = $labelFieldName == '.' ? "name" : "$labelFieldName";
|
||||||
|
} else {
|
||||||
|
$selector['field'] = 'title';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($options['getArray']) return $selector;
|
||||||
|
|
||||||
|
$a = array();
|
||||||
|
$operatorChars = Selectors::getOperatorChars();
|
||||||
|
foreach($selector as $key => $value) {
|
||||||
|
$v = substr($value, 0, 1);
|
||||||
|
$operator = strlen($v) && isset($operatorChars[$v]) ? '' : '='; // omit operator if already in $value
|
||||||
|
$a[] = "$key$operator$value";
|
||||||
|
}
|
||||||
|
|
||||||
|
return implode(', ', $a);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a label for the given page
|
* Get a label for the given page
|
||||||
*
|
*
|
||||||
@@ -521,8 +600,11 @@ class InputfieldPage extends Inputfield implements ConfigurableModule {
|
|||||||
|
|
||||||
$inputfield->attr('name', $this->attr('name'));
|
$inputfield->attr('name', $this->attr('name'));
|
||||||
$inputfield->attr('id', $this->attr('id'));
|
$inputfield->attr('id', $this->attr('id'));
|
||||||
$inputfield->label = $this->getSetting('label');
|
$keys = array('label', 'description', 'notes', 'detail');
|
||||||
$inputfield->description = $this->getSetting('description');
|
foreach($keys as $key) {
|
||||||
|
$value = $this->getSetting($key);
|
||||||
|
if(strlen($value)) $inputfield->set($key, $value);
|
||||||
|
}
|
||||||
|
|
||||||
$collapsed = $this->getSetting('collapsed');
|
$collapsed = $this->getSetting('collapsed');
|
||||||
if($collapsed == Inputfield::collapsedYesAjax ||
|
if($collapsed == Inputfield::collapsedYesAjax ||
|
||||||
@@ -539,8 +621,31 @@ class InputfieldPage extends Inputfield implements ConfigurableModule {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$value = $this->attr('value');
|
||||||
|
$valueArray = array();
|
||||||
|
if($value instanceof Page) {
|
||||||
|
$valueArray[$value->id] = $value;
|
||||||
|
} else if($value instanceof PageArray) {
|
||||||
|
foreach($value as $v) {
|
||||||
|
$valueArray[$v->id] = $v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($inputfield instanceof InputfieldSupportsPageSelector && $inputfield->setPageSelector('') !== false) {
|
||||||
|
// Inputfield has ability to find pages with a selector
|
||||||
|
|
||||||
|
$selector = $this->createFindPagesSelector(array('page' => $page));
|
||||||
|
$inputfield->setPageSelector($selector);
|
||||||
|
|
||||||
|
if($inputfield instanceof InputfieldHasSelectableOptions) {
|
||||||
|
foreach($valueArray as $p) {
|
||||||
|
$inputfield->addOption($p->id, $this->getPageLabel($p));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(method_exists($inputfield, 'addOption') || $inputfield instanceof InputfieldHasSelectableOptions) {
|
} else if(method_exists($inputfield, 'addOption') || $inputfield instanceof InputfieldHasSelectableOptions) {
|
||||||
|
// All selectable options types
|
||||||
|
|
||||||
$children = $this->getSelectablePages($page);
|
$children = $this->getSelectablePages($page);
|
||||||
|
|
||||||
@@ -552,6 +657,7 @@ class InputfieldPage extends Inputfield implements ConfigurableModule {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
// InputfieldPageAutocomplete or similar (older style InputfieldSupportsPageSelector)
|
||||||
|
|
||||||
$parent_id = $this->getSetting('parent_id');
|
$parent_id = $this->getSetting('parent_id');
|
||||||
$template_id = $this->getSetting('template_id');
|
$template_id = $this->getSetting('template_id');
|
||||||
@@ -575,7 +681,7 @@ class InputfieldPage extends Inputfield implements ConfigurableModule {
|
|||||||
if(!empty($template_ids)) $inputfield->set('template_ids', $template_ids);
|
if(!empty($template_ids)) $inputfield->set('template_ids', $template_ids);
|
||||||
|
|
||||||
if($findPagesSelector) {
|
if($findPagesSelector) {
|
||||||
$inputfield->set('findPagesSelector', self::getFindPagesSelector($page, $findPagesSelector));
|
$inputfield->set('findPagesSelector', self::populateFindPagesSelector($page, $findPagesSelector));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(strlen($labelFieldFormat) && $labelFieldName === '.') {
|
if(strlen($labelFieldFormat) && $labelFieldName === '.') {
|
||||||
@@ -587,19 +693,13 @@ class InputfieldPage extends Inputfield implements ConfigurableModule {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$value = $this->attr('value');
|
|
||||||
if($value instanceof Page) {
|
if($value instanceof Page) {
|
||||||
$inputfield->attr('value', $value->id); // derefAsPage
|
$inputfield->attr('value', $value->id); // derefAsPage
|
||||||
} else if($value instanceof PageArray) {
|
} else {
|
||||||
$valueArray = array();
|
$inputfield->attr('value', array_keys($valueArray));
|
||||||
foreach($value as $v) {
|
|
||||||
$valueArray[] = $v->id;
|
|
||||||
// $inputfield->attr('value', $v->id); // derefAsPageArray
|
|
||||||
}
|
|
||||||
$inputfield->attr('value', $valueArray);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// pass long any relevant configuration items
|
// pass along any relevant configuration items
|
||||||
foreach($this->data as $key => $value) {
|
foreach($this->data as $key => $value) {
|
||||||
if(in_array($key, array('value', 'collapsed')) || array_key_exists($key, self::$defaultConfig)) continue;
|
if(in_array($key, array('value', 'collapsed')) || array_key_exists($key, self::$defaultConfig)) continue;
|
||||||
if($key == 'required' && empty($this->data['defaultValue'])) continue; // for default value support with InputfieldSelect
|
if($key == 'required' && empty($this->data['defaultValue'])) continue; // for default value support with InputfieldSelect
|
||||||
@@ -1280,6 +1380,10 @@ class InputfieldPage extends Inputfield implements ConfigurableModule {
|
|||||||
$info = $this->modules->getModuleInfo($inputfield);
|
$info = $this->modules->getModuleInfo($inputfield);
|
||||||
$inputfield->hasFieldtype = $this->hasFieldtype ? $this->hasFieldtype : true;
|
$inputfield->hasFieldtype = $this->hasFieldtype ? $this->hasFieldtype : true;
|
||||||
$inputfield->hasInputfield = $this;
|
$inputfield->hasInputfield = $this;
|
||||||
|
if($inputfield instanceof InputfieldSupportsPageSelector) {
|
||||||
|
$exampleSelector = $this->createFindPagesSelector();
|
||||||
|
$inputfield->setPageSelector($exampleSelector);
|
||||||
|
}
|
||||||
/** @var InputfieldFieldset $fieldset */
|
/** @var InputfieldFieldset $fieldset */
|
||||||
$fieldset = $this->modules->get('InputfieldFieldset');
|
$fieldset = $this->modules->get('InputfieldFieldset');
|
||||||
$n = 0;
|
$n = 0;
|
||||||
|
Reference in New Issue
Block a user