parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

bcategories.p - Категории...

BeaVe 11.02.2006 09:21 / 11.02.2006 13:13

Класс создан на основании статьи о построении деревье от Misha v.3.
@CLASS
bcategories

@bOptions[]
$printCategory_tag_name[category]
#end @bOptions[]

@getCategories[getCategories_params]
$_getCategories_params[^hash::create[$getCategories_params]]
$result[^MAIN:pSQL.sql[table]{
	SELECT
		categories.category_id,
		dt_published,
		category_parent_id,
		category_thread_id,
		^if(def $_getCategories_params.SQL_SELECT){
			$_getCategories_params.SQL_SELECT,
		}
		title
	FROM
		^if(def $_getCategories_params.SQL_FROM){
			$_getCategories_params.SQL_FROM,
		}
		categories
	WHERE
		^if(def $_getCategories_params.SQL_WHERE){
			$_getCategories_params.SQL_WHERE AND
		}
		categories.is_published = 1
	ORDER BY
		title ASC
}[
	^if(^_getCategories_params.offset.int(0)){
		$.offset(^_getCategories_params.offset.int(0))
	}
	^if(^_getCategories_params.limit.int(0)){
		$.limit(^_getCategories_params.limit.int(0))
	}
]]
#end @getCategories[]

@getCategoryById[category_id]
$result[
	^getCategories[
		$.SQL_WHERE[categories.category_id = ^category_id.int(0)]
		$.limit(1)
	]
]
#end @getCategoryById[]

@getCategoriesByParent[category_parent_id;limit]
$result[
	^getCategories[
		$.SQL_WHERE[category_parent_id = ^category_parent_id.int[]]
		^if(^limit.int(0)){
			$.limit(^limit.int(0))
		}
	]
]
#end @getCategoriesByParent[]

@getCategoriesByThread[thread]
$result[
	^getCategories[
		$.SQL_WHERE[
			^if($thread is table){
				^if($thread){
					category_thread_id IN (^thread.menu{$thread.category_thread_id}[,])
				}
			}{
				category_thread_id = ^thread.category_thread_id.int(0)
			}
		]
	]
]
#end @getCategoriesByThread[]

@printCategory[category;body]
<${printCategory_tag_name}>
	<category_id>^category.category_id.int[]</category_id>
	^XML_date[
		$.date[$category.dt_published]
		$.tag_name[dt_published]
	]
	<title>$category.title</title>
	$body
</${printCategory_tag_name}>
#end @printCategory[]

@printCategories[categories]
^categories.menu{
	^printCategory[$categories.fields]
}
#end @printCategories[]

@printCategoriesByParent[categories;category_parent_id][level_categories]
$level_categories[^categories.select($categories.category_parent_id == $category_parent_id)]
^level_categories.menu{
	^printCategory[$level_categories.fields;^printCategoriesByParent[$categories;$level_categories.category_id]]
}
#end @printCategoriesByParent[]

@category[category_params]
$category[^getCategoryById[$category_params.params.category_id]]
$result[^printCategory[$category]]
#end @category[]

@categories[categories_params]
$root_categories[^getCategoriesByParent[$categories_params.params.category_parent_id;$categories_params.params.categories_limit]]
^if($root_categories){
	^if($categories_params.params.show_root_categories){
		$result[^printCategories[$root_categories]]
	}{
		$categories[^getCategoriesByThread[$root_categories]]
		^if($categories){
			$result[^printCategoriesByParent[$categories;$categories_params.params.category_parent_id]]
		}{
			^throw[not_found;Could not find categories]
		}
	}
}{
	^throw[not_found;Could not find root categories]
}
#end @categories[]

@auto[]
^bOptions[]
#end @auto[]
Вижу есть неудобства. К примеру запросы не кэшируются... Или даже не создается хэш.
Важно мнение о подходе с использование главного метода @getCategories[], а уже подметоды @getCategoriesById[], @getCategoriesByParent[], @getCategoriesByThread[] работают от него.

При следующем использовании:
^bcategories:categories[
	$.params[
		$.category_parent_id(2)
		$.show_root_categories(1)
		$.categories_limit(10)
	]
]
с вызовом ?mode=debug почему-то в sql.txt сохраняется:
SQL connections while generating page: 1
SQL requests while generating page

table:  	2		[0 ms/16 KB/136 blocks]
--------------------------------------------------
TOTAL:  	2		[0 ms/16 KB/136 blocks]

TYPE: table
EXECUTION TIME: 0 ms
MEMORY USAGE: 8 КБ/80 blocks
ROWS SELECTED: 2
SQL OPTIONS: $.limit(10)
QUERY:
SELECT categories.category_id, dt_published, category_parent_id, category_thread_id, title FROM categories WHERE category_parent_id = 2 AND categories.is_published = 1 ORDER BY title ASC
EXPLAIN:
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	categories	ref	ix_categories_0,ix_categories_3	ix_categories_0	3	const,const	1	Using where; Using filesort


TYPE: table
EXECUTION TIME: 0 ms
MEMORY USAGE: 8 КБ/56 blocks
ROWS SELECTED: 4
SQL OPTIONS: $.limit(10)
QUERY:
SELECT categories.category_id, dt_published, category_parent_id, category_thread_id, title FROM categories WHERE category_parent_id = 1 AND categories.is_published = 1 ORDER BY title ASC
EXPLAIN:
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	categories	ref	ix_categories_0,ix_categories_3	ix_categories_0	3	const,const	4	Using where; Using filesort
Не пойму почему два запроса и WHERE category_parent_id имеет разные значения. В первом 2, а во втором 1...

  • bcategories.p - Категории..., BeaVe 11.02.2006 09:21 / 11.02.2006 13:13