【发布时间】:2010-03-29 10:03:13
【问题描述】:
我有一个视图助手来管理为图像生成缩略图。图像使用唯一 ID 存储,然后链接到数据库中的文件资源。
我正在尝试找出生成这些图像的视图助手是否可以直接访问模型或控制器,因为无法在控制器工作流程中的任何其他点加载图像数据。
我知道这确实有点像 hack,但它比尝试在视图上方重建整个数据管理堆栈更容易。
【问题讨论】:
我有一个视图助手来管理为图像生成缩略图。图像使用唯一 ID 存储,然后链接到数据库中的文件资源。
我正在尝试找出生成这些图像的视图助手是否可以直接访问模型或控制器,因为无法在控制器工作流程中的任何其他点加载图像数据。
我知道这确实有点像 hack,但它比尝试在视图上方重建整个数据管理堆栈更容易。
【问题讨论】:
如果您在模型或控制器中设置了数据,则可以访问它。所以你必须在控制器中提前考虑。正如你所说,你不能在控制器中加载它,也许你需要编写一个特定的控制器函数,你可以使用 $this->requestAction() 从视图中调用它,并传入图像名称或类似参数作为参数。
这样做的唯一缺点是不赞成使用 requestAction(),因为它会启动一个全新的调度周期,这可能会稍微减慢您的应用程序。
另一个可行的方法是创建一个动态元素并将参数传入元素并让它为您创建图像。虽然我不太确定这在实践中是如何工作的。
如果您没有将数据从控制器或模型传递到视图中,您将如何使用视图中的帮助器生成缩略图?我的意思是,如果是我,我会在控制器中设置“数据库资源”,并以这种方式将其传递给视图,然后让助手在视图中处理它。这样你就可以完全绕过这个问题:)
【讨论】:
$this->params['controller'] 会返回你想要的。
根据...您可以将此代码放在 view.ctp 文件中,然后打开 URL 以呈现调试信息:
$cn = get_class($this);
$cm = get_class_methods($cn);
print_r($cm);
die();
【讨论】:
您可以编写一个助手并构建一个静态函数 setController() 并将引用作为参数传递,然后将其存储在助手类的静态变量中:
class FancyHelper extends FormHelper {
static $controller;
public static function setController($controller) {
self::$controller = $controller;
}
... more stuff
}
然后在您的 Controller 类中,您可以导入 FancyHelper 类并在 beforeFilter 函数中进行静态分配:
App::uses('FancyHelper', 'View/Helper');
class FancyController extends AppController {
public $helpers = array('Fancy');
function beforeFilter() {
FancyHelper::setController($this);
}
... more stuff
}
然后您可以使用 self::$controller 从 FancyHelper 中的其他公共函数访问控制器。
【讨论】: