Cytat(ikssde @ 21.11.2014, 10:22:06 )

Pokaż trochę więcej tego kodu bo po jednej linijce to niewiele można wnioskować.
W tym momencie po przypisaniu zmiennych do składowej klasy parsuje się kod do bloku HTML, który zostaje dodany do tablicy. W którymś z tych momentów gubi sie cała tablica z danego $block_path w tablicy.
function parse( $block_path = NULL ) {
// inicjacja zmiennej block_path
$block_path = $block_path ? $block_path : $this->root;
// znajdzmy pattern potrzebny do wydobycia poszukiwanego bloku
$pattern = $this->__gen_pattern( $block_path );
// sprawdzam, czy w/g takiego wzoru znajdziemy blok
if ( !preg_match( $pattern, $this->source, $matches ) ) { $this->__set_error( "Błąd w strukturze szablonu, nie mogę sparsować bloku ( ścieżka: '$block_path' )." );
} else {
// znaleziono blok o podanej sciezce, jego zawartosc to $matches[1];
//sprawdzam czy bylo cos wczesniej parsowane dla tego bloku
if ( empty( $this->blocks[$block_path] ) ) { // ten blok nie ma w sobie sparsowanych blokow
$this->parsed_string = ( $matches[1] );
} else {
//if ( $block_path == 'table' ) print_r($this->blocks[$block_path] );
// posiada juz jakas zawartosc
// dla wszystkich subblokow tego bloku trzeba wymienic to co miedzy komentarzami na wczesniej sparsowaną zawartosc
foreach ( $this->blocks[$block_path] as $subblock_name => $value ) {
// zamien to co dostalem z matches na sparsowany string wg nazwy dziecka ( $key )
$pattern2 = "/<!--\s+BEGIN\s+BLOCK:\s*" . $subblock_name . "\s+-->(.*)<!--\s+END\s+BLOCK:\s*" . $subblock_name . "\s+-->/s";
$matches[1
] = preg_replace( $pattern2, $value, $matches[1
] ); // ta zawrtosc jest juz przypisana, nalezy sie jej pozbyc aby sie nie zdublowala
unset( $this->blocks[$block_path][$subblock_name] ); }
// wszystkie wewn bloki zostaly włączone do tego bloku
$this->parsed_string = ( $matches[1] );
}
// czyscimy z blokow ktore w tej iteracji nie beda parsowane
$this->__clear_string( );
// przypisuje zmienne
$this->__assign_vars( );
// tak przygotowany blok zapisuje do tabeli blokow
$this->__save_block( $block_path );
}
}
function __clear_string( ) {
// sprawdzam czy w sparsowanym ciągu są jakieś szablonowe wpisy
preg_match_all( "/<!--\s+BEGIN\s+BLOCK:(.*?)-->/s", $this->parsed_string, $m ) ; // jesli coś jest, należy je usunąć
foreach ( $m[1] as $block_name ) {
// tworze wzor do usuniecia
$pattern = "/<!--\s+BEGIN\s+BLOCK:\s*" . trim($block_name). "\s+-->.*?<!--\s+END\s+BLOCK:\s*" . trim($block_name) . "\s+-->/s"; $this->parsed_string = trim( preg_replace( $pattern, '', $this->parsed_string ) ); }
}
}
function __assign_vars( ) {
// jesli w parsowanym tekscie są jakies zmienne
// zmienne bez spacji, hotfix dla jquery glownie
if ( preg_match_all( "/{([^\s]*?)}/s", $this->parsed_string, $block_vars ) ) { // przypisz te z tablicy zmiennych jesli sie zgadaja, lub gdy nie mają
// odpowiednika przypisz ''
foreach ( $block_vars[1] as $var ) {
// wyczysc quote
// inicializacja
// przypisuje wartosci z tablicy zmiennych lub ''
{
// nie ma kropki w nazwie
if ( !isset( $this->vars[$var] ) ) $this->vars[$var] = ''; $this->parsed_string = preg_replace( $pattern, $this->vars[$var], $this->parsed_string ); }
else
{
// jest kropka w nazwie
if ($exp[0] == '_inc')
{
$inc = new rs_template(TPL_INC . $exp[1] . '.tpl');
$this->parsed_string = preg_replace( $pattern, $inc->out(), $this->parsed_string ); } else if ($exp[0] == '__inc')
{
$inc = new rs_template(TPL_INC . $exp[1] . '.tpl');
$this->parsed_string = preg_replace( $pattern, $inc->source, $this->parsed_string ); } else if( $exp[0] == '__ext' )
{
$inc = new rs_template(TPL_EXT . $exp[1] . '.tpl');
$this->parsed_string = preg_replace( $pattern, $inc->source, $this->parsed_string ); } else {
$this->parsed_string = preg_replace( $pattern, $this->vars[$exp[0
]][$exp[1
]], $this->parsed_string ); }
}
}
}
}
function __save_block( $block_path ) {
// potrzebujemy odzielic rodzica parsowanego bloku
if ( $block_path == $this->root ) {
$this->root_parsed = TRUE;
// okazuje sie ze jest to glowny blok
$this->blocks[$this->root] = ( $this->parsed_string );
} else {
// odzielamy nazwy blokow od siebie
$expath = explode( '.', $block_path ); // zapisuje nazwe dziecka i zdejmuje z ja konca tablicy
//
$parent_path = implode( '.', $expath ); // inicjalizacja indexów aby nie bylo NOTICE!
if ( !isset( $this->blocks[$parent_path] ) ) $this->blocks[$parent_path] = '';
if ( !isset( $this->blocks[$parent_path][$kid] ) ) $this->blocks[$parent_path][$kid] = '';
// przypisujemy dzieciaka do tablicy blokow od rodzica
$this->blocks[$parent_path][$kid] .= ( $this->parsed_string );
}
// zmienna przygotowana do nastepnego bloku
$this->parsed_string = '';
}