Joostina CMS / CMF v2.* API
  • Docs
  • Package
  • Class
  • Tree
  • Todo
Overview

Packages

  • Components
    • Acls
      • Models
        • Admin
        • Site
    • BlogCategory
      • Models
        • Admin
        • Site
    • Blogs
      • Controllers
        • Admin
        • Site
      • Helpers
      • Models
        • Admin
        • Site
    • Coder
      • Controllers
        • Admin
      • Models
        • Admin
    • Comments
      • Controllers
        • Admin
        • Site
      • Helpers
      • Models
        • Admin
        • Site
    • CommentsCounter
      • Models
        • Admin
        • Site
    • Mainpage
      • Controllers
        • Site
    • News
      • Controllers
        • Admin
        • Site
      • Helpers
      • Models
        • Admin
        • Site
    • Pages
      • Controllers
        • Admin
        • Site
      • Models
        • Site
    • Search
      • Controllers
        • Site
    • Site
      • Controllers
        • Admin
        • Site
    • Sitemap
      • Controllers
        • Admin
        • Site
      • Models
        • Admin
        • Site
    • Test
      • Controllers
        • Site
    • Torrents
      • Controllers
        • Site
    • Users
      • Controllers
        • Admin
        • Site
      • Models
        • Admin
        • Site
  • Compression
  • Core
    • Libraries
      • Arhive
      • Array
      • Attached
      • Autoadmin
      • Autoloader
      • Benchmark
      • Breadcrumbs
      • Cache
      • Config
      • Cookie
      • Csrf
      • Database
        • Drivers
          • Interfaces
      • Datetime
      • Debug
      • Editor
      • Events
      • File
      • Filter
      • Flashmessage
      • Folder
      • Hit
      • Html
      • Image
      • Inflector
      • Inputfilter
      • Libraries
      • Mail
      • Module
      • Nestedset
      • Pager
      • Pages
      • Params
      • Randomizer
      • Request
      • RobotLoader
      • Route
      • Security
      • Session
      • Static
      • String
      • Text
      • Trash
      • Validate
  • Email
  • Extra
    • Libraries
      • Basket
  • Joostina
    • Controller
    • Core
    • Document
  • JSMin
  • Libraries
    • Extra
      • Basket
        • Models
          • Site
  • None
  • Plugins
    • Autoadmin
    • Editor
    • Sitemap
  • SimpleMail
  • Vendors
    • Libraries
      • Email

Classes

  • modelSitemap
  1: <?php defined('_JOOS_CORE') or exit();
  2: 
  3: /**
  4:  * midelSitemap - Модель карты сайта
  5:  * Модель для работы сайта
  6:  *
  7:  * @version    1.0
  8:  * @package    Components\Sitemap
  9:  * @subpackage Models\Site
 10:  * @author     Joostina Team <info@joostina.ru>
 11:  * @copyright  (C) 2007-2012 Joostina Team
 12:  * @license    MIT License http://www.opensource.org/licenses/mit-license.php
 13:  * Информация об авторах и лицензиях стороннего кода в составе Joostina CMS: docs/copyrights
 14:  *
 15:  * */
 16: class modelSitemap
 17: {
 18:     /**
 19:      * @var $spaces array
 20:      * Пространство ссылок - ссылки одного компонента
 21:      */
 22:     public $spaces = array();
 23:     /**
 24:      * @var $blocks array
 25:      * Блоки ссылок - участки ссылок внутри родительского пространства
 26:      */
 27: 
 28:     /**
 29:      * @var $nodes array
 30:      * Узлы ссылок - основной массив с ссылками
 31:      */
 32:     public $nodes = array();
 33: 
 34:     /**
 35:      * @var $xml_nodes array
 36:      * Узлы элементов xml
 37:      */
 38:     private $xml_nodes = array();
 39: 
 40:     /**
 41:      * Счетчик элементов карты
 42:      *
 43:      * @var $counters int
 44:      */
 45:     private $counters = 0;
 46: 
 47:     /**
 48:      * Параметры конфигурации построения карты
 49:      *
 50:      * @var array
 51:      */
 52:     private $config = array(// максимальное число элементов в карте
 53:         'max_elemets_in_map' => 50000
 54:     );
 55: 
 56:     /**
 57:      * midelSitemap::__construct()
 58:      */
 59:     public function __construct()
 60:     {
 61:         ini_set('memory_limit', '500M');
 62:         ini_set("max_execution_time", "16000");
 63:         set_time_limit(16000);
 64: 
 65:         //Сейчас пространства задаются вручную
 66:         //В дальнейшем, ессно будем брать из настроек компонента
 67:         //Каждое пространство - суть компонент
 68:         $this->spaces = array('blog', 'news', 'content', 'contacts');
 69:         //$this->spaces = array('users');
 70:     }
 71: 
 72:     /**
 73:      * Построение карты
 74:      *
 75:      * @return $map Объект карты
 76:      */
 77:     public static function get_map($xml = false)
 78:     {
 79:         //Создаем экземпляр класса
 80:         $map = new self;
 81: 
 82:         //Проходимся по всем пространствам карты (каждое пространство - компонент)
 83:         foreach ($map->spaces as $space) {
 84: 
 85:             //Подключаем плагин для компонента
 86:             require_once JPATH_APP_PLUGINS_BASE . DS . 'sitemap' . DS . $space . '.php';
 87: 
 88:             //По несложному правилу определяем имя модельки
 89:             $model = 'pluginSitemap' . joosInflector::camelize($space);
 90: 
 91:             //Настройки плагина
 92:             $params = $model::get_params();
 93:             $params['xml'] = $xml;
 94: 
 95:             //Получаем схему (массив с блоками), согласно которой перебираем блоки
 96:             //(блоки отличаются, в основном, правилами формирования ссылок и аттрибутами)
 97:             foreach ($model::get_mapdata_scheme($params) as $map_block) {
 98: 
 99:                 //У каждого блока задан тип: 'single' - одиночная ссылка, 'list' - набор однотипных ссылок
100:                 //Если тип  = 'list' - получаем массив объектов с ссылками из соответствующего метода плагина
101:                 // - название метода, с помощью которого мы получаем массив содержится в элемента массива, описывающего блок (ключ элемента - 'id')
102:                 $data = $map_block['type'] == 'single' ? null : call_user_func($map_block['call_from'], isset($map_block['call_params']) ? $map_block['call_params'] : null );
103: 
104:                 //Добавляем блок в общий массив с ссылками карты сайта
105:                 $map->add_mapblock($space, $map_block, $data);
106:             }
107:         }
108: 
109:         return $map;
110:     }
111: 
112:     /**
113:      * midelSitemap::add_mapblock()
114:      * Добавление блока в карту сайта
115:      *
116:      * @param $block  array  Массив, описывающий текущий mapblock
117:      * @param $data   array  Массив c объектами ссылок (если тип блока 'list')
118:      * @param $dspace str  Текущее пространство ссылок (компонент)
119:      */
120:     public function add_mapblock($space, $block, $data = null)
121:     {
122:         if ($data) {
123:             $level = $block['level'];
124: 
125:             if ($block['type'] == 'single_children') {
126:                 $this->nodes[$space][] = '<a class="maplevel-' . $level . ' mapblock_id-' . $block['id'] . '" href="' . $block['link'] . '">' . $block['title'] . '</a>';
127:                 $block['level'] = $block['level'] + 1;
128:             }
129: 
130:             foreach ($data as $item) {
131:                 if (is_array($item)) {
132:                     //_xdump($item);
133:                     $this->add_mapblock($space, $block, $item);
134:                 } else {
135:                     $level = isset($item->level_up) ? ( $block['level'] + $item->level_up ) : $block['level'];
136:                     $level = isset($item->level) ? ( $item->level ) : $level;
137: 
138:                     $this->nodes[$space][] = '<a class="maplevel-' . $level . ' mapblock_id-' . $block['id'] . '" href="' . $item->loc . '">' . $item->title . '</a>';
139: 
140:                     $this->xml_nodes[$space][] = '
141:                 <url>
142:                     <loc>' . $item->loc . '</loc>
143:                     <lastmod>' . $item->lastmod . '</lastmod>
144:                     <changefreq>' . $block['changefreq'] . '</changefreq>
145:                     <priority>' . $block['priority'] . '</priority>
146:                 </url>';
147:                 }
148:                 ++$this->counters;
149:             }
150:         } else {
151:             $level = isset($item->level_up) ? ( $block['level'] + $item->level_up ) : $block['level'];
152:             $level = isset($item->level) ? ( $item->level ) : $level;
153: 
154:             if ($block['link']) {
155:                 $this->nodes[$space][] = '<a class="maplevel-' . $level . ' mapblock_id-' . $block['id'] . '" href="' . $block['link'] . '">' . $block['title'] . '</a>';
156:             } else {
157:                 $this->nodes[$space][] = '<span class="maplevel-' . $level . ' mapblock_id-' . $block['id'] . '" >' . $block['title'] . '</span>';
158:             }
159: 
160:             $this->xml_nodes[$space][] = '
161:             <url>
162:                 <loc>' . $block['link'] . '</loc>
163:                 <lastmod>' . date('Y-m-d') . '</lastmod>
164:                 <changefreq>' . $block['changefreq'] . '</changefreq>
165:                 <priority>' . $block['priority'] . '</priority>
166:             </url>';
167:         }
168:         ++$this->counters;
169:     }
170: 
171:     /**
172:      * midelSitemap::xml_output()
173:      *
174:      * Генерация XML-файла карты сайта в формате протокола midelSitemap
175:      *
176:      * <?xml version="1.0" encoding="UTF-8"?>
177:      * <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
178:      *     <url>
179:      *         <loc>http://www.example.com/</loc>
180:      *         <lastmod>2010-01-01</lastmod>
181:      *         <changefreq>monthly</changefreq>
182:      *         <priority>0.8</priority>
183:      *     </url>
184:      * </urlset>
185:      */
186:     public function xml_output()
187:     {
188:         is_dir(JPATH_BASE . '/cache/sitemaps') ? null : mkdir(JPATH_BASE . '/cache/sitemaps', 0777, true);
189: 
190:         $counter = 0;
191:         $map_num = 0;
192:         //$maps = array();
193:         $elemets = array();
194:         foreach ($this->xml_nodes as $nodes) {
195:             foreach ($nodes as $node) {
196:                 if ($counter == $this->config['max_elemets_in_map']) {
197:                     ++$map_num;
198:                     $this->xml_create($elemets, $map_num);
199:                     $elemets = array();
200:                     $counter = 0;
201:                 }
202:                 $elemets[] = $node;
203:                 ++$counter;
204:             }
205:         }
206: 
207:         $this->xml_create($elemets, $map_num + 1);
208: 
209:         if ($this->counters > $this->config['max_elemets_in_map']) {
210:             $this->root_xml_create($this->counters);
211:         }
212:     }
213: 
214:     private function xml_create(array $sitemap, $num = 0)
215:     {
216:         $filename = ( $num == 0 || $this->counters < $this->config['max_elemets_in_map'] ) ? JPATH_BASE . DS . 'sitemap.xml' : JPATH_BASE . DS . 'cache/sitemaps/sitemap-' . $num . '.xml';
217: 
218:         $xml = array();
219:         $xml[] = '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
220:         $xml[] = implode('', $sitemap);
221:         $xml[] = "\n</urlset>";
222: 
223:         $xml = new SimpleXMLElement(implode("\n", $xml));
224:         $xml->asXML($filename);
225:     }
226: 
227:     private function root_xml_create($map_number)
228:     {
229:         //echo $this->counters.':'.$this->config['max_elemets_in_map'].'::';
230: 
231:         $map_count = ceil($this->counters / $this->config['max_elemets_in_map']);
232: 
233:         $sitemap = array();
234:         for ($index = 1; $index < $map_count + 1; $index++) {
235:             $sitemap[] = sprintf('<sitemap><loc>%s/cache/sitemaps/sitemap-%s.xml</loc></sitemap>', JPATH_SITE, $index);
236:         }
237: 
238:         $xml = array();
239:         $xml[] = '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
240:         $xml[] = implode("\n", $sitemap);
241:         $xml[] = "</sitemapindex>";
242: 
243:         // joosFile::exists( JPATH_BASE . DS . 'sitemap.xml' ) ? unlink(JPATH_BASE . DS . 'sitemap.xml') : null;
244: 
245:         $xml = new SimpleXMLElement(implode("\n", $xml));
246:         $xml->asXML(JPATH_BASE . DS . 'sitemap.xml');
247:     }
248: 
249: }
250: 
Joostina CMS / CMF v2.* API API documentation generated by ApiGen 2.6.1 – Template adapted by @olvlv and Joostina Team