我正在尝试创建一个带有依赖下拉框的小部件。
以下教程: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')
但是它仍然没有解决我的问题,因为它没有引用小部件位置,而是引用 Controller 文件夹。
问题 1:如何让我的 ajax 从我的 CWidget 中调用方法?
问题 2:我使用小部件是因为我希望此表单在多个页面上可用。我应该创建一个部分 View 吗???如果是这样,如何将另一个 Controller 所需的数据传递到部分 View 中?
糟糕的解决方案/解决方法:我通过在 Controller 文件夹中创建 AjaxController 使小部件正常工作。对此解决方案不太满意,因为它不是很简洁。
有更好的解决方案吗?
最佳答案
我建议您了解一下 CCaptcha 小部件的工作原理。
如果您创建一个新的 Yii 应用程序,默认情况下它将设置在 site/contact.php View 中。
以下是我将遵循的一般步骤:
- 创建一个扩展
CAction
的DependentDropDownAction
类。它应该负责处理您的 AJAX 请求。 - 在 Controller 中配置
actions()
方法,以将该操作类用作dependentdropdown
- 在 DependentDropdownWidget 类中,配置
public $action='dependentdropdown'
属性 - 当您在小部件中为 ajax 配置渲染
CHtml::dropDownList()
时,请执行类似'url' => $this->getController()->createUrl( $this->action)
- 用您的实现逻辑填充这些类,然后从您的 View 中调用您的小部件
关于jquery - Yii CWidget - 依赖下拉菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16440695/