IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Веб-программирование (http://www.imho.ws/forumdisplay.php?f=29)
-   -   PHP: проблема c if и include (http://www.imho.ws/showthread.php?t=111271)

maskman 17.11.2006 11:55

PHP: проблема c if и include
 
Здравствуйте
Есть небольшая проблемка, понимание которой вне моей компетенции. Помогите решить.
Есть очень много файлов 'index.php' следущей структуры
Код:

<?php include ('head.php') ?>
<?php include ('body.php') ?>
<?php include ('bottom.php') ?>

'body.php' - в каждом файле разные
'head.php' и 'bottom.php' - для всех файлов одинаковые

Надо сделать чтобы в зависимости от уровня авторизованного пользователя скрывалось/показывалось 'body.php'

Этот вариант работает превосходно и без вопросов
Код:

<?php include ('head.php') ?>

<?php if ($access) { ?>
<?php include ('body.php') ?>
<?php } ?>

<?php include ('bottom.php') ?>

но для его раелизации мне придется изменить больше 1000 файлов 'index.php' - поэтому от отпадает.
или перерыть все 'body.php' - что тоже очень не удобно да и пркатически не возможно.

Если я вставляю начало проверки if ($access) { внутрь 'haed.php', а конец проверки } в начало 'bottom.php', то выскакивает ошибка
Parse error: parse error, unexpected $end in w:\home\webserver\www\lib\head.php on line 181

Помогите решить проблему...

RaZEr 17.11.2006 12:36

пропиши в head.php

ob_start();

а в bottom.php

$access ? ob_end_flush() : ob_end_clean();

Naked 17.11.2006 13:19

RaZEr
наверное вопрос в эту тему.... недавно тоже делал инклуды и столкнулся с похожей проблемой.... а нет ли в пхп какой-нибудь функции которая бы просто инклудила файл (т.е. как в C/C++ - там просто вставляется текст), а то как я понимаю пхп сначала парсит проинклуженные файлы, и соответственно возникают такие проблемы... (у меня случай был с функциями - т.е. две функции объявляются в разных инклудовских файлах и в итоге не видят друг друга...:( так и не нашел решения...)

RaZEr 17.11.2006 13:32

Цитата:

т.е. две функции объявляются в разных инклудовских файлах и в итоге не видят друг друга
Ни разу не сталкивался с такой проблемой. Может надо просто пересмотреть структуру программы?

maskman 17.11.2006 14:29

Цитата:

Сообщение от RaZEr
пропиши в head.php
ob_start();
а в bottom.php
$access ? ob_end_flush() : ob_end_clean();

Не свосем понял куда их поместить
вне провеки (до if { и после }) или внутрь?
проверил оба варианта.. оба не хотят работать :-(

BorLase 17.11.2006 15:01

maskman, я так понимаю, не до или после, а вместо ;)

т.е. логика такова

* ты начинаешь буферизацию последней строкой в head.php: ob_start();
* инклудишь body.php
* первой строкой в bottom.php: $access ? ob_end_flush() : ob_end_clean(); ты либо пишешь буфер в поток, если доступ дан (ob_end_flush), либо просто очищаешь буфер (ob_end_clean) - при этом твой body.php просто игнорируется

условие if в данном случае просто не нужно (его роль играет ?:; оператор)

maskman 17.11.2006 15:29

Всем огромное спасибо..
заработало..
Если позволите в продолжении дискусии и для собственного развития.
Как используя эту конструкцию написать что то наподобии
if () {} else {}

BorLase 17.11.2006 15:58

я так понимаю, ты хочешь в случае true инклудить один файл body.php, в случае false - другой?

боюсь, решение получается не очень удачное... можно попробовать в bottom.php такой финт:

PHP код:

<?
  
if($access) {
    
ob_end_flush();
  } else {
    
ob_clean(); 
?>
<? 
include ('bodyFALSE.php'?>
<?  
    ob_end_flush
();
  }
?>

проверить на работоспособность не могу (пхп нет под рукой), но общая идея примерно такая...


Часовой пояс GMT +4, время: 23:16.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.