| 
			| 
					
						| Гром 
								Птычк. Тьфу, птычник... Вот! 
								Готовлюсь к пенсии
								
								    Offline 
								Пол:   
								Бодрый птах
								
								
								
								
								
							 | 
								|  | «  : 28-01-2004 23:52 »  |  | 
 
 При использовании классов я делаю так class site extends db { function site() {  global $prefix, $id, $onelistcount, $sort, $startpoint;   $this->art_id = @$id; // For articles  $this->art_topic_id = @$id; // For all articles // Т.е. в данном случае id при первом вызове есть id статьи для ее отображения, а во втором случае - эта же глобальная переменная - это уже id категории для списка статей из нее. function view_arts() {  // Эта выводит статью на обозрение всем. $id = $this->$art_id; } function view_article() { // Эта выводит список статей из категории. $id = $art_topic_id; } }; Иначе говоря - ежели указан параметр выводить статью, то запустится функция view_article() которая покажет статью по ID Соответственно вызовется функция view_arts() которая покажет список статей. Первая функция вызывается из файла viewart.php Вторая из view.php которые подключают файл class.php в котором содержатся все описания вышеупомянутых классов. А теперь представьте себе , что вызывая view.php?id=2 я получаю отображение правильного списка статей из категории id которой действительно 2 и одновременно вызов функции view_article(). Это видно по причине того, что колличество просмотров статьи id которой то же равен 2 растет     Т.е. при вызове класса в хидере на инициализацию, я получаю грубо говоря по башке. Структура всех файлов такова: hider  site new site; Вывод инфы с вызовом функций класса сайт Вот так. Поясните мне ЧТО Я НЕПРАВИЛЬНО ДЕЛАЮ.... Что то тут не то. Создается впечатление, что код каждой функции все равно выполняется, просто так как результатом функции являются возвращаемые значения, то я получаю по шапке в случае реального обновления данных таблицы в БД, а остальное теряется.... |  
						| 
								|  |  
								|  |  Записан | 
 
 А птичку нашу прошу не обижать!!! |  |  | 
	| 
			| 
					
						| Fireworm 
								Гость
 | 
								|  | « Ответ #1 : 29-01-2004 07:57 »  |  | 
 
 Вfunction view_article()
 {
 // Эта выводит список статей из категории.
 $id = $art_topic_id;
 }
 ты забыл $this->
 
 И эти функции возвращают занчение $id, или ты передаеш ее как глобальную? - Тогда необходимо объявить ее как globals
 
 P.S. И лучше не использовать в классах глобальных переменных - теряется универсальность.
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Гром 
								Птычк. Тьфу, птычник... Вот! 
								Готовлюсь к пенсии
								
								    Offline 
								Пол:   
								Бодрый птах
								
								
								
								
								
							 | 
								|  | « Ответ #2 : 29-01-2004 08:15 »  |  | 
 
 Fireworm, это я здесь забыл $this.Нет ты тут не понял. $id призодит от строки запроса в браузере и тут без глобальных переменных ен обойтись - юзер выбирает каталог или статью и его запрос организует id номер в строке запроса, который я хватаю и который отдаю классу, а вот потом начинается бред.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 А птичку нашу прошу не обижать!!! |  |  | 
	| 
			| 
					
						| Гром 
								Птычк. Тьфу, птычник... Вот! 
								Готовлюсь к пенсии
								
								    Offline 
								Пол:   
								Бодрый птах
								
								
								
								
								
							 | 
								|  | « Ответ #3 : 29-01-2004 09:08 »  |  | 
 
 Вот полный текст класса при проверке. <?
 class site
 {
 var $count=10;
 var $notags__tags_re="";
 var $prefix;
 var $art_id;
 var $art_topic_id;
 var $art_onelistcount;
 var $art_sort;
 var $art_startpoint;
 
 function site()
 {
 global $prefix, $id, $onelistcount, $sort, $startpoint;
 
 $this->art_id = @$id; // For articles
 $this->art_topic_id = @$id;
 $this->art_onelistcount = $onelistcount;
 $this->art_sort = @$sort;
 $this->art_startpoint = @$startpoint;
 
 $this->prefix = $prefix;
 
 
 $this->func_arr = array(
 $this->show_main_topics_menu_line(),
 $this->show_main_topics_menu_cat(),
 $this->show_last_articles(),
 $this->show_article(),
 $this->show_articles()
 );
 $this->tpl_arr = array(
 "[!MAIN_TOPICS_MENU_LINE!]",
 "[!MAIN_TOPICS_MENU_CAT!]",
 "[!LAST_ARTICLES!]",
 "[!SHOW_ARTICLE!]",
 "[!SHOW_ARTICLES!]"
 );
 
 }
 
 
 
 
 function deinit()
 {
 
 
 
 }
 
 
 function load_template($file_name)
 {
 $file_tpl=fopen($file_name,'r');
 $text=fread($file_tpl,filesize($file_name));
 fclose($file_tpl);
 return $text;
 
 }
 
 
 function replace_template($tpl)
 {
 $repl=preg_replace($this->tpl_arr,$this->func_arr,$tpl);
 
 return $repl;
 }
 
 
 
 function show_main_topics_menu_cat()
 {
 
 
 }
 
 
 function show_main_topics_menu_line()
 {
 
 }
 
 function show_last_articles()
 {
 }
 
 
 
 
 
 function show_article()
 {
 $this->art_id = 10;
 $this->art_topic_id = 20;
 }
 
 function show_articles()
 {
 
 
 }
 
 }; // End of class
 
 $site= new site;
 ?>
 
 
А вот код index.php <?
 include ("class.php");
 
 
 $site->show_articles();
 
 echo $site->art_id;
 echo $site->art_topic_id;
 
 ?>
 
 
 
По логике вещей с такой вот строкой вызоваhttp://127.0.0.1/class/index.php?id=1 браузер должен отобразить 11 т.е. обыкновенный вызов функции без тела и неизмененные константы. А результатом является 1020 в реальности, т.е. выполняется присвоение в функции которую не вызываю. |  
						| 
								|  |  
								| « Последнее редактирование: 23-11-2007 20:39 от Алексей1153++ » |  Записан | 
 
 А птичку нашу прошу не обижать!!! |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #4 : 29-01-2004 10:34 »  |  | 
 
 Вот работа приведенного кода после маленькой модификации (только вывод переменной $this->art_id в начале и конце ф-ии). DEBUG: site(): in:DEBUG: show_article(): in: 1
 DEBUG: show_article(): out: 10
 DEBUG: site(): out: 10
 10
 20
И что здесь не так работает? Что написал, то и происходит. |  
						| 
								|  |  
								| « Последнее редактирование: 23-11-2007 20:40 от Алексей1153++ » |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Гром 
								Птычк. Тьфу, птычник... Вот! 
								Готовлюсь к пенсии
								
								    Offline 
								Пол:   
								Бодрый птах
								
								
								
								
								
							 | 
								|  | « Ответ #5 : 29-01-2004 11:11 »  |  | 
 
 RXL, Я НЕ ВЫЗЫВАЮ show_article()Я ВЫЗЫВАЮ show_articles();
 Это разные функции.
 
 show_article() в index.php вообще не должна вызываться - в том то и дело!!!!
 
 
 <?
 
 include ("class.php");
 
 
 $site->show_articles();
 
 echo $site->art_id;
 echo $site->art_topic_id;
 
 ?>
 
 И где тут show_article();  :?:
 |  
						| 
								|  |  
								|  |  Записан | 
 
 А птичку нашу прошу не обижать!!! |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #6 :  29-01-2004 11:18 »   |  | 
 
 Вот именно что вызываешь  :!: Фрагмент из site():  $this->func_arr = array($this->show_main_topics_menu_line(),
 $this->show_main_topics_menu_cat(),
 $this->show_last_articles(),
 $this->show_article(),
 $this->show_articles()
 );
Ты заносишь в массив результаты вызова ф-ий. Кстати, в предыдущем моем посте это видно - show_article() вызывалась внутри site(). |  
						| 
								|  |  
								| « Последнее редактирование: 23-11-2007 20:41 от Алексей1153++ » |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Гром 
								Птычк. Тьфу, птычник... Вот! 
								Готовлюсь к пенсии
								
								    Offline 
								Пол:   
								Бодрый птах
								
								
								
								
								
							 | 
								|  | « Ответ #7 : 29-01-2004 12:39 »  |  | 
 
 Тогда так, я делаю темплейты.
 Идея состояла в том, что бы в текст темплейта включать стандратные коснтанты (см. второй массив) а в самом php файле заменять его вызовом соответствующей ему функции.
 
 В чем я неправ, теперь то я понял где собака порылась, я уже создаю результаты, а мне надо именно вызов заносить.
 
 Как это сделать.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 А птичку нашу прошу не обижать!!! |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #8 : 29-01-2004 13:04 »  |  | 
 
 Т.е., ты хочешь сделать массив указателей ($this->func_arr) на ф-ии? Заноси в массив только имена ф-ий: $this->func_arr=array("show_main_topics_menu_line","show_main_topics_menu_cat",
 "show_last_articles",
 "show_article",
 "show_articles");
 
 /* использовать: */
 $this->func_arr[4]();
 
А вот как это работает за пределами ф-ий класса - не знаю. |  
						| 
								|  |  
								| « Последнее редактирование: 23-11-2007 20:42 от Алексей1153++ » |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Гром 
								Птычк. Тьфу, птычник... Вот! 
								Готовлюсь к пенсии
								
								    Offline 
								Пол:   
								Бодрый птах
								
								
								
								
								
							 | 
								|  | « Ответ #9 : 29-01-2004 16:37 »  |  | 
 
 RXL, попробую - агромадное спасибо....
 А то я совсем запутался так как в жизни на php не работал.
 
 Теперь будет и движок бытро.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 А птичку нашу прошу не обижать!!! |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #10 : 29-01-2004 20:39 »  |  | 
 
 А то я совсем запутался так как в жизни на php не работал. Я тоже    Главное не суетиться - от этого много ошибок |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Гром 
								Птычк. Тьфу, птычник... Вот! 
								Готовлюсь к пенсии
								
								    Offline 
								Пол:   
								Бодрый птах
								
								
								
								
								
							 | 
								|  | « Ответ #11 : 29-01-2004 21:48 »  |  | 
 
 RXL, мда - я кстати посмотрел - не поможет.Идея такова - считать любой темплейт и с помощью preg_replace сделать замену из массива 1 на массив два, т.е. заменить значения для темпелйтов из второго массива на резкльтат работу функции из другого.
 Думаю, что замена на указатели мне ничего не даст, таким образом придется ставить в ручную местонахождение и с помощью switch оператора переделывать - но это некрасиво ИМХО.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 А птичку нашу прошу не обижать!!! |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #12 : 29-01-2004 23:11 »  |  | 
 
 Насчет ссылок - глянул в доку - оператор & - так же как и в С, но разименовывать уже не надо. Замену хочешь делать на статические (однократно вычесленные) значения, или на динамические? Для статической замены можно попробовать комбинацию preg_replace_callback() и strtr(). Для динамической можно тот же preg_replace_callback() и индексацию массива с ссылками на ф-ии посредством строк (tpl_arr). $this->func_arr=array("[!MAIN_TOPICS_MENU_LINE!]" => &$this->show_main_topics_menu_line,
 .....
 );
 // Использование вместе с preg_replace_callback() :
 $match=$site->func_arr[$match]();
 
 |  
						| 
								|  |  
								| « Последнее редактирование: 23-11-2007 20:43 от Алексей1153++ » |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Fireworm 
								Гость
 | 
								|  | « Ответ #13 : 30-01-2004 10:20 »  |  | 
 
 Гром, А зачем изобретать велосипед? Ведь есть куча классов, которые отлично работают, например smarty или phplib.А еще лучше положить все на xml/xslt
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Гром 
								Птычк. Тьфу, птычник... Вот! 
								Готовлюсь к пенсии
								
								    Offline 
								Пол:   
								Бодрый птах
								
								
								
								
								
							 | 
								|  | « Ответ #14 : 30-01-2004 10:40 »  |  | 
 
 А еще лучше положить все на xml/xslt
 
 КАК - поподробнее. |  
						| 
								|  |  
								|  |  Записан | 
 
 А птичку нашу прошу не обижать!!! |  |  | 
	| 
			| 
					
						| Гром 
								Птычк. Тьфу, птычник... Вот! 
								Готовлюсь к пенсии
								
								    Offline 
								Пол:   
								Бодрый птах
								
								
								
								
								
							 | 
								|  | « Ответ #15 : 30-01-2004 10:42 »  |  | 
 
 RXL,  поподробнее. |  
						| 
								|  |  
								|  |  Записан | 
 
 А птичку нашу прошу не обижать!!! |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #16 : 30-01-2004 13:36 »  |  | 
 
 <?
 class site
 {
 var $count=10;
 var $notags__tags_re="";
 var $prefix;
 var $art_id;
 var $art_topic_id;
 var $art_onelistcount;
 var $art_sort;
 var $art_startpoint;
 
 function site()
 {
 global $prefix, $id, $onelistcount, $sort, $startpoint;
 
 $this->art_id = @$id; // For articles
 $this->art_topic_id = @$id;
 $this->art_onelistcount = $onelistcount;
 $this->art_sort = @$sort;
 $this->art_startpoint = @$startpoint;
 
 $this->prefix = $prefix;
 
 $b = array( // временный массив - неудобно писать длинные имена с $this
 "[!MAIN_TOPICS_MENU_LINE!]" => 'show_main_topics_menu_line',
 "[!MAIN_TOPICS_MENU_CAT!]" => 'show_main_topics_menu_cat',
 "[!LAST_ARTICLES!]" => 'show_last_articles',
 "[!SHOW_ARTICLE!]" => 'show_article',
 "[!SHOW_ARTICLES!]" => 'show_articles'
 );
 
 // формирование регулярного выражения
 $a=array_keys($b);
 $re='('.preg_quote(reset($a));
 for($v=next($a);$v;$v=next($a)) $re.='|'.preg_quote($v);
 $re.=')';
 
 $this->regexp=&$re; // использование жестких ссылок - метод оптимизации - можно и без них
 $this->func_arr = &$b;
 }
 
 //********* для каждой замены вызывается соотв. шаблону ф-ия
 function replace_template2($match) {
 return call_user_func(array(&$this,$this->func_arr[$match[0]]));
 }
 
 function replace_template($text) {
 return preg_replace_callback($this->regexp,array(&$this,'replace_template2'),$text);
 }
 //*********
 
 function deinit() {
 }
 
 function load_template($file_name) {
 $file_tpl=fopen($file_name,'r');
 $text=fread($file_tpl,filesize($file_name));
 fclose($file_tpl);
 return $text;
 }
 
 function show_main_topics_menu_cat() {
 }
 
 function show_main_topics_menu_line() {
 }
 
 function show_last_articles() {
 }
 
 function show_article() {
 $this->art_id = 10;
 $this->art_topic_id = 20;
 return "----show_article----"; // для отладки
 }
 
 function show_articles() {
 return "----show_articles----"; // для отладки
 }
 
 }; // End of class
 
 $site= new site;
 ?>
 |  
						| 
								|  |  
								| « Последнее редактирование: 23-11-2007 20:46 от Алексей1153++ » |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Гром 
								Птычк. Тьфу, птычник... Вот! 
								Готовлюсь к пенсии
								
								    Offline 
								Пол:   
								Бодрый птах
								
								
								
								
								
							 | 
								|  | « Ответ #17 : 30-01-2004 21:15 »  |  | 
 
 Интересно - но мне очень хочется в этом разобраться мог бы ты вставить коммнтарии с объяснением, так как куча дел и просто сидеть и копать это все времени нет, надо побыстрее закончить а вот просто копировать не буду - надо нормально понимать что сам делаешь... |  
						| 
								|  |  
								|  |  Записан | 
 
 А птичку нашу прошу не обижать!!! |  |  | 
	| 
			| 
					
						| Fireworm 
								Гость
 | 
								|  | « Ответ #18 : 31-01-2004 07:27 »  |  | 
 
 Гром, Основная задача скрипта - сгенерировать xml. А далее простым движением: $xh = xslt_create(); $arguments = array(
 '/_xml' => $xml,
 '/_xsl' => $xslData
 );
 $result = xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments);
Накладываеш xslt на сгенерированный xml шаблон xslt - получаеш html и отдаеш пользователю. Или тебя интересует как работает xslt вообще? |  
						| 
								|  |  
								| « Последнее редактирование: 23-11-2007 20:47 от Алексей1153++ » |  Записан | 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #19 : 31-01-2004 14:24 »  |  | 
 
 В массив заносим _имена_ ф-ий, а в качестве индексов используем шаблоны.  $b = array("[!MAIN_TOPICS_MENU_LINE!]" => 'show_main_topics_menu_line',
 ......
 );
На основе списка ключей массива $b генерим регулярное выражение. Это чтобы не делать лишнего массива с шаблонами. Результат - строка вида "(шаблон1|шаблон2|шаблон3)". Все спецсимволы предваряются '\'.  $a=array_keys($b);$re='('.preg_quote(reset($a));
 for($v=next($a);$v;$v=next($a)) $re.='|'.preg_quote($v);
 $re.=')';
Модифицировал твою ф-ию replace_template(). В нее передается строка (можно сразу весь файл). При нахождении одного из шаблонов (согласно $this->regexp) вызывается callback ф-ия replace_template2(), а возвращаемое ею значение (строка) используется для замены текущего шаблона. В replace_template2() из массива $this->func_arr извлекается имя ф-ии и вызывается хитрым методом. function replace_template2($match) {return call_user_func(array(&$this,$this->func_arr[$match[0]]));
 }
 
 function replace_template($text) {
 return preg_replace_callback($this->regexp,array(&$this,'replace_template2'),$text);
 }
------------------- В php, оказалось, понятия ссылки на ф-ию нет, но есть извращенные методы: function aaa() { echo "aaa"; }
 $a="aaa";
 $a(); // косвенный вызов через переменную.
 call_user_func($a); // через спец. ф-ию
 
 class myclass {
 function xxx() { echo "xxx"; }
 }
 
 call_user_func(array('myclass','xxx')); // вызов метода "статического" класса
 
 $obj=new myclass;
 call_user_func(array(&$obj,'xxx')); // вызов метода объекта через ссылку на объект
 
Вот последний метод я и использовал в replace_template() и replace_template2(). Вот ссылки на доки по теме:http://www.php.net/manual/ru/function.preg-replace-callback.phphttp://ru.php.net/manual/ru/function.call-user-func.php Про callback ф-ии:http://www.php.net/manual/ru/language.pseudo-types.php#language.types.mixed |  
						| 
								|  |  
								| « Последнее редактирование: 23-11-2007 20:51 от Алексей1153++ » |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Гром 
								Птычк. Тьфу, птычник... Вот! 
								Готовлюсь к пенсии
								
								    Offline 
								Пол:   
								Бодрый птах
								
								
								
								
								
							 | 
								|  | « Ответ #20 : 01-02-2004 15:13 »  |  | 
 
 Fireworm,  Или тебя интересует как работает xslt вообще?
 
 Да именно - как с парсированием XML кода я сталкивался, а вот как работа в вебе нет.  Отсюда - просьба. Или тему заведи и напиши немного про это, если есть время или статейку - для меня и для сайта, по стартовым азам XML технологии в вебе. |  
						| 
								|  |  
								|  |  Записан | 
 
 А птичку нашу прошу не обижать!!! |  |  | 
	| 
			| 
					
						| Fireworm 
								Гость
 | 
								|  | « Ответ #21 : 02-02-2004 07:16 »  |  | 
 
 Гром, Попробую... хотя таковых и хвтает в интернете... |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Гром 
								Птычк. Тьфу, птычник... Вот! 
								Готовлюсь к пенсии
								
								    Offline 
								Пол:   
								Бодрый птах
								
								
								
								
								
							 | 
								|  | « Ответ #22 : 02-02-2004 10:11 »  |  | 
 
 Fireworm, Ок - жду. |  
						| 
								|  |  
								|  |  Записан | 
 
 А птичку нашу прошу не обижать!!! |  |  | 
	|  |