Php 获取全部”;“第页”;在YII?
我正在尝试创建自己的xml站点地图。除了我认为最简单的部分,其他的都完成了。如何获得网站上所有页面的列表?我在/site文件夹中有一堆视图,还有一些其他视图。有没有办法显式地请求他们的URL,或者通过控制器Php 获取全部”;“第页”;在YII?,php,yii,sitemap,Php,Yii,Sitemap,我正在尝试创建自己的xml站点地图。除了我认为最简单的部分,其他的都完成了。如何获得网站上所有页面的列表?我在/site文件夹中有一堆视图,还有一些其他视图。有没有办法显式地请求他们的URL,或者通过控制器 我不想使用扩展名您需要知道要在sitemap.xml中包含哪些内容,我并不认为您真的想在sitemap.xml中包含所有页面,或者您真的想包含类似site.com/article/edit/1的内容吗 也就是说,您可能只需要控制器中的视图操作的结果。事实是,你需要知道你想要什么 不要考虑控制
我不想使用扩展名您需要知道要在sitemap.xml中包含哪些内容,我并不认为您真的想在sitemap.xml中包含所有页面,或者您真的想包含类似site.com/article/edit/1的内容吗 也就是说,您可能只需要控制器中的
视图
操作的结果。事实是,你需要知道你想要什么
不要考虑控制器/操作/视图,而是考虑系统中需要索引的资源,无论是文章还是页面,它们都在数据库中或以某种方式存储,因此您可以列出它们,并且它们有一个URI来标识它们,获取URI需要调用几个函数。您可以使用反射来迭代所有控制器的所有方法:
Yii::import('application.controllers.*');
$urls = array();
$directory = Yii::getPathOfAlias('application.controllers');
$iterator = new DirectoryIterator($directory);
foreach ($iterator as $fileinfo)
{
if ($fileinfo->isFile() and $fileinfo->getExtension() == 'php')
{
$className = substr($fileinfo->getFilename(), 0, -4); //strip extension
$class = new ReflectionClass($className);
foreach ($class->getMethods(ReflectionMethod::IS_PUBLIC) as $method)
{
$methodName = $method->getName();
//only take methods that begin with 'action', but skip actions() method
if (strpos($methodName, 'action') === 0 and $methodName != 'actions')
{
$controller = lcfirst(substr($className, 0, strrpos($className, 'Controller')));
$action = lcfirst(substr($methodName, 6));
$urls[] = Yii::app()->createAbsoluteUrl("$controller/$action");
}
}
}
}
有两种可能性- 案例1: 您正在运行一个静态网站,然后您可以在1个文件夹中找到所有HTML-受保护/视图/站点/页面 案例2: 网站是动态的。生成和重新生成站点地图等任务可分为后台任务 运行后台TAK可以通过使用-WGET、GET或lynx命令模拟linux中的浏览器来实现 或者,您可以将CronController创建为CConsoleCommand。如何在YII中使用命令如下面的链接所示- Sitemap是一种列出站点URL的XML。但它做的不止这些。 它可以帮助你可视化一个网站的结构,你可以
- 类别
- 子类别
对于基于模块名称的ex,您可以首先对它们进行分组,模块内的控制器可以形成子组。第一种方法可以是迭代视图文件,但您必须考虑到,在某些情况下,视图不是页面目的地,而是通过使用方法包含在其他页面中的页面部分。通过探索CController的类引用,我找到了这个方法 因此,我没有找到任何方法来迭代CController的所有操作,但我使用php在我的一个项目中迭代SiteController的所有方法,并使用前缀“action”将它们过滤为这些方法,这是我的操作前缀,下面是示例
class SiteController extends Controller{
public function actionTest(){
echo '<h1>Test Page!</h1></p>';
$methods = get_class_methods(get_class($this));
// The action prefix is strlen('action') = 6
$actionPrefix = 'action';
$reversedActionPrefix = strrev($actionPrefix);
$actionPrefixLength = strlen($actionPrefix);
foreach ($methods as $index=>$methodName){
//Always unset actions(), since it is not a controller action itself and it has the prefix 'action'
if ($methodName==='actions') {
unset($methods[$index]);
continue;
}
$reversedMethod = strrev($methodName);
/* if the last 6 characters of the reversed substring === 'noitca',
* it means that $method Name corresponds to a Controller Action,
* otherwise it is an inherited method and must be unset.
*/
if (substr($reversedMethod, -$actionPrefixLength)!==$reversedActionPrefix){
unset($methods[$index]);
} else $methods[$index] = strrev(str_replace($reversedActionPrefix, '', $reversedMethod,$replace=1));
}
echo 'Actions '.CHtml::listBox('methods', NULL, $methods);
}
...
}
为此,我将在SiteController中添加一个静态方法getAllActions()
,都是PHP函数。根据您的问题:
1.如何获得网站上所有页面的列表
基于Yii的模块/控制器/操作/操作参数方式,以及您构建SEO网站地图的需要
希望这有帮助 你可能想用一个扩展来做这个?我不想使用分机。我基本上是在编写自己的扩展,它与我使用和需要的其他SEO组件一起插入。
array(
'controllerName1'=>array(
'action1_1',
'action1_2'),
'controllerName2'=>array(
'action2_1',
'action2_2'),
);