Para Desenvolvedores

atualizar outro source do mesmo doui

Resolvido

Tenho um douiDefinition que contem a seguinte estrutura:

<sources>
			<source id="default" type="contentTable">
				<table>sn_internalspecialpages</table>
				<fields>
					<field id="id" name="id" dataType="guid" required="true" isPrimaryKey="true" display="false" />
					<field id="title" name="STR_TITLE" dataType="string" required="true" isPrimaryName="true" isSearchable="true" />
					<field id="appearance" name="STR_APPEARANCE" dataType="string" required="true">
						<options>
							<option value="white">Claro</option>
							<option value="black">Escuro</option>
						</options>
					</field>
					<field id="banner" name="STR_BANNER" dataType="html" required="true" />
					<field id="content" name="STR_CONTENT" dataType="html" required="true" isSearchable="true" />
				</fields>
				<metaData>
					<comments/> 
					<highlight/>
					<publishToServiceInstances/>
					<association/>
					<publishStartDate/>
					<publishEndDate/>
					<publishToPrincipals/>
					<versioning/>
					<workflow/>
					<tag/>
					<categorization/>
					<seo/>
				</metaData>
			</source>
			
			
			<source id="items" type="contentTable">
				<table>sn_internalspecialpages_buttons</table>
				<fields>
					<field id="id" name="id" dataType="guid" required="true" isPrimaryKey="true" display="false" />
					<field id="title" name="STR_TITLE" dataType="string" required="true" isPrimaryName="true" isSearchable="true" />
					<field id="button" name="STR_BUTTONS" dataType="html" required="true" isSearchable="true" />
					<field id="position" name="STR_POSITION" dataType="integer" required="true" isPosition="true" />
					<field id="menuGroupContentId" name="menuGroupContentId" dataType="guid" required="true" display="false">
						<defaultInputControl>
							<control:lum_inputHidden id="menuGroupContentId">
								<control:lum_requiredValueValidator/>
							</control:lum_inputHidden>
						</defaultInputControl>
					</field>
				</fields>
				<relations>
					<relation id="default" cascadeOnDelete="true">
						<relationField fieldId="menuGroupContentId" foreignFieldId="contentId"/>
					</relation>
				</relations>
			</source>
			
		</sources>

Onde o source "Items" é filho do source "default", porém ao cadastrar um novo item no source "Items", as paginas que contém uma interface de detalhes do source "default" não são regeradas, portanto não são atualizadas até que o cache seja regerado manualmente, como eu conseguiria forçar essa regeração da pagina do pai de um item no "Items"?

 

Por Alan Loiola

Em 09/10/19 19:13

Acompanhar pergunta

1 resposta(s):

Ordenar por:

Nas interfaces de edit, add e admin do item, deve-se acrescentar uma processAction que força a geração do cache do pai.

<interface id="adminItems">
			<sources>
				<source id="items">
					<fields>
						<field id="id" display="false" />
						<field id="title" />
						<field id="lastModifiedDate" display="true" />
						<field id="position"/>
						<field id="workflowState"/>
						<field id="workflowAssignedTo" />
					</fields>
					<filters>
						<filter id="menuGroupContentId" hidden="true" required="true"/>
						<filter id="title" operator="like" />
						<filter id="workflowState"/>
						<filter id="workflowAssignedTo" />
					</filters>
				</source>
				<source id="default">
					<fields>
						<field id="id"/>
						<field id="contentId"/>
					</fields>
					<filters>
						<filter id="id" hidden="true" requestParameterName="groupItemId" required="true"/>
					</filters>
				</source>
			</sources>
			<controls>
				<control:lum_form >
					<control:lum_filters sourceId="default"/>
					<control:lum_inputHidden id="menuGroupContentId" sourceId="default" dataId="contentId">
						<setSourceParameter sourceId="items" parameterName="menuGroupContentId"/>
					</control:lum_inputHidden>
					<control:lum_interfaceHeader />
					<control:lum_interfaceHeaderButtons id="lumInterfaceHeaderButtons" tabularDataControlId="adminList.tabulardata" >
						<control:lum_addButton isPrimary="true" >
							<onClick type="script">
								<script><![CDATA[
									if($("#menuGroupContentId").val().length == 0)
									{
										alert("Não foi possível obter o identificador do Grupo de Menu.");
										return false;
									}
								]]></script>
							</onClick>
							<onClick type="popupRunTimeInterface" openRuntimeInterfaceBehavior="replace">
								<interfaceId>addItem</interfaceId>
								<addParameters>
									<parameter name="menuGroupContentId">
										<value controlId="menuGroupContentId" type="getValue" />
									</parameter>
								</addParameters>
							</onClick>
						</control:lum_addButton>
					<control:lum_positionFieldOrderButton />
						<control:lum_editButton/>
						<control:lum_deleteButton />
					</control:lum_interfaceHeaderButtons>
					<control:lum_adminList id="adminList" dataId="id" sourceId="items" />
				</control:lum_form>
			</controls>
			 <processActions>
		        <processAction id="delete" actionId="delete" className="br.com.bancosafra.safranet.service.internalspecialpages.NotifyContentChangedProcessActionHandler">
					<fieldValues>
						<fieldValue id="notificationSource">default</fieldValue>
						<fieldValue id="notificationContentField">menuGroupContentId</fieldValue>
					</fieldValues>
				</processAction>
				<processAction id="delete"  type="contentTableDeleteData">
					<response type="doui_standardCommit"></response>
				</processAction>
			</processActions> 
		</interface>

<interface id="editItem">
			<sources>
				<source id="items" />
				<source id="default" />
			</sources>
			<controls>
				<control:lum_form>
					<control:lum_inputHidden id="menuGroupContentId" sourceId="items" />
					<control:lum_propertyPage>
						<control:lum_filters id="editItem.lumFilters" />
						<control:lum_autoLayoutContentFields id="editItem_Fields">
							<field id="title" />
							<field id="button" />
							<field id="position" />
						</control:lum_autoLayoutContentFields>
						<control:lum_autoLayoutMetaDataInformation />
					</control:lum_propertyPage>
				</control:lum_form>
			</controls>
			<processActions>
				<processAction id="commit"  type="contentTableUpdateData">
				</processAction>
				<processAction id="notifyParentContentChange" actionId="commit" className="br.com.bancosafra.safranet.service.internalspecialpages.NotifyContentChangedProcessActionHandler">
					<fieldValues>
						<fieldValue id="notificationSource">default</fieldValue>
						<fieldValue id="notificationContentField">menuGroupContentId</fieldValue>
					</fieldValues>
					<response type="doui_standardCommit" />
				</processAction>
			</processActions>
		</interface>

Esta configuração deve ser aplicada para a interface de add, edit e de adminitração para a action de "delete", após isso deve-se criar a classe para o Porcess Action, onde o "notificationContentFiel" é a chave estrangeira do item filho para o item pai, e o "notificationSourde" é o id do source que deve ser atualizado, ambos estão recebendo os valores pelas variavies impostas dentro do DOUI, no parametro <fieldValues>

public class NotifyContentChangedProcessActionHandler extends GenericProcessActionHandler {

	@Override
	public void processAction() throws PortalException {
		super.processAction();
		
		// Notify content changed
		String contentId;
		if(("delete").equals(this.id)){
			contentId = this.processActionContainer.getDouiContext().getStoredValues().get("doui_SourceParameter.items.menuGroupContentId");
		}else{
			contentId = (String) this.getParameter((String) this.getParameter("notificationContentField"));
		}
		
		ContentLocale contentLocale = ContentManagerFactory.getContentManager().getContent(contentId).getContentLocale(SessionConfig.getCurrentSessionConfig().getLocale(), true);
		if(contentLocale.getPublishedVersion() != null)
		{
			ContentVersion contentVersion = contentLocale.getPublishedVersion();
			String sourceDefault = (String) this.getParameter("notificationSource");
			
			ContentRenderDataChangedEvent event = new ContentRenderDataChangedEvent(
					sessionConfig, contentVersion, (ContentTableSource)source.getSourceContainer().getSourceById(sourceDefault), transaction);
			event.setOperationType(PortalEventOperationType.UPDATE);
			ManagerFactory.getPortalEventManager().notifyObservers(event);
		}
	}
	
	
}

 

Por Alan Loiola

Em 09/10/19 19:26
Editado em 10/10/19 17:48

Entrar

Interaja com a comunidade e tenha acesso a conteúdos exclusivos.

Houve algum erro ao acessar o banco de dados. Tente novamente mais tarde.