Получить все "страницы" в 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);
}
...
}
и выход у меня был..
Я уверен, что он может быть дополнительно уточнен, но этот метод должен работать для любого из контроллеров, которые у вас есть...
Итак, что вам нужно сделать, это:
для каждого контроллера: отфильтруйте все методы не-действия класса, используя вышеуказанный метод. Вы можете построить ассоциативный массив, например
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.
- будет трудно автоматически анализировать, чтобы получить все URL-адреса, поскольку ваши параметры действия меняются бесконечно. Хотя вы можете просто получить контроллер / действие легко, как построено Павле Предик. Сложность возникает, когда вы настроили (SERF) URL правила предназначены для SEO.
следующее лучшее решение-иметь базу данных контента, и вы знаете, как получить каждый контент через правила url, а затем задание консоли cron для создания всех URL-адресов, которые будут сохранены как карта сайта.XML.
надеюсь, что это помогает!