@@ -190,7 +190,7 @@ public function actionSave(): ?Response
190190
191191 // Populate model
192192 $ iconSet ->name = $ request ->getBodyParam ('name ' );
193- $ iconSet ->handle = $ request ->getBodyParam ('handle ' );
193+ $ iconSet ->handle = $ this -> _generateUniqueHandle ( $ request ->getBodyParam ('handle ' ), $ iconSetId );
194194 $ iconSet ->type = $ request ->getBodyParam ('type ' );
195195 $ iconSet ->enabled = (bool )$ request ->getBodyParam ('enabled ' );
196196
@@ -619,4 +619,52 @@ public function actionDeleteBackup(): Response
619619
620620 return $ this ->redirectToPostedUrl ();
621621 }
622+
623+ /**
624+ * Generate a unique handle by appending a number if needed
625+ *
626+ * @param string $handle The desired handle
627+ * @param int|null $currentIconSetId The current icon set ID (to exclude from duplicate check)
628+ * @return string A unique handle
629+ */
630+ private function _generateUniqueHandle (string $ handle , ?int $ currentIconSetId = null ): string
631+ {
632+ // Check if handle already exists
633+ $ query = (new \craft \db \Query ())
634+ ->from ('{{%iconmanager_iconsets}} ' )
635+ ->where (['handle ' => $ handle ]);
636+
637+ // Exclude current icon set if editing
638+ if ($ currentIconSetId ) {
639+ $ query ->andWhere (['not ' , ['id ' => $ currentIconSetId ]]);
640+ }
641+
642+ // If handle is unique, return as-is
643+ if (!$ query ->exists ()) {
644+ return $ handle ;
645+ }
646+
647+ // Handle is taken, generate unique one by appending number
648+ $ baseHandle = $ handle ;
649+ $ i = 1 ;
650+
651+ // Keep incrementing until we find a unique handle
652+ while (true ) {
653+ $ newHandle = $ baseHandle . $ i ;
654+
655+ $ query = (new \craft \db \Query ())
656+ ->from ('{{%iconmanager_iconsets}} ' )
657+ ->where (['handle ' => $ newHandle ]);
658+
659+ if ($ currentIconSetId ) {
660+ $ query ->andWhere (['not ' , ['id ' => $ currentIconSetId ]]);
661+ }
662+
663+ if (!$ query ->exists ()) {
664+ return $ newHandle ;
665+ }
666+
667+ $ i ++;
668+ }
669+ }
622670}
0 commit comments