2

我正在尝试创建一个带有依赖下拉框的小部件。

以下教程:http ://www.yiiframework.com/wiki/24 ,我在 ajax 部分面临以下问题:

echo CHtml::dropDownList('metal_id', 'id', $metals, array(
    'ajax' => array(
        'type' => 'POST', //request type
        'url' => CController::createUrl('currentController/dynamiccities'),
        'update' => '#product_id',
    )
));

使用 CController 是不可能的,因为我在 CWidget 内部,而不是 CController。

但是,我可以使用类似的东西:

'url' => $this->getController()->createUrl('currentController/dynamicProducts')

但是它仍然不能解决我的问题,因为它不是指小部件位置,而是指控制器文件夹。

问题 1:如何让我的 ajax 从我的 CWidget 中调用方法?

问题 2:我正在使用小部件,因为我希望此表单可在多个页面上使用。我应该创建一个局部视图吗???如果是这样,我如何将另一个控制器所需的数据传递到局部视图中?

糟糕的解决方案/解决方法:我通过在 Controllers 文件夹中创建一个 AjaxController 来让小部件工作。对这个解决方案不太满意,因为它不是很整洁。

有没有更好的解决方案?

4

3 回答 3

0

我建议看一下 CCaptcha 小部件的工作原理。

如果您创建一个新的 Yii 应用程序,它将默认设置在 site/contact.php 视图中。

以下是我将遵循的一般步骤:

  1. 创建一个DependentDropDownAction扩展类CAction。它应该处理您的 AJAX 请求。
  2. 配置actions()控制器中的方法以将该操作类用作dependentdropdown
  3. 在 DependentDropdownWidget 类中,配置一个public $action='dependentdropdown'属性
  4. 当您CHtml::dropDownList()在小部件中为您的 ajax 配置渲染时,请执行以下操作'url' => $this->getController()->createUrl($this->action)
  5. 用您的实现逻辑填充这些类,然后从您的视图中调用您的小部件
于 2013-05-10T15:47:43.970 回答
0

尝试使用如图所示的绝对 url

$this->createAbsoluteUrl('currentController/dynamicProducts');
于 2013-06-03T09:33:46.823 回答
0

尝试这个:

'url' => Yii::app()->createAbsoluteUrl('currentController/dynamiccities'),
于 2014-06-09T22:56:08.143 回答