Пробема с путями

Beckie

Новичок
Пробема с путями

Выдается ошибка:
ERRNO: 8
TEXT: Undefined property: DepartmentsList::$mCategoriesCell
LOCATION: C:\wamp\www\htdocs\shop\presentation\templates_c\1093619261.file.store_front.tpl.php, line 89, at November 16, 2009, 9:08 pm
Showing backtrace:
include("C:\wamp\www\htdocs\shop\presentation\templates_c\1093619261.file...") # line 431, file: C:\wamp\www\htdocs\shop\libs\smarty\sysplugins\smarty_internal_template.php
Smarty_Internal_Template.renderTemplate() # line 516, file: C:\wamp\www\htdocs\shop\libs\smarty\sysplugins\smarty_internal_template.php
Smarty_Internal_Template.getRenderedTemplate() # line 312, file: C:\wamp\www\htdocs\shop\libs\smarty\Smarty.class.php
Smarty.fetch("store_front.tpl", null, null, null) # line 333, file: C:\wamp\www\htdocs\shop\libs\smarty\Smarty.class.php
Smarty.display("store_front.tpl") # line 32, file: C:\wamp\www\htdocs\shop\index.php


А вот внутри 1093619261.file.store_front.tpl.php вот такое:

PHP:
$_smarty_tpl->decodeProperties('a:1:{s:15:"file_dependency";a:2:{s:11:"F2106305833";a:2:{i:0;s:62:"[B]C:\wamp\www\htdocs\shop/presentation/templates\store_front.tpl[/B]";i:1;i:1195995322;}s:11:"F1502188778";a:2:{i:0;s:67:"C:\wamp\www\htdocs\shop/presentation/templates\departments_list.tpl";i:1;i:1195046498;}}}');
Настройки Smarty:
$this - это продолжение класса Smarty.
PHP:
    $this->template_dir = TEMPLATE_DIR;
    $this->compile_dir = COMPILE_DIR;
    $this->config_dir = CONFIG_DIR;
    $this->plugins_dir[0] = SMARTY_DIR . 'plugins';
    $this->plugins_dir[1] = PRESENTATION_DIR . 'smarty_plugins';



Содержимое файла константов:

PHP:
// SITE_ROOT contains the full path to the tshirtshop folder
define('SITE_ROOT', dirname(dirname(__FILE__)));

// Application directories
define('PRESENTATION_DIR', SITE_ROOT . '/presentation/');
define('BUSINESS_DIR', SITE_ROOT . '/business/');

// Settings needed to configure the Smarty template engine
define('SMARTY_DIR', SITE_ROOT . '/libs/smarty/');
define('TEMPLATE_DIR', PRESENTATION_DIR . 'templates');
define('COMPILE_DIR', PRESENTATION_DIR . 'templates_c');
define('CONFIG_DIR', SITE_ROOT . '/include/configs');


httpd.conf Root:
DocumentRoot "c:/wamp/www/htdocs/"


Почему пути в Smarty другие? Как эту проблему решить? :rolleyes:

-~{}~ 17.11.09 00:14:

Нашле проблему вот тут {include file=$obj->mCategoriesCell}

Теперь осталось выяснить, почему объект undefined.

Но вопрос про пути все еще открыт. :rolleyes:

-~{}~ 17.11.09 13:56:

Когда вместо
PHP:
{include file=$obj->mCategoriesCell}
Прописываю в ручную вот так:

PHP:
{include file="categories_list.tpl"}
То список выводится.

Вот содержимое для store_front.tpl, а точнее то, что хоть как-то относится к содержимому переменной, на которую ругаются :

PHP:
  public $mCategoriesCell = 'blank.tpl';

  // Initialize presentation object
  public function init()
  {
    // Load department details if visiting a department
    if (isset ($_GET['DepartmentId']))
    {
      $this->mContentsCell = 'department.tpl';
      $this->mCategoriesCell = 'categories_list.tpl';
    }
    elseif (isset($_GET['ProductId']) && 
            isset($_SESSION['link_to_continue_shopping']) &&
            strpos($_SESSION['link_to_continue_shopping'], 'DepartmentId', 0)
            !== false)
    {
      $this->mCategoriesCell = 'categories_list.tpl';
    }

    // Load product details page if visiting a product
    if (isset ($_GET['ProductId']))
      $this->mContentsCell = 'product.tpl';

    // Load the page title
    $this->mPageTitle = $this->_GetPageTitle();
  }
Вот содержимое blank.tpl:

{* Smarty blank page *}




Остальные функции там ответственны за парсинг url и title.
 

Beckie

Новичок
На главной его и не должно быть.

Чет помоему там еще условия не хватает, как-то я проглядел.

Не? :)

А не, ну все правильно, по дефолту стоит пустышка. Если категория выбрана, то переменная получает название темплейта и дальше уже генерится новый объект под список подкатегорий для выбранной категории.

Сейчас с условиями поиграю в самом темплейте. Тут точно чет не чисто.

-~{}~ 17.11.09 14:34:

{$obj->mCategoriesCell|count_characters} выводит 0

Странно, распечатал содержимое $_GET, все там есть. Так почему же переменная не получает названия темплейта?

-~{}~ 17.11.09 14:48:

Есть предположения?

-~{}~ 17.11.09 14:58:

Все нашел проблему. Конфликт был в названии объектов.

Переименовал объект в Smarty и все заработало.

{load_presentation_object filename="store_front" assign="objn"}
{load_presentation_object filename="categories_list" assign="obj"}
{load_presentation_object filename="departments_list" assign="obj"}

-~{}~ 20.11.09 15:07:

Как исправить это? :|

C:\wamp\www\htdocs\shop/presentation/templates\store_front.tpl

-~{}~ 20.11.09 15:08:

"/presentation/" - констант PRESENTATION_DIR
 

dimagolov

Новичок
Beckie, перестань использовать обратные слеши в путях. php даже под виндой прекрасно понимает прямой слеш (/) как разделитель пути, а его экранировать в строках не нужно, ну и совместимость с *NIX
 

Beckie

Новичок
Короче вместо:

define('SITE_ROOT', dirname(dirname(__FILE__)));

Поставил:

define('SITE_ROOT', $_SERVER['DOCUMENT_ROOT']);

Потер задние слэшы в константах и удалил временные файлы smarty.

Все заработало.

Кто-то может мне объяснить, зачем используют dirname(dirname(__FILE__)) вместо $_SERVER['DOCUMENT_ROOT'] ?

Это делается для совместимости с win32 и Linux?

Да это я по книге учусь. Отличная книга, только код ковыряю под себя. Там PDO используется и процедуры в mysql, ну и разбор полетов по headers. Очень познавательно. :)

Да я думаю использовать defined('DS') ? null : define('DS', DIRECTORY_SEPARATOR); для слэша.
 

dimagolov

Новичок
DIRECTORY_SEPARATOR - 19 символов, '/' - 3 cимвола. ну и строка
PHP:
$path= "lev1/lev2/lev3/";
немного более читабельна, чем
PHP:
$path= "lev1".DIRECTORY_SEPARATOR."lev2".DIRECTORY_SEPARATOR."lev3".DIRECTORY_SEPARATOR;
ну а работает идентично

про dirname(dirname(__FILE__)):
это указывает на директорию текущего ФАЙЛА, а не исполняемого скрипта, что в большинстве случаев не совпадает с $_SERVER['DOCUMENT_ROOT'] и может вообще быть вне него.
 
Сверху