Hola todos recien he comenzado a trabajar con modulos, pero necesito actualizar esto, ya que tengo algunas dudas al respecto, esto es lo que he hecho hasta ahora:
Cree por: localhost/sistema=gii, 2 modulos, el de admin y el de facturacion, al crearlo solo me capta estos tres elementos: modules\facturacion\FacturacionModule.php
modules\facturacion\controllers\DefaultController.php
modules\facturacion\views\default\index.php
las demas carpetas las creo a mano en protected\modules\facturacion, en el main del config actualizo esto con los modulos creados:
'gii' => array(
'class' => 'system.gii.GiiModule',
'password' => 'clave',
// If removed, Gii defaults to localhost only. Edit carefully to taste.
'ipFilters' => array('127.0.0.1', '::1'),
),
'facturacion',
'admin',
y el import puse esto:
'import' => array(
'application.models.*',
'application.components.*',
'application.extensions.*',
....
'application.modules.facturacion.*',
'application.modules.facturacion.components*',
.....
),
copio la carpeta layouts del sistema para la carpeta views del modulo y lo adapto al modulo, anteponiendo al url el camino hasta el modulo: ejemplo con este trozo de codigo, uso la extension multilevelhorizontalmenu:
array("url" => '#', 'visible' => Yii::app()->user->checkAccess("datos"),
"label" => "Salidas",
array("url" => "",
"label" => "Ventas MN",
array("url" => array(
"route" => "/facturacion/datossal/create"),
"label" => "Crer Ventas MN",),
array("url" => array(
"route" => "/facturacion/datossal/admin"),
"label" => "Administrar Ventas MN",),
),
array("url" => "",
"label" => "Ventas CUC",
array("url" => array(
"route" => "/facturacion/datossalc/create"),
"label" => "Crer Ventas en CUC",),
array("url" => array(
"route" => "/facturacion/datossalc/admin"),
"label" => "Administrar Ventas en CUC",),
),
array("url" => "",
"label" => "Transferencias de traslados",
array("url" => array(
"route" => "/facturacion/datostrans/create"),
"label" => "Crear Transferencias",),
array("url" => array(
"route" => "/facturacion/datostrans/admin"),
"label" => "Administrar Transferencias",),
),
array("url" => "",
"label" => "Movimientos de Salida",
array("url" => array(
"route" => "/facturacion/invdocumentomovs/create"),
"label" => "Crear Movimientos de Salida",),
array("url" => array(
"route" => "/facturacion/invdocumentomovs/admin"),
"label" => "Administrar Movimientos de Salida",),
),
array("url" => "",
"label" => "Prefacturas",
array("url" => array(
"route" => "/facturacion/prefacturas/admin"),
"label" => "Administrar Prefacturas",),
),
array("url" => "",
"label" => "Conduces",
array("url" => array(
"route" => "/facturacion/conduces/admin"),
"label" => "Administrar Conduces",),
),
),
......
copio la carpeta components con el fichero Controller.php del sistema a la carpeta del modulo, creo roles (uso cruge) para acceso al modulo y ese rol lo tengo en cuenta el beforeControllerAction del FacturacionModule:
public function beforeControllerAction($controller, $action)
{
if (parent::beforeControllerAction($controller, $action)) {
if (!Yii::app()->user->checkAccess("ventas", Yii::app()->user->id)) {
throw new CHttpException(403, Yii::t('yii', 'Usted no se encuentra autorizado a realizar esta acción'));
} else {
return true;
}
}
else
return false;
}
copio los controladores, model y views que tenia en el proyecto general para las carpetas asignadas en el modulo y renderizo las acciones para el modulo ej:
si tenia: controlador/accion, ahora lo tengo modulo/controlador/accion, ¿Es todo correcto esto?
Hay algunas cosas que ahora no funcionan dentro del modulo Ej: los combos dependientes no se actualizan, al seleccionar el objeto en el primer combo no muestra los resultados en segundo, a pesar que al debuguear si se ven los resultados, con estos codigos:
En el controlador
public function actionActualizarFirmantes() {
$model = NomProveedores::model()->findByPk($_POST['idCodigo']);
//llenar representantes Proveedor
$data = CHtml::listData($model->nomRepresentanteProveedor, 'CI', 'nombre');
$nomRepresentanteProveedor = "";
foreach ($data as $value => $name)
$nomRepresentanteProveedor .= CHtml::tag('option', array('value' => $value), CHtml::encode($name), true);
// return data (JSON formatted)
echo CJSON::encode(array(
'nomRepresentanteProveedor' => $nomRepresentanteProveedor,
)
);
}
1er combo en la vista
<td title="Selecione el provedor"><?php echo $form->labelEx($model, 'CodProvedor'); ?>
<?php
$this->widget('ext.select2.ESelect2', array(
'model' => $model,
'attribute' => 'CodProvedor',
'data' => CHtml::listData(NomProveedores::model()->findAll(array('order' => 'descripcion')), 'CodProvedor', 'descripcion'),
'htmlOptions' => array(
'style' => 'width: 260px;',
'placeholder' => 'Seleccione el proveedor',
'ajax' =>
array(
'type' => 'POST',
'url' => CController::createUrl('datosrecepcion/actualizarFirmantes'),
'dataType' => 'json',
'data' => array('idCodigo' => 'js:this.value'),
'success' => 'function(data) {
$("#Datosrecepcion_CI").html(data.nomRepresentanteProveedor);
}'
)
)
)
);
?>
<?php echo $form->error($model, 'CodProvedor'); ?>
</td>
Segundo combo en la vista
<td title="Selecione quien firma factura">
<?php echo $form->labelEx($model, 'CI'); ?>
<?php
echo $form->dropDownList($model, 'CI', array(), array('prompt' => 'Seleccione persona autorizada')
);
?>
<?php echo $form->error($model, 'CI'); ?>
</td>
Tampoco se muestran resultados donde tengan acciones similares a los combos, Ej:
Para seleccionar productos, lo hago con esta accion en el controlador, para mostrarlo luego en la vista:
public function actionObtenerProducto() {
$codigo = $_POST['incodigo'];
$destino = $_POST['idde'];
$productop = Subproductos::model()->findByPk((string) $codigo);
$productos = Productos::model()->find('CodSubp= :idp ', array(':idp' => $productop->Codpro));
$produmayor = Submyproductos::model()->find('Codpro=:Codpro', array(':Codpro' => $productop->Codpro));
echo CJSON::encode(array(
'descripcion' => $productop->NProductos,
'codigo' => $productop->Codpro,
'preciomn' => $productos->PreMay,
'existencia' => $produmayor->SaldoAct,
'preciocuc' => $productos->PrCUC,
'Idum' => $productop->UM,
'CodPVen' => $produmayor->CodPVen,
));
}
en la vista lo capto asi:
<table style="width:47%">
<tr>
<td width="129" title="Código de submayor">
<label>Código</label>
<?php
echo CHtml::textField('incodigo', '', array(
'id' => 'incodigo',
'ajax' => array(
'type' => 'POST',
'url' => CController::createUrl('datosrecepcion/obtenerProducto'),
'dataType' => 'json',
'data' => array(
'incodigo' => 'js:this.value', // 'idproducto' => 'js:this.value',
// 'idde' => 'js:$("#Datosrecepcion_Codde").val()',
'idde' => 'js:$("#Datosrecepcion_Codde").val()',
),
'success' => 'function(data) {
$("#producto").val(data.descripcion);
$("#existencia").val(data.existencia);
$("#Idum").val(data.Idum);
$("#preciomn").val(data.preciomn);
$("#preciocuc").val(data.preciocuc);
$("#CodPVen").val(data.CodPVen);
}')
));
?>
</td>
<td title="Cantidad a Recepcionar"><label class="selected">Cantidad</label>
<input name="text" type="text" id="incantidad" value="" size="16" />
</td>
<td colspan="3" title="Nombre del producto"><label class="odd">Producto</label>
<?php
echo CHtml::textField('producto', '', array('size' => 70, 'readonly' => true));
?>
</td>
</tr>
<tr>
<td width="140" title="Saldo actual">
<label class="odd">Existencia</label>
<input type="text" id="existencia" size="16" readonly="true"/>
</td>
<td width="140" title="Precio May sin impuesto"><label class="odd">Precio MN</label>
<input name="text2" type="text" id ="preciomn" size="16" readonly="true"/>
</td>
<td width="140" title="Precio CUC sin impuesto"><label class="odd">Precio CUC</label>
<input name="text2" type="text" id ="preciocuc" size="16" readonly="true"/>
</td>
<td width="140" title="Unidad de medida"><label class="odd">UM</label>
<input name="text2" type="text" id ="Idum" size="16" readonly="true"/>
</td>
<td width="24" title="Código del almacén"><label>Almacén</label>
<input name="text2" type="text" id ="CodPVen" size="16" readonly="true"/>
</td>
</tr>
<tr>
<td>
<input name="button" type="button" id="btnAdd" value="Adicionar Producto"/>
</td>
</tr>
</table>
Aclaro que esto si funcionaba fuera del modulo, necesito ayuda para esto ya que mi sistema se esta haciendo grande y va a tener mas modulos