Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > замена php кода подскажите идею подробно внутри...


Автор: Sanchezzz 11.9.2008, 13:09
Добрый день есть код в php странице

Код


$MAIN = new Main();

...

$MAIN->initcomponent('menu_l2', array ('template'=> 'default' , 'typemenu' => 'menu1')); 


Делаю интерфей для замены параметров столкнулся на том как заменить в пхп файле параметры компонента получить массив параметров не проблема но как заменить их потом и пересохранить на мои в файле не знаю просто не предусмотрел имя компонента... 
хочется без него все реализовать... 

У кого есть идеи?


Автор: Sunvas 11.9.2008, 13:55
Sanchezzz, рекомендую прочесть еще раз, что сам написал и сформирулировать вопрос более грамотно, учитывая морфологию русского языка.

Автор: Djinn 12.9.2008, 08:59
Цитата(Sunvas @ 11.9.2008,  13:55)
Sanchezzz, рекомендую прочесть еще раз, что сам написал и сформирулировать вопрос более грамотно, учитывая морфологию русского языка.

Та да, не плохая идея... Sanchezzz, ты хочешь сохранить переменную в файл чтоли ? (массив).. или что тебе надо то ?

Автор: lukas 12.9.2008, 09:16
Sanchezzz, используй глобальный массив $GLOBALS... 

Автор: Sanchezzz 12.9.2008, 11:55
я хочю сделать интерфейс для замены параметров в моем комопненте вот только не знаю как отыскать комопнент.

комопоненты идут так 

Код

$MAIN->initcomponent('menu_l2', array ('template'=> 'default' , 'typemenu' => 'menu1'));
 
$MAIN->initcomponent('menu_l2', array ('template'=> 'default2' , 'typemenu' => 'menu1'));
 
$MAIN->initcomponent('menu_l2', array ('template'=> 'default2' , 'typemenu' => 'menu3'));

$MAIN->initcomponent('forum', array ('template'=> 'default' , 'typeforum' => 'forum1')); 


меняются только параметры. 

Дальше я планирую сделать форму для замены параметров компоненты на странице. Вот только проблема с отысканием компонента.
на странице. Не знаю как реализовать, есть идеи насчет уникальности?

Цитата

Sanchezzz, используй глобальный массив $GLOBALS...  


От этого я отказался сразу.
Класс  в глобалс как-то не прикалывает потом цмс много мб жрать будет... 
Все просто один класс подключает другой класс который работает внутри первого класса и только потом выводит данные в готовом шаблоне.





Автор: lukas 12.9.2008, 11:58
Sanchezzz, хех... наоборот все известные cms - ки используют $GLOBALS для своих целей (по крайней мере 3-4 основных класса в глобалс храниться), да и тем более я не думаю что ссылки на методы растрачивают так много места... 

Автор: solenko 12.9.2008, 12:03
lukas, а вы поняли чего хочет Sanchezzz? Может объясните вы, раз у ж у нег не получается?

Автор: Sanchezzz 12.9.2008, 12:13
Я хочу идею как найти компонент на странице + идею насчет уникальности. А не решение... 

lukas ну я планирую улажится в 12-15мб. 
Зачем мне глобалс для одного класса который подключает другие классы(n-колич)

Автор: solenko 12.9.2008, 12:18
Sanchezzz, начнем с того, что на странице не сушествует компонетов. Страница это html. Так где вам нужно найти этот самый компонент?

Автор: Sanchezzz 12.9.2008, 12:24
Уж не знаю где конечно в php странице(скрипте). 

Автор: Sunvas 12.9.2008, 13:29
Цитата(Sanchezzz @  12.9.2008,  11:55 Найти цитируемый пост)
я хочю сделать интерфейс для замены параметров в моем комопненте вот только не знаю как отыскать комопнент.

Что значит "интерфейс"? 
Код

interface MyInterFace
{
    public function Func1();
    public function Func2($var1);

}

Так что-ли?

И все-равно задача как-то не понятна.  smile  Хоть кто-то понял о чем речь?

Автор: Sanchezzz 12.9.2008, 14:07
 smile
Цитата

interface MyInterFace

Ничего писать не нужно.
Графический интерфейс для смены параметров я и сам сделаю...

Цитата

Я хочу идею как найти компонент на странице + идею насчет уникальности. А не решение... 


Кто как реализовал поиск и замену параметров. (конструкция копмонента выше. ) в php скрипте.

Автор: gta4kv 12.9.2008, 14:38
Что нужно автору - понятно. Тока вот как это реализовать...

Я думаю лучше всего будет, как раз таки:

Цитата

не предусмотрел имя компонента... 

править эту часть CMS, и делать что бы имя компонента тоже сохранялось. 
Это единственное не извращённое решение которое я вижу.  smile (хотя.. дада.. interface тоже решение)

К извращениям и моветону отнесу $GLOBALS.

Автор: solenko 12.9.2008, 14:49
Цитата(gta4kv @  12.9.2008,  13:38 Найти цитируемый пост)
Что нужно автору - понятно. Тока вот как это реализовать...

А не расскажите что имеенно? А то интерестно же, а сам я понять так и не смог

Автор: skyboy 12.9.2008, 14:51
Sanchezzz, тебе не надо редактировать PHP файл, чтоб заменить значения параметров вызова другими. НЕ НАДО! 
параметры либо хранятся в БД(как ДО редактирования, так и после), либо в конфигурационном файле - отдельном файле, который даже очистить полностью можно, система работать не перестанет.
Тогда вопрос замены значения параметров сводится либо к работе с базой, либо к работе с текстовым файлом простой структуры. Так же при редактировании РНР-кода РНР-кодом ты вполне можешь получить в итоге неработающую систему.
2ВСЕ: Ребят, ему надо было, чтоб при редактировании параметров через админку менялся РНР-код некоего модуля с учетом изменений.
Sunvas, видишь, он даже не знает, что такое 
Цитата(Sunvas @  12.9.2008,  12:29 Найти цитируемый пост)
interface MyInterFace

Думает, что это GUI. Так что твое предположение слишком крутое smile

M
skyboy
Ничего тут архисложного нет. Тема перенесена из "РНР: Для профи"

Автор: lukas 12.9.2008, 15:35
кажется я понял человека... ))... 

Это что-то типа, админ заходит на сайт, там где вставленные компоненты есть кнопочки редактирования параметров компонента, если он нажимает на нее открывается окно с редактирование их, а затем они сохраняются в php файле... а как найти в php файле где вставлен этот компонент... ? я не знаю.... но я такое уже видел... это в полне реально... нужно разбираться... 

Автор: skyboy 12.9.2008, 17:31
Цитата(lukas @  12.9.2008,  14:35 Найти цитируемый пост)
а затем они сохраняются в php файле...

зачем? зачем тогда БД и конфигурационные файлы, если можно отредактировать РНР и сохранить? 

Автор: Nigel 14.9.2008, 14:39
skyboy, ну это зависит от того, как спроектируешь)
пример из битрикса
Код

$APPLICATION->IncludeComponent(
    "bitrix:news",
    ".default",
    Array(
        "SEF_MODE" => "Y", 
        "IBLOCK_TYPE" => "news", 
        "IBLOCK_ID" => "1", 
        "NEWS_COUNT" => "3", 
        "USE_SEARCH" => "N", 
        "USE_RSS" => "Y", 
        "USE_RATING" => "N", 
        "USE_CATEGORIES" => "N", 
        "USE_REVIEW" => "N", 
        "USE_FILTER" => "N", 
        "SORT_BY1" => "ACTIVE_FROM", 
        "SORT_ORDER1" => "DESC", 
        "SORT_BY2" => "SORT", 
        "SORT_ORDER2" => "ASC", 
        "PREVIEW_TRUNCATE_LEN" => "0", 
        "LIST_ACTIVE_DATE_FORMAT" => "d.m.Y", 
        "LIST_FIELD_CODE" => Array("",""), 
        "LIST_PROPERTY_CODE" => Array("",""), 
        "HIDE_LINK_WHEN_NO_DETAIL" => "N", 
        "META_KEYWORDS" => "KEYWORDS", 
        "META_DESCRIPTION" => "DESCRIPTION", 
        "DETAIL_ACTIVE_DATE_FORMAT" => "d.m.Y", 
        "DETAIL_FIELD_CODE" => Array("",""), 
        "DETAIL_PROPERTY_CODE" => Array("SOURCE","",""), 
        "DETAIL_DISPLAY_TOP_PAGER" => "N", 
        "DETAIL_DISPLAY_BOTTOM_PAGER" => "Y", 
        "DETAIL_PAGER_TITLE" => "Страница", 
        "DETAIL_PAGER_TEMPLATE" => "", 
        "DISPLAY_PANEL" => "Y", 
        "SET_TITLE" => "Y", 
        "INCLUDE_IBLOCK_INTO_CHAIN" => "N", 
        "ADD_SECTIONS_CHAIN" => "Y", 
        "USE_PERMISSIONS" => "N", 
        "CACHE_TYPE" => "A", 
        "CACHE_TIME" => "3600", 
        "CACHE_FILTER" => "N", 
        "DISPLAY_TOP_PAGER" => "N", 
        "DISPLAY_BOTTOM_PAGER" => "Y", 
        "PAGER_TITLE" => "Новости", 
        "PAGER_SHOW_ALWAYS" => "N", 
        "PAGER_TEMPLATE" => "", 
        "PAGER_DESC_NUMBERING" => "Y", 
        "PAGER_DESC_NUMBERING_CACHE_TIME" => "36000", 
        "NUM_NEWS" => "20", 
        "NUM_DAYS" => "360", 
        "YANDEX" => "N", 
        "SEF_FOLDER" => "/news/", 
        "SEF_URL_TEMPLATES" => Array(
            "news" => "",
            "section" => "",
            "detail" => "#ELEMENT_ID#/",
            "rss" => "rss/",
            "search" => "search/"
        ),
        "VARIABLE_ALIASES" => Array(
            "news" => Array(),
            "section" => Array(),
            "detail" => Array(),
            "rss" => Array(),
            "search" => Array(),
        )
    )
);

Как видно, различные настройки прямо в файле, который и выводит соответсвующую инфу, в данном случае новости.

Автор: Sanchezzz 15.9.2008, 07:30
lukas в точку попал.  
Цитата

Это что-то типа, админ заходит на сайт, там где вставленные компоненты есть кнопочки редактирования параметров компонента, если он нажимает на нее открывается окно с редактирование их, а затем они сохраняются в php файле... а как найти в php файле где вставлен этот компонент... ? я не знаю.... но я такое уже видел... это в полне реально... нужно разбираться... 


Nigel тоже попал в точку с примером. Это нечто похоже на компоненты битрикса только без использования Глобалс и до безобразия упрошены. 

------------

я думал на выходных насчет такой конструкции: в главном модуле сделать переменную куда будут заносится компоненты которые вызываются на странице (php скрипте). то есть колич вызванных компонентов в саму функцию дописать следующие:

Код

class MAIN {
var arrComponent;

function initcomponent($typecomponent, $name , $parms){
$typecomponent = trim($typecomponent,' ');
$this->arrComponent++; //Прибавляем ИД 
$parms['ID_COMPONENT']=$this->arrComponent; //Добавляем его к массиву параметров.
 if(is_string($typecomponent) and $typecomponent!=''){
//... 
 }
}


Далее с толкнулся с парсером... нужно найти такую контрукцию 
Цитата

<? $MAIN->initcomponent('forum', array ('template'=> 'default' , 'typeforum' => 'forum1'),'ID_COMPONENT'=>0 ); ?>

Поможете со скриптом ?

Код

<b>ЭТО тест файл</b><br>Первый комопнент
<? $MAIN->initcomponent('forum', array ('template'=> 'default' , 'typeforum' => 'forum1','ID_COMPONENT'=>0)); ?>
<br>Второй комопнент
<? $MAIN->initcomponent('forum', array ('template'=> 'default' , 'typeforum' => 'forum5','ID_COMPONENT'=>1)); ?>


Парсер должен пробежаться по странице() если находит "<?" смотрит детально от и до завершения тега "?>"
в нутри тегов ищит "$MAIN->initcomponent(" если нашел то идет дальше находит array ('template'=> выдерет его от и до в отдельную переменную после чего смотрит на наличие 'ID_COMPONENT'=> если есть то вырезает до ) далее проверяем с номером компонента которого мы искали если совпадает то выдаем весь массив параметров. Ну если нечего не находит то идет дальше до конца документа.

Парсер должен выдать массив параметров комопнента. C меня + каждому кто поможет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)