Получить все "страницы" в YII?

Я пытаюсь создать свой собственный XML-файл sitemap. Все сделано, за исключением той части, которая, как я думал, будет самой простой. Как вы получаете Список всех страниц на сайте? У меня есть куча представлений в папке /site и несколько других. Есть ли способ явно запросить их URL-адреса или, возможно, через контроллеры?

Я не хочу использовать расширение

5 ответов


вы можете использовать отражение для итерации всех методов всех ваших контроллеров:

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");
            }
        }
    }
}

вам нужно знать, какой контент вы хотите включить в карту сайта.xml, я действительно не думаю, что вы хотите включить все страницы в карту сайта.xml, или вы действительно хотите включить что - то вроде site.com/article/edit/1 ?

тем не менее, вы можете только хотеть результат от view действие в ваших контроллерах. правда в том, что вам нужно знать, что вы хотите проиндексировать.

Не думайте с точки зрения контроллеров / действий/ представлений, а скорее думайте о ресурсах в вашем система, которую вы хотите индексировать, будь то статьи или страницы, все они находятся в вашей базе данных или хранятся каким-то образом, поэтому вы можете перечислить их, и у них есть URI, который их идентифицирует, получение URI-это вопрос вызова нескольких функций.


есть две возможности -

Пример 1:

вы запускаете статический веб-сайт, тогда вы можете найти весь свой HTML внутри 1 папки-защищенный / просмотры / сайт / страницы http://www.yiiframework.com/wiki/22/how-to-display-static-pages-in-yii/

Пример 2:

веб-сайт динамичен. Такие задачи, как создание и регенерация Sitemaps могут быть классифицированы в фоновые задачи.

работает фон такс может быть достигнуто путем эмуляция браузера, которая возможна в linux с помощью - команды wget, GET или рысь команды

или вы можете создать CronController как CConsoleCommand. Как использовать команды в YII показано в ссылке ниже - http://tariffstreet.com/yii/2012/04/implementing-cron-jobs-with-yii-and-cconsolecommand/

Sitemap-это XML, в котором указан URL вашего сайта. Но дело не только в этом. Это поможет вам визуализируйте структуру веб-сайта, у вас может быть

  • категория
  • местах.

делая полезный расширение, над пунктами можно держать в рассмотрение перед дизайном.

фреймворки, такие как Wordpress обеспечить способ создания категориальной карты сайта. Таким образом, метаданные для каждой страницы хранятся до и с использованием этих метаданных, которые он обнаруживает и группирует страницы.

решение путем отражения предложил @Pavle хорошо,и должен быть путь. Считайте, что может быть частичный вид и вы можете или не хотите перечислять их как отдельные ссылки.

Итак, сколько усилий вы хотите вложить в создание расширения, также зависит от некоторых из них.

вы можете либо попросить пользователя перечислить все переменные в config fie и перейти оттуда, что неплохо или вы должны группировать страницы и список, используя некоторые методы, такие как отражение и извлечение "страницы" и ищем regex.

для ex-на основе имен модулей вы можете сначала сгруппировать их, а контроллеры внутри модуля могут сформировать подгруппу.


одним из первых подходов может быть итерация по файлам представления, но тогда вы должны учитывать, что в некоторых случаях представления не являются назначениями страниц, а разделы страниц, включенные в другие страницы, используя CController::renderPartial() метод. Исследуя ссылку на класс CController, я наткнулся на CController::actions() метод.

так, я не нашел ни одного Yii way для итерации по всем действиям 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);
    }
    ...
}

и выход у меня был..

All the actions in a ListBox!

Я уверен, что он может быть дополнительно уточнен, но этот метод должен работать для любого из контроллеров, которые у вас есть...

Итак, что вам нужно сделать, это:

для каждого контроллера: отфильтруйте все методы не-действия класса, используя вышеуказанный метод. Вы можете построить ассоциативный массив, например

array(
    'controllerName1'=>array(
        'action1_1',
        'action1_2'),
    'controllerName2'=>array(
        'action2_1',
        'action2_2'),
);

Я бы добавил статический метод getAllActions () в моем SiteController для этого.

get_class_methods, get_class, strrev и strlen все функции PHP.


на основе вашего вопроса: 1. Как вы получаете Список всех страниц на сайте?

на основе способа Yii модуля / контроллера / действия / action_params и вашей необходимости построить карту сайта для SEO.

  1. будет трудно автоматически анализировать, чтобы получить все URL-адреса, поскольку ваши параметры действия меняются бесконечно. Хотя вы можете просто получить контроллер / действие легко, как построено Павле Предик. Сложность возникает, когда вы настроили (SERF) URL правила предназначены для SEO.

следующее лучшее решение-иметь базу данных контента, и вы знаете, как получить каждый контент через правила url, а затем задание консоли cron для создания всех URL-адресов, которые будут сохранены как карта сайта.XML.

надеюсь, что это помогает!