В приложении CakePHP у меня есть модель Acccount. Я хочу, чтобы у каждой учетной записи была собственная подпапка в папке webroot / img. Я могу без проблем создавать подпапки.

Проблема состоит в том, чтобы универсально определить, какой путь является текущим по умолчанию. Я могу получить идентификатор учетной записи из Auth.User.account_id.

Вместо того, чтобы изменять путь img в каждом представлении, где это требуется, путем введения Auth.User.account_id, я подумал, что было бы лучше динамически изменить путь к изображению по умолчанию, прочитав значение в файле core.php и изменив 'imageBaseUrl' там, поэтому он доступен во всем приложении.

Однако я не нашел документации о том, как вносить переменные в файл core.php. Я понимаю, что это файл, предназначенный для доставки переменных в приложение, поэтому, возможно, это невозможно.

Я попытался передать значение Configure :: write, как показано ниже, но, похоже, оно не читается в файле core.php.

* Web path to the public images directory under webroot.
* If not set defaults to 'img/'
Configure::write('App.imageBaseUrl', 'img/'.Configure::write('imageurl').'/');

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

0
curtisp 27 Июл 2014 в 11:07

2 ответа

Лучший ответ

При необходимости вы можете изменить значение для App.imageBaseUrl в обратном вызове beforeRender() вашего AppController. Нет необходимости изменять его до этого момента, поскольку значение требуется только в представлениях. Кроме того, у вас будет доступен компонент сеанса.

2
ADmad 27 Июл 2014 в 17:11
Он также работает в AppController перед фильтром (), так что тот же вопрос об этом; где находится «правильное» или «лучшее» (наиболее эффективное?) место для изменения значения «img» в Configure::write('App.imageBaseUrl', 'img')? Я полагаю, что если я хочу передать новую папку контроллеру, лучше всего использовать beforeFilter. В противном случае это не имеет значения? Спасибо
 – 
curtisp
27 Июл 2014 в 22:20
Поскольку это относится к представлению, делать это нужно в beforeRender(). Это также более эффективно, поскольку позволяет избежать дополнительной инструкции для запроса POST, когда вы обычно просто перенаправляете после выполнения необходимой операции в действии. Если вы хотите, чтобы информация о новой папке была доступна в действии, вы бы сделали это в beforeFilter(), но на самом деле не понимаете, почему действие должно заботиться о местоположении актива.
 – 
ADmad
28 Июл 2014 в 07:19

Лучше не изменять core.php. Попробуйте этот фрагмент кода в начале файла app / Config / bootstrap.php:

App::uses('CakeSession', 'Model/Datasource');
Configure::write('App.imageBaseUrl', 'img/' .
    (CakeSession::check('Auth.User') ? CakeSession::read('Auth.User.account_id') . '/' : ''));
0
Progredi Digital 27 Июл 2014 в 16:14
Это сработало, поэтому не уверен, почему за это проголосовали. Однако он также работает в AppController перед Render(), как описывает ADmad. Может ли кто-нибудь объяснить понижение и/или правильное место для этого, например, AppController перед Render или bootstrap.php?
 – 
curtisp
27 Июл 2014 в 21:58