Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获取全部”;“第页”;在YII?_Php_Yii_Sitemap - Fatal编程技术网

Php 获取全部”;“第页”;在YII?

Php 获取全部”;“第页”;在YII?,php,yii,sitemap,Php,Yii,Sitemap,我正在尝试创建自己的xml站点地图。除了我认为最简单的部分,其他的都完成了。如何获得网站上所有页面的列表?我在/site文件夹中有一堆视图,还有一些其他视图。有没有办法显式地请求他们的URL,或者通过控制器 我不想使用扩展名您需要知道要在sitemap.xml中包含哪些内容,我并不认为您真的想在sitemap.xml中包含所有页面,或者您真的想包含类似site.com/article/edit/1的内容吗 也就是说,您可能只需要控制器中的视图操作的结果。事实是,你需要知道你想要什么 不要考虑控制

我正在尝试创建自己的xml站点地图。除了我认为最简单的部分,其他的都完成了。如何获得网站上所有页面的列表?我在/site文件夹中有一堆视图,还有一些其他视图。有没有办法显式地请求他们的URL,或者通过控制器


我不想使用扩展名

您需要知道要在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可以通过使用-WGETGETlynx命令模拟linux中的浏览器来实现

或者,您可以将CronController创建为CConsoleCommand。如何在YII中使用命令如下面的链接所示-

Sitemap是一种列出站点URL的XML。但它做的不止这些。 它可以帮助你可视化一个网站的结构,你可以

  • 类别
  • 子类别
在进行有用的扩展时,可在设计前考虑上述各点

像Wordpress这样的框架提供了生成分类站点地图的方法。 因此,每个页面的元数据都是从以前存储的,并使用它发现的元数据对页面进行分组

@Pavle提出的反思解决方案是好的,应该是一条路。 考虑到可能有<强>部分视图< /强>,您可能或可能不想将它们列为单独的链接。

因此,您想在创建扩展上投入多少精力,也取决于其中一些因素

您可以要求用户列出config fie中的所有变量,并从中开始,这并不坏或者您必须使用一些技术对页面进行分组并列出,如反射和解析页面以及查找正则表达式


对于基于模块名称的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网站地图的需要

  • 由于您的操作参数无限变化,因此很难自动解析以获取所有URL。尽管您可以简单地获得由 帕夫勒普雷迪奇。当你为SEO定制(SERF)URL规则时,复杂性就出现了
  • 下一个最好的解决方案是拥有一个内容数据库,您知道如何通过url规则获取每个内容,然后是一个cron控制台作业,用于创建所有要保存为sitemap.xml的url


    希望这有帮助

    你可能想用一个扩展来做这个?我不想使用分机。我基本上是在编写自己的扩展,它与我使用和需要的其他SEO组件一起插入。
    array(
        'controllerName1'=>array(
            'action1_1',
            'action1_2'),
        'controllerName2'=>array(
            'action2_1',
            'action2_2'),
    );