by
ewanmc » Mon Jul 02, 2018 11:48 pm
OK, thanks KK, I'll give it a go. (I should mention that I have successfully used your technique in another site, but it is defeating me on this occasion.)
Templates
- Code: Select all
<cms:template title='Jobs' clonable="1">
<cms:repeatable name='job_tasks'>
<cms:editable name="job_task" label="Which task?" type="dropdown" opt_values='tasklist.php' dynamic='opt_values'/>
<cms:editable name="job_task_status" label="Task Status" type="dropdown" opt_values='incomplete | completed'/>
<cms:editable name="job_task_completed" label="Date completed" type="datetime"/>
<cms:editable name="job_task_notes" label="Task Notes" type="nicedit" />
</cms:repeatable>
</cms:template>
<cms:template title='Tasks' clonable="1" dynamic_folders="1" folder_masterpage='taskfolders.php'>
</cms:template>
tasklist.php
<cms:pages masterpage="tasks.php">
<cms:show k_page_name /> |
</cms:pages>
So here's the tricky stuff: (this code appears if k_is_page on jobs.php)
- Code: Select all
<input type="checkbox" name="alltask" id="select_all" value="all">All<br/>
<cms:folders masterpage="tasks.php">
<input type="checkbox" name="task" value="<cms:show k_folder_name />" class="checker"><cms:show k_folder_title /><br/>
</cms:folders>
<cms:form
masterpage=k_template_name
page_id=k_page_id
mode='edit'
enctype='multipart/form-data'
method='post'
anchor='0'
>
<cms:if k_success>
<cms:capture into='my_data' is_json='1'>
<cms:show_repeatable 'job_tasks' as_json='1' />
</cms:capture >
<cms:set taskget="<cms:gpc 'checkitout'/>" scope="global"/>
<cms:set tas_count="0" scope="global"/>
<cms:each taskget sep=',' >
<cms:set fget="<cms:show item />" scope="global"/>
<cms:folders masterpage="tasks.php">
<cms:if k_folder_name="<cms:show fget />">
<cms:pages masterpage="tasks.php" folder=k_folder_title>
<cms:set tas_count="<cms:add tas_count '1'/>" scope="global"/>
</cms:pages>
</cms:if>
</cms:folders>
</cms:each>
<div>Totaltasks: <cms:show tas_count /> </div>
<cms:set ta_count="0" scope="global"/>
<cms:capture into='my_data.' is_json='1'>
[<cms:each taskget sep=',' >
<cms:set fget="<cms:show item />" scope="global"/>
<cms:folders masterpage="tasks.php">
<cms:if k_folder_name="<cms:show fget />">
<cms:pages masterpage="tasks.php" folder=k_folder_title>
<cms:set ta_count="<cms:add ta_count '1'/>" scope="global"/>
{
"job_task" : <cms:escape_json><cms:show k_page_name /></cms:escape_json>,
"job_task_status" : <cms:escape_json>incomplete</cms:escape_json>,
"job_task_completed" : <cms:escape_json>0000-00-00</cms:escape_json>,
"job_task_notes" : <cms:escape_json>test</cms:escape_json>
}<cms:if ta_count lt "<cms:show tas_count />">,</cms:if>
</cms:pages>
</cms:if>
</cms:folders>
</cms:each>]
</cms:capture>
<cms:show my_data as_json="1" />
<cms:db_persist_form
_invalidate_cache='0'
job_tasks=my_data
/>
<cms:if k_success >
<cms:set_flash name='submit_success' value='1' />
<cms:redirect k_page_link />
</cms:if>
<cms:if k_error><div><cms:show k_error /></div></cms:if>
<cms:input type="text" name="checkitout" id="checkitout"/>
<cms:input type="submit" name="submit" value="Add these tasks"/>
</cms:form>
</div>
So when I show my_data (line 58) it displays as valid json, but I'm obviously missing something about adding repeatables. Possibly something daft, might even help to have someone else look at it. I had been leaving job_task_completed and _notes blank, but it hasn't made a difference adding values. (Unless the 0000-00-00 is invalid?)
I've missed out the javascript - it takes the checker checkboxes and creates a comma-separated list of their values, and populates the "#checkitout" value. This works fine, the data is getting through. It's just not creating the new repeatable.
In fact, I might as well add it.
- Code: Select all
<script>
$("#select_all").change(function(){
$(".checker").prop('checked', $(this).prop("checked"));
var favorite = [];
$.each($("input[name='task']:checked"), function(){
favorite.push($(this).val());
});
$("#checkitout").val(favorite.join(","));
});
$('.checker').change(function(){
var favorite = [];
if(false == $(this).prop("checked")){
$("#select_all").prop('checked', false);
}
if ($('.checker:checked').length == $('.checker').length ){
$("#select_all").prop('checked', true);
}
$.each($("input[name='task']:checked"), function(){
favorite.push($(this).val());
});
$("#checkitout").val(favorite.join(","));
});
</script>
Thanks for your help KK!