isValid() ){
$gContent->verifyUpdatePermission();
}else{
$gContent->verifyCreatePermission();
}
if( !empty( $_REQUEST['savegallery'] ) ) {
if( $gContent->store( $_REQUEST ) ) {
$gContent->load();
header("location: ".$gContent->getDisplayUrl() );
die();
}
} elseif( !empty( $_REQUEST['delete'] ) ) {
$gContent->hasUserPermission( 'p_stock_admin', true); // , KernelTools::tra( "You do not have permission to delete this image gallery" ) );
if( !empty( $_REQUEST['cancel'] ) ) {
// user cancelled - just continue on, doing nothing
} elseif( empty( $_REQUEST['confirm'] ) ) {
$formHash['delete'] = true;
$formHash['content_id'] = $gContent->mContentId;
$formHash['input'] = [
'',
'',
];
$gBitSystem->confirmDialog( $formHash,
[
'warning' => KernelTools::tra('Are you sure you want to delete this assembly?') . ' ' . $gContent->getTitle(),
'error' => KernelTools::tra('This cannot be undone!'),
],
);
} else {
$userId = $gContent->getField( 'user_id' );
$gContent->pRecursiveDelete = !empty( $_REQUEST['recurse'] ) && ($_REQUEST['recurse'] == 'all');
if( $gContent->expunge() ) {
header( "Location: ".STOCK_PKG_URL.'?user_id='.$userId );
}
}
} elseif( !empty($_REQUEST['cancelgallery'] ) ) {
header( 'Location: '.$gContent->getDisplayUrl() );
die();
} elseif( $gContent->isValid() && !empty( $_REQUEST['upload_bom_csv'] ) ) {
$csvLoaded = $csvSkipped = 0;
$csvErrors = [];
if( !empty( $_FILES['csv_file']['tmp_name'] ) && is_uploaded_file( $_FILES['csv_file']['tmp_name'] ) ) {
$origName = preg_replace( '/[^a-zA-Z0-9_-]/', '_', pathinfo( $_FILES['csv_file']['name'], PATHINFO_FILENAME ) );
$savedBom = STOCK_IMPORT_PATH . $origName . '_bom_' . $gContent->mContentId . '.csv';
move_uploaded_file( $_FILES['csv_file']['tmp_name'], $savedBom );
// Valid BOM unit types (MOV is for movements, not BOM lines)
$validItems = [ 'SGL', 'PRT', 'SHT', 'VOL' ];
if( ($fh = fopen( $savedBom, 'r' )) !== false ) {
$rowNum = 0;
while( ($cols = fgetcsv($fh, 0, ',', '"', '')) !== false ) {
$rowNum++;
$componentTitle = trim( $cols[0] ?? '' );
if( $componentTitle === '' || strtolower( $componentTitle ) === 'component' ) continue;
$xorder = (int)( $cols[1] ?? 0 );
$xkey = trim( $cols[2] ?? '' );
$item = strtoupper( trim( $cols[3] ?? 'SGL' ) );
$xkeyExt = trim( $cols[4] ?? '' ) ?: null;
$data = trim( $cols[5] ?? '' ) ?: null;
if( !in_array( $item, $validItems ) ) {
$item = 'SGL';
}
if( empty( $componentTitle ) ) {
$csvErrors[] = KernelTools::tra('Row')." $rowNum: ".KernelTools::tra('empty component name');
$csvSkipped++;
continue;
}
$compId = $gBitDb->getOne(
"SELECT lc.`content_id` FROM `".BIT_DB_PREFIX."liberty_content` lc
WHERE lc.`content_type_guid` = 'stockcomponent' AND lc.`title` = ?",
[ $componentTitle ]
);
if( !$compId ) {
$csvErrors[] = KernelTools::tra('Row')." $rowNum: ".KernelTools::tra('component not found').' — '.htmlspecialchars( $componentTitle );
$csvSkipped++;
continue;
}
$xrefObj = new \Bitweaver\Liberty\LibertyXref();
$xrefObj->mContentTypeGuid = STOCKASSEMBLY_CONTENT_TYPE_GUID;
$pHash = [
'content_id' => $gContent->mContentId,
'item' => $item,
'xorder' => $xorder,
'xref' => $compId,
'xkey' => $xkey,
'xkey_ext' => $xkeyExt,
'edit' => $data,
];
$existingId = $gBitDb->getOne(
"SELECT `xref_id` FROM `".BIT_DB_PREFIX."liberty_xref`
WHERE `content_id`=? AND `item`=? AND `xorder`=?",
[ $gContent->mContentId, $item, $xorder ]
);
if( $existingId ) {
$xrefObj->load( $existingId );
$pHash['xref_id'] = $existingId;
}
if( $xrefObj->store( $pHash ) ) {
$csvLoaded++;
} else {
$csvErrors[] = KernelTools::tra('Row')." $rowNum: ".KernelTools::tra('failed to store').' '.htmlspecialchars($componentTitle);
$csvSkipped++;
}
}
fclose($fh);
}
}
$gBitSmarty->assign( 'csvLoaded', $csvLoaded );
$gBitSmarty->assign( 'csvSkipped', $csvSkipped );
$gBitSmarty->assign( 'csvErrors', $csvErrors );
} elseif( $gContent->isValid() ) {
foreach( $_REQUEST as $k => $v ) {
if( preg_match( '/^remove_component_(\d+)$/', $k, $m ) ) {
$gContent->removeItem( (int)$m[1] );
header( 'Location: '.STOCK_PKG_URL.'edit_assembly.php?content_id='.$gContent->mContentId );
die();
}
}
}
// Initalize the errors list which contains any errors which occured during storage
$errors = !empty($gContent->mErrors) ? $gContent->mErrors : [];
$gBitSmarty->assign('errors', $errors);
if( $gContent->isValid() ) {
$sortMode = $_REQUEST['sort_mode'] ?? 'item_position_asc';
$gBitSmarty->assign( 'componentMap', $gContent->getComponentMapList($sortMode) );
$gBitSmarty->assign( 'sortMode', $sortMode );
}
$gContent->loadXrefInfo();
if( isset( $gContent->mXrefInfo->mGroups['stgrp'] ) ) {
if( isset( $gContent->mXrefInfo->mGroups['kitlocker'] ) ) {
$gContent->mXrefInfo->mGroups['kitlocker']->mXrefs = array_merge(
$gContent->mXrefInfo->mGroups['kitlocker']->mXrefs,
$gContent->mXrefInfo->mGroups['stgrp']->mXrefs
);
}
unset( $gContent->mXrefInfo->mGroups['stgrp'] );
}
$gBitSmarty->assign( 'gXrefInfo', $gContent->mXrefInfo );
$gContent->invokeServices( 'content_edit_function' );
$gBitSystem->display( 'bitpackage:stock/edit_assembly.tpl', KernelTools::tra('Edit Assembly: ').$gContent->getTitle() , [ 'display_mode' => 'edit' ]);