我有一个带有Xml_model的CodeIgniter应用程序:
(add-to-list 'load-path "/home/user/emacsfiles")
我希望能够使用不同的XML加载此模型。这些XML由站点上的下拉菜单选择。 XML正在定义站点上的导航,因此在从下拉列表中选择XML后,页面将重新加载,并使用新选择的XML进行重新加载。但我不知道如何做到这一点,因为我无法在CodeIgniter中加载带有参数的模型。
下拉列表:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Xml_model extends CI_Model {
private $xml;
public function __construct() {
parent::__construct();
$this->xml = simplexml_load_file(base_url('xml/example.xml'));
}
public function getAllTags() {
return array_unique($this->xml->xpath('descendant::Keyword'));
}
public function getLinks($nodeName) {
return $this->xml->xpath('/Documents/TabPage/Node[@name="'.$nodeName.'"]/Links/Link');
}
public function getTabs() {
return $this->xml->xpath('/Documents/TabPage/@name');
}
public function getNodes($tabName) {
return $this->xml->xpath('/Documents/TabPage[@name="'.$tabName.'"]/Node/@name');
}
public function getPath($nodeName) {
return $this->xml->xpath('/Documents/TabPage/Node[@name="'.$nodeName.'"]/Path');
}
public function search($tagName) {
return $this->xml->xpath('//*[Keyword="'.$tagName.'"]/parent::Node/@name');
}
}
?>
答案 0 :(得分:0)
我可以想到两种方法来解决这个问题。
一:添加一个init
函数,该函数将加载要加载的文件的名称。加载模型后立即调用它。
class Xml_model extends CI_Model
{
private $xml;
public function init($file) {
$this->xml = simplexml_load_file(base_url($file));
}
另一种选择是创建一个新的库类而不是扩展CI_Model
。根据你所展示的内容,没有明显要求将其作为&#34;模型&#34;类。
库可以在加载时将参数传递给构造函数。我看到的唯一(非常小的)棘手的部分是对base_url()
的调用将要求您获得对CI&#34;超级对象的引用&#34;。或者,您可以解析并传递构造函数的完整路径,从而无需在自定义类中调用base_url()
。