container.php
来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· PHP 代码 · 共 764 行 · 第 1/2 页
PHP
764 行
if ($item) {
return $item->getContent();
}
return false;
} // end func getDirectiveContent
/**
* Returns how many children this container has
*
* @param string $type type of children counted
* @param string $name name of children counted
* @return int number of children found
*/
function countChildren($type = null, $name = null)
{
if (is_null($type) && is_null($name)) {
return count($this->children);
}
$count = 0;
if (isset($name) && isset($type)) {
for ($i = 0, $children = count($this->children); $i < $children; $i++) {
if ($this->children[$i]->name == $name &&
$this->children[$i]->type == $type) {
$count++;
}
}
return $count;
}
if (isset($type)) {
for ($i = 0, $children = count($this->children); $i < $children; $i++) {
if ($this->children[$i]->type == $type) {
$count++;
}
}
return $count;
}
if (isset($name)) {
// Some directives can have the same name
for ($i = 0, $children = count($this->children); $i < $children; $i++) {
if ($this->children[$i]->name == $name) {
$count++;
}
}
return $count;
}
} // end func &countChildren
/**
* Deletes an item (section, directive, comment...) from the current object
* TODO: recursive remove in sub-sections
* @return mixed true if object was removed, false if not, or PEAR_Error if root
*/
function removeItem()
{
if ($this->isRoot()) {
return PEAR::raiseError('Cannot remove root item in Config_Container::removeItem.', null, PEAR_ERROR_RETURN);
}
$index = $this->getItemIndex();
if (!is_null($index)) {
array_splice($this->parent->children, $index, 1);
return true;
}
return false;
} // end func removeItem
/**
* Returns the item index in its parent children array.
* @return int returns int or null if root object
*/
function getItemIndex()
{
if (is_object($this->parent)) {
// This will be optimized with Zend Engine 2
$pchildren =& $this->parent->children;
for ($i = 0, $count = count($pchildren); $i < $count; $i++) {
if ($pchildren[$i]->_id == $this->_id) {
return $i;
}
}
}
return;
} // end func getItemIndex
/**
* Returns the item rank in its parent children array
* according to other items with same type and name.
* @return int returns int or null if root object
*/
function getItemPosition()
{
if (is_object($this->parent)) {
$pchildren =& $this->parent->children;
for ($i = 0, $count = count($pchildren); $i < $count; $i++) {
if ($pchildren[$i]->name == $this->name &&
$pchildren[$i]->type == $this->type) {
$obj[] =& $pchildren[$i];
}
}
for ($i = 0, $count = count($obj); $i < $count; $i++) {
if ($obj[$i]->_id == $this->_id) {
return $i;
}
}
}
return;
} // end func getItemPosition
/**
* Returns the item parent object.
* @return object returns reference to parent object or null if root object
*/
function &getParent()
{
return $this->parent;
} // end func &getParent
/**
* Returns the item parent object.
* @return mixed returns reference to child object or false if child does not exist
*/
function &getChild($index = 0)
{
if (!empty($this->children[$index])) {
return $this->children[$index];
} else {
return false;
}
} // end func &getChild
/**
* Set this item's name.
* @return void
*/
function setName($name)
{
$this->name = $name;
} // end func setName
/**
* Get this item's name.
* @return string item's name
*/
function getName()
{
return $this->name;
} // end func getName
/**
* Set this item's content.
* @return void
*/
function setContent($content)
{
$this->content = $content;
} // end func setContent
/**
* Get this item's content.
* @return string item's content
*/
function getContent()
{
return $this->content;
} // end func getContent
/**
* Set this item's type.
* @return void
*/
function setType($type)
{
$this->type = $type;
} // end func setType
/**
* Get this item's type.
* @return string item's type
*/
function getType()
{
return $this->type;
} // end func getType
/**
* Set this item's attributes.
* @param array $attributes Array of attributes
* @return void
*/
function setAttributes($attributes)
{
$this->attributes = $attributes;
} // end func setAttributes
/**
* Set this item's attributes.
* @param array $attributes Array of attributes
* @return void
*/
function updateAttributes($attributes)
{
if (is_array($attributes)) {
foreach ($attributes as $key => $value) {
$this->attributes[$key] = $value;
}
}
} // end func updateAttributes
/**
* Get this item's attributes.
* @return array item's attributes
*/
function getAttributes()
{
return $this->attributes;
} // end func getAttributes
/**
* Get one attribute value of this item
* @param string $attribute Attribute key
* @return mixed item's attribute value
*/
function getAttribute($attribute)
{
if (isset($this->attributes[$attribute])) {
return $this->attributes[$attribute];
}
return null;
} // end func getAttribute
/**
* Set a children directive content.
* This is an helper method calling getItem and addItem or setContent for you.
* If the directive does not exist, it will be created at the bottom.
*
* @param string $name Name of the directive to look for
* @param mixed $content New content
* @param int $index Index of the directive to set,
* in case there are more than one directive
* with the same name
* @return object newly set directive
*/
function &setDirective($name, $content, $index = -1)
{
$item =& $this->getItem('directive', $name, null, null, $index);
if ($item === false || PEAR::isError($item)) {
// Directive does not exist, will create one
unset($item);
return $this->createDirective($name, $content, null);
} else {
// Change existing directive value
$item->setContent($content);
return $item;
}
} // end func setDirective
/**
* Is this item root, in a config container object
* @return bool true if item is root
*/
function isRoot()
{
if (is_null($this->parent)) {
return true;
}
return false;
} // end func isRoot
/**
* Call the toString methods in the container plugin
* @param string $configType Type of configuration used to generate the string
* @param array $options Specify special options used by the parser
* @return mixed true on success or PEAR_ERROR
*/
function toString($configType, $options = array())
{
$configType = strtolower($configType);
if (!isset($GLOBALS['CONFIG_TYPES'][$configType])) {
return PEAR::raiseError("Configuration type '$configType' is not registered in Config_Container::toString.", null, PEAR_ERROR_RETURN);
}
$includeFile = $GLOBALS['CONFIG_TYPES'][$configType][0];
$className = $GLOBALS['CONFIG_TYPES'][$configType][1];
include_once($includeFile);
$renderer = new $className($options);
return $renderer->toString($this);
} // end func toString
/**
* Returns a key/value pair array of the container and its children.
*
* Format : section[directive][index] = value
* If the container has attributes, it will use '@' and '#'
* index is here because multiple directives can have the same name.
*
* @param bool $useAttr Whether to return the attributes too
* @return array
*/
function toArray($useAttr = true)
{
$array[$this->name] = array();
switch ($this->type) {
case 'directive':
if ($useAttr && count($this->attributes) > 0) {
$array[$this->name]['#'] = $this->content;
$array[$this->name]['@'] = $this->attributes;
} else {
$array[$this->name] = $this->content;
}
break;
case 'section':
if ($useAttr && count($this->attributes) > 0) {
$array[$this->name]['@'] = $this->attributes;
}
if ($count = count($this->children)) {
for ($i = 0; $i < $count; $i++) {
$newArr = $this->children[$i]->toArray($useAttr);
if (!is_null($newArr)) {
foreach ($newArr as $key => $value) {
if (isset($array[$this->name][$key])) {
// duplicate name/type
if (!is_array($array[$this->name][$key]) ||
!isset($array[$this->name][$key][0])) {
$old = $array[$this->name][$key];
unset($array[$this->name][$key]);
$array[$this->name][$key][0] = $old;
}
$array[$this->name][$key][] = $value;
} else {
$array[$this->name][$key] = $value;
}
}
}
}
}
break;
default:
return null;
}
return $array;
} // end func toArray
/**
* Writes the configuration to a file
*
* @param mixed $datasrc Info on datasource such as path to the configuraton file or dsn...
* @param string $configType Type of configuration
* @param array $options Options for writer
* @access public
* @return mixed true on success or PEAR_ERROR
*/
function writeDatasrc($datasrc, $configType, $options = array())
{
$configType = strtolower($configType);
if (!isset($GLOBALS['CONFIG_TYPES'][$configType])) {
return PEAR::raiseError("Configuration type '$configType' is not registered in Config_Container::writeDatasrc.", null, PEAR_ERROR_RETURN);
}
$includeFile = $GLOBALS['CONFIG_TYPES'][$configType][0];
$className = $GLOBALS['CONFIG_TYPES'][$configType][1];
include_once($includeFile);
$writeMethodName = (version_compare(phpversion(), '5', '<')) ? 'writedatasrc' : 'writeDatasrc';
if (in_array($writeMethodName, get_class_methods($className))) {
$writer = new $className($options);
return $writer->writeDatasrc($datasrc, $this);
}
// Default behaviour
$fp = @fopen($datasrc, 'w');
if ($fp) {
$string = $this->toString($configType, $options);
$len = strlen($string);
@flock($fp, LOCK_EX);
@fwrite($fp, $string, $len);
@flock($fp, LOCK_UN);
@fclose($fp);
return true;
} else {
return PEAR::raiseError('Cannot open datasource for writing.', 1, PEAR_ERROR_RETURN);
}
} // end func writeDatasrc
} // end class Config_Container
?>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?