Plugin Directory

Changeset 3422911


Ignore:
Timestamp:
12/18/2025 01:32:40 PM (3 months ago)
Author:
hmbashar
Message:

Update to version 1.2.0 from GitHub

Location:
edu-results-publishing
Files:
40 added
1 deleted
29 edited
1 copied

Legend:

Unmodified
Added
Removed
  • edu-results-publishing/assets/banner-772x250.png

    • Property svn:mime-type changed from application/octet-stream to image/png
  • edu-results-publishing/assets/icon-128x128.png

    • Property svn:mime-type changed from application/octet-stream to image/png
  • edu-results-publishing/assets/screenshot-1.png

    • Property svn:mime-type changed from application/octet-stream to image/png
  • edu-results-publishing/assets/screenshot-2.png

    • Property svn:mime-type changed from application/octet-stream to image/png
  • edu-results-publishing/assets/screenshot-3.png

    • Property svn:mime-type changed from application/octet-stream to image/png
  • edu-results-publishing/assets/screenshot-4.png

    • Property svn:mime-type changed from application/octet-stream to image/png
  • edu-results-publishing/assets/screenshot-5.png

    • Property svn:mime-type changed from application/octet-stream to image/png
  • edu-results-publishing/assets/screenshot-6.png

    • Property svn:mime-type changed from application/octet-stream to image/png
  • edu-results-publishing/assets/screenshot-7.png

    • Property svn:mime-type changed from application/octet-stream to image/png
  • edu-results-publishing/assets/screenshot-8.png

    • Property svn:mime-type changed from application/octet-stream to image/png
  • edu-results-publishing/assets/screenshot-9.png

    • Property svn:mime-type changed from application/octet-stream to image/png
  • edu-results-publishing/tags/1.2.0/assets/css/style.css

    r3019484 r3422911  
    9999
    100100/*------------------------------
    101 * Search Form
     101* Search Form - Modern UI
    102102------------------------------*/
    103103
     104/* Main Container */
    104105.cbedu-results-search-form-area {
    105   margin-bottom: 20px;
    106 }
    107 
    108 .cbedu-results-search-form-area form {
     106  margin: 60px auto;
     107  max-width: 900px;
     108  padding: 0 20px;
     109}
     110
     111/* Form Header */
     112.cbedu-search-form-header {
     113  text-align: center;
     114  margin-bottom: 40px;
     115  animation: fadeInDown 0.6s ease-out;
     116}
     117
     118@keyframes fadeInDown {
     119  from {
     120    opacity: 0;
     121    transform: translateY(-20px);
     122  }
     123  to {
     124    opacity: 1;
     125    transform: translateY(0);
     126  }
     127}
     128
     129.cbedu-search-form-header h2 {
     130  font-size: 36px;
     131  font-weight: 800;
     132  margin: 0 0 12px 0;
     133  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
     134  -webkit-background-clip: text;
     135  -webkit-text-fill-color: transparent;
     136  background-clip: text;
     137  letter-spacing: -0.5px;
     138}
     139
     140.cbedu-search-form-header p {
     141  color: #718096;
     142  font-size: 16px;
     143  margin: 0;
     144  font-weight: 400;
     145}
     146
     147/* Modern Form */
     148.cbedu-modern-form {
     149  background: #ffffff;
     150  border-radius: 20px;
     151  padding: 48px;
     152  box-shadow: 0 10px 40px rgba(102, 126, 234, 0.1),
     153              0 4px 8px rgba(0, 0, 0, 0.02);
     154  border: 1px solid rgba(102, 126, 234, 0.1);
     155  transition: all 0.3s ease;
     156  animation: fadeInUp 0.7s ease-out;
     157}
     158
     159@keyframes fadeInUp {
     160  from {
     161    opacity: 0;
     162    transform: translateY(30px);
     163  }
     164  to {
     165    opacity: 1;
     166    transform: translateY(0);
     167  }
     168}
     169
     170.cbedu-modern-form:hover {
     171  box-shadow: 0 15px 60px rgba(102, 126, 234, 0.15),
     172              0 6px 12px rgba(0, 0, 0, 0.03);
     173}
     174
     175/* Form Grid Layout */
     176.cbedu-form-grid {
     177  display: grid;
     178  grid-template-columns: repeat(2, 1fr);
     179  gap: 28px;
     180  margin-bottom: 32px;
     181}
     182
     183/* Form Field */
     184.cbedu-form-field {
    109185  display: flex;
    110186  flex-direction: column;
     187  gap: 10px;
     188}
     189
     190.cbedu-form-field label {
     191  display: flex;
     192  align-items: center;
     193  gap: 8px;
     194  font-size: 14px;
     195  font-weight: 600;
     196  color: #2d3748;
     197  margin-bottom: 2px;
     198  letter-spacing: 0.3px;
     199}
     200
     201.cbedu-form-field .label-icon {
     202  font-size: 18px;
     203  filter: grayscale(0.3);
     204}
     205
     206.cbedu-form-field .required {
     207  color: #f56565;
     208  font-size: 16px;
     209}
     210
     211/* Select Wrapper */
     212.cbedu-select-wrapper {
     213  position: relative;
    111214  width: 100%;
    112   max-width: 100%;
    113   margin: 0 auto;
    114   padding: 30px 25px;
    115   border: 1px solid #ddd;
    116   border-radius: 5px;
    117   background-color: #f2f2f2;
    118   box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
     215}
     216
     217.cbedu-select-wrapper::after {
     218  content: '▼';
     219  position: absolute;
     220  right: 18px;
     221  top: 50%;
     222  transform: translateY(-50%);
     223  pointer-events: none;
     224  color: #667eea;
     225  font-size: 12px;
     226  transition: all 0.3s ease;
     227}
     228
     229.cbedu-select-wrapper:hover::after {
     230  color: #764ba2;
     231}
     232
     233/* Input & Select Styles */
     234.cbedu-form-field input[type="text"],
     235.cbedu-form-field select {
     236  width: 100%;
     237  padding: 14px 18px;
     238  font-size: 15px;
     239  border: 2px solid #e2e8f0;
     240  border-radius: 12px;
     241  background: #ffffff;
     242  color: #2d3748;
     243  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
     244  font-family: inherit;
     245  outline: none;
     246  appearance: none;
     247  -webkit-appearance: none;
     248  -moz-appearance: none;
     249}
     250
     251.cbedu-form-field select {
     252  cursor: pointer;
     253  padding-right: 45px;
     254  background-image: none;
     255}
     256
     257.cbedu-form-field input[type="text"]:focus,
     258.cbedu-form-field select:focus {
     259  border-color: #667eea;
     260  background: #f8f9ff;
     261  box-shadow: 0 0 0 4px rgba(102, 126, 234, 0.1);
     262  transform: translateY(-2px);
     263}
     264
     265.cbedu-form-field input[type="text"]:hover,
     266.cbedu-form-field select:hover {
     267  border-color: #cbd5e0;
     268}
     269
     270.cbedu-form-field input[type="text"]::placeholder {
     271  color: #a0aec0;
     272  font-size: 14px;
     273}
     274
     275/* Error Messages */
     276.cbedu-error-message {
     277  color: #f56565;
     278  font-size: 13px;
     279  font-weight: 500;
     280  margin-top: 6px;
     281  display: none;
     282  padding-left: 4px;
     283  animation: shake 0.3s ease;
     284}
     285
     286@keyframes shake {
     287  0%, 100% { transform: translateX(0); }
     288  25% { transform: translateX(-5px); }
     289  75% { transform: translateX(5px); }
     290}
     291
     292/* Submit Button Wrapper */
     293.cbedu-form-submit-wrapper {
     294  display: flex;
     295  justify-content: center;
     296  margin-top: 12px;
     297}
     298
     299/* Submit Button */
     300.cbedu-submit-btn, button.cbedu-submit-btn {
     301  display: inline-flex;
     302  align-items: center;
     303  justify-content: center;
    119304  gap: 10px;
    120 }
    121 
    122 .cbedu-results-search-form-single-element-area {
     305  padding: 18px 55px;
     306  min-width: 280px;
     307  font-size: 15px;
     308  font-weight: 700;
     309  color: #ffffff !important;
     310  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
     311  border: none;
     312  border-radius: 12px;
     313  cursor: pointer;
     314  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
     315  box-shadow: 0 6px 20px rgba(102, 126, 234, 0.4);
     316  text-transform: uppercase;
     317  letter-spacing: 1.2px;
     318  position: relative;
     319  overflow: hidden;
     320  white-space: nowrap;
     321  line-height: 1;
     322  border:none;
     323}
     324
     325.cbedu-submit-btn::before {
     326  content: '';
     327  position: absolute;
     328  top: 0;
     329  left: -100%;
     330  width: 100%;
     331  height: 100%;
     332  background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);
     333  transition: left 0.5s ease;
     334}
     335
     336.cbedu-submit-btn:hover::before {
     337  left: 100%;
     338}
     339
     340.cbedu-submit-btn:hover {
     341  transform: translateY(-3px);
     342  box-shadow: 0 10px 30px rgba(102, 126, 234, 0.5);
     343  background: linear-gradient(135deg, #5a67d8 0%, #6b46a0 100%);
     344}
     345
     346.cbedu-submit-btn:active {
     347  transform: translateY(-1px);
     348  box-shadow: 0 5px 15px rgba(102, 126, 234, 0.4);
     349}
     350
     351.cbedu-submit-btn .btn-icon {
     352  font-size: 18px;
     353  flex-shrink: 0;
     354  animation: pulse 2s infinite;
     355}
     356
     357@keyframes pulse {
     358  0%, 100% { transform: scale(1); }
     359  50% { transform: scale(1.1); }
     360}
     361
     362.cbedu-submit-btn .btn-text {
     363  font-size: 15px;
     364  flex-shrink: 0;
     365  color: #ffffff;
     366}
     367
     368.cbedu-submit-btn .btn-arrow {
     369  font-size: 18px;
     370  flex-shrink: 0;
     371  transition: transform 0.3s ease;
     372  font-weight: 700;
     373  color: #ffffff;
     374}
     375
     376.cbedu-submit-btn:hover .btn-arrow {
     377  transform: translateX(5px);
     378}
     379
     380/* Preloader */
     381.cbedu-preloader-wrapper {
     382  text-align: center;
     383  padding: 60px 20px;
     384  background: #ffffff;
     385  border-radius: 16px;
     386  margin: 30px 0;
     387  box-shadow: 0 4px 15px rgba(0, 0, 0, 0.08);
     388}
     389
     390.cbedu-preloader-content {
    123391  display: flex;
    124392  flex-direction: column;
    125 }
    126 
    127 .cbedu-results-search-form-single-element {
    128   display: flex;
     393  align-items: center;
    129394  gap: 20px;
    130   justify-content: flex-start;
    131   align-items: center;
    132 }
    133 
    134 .cbedu-results-search-form-single-element label {
    135   flex-basis: 30%;
    136 }
    137 
    138 .cbedu-results-search-form-single-element input,
    139 .cbedu-results-search-form-single-element select,
    140 .cbedu-results-search-form-single-element input[type="text"] {
    141   border: 1px solid #3666;
    142   padding: 15px;
    143 }
    144 
    145 .cbedu-results-search-form-single-element.cbedu-results-search-form-submit {
    146   display: flex;
    147   justify-content: center;
    148 }
    149 
    150 .cbedu-results-search-form-submit input[type="submit"] {
    151   padding: 15px 25px;
    152   background-color: #1587fc;
    153   color: #fff;
    154   font-size: 18px;
    155   font-weight: 500;
    156   border-radius: 5px;
    157   cursor: pointer;
    158 }
    159 
    160 .cbedu-results-search-form-submit input[type="submit"]:hover {
    161   background-color: #0e52b5;
    162 }
    163 
    164 .cbedu-error-message {
    165   color: red;
    166   margin-top: 5px;
    167   font-size: 0.9em;
    168   align-self: center;
     395}
     396
     397.cbedu-preloader-text {
     398  color: #667eea;
     399  font-size: 16px;
     400  font-weight: 600;
     401  margin: 0;
     402  animation: fadeInOut 1.5s infinite;
     403}
     404
     405@keyframes fadeInOut {
     406  0%, 100% { opacity: 0.5; }
     407  50% { opacity: 1; }
    169408}
    170409
     
    182421  height: 13px;
    183422  border-radius: 50%;
    184   background: #1f79ff;
     423  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    185424  animation-timing-function: cubic-bezier(0, 1, 1, 0);
    186425}
     
    188427.cbedu-ajax-preloader-ellipsis div:nth-child(1) {
    189428  left: 8px;
    190   animation: cbedu-ellipsis1 0.6s infinite;
     429  animation: ellipsis1 0.6s infinite;
    191430}
    192431
    193432.cbedu-ajax-preloader-ellipsis div:nth-child(2) {
    194433  left: 8px;
    195   animation: cbedu-ellipsis2 0.6s infinite;
     434  animation: ellipsis2 0.6s infinite;
    196435}
    197436
    198437.cbedu-ajax-preloader-ellipsis div:nth-child(3) {
    199438  left: 32px;
    200   animation: cbedu-ellipsis2 0.6s infinite;
     439  animation: ellipsis2 0.6s infinite;
    201440}
    202441
    203442.cbedu-ajax-preloader-ellipsis div:nth-child(4) {
    204443  left: 56px;
    205   animation: cbedu-ellipsis3 0.6s infinite;
    206 }
    207 .cbedu-ajax-result-area table th{
    208 text-align: left;
    209 }
     444  animation: ellipsis3 0.6s infinite;
     445}
     446
     447@keyframes ellipsis1 {
     448  0% { transform: scale(0); }
     449  100% { transform: scale(1); }
     450}
     451
     452@keyframes ellipsis2 {
     453  0% { transform: translate(0, 0); }
     454  100% { transform: translate(24px, 0); }
     455}
     456
     457@keyframes ellipsis3 {
     458  0% { transform: scale(1); }
     459  100% { transform: scale(0); }
     460}
     461
     462/* Responsive Design */
     463@media (max-width: 768px) {
     464  .cbedu-search-form-header h2 {
     465    font-size: 28px;
     466  }
     467
     468  .cbedu-search-form-header p {
     469    font-size: 14px;
     470  }
     471
     472  .cbedu-modern-form {
     473    padding: 32px 24px;
     474    border-radius: 16px;
     475  }
     476
     477  .cbedu-form-grid {
     478    grid-template-columns: 1fr;
     479    gap: 20px;
     480  }
     481
     482  .cbedu-submit-btn {
     483    width: 100%;
     484    padding: 16px 32px;
     485  }
     486
     487  .cbedu-form-field .label-icon {
     488    font-size: 16px;
     489  }
     490}
     491
     492@media (max-width: 480px) {
     493  .cbedu-results-search-form-area {
     494    margin: 40px auto;
     495    padding: 0 15px;
     496  }
     497
     498  .cbedu-search-form-header h2 {
     499    font-size: 24px;
     500  }
     501
     502  .cbedu-modern-form {
     503    padding: 24px 18px;
     504  }
     505
     506  .cbedu-form-field label {
     507    font-size: 13px;
     508  }
     509
     510  .cbedu-form-field input[type="text"],
     511  .cbedu-form-field select {
     512    padding: 12px 14px;
     513    font-size: 14px;
     514  }
     515
     516  .cbedu-error-message {
     517    padding-left: 0;
     518  }
     519
     520  .cbedu-submit-btn {
     521    width: 100%;
     522    padding: 16px 32px;
     523    font-size: 15px;
     524  }
     525}
     526
     527/*------------------------------
     528* Result Display - Modern UI
     529------------------------------*/
     530
    210531@keyframes cbedu-ellipsis1 {
    211532  0% {
     
    237558  }
    238559}
     560
     561/*------------------------------
     562* AJAX Result Display - Modern UI
     563------------------------------*/
     564
     565/* Main Result Container */
     566.cbedu-ajax-result-area {
     567  max-width: 1200px;
     568  margin: 30px auto;
     569  padding: 0;
     570  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
     571  background: #fff;
     572  border-radius: 12px;
     573  box-shadow: 0 10px 40px rgba(0, 0, 0, 0.08);
     574  overflow: hidden;
     575}
     576
     577.cbedu-ajax-result {
     578  padding: 0;
     579}
     580
     581/* Section Headings */
     582.cbedu-result-student-information-heading,
     583.cbedu-result-student-subject-heading {
     584  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
     585  padding: 20px 30px;
     586  margin: 0;
     587}
     588
     589.cbedu-result-student-information-heading h4,
     590.cbedu-result-student-subject-heading h4 {
     591  color: #fff;
     592  margin: 0;
     593  font-size: 20px;
     594  font-weight: 600;
     595  letter-spacing: 0.5px;
     596  text-transform: uppercase;
     597  display: flex;
     598  align-items: center;
     599  gap: 10px;
     600}
     601
     602.cbedu-result-student-information-heading h4:before {
     603  content: "👤";
     604  font-size: 24px;
     605}
     606
     607.cbedu-result-student-subject-heading h4:before {
     608  content: "📊";
     609  font-size: 24px;
     610}
     611
     612/* Student Information Area */
     613.cbedu-result-student-information-area {
     614  margin-bottom: 30px;
     615  border-radius: 12px 12px 0 0;
     616  overflow: hidden;
     617  background: #fff;
     618}
     619
     620.cbedu-result-student-information-area table {
     621  width: 100%;
     622  border-collapse: collapse;
     623  margin: 0;
     624  background: #fff;
     625}
     626
     627.cbedu-result-student-information-area table tbody tr:nth-child(even) {
     628  background: #f8f9ff;
     629}
     630
     631.cbedu-result-student-information-area table tbody tr:hover {
     632  background: #f0f2ff;
     633  transition: background 0.3s ease;
     634}
     635
     636.cbedu-result-student-information-area th {
     637  background: #f7f8fc;
     638  color: #2d3748;
     639  font-weight: 600;
     640  padding: 16px 20px;
     641  text-align: left;
     642  border-bottom: 2px solid #e2e8f0;
     643  font-size: 14px;
     644  text-transform: uppercase;
     645  letter-spacing: 0.5px;
     646  /* width: 25%; */
     647}
     648
     649.cbedu-result-student-information-area td {
     650  padding: 16px 20px;
     651  color: #4a5568;
     652  border-bottom: 1px solid #e2e8f0;
     653  font-size: 15px;
     654  font-weight: 500;
     655}
     656
     657/* Subject Result Area */
     658.cbedu-result-student-subject-area {
     659  background: #fff;
     660  border-radius: 0 0 12px 12px;
     661  overflow: hidden;
     662}
     663
     664.cbedu-result-student-subject {
     665  padding: 0;
     666}
     667
     668.cbedu-result-student-subject table {
     669  width: 100%;
     670  border-collapse: collapse;
     671  margin: 0;
     672  background: #fff;
     673}
     674
     675.cbedu-result-student-subject table thead {
     676  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
     677}
     678
     679.cbedu-result-student-subject table thead tr th {
     680  color: #fff;
     681  font-weight: 600;
     682  padding: 18px 20px;
     683  text-align: center;
     684  font-size: 14px;
     685  text-transform: uppercase;
     686  letter-spacing: 0.5px;
     687  border: none;
     688}
     689
     690.cbedu-result-student-subject table tbody tr {
     691  border-bottom: 1px solid #e2e8f0;
     692  transition: all 0.3s ease;
     693}
     694
     695.cbedu-result-student-subject table tbody tr:nth-child(even) {
     696  background: #f8f9ff;
     697}
     698
     699.cbedu-result-student-subject table tbody tr:hover {
     700  background: #e6f2ff;
     701  transform: scale(1.01);
     702  box-shadow: 0 4px 12px rgba(102, 126, 234, 0.1);
     703}
     704
     705.cbedu-result-student-subject table tbody td {
     706  padding: 16px 20px;
     707  color: #4a5568;
     708  text-align: center;
     709  font-size: 15px;
     710  font-weight: 500;
     711}
     712
     713.cbedu-result-student-subject table tbody td:nth-child(1) {
     714  font-weight: 700;
     715  color: #667eea;
     716}
     717
     718.cbedu-result-student-subject table tbody td:nth-child(2) {
     719  text-align: left;
     720  font-weight: 600;
     721  color: #2d3748;
     722}
     723
     724/* Highlight cells (GPA columns) */
     725.cbedu-result-student-subject table tbody td.highlight {
     726  background: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%);
     727  font-weight: 700;
     728  font-size: 18px;
     729  color: #2d3748;
     730  border-left: 3px solid #667eea;
     731  border-right: 3px solid #764ba2;
     732}
     733
     734/* Grade styling */
     735.cbedu-result-student-subject table tbody td:nth-child(4) {
     736  font-weight: 700;
     737  font-size: 16px;
     738}
     739
     740/* Print Button Container */
     741.cbedu-print-button-container {
     742  text-align: center;
     743  padding: 30px;
     744  background: #f7f8fc;
     745  border-radius: 0 0 12px 12px;
     746}
     747
     748.cbedu-print-button-container button {
     749  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
     750  color: #fff;
     751  padding: 14px 40px;
     752  font-size: 16px;
     753  font-weight: 600;
     754  border: none;
     755  border-radius: 8px;
     756  cursor: pointer;
     757  transition: all 0.3s ease;
     758  box-shadow: 0 4px 15px rgba(102, 126, 234, 0.3);
     759  text-transform: uppercase;
     760  letter-spacing: 1px;
     761}
     762
     763.cbedu-print-button-container button:hover {
     764  transform: translateY(-2px);
     765  box-shadow: 0 6px 25px rgba(102, 126, 234, 0.4);
     766}
     767
     768.cbedu-print-button-container button:active {
     769  transform: translateY(0);
     770}
     771
     772/* Status Badge Styling */
     773.cbedu-result-student-information-area td:contains("Passed"),
     774.cbedu-result-student-information-area td:contains("Failed") {
     775  font-weight: 700;
     776}
     777
     778/* Responsive Design */
     779@media (max-width: 768px) {
     780  .cbedu-ajax-result-area {
     781    margin: 20px 10px;
     782    border-radius: 8px;
     783  }
     784
     785  .cbedu-result-student-information-heading,
     786  .cbedu-result-student-subject-heading {
     787    padding: 15px 20px;
     788  }
     789
     790  .cbedu-result-student-information-heading h4,
     791  .cbedu-result-student-subject-heading h4 {
     792    font-size: 16px;
     793  }
     794
     795  .cbedu-result-student-information-area th,
     796  .cbedu-result-student-information-area td,
     797  .cbedu-result-student-subject table tbody td {
     798    padding: 12px 15px;
     799    font-size: 13px;
     800  }
     801
     802  .cbedu-result-student-subject table thead tr th {
     803    padding: 14px 10px;
     804    font-size: 12px;
     805  }
     806
     807  .cbedu-print-button-container {
     808    padding: 20px;
     809  }
     810
     811  .cbedu-print-button-container button {
     812    padding: 12px 30px;
     813    font-size: 14px;
     814  }
     815
     816  /* Stack table on mobile */
     817  .cbedu-result-student-information-area table,
     818  .cbedu-result-student-information-area thead,
     819  .cbedu-result-student-information-area tbody,
     820  .cbedu-result-student-information-area th,
     821  .cbedu-result-student-information-area td,
     822  .cbedu-result-student-information-area tr {
     823    display: block;
     824  }
     825
     826  .cbedu-result-student-information-area thead tr {
     827    display: none;
     828  }
     829
     830  .cbedu-result-student-information-area tr {
     831    margin-bottom: 15px;
     832    border: 1px solid #e2e8f0;
     833    border-radius: 8px;
     834    overflow: hidden;
     835  }
     836
     837  .cbedu-result-student-information-area td {
     838    text-align: right;
     839    padding-left: 50%;
     840    position: relative;
     841  }
     842
     843  .cbedu-result-student-information-area td:before {
     844    content: attr(data-label);
     845    position: absolute;
     846    left: 15px;
     847    width: 45%;
     848    padding-right: 10px;
     849    white-space: nowrap;
     850    text-align: left;
     851    font-weight: 600;
     852    color: #2d3748;
     853  }
     854}
     855
     856/* Print Styles */
     857@media print {
     858  .cbedu-print-button-container {
     859    display: none;
     860  }
     861
     862  .cbedu-ajax-result-area {
     863    box-shadow: none;
     864    border: 1px solid #ddd;
     865  }
     866
     867  .cbedu-result-student-information-heading,
     868  .cbedu-result-student-subject-heading {
     869    background: #667eea !important;
     870    -webkit-print-color-adjust: exact;
     871    print-color-adjust: exact;
     872  }
     873
     874  .cbedu-result-student-subject table tbody td.highlight {
     875    background: #fed6e3 !important;
     876    -webkit-print-color-adjust: exact;
     877    print-color-adjust: exact;
     878  }
     879
     880  body {
     881    background: #fff;
     882  }
     883}
  • edu-results-publishing/tags/1.2.0/edu-results-publishing.php

    r3022038 r3422911  
    44 * Author: MD Abul Bashar
    55 * Author URI: https://facebook.com/hmbashar
    6  * Description: This plugin is for student exam results publishing.
     6 * Description: A powerful tool designed to simplify the process of publishing exam results for educational institutions such as schools, colleges, and universities. With an easy-to-use interface, it empowers administrators and educators to effortlessly manage and showcase academic achievements.
    77 * Tags: Result, WP Result Plugin, EDU Results
    88 * Text Domain: edu-results
    9  * Version: 1.0.2
     9 * Version: 1.2.0
    1010 * License: GPLv2
    1111 * License URI: http://www.gnu.org/licenses/gpl-2.0.html
    1212 * Domain Path: /languages
    1313 * Prefix: cbedu_
     14 * Requires at least: 5.0
     15 * Requires PHP: 7.2
    1416 */
    1517
     
    2123 * @link https://facebook.com/hmbashar
    2224 */
     25
     26namespace CBEDU;
     27
    2328if (!defined('ABSPATH')) exit; // Exit if accessed directly
     29
    2430
    2531
     
    2834define('CBEDU_RESULT_DIR', plugin_dir_path(__FILE__));
    2935define('CBEDU_PREFIX', 'cbedu_');
    30 
    31 class CBEDUResultPublishing
     36define('CBEDU_VERSION', '1.2.0');
     37
     38final class CBEDUResultPublishing
    3239{
    3340    // Plugin prefix
     
    176183        ));
    177184
    178         //for autocomplete jquery in results post type with registration number
     185        // Enqueue admin meta fields CSS for custom post types
    179186        if ($hook_suffix === 'post-new.php' || $hook_suffix === 'post.php') {
    180             if (get_post_type($post) === 'cbedu_results') {
    181 
     187            $post_type = get_post_type($post);
     188           
     189            // Load admin CSS for students, subjects, and results post types
     190            if (in_array($post_type, array('cbedu_students', 'cbedu_subjects', 'cbedu_results'))) {
     191                wp_enqueue_style('cbedu-admin-meta-fields', CBEDU_RESULT_URL . 'assets/css/admin-meta-fields.css', array(), CBEDU_VERSION);
     192            }
     193
     194            // For autocomplete jquery in results post type with registration number
     195            if ($post_type === 'cbedu_results') {
    182196                wp_enqueue_style('cbedu-autocomplete-ui-css', plugin_dir_url(__FILE__) . 'assets/css/autocomplete.css');
    183197                wp_enqueue_script('cbedu-autocomplete-js', plugin_dir_url(__FILE__) . 'assets/js/autocomplete.js', array('jquery', 'jquery-ui-autocomplete'), '1.0.0', true);
     
    358372   
    359373        // Execute the query for 'cbedu_results'
    360         $ResultQuery = new WP_Query($args);
     374        $ResultQuery = new \WP_Query($args);
    361375   
    362376        // Output the results
     
    365379                $ResultQuery->the_post();
    366380
     381                // Store result post ID before nested query
     382                $result_post_id = get_the_ID();
     383                $result_title = get_the_title();
     384
    367385                $collageName = get_option('cbedu_results_collage_name');
    368386
    369                 $rs_std_roll = get_post_meta(get_the_ID(), 'cbedu_result_std_roll', true);
    370                 $rs_std_reg_number = get_post_meta(get_the_ID(), 'cbedu_result_std_registration_number', true);
    371                 $rs_std_type = get_post_meta(get_the_ID(), 'cbedu_result_std_student_type', true);
    372                 $rs_std_result_status = get_post_meta(get_the_ID(), 'cbedu_result_std_result_status', true);
    373                 $rs_std_gpa = get_post_meta(get_the_ID(), 'cbedu_result_std_gpa', true);
     387                $rs_std_roll = get_post_meta($result_post_id, 'cbedu_result_std_roll', true);
     388                $rs_std_reg_number = get_post_meta($result_post_id, 'cbedu_result_std_registration_number', true);
     389                $rs_std_type = get_post_meta($result_post_id, 'cbedu_result_std_student_type', true);
     390                $rs_std_result_status = get_post_meta($result_post_id, 'cbedu_result_std_result_status', true);
     391                $rs_std_gpa = get_post_meta($result_post_id, 'cbedu_result_std_gpa', true);
    374392   
    375393                //Student subjects result
    376                 $cbedu_std_all_subjects_result = get_post_meta(get_the_ID(), 'cbedu_subjects_results', true);
    377                 $cbedu_std_gpa = get_post_meta(get_the_ID(), 'cbedu_result_std_gpa', true);
    378                 $cbedu_std_was_gpa = get_post_meta(get_the_ID(), 'cbedu_result_std_was_gpa', true);
     394                $cbedu_std_all_subjects_result = get_post_meta($result_post_id, 'cbedu_subjects_results', true);
     395                $cbedu_std_gpa = get_post_meta($result_post_id, 'cbedu_result_std_gpa', true);
     396                $cbedu_std_was_gpa = get_post_meta($result_post_id, 'cbedu_result_std_was_gpa', true);
    379397
    380398                 // Fetch taxonomy term names
    381                 $session_year_terms = wp_get_post_terms(get_the_ID(), 'cbedu_session_years', array('fields' => 'names'));
    382                 $examination_terms = wp_get_post_terms(get_the_ID(), 'cbedu_examinations', array('fields' => 'names'));
    383                 $board_terms = wp_get_post_terms(get_the_ID(), 'cbedu_boards', array('fields' => 'names'));
    384                 $department_group_terms = wp_get_post_terms(get_the_ID(), 'cbedu_department_group', array('fields' => 'names'));
     399                $session_year_terms = wp_get_post_terms($result_post_id, 'cbedu_session_years', array('fields' => 'names'));
     400                $examination_terms = wp_get_post_terms($result_post_id, 'cbedu_examinations', array('fields' => 'names'));
     401                $board_terms = wp_get_post_terms($result_post_id, 'cbedu_boards', array('fields' => 'names'));
     402                $department_group_terms = wp_get_post_terms($result_post_id, 'cbedu_department_group', array('fields' => 'names'));
    385403
    386404                // Convert term arrays to strings
     
    404422                );
    405423   
    406                 $student_query = new WP_Query($student_args);
     424                $student_query = new \WP_Query($student_args);
     425               
     426                // Initialize student data
     427                $st_father_name = '';
     428                $st_mother_name = '';
     429                $st_std_id = '';
     430                $st_std_dob = '';
     431                $st_std_gender = '';
    407432   
    408433                if ($student_query->have_posts()) {
    409                     while ($student_query->have_posts()) {
    410                         $student_query->the_post();
    411    
    412                         // Fetch all student details
    413                         $st_father_name = get_post_meta(get_the_ID(), 'cbedu_result_std_father_name', true);
    414                         $st_mother_name = get_post_meta(get_the_ID(), 'cbedu_result_std_mother_name', true);
    415                         $st_std_id = get_post_meta(get_the_ID(), 'cbedu_result_std_id', true);                       
    416                         $st_std_dob = get_post_meta(get_the_ID(), 'cbedu_result_std_dob', true);
    417                         $st_std_gender = get_post_meta(get_the_ID(), 'cbedu_result_std_gender', true);
     434                    $student_post = $student_query->posts[0];
     435   
     436                    // Fetch all student details
     437                    $st_father_name = get_post_meta($student_post->ID, 'cbedu_result_std_father_name', true);
     438                    $st_mother_name = get_post_meta($student_post->ID, 'cbedu_result_std_mother_name', true);
     439                    $st_std_id = get_post_meta($student_post->ID, 'cbedu_result_std_id', true);                       
     440                    $st_std_dob = get_post_meta($student_post->ID, 'cbedu_result_std_dob', true);
     441                    $st_std_gender = get_post_meta($student_post->ID, 'cbedu_result_std_gender', true);
     442                }
     443               
     444                wp_reset_postdata(); // Reset student query
    418445                       
    419446   
    420                         // Display the results in a table
    421                         ?>
    422                         <div class="cbedu-ajax-result-area" id="cbedu-result-table">
    423                             <div class="cbedu-ajax-result">
    424                                 <!--Student Information-->
    425                                 <div class="cbedu-result-student-information-area">
    426                                     <div class="cbedu-result-student-information-heading">
    427                                         <h4><?php _e('Student Information', 'edu-results'); ?></h4>
    428                                     </div>
    429                                     <table>
    430                                         <tr>
    431                                             <th><?php _e('Roll', 'edu-results'); ?></th>
    432                                             <td><?php echo esc_html($rs_std_roll); ?></td>
    433                                             <th><?php _e('Registration Number', 'edu-results'); ?></th>
    434                                             <td><?php echo esc_html($rs_std_reg_number); ?></td>
    435                                         </tr>
    436                                         <tr>
    437                                             <th><?php _e('Student Name', 'edu-results'); ?></th>
    438                                             <td><?php the_title(); ?></td>
    439                                             <th><?php _e('Student ID', 'edu-results'); ?></th>
    440                                             <td><?php echo esc_html($st_std_id); ?></td>
    441                                         </tr>
    442                                         <tr>
    443                                             <th><?php _e('Father Name', 'edu-results'); ?></th>
    444                                             <td><?php echo esc_html($st_father_name); ?></td>
    445                                             <th><?php _e('Mother Name', 'edu-results'); ?></th>
    446                                             <td><?php echo esc_html($st_mother_name); ?></td>                                           
    447                                         </tr>
    448                                         <tr>
    449                                             <th><?php _e('Board', 'edu-results'); ?></th>
    450                                             <td><?php echo esc_html($board); ?></td>
    451                                             <th><?php _e('Department Group', 'edu-results'); ?></th>
    452                                             <td><?php echo esc_html($department_group); ?></td>                                           
    453                                         </tr>
    454                                         <tr>
    455                                             <th><?php _e('Session', 'edu-results'); ?></th>
    456                                             <td><?php echo esc_html($session_year); ?></td>
    457                                             <th><?php _e('Result Status', 'edu-results'); ?></th>
    458                                             <td><?php echo esc_html($rs_std_result_status); ?></td>                                           
    459                                         </tr>
    460                                         <tr>
    461                                             <th><?php _e('Gender', 'edu-results'); ?></th>
    462                                             <td><?php echo esc_html($st_std_gender); ?></td>
    463                                             <th><?php _e('Date of Birth', 'edu-results'); ?></th>
    464                                             <td><?php echo esc_html($st_std_dob); ?></td>                                           
    465                                         </tr>
    466                                         <tr>
    467                                             <th><?php _e('Student Type', 'edu-results'); ?></th>
    468                                             <td><?php echo esc_html($rs_std_type); ?></td>
    469                                             <th><?php _e('Institute Name', 'edu-results'); ?></th>
    470                                             <td><?php echo esc_html($collageName); ?></td>                                           
    471                                         </tr>
    472                                         <tr>
    473                                             <th><?php _e('Examination', 'edu-results'); ?></th>
    474                                             <td><?php echo esc_html($examination); ?></td>
    475                                             <th><?php _e('GPA', 'edu-results'); ?></th>
    476                                             <td><?php echo esc_html($rs_std_gpa); ?></td>                                           
    477                                         </tr>
    478                                     </table>
    479                                 </div><!--/ Student Information-->
    480 
    481                                 <!--Student Subjects Information-->
    482                                 <div class="cbedu-result-student-subject-area">
    483                                     <div class="cbedu-result-student-subject">
    484                                         <div class="cbedu-result-student-subject-heading">
    485                                             <h4><?php _e('Result Sheet', 'edu-results'); ?></h4>
    486                                         </div>
    487                                         <table>
    488                                             <tr>
    489                                                 <th><?php _e('Subject', 'edu-results'); ?></th>
    490                                                 <th><?php _e('Name of Subjects', 'edu-results'); ?></th>
    491                                                 <th><?php _e('Marks', 'edu-results'); ?></th>
    492                                                 <th><?php _e('Letter Grade', 'edu-results'); ?></th>
    493                                                 <th class="cbedu-table-gpa"><?php _e('GPA', 'edu-results'); ?> <abbr title="Without additional subject"><?php _e('(WAS)', 'edu-results'); ?></abbr></th>
    494                                                 <th><?php _e('GPA', 'edu-results'); ?></th>
    495                                             </tr>
    496                                             <?php
     447                // Display the results in a table
     448                ?>
     449                <div class="cbedu-ajax-result-area" id="cbedu-result-table">
     450                    <div class="cbedu-ajax-result">
     451                        <!--Student Information-->
     452                        <div class="cbedu-result-student-information-area">
     453                            <div class="cbedu-result-student-information-heading">
     454                                <h4><?php esc_html_e('Student Information', 'edu-results'); ?></h4>
     455                            </div>
     456                            <table>
     457                                <tbody>
     458                                <tr>
     459                                    <th><?php esc_html_e('Roll', 'edu-results'); ?></th>
     460                                    <td><?php echo esc_html($rs_std_roll); ?></td>
     461                                    <th><?php esc_html_e('Registration Number', 'edu-results'); ?></th>
     462                                    <td><?php echo esc_html($rs_std_reg_number); ?></td>
     463                                </tr>
     464                                <tr>
     465                                    <th><?php esc_html_e('Student Name', 'edu-results'); ?></th>
     466                                    <td><?php echo esc_html($result_title); ?></td>
     467                                    <th><?php esc_html_e('Student ID', 'edu-results'); ?></th>
     468                                    <td><?php echo esc_html($st_std_id); ?></td>
     469                                </tr>
     470                                <tr>
     471                                    <th><?php esc_html_e('Father Name', 'edu-results'); ?></th>
     472                                    <td><?php echo esc_html($st_father_name); ?></td>
     473                                    <th><?php esc_html_e('Mother Name', 'edu-results'); ?></th>
     474                                    <td><?php echo esc_html($st_mother_name); ?></td>                                           
     475                                </tr>
     476                                <tr>
     477                                    <th><?php esc_html_e('Board', 'edu-results'); ?></th>
     478                                    <td><?php echo esc_html($board); ?></td>
     479                                    <th><?php esc_html_e('Department Group', 'edu-results'); ?></th>
     480                                    <td><?php echo esc_html($department_group); ?></td>                                           
     481                                </tr>
     482                                <tr>
     483                                    <th><?php esc_html_e('Session', 'edu-results'); ?></th>
     484                                    <td><?php echo esc_html($session_year); ?></td>
     485                                    <th><?php esc_html_e('Result Status', 'edu-results'); ?></th>
     486                                    <td><?php echo esc_html($rs_std_result_status); ?></td>                                           
     487                                </tr>
     488                                <tr>
     489                                    <th><?php esc_html_e('Gender', 'edu-results'); ?></th>
     490                                    <td><?php echo esc_html($st_std_gender); ?></td>
     491                                    <th><?php esc_html_e('Date of Birth', 'edu-results'); ?></th>
     492                                    <td><?php echo esc_html($st_std_dob); ?></td>                                           
     493                                </tr>
     494                                <tr>
     495                                    <th><?php esc_html_e('Student Type', 'edu-results'); ?></th>
     496                                    <td><?php echo esc_html($rs_std_type); ?></td>
     497                                    <th><?php esc_html_e('Institute Name', 'edu-results'); ?></th>
     498                                    <td><?php echo esc_html($collageName); ?></td>                                           
     499                                </tr>
     500                                <tr>
     501                                    <th><?php esc_html_e('Examination', 'edu-results'); ?></th>
     502                                    <td><?php echo esc_html($examination); ?></td>
     503                                    <th><?php esc_html_e('GPA', 'edu-results'); ?></th>
     504                                    <td><?php echo esc_html($rs_std_gpa); ?></td>                                           
     505                                </tr>
     506                                </tbody>
     507                            </table>
     508                        </div><!--/ Student Information-->
     509
     510                        <!--Student Subjects Information-->
     511                        <div class="cbedu-result-student-subject-area">
     512                            <div class="cbedu-result-student-subject">
     513                                <div class="cbedu-result-student-subject-heading">
     514                                    <h4><?php esc_html_e('Result Sheet', 'edu-results'); ?></h4>
     515                                </div>
     516                                <table>
     517                                    <thead>
     518                                    <tr>
     519                                        <th><?php esc_html_e('Subject', 'edu-results'); ?></th>
     520                                        <th><?php esc_html_e('Name of Subjects', 'edu-results'); ?></th>
     521                                        <th><?php esc_html_e('Marks', 'edu-results'); ?></th>
     522                                        <th><?php esc_html_e('Letter Grade', 'edu-results'); ?></th>
     523                                        <th class="cbedu-table-gpa"><?php esc_html_e('GPA', 'edu-results'); ?> <abbr title="Without additional subject"><?php esc_html_e('(WAS)', 'edu-results'); ?></abbr></th>
     524                                        <th><?php esc_html_e('GPA', 'edu-results'); ?></th>
     525                                    </tr>
     526                                    </thead>
     527                                    <tbody>
     528                                    <?php
    497529
    498530                                            // Check if there are subject results
     
    552584                        </div>
    553585                        <div class="cbedu-print-button-container">
    554                             <button onclick="cbeduPrintResult('cbedu-result-table')"><?php _e('Print', 'edu-results'); ?></button>
     586                            <button onclick="cbeduPrintResult('cbedu-result-table')"><?php esc_html_e('Print', 'edu-results'); ?></button>
    555587                        </div> 
    556588                        <?php
    557                     }
    558                 }
    559    
    560                 wp_reset_postdata(); // Reset student query
    561589            }
    562590        } else {
    563             echo '<p>No results found for the selected examination.</p>';
     591            echo '<p>' . esc_html__('No results found for the selected examination.', 'edu-results') . '</p>';
    564592        }
    565593   
  • edu-results-publishing/tags/1.2.0/inc/RepeaterCF.php

    r3019484 r3422911  
    2222        // Fetch subjects from 'subjects' custom post type
    2323        $subjects = get_posts(array(
    24             'post_type' => 'cbedu_subjects', // Replace with your actual custom post type slug
    25             'posts_per_page' => -1 // Fetch all posts
     24            'post_type' => 'cbedu_subjects',
     25            'posts_per_page' => -1
    2626        ));
    2727
     
    4646        </script>
    4747
    48         <table id="repeatable-fieldset-one" width="100%">
    49             <tbody>
    50                 <?php
    51                 if ($eduResultsGroup) :
    52                     foreach ($eduResultsGroup as $field) :
    53                 ?>
    54                         <tr>
    55                             <td width="70%">
    56                                 <select style="width:80%;padding:10px;" name="cbedu_results_subject_name[]">
     48        <div class="cbedu-subjects-repeater-wrapper">
     49            <div class="cbedu-repeater-header">
     50                <h3><?php esc_html_e('Add Subject Marks', 'edu-results'); ?></h3>
     51                <p class="description"><?php esc_html_e('Select subjects and enter marks for each subject', 'edu-results'); ?></p>
     52            </div>
     53
     54            <table id="repeatable-fieldset-one" class="cbedu-repeater-table">
     55                <thead>
     56                    <tr>
     57                        <th class="cbedu-repeater-th-subject"><?php esc_html_e('Subject', 'edu-results'); ?></th>
     58                        <th class="cbedu-repeater-th-marks"><?php esc_html_e('Marks / Grade', 'edu-results'); ?></th>
     59                        <th class="cbedu-repeater-th-action"><?php esc_html_e('Action', 'edu-results'); ?></th>
     60                    </tr>
     61                </thead>
     62                <tbody>
     63                    <?php
     64                    if ($eduResultsGroup) :
     65                        foreach ($eduResultsGroup as $field) :
     66                    ?>
     67                            <tr class="cbedu-repeater-row">
     68                                <td class="cbedu-repeater-td-subject">
     69                                    <select class="cbedu-repeater-select" name="cbedu_results_subject_name[]">
     70                                        <option value=""><?php esc_attr_e('Select Subject', 'edu-results'); ?></option>
     71                                        <?php foreach ($subjects as $subject) :
     72                                            $subject_code = get_post_meta($subject->ID, 'cbedu_subject_code', true);
     73                                        ?>
     74                                        <option value="<?php echo esc_attr($subject->post_title); ?>" <?php selected($field['subject_name'], $subject->post_title); ?>>
     75                                            <?php echo esc_html($subject_code ? $subject_code . ' - ' : '') . esc_html($subject->post_title); ?>
     76                                        </option>
     77                                        <?php endforeach; ?>
     78                                    </select>
     79                                </td>
     80                                <td class="cbedu-repeater-td-input">
     81                                    <input class="cbedu-repeater-input" type="text" placeholder="<?php esc_attr_e('Enter marks or grade', 'edu-results'); ?>" name="cbedu_results_subject_value[]" value="<?php echo isset($field['subject_value']) ? esc_attr($field['subject_value']) : ''; ?>" />
     82                                </td>
     83                                <td class="cbedu-repeater-td-action">
     84                                    <button type="button" class="button remove-row cbedu-remove-btn">
     85                                        <span class="dashicons dashicons-trash"></span>
     86                                        <?php esc_html_e('Remove', 'edu-results'); ?>
     87                                    </button>
     88                                </td>
     89                            </tr>
     90                        <?php
     91                        endforeach;
     92                    else :
     93                        ?>
     94                        <tr class="cbedu-repeater-row">
     95                            <td class="cbedu-repeater-td-subject">
     96                                <select class="cbedu-repeater-select" name="cbedu_results_subject_name[]">
    5797                                    <option value=""><?php esc_attr_e('Select Subject', 'edu-results'); ?></option>
    5898                                    <?php foreach ($subjects as $subject) :
    59                                         $subject_code = get_post_meta($subject->ID, 'cbedu_subject_code', true); 
     99                                        $subject_code = get_post_meta($subject->ID, 'cbedu_subject_code', true);
    60100                                    ?>
    61                                     <option value="<?php echo esc_attr($subject->post_title); ?>" <?php selected($field['subject_name'], $subject->post_title); ?>>
    62                                         <?php echo esc_html($subject_code . ' - ' . $subject->post_title); ?>
    63                                     </option>
     101                                        <option value="<?php echo esc_attr($subject->post_title); ?>">
     102                                            <?php echo esc_html($subject_code ? $subject_code . ' - ' : '') . esc_html($subject->post_title); ?>
     103                                        </option>
    64104                                    <?php endforeach; ?>
    65105                                </select>
    66106                            </td>
    67                             <td width="70%">
    68                                 <input style="width:80%;padding:10px;" type="text" placeholder="<?php esc_attr_e('Enter subject value', 'edu-results'); ?>" name="cbedu_results_subject_value[]" value="<?php echo isset($field['subject_value']) ? esc_attr($field['subject_value']) : ''; ?>" />
     107                            <td class="cbedu-repeater-td-input">
     108                                <input class="cbedu-repeater-input" type="text" placeholder="<?php esc_attr_e('Enter marks or grade', 'edu-results'); ?>" name="cbedu_results_subject_value[]" />
    69109                            </td>
    70                             <td width="15%"><a class="button remove-row" href="#1"><?php esc_html_e('Remove', 'edu-results'); ?></a></td>
     110                            <td class="cbedu-repeater-td-action">
     111                                <button type="button" class="button remove-row cbedu-remove-btn">
     112                                    <span class="dashicons dashicons-trash"></span>
     113                                    <?php esc_html_e('Remove', 'edu-results'); ?>
     114                                </button>
     115                            </td>
    71116                        </tr>
    72                     <?php
    73                     endforeach;
    74                 else :
    75                     // Show a blank row
    76                     ?>
    77                     <tr>
    78                         <td width="70%">
    79                             <select style="width:80%;padding:10px;" name="cbedu_results_subject_name[]">
     117                    <?php endif; ?>
     118
     119                    <!-- Empty hidden row for jQuery -->
     120                    <tr class="empty-row screen-reader-text cbedu-repeater-row">
     121                        <td class="cbedu-repeater-td-subject">
     122                            <select class="cbedu-repeater-select" name="cbedu_results_subject_name[]">
    80123                                <option value=""><?php esc_attr_e('Select Subject', 'edu-results'); ?></option>
    81                                 <?php foreach ($subjects as $subject) : ?>
     124                                <?php foreach ($subjects as $subject) :
     125                                    $subject_code = get_post_meta($subject->ID, 'cbedu_subject_code', true);
     126                                ?>
    82127                                    <option value="<?php echo esc_attr($subject->post_title); ?>">
    83                                         <?php echo esc_html($subject->post_title); ?>
     128                                        <?php echo esc_html($subject_code ? $subject_code . ' - ' : '') . esc_html($subject->post_title); ?>
    84129                                    </option>
    85130                                <?php endforeach; ?>
    86131                            </select>
    87132                        </td>
    88                         <td width="70%">
    89                             <input style="width:80%;padding:10px;" type="text" placeholder="<?php esc_attr_e('Enter subject value', 'edu-results'); ?>" name="cbedu_results_subject_value[]" />
     133                        <td class="cbedu-repeater-td-input">
     134                            <input class="cbedu-repeater-input" type="text" placeholder="<?php esc_attr_e('Enter marks or grade', 'edu-results'); ?>" name="cbedu_results_subject_value[]" />
    90135                        </td>
    91                         <td width="15%"><a class="button remove-row" href="#1"><?php esc_html_e('Remove', 'edu-results'); ?></a></td>
     136                        <td class="cbedu-repeater-td-action">
     137                            <button type="button" class="button remove-row cbedu-remove-btn">
     138                                <span class="dashicons dashicons-trash"></span>
     139                                <?php esc_html_e('Remove', 'edu-results'); ?>
     140                            </button>
     141                        </td>
    92142                    </tr>
    93                 <?php endif; ?>
    94 
    95                 <!-- Empty hidden row for jQuery -->
    96                 <tr class="empty-row screen-reader-text">
    97                     <td width="70%">
    98                         <select style="width:80%;padding:10px;" name="cbedu_results_subject_name[]">
    99                             <option value=""><?php esc_attr_e('Select Subject', 'edu-results'); ?></option>
    100                             <?php foreach ($subjects as $subject) : ?>
    101                                 <option value="<?php echo esc_attr($subject->post_title); ?>">
    102                                     <?php echo esc_html($subject->post_title); ?>
    103                                 </option>
    104                             <?php endforeach; ?>
    105                         </select>
    106                     </td>
    107                     <td width="70%">
    108                         <input style="width:80%;padding:10px;" type="text" placeholder="<?php esc_attr_e('Enter subject value', 'edu-results'); ?>" name="cbedu_results_subject_value[]" />
    109                     </td>
    110                     <td width="15%"><a class="button remove-row" href="#1"><?php esc_html_e('Remove', 'edu-results'); ?></a></td>
    111                 </tr>
    112             </tbody>
    113         </table>
    114 
    115         <p><a id="edu-add-subject-row" class="button" href="#"><?php esc_html_e('Add Another', 'edu-results'); ?></a></p>
     143                </tbody>
     144            </table>
     145
     146            <div class="cbedu-repeater-footer">
     147                <button type="button" id="edu-add-subject-row" class="button button-primary cbedu-add-subject-btn">
     148                    <span class="dashicons dashicons-plus-alt"></span>
     149                    <?php esc_html_e('Add Another Subject', 'edu-results'); ?>
     150                </button>
     151            </div>
     152        </div>
    116153    <?php
    117154    }
     
    128165            return;
    129166
     167        // Skip auto-draft, trash, and inherit posts
     168        $post_status = get_post_status($postID);
     169        if (in_array($post_status, array('auto-draft', 'trash', 'inherit')))
     170            return;
     171
    130172        if (!current_user_can('edit_post', $postID))
     173            return;
     174
     175        // Check post type
     176        if (get_post_type($postID) !== 'cbedu_results')
    131177            return;
    132178
  • edu-results-publishing/tags/1.2.0/inc/admin/settings.php

    r3019484 r3422911  
    1616        add_action('admin_menu', array($this, 'addSubmenuPage'));
    1717        add_action('admin_init', array($this, 'registerSettings'));
     18        add_action('admin_enqueue_scripts', array($this, 'enqueueSettingsStyles'));
     19    }
     20
     21    public function enqueueSettingsStyles($hook)
     22    {
     23        // Only load on our settings page
     24        if ($hook !== 'cbedu_results_page_cbedu_results_settings') {
     25            return;
     26        }
     27       
     28        wp_enqueue_style(
     29            'cbedu-admin-settings',
     30            plugins_url('../../assets/css/admin-settings.css', __FILE__),
     31            array(),
     32            '1.0.0'
     33        );
    1834    }
    1935
     
    3248    {
    3349?>
    34         <div class="wrap">
     50        <div class="wrap cbedu-settings-wrap">
     51            <div class="cbedu-settings-header">
     52                <h1><?php echo esc_html__('🎓 Edu Results Settings', 'edu-results'); ?></h1>
     53                <p class="cbedu-settings-subtitle"><?php echo esc_html__('Configure your educational institution settings', 'edu-results'); ?></p>
     54            </div>
     55           
    3556            <?php settings_errors(); ?>
    36             <h2>Edu Results Settings</h2>
    37             <form method="post" action="options.php" enctype="multipart/form-data"> <!-- Add enctype for file upload -->
    38                 <?php settings_fields('cbedu_results_settings_group'); ?>
    39                 <?php do_settings_sections('cbedu_results_settings'); ?>
    40                 <?php
    41                 // Add nonce field
    42                 wp_nonce_field('cbedu_results_settings_nonce', 'cbedu_results_settings_nonce_field');
    43                 ?>
    44                 <?php submit_button(); ?>
    45             </form>
     57           
     58            <div class="cbedu-settings-container">
     59                <form method="post" action="options.php" enctype="multipart/form-data" class="cbedu-settings-form">
     60                    <?php settings_fields('cbedu_results_settings_group'); ?>
     61                    <?php wp_nonce_field('cbedu_results_settings_nonce', 'cbedu_results_settings_nonce_field'); ?>
     62                   
     63                    <div class="cbedu-settings-card">
     64                        <div class="cbedu-card-header">
     65                            <h2>🏛️ Institution Information</h2>
     66                            <p class="description">Basic information about your educational institution</p>
     67                        </div>
     68                        <div class="cbedu-card-body">
     69                            <?php do_settings_sections('cbedu_results_settings'); ?>
     70                        </div>
     71                    </div>
     72                   
     73                    <div class="cbedu-settings-footer">
     74                        <?php submit_button(__('Save Settings', 'edu-results'), 'primary cbedu-save-btn', 'submit', false); ?>
     75                    </div>
     76                </form>
     77            </div>
    4678        </div>
    4779    <?php
     
    187219        $logoURL = get_option('cbedu_results_logo');
    188220    ?>
    189         <input type="text" name="cbedu_results_logo" value="<?php echo esc_url($logoURL); ?>" id="cbedu_results_logo">
    190         <input type="button" id="upload_logo_button" class="button" value="Upload Logo">
    191         <br>
    192         <img src="<?php echo esc_url($logoURL); ?>" alt="Logo Preview" id="logo_preview" style="max-width: 200px;">
     221        <div class="cbedu-field-wrapper">
     222            <input type="text" name="cbedu_results_logo" value="<?php echo esc_url($logoURL); ?>" id="cbedu_results_logo" placeholder="https://example.com/logo.png">
     223            <input type="button" id="upload_logo_button" class="button" value="📁 Upload Logo">
     224            <p class="description">Upload or enter the URL of your institution's logo</p>
     225            <?php if ($logoURL): ?>
     226                <img src="<?php echo esc_url($logoURL); ?>" alt="Logo Preview" id="logo_preview">
     227            <?php endif; ?>
     228        </div>
    193229        <script>
    194230            jQuery(document).ready(function($) {
     
    210246                        var attachment = customUploader.state().get('selection').first().toJSON();
    211247                        $('#cbedu_results_logo').val(attachment.url);
    212                         $('#logo_preview').attr('src', attachment.url);
     248                        $('#logo_preview').attr('src', attachment.url).show();
    213249                    });
    214250
     
    217253            });
    218254        </script>
    219         <p class="description">Upload your logo here.</p>
    220255<?php
    221256    }
     
    224259    public function settingsSectionCallback()
    225260    {
    226         echo 'These are the general settings for the Edu Results plugin.';
     261        echo '<p class="cbedu-section-description">Configure the basic information about your educational institution. This information will be displayed on result pages.</p>';
    227262    }
    228263
     
    232267    {
    233268        $collageName = get_option('cbedu_results_collage_name');
    234         echo '<input type="text" name="cbedu_results_collage_name" value="' . esc_attr($collageName) . '" />';
     269        echo '<div class="cbedu-field-wrapper">';
     270        echo '<input type="text" name="cbedu_results_collage_name" value="' . esc_attr($collageName) . '" placeholder="e.g., Springfield High School" />';
     271        echo '<p class="description">Full name of your educational institution</p>';
     272        echo '</div>';
    235273    }
    236274
     
    238276    {
    239277        $collageRegNumber = get_option('cbedu_results_collage_registration_number');
    240         echo '<input type="text" name="cbedu_results_collage_registration_number" value="' . esc_attr($collageRegNumber) . '" />';
     278        echo '<div class="cbedu-field-wrapper">';
     279        echo '<input type="text" name="cbedu_results_collage_registration_number" value="' . esc_attr($collageRegNumber) . '" placeholder="e.g., REG-2024-001" />';
     280        echo '<p class="description">Official registration or EIIN number</p>';
     281        echo '</div>';
    241282    }
    242283
     
    244285    {
    245286        $collageSinceYear = get_option('cbedu_results_collage_since_year');
    246         echo '<input type="text" name="cbedu_results_collage_since_year" value="' . esc_attr($collageSinceYear) . '" />';
     287        echo '<div class="cbedu-field-wrapper">';
     288        echo '<input type="text" name="cbedu_results_collage_since_year" value="' . esc_attr($collageSinceYear) . '" placeholder="e.g., 1995" />';
     289        echo '<p class="description">Year when the institution was established</p>';
     290        echo '</div>';
    247291    }
    248292
     
    250294    {
    251295        $collageAddress = get_option('cbedu_results_collage_address');
    252         echo '<textarea name="cbedu_results_collage_address" rows="5" cols="50">' . esc_textarea($collageAddress) . '</textarea>';
     296        echo '<div class="cbedu-field-wrapper">';
     297        echo '<textarea name="cbedu_results_collage_address" rows="5" cols="50" placeholder="Enter complete address with city, state, and postal code">' . esc_textarea($collageAddress) . '</textarea>';
     298        echo '<p class="description">Complete postal address of the institution</p>';
     299        echo '</div>';
    253300    }
    254301   
     
    257304    {
    258305        $collagePhoneNumber = get_option('cbedu_results_collage_phone_number');
    259         echo '<input type="text" name="cbedu_results_collage_phone_number" value="' . esc_attr($collagePhoneNumber) . '" />';
     306        echo '<div class="cbedu-field-wrapper">';
     307        echo '<input type="text" name="cbedu_results_collage_phone_number" value="' . esc_attr($collagePhoneNumber) . '" placeholder="e.g., +880-123-456-7890" />';
     308        echo '<p class="description">Primary contact phone number</p>';
     309        echo '</div>';
    260310    }
    261311
     
    263313    {
    264314        $collageEmailAddress = get_option('cbedu_results_collage_email_address');
    265         echo '<input type="email" name="cbedu_results_collage_email_address" value="' . esc_attr($collageEmailAddress) . '" />';
     315        echo '<div class="cbedu-field-wrapper">';
     316        echo '<input type="email" name="cbedu_results_collage_email_address" value="' . esc_attr($collageEmailAddress) . '" placeholder="e.g., info@institution.edu" />';
     317        echo '<p class="description">Official email address for contact</p>';
     318        echo '</div>';
    266319    }
    267320
     
    270323    {
    271324        $collageWebsiteUrl = get_option('cbedu_results_collage_website_url');
    272         echo '<input type="url" name="cbedu_results_collage_website_url" value="' . esc_url($collageWebsiteUrl) . '" />';
     325        echo '<div class="cbedu-field-wrapper">';
     326        echo '<input type="url" name="cbedu_results_collage_website_url" value="' . esc_url($collageWebsiteUrl) . '" placeholder="https://www.institution.edu" />';
     327        echo '<p class="description">Official website URL</p>';
     328        echo '</div>';
    273329    }
    274330
     
    276332    {
    277333        $bannerHeading = get_option('cbedu_results_banner_heading');
    278         echo '<input type="text" name="cbedu_results_banner_heading" value="' . esc_attr($bannerHeading) . '" />';
     334        echo '<div class="cbedu-field-wrapper">';
     335        echo '<input type="text" name="cbedu_results_banner_heading" value="' . esc_attr($bannerHeading) . '" placeholder="Enter custom heading text for result banners" />';
     336        echo '<p class="description">Custom heading text that appears on result pages</p>';
     337        echo '</div>';
    279338    }
    280339}
  • edu-results-publishing/tags/1.2.0/inc/custom-fields.php

    r3019484 r3422911  
    2929        add_action('wp_ajax_add_search_registration_numbers', array($this, 'add_search_registration_numbers'));
    3030        //  add_action('wp_ajax_nopriv_add_search_registration_numbers', array($this, 'add_search_registration_numbers'));
     31       
     32        // Hook to handle auto-draft deletion
     33        add_action('admin_init', array($this, 'handle_auto_draft_deletion'));
     34    }
     35   
     36    /**
     37     * Handle auto-draft deletion via admin actions
     38     */
     39    public function handle_auto_draft_deletion()
     40    {
     41        // Check if we're trying to delete an auto-draft
     42        if (isset($_GET['action']) && $_GET['action'] === 'trash' && isset($_GET['post'])) {
     43            $post_id = intval($_GET['post']);
     44            $post = get_post($post_id);
     45           
     46            if ($post && $post->post_status === 'auto-draft' &&
     47                in_array($post->post_type, array('cbedu_students', 'cbedu_subjects', 'cbedu_results'))) {
     48               
     49                // Force delete auto-draft instead of trashing
     50                wp_delete_post($post_id, true);
     51               
     52                // Redirect back to the list
     53                wp_redirect(admin_url('edit.php?post_type=' . $post->post_type . '&deleted=1'));
     54                exit;
     55            }
     56        }
     57       
     58        // Handle bulk deletion
     59        if (isset($_GET['action']) && $_GET['action'] === 'trash' && isset($_GET['post']) && is_array($_GET['post'])) {
     60            foreach ($_GET['post'] as $post_id) {
     61                $post_id = intval($post_id);
     62                $post = get_post($post_id);
     63               
     64                if ($post && $post->post_status === 'auto-draft' &&
     65                    in_array($post->post_type, array('cbedu_students', 'cbedu_subjects', 'cbedu_results'))) {
     66                   
     67                    // Force delete auto-draft instead of trashing
     68                    wp_delete_post($post_id, true);
     69                }
     70            }
     71        }
    3172    }
    3273
     
    4182
    4283        add_action('save_post', array($this, 'save_student_fields'));
    43         add_action('save_post', array($this, 'cbedu_check_unique_registration_number'));
     84        add_action('save_post', array($this, 'cbedu_check_unique_registration_number'));       
     85       
     86        // Clean up auto-draft posts
     87        add_action('wp_scheduled_delete', array($this, 'cleanup_auto_drafts'));
     88       
     89        // Allow deletion of auto-draft posts
     90        add_filter('user_has_cap', array($this, 'allow_auto_draft_deletion'), 10, 4);
     91       
     92        // Disable autosave for our custom post types
     93        add_action('admin_print_scripts', array($this, 'disable_autosave'));
     94    }
     95   
     96    /**
     97     * Disable autosave for custom post types
     98     */
     99    public function disable_autosave()
     100    {
     101        global $post;
     102       
     103        if ($post && in_array($post->post_type, array('cbedu_students', 'cbedu_subjects', 'cbedu_results'))) {
     104            wp_dequeue_script('autosave');
     105        }
     106    }
     107   
     108    /**
     109     * Allow users to delete auto-draft posts for our custom post types
     110     */
     111    public function allow_auto_draft_deletion($allcaps, $caps, $args, $user)
     112    {
     113        // Check if this is a delete operation
     114        if (isset($args[0]) && in_array($args[0], array('delete_post', 'delete_posts'))) {
     115            // Check if we have a post ID
     116            if (isset($args[2])) {
     117                $post_id = $args[2];
     118                $post = get_post($post_id);
     119               
     120                // If it's an auto-draft of our custom post types, allow deletion
     121                if ($post && in_array($post->post_type, array('cbedu_students', 'cbedu_subjects', 'cbedu_results'))) {
     122                    if ($post->post_status === 'auto-draft') {
     123                        $allcaps['delete_posts'] = true;
     124                        $allcaps['delete_published_posts'] = true;
     125                        $allcaps['delete_others_posts'] = true;
     126                    }
     127                }
     128            }
     129        }
     130       
     131        return $allcaps;
     132    }
     133   
     134    /**
     135     * Clean up old auto-draft posts for cbedu custom post types
     136     */
     137    public function cleanup_auto_drafts()
     138    {
     139        global $wpdb;
     140       
     141        // Delete auto-drafts older than 7 days for our custom post types
     142        $post_types = array('cbedu_students', 'cbedu_subjects', 'cbedu_results');
     143       
     144        foreach ($post_types as $post_type) {
     145            $wpdb->query($wpdb->prepare(
     146                "DELETE FROM {$wpdb->posts}
     147                WHERE post_type = %s
     148                AND post_status = 'auto-draft'
     149                AND DATE_SUB(NOW(), INTERVAL 7 DAY) > post_date",
     150                $post_type
     151            ));
     152        }
    44153    }
    45154
     
    73182        wp_nonce_field('cbedu_save_student_nonce_action', 'cbedu_save_student_nonce');
    74183
    75 
     184        // Get all meta values
    76185        $id_number = get_post_meta($post->ID, 'cbedu_result_std_id', true);       
    77186        $std_registration_number = get_post_meta($post->ID, 'cbedu_result_std_registration_number', true);
     
    79188        $mother_name = get_post_meta($post->ID, 'cbedu_result_std_mother_name', true);
    80189        $dob = get_post_meta($post->ID, 'cbedu_result_std_dob', true);
    81 
    82190        $gender = get_post_meta($post->ID, 'cbedu_result_std_gender', true);
    83191        $phone = get_post_meta($post->ID, 'cbedu_result_std_phone', true);
     
    92200        $birth_registration_number = get_post_meta($post->ID, 'cbedu_result_std_birth_registration_number', true);
    93201        $nid_number = get_post_meta($post->ID, 'cbedu_result_std_nid_number', true);
    94 
    95 
    96         // Output HTML inputs for each field
    97202?>
    98         <table>
    99             <tr>
    100                 <td>
    101                     <label for="cbedu_result_std_id"><?php esc_html_e('ID Number:', 'edu-results'); ?></label>
    102                 </td>
    103                 <td>
    104                     <input class="regular-text" style="padding: 7px 10px;" type="text" id="cbedu_result_std_id" name="cbedu_result_std_id" value="<?php echo esc_attr($id_number); ?>" />
    105                 </td>
    106             </tr>
    107             <tr>
    108                 <td>
    109                     <label for="cbedu_result_std_registration_number"><?php esc_html_e('Registration Number:', 'edu-results'); ?></label>
    110                 </td>
    111                 <td>
    112                     <input class="regular-text" style="padding: 7px 10px;" type="text" id="cbedu_result_std_registration_number" name="cbedu_result_std_registration_number" value="<?php echo esc_attr($std_registration_number); ?>" />
    113                 </td>
    114             </tr>
    115             <tr>
    116                 <td>
    117                     <label for="cbedu_result_std_father_name"><?php esc_html_e('Father Name:', 'edu-results'); ?></label>
    118                 </td>
    119                 <td>
    120                     <input class="regular-text" style="padding: 7px 10px;" type="text" id="cbedu_result_std_father_name" name="cbedu_result_std_father_name" value="<?php echo esc_attr($father_name); ?>" />
    121                 </td>
    122             </tr>
    123             <tr>
    124                 <td>
    125                     <label for="cbedu_result_std_mother_name"><?php esc_html_e('Mother Name:', 'edu-results'); ?></label>
    126                 </td>
    127                 <td>
    128                     <input class="regular-text" style="padding: 7px 10px;" type="text" id="cbedu_result_std_mother_name" name="cbedu_result_std_mother_name" value="<?php echo esc_attr($mother_name); ?>" />
    129                 </td>
    130             </tr>
    131             <tr>
    132                 <td>
    133                     <label for="cbedu_result_std_dob"><?php esc_html_e('Date of Birth:', 'edu-results'); ?></label>
    134                 </td>
    135                 <td>
    136                     <input class="regular-text" style="padding: 7px 10px;" type="date" id="cbedu_result_std_dob" name="cbedu_result_std_dob" value="<?php echo esc_attr($dob); ?>" />
    137                 </td>
    138             </tr>
    139             <tr>
    140                 <td><label for="cbedu_result_std_gender"><?php esc_html_e('Gender:', 'edu-results'); ?></label></td>
    141                 <td>
    142                     <select id="cbedu_result_std_gender" name="cbedu_result_std_gender">
    143                         <option value="Male" <?php selected($gender, 'Male'); ?>><?php esc_html_e('Male', 'edu-results'); ?></option>
    144                         <option value="Female" <?php selected($gender, 'Female'); ?>><?php esc_html_e('Female', 'edu-results'); ?></option>
    145                         <option value="Other" <?php selected($gender, 'Other'); ?>><?php esc_html_e('Other', 'edu-results'); ?></option>
    146                     </select>
    147                 </td>
    148             </tr>
    149 
    150             <tr>
    151                 <td><label for="cbedu_result_std_phone"><?php esc_html_e('Phone Number:', 'edu-results'); ?></label></td>
    152                 <td><input class="regular-text" type="text" id="cbedu_result_std_phone" name="cbedu_result_std_phone" value="<?php echo esc_attr($phone); ?>" /></td>
    153             </tr>
    154             <tr>
    155                 <td><label for="cbedu_result_std_email"><?php esc_html_e('Email Address:', 'edu-results'); ?></label></td>
    156                 <td><input class="regular-text" type="email" id="cbedu_result_std_email" name="cbedu_result_std_email" value="<?php echo esc_attr($email); ?>" /></td>
    157             </tr>
    158             <tr>
    159                 <td><label for="cbedu_result_std_blood_group"><?php esc_html_e('Blood Group:', 'edu-results'); ?></label></td>
    160                 <td>
    161                     <select id="cbedu_result_std_blood_group" name="cbedu_result_std_blood_group">
    162                         <option value=""><?php esc_html_e('Select Blood Group', 'edu-results'); ?></option>
    163                         <option value="A+" <?php selected($blood_group, 'A+'); ?>><?php esc_html_e('A+', 'edu-results'); ?></option>
    164                         <option value="A-" <?php selected($blood_group, 'A-'); ?>><?php esc_html_e('A-', 'edu-results'); ?></option>
    165                         <option value="B+" <?php selected($blood_group, 'B+'); ?>><?php esc_html_e('B+', 'edu-results'); ?></option>
    166                         <option value="B-" <?php selected($blood_group, 'B-'); ?>><?php esc_html_e('B-', 'edu-results'); ?></option>
    167                         <option value="AB+" <?php selected($blood_group, 'AB+'); ?>><?php esc_html_e('AB+', 'edu-results'); ?></option>
    168                         <option value="AB-" <?php selected($blood_group, 'AB-'); ?>><?php esc_html_e('AB-', 'edu-results'); ?></option>
    169                         <option value="O+" <?php selected($blood_group, 'O+'); ?>><?php esc_html_e('O+', 'edu-results'); ?></option>
    170                         <option value="O-" <?php selected($blood_group, 'O-'); ?>><?php esc_html_e('O-', 'edu-results'); ?></option>
    171                     </select>
    172                 </td>
    173             </tr>
    174             <tr>
    175                 <td><label for="cbedu_result_std_guardian_phone"><?php esc_html_e('Guardian Phone Number:', 'edu-results'); ?></label></td>
    176                 <td><input class="regular-text" type="text" id="cbedu_result_std_guardian_phone" name="cbedu_result_std_guardian_phone" value="<?php echo esc_attr($guardian_phone); ?>" /></td>
    177             </tr>
    178             <tr>
    179                 <td><label for="cbedu_result_std_fathers_qualification"><?php esc_html_e('Father\'s Qualification:', 'edu-results'); ?></label></td>
    180                 <td><input class="regular-text" type="text" id="cbedu_result_std_fathers_qualification" name="cbedu_result_std_fathers_qualification" value="<?php echo esc_attr($fathers_qualification); ?>" /></td>
    181             </tr>
    182             <tr>
    183                 <td><label for="cbedu_result_std_fathers_occupation"><?php esc_html_e('Father\'s Occupation:', 'edu-results'); ?></label></td>
    184                 <td><input class="regular-text" type="text" id="cbedu_result_std_fathers_occupation" name="cbedu_result_std_fathers_occupation" value="<?php echo esc_attr($fathers_occupation); ?>" /></td>
    185             </tr>
    186             <tr>
    187                 <td><label for="cbedu_result_std_mothers_occupation"><?php esc_html_e('Mother\'s Occupation:', 'edu-results'); ?></label></td>
    188                 <td><input class="regular-text" type="text" id="cbedu_result_std_mothers_occupation" name="cbedu_result_std_mothers_occupation" value="<?php echo esc_attr($mothers_occupation); ?>" /></td>
    189             </tr>
    190             <tr>
    191                 <td><label for="cbedu_result_std_mothers_qualification"><?php esc_html_e('Mother\'s Qualification:', 'edu-results'); ?></label></td>
    192                 <td><input class="regular-text" type="text" id="cbedu_result_std_mothers_qualification" name="cbedu_result_std_mothers_qualification" value="<?php echo esc_attr($mothers_qualification); ?>" /></td>
    193             </tr>
    194             <tr>
    195                 <td><label for="cbedu_result_std_birth_registration_number"><?php esc_html_e('Birth Registration Number:', 'edu-results'); ?></label></td>
    196                 <td><input class="regular-text" type="text" id="cbedu_result_std_birth_registration_number" name="cbedu_result_std_birth_registration_number" value="<?php echo esc_attr($birth_registration_number); ?>" /></td>
    197             </tr>
    198             <tr>
    199                 <td><label for="cbedu_result_std_nid_number"><?php esc_html_e('NID Number:', 'edu-results'); ?></label></td>
    200                 <td><input class="regular-text" type="text" id="cbedu_result_std_nid_number" name="cbedu_result_std_nid_number" value="<?php echo esc_attr($nid_number); ?>" /></td>
    201             </tr>
    202             <tr>
    203                 <td><label for="cbedu_result_std_address"><?php esc_html_e('Address:', 'edu-results'); ?></label></td>
    204                 <td>
    205                     <textarea id="cbedu_result_std_address" name="cbedu_result_std_address" rows="4" cols="50"><?php echo esc_textarea($address); ?></textarea>
    206                 </td>
    207             </tr>
    208 
    209         </table>
     203        <div class="cbedu-meta-box-wrap">
     204            <!-- Basic Information Section -->
     205            <div class="cbedu-field-section">
     206                <h3 class="cbedu-section-header"><?php esc_html_e('Basic Information', 'edu-results'); ?></h3>
     207                <div class="cbedu-section-content">
     208                    <div class="cbedu-field-row">
     209                        <div class="cbedu-field-group">
     210                            <label class="cbedu-field-label" for="cbedu_result_std_id">
     211                                <?php esc_html_e('ID Number', 'edu-results'); ?>
     212                                <span class="required">*</span>
     213                            </label>
     214                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_id" name="cbedu_result_std_id" value="<?php echo esc_attr($id_number); ?>" placeholder="<?php esc_attr_e('Enter student ID', 'edu-results'); ?>" />
     215                        </div>
     216                       
     217                        <div class="cbedu-field-group">
     218                            <label class="cbedu-field-label" for="cbedu_result_std_registration_number">
     219                                <?php esc_html_e('Registration Number', 'edu-results'); ?>
     220                                <span class="required">*</span>
     221                            </label>
     222                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_registration_number" name="cbedu_result_std_registration_number" value="<?php echo esc_attr($std_registration_number); ?>" placeholder="<?php esc_attr_e('Enter registration number', 'edu-results'); ?>" />
     223                        </div>
     224                    </div>
     225
     226                    <div class="cbedu-field-row">
     227                        <div class="cbedu-field-group">
     228                            <label class="cbedu-field-label" for="cbedu_result_std_dob">
     229                                <?php esc_html_e('Date of Birth', 'edu-results'); ?>
     230                            </label>
     231                            <input class="cbedu-field-input" type="date" id="cbedu_result_std_dob" name="cbedu_result_std_dob" value="<?php echo esc_attr($dob); ?>" />
     232                        </div>
     233
     234                        <div class="cbedu-field-group">
     235                            <label class="cbedu-field-label" for="cbedu_result_std_gender">
     236                                <?php esc_html_e('Gender', 'edu-results'); ?>
     237                            </label>
     238                            <select class="cbedu-field-select" id="cbedu_result_std_gender" name="cbedu_result_std_gender">
     239                                <option value=""><?php esc_html_e('Select Gender', 'edu-results'); ?></option>
     240                                <option value="Male" <?php selected($gender, 'Male'); ?>><?php esc_html_e('Male', 'edu-results'); ?></option>
     241                                <option value="Female" <?php selected($gender, 'Female'); ?>><?php esc_html_e('Female', 'edu-results'); ?></option>
     242                                <option value="Other" <?php selected($gender, 'Other'); ?>><?php esc_html_e('Other', 'edu-results'); ?></option>
     243                            </select>
     244                        </div>
     245
     246                        <div class="cbedu-field-group">
     247                            <label class="cbedu-field-label" for="cbedu_result_std_blood_group">
     248                                <?php esc_html_e('Blood Group', 'edu-results'); ?>
     249                            </label>
     250                            <select class="cbedu-field-select" id="cbedu_result_std_blood_group" name="cbedu_result_std_blood_group">
     251                                <option value=""><?php esc_html_e('Select Blood Group', 'edu-results'); ?></option>
     252                                <option value="A+" <?php selected($blood_group, 'A+'); ?>>A+</option>
     253                                <option value="A-" <?php selected($blood_group, 'A-'); ?>>A-</option>
     254                                <option value="B+" <?php selected($blood_group, 'B+'); ?>>B+</option>
     255                                <option value="B-" <?php selected($blood_group, 'B-'); ?>>B-</option>
     256                                <option value="AB+" <?php selected($blood_group, 'AB+'); ?>>AB+</option>
     257                                <option value="AB-" <?php selected($blood_group, 'AB-'); ?>>AB-</option>
     258                                <option value="O+" <?php selected($blood_group, 'O+'); ?>>O+</option>
     259                                <option value="O-" <?php selected($blood_group, 'O-'); ?>>O-</option>
     260                            </select>
     261                        </div>
     262                    </div>
     263                </div>
     264            </div>
     265
     266            <!-- Contact Information Section -->
     267            <div class="cbedu-field-section">
     268                <h3 class="cbedu-section-header"><?php esc_html_e('Contact Information', 'edu-results'); ?></h3>
     269                <div class="cbedu-section-content">
     270                    <div class="cbedu-field-row">
     271                        <div class="cbedu-field-group">
     272                            <label class="cbedu-field-label" for="cbedu_result_std_phone">
     273                                <?php esc_html_e('Phone Number', 'edu-results'); ?>
     274                            </label>
     275                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_phone" name="cbedu_result_std_phone" value="<?php echo esc_attr($phone); ?>" placeholder="<?php esc_attr_e('+880...', 'edu-results'); ?>" />
     276                        </div>
     277
     278                        <div class="cbedu-field-group">
     279                            <label class="cbedu-field-label" for="cbedu_result_std_email">
     280                                <?php esc_html_e('Email Address', 'edu-results'); ?>
     281                            </label>
     282                            <input class="cbedu-field-input" type="email" id="cbedu_result_std_email" name="cbedu_result_std_email" value="<?php echo esc_attr($email); ?>" placeholder="<?php esc_attr_e('student@example.com', 'edu-results'); ?>" />
     283                        </div>
     284
     285                        <div class="cbedu-field-group">
     286                            <label class="cbedu-field-label" for="cbedu_result_std_guardian_phone">
     287                                <?php esc_html_e('Guardian Phone', 'edu-results'); ?>
     288                            </label>
     289                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_guardian_phone" name="cbedu_result_std_guardian_phone" value="<?php echo esc_attr($guardian_phone); ?>" placeholder="<?php esc_attr_e('+880...', 'edu-results'); ?>" />
     290                        </div>
     291                    </div>
     292
     293                    <div class="cbedu-field-row">
     294                        <div class="cbedu-field-group cbedu-field-full">
     295                            <label class="cbedu-field-label" for="cbedu_result_std_address">
     296                                <?php esc_html_e('Address', 'edu-results'); ?>
     297                            </label>
     298                            <textarea class="cbedu-field-textarea" id="cbedu_result_std_address" name="cbedu_result_std_address" rows="3" placeholder="<?php esc_attr_e('Enter full address...', 'edu-results'); ?>"><?php echo esc_textarea($address); ?></textarea>
     299                        </div>
     300                    </div>
     301                </div>
     302            </div>
     303
     304            <!-- Family Information Section -->
     305            <div class="cbedu-field-section">
     306                <h3 class="cbedu-section-header"><?php esc_html_e('Family Information', 'edu-results'); ?></h3>
     307                <div class="cbedu-section-content">
     308                    <div class="cbedu-field-row">
     309                        <div class="cbedu-field-group">
     310                            <label class="cbedu-field-label" for="cbedu_result_std_father_name">
     311                                <?php esc_html_e("Father's Name", 'edu-results'); ?>
     312                            </label>
     313                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_father_name" name="cbedu_result_std_father_name" value="<?php echo esc_attr($father_name); ?>" placeholder="<?php esc_attr_e("Enter father's name", 'edu-results'); ?>" />
     314                        </div>
     315
     316                        <div class="cbedu-field-group">
     317                            <label class="cbedu-field-label" for="cbedu_result_std_fathers_occupation">
     318                                <?php esc_html_e("Father's Occupation", 'edu-results'); ?>
     319                            </label>
     320                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_fathers_occupation" name="cbedu_result_std_fathers_occupation" value="<?php echo esc_attr($fathers_occupation); ?>" placeholder="<?php esc_attr_e('Enter occupation', 'edu-results'); ?>" />
     321                        </div>
     322
     323                        <div class="cbedu-field-group">
     324                            <label class="cbedu-field-label" for="cbedu_result_std_fathers_qualification">
     325                                <?php esc_html_e("Father's Qualification", 'edu-results'); ?>
     326                            </label>
     327                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_fathers_qualification" name="cbedu_result_std_fathers_qualification" value="<?php echo esc_attr($fathers_qualification); ?>" placeholder="<?php esc_attr_e('Enter qualification', 'edu-results'); ?>" />
     328                        </div>
     329                    </div>
     330
     331                    <div class="cbedu-field-row">
     332                        <div class="cbedu-field-group">
     333                            <label class="cbedu-field-label" for="cbedu_result_std_mother_name">
     334                                <?php esc_html_e("Mother's Name", 'edu-results'); ?>
     335                            </label>
     336                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_mother_name" name="cbedu_result_std_mother_name" value="<?php echo esc_attr($mother_name); ?>" placeholder="<?php esc_attr_e("Enter mother's name", 'edu-results'); ?>" />
     337                        </div>
     338
     339                        <div class="cbedu-field-group">
     340                            <label class="cbedu-field-label" for="cbedu_result_std_mothers_occupation">
     341                                <?php esc_html_e("Mother's Occupation", 'edu-results'); ?>
     342                            </label>
     343                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_mothers_occupation" name="cbedu_result_std_mothers_occupation" value="<?php echo esc_attr($mothers_occupation); ?>" placeholder="<?php esc_attr_e('Enter occupation', 'edu-results'); ?>" />
     344                        </div>
     345
     346                        <div class="cbedu-field-group">
     347                            <label class="cbedu-field-label" for="cbedu_result_std_mothers_qualification">
     348                                <?php esc_html_e("Mother's Qualification", 'edu-results'); ?>
     349                            </label>
     350                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_mothers_qualification" name="cbedu_result_std_mothers_qualification" value="<?php echo esc_attr($mothers_qualification); ?>" placeholder="<?php esc_attr_e('Enter qualification', 'edu-results'); ?>" />
     351                        </div>
     352                    </div>
     353                </div>
     354            </div>
     355
     356            <!-- Government Documents Section -->
     357            <div class="cbedu-field-section">
     358                <h3 class="cbedu-section-header"><?php esc_html_e('Government Documents', 'edu-results'); ?></h3>
     359                <div class="cbedu-section-content">
     360                    <div class="cbedu-field-row">
     361                        <div class="cbedu-field-group">
     362                            <label class="cbedu-field-label" for="cbedu_result_std_birth_registration_number">
     363                                <?php esc_html_e('Birth Registration Number', 'edu-results'); ?>
     364                            </label>
     365                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_birth_registration_number" name="cbedu_result_std_birth_registration_number" value="<?php echo esc_attr($birth_registration_number); ?>" placeholder="<?php esc_attr_e('Enter birth registration number', 'edu-results'); ?>" />
     366                        </div>
     367
     368                        <div class="cbedu-field-group">
     369                            <label class="cbedu-field-label" for="cbedu_result_std_nid_number">
     370                                <?php esc_html_e('NID Number', 'edu-results'); ?>
     371                            </label>
     372                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_nid_number" name="cbedu_result_std_nid_number" value="<?php echo esc_attr($nid_number); ?>" placeholder="<?php esc_attr_e('Enter NID number', 'edu-results'); ?>" />
     373                        </div>
     374                    </div>
     375                </div>
     376            </div>
     377        </div>
    210378    <?php
    211379    }
     
    220388        // Save the custom field values when the post is saved
    221389        if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
     390            return;
     391        }
     392
     393        // Skip auto-draft, trash, and inherit posts
     394        $post_status = get_post_status($post_id);
     395        if (in_array($post_status, array('auto-draft', 'trash', 'inherit'))) {
     396            return;
     397        }
     398
     399        // Check post type
     400        if (get_post_type($post_id) !== 'cbedu_students') {
    222401            return;
    223402        }
     
    346525        // Output HTML input for subject code
    347526    ?>
    348         <table>
    349             <tr>
    350                 <td>
    351                     <label for="cbedu_subject_code"><?php esc_html_e('Subject Code:', 'edu-results'); ?></label>
    352                 </td>
    353                 <td>
    354                     <input class="regular-text" type="text" id="cbedu_subject_code" name="cbedu_subject_code" value="<?php echo esc_attr($subject_code); ?>" />
    355                 </td>
    356             </tr>
    357         </table>
     527        <div class="cbedu-meta-box-wrap">
     528            <div class="cbedu-field-section">
     529                <h3 class="cbedu-section-header"><?php esc_html_e('Subject Information', 'edu-results'); ?></h3>
     530                <div class="cbedu-section-content">
     531                    <div class="cbedu-field-row">
     532                        <div class="cbedu-field-group">
     533                            <label class="cbedu-field-label" for="cbedu_subject_code">
     534                                <?php esc_html_e('Subject Code', 'edu-results'); ?>
     535                            </label>
     536                            <input class="cbedu-field-input" type="text" id="cbedu_subject_code" name="cbedu_subject_code" value="<?php echo esc_attr($subject_code); ?>" placeholder="<?php esc_attr_e('e.g., MATH101', 'edu-results'); ?>" />
     537                            <p class="cbedu-field-description"><?php esc_html_e('Enter a unique code for this subject', 'edu-results'); ?></p>
     538                        </div>
     539                    </div>
     540                </div>
     541            </div>
     542        </div>
    358543    <?php
    359544    }
     
    368553        // Save the custom field value when the post is saved
    369554        if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
     555            return;
     556        }
     557
     558        // Skip auto-draft, trash, and inherit posts
     559        $post_status = get_post_status($post_id);
     560        if (in_array($post_status, array('auto-draft', 'trash', 'inherit'))) {
     561            return;
     562        }
     563
     564        // Check post type
     565        if (get_post_type($post_id) !== 'cbedu_subjects') {
    370566            return;
    371567        }
     
    440636
    441637    ?>
    442         <table>
    443             <?php
    444             $this->render_registration_number_input($post);
    445             ?>
    446             <tr>
    447                 <td>
    448                     <label for="cbedu_result_std_roll"><?php esc_html_e('Roll:', 'edu-results'); ?></label>
    449                 </td>
    450                 <td>
    451                     <input class="regular-text" style="padding: 7px 10px;" type="text" id="cbedu_result_std_roll" name="cbedu_result_std_roll" value="<?php echo esc_attr($roll); ?>" />
    452                 </td>
    453             </tr>
    454             <tr>
    455                 <td><label for="cbedu_result_std_name"><?php esc_html_e('Student Name:', 'edu-results'); ?></label></td>
    456                 <td><input type="text" style="padding: 7px 10px;width: 100%;" id="cbedu_result_std_name" name="cbedu_result_std_name" value="<?php echo esc_attr($student_name) ?>" readonly /></td>
    457             </tr>
    458             <tr>
    459                 <td><label for="cbedu_result_std_fathers_name"><?php esc_html_e('Father\'s Name:', 'edu-results'); ?></label></td>
    460                 <td><input type="text" style="padding: 7px 10px;width: 100%;" id="cbedu_result_std_fathers_name" name="cbedu_result_std_fathers_name" value="<?php echo esc_attr($fathers_name); ?>" readonly /></td>
    461             </tr>
    462             <tr>
    463                 <td><label for="cbedu_result_std_mothers_name"><?php esc_html_e('Mother\'s Name:', 'edu-results'); ?></label></td>
    464                 <td><input type="text" style="padding: 7px 10px;width: 100%;" id="cbedu_result_std_mothers_name" name="cbedu_result_std_mothers_name" value="<?php echo esc_attr($mothers_name); ?>" readonly /></td>
    465             </tr>
    466             <tr>
    467                 <td>
    468                     <label for="cbedu_result_std_student_type"><?php esc_html_e('Student Type:', 'edu-results'); ?></label>
    469                 </td>
    470                 <td>
    471                     <input class="regular-text" style="padding: 7px 10px;" type="text" id="cbedu_result_std_student_type" name="cbedu_result_std_student_type" value="<?php echo esc_attr($student_type); ?>" />
    472                 </td>
    473             </tr>
    474             <tr style="margin-top: 10px;margin-bottom:10px;">
    475                 <td>
    476                     <label><?php esc_html_e('Result Status:', 'edu-results'); ?></label>
    477                 </td>
    478                 <td>
    479                     <input type="radio" id="cbedu_result_std_result_status_passed" name="cbedu_result_std_result_status" value="Passed" <?php checked($result_status, 'Passed'); ?> />
    480                     <label for="cbedu_result_std_result_status_passed" style="margin-right: 10px;"><?php esc_html_e('Passed', 'edu-results'); ?></label>
    481 
    482                     <input type="radio" id="cbedu_result_std_result_status_failed" name="cbedu_result_std_result_status" value="Failed" <?php checked($result_status, 'Failed'); ?> />
    483                     <label for="cbedu_result_std_result_status_failed"><?php esc_html_e('Failed', 'edu-results'); ?></label>
    484                 </td>
    485             </tr>
    486             <tr>
    487                 <td>
    488                     <label for="cbedu_result_std_gpa"><?php esc_html_e('GPA:', 'edu-results'); ?></label>
    489                 </td>
    490                 <td>
    491                     <input class="regular-text" style="padding: 7px 10px;" type="text" id="cbedu_result_std_gpa" name="cbedu_result_std_gpa" value="<?php echo esc_attr($gpa); ?>" />
    492                 </td>
    493             </tr>
    494             <tr>
    495                 <td>
    496                     <label for="cbedu_result_std_was_gpa"><?php _e('GPA <abbr title="Without additional subject">(WAS)</abbr>:', 'edu-results'); ?></label>
    497                 </td>
    498                 <td>
    499                     <input class="regular-text" style="padding: 7px 10px;" type="text" id="cbedu_result_std_was_gpa" name="cbedu_result_std_was_gpa" value="<?php echo esc_attr($was_gpa); ?>" />
    500                 </td>
    501             </tr>
    502         </table>
     638        <div class="cbedu-meta-box-wrap">
     639            <!-- Student Selection Section -->
     640            <div class="cbedu-field-section">
     641                <h3 class="cbedu-section-header"><?php esc_html_e('Student Selection', 'edu-results'); ?></h3>
     642                <div class="cbedu-section-content">
     643                    <div class="cbedu-field-row">
     644                        <div class="cbedu-field-group">
     645                            <label class="cbedu-field-label" for="cbedu_result_std_registration_number">
     646                                <?php esc_html_e('Registration Number', 'edu-results'); ?>
     647                                <span class="required">*</span>
     648                            </label>
     649                            <input class="cbedu-field-input cbedu-registration-number-autocomplete" type="text" id="cbedu_result_std_registration_number" name="cbedu_result_std_registration_number" value="<?php echo esc_attr($current_reg_number); ?>" placeholder="<?php esc_attr_e('Start typing...', 'edu-results'); ?>" />
     650                            <p class="cbedu-field-description"><?php esc_html_e('Type to search and select student registration number', 'edu-results'); ?></p>
     651                        </div>
     652                        <div class="cbedu-field-group">
     653                            <label class="cbedu-field-label" for="cbedu_result_std_roll">
     654                                <?php esc_html_e('Roll Number', 'edu-results'); ?>
     655                            </label>
     656                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_roll" name="cbedu_result_std_roll" value="<?php echo esc_attr($roll); ?>" placeholder="<?php esc_attr_e('Enter roll number', 'edu-results'); ?>" />
     657                        </div>
     658                    </div>
     659                   
     660                    <div class="cbedu-field-row">
     661                        <div class="cbedu-field-group">
     662                            <label class="cbedu-field-label" for="cbedu_result_std_name">
     663                                <?php esc_html_e('Student Name', 'edu-results'); ?>
     664                            </label>
     665                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_name" name="cbedu_result_std_name" value="<?php echo esc_attr($student_name); ?>" readonly style="background-color: #f0f0f1; cursor: not-allowed;" />
     666                        </div>
     667                        <div class="cbedu-field-group">
     668                            <label class="cbedu-field-label" for="cbedu_result_std_fathers_name">
     669                                <?php esc_html_e("Father's Name", 'edu-results'); ?>
     670                            </label>
     671                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_fathers_name" name="cbedu_result_std_fathers_name" value="<?php echo esc_attr($fathers_name); ?>" readonly style="background-color: #f0f0f1; cursor: not-allowed;" />
     672                        </div>
     673                        <div class="cbedu-field-group">
     674                            <label class="cbedu-field-label" for="cbedu_result_std_mothers_name">
     675                                <?php esc_html_e("Mother's Name", 'edu-results'); ?>
     676                            </label>
     677                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_mothers_name" name="cbedu_result_std_mothers_name" value="<?php echo esc_attr($mothers_name); ?>" readonly style="background-color: #f0f0f1; cursor: not-allowed;" />
     678                        </div>
     679                    </div>
     680                </div>
     681            </div>
     682
     683            <!-- Result Details Section -->
     684            <div class="cbedu-field-section">
     685                <h3 class="cbedu-section-header"><?php esc_html_e('Result Details', 'edu-results'); ?></h3>
     686                <div class="cbedu-section-content">
     687                    <div class="cbedu-field-row">
     688                        <div class="cbedu-field-group">
     689                            <label class="cbedu-field-label" for="cbedu_result_std_student_type">
     690                                <?php esc_html_e('Student Type', 'edu-results'); ?>
     691                            </label>
     692                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_student_type" name="cbedu_result_std_student_type" value="<?php echo esc_attr($student_type); ?>" placeholder="<?php esc_attr_e('e.g., Regular, Private', 'edu-results'); ?>" />
     693                        </div>
     694                       
     695                        <div class="cbedu-field-group">
     696                            <label class="cbedu-field-label">
     697                                <?php esc_html_e('Result Status', 'edu-results'); ?>
     698                            </label>
     699                            <div style="display: flex; gap: 20px; align-items: center; margin-top: 8px;">
     700                                <label style="display: flex; align-items: center; gap: 6px; cursor: pointer; font-weight: normal;">
     701                                    <input type="radio" id="cbedu_result_std_result_status_passed" name="cbedu_result_std_result_status" value="Passed" <?php checked($result_status, 'Passed'); ?> />
     702                                    <?php esc_html_e('Passed', 'edu-results'); ?>
     703                                </label>
     704                                <label style="display: flex; align-items: center; gap: 6px; cursor: pointer; font-weight: normal;">
     705                                    <input type="radio" id="cbedu_result_std_result_status_failed" name="cbedu_result_std_result_status" value="Failed" <?php checked($result_status, 'Failed'); ?> />
     706                                    <?php esc_html_e('Failed', 'edu-results'); ?>
     707                                </label>
     708                            </div>
     709                        </div>
     710                    </div>
     711
     712                    <div class="cbedu-field-row">
     713                        <div class="cbedu-field-group">
     714                            <label class="cbedu-field-label" for="cbedu_result_std_gpa">
     715                                <?php esc_html_e('GPA', 'edu-results'); ?>
     716                            </label>
     717                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_gpa" name="cbedu_result_std_gpa" value="<?php echo esc_attr($gpa); ?>" placeholder="<?php esc_attr_e('e.g., 4.50', 'edu-results'); ?>" />
     718                        </div>
     719
     720                        <div class="cbedu-field-group">
     721                            <label class="cbedu-field-label" for="cbedu_result_std_was_gpa">
     722                                <?php esc_html_e('GPA (WAS)', 'edu-results'); ?>
     723                            </label>
     724                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_was_gpa" name="cbedu_result_std_was_gpa" value="<?php echo esc_attr($was_gpa); ?>" placeholder="<?php esc_attr_e('e.g., 4.50', 'edu-results'); ?>" />
     725                            <p class="cbedu-field-description"><?php esc_html_e('GPA Without Additional Subject', 'edu-results'); ?></p>
     726                        </div>
     727                    </div>
     728                </div>
     729            </div>
     730        </div>
    503731    <?php
    504732    }
     
    509737     * @param object $post The post object.
    510738     * @throws Some_Exception_Class If there is an error retrieving the registration number or the students.
    511      * @return void
    512      */
    513     private function render_registration_number_input($post)
    514     {
    515         // Get current value
    516         $current_value = get_post_meta($post->ID, 'cbedu_result_std_registration_number', true);
    517    
    518         // Translatable string with text domain
    519         $label = __('Registration Number:', 'edu-results');
    520    
    521         echo '<tr><td><label for="cbedu_result_std_registration_number">' . esc_html($label) . '</label></td>';
    522         echo '<td><input style="padding: 7px 10px;width: 100%;" type="text" id="cbedu_result_std_registration_number" name="cbedu_result_std_registration_number" class="cbedu-registration-number-autocomplete" value="' . esc_attr($current_value) . '" placeholder="Start typing...">';
    523         echo '</td></tr>';
    524     }
    525    
    526 
    527 
    528739    /**
    529740     * Saves the result fields for a given post ID.
     
    534745    {
    535746        if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
     747            return;
     748        }
     749
     750        // Skip auto-draft, trash, and inherit posts
     751        $post_status = get_post_status($post_id);
     752        if (in_array($post_status, array('auto-draft', 'trash', 'inherit'))) {
     753            return;
     754        }
     755
     756        // Check post type
     757        if (get_post_type($post_id) !== 'cbedu_results') {
    536758            return;
    537759        }
     
    624846        if (get_post_type($post_id) !== 'cbedu_results') return;
    625847
     848        // Skip auto-draft, trash, and inherit posts
     849        $post_status = get_post_status($post_id);
     850        if (in_array($post_status, array('auto-draft', 'trash', 'inherit'))) return;
     851
    626852        // Get the registration number from the 'cbedu_results' post meta
    627853        $registration_number = get_post_meta($post_id, 'cbedu_result_std_registration_number', true);
     854
     855        // Skip if no registration number is set
     856        if (empty($registration_number)) return;
    628857
    629858        // Find the 'cbedu_students' post with this registration number
     
    642871            // Check if the title is different from the current title of 'cbedu_results' post
    643872            if (get_the_title($post_id) !== $student_post_title) {
     873                // Unhook to prevent infinite loop
     874                remove_action('save_post', array($this, 'update_cbedu_results_title_on_save'));
     875               
    644876                // Update the title of 'cbedu_results' post               
    645877                wp_update_post(array(
     
    647879                    'post_title' => $student_post_title
    648880                ));
     881               
     882                // Re-hook the action
     883                add_action('save_post', array($this, 'update_cbedu_results_title_on_save'));
    649884            }
    650885        }
     
    662897        // Check for autosave
    663898        if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
     899
     900        // Skip auto-draft, trash, and inherit posts
     901        $post_status = get_post_status($post_id);
     902        if (in_array($post_status, array('auto-draft', 'trash', 'inherit'))) return;
    664903
    665904        // Check the post type
  • edu-results-publishing/tags/1.2.0/inc/lib/custom-functions.php

    r3022038 r3422911  
    1 <?php
     1<?php
     2
    23namespace cbedu\inc\lib\CBEDUCustomFunctions;
    34
    4 if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
     5if (! defined('ABSPATH')) exit; // Exit if accessed directly
    56
    6 class CBEDUCustomFunctions {
     7class CBEDUCustomFunctions
     8{
    79    private $prefix;
    810    private $required_taxonomies = [
     
    1315    ];
    1416
    15     public function __construct($prefix) {
     17    public function __construct($prefix)
     18    {
    1619        $this->prefix = $prefix;
    1720        add_action('save_post', array($this, 'check_taxonomy_requirements'), 10, 3);
     
    1922    }
    2023
    21     public function check_taxonomy_requirements($post_id, $post, $update) {
    22         if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE || $post->post_type != $this->prefix . 'results') return;
     24    //auto save if taxonomy not selected
     25    public function check_taxonomy_requirements($post_id, $post, $update)
     26    {
    2327
     28        // 1) Safety checks
     29        if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
     30            return;
     31        }
     32
     33        if (! $post || $post->post_type !== $this->prefix . 'results') {
     34            return;
     35        }
     36
     37        if (! current_user_can('edit_post', $post_id)) {
     38            return;
     39        }
     40
     41        // 2) ONLY run when user is trying to publish
     42        //    (Publish button / publish action)
     43        $new_status      = isset($_POST['post_status']) ? sanitize_text_field($_POST['post_status']) : '';
     44        $original_status = isset($_POST['original_post_status']) ? sanitize_text_field($_POST['original_post_status']) : '';
     45
     46        // If not trying to publish right now, do nothing (covers autosave, "Save Draft", updates while draft, etc.)
     47        if ($new_status !== 'publish') {
     48            return;
     49        }
     50
     51        // Optional: if it's already published and user is just updating it, skip
     52        // (remove this block if you ALSO want to enforce taxonomies on updates to published posts)
     53        if ($original_status === 'publish') {
     54            return;
     55        }
     56
     57        // 3) Validate required taxonomies
    2458        $missing_taxonomies = [];
     59
    2560        foreach ($this->required_taxonomies as $taxonomy) {
    26             $terms = wp_get_post_terms($post_id, $taxonomy);
     61            $terms = wp_get_post_terms($post_id, $taxonomy, ['fields' => 'ids']);
    2762            if (empty($terms) || is_wp_error($terms)) {
    2863                $missing_taxonomies[] = $taxonomy;
     
    3065        }
    3166
    32         if (!empty($missing_taxonomies)) {
    33             remove_action('save_post', array($this, 'check_taxonomy_requirements'));
     67        if (empty($missing_taxonomies)) {
     68            return;
     69        }
    3470
    35             wp_update_post([
    36                 'ID'          => $post_id,
    37                 'post_status' => 'draft',
    38             ]);
     71        // 4) Force back to draft + show notice
     72        remove_action('save_post', [$this, 'check_taxonomy_requirements'], 10);
    3973
    40             add_action('save_post', array($this, 'check_taxonomy_requirements'), 10, 3);
     74        wp_update_post([
     75            'ID'          => $post_id,
     76            'post_status' => 'draft',
     77        ]);
    4178
    42             add_filter('redirect_post_location', function ($location) use ($missing_taxonomies) {
    43                 return add_query_arg('cbedu_taxonomy_errors', implode(',', $missing_taxonomies), $location);
    44             });
    45         }
     79        add_action('save_post', [$this, 'check_taxonomy_requirements'], 10, 3);
     80
     81        add_filter('redirect_post_location', function ($location) use ($missing_taxonomies) {
     82            return add_query_arg('cbedu_taxonomy_errors', implode(',', $missing_taxonomies), $location);
     83        });
    4684    }
    4785
    48     public function display_admin_notice() {
     86
     87    public function display_admin_notice()
     88    {
    4989        if (!empty($_GET['cbedu_taxonomy_errors'])) {
    5090            $taxonomy_slugs = explode(',', sanitize_text_field($_GET['cbedu_taxonomy_errors']));
    5191            $taxonomy_names = [];
    52    
     92
    5393            foreach ($taxonomy_slugs as $slug) {
    5494                $taxonomy_obj = get_taxonomy($slug);
     
    5898            // Prepare the list of taxonomy names for display
    5999            $taxonomies_list = esc_html(implode(', ', $taxonomy_names));
    60        
     100
    61101            // Use sprintf for formatting and make the string translatable
    62102            $error_message = sprintf(
     
    64104                $taxonomies_list
    65105            );
    66        
     106
    67107            echo '<div class="error"><p>' . $error_message . '</p></div>';
    68108        }
    69            
    70109    }
    71110}
  • edu-results-publishing/tags/1.2.0/inc/lib/custom-posts.php

    r3019484 r3422911  
    127127            'labels' => $labels,
    128128            'public' => true,
    129             'publicly_queryable' => true,
     129            'publicly_queryable' => false,
    130130            'show_ui' => true,
    131131            'show_in_menu' => false,
  • edu-results-publishing/tags/1.2.0/inc/lib/shortcode.php

    r3019484 r3422911  
    5757        ob_start(); ?>
    5858        <div class="cbedu-results-search-form-area">
    59             <form action="javascript:void(0)" method="post" id="cbedu-results-form">
    60                 <!-- Examination Dropdown -->
    61                 <div class="cbedu-results-search-form-single-element-area">
    62                     <div class="cbedu-results-search-form-single-element">
    63                         <label for="examination"><?php _e('Examination:', 'edu-results'); ?></label>
    64                         <select name="examination" id="examination" required>
    65                             <option value=""><?php _e('Select Examination', 'edu-results'); ?></option>
    66                             <?php
    67                             $examinations = get_terms('cbedu_examinations', array('hide_empty' => false));
    68                             foreach ($examinations as $examination) {
    69                                 echo '<option value="' . esc_attr($examination->slug) . '">' . esc_html($examination->name) . '</option>';
    70                             }
    71                             ?>
    72                         </select>                   
    73                     </div>
    74                     <div class="cbedu-error-message" id="cbedu-examination-error"></div>
    75                 </div><!--/ Examination Dropdown -->
    76 
    77 
    78                 <!-- Year Dropdown -->
    79                 <div class="cbedu-results-search-form-single-element-area">
    80                     <div class="cbedu-results-search-form-single-element">
    81                         <label for="year"><?php _e('Year:', 'edu-results'); ?></label>
    82                         <select name="year" id="year" required>
    83                             <option value=""><?php _e('Select Year', 'edu-results'); ?></option>
    84                             <?php
    85                                 $years = get_terms('cbedu_session_years', array('hide_empty' => false));
    86                                 foreach ($years as $year) {
    87                                     echo '<option value="' . esc_attr($year->slug) . '">' . esc_html($year->name) . '</option>';
     59            <div class="cbedu-search-form-header">
     60                <h2>🎓 Student Result Search</h2>
     61                <p>Enter your details below to view your examination results</p>
     62            </div>
     63           
     64            <form action="javascript:void(0)" method="post" id="cbedu-results-form" class="cbedu-modern-form">
     65                <div class="cbedu-form-grid">
     66                    <!-- Examination Dropdown -->
     67                    <div class="cbedu-form-field">
     68                        <label for="examination">
     69                            <span class="label-icon">📝</span>
     70                            <?php _e('Examination', 'edu-results'); ?>
     71                            <span class="required">*</span>
     72                        </label>
     73                        <div class="cbedu-select-wrapper">
     74                            <select name="examination" id="examination" required>
     75                                <option value=""><?php _e('Select Examination', 'edu-results'); ?></option>
     76                                <?php
     77                                $examinations = get_terms('cbedu_examinations', array('hide_empty' => false));
     78                                foreach ($examinations as $examination) {
     79                                    echo '<option value="' . esc_attr($examination->slug) . '">' . esc_html($examination->name) . '</option>';
    8880                                }
    89                             ?>
    90                         </select>                   
    91                     </div>
    92                     <div class="cbedu-error-message" id="cbedu-year-error"></div>
    93                 </div><!--/ Year Dropdown -->
    94 
    95                 <!-- Board Dropdown -->
    96                 <div class="cbedu-results-search-form-single-element-area">
    97                     <div class="cbedu-results-search-form-single-element">
    98                         <label for="board"><?php _e('Board:', 'edu-results'); ?></label>
    99                         <select name="board" id="board" required>
    100                             <option value=""><?php _e('Select Board', 'edu-results'); ?></option>
    101                             <?php
    102                                 $boards = get_terms('cbedu_boards', array('hide_empty' => false));
    103                                 foreach ($boards as $board) {
    104                                     echo '<option value="' . esc_attr($board->slug) . '">' . esc_html($board->name) . '</option>';
    105                                 }
    106                             ?>
    107                         </select>                   
    108                     </div>
    109                     <div class="cbedu-error-message" id="cbedu-board-error"></div>
    110                 </div><!--/ Board Dropdown -->
    111 
    112                 <!-- Department/Group Dropdown -->
    113                 <div class="cbedu-results-search-form-single-element-area">
    114                     <div class="cbedu-results-search-form-single-element">
    115                         <label for="department_group"><?php _e('Department/Group:', 'edu-results'); ?></label>
    116                         <select name="department_group" id="department_group" required>
    117                             <option value=""><?php _e('Select Department/Group', 'edu-results'); ?></option>
    118                             <?php
    119                                 $groups = get_terms('cbedu_department_group', array('hide_empty' => false));
    120                                 foreach ($groups as $group) {
    121                                     echo '<option value="' . esc_attr($group->slug) . '">' . esc_html($group->name) . '</option>';
    122                                 }
    123                             ?>
    124                         </select>                   
    125                     </div>
    126                     <div class="cbedu-error-message" id="cbedu-department-group-error"></div>
    127                 </div><!--/ Department/Group Dropdown -->
    128 
    129                 <!-- Registration Number Input -->
    130                 <div class="cbedu-results-search-form-single-element-area">
    131                     <div class="cbedu-results-search-form-single-element">
    132                         <label for="registration_number"><?php _e('Registration Number:', 'edu-results'); ?></label>
    133                         <input type="text" name="registration_number" id="registration_number" placeholder="<?php echo esc_attr($placeholder); ?>" required>                   
    134                     </div>
    135                     <div class="cbedu-error-message" id="cbedu-registration-number-error"></div>
    136                 </div><!--/ Registration Number Input -->
    137 
    138                 <!-- Roll Input -->
    139                 <div class="cbedu-results-search-form-single-element-area">
    140                     <div class="cbedu-results-search-form-single-element">
    141                         <label for="roll"><?php _e('Roll:', 'edu-results'); ?></label>
    142                         <input type="text" name="roll" id="roll" placeholder="Enter Roll" required>                   
    143                     </div>
    144                     <div class="cbedu-error-message" id="cbedu-roll-error"></div>
    145                 </div><!--/ Roll Input -->
    146 
     81                                ?>
     82                            </select>
     83                        </div>
     84                        <div class="cbedu-error-message" id="cbedu-examination-error"></div>
     85                    </div>
     86
     87                    <!-- Year Dropdown -->
     88                    <div class="cbedu-form-field">
     89                        <label for="year">
     90                            <span class="label-icon">📅</span>
     91                            <?php _e('Year', 'edu-results'); ?>
     92                            <span class="required">*</span>
     93                        </label>
     94                        <div class="cbedu-select-wrapper">
     95                            <select name="year" id="year" required>
     96                                <option value=""><?php _e('Select Year', 'edu-results'); ?></option>
     97                                <?php
     98                                    $years = get_terms('cbedu_session_years', array('hide_empty' => false));
     99                                    foreach ($years as $year) {
     100                                        echo '<option value="' . esc_attr($year->slug) . '">' . esc_html($year->name) . '</option>';
     101                                    }
     102                                ?>
     103                            </select>
     104                        </div>
     105                        <div class="cbedu-error-message" id="cbedu-year-error"></div>
     106                    </div>
     107
     108                    <!-- Board Dropdown -->
     109                    <div class="cbedu-form-field">
     110                        <label for="board">
     111                            <span class="label-icon">🏛️</span>
     112                            <?php _e('Board', 'edu-results'); ?>
     113                            <span class="required">*</span>
     114                        </label>
     115                        <div class="cbedu-select-wrapper">
     116                            <select name="board" id="board" required>
     117                                <option value=""><?php _e('Select Board', 'edu-results'); ?></option>
     118                                <?php
     119                                    $boards = get_terms('cbedu_boards', array('hide_empty' => false));
     120                                    foreach ($boards as $board) {
     121                                        echo '<option value="' . esc_attr($board->slug) . '">' . esc_html($board->name) . '</option>';
     122                                    }
     123                                ?>
     124                            </select>
     125                        </div>
     126                        <div class="cbedu-error-message" id="cbedu-board-error"></div>
     127                    </div>
     128
     129                    <!-- Department/Group Dropdown -->
     130                    <div class="cbedu-form-field">
     131                        <label for="department_group">
     132                            <span class="label-icon">📚</span>
     133                            <?php _e('Department/Group', 'edu-results'); ?>
     134                            <span class="required">*</span>
     135                        </label>
     136                        <div class="cbedu-select-wrapper">
     137                            <select name="department_group" id="department_group" required>
     138                                <option value=""><?php _e('Select Department/Group', 'edu-results'); ?></option>
     139                                <?php
     140                                    $groups = get_terms('cbedu_department_group', array('hide_empty' => false));
     141                                    foreach ($groups as $group) {
     142                                        echo '<option value="' . esc_attr($group->slug) . '">' . esc_html($group->name) . '</option>';
     143                                    }
     144                                ?>
     145                            </select>
     146                        </div>
     147                        <div class="cbedu-error-message" id="cbedu-department-group-error"></div>
     148                    </div>
     149
     150                    <!-- Registration Number Input -->
     151                    <div class="cbedu-form-field">
     152                        <label for="registration_number">
     153                            <span class="label-icon">🎫</span>
     154                            <?php _e('Registration Number', 'edu-results'); ?>
     155                            <span class="required">*</span>
     156                        </label>
     157                        <input type="text" name="registration_number" id="registration_number"
     158                               placeholder="<?php echo esc_attr($placeholder); ?>" required>
     159                        <div class="cbedu-error-message" id="cbedu-registration-number-error"></div>
     160                    </div>
     161
     162                    <!-- Roll Input -->
     163                    <div class="cbedu-form-field">
     164                        <label for="roll">
     165                            <span class="label-icon">🔢</span>
     166                            <?php _e('Roll', 'edu-results'); ?>
     167                            <span class="required">*</span>
     168                        </label>
     169                        <input type="text" name="roll" id="roll" placeholder="Enter Roll" required>
     170                        <div class="cbedu-error-message" id="cbedu-roll-error"></div>
     171                    </div>
     172                </div>
    147173               
    148174                <!-- Submit Button -->
    149                 <div class="cbedu-results-search-form-single-element cbedu-results-search-form-submit">
    150                     <input type="submit" value="<?php echo esc_attr($button_text); ?>">
     175                <div class="cbedu-form-submit-wrapper">
     176                    <button type="submit" class="cbedu-submit-btn">
     177                        <span class="btn-icon">🔍</span>
     178                        <span class="btn-text"><?php echo esc_html($button_text); ?></span>
     179                        <span class="btn-arrow">→</span>
     180                    </button>
    151181                </div>
    152                
    153182            </form>       
    154183
    155             <div id="cbedu-ajax-result-preloader" style="display: none;">
    156                 <div class="cbedu-ajax-preloader-ellipsis"><div></div><div></div><div></div><div></div></div>
     184            <div id="cbedu-ajax-result-preloader" class="cbedu-preloader-wrapper" style="display: none;">
     185                <div class="cbedu-preloader-content">
     186                    <div class="cbedu-ajax-preloader-ellipsis"><div></div><div></div><div></div><div></div></div>
     187                    <p class="cbedu-preloader-text">Loading your results...</p>
     188                </div>
    157189            </div>
     190           
    158191            <!-- CBEDU Results Display -->
    159192            <div id="cbedu-results-display"></div>
  • edu-results-publishing/tags/1.2.0/readme.txt

    r3022038 r3422911  
    22Contributors: hmbashar
    33Donate link: https://www.buymeacoffee.com/hmbashar
    4 Tags: Result, WP Result Plugin, EDU Results, academic, student, education, examination, report card, gradebook, transcript, college management, university result
     4Tags: Result, WP Result Plugin, EDU Results, academic
    55Requires at least: 4.7
    6 Tested up to: 6.4.2
    7 Stable tag: 1.0.2
     6Tested up to: 6.9
     7Stable tag: 1.2.0
    88Requires PHP: 7.0
    99License: GPLv2 or later
     
    1031038. Search Form with Result Sheet
    1041049. Result Sheet
     10510. New Search Form
     10611. New Result Sheet style.
     10712. New Student fields
    105108
    106109== Changelog ==
     110
     111= 1.2.0 =
     112* Enhanced features and improvements
     113* Bug fixes and performance optimization
     114* Updated compatibility with WordPress 6.9
    107115
    108116= 1.0.2 =
  • edu-results-publishing/trunk/assets/css/style.css

    r3019484 r3422911  
    9999
    100100/*------------------------------
    101 * Search Form
     101* Search Form - Modern UI
    102102------------------------------*/
    103103
     104/* Main Container */
    104105.cbedu-results-search-form-area {
    105   margin-bottom: 20px;
    106 }
    107 
    108 .cbedu-results-search-form-area form {
     106  margin: 60px auto;
     107  max-width: 900px;
     108  padding: 0 20px;
     109}
     110
     111/* Form Header */
     112.cbedu-search-form-header {
     113  text-align: center;
     114  margin-bottom: 40px;
     115  animation: fadeInDown 0.6s ease-out;
     116}
     117
     118@keyframes fadeInDown {
     119  from {
     120    opacity: 0;
     121    transform: translateY(-20px);
     122  }
     123  to {
     124    opacity: 1;
     125    transform: translateY(0);
     126  }
     127}
     128
     129.cbedu-search-form-header h2 {
     130  font-size: 36px;
     131  font-weight: 800;
     132  margin: 0 0 12px 0;
     133  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
     134  -webkit-background-clip: text;
     135  -webkit-text-fill-color: transparent;
     136  background-clip: text;
     137  letter-spacing: -0.5px;
     138}
     139
     140.cbedu-search-form-header p {
     141  color: #718096;
     142  font-size: 16px;
     143  margin: 0;
     144  font-weight: 400;
     145}
     146
     147/* Modern Form */
     148.cbedu-modern-form {
     149  background: #ffffff;
     150  border-radius: 20px;
     151  padding: 48px;
     152  box-shadow: 0 10px 40px rgba(102, 126, 234, 0.1),
     153              0 4px 8px rgba(0, 0, 0, 0.02);
     154  border: 1px solid rgba(102, 126, 234, 0.1);
     155  transition: all 0.3s ease;
     156  animation: fadeInUp 0.7s ease-out;
     157}
     158
     159@keyframes fadeInUp {
     160  from {
     161    opacity: 0;
     162    transform: translateY(30px);
     163  }
     164  to {
     165    opacity: 1;
     166    transform: translateY(0);
     167  }
     168}
     169
     170.cbedu-modern-form:hover {
     171  box-shadow: 0 15px 60px rgba(102, 126, 234, 0.15),
     172              0 6px 12px rgba(0, 0, 0, 0.03);
     173}
     174
     175/* Form Grid Layout */
     176.cbedu-form-grid {
     177  display: grid;
     178  grid-template-columns: repeat(2, 1fr);
     179  gap: 28px;
     180  margin-bottom: 32px;
     181}
     182
     183/* Form Field */
     184.cbedu-form-field {
    109185  display: flex;
    110186  flex-direction: column;
     187  gap: 10px;
     188}
     189
     190.cbedu-form-field label {
     191  display: flex;
     192  align-items: center;
     193  gap: 8px;
     194  font-size: 14px;
     195  font-weight: 600;
     196  color: #2d3748;
     197  margin-bottom: 2px;
     198  letter-spacing: 0.3px;
     199}
     200
     201.cbedu-form-field .label-icon {
     202  font-size: 18px;
     203  filter: grayscale(0.3);
     204}
     205
     206.cbedu-form-field .required {
     207  color: #f56565;
     208  font-size: 16px;
     209}
     210
     211/* Select Wrapper */
     212.cbedu-select-wrapper {
     213  position: relative;
    111214  width: 100%;
    112   max-width: 100%;
    113   margin: 0 auto;
    114   padding: 30px 25px;
    115   border: 1px solid #ddd;
    116   border-radius: 5px;
    117   background-color: #f2f2f2;
    118   box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
     215}
     216
     217.cbedu-select-wrapper::after {
     218  content: '▼';
     219  position: absolute;
     220  right: 18px;
     221  top: 50%;
     222  transform: translateY(-50%);
     223  pointer-events: none;
     224  color: #667eea;
     225  font-size: 12px;
     226  transition: all 0.3s ease;
     227}
     228
     229.cbedu-select-wrapper:hover::after {
     230  color: #764ba2;
     231}
     232
     233/* Input & Select Styles */
     234.cbedu-form-field input[type="text"],
     235.cbedu-form-field select {
     236  width: 100%;
     237  padding: 14px 18px;
     238  font-size: 15px;
     239  border: 2px solid #e2e8f0;
     240  border-radius: 12px;
     241  background: #ffffff;
     242  color: #2d3748;
     243  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
     244  font-family: inherit;
     245  outline: none;
     246  appearance: none;
     247  -webkit-appearance: none;
     248  -moz-appearance: none;
     249}
     250
     251.cbedu-form-field select {
     252  cursor: pointer;
     253  padding-right: 45px;
     254  background-image: none;
     255}
     256
     257.cbedu-form-field input[type="text"]:focus,
     258.cbedu-form-field select:focus {
     259  border-color: #667eea;
     260  background: #f8f9ff;
     261  box-shadow: 0 0 0 4px rgba(102, 126, 234, 0.1);
     262  transform: translateY(-2px);
     263}
     264
     265.cbedu-form-field input[type="text"]:hover,
     266.cbedu-form-field select:hover {
     267  border-color: #cbd5e0;
     268}
     269
     270.cbedu-form-field input[type="text"]::placeholder {
     271  color: #a0aec0;
     272  font-size: 14px;
     273}
     274
     275/* Error Messages */
     276.cbedu-error-message {
     277  color: #f56565;
     278  font-size: 13px;
     279  font-weight: 500;
     280  margin-top: 6px;
     281  display: none;
     282  padding-left: 4px;
     283  animation: shake 0.3s ease;
     284}
     285
     286@keyframes shake {
     287  0%, 100% { transform: translateX(0); }
     288  25% { transform: translateX(-5px); }
     289  75% { transform: translateX(5px); }
     290}
     291
     292/* Submit Button Wrapper */
     293.cbedu-form-submit-wrapper {
     294  display: flex;
     295  justify-content: center;
     296  margin-top: 12px;
     297}
     298
     299/* Submit Button */
     300.cbedu-submit-btn, button.cbedu-submit-btn {
     301  display: inline-flex;
     302  align-items: center;
     303  justify-content: center;
    119304  gap: 10px;
    120 }
    121 
    122 .cbedu-results-search-form-single-element-area {
     305  padding: 18px 55px;
     306  min-width: 280px;
     307  font-size: 15px;
     308  font-weight: 700;
     309  color: #ffffff !important;
     310  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
     311  border: none;
     312  border-radius: 12px;
     313  cursor: pointer;
     314  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
     315  box-shadow: 0 6px 20px rgba(102, 126, 234, 0.4);
     316  text-transform: uppercase;
     317  letter-spacing: 1.2px;
     318  position: relative;
     319  overflow: hidden;
     320  white-space: nowrap;
     321  line-height: 1;
     322  border:none;
     323}
     324
     325.cbedu-submit-btn::before {
     326  content: '';
     327  position: absolute;
     328  top: 0;
     329  left: -100%;
     330  width: 100%;
     331  height: 100%;
     332  background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);
     333  transition: left 0.5s ease;
     334}
     335
     336.cbedu-submit-btn:hover::before {
     337  left: 100%;
     338}
     339
     340.cbedu-submit-btn:hover {
     341  transform: translateY(-3px);
     342  box-shadow: 0 10px 30px rgba(102, 126, 234, 0.5);
     343  background: linear-gradient(135deg, #5a67d8 0%, #6b46a0 100%);
     344}
     345
     346.cbedu-submit-btn:active {
     347  transform: translateY(-1px);
     348  box-shadow: 0 5px 15px rgba(102, 126, 234, 0.4);
     349}
     350
     351.cbedu-submit-btn .btn-icon {
     352  font-size: 18px;
     353  flex-shrink: 0;
     354  animation: pulse 2s infinite;
     355}
     356
     357@keyframes pulse {
     358  0%, 100% { transform: scale(1); }
     359  50% { transform: scale(1.1); }
     360}
     361
     362.cbedu-submit-btn .btn-text {
     363  font-size: 15px;
     364  flex-shrink: 0;
     365  color: #ffffff;
     366}
     367
     368.cbedu-submit-btn .btn-arrow {
     369  font-size: 18px;
     370  flex-shrink: 0;
     371  transition: transform 0.3s ease;
     372  font-weight: 700;
     373  color: #ffffff;
     374}
     375
     376.cbedu-submit-btn:hover .btn-arrow {
     377  transform: translateX(5px);
     378}
     379
     380/* Preloader */
     381.cbedu-preloader-wrapper {
     382  text-align: center;
     383  padding: 60px 20px;
     384  background: #ffffff;
     385  border-radius: 16px;
     386  margin: 30px 0;
     387  box-shadow: 0 4px 15px rgba(0, 0, 0, 0.08);
     388}
     389
     390.cbedu-preloader-content {
    123391  display: flex;
    124392  flex-direction: column;
    125 }
    126 
    127 .cbedu-results-search-form-single-element {
    128   display: flex;
     393  align-items: center;
    129394  gap: 20px;
    130   justify-content: flex-start;
    131   align-items: center;
    132 }
    133 
    134 .cbedu-results-search-form-single-element label {
    135   flex-basis: 30%;
    136 }
    137 
    138 .cbedu-results-search-form-single-element input,
    139 .cbedu-results-search-form-single-element select,
    140 .cbedu-results-search-form-single-element input[type="text"] {
    141   border: 1px solid #3666;
    142   padding: 15px;
    143 }
    144 
    145 .cbedu-results-search-form-single-element.cbedu-results-search-form-submit {
    146   display: flex;
    147   justify-content: center;
    148 }
    149 
    150 .cbedu-results-search-form-submit input[type="submit"] {
    151   padding: 15px 25px;
    152   background-color: #1587fc;
    153   color: #fff;
    154   font-size: 18px;
    155   font-weight: 500;
    156   border-radius: 5px;
    157   cursor: pointer;
    158 }
    159 
    160 .cbedu-results-search-form-submit input[type="submit"]:hover {
    161   background-color: #0e52b5;
    162 }
    163 
    164 .cbedu-error-message {
    165   color: red;
    166   margin-top: 5px;
    167   font-size: 0.9em;
    168   align-self: center;
     395}
     396
     397.cbedu-preloader-text {
     398  color: #667eea;
     399  font-size: 16px;
     400  font-weight: 600;
     401  margin: 0;
     402  animation: fadeInOut 1.5s infinite;
     403}
     404
     405@keyframes fadeInOut {
     406  0%, 100% { opacity: 0.5; }
     407  50% { opacity: 1; }
    169408}
    170409
     
    182421  height: 13px;
    183422  border-radius: 50%;
    184   background: #1f79ff;
     423  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    185424  animation-timing-function: cubic-bezier(0, 1, 1, 0);
    186425}
     
    188427.cbedu-ajax-preloader-ellipsis div:nth-child(1) {
    189428  left: 8px;
    190   animation: cbedu-ellipsis1 0.6s infinite;
     429  animation: ellipsis1 0.6s infinite;
    191430}
    192431
    193432.cbedu-ajax-preloader-ellipsis div:nth-child(2) {
    194433  left: 8px;
    195   animation: cbedu-ellipsis2 0.6s infinite;
     434  animation: ellipsis2 0.6s infinite;
    196435}
    197436
    198437.cbedu-ajax-preloader-ellipsis div:nth-child(3) {
    199438  left: 32px;
    200   animation: cbedu-ellipsis2 0.6s infinite;
     439  animation: ellipsis2 0.6s infinite;
    201440}
    202441
    203442.cbedu-ajax-preloader-ellipsis div:nth-child(4) {
    204443  left: 56px;
    205   animation: cbedu-ellipsis3 0.6s infinite;
    206 }
    207 .cbedu-ajax-result-area table th{
    208 text-align: left;
    209 }
     444  animation: ellipsis3 0.6s infinite;
     445}
     446
     447@keyframes ellipsis1 {
     448  0% { transform: scale(0); }
     449  100% { transform: scale(1); }
     450}
     451
     452@keyframes ellipsis2 {
     453  0% { transform: translate(0, 0); }
     454  100% { transform: translate(24px, 0); }
     455}
     456
     457@keyframes ellipsis3 {
     458  0% { transform: scale(1); }
     459  100% { transform: scale(0); }
     460}
     461
     462/* Responsive Design */
     463@media (max-width: 768px) {
     464  .cbedu-search-form-header h2 {
     465    font-size: 28px;
     466  }
     467
     468  .cbedu-search-form-header p {
     469    font-size: 14px;
     470  }
     471
     472  .cbedu-modern-form {
     473    padding: 32px 24px;
     474    border-radius: 16px;
     475  }
     476
     477  .cbedu-form-grid {
     478    grid-template-columns: 1fr;
     479    gap: 20px;
     480  }
     481
     482  .cbedu-submit-btn {
     483    width: 100%;
     484    padding: 16px 32px;
     485  }
     486
     487  .cbedu-form-field .label-icon {
     488    font-size: 16px;
     489  }
     490}
     491
     492@media (max-width: 480px) {
     493  .cbedu-results-search-form-area {
     494    margin: 40px auto;
     495    padding: 0 15px;
     496  }
     497
     498  .cbedu-search-form-header h2 {
     499    font-size: 24px;
     500  }
     501
     502  .cbedu-modern-form {
     503    padding: 24px 18px;
     504  }
     505
     506  .cbedu-form-field label {
     507    font-size: 13px;
     508  }
     509
     510  .cbedu-form-field input[type="text"],
     511  .cbedu-form-field select {
     512    padding: 12px 14px;
     513    font-size: 14px;
     514  }
     515
     516  .cbedu-error-message {
     517    padding-left: 0;
     518  }
     519
     520  .cbedu-submit-btn {
     521    width: 100%;
     522    padding: 16px 32px;
     523    font-size: 15px;
     524  }
     525}
     526
     527/*------------------------------
     528* Result Display - Modern UI
     529------------------------------*/
     530
    210531@keyframes cbedu-ellipsis1 {
    211532  0% {
     
    237558  }
    238559}
     560
     561/*------------------------------
     562* AJAX Result Display - Modern UI
     563------------------------------*/
     564
     565/* Main Result Container */
     566.cbedu-ajax-result-area {
     567  max-width: 1200px;
     568  margin: 30px auto;
     569  padding: 0;
     570  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
     571  background: #fff;
     572  border-radius: 12px;
     573  box-shadow: 0 10px 40px rgba(0, 0, 0, 0.08);
     574  overflow: hidden;
     575}
     576
     577.cbedu-ajax-result {
     578  padding: 0;
     579}
     580
     581/* Section Headings */
     582.cbedu-result-student-information-heading,
     583.cbedu-result-student-subject-heading {
     584  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
     585  padding: 20px 30px;
     586  margin: 0;
     587}
     588
     589.cbedu-result-student-information-heading h4,
     590.cbedu-result-student-subject-heading h4 {
     591  color: #fff;
     592  margin: 0;
     593  font-size: 20px;
     594  font-weight: 600;
     595  letter-spacing: 0.5px;
     596  text-transform: uppercase;
     597  display: flex;
     598  align-items: center;
     599  gap: 10px;
     600}
     601
     602.cbedu-result-student-information-heading h4:before {
     603  content: "👤";
     604  font-size: 24px;
     605}
     606
     607.cbedu-result-student-subject-heading h4:before {
     608  content: "📊";
     609  font-size: 24px;
     610}
     611
     612/* Student Information Area */
     613.cbedu-result-student-information-area {
     614  margin-bottom: 30px;
     615  border-radius: 12px 12px 0 0;
     616  overflow: hidden;
     617  background: #fff;
     618}
     619
     620.cbedu-result-student-information-area table {
     621  width: 100%;
     622  border-collapse: collapse;
     623  margin: 0;
     624  background: #fff;
     625}
     626
     627.cbedu-result-student-information-area table tbody tr:nth-child(even) {
     628  background: #f8f9ff;
     629}
     630
     631.cbedu-result-student-information-area table tbody tr:hover {
     632  background: #f0f2ff;
     633  transition: background 0.3s ease;
     634}
     635
     636.cbedu-result-student-information-area th {
     637  background: #f7f8fc;
     638  color: #2d3748;
     639  font-weight: 600;
     640  padding: 16px 20px;
     641  text-align: left;
     642  border-bottom: 2px solid #e2e8f0;
     643  font-size: 14px;
     644  text-transform: uppercase;
     645  letter-spacing: 0.5px;
     646  /* width: 25%; */
     647}
     648
     649.cbedu-result-student-information-area td {
     650  padding: 16px 20px;
     651  color: #4a5568;
     652  border-bottom: 1px solid #e2e8f0;
     653  font-size: 15px;
     654  font-weight: 500;
     655}
     656
     657/* Subject Result Area */
     658.cbedu-result-student-subject-area {
     659  background: #fff;
     660  border-radius: 0 0 12px 12px;
     661  overflow: hidden;
     662}
     663
     664.cbedu-result-student-subject {
     665  padding: 0;
     666}
     667
     668.cbedu-result-student-subject table {
     669  width: 100%;
     670  border-collapse: collapse;
     671  margin: 0;
     672  background: #fff;
     673}
     674
     675.cbedu-result-student-subject table thead {
     676  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
     677}
     678
     679.cbedu-result-student-subject table thead tr th {
     680  color: #fff;
     681  font-weight: 600;
     682  padding: 18px 20px;
     683  text-align: center;
     684  font-size: 14px;
     685  text-transform: uppercase;
     686  letter-spacing: 0.5px;
     687  border: none;
     688}
     689
     690.cbedu-result-student-subject table tbody tr {
     691  border-bottom: 1px solid #e2e8f0;
     692  transition: all 0.3s ease;
     693}
     694
     695.cbedu-result-student-subject table tbody tr:nth-child(even) {
     696  background: #f8f9ff;
     697}
     698
     699.cbedu-result-student-subject table tbody tr:hover {
     700  background: #e6f2ff;
     701  transform: scale(1.01);
     702  box-shadow: 0 4px 12px rgba(102, 126, 234, 0.1);
     703}
     704
     705.cbedu-result-student-subject table tbody td {
     706  padding: 16px 20px;
     707  color: #4a5568;
     708  text-align: center;
     709  font-size: 15px;
     710  font-weight: 500;
     711}
     712
     713.cbedu-result-student-subject table tbody td:nth-child(1) {
     714  font-weight: 700;
     715  color: #667eea;
     716}
     717
     718.cbedu-result-student-subject table tbody td:nth-child(2) {
     719  text-align: left;
     720  font-weight: 600;
     721  color: #2d3748;
     722}
     723
     724/* Highlight cells (GPA columns) */
     725.cbedu-result-student-subject table tbody td.highlight {
     726  background: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%);
     727  font-weight: 700;
     728  font-size: 18px;
     729  color: #2d3748;
     730  border-left: 3px solid #667eea;
     731  border-right: 3px solid #764ba2;
     732}
     733
     734/* Grade styling */
     735.cbedu-result-student-subject table tbody td:nth-child(4) {
     736  font-weight: 700;
     737  font-size: 16px;
     738}
     739
     740/* Print Button Container */
     741.cbedu-print-button-container {
     742  text-align: center;
     743  padding: 30px;
     744  background: #f7f8fc;
     745  border-radius: 0 0 12px 12px;
     746}
     747
     748.cbedu-print-button-container button {
     749  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
     750  color: #fff;
     751  padding: 14px 40px;
     752  font-size: 16px;
     753  font-weight: 600;
     754  border: none;
     755  border-radius: 8px;
     756  cursor: pointer;
     757  transition: all 0.3s ease;
     758  box-shadow: 0 4px 15px rgba(102, 126, 234, 0.3);
     759  text-transform: uppercase;
     760  letter-spacing: 1px;
     761}
     762
     763.cbedu-print-button-container button:hover {
     764  transform: translateY(-2px);
     765  box-shadow: 0 6px 25px rgba(102, 126, 234, 0.4);
     766}
     767
     768.cbedu-print-button-container button:active {
     769  transform: translateY(0);
     770}
     771
     772/* Status Badge Styling */
     773.cbedu-result-student-information-area td:contains("Passed"),
     774.cbedu-result-student-information-area td:contains("Failed") {
     775  font-weight: 700;
     776}
     777
     778/* Responsive Design */
     779@media (max-width: 768px) {
     780  .cbedu-ajax-result-area {
     781    margin: 20px 10px;
     782    border-radius: 8px;
     783  }
     784
     785  .cbedu-result-student-information-heading,
     786  .cbedu-result-student-subject-heading {
     787    padding: 15px 20px;
     788  }
     789
     790  .cbedu-result-student-information-heading h4,
     791  .cbedu-result-student-subject-heading h4 {
     792    font-size: 16px;
     793  }
     794
     795  .cbedu-result-student-information-area th,
     796  .cbedu-result-student-information-area td,
     797  .cbedu-result-student-subject table tbody td {
     798    padding: 12px 15px;
     799    font-size: 13px;
     800  }
     801
     802  .cbedu-result-student-subject table thead tr th {
     803    padding: 14px 10px;
     804    font-size: 12px;
     805  }
     806
     807  .cbedu-print-button-container {
     808    padding: 20px;
     809  }
     810
     811  .cbedu-print-button-container button {
     812    padding: 12px 30px;
     813    font-size: 14px;
     814  }
     815
     816  /* Stack table on mobile */
     817  .cbedu-result-student-information-area table,
     818  .cbedu-result-student-information-area thead,
     819  .cbedu-result-student-information-area tbody,
     820  .cbedu-result-student-information-area th,
     821  .cbedu-result-student-information-area td,
     822  .cbedu-result-student-information-area tr {
     823    display: block;
     824  }
     825
     826  .cbedu-result-student-information-area thead tr {
     827    display: none;
     828  }
     829
     830  .cbedu-result-student-information-area tr {
     831    margin-bottom: 15px;
     832    border: 1px solid #e2e8f0;
     833    border-radius: 8px;
     834    overflow: hidden;
     835  }
     836
     837  .cbedu-result-student-information-area td {
     838    text-align: right;
     839    padding-left: 50%;
     840    position: relative;
     841  }
     842
     843  .cbedu-result-student-information-area td:before {
     844    content: attr(data-label);
     845    position: absolute;
     846    left: 15px;
     847    width: 45%;
     848    padding-right: 10px;
     849    white-space: nowrap;
     850    text-align: left;
     851    font-weight: 600;
     852    color: #2d3748;
     853  }
     854}
     855
     856/* Print Styles */
     857@media print {
     858  .cbedu-print-button-container {
     859    display: none;
     860  }
     861
     862  .cbedu-ajax-result-area {
     863    box-shadow: none;
     864    border: 1px solid #ddd;
     865  }
     866
     867  .cbedu-result-student-information-heading,
     868  .cbedu-result-student-subject-heading {
     869    background: #667eea !important;
     870    -webkit-print-color-adjust: exact;
     871    print-color-adjust: exact;
     872  }
     873
     874  .cbedu-result-student-subject table tbody td.highlight {
     875    background: #fed6e3 !important;
     876    -webkit-print-color-adjust: exact;
     877    print-color-adjust: exact;
     878  }
     879
     880  body {
     881    background: #fff;
     882  }
     883}
  • edu-results-publishing/trunk/edu-results-publishing.php

    r3022038 r3422911  
    44 * Author: MD Abul Bashar
    55 * Author URI: https://facebook.com/hmbashar
    6  * Description: This plugin is for student exam results publishing.
     6 * Description: A powerful tool designed to simplify the process of publishing exam results for educational institutions such as schools, colleges, and universities. With an easy-to-use interface, it empowers administrators and educators to effortlessly manage and showcase academic achievements.
    77 * Tags: Result, WP Result Plugin, EDU Results
    88 * Text Domain: edu-results
    9  * Version: 1.0.2
     9 * Version: 1.2.0
    1010 * License: GPLv2
    1111 * License URI: http://www.gnu.org/licenses/gpl-2.0.html
    1212 * Domain Path: /languages
    1313 * Prefix: cbedu_
     14 * Requires at least: 5.0
     15 * Requires PHP: 7.2
    1416 */
    1517
     
    2123 * @link https://facebook.com/hmbashar
    2224 */
     25
     26namespace CBEDU;
     27
    2328if (!defined('ABSPATH')) exit; // Exit if accessed directly
     29
    2430
    2531
     
    2834define('CBEDU_RESULT_DIR', plugin_dir_path(__FILE__));
    2935define('CBEDU_PREFIX', 'cbedu_');
    30 
    31 class CBEDUResultPublishing
     36define('CBEDU_VERSION', '1.2.0');
     37
     38final class CBEDUResultPublishing
    3239{
    3340    // Plugin prefix
     
    176183        ));
    177184
    178         //for autocomplete jquery in results post type with registration number
     185        // Enqueue admin meta fields CSS for custom post types
    179186        if ($hook_suffix === 'post-new.php' || $hook_suffix === 'post.php') {
    180             if (get_post_type($post) === 'cbedu_results') {
    181 
     187            $post_type = get_post_type($post);
     188           
     189            // Load admin CSS for students, subjects, and results post types
     190            if (in_array($post_type, array('cbedu_students', 'cbedu_subjects', 'cbedu_results'))) {
     191                wp_enqueue_style('cbedu-admin-meta-fields', CBEDU_RESULT_URL . 'assets/css/admin-meta-fields.css', array(), CBEDU_VERSION);
     192            }
     193
     194            // For autocomplete jquery in results post type with registration number
     195            if ($post_type === 'cbedu_results') {
    182196                wp_enqueue_style('cbedu-autocomplete-ui-css', plugin_dir_url(__FILE__) . 'assets/css/autocomplete.css');
    183197                wp_enqueue_script('cbedu-autocomplete-js', plugin_dir_url(__FILE__) . 'assets/js/autocomplete.js', array('jquery', 'jquery-ui-autocomplete'), '1.0.0', true);
     
    358372   
    359373        // Execute the query for 'cbedu_results'
    360         $ResultQuery = new WP_Query($args);
     374        $ResultQuery = new \WP_Query($args);
    361375   
    362376        // Output the results
     
    365379                $ResultQuery->the_post();
    366380
     381                // Store result post ID before nested query
     382                $result_post_id = get_the_ID();
     383                $result_title = get_the_title();
     384
    367385                $collageName = get_option('cbedu_results_collage_name');
    368386
    369                 $rs_std_roll = get_post_meta(get_the_ID(), 'cbedu_result_std_roll', true);
    370                 $rs_std_reg_number = get_post_meta(get_the_ID(), 'cbedu_result_std_registration_number', true);
    371                 $rs_std_type = get_post_meta(get_the_ID(), 'cbedu_result_std_student_type', true);
    372                 $rs_std_result_status = get_post_meta(get_the_ID(), 'cbedu_result_std_result_status', true);
    373                 $rs_std_gpa = get_post_meta(get_the_ID(), 'cbedu_result_std_gpa', true);
     387                $rs_std_roll = get_post_meta($result_post_id, 'cbedu_result_std_roll', true);
     388                $rs_std_reg_number = get_post_meta($result_post_id, 'cbedu_result_std_registration_number', true);
     389                $rs_std_type = get_post_meta($result_post_id, 'cbedu_result_std_student_type', true);
     390                $rs_std_result_status = get_post_meta($result_post_id, 'cbedu_result_std_result_status', true);
     391                $rs_std_gpa = get_post_meta($result_post_id, 'cbedu_result_std_gpa', true);
    374392   
    375393                //Student subjects result
    376                 $cbedu_std_all_subjects_result = get_post_meta(get_the_ID(), 'cbedu_subjects_results', true);
    377                 $cbedu_std_gpa = get_post_meta(get_the_ID(), 'cbedu_result_std_gpa', true);
    378                 $cbedu_std_was_gpa = get_post_meta(get_the_ID(), 'cbedu_result_std_was_gpa', true);
     394                $cbedu_std_all_subjects_result = get_post_meta($result_post_id, 'cbedu_subjects_results', true);
     395                $cbedu_std_gpa = get_post_meta($result_post_id, 'cbedu_result_std_gpa', true);
     396                $cbedu_std_was_gpa = get_post_meta($result_post_id, 'cbedu_result_std_was_gpa', true);
    379397
    380398                 // Fetch taxonomy term names
    381                 $session_year_terms = wp_get_post_terms(get_the_ID(), 'cbedu_session_years', array('fields' => 'names'));
    382                 $examination_terms = wp_get_post_terms(get_the_ID(), 'cbedu_examinations', array('fields' => 'names'));
    383                 $board_terms = wp_get_post_terms(get_the_ID(), 'cbedu_boards', array('fields' => 'names'));
    384                 $department_group_terms = wp_get_post_terms(get_the_ID(), 'cbedu_department_group', array('fields' => 'names'));
     399                $session_year_terms = wp_get_post_terms($result_post_id, 'cbedu_session_years', array('fields' => 'names'));
     400                $examination_terms = wp_get_post_terms($result_post_id, 'cbedu_examinations', array('fields' => 'names'));
     401                $board_terms = wp_get_post_terms($result_post_id, 'cbedu_boards', array('fields' => 'names'));
     402                $department_group_terms = wp_get_post_terms($result_post_id, 'cbedu_department_group', array('fields' => 'names'));
    385403
    386404                // Convert term arrays to strings
     
    404422                );
    405423   
    406                 $student_query = new WP_Query($student_args);
     424                $student_query = new \WP_Query($student_args);
     425               
     426                // Initialize student data
     427                $st_father_name = '';
     428                $st_mother_name = '';
     429                $st_std_id = '';
     430                $st_std_dob = '';
     431                $st_std_gender = '';
    407432   
    408433                if ($student_query->have_posts()) {
    409                     while ($student_query->have_posts()) {
    410                         $student_query->the_post();
    411    
    412                         // Fetch all student details
    413                         $st_father_name = get_post_meta(get_the_ID(), 'cbedu_result_std_father_name', true);
    414                         $st_mother_name = get_post_meta(get_the_ID(), 'cbedu_result_std_mother_name', true);
    415                         $st_std_id = get_post_meta(get_the_ID(), 'cbedu_result_std_id', true);                       
    416                         $st_std_dob = get_post_meta(get_the_ID(), 'cbedu_result_std_dob', true);
    417                         $st_std_gender = get_post_meta(get_the_ID(), 'cbedu_result_std_gender', true);
     434                    $student_post = $student_query->posts[0];
     435   
     436                    // Fetch all student details
     437                    $st_father_name = get_post_meta($student_post->ID, 'cbedu_result_std_father_name', true);
     438                    $st_mother_name = get_post_meta($student_post->ID, 'cbedu_result_std_mother_name', true);
     439                    $st_std_id = get_post_meta($student_post->ID, 'cbedu_result_std_id', true);                       
     440                    $st_std_dob = get_post_meta($student_post->ID, 'cbedu_result_std_dob', true);
     441                    $st_std_gender = get_post_meta($student_post->ID, 'cbedu_result_std_gender', true);
     442                }
     443               
     444                wp_reset_postdata(); // Reset student query
    418445                       
    419446   
    420                         // Display the results in a table
    421                         ?>
    422                         <div class="cbedu-ajax-result-area" id="cbedu-result-table">
    423                             <div class="cbedu-ajax-result">
    424                                 <!--Student Information-->
    425                                 <div class="cbedu-result-student-information-area">
    426                                     <div class="cbedu-result-student-information-heading">
    427                                         <h4><?php _e('Student Information', 'edu-results'); ?></h4>
    428                                     </div>
    429                                     <table>
    430                                         <tr>
    431                                             <th><?php _e('Roll', 'edu-results'); ?></th>
    432                                             <td><?php echo esc_html($rs_std_roll); ?></td>
    433                                             <th><?php _e('Registration Number', 'edu-results'); ?></th>
    434                                             <td><?php echo esc_html($rs_std_reg_number); ?></td>
    435                                         </tr>
    436                                         <tr>
    437                                             <th><?php _e('Student Name', 'edu-results'); ?></th>
    438                                             <td><?php the_title(); ?></td>
    439                                             <th><?php _e('Student ID', 'edu-results'); ?></th>
    440                                             <td><?php echo esc_html($st_std_id); ?></td>
    441                                         </tr>
    442                                         <tr>
    443                                             <th><?php _e('Father Name', 'edu-results'); ?></th>
    444                                             <td><?php echo esc_html($st_father_name); ?></td>
    445                                             <th><?php _e('Mother Name', 'edu-results'); ?></th>
    446                                             <td><?php echo esc_html($st_mother_name); ?></td>                                           
    447                                         </tr>
    448                                         <tr>
    449                                             <th><?php _e('Board', 'edu-results'); ?></th>
    450                                             <td><?php echo esc_html($board); ?></td>
    451                                             <th><?php _e('Department Group', 'edu-results'); ?></th>
    452                                             <td><?php echo esc_html($department_group); ?></td>                                           
    453                                         </tr>
    454                                         <tr>
    455                                             <th><?php _e('Session', 'edu-results'); ?></th>
    456                                             <td><?php echo esc_html($session_year); ?></td>
    457                                             <th><?php _e('Result Status', 'edu-results'); ?></th>
    458                                             <td><?php echo esc_html($rs_std_result_status); ?></td>                                           
    459                                         </tr>
    460                                         <tr>
    461                                             <th><?php _e('Gender', 'edu-results'); ?></th>
    462                                             <td><?php echo esc_html($st_std_gender); ?></td>
    463                                             <th><?php _e('Date of Birth', 'edu-results'); ?></th>
    464                                             <td><?php echo esc_html($st_std_dob); ?></td>                                           
    465                                         </tr>
    466                                         <tr>
    467                                             <th><?php _e('Student Type', 'edu-results'); ?></th>
    468                                             <td><?php echo esc_html($rs_std_type); ?></td>
    469                                             <th><?php _e('Institute Name', 'edu-results'); ?></th>
    470                                             <td><?php echo esc_html($collageName); ?></td>                                           
    471                                         </tr>
    472                                         <tr>
    473                                             <th><?php _e('Examination', 'edu-results'); ?></th>
    474                                             <td><?php echo esc_html($examination); ?></td>
    475                                             <th><?php _e('GPA', 'edu-results'); ?></th>
    476                                             <td><?php echo esc_html($rs_std_gpa); ?></td>                                           
    477                                         </tr>
    478                                     </table>
    479                                 </div><!--/ Student Information-->
    480 
    481                                 <!--Student Subjects Information-->
    482                                 <div class="cbedu-result-student-subject-area">
    483                                     <div class="cbedu-result-student-subject">
    484                                         <div class="cbedu-result-student-subject-heading">
    485                                             <h4><?php _e('Result Sheet', 'edu-results'); ?></h4>
    486                                         </div>
    487                                         <table>
    488                                             <tr>
    489                                                 <th><?php _e('Subject', 'edu-results'); ?></th>
    490                                                 <th><?php _e('Name of Subjects', 'edu-results'); ?></th>
    491                                                 <th><?php _e('Marks', 'edu-results'); ?></th>
    492                                                 <th><?php _e('Letter Grade', 'edu-results'); ?></th>
    493                                                 <th class="cbedu-table-gpa"><?php _e('GPA', 'edu-results'); ?> <abbr title="Without additional subject"><?php _e('(WAS)', 'edu-results'); ?></abbr></th>
    494                                                 <th><?php _e('GPA', 'edu-results'); ?></th>
    495                                             </tr>
    496                                             <?php
     447                // Display the results in a table
     448                ?>
     449                <div class="cbedu-ajax-result-area" id="cbedu-result-table">
     450                    <div class="cbedu-ajax-result">
     451                        <!--Student Information-->
     452                        <div class="cbedu-result-student-information-area">
     453                            <div class="cbedu-result-student-information-heading">
     454                                <h4><?php esc_html_e('Student Information', 'edu-results'); ?></h4>
     455                            </div>
     456                            <table>
     457                                <tbody>
     458                                <tr>
     459                                    <th><?php esc_html_e('Roll', 'edu-results'); ?></th>
     460                                    <td><?php echo esc_html($rs_std_roll); ?></td>
     461                                    <th><?php esc_html_e('Registration Number', 'edu-results'); ?></th>
     462                                    <td><?php echo esc_html($rs_std_reg_number); ?></td>
     463                                </tr>
     464                                <tr>
     465                                    <th><?php esc_html_e('Student Name', 'edu-results'); ?></th>
     466                                    <td><?php echo esc_html($result_title); ?></td>
     467                                    <th><?php esc_html_e('Student ID', 'edu-results'); ?></th>
     468                                    <td><?php echo esc_html($st_std_id); ?></td>
     469                                </tr>
     470                                <tr>
     471                                    <th><?php esc_html_e('Father Name', 'edu-results'); ?></th>
     472                                    <td><?php echo esc_html($st_father_name); ?></td>
     473                                    <th><?php esc_html_e('Mother Name', 'edu-results'); ?></th>
     474                                    <td><?php echo esc_html($st_mother_name); ?></td>                                           
     475                                </tr>
     476                                <tr>
     477                                    <th><?php esc_html_e('Board', 'edu-results'); ?></th>
     478                                    <td><?php echo esc_html($board); ?></td>
     479                                    <th><?php esc_html_e('Department Group', 'edu-results'); ?></th>
     480                                    <td><?php echo esc_html($department_group); ?></td>                                           
     481                                </tr>
     482                                <tr>
     483                                    <th><?php esc_html_e('Session', 'edu-results'); ?></th>
     484                                    <td><?php echo esc_html($session_year); ?></td>
     485                                    <th><?php esc_html_e('Result Status', 'edu-results'); ?></th>
     486                                    <td><?php echo esc_html($rs_std_result_status); ?></td>                                           
     487                                </tr>
     488                                <tr>
     489                                    <th><?php esc_html_e('Gender', 'edu-results'); ?></th>
     490                                    <td><?php echo esc_html($st_std_gender); ?></td>
     491                                    <th><?php esc_html_e('Date of Birth', 'edu-results'); ?></th>
     492                                    <td><?php echo esc_html($st_std_dob); ?></td>                                           
     493                                </tr>
     494                                <tr>
     495                                    <th><?php esc_html_e('Student Type', 'edu-results'); ?></th>
     496                                    <td><?php echo esc_html($rs_std_type); ?></td>
     497                                    <th><?php esc_html_e('Institute Name', 'edu-results'); ?></th>
     498                                    <td><?php echo esc_html($collageName); ?></td>                                           
     499                                </tr>
     500                                <tr>
     501                                    <th><?php esc_html_e('Examination', 'edu-results'); ?></th>
     502                                    <td><?php echo esc_html($examination); ?></td>
     503                                    <th><?php esc_html_e('GPA', 'edu-results'); ?></th>
     504                                    <td><?php echo esc_html($rs_std_gpa); ?></td>                                           
     505                                </tr>
     506                                </tbody>
     507                            </table>
     508                        </div><!--/ Student Information-->
     509
     510                        <!--Student Subjects Information-->
     511                        <div class="cbedu-result-student-subject-area">
     512                            <div class="cbedu-result-student-subject">
     513                                <div class="cbedu-result-student-subject-heading">
     514                                    <h4><?php esc_html_e('Result Sheet', 'edu-results'); ?></h4>
     515                                </div>
     516                                <table>
     517                                    <thead>
     518                                    <tr>
     519                                        <th><?php esc_html_e('Subject', 'edu-results'); ?></th>
     520                                        <th><?php esc_html_e('Name of Subjects', 'edu-results'); ?></th>
     521                                        <th><?php esc_html_e('Marks', 'edu-results'); ?></th>
     522                                        <th><?php esc_html_e('Letter Grade', 'edu-results'); ?></th>
     523                                        <th class="cbedu-table-gpa"><?php esc_html_e('GPA', 'edu-results'); ?> <abbr title="Without additional subject"><?php esc_html_e('(WAS)', 'edu-results'); ?></abbr></th>
     524                                        <th><?php esc_html_e('GPA', 'edu-results'); ?></th>
     525                                    </tr>
     526                                    </thead>
     527                                    <tbody>
     528                                    <?php
    497529
    498530                                            // Check if there are subject results
     
    552584                        </div>
    553585                        <div class="cbedu-print-button-container">
    554                             <button onclick="cbeduPrintResult('cbedu-result-table')"><?php _e('Print', 'edu-results'); ?></button>
     586                            <button onclick="cbeduPrintResult('cbedu-result-table')"><?php esc_html_e('Print', 'edu-results'); ?></button>
    555587                        </div> 
    556588                        <?php
    557                     }
    558                 }
    559    
    560                 wp_reset_postdata(); // Reset student query
    561589            }
    562590        } else {
    563             echo '<p>No results found for the selected examination.</p>';
     591            echo '<p>' . esc_html__('No results found for the selected examination.', 'edu-results') . '</p>';
    564592        }
    565593   
  • edu-results-publishing/trunk/inc/RepeaterCF.php

    r3019484 r3422911  
    2222        // Fetch subjects from 'subjects' custom post type
    2323        $subjects = get_posts(array(
    24             'post_type' => 'cbedu_subjects', // Replace with your actual custom post type slug
    25             'posts_per_page' => -1 // Fetch all posts
     24            'post_type' => 'cbedu_subjects',
     25            'posts_per_page' => -1
    2626        ));
    2727
     
    4646        </script>
    4747
    48         <table id="repeatable-fieldset-one" width="100%">
    49             <tbody>
    50                 <?php
    51                 if ($eduResultsGroup) :
    52                     foreach ($eduResultsGroup as $field) :
    53                 ?>
    54                         <tr>
    55                             <td width="70%">
    56                                 <select style="width:80%;padding:10px;" name="cbedu_results_subject_name[]">
     48        <div class="cbedu-subjects-repeater-wrapper">
     49            <div class="cbedu-repeater-header">
     50                <h3><?php esc_html_e('Add Subject Marks', 'edu-results'); ?></h3>
     51                <p class="description"><?php esc_html_e('Select subjects and enter marks for each subject', 'edu-results'); ?></p>
     52            </div>
     53
     54            <table id="repeatable-fieldset-one" class="cbedu-repeater-table">
     55                <thead>
     56                    <tr>
     57                        <th class="cbedu-repeater-th-subject"><?php esc_html_e('Subject', 'edu-results'); ?></th>
     58                        <th class="cbedu-repeater-th-marks"><?php esc_html_e('Marks / Grade', 'edu-results'); ?></th>
     59                        <th class="cbedu-repeater-th-action"><?php esc_html_e('Action', 'edu-results'); ?></th>
     60                    </tr>
     61                </thead>
     62                <tbody>
     63                    <?php
     64                    if ($eduResultsGroup) :
     65                        foreach ($eduResultsGroup as $field) :
     66                    ?>
     67                            <tr class="cbedu-repeater-row">
     68                                <td class="cbedu-repeater-td-subject">
     69                                    <select class="cbedu-repeater-select" name="cbedu_results_subject_name[]">
     70                                        <option value=""><?php esc_attr_e('Select Subject', 'edu-results'); ?></option>
     71                                        <?php foreach ($subjects as $subject) :
     72                                            $subject_code = get_post_meta($subject->ID, 'cbedu_subject_code', true);
     73                                        ?>
     74                                        <option value="<?php echo esc_attr($subject->post_title); ?>" <?php selected($field['subject_name'], $subject->post_title); ?>>
     75                                            <?php echo esc_html($subject_code ? $subject_code . ' - ' : '') . esc_html($subject->post_title); ?>
     76                                        </option>
     77                                        <?php endforeach; ?>
     78                                    </select>
     79                                </td>
     80                                <td class="cbedu-repeater-td-input">
     81                                    <input class="cbedu-repeater-input" type="text" placeholder="<?php esc_attr_e('Enter marks or grade', 'edu-results'); ?>" name="cbedu_results_subject_value[]" value="<?php echo isset($field['subject_value']) ? esc_attr($field['subject_value']) : ''; ?>" />
     82                                </td>
     83                                <td class="cbedu-repeater-td-action">
     84                                    <button type="button" class="button remove-row cbedu-remove-btn">
     85                                        <span class="dashicons dashicons-trash"></span>
     86                                        <?php esc_html_e('Remove', 'edu-results'); ?>
     87                                    </button>
     88                                </td>
     89                            </tr>
     90                        <?php
     91                        endforeach;
     92                    else :
     93                        ?>
     94                        <tr class="cbedu-repeater-row">
     95                            <td class="cbedu-repeater-td-subject">
     96                                <select class="cbedu-repeater-select" name="cbedu_results_subject_name[]">
    5797                                    <option value=""><?php esc_attr_e('Select Subject', 'edu-results'); ?></option>
    5898                                    <?php foreach ($subjects as $subject) :
    59                                         $subject_code = get_post_meta($subject->ID, 'cbedu_subject_code', true); 
     99                                        $subject_code = get_post_meta($subject->ID, 'cbedu_subject_code', true);
    60100                                    ?>
    61                                     <option value="<?php echo esc_attr($subject->post_title); ?>" <?php selected($field['subject_name'], $subject->post_title); ?>>
    62                                         <?php echo esc_html($subject_code . ' - ' . $subject->post_title); ?>
    63                                     </option>
     101                                        <option value="<?php echo esc_attr($subject->post_title); ?>">
     102                                            <?php echo esc_html($subject_code ? $subject_code . ' - ' : '') . esc_html($subject->post_title); ?>
     103                                        </option>
    64104                                    <?php endforeach; ?>
    65105                                </select>
    66106                            </td>
    67                             <td width="70%">
    68                                 <input style="width:80%;padding:10px;" type="text" placeholder="<?php esc_attr_e('Enter subject value', 'edu-results'); ?>" name="cbedu_results_subject_value[]" value="<?php echo isset($field['subject_value']) ? esc_attr($field['subject_value']) : ''; ?>" />
     107                            <td class="cbedu-repeater-td-input">
     108                                <input class="cbedu-repeater-input" type="text" placeholder="<?php esc_attr_e('Enter marks or grade', 'edu-results'); ?>" name="cbedu_results_subject_value[]" />
    69109                            </td>
    70                             <td width="15%"><a class="button remove-row" href="#1"><?php esc_html_e('Remove', 'edu-results'); ?></a></td>
     110                            <td class="cbedu-repeater-td-action">
     111                                <button type="button" class="button remove-row cbedu-remove-btn">
     112                                    <span class="dashicons dashicons-trash"></span>
     113                                    <?php esc_html_e('Remove', 'edu-results'); ?>
     114                                </button>
     115                            </td>
    71116                        </tr>
    72                     <?php
    73                     endforeach;
    74                 else :
    75                     // Show a blank row
    76                     ?>
    77                     <tr>
    78                         <td width="70%">
    79                             <select style="width:80%;padding:10px;" name="cbedu_results_subject_name[]">
     117                    <?php endif; ?>
     118
     119                    <!-- Empty hidden row for jQuery -->
     120                    <tr class="empty-row screen-reader-text cbedu-repeater-row">
     121                        <td class="cbedu-repeater-td-subject">
     122                            <select class="cbedu-repeater-select" name="cbedu_results_subject_name[]">
    80123                                <option value=""><?php esc_attr_e('Select Subject', 'edu-results'); ?></option>
    81                                 <?php foreach ($subjects as $subject) : ?>
     124                                <?php foreach ($subjects as $subject) :
     125                                    $subject_code = get_post_meta($subject->ID, 'cbedu_subject_code', true);
     126                                ?>
    82127                                    <option value="<?php echo esc_attr($subject->post_title); ?>">
    83                                         <?php echo esc_html($subject->post_title); ?>
     128                                        <?php echo esc_html($subject_code ? $subject_code . ' - ' : '') . esc_html($subject->post_title); ?>
    84129                                    </option>
    85130                                <?php endforeach; ?>
    86131                            </select>
    87132                        </td>
    88                         <td width="70%">
    89                             <input style="width:80%;padding:10px;" type="text" placeholder="<?php esc_attr_e('Enter subject value', 'edu-results'); ?>" name="cbedu_results_subject_value[]" />
     133                        <td class="cbedu-repeater-td-input">
     134                            <input class="cbedu-repeater-input" type="text" placeholder="<?php esc_attr_e('Enter marks or grade', 'edu-results'); ?>" name="cbedu_results_subject_value[]" />
    90135                        </td>
    91                         <td width="15%"><a class="button remove-row" href="#1"><?php esc_html_e('Remove', 'edu-results'); ?></a></td>
     136                        <td class="cbedu-repeater-td-action">
     137                            <button type="button" class="button remove-row cbedu-remove-btn">
     138                                <span class="dashicons dashicons-trash"></span>
     139                                <?php esc_html_e('Remove', 'edu-results'); ?>
     140                            </button>
     141                        </td>
    92142                    </tr>
    93                 <?php endif; ?>
    94 
    95                 <!-- Empty hidden row for jQuery -->
    96                 <tr class="empty-row screen-reader-text">
    97                     <td width="70%">
    98                         <select style="width:80%;padding:10px;" name="cbedu_results_subject_name[]">
    99                             <option value=""><?php esc_attr_e('Select Subject', 'edu-results'); ?></option>
    100                             <?php foreach ($subjects as $subject) : ?>
    101                                 <option value="<?php echo esc_attr($subject->post_title); ?>">
    102                                     <?php echo esc_html($subject->post_title); ?>
    103                                 </option>
    104                             <?php endforeach; ?>
    105                         </select>
    106                     </td>
    107                     <td width="70%">
    108                         <input style="width:80%;padding:10px;" type="text" placeholder="<?php esc_attr_e('Enter subject value', 'edu-results'); ?>" name="cbedu_results_subject_value[]" />
    109                     </td>
    110                     <td width="15%"><a class="button remove-row" href="#1"><?php esc_html_e('Remove', 'edu-results'); ?></a></td>
    111                 </tr>
    112             </tbody>
    113         </table>
    114 
    115         <p><a id="edu-add-subject-row" class="button" href="#"><?php esc_html_e('Add Another', 'edu-results'); ?></a></p>
     143                </tbody>
     144            </table>
     145
     146            <div class="cbedu-repeater-footer">
     147                <button type="button" id="edu-add-subject-row" class="button button-primary cbedu-add-subject-btn">
     148                    <span class="dashicons dashicons-plus-alt"></span>
     149                    <?php esc_html_e('Add Another Subject', 'edu-results'); ?>
     150                </button>
     151            </div>
     152        </div>
    116153    <?php
    117154    }
     
    128165            return;
    129166
     167        // Skip auto-draft, trash, and inherit posts
     168        $post_status = get_post_status($postID);
     169        if (in_array($post_status, array('auto-draft', 'trash', 'inherit')))
     170            return;
     171
    130172        if (!current_user_can('edit_post', $postID))
     173            return;
     174
     175        // Check post type
     176        if (get_post_type($postID) !== 'cbedu_results')
    131177            return;
    132178
  • edu-results-publishing/trunk/inc/admin/settings.php

    r3019484 r3422911  
    1616        add_action('admin_menu', array($this, 'addSubmenuPage'));
    1717        add_action('admin_init', array($this, 'registerSettings'));
     18        add_action('admin_enqueue_scripts', array($this, 'enqueueSettingsStyles'));
     19    }
     20
     21    public function enqueueSettingsStyles($hook)
     22    {
     23        // Only load on our settings page
     24        if ($hook !== 'cbedu_results_page_cbedu_results_settings') {
     25            return;
     26        }
     27       
     28        wp_enqueue_style(
     29            'cbedu-admin-settings',
     30            plugins_url('../../assets/css/admin-settings.css', __FILE__),
     31            array(),
     32            '1.0.0'
     33        );
    1834    }
    1935
     
    3248    {
    3349?>
    34         <div class="wrap">
     50        <div class="wrap cbedu-settings-wrap">
     51            <div class="cbedu-settings-header">
     52                <h1><?php echo esc_html__('🎓 Edu Results Settings', 'edu-results'); ?></h1>
     53                <p class="cbedu-settings-subtitle"><?php echo esc_html__('Configure your educational institution settings', 'edu-results'); ?></p>
     54            </div>
     55           
    3556            <?php settings_errors(); ?>
    36             <h2>Edu Results Settings</h2>
    37             <form method="post" action="options.php" enctype="multipart/form-data"> <!-- Add enctype for file upload -->
    38                 <?php settings_fields('cbedu_results_settings_group'); ?>
    39                 <?php do_settings_sections('cbedu_results_settings'); ?>
    40                 <?php
    41                 // Add nonce field
    42                 wp_nonce_field('cbedu_results_settings_nonce', 'cbedu_results_settings_nonce_field');
    43                 ?>
    44                 <?php submit_button(); ?>
    45             </form>
     57           
     58            <div class="cbedu-settings-container">
     59                <form method="post" action="options.php" enctype="multipart/form-data" class="cbedu-settings-form">
     60                    <?php settings_fields('cbedu_results_settings_group'); ?>
     61                    <?php wp_nonce_field('cbedu_results_settings_nonce', 'cbedu_results_settings_nonce_field'); ?>
     62                   
     63                    <div class="cbedu-settings-card">
     64                        <div class="cbedu-card-header">
     65                            <h2>🏛️ Institution Information</h2>
     66                            <p class="description">Basic information about your educational institution</p>
     67                        </div>
     68                        <div class="cbedu-card-body">
     69                            <?php do_settings_sections('cbedu_results_settings'); ?>
     70                        </div>
     71                    </div>
     72                   
     73                    <div class="cbedu-settings-footer">
     74                        <?php submit_button(__('Save Settings', 'edu-results'), 'primary cbedu-save-btn', 'submit', false); ?>
     75                    </div>
     76                </form>
     77            </div>
    4678        </div>
    4779    <?php
     
    187219        $logoURL = get_option('cbedu_results_logo');
    188220    ?>
    189         <input type="text" name="cbedu_results_logo" value="<?php echo esc_url($logoURL); ?>" id="cbedu_results_logo">
    190         <input type="button" id="upload_logo_button" class="button" value="Upload Logo">
    191         <br>
    192         <img src="<?php echo esc_url($logoURL); ?>" alt="Logo Preview" id="logo_preview" style="max-width: 200px;">
     221        <div class="cbedu-field-wrapper">
     222            <input type="text" name="cbedu_results_logo" value="<?php echo esc_url($logoURL); ?>" id="cbedu_results_logo" placeholder="https://example.com/logo.png">
     223            <input type="button" id="upload_logo_button" class="button" value="📁 Upload Logo">
     224            <p class="description">Upload or enter the URL of your institution's logo</p>
     225            <?php if ($logoURL): ?>
     226                <img src="<?php echo esc_url($logoURL); ?>" alt="Logo Preview" id="logo_preview">
     227            <?php endif; ?>
     228        </div>
    193229        <script>
    194230            jQuery(document).ready(function($) {
     
    210246                        var attachment = customUploader.state().get('selection').first().toJSON();
    211247                        $('#cbedu_results_logo').val(attachment.url);
    212                         $('#logo_preview').attr('src', attachment.url);
     248                        $('#logo_preview').attr('src', attachment.url).show();
    213249                    });
    214250
     
    217253            });
    218254        </script>
    219         <p class="description">Upload your logo here.</p>
    220255<?php
    221256    }
     
    224259    public function settingsSectionCallback()
    225260    {
    226         echo 'These are the general settings for the Edu Results plugin.';
     261        echo '<p class="cbedu-section-description">Configure the basic information about your educational institution. This information will be displayed on result pages.</p>';
    227262    }
    228263
     
    232267    {
    233268        $collageName = get_option('cbedu_results_collage_name');
    234         echo '<input type="text" name="cbedu_results_collage_name" value="' . esc_attr($collageName) . '" />';
     269        echo '<div class="cbedu-field-wrapper">';
     270        echo '<input type="text" name="cbedu_results_collage_name" value="' . esc_attr($collageName) . '" placeholder="e.g., Springfield High School" />';
     271        echo '<p class="description">Full name of your educational institution</p>';
     272        echo '</div>';
    235273    }
    236274
     
    238276    {
    239277        $collageRegNumber = get_option('cbedu_results_collage_registration_number');
    240         echo '<input type="text" name="cbedu_results_collage_registration_number" value="' . esc_attr($collageRegNumber) . '" />';
     278        echo '<div class="cbedu-field-wrapper">';
     279        echo '<input type="text" name="cbedu_results_collage_registration_number" value="' . esc_attr($collageRegNumber) . '" placeholder="e.g., REG-2024-001" />';
     280        echo '<p class="description">Official registration or EIIN number</p>';
     281        echo '</div>';
    241282    }
    242283
     
    244285    {
    245286        $collageSinceYear = get_option('cbedu_results_collage_since_year');
    246         echo '<input type="text" name="cbedu_results_collage_since_year" value="' . esc_attr($collageSinceYear) . '" />';
     287        echo '<div class="cbedu-field-wrapper">';
     288        echo '<input type="text" name="cbedu_results_collage_since_year" value="' . esc_attr($collageSinceYear) . '" placeholder="e.g., 1995" />';
     289        echo '<p class="description">Year when the institution was established</p>';
     290        echo '</div>';
    247291    }
    248292
     
    250294    {
    251295        $collageAddress = get_option('cbedu_results_collage_address');
    252         echo '<textarea name="cbedu_results_collage_address" rows="5" cols="50">' . esc_textarea($collageAddress) . '</textarea>';
     296        echo '<div class="cbedu-field-wrapper">';
     297        echo '<textarea name="cbedu_results_collage_address" rows="5" cols="50" placeholder="Enter complete address with city, state, and postal code">' . esc_textarea($collageAddress) . '</textarea>';
     298        echo '<p class="description">Complete postal address of the institution</p>';
     299        echo '</div>';
    253300    }
    254301   
     
    257304    {
    258305        $collagePhoneNumber = get_option('cbedu_results_collage_phone_number');
    259         echo '<input type="text" name="cbedu_results_collage_phone_number" value="' . esc_attr($collagePhoneNumber) . '" />';
     306        echo '<div class="cbedu-field-wrapper">';
     307        echo '<input type="text" name="cbedu_results_collage_phone_number" value="' . esc_attr($collagePhoneNumber) . '" placeholder="e.g., +880-123-456-7890" />';
     308        echo '<p class="description">Primary contact phone number</p>';
     309        echo '</div>';
    260310    }
    261311
     
    263313    {
    264314        $collageEmailAddress = get_option('cbedu_results_collage_email_address');
    265         echo '<input type="email" name="cbedu_results_collage_email_address" value="' . esc_attr($collageEmailAddress) . '" />';
     315        echo '<div class="cbedu-field-wrapper">';
     316        echo '<input type="email" name="cbedu_results_collage_email_address" value="' . esc_attr($collageEmailAddress) . '" placeholder="e.g., info@institution.edu" />';
     317        echo '<p class="description">Official email address for contact</p>';
     318        echo '</div>';
    266319    }
    267320
     
    270323    {
    271324        $collageWebsiteUrl = get_option('cbedu_results_collage_website_url');
    272         echo '<input type="url" name="cbedu_results_collage_website_url" value="' . esc_url($collageWebsiteUrl) . '" />';
     325        echo '<div class="cbedu-field-wrapper">';
     326        echo '<input type="url" name="cbedu_results_collage_website_url" value="' . esc_url($collageWebsiteUrl) . '" placeholder="https://www.institution.edu" />';
     327        echo '<p class="description">Official website URL</p>';
     328        echo '</div>';
    273329    }
    274330
     
    276332    {
    277333        $bannerHeading = get_option('cbedu_results_banner_heading');
    278         echo '<input type="text" name="cbedu_results_banner_heading" value="' . esc_attr($bannerHeading) . '" />';
     334        echo '<div class="cbedu-field-wrapper">';
     335        echo '<input type="text" name="cbedu_results_banner_heading" value="' . esc_attr($bannerHeading) . '" placeholder="Enter custom heading text for result banners" />';
     336        echo '<p class="description">Custom heading text that appears on result pages</p>';
     337        echo '</div>';
    279338    }
    280339}
  • edu-results-publishing/trunk/inc/custom-fields.php

    r3019484 r3422911  
    2929        add_action('wp_ajax_add_search_registration_numbers', array($this, 'add_search_registration_numbers'));
    3030        //  add_action('wp_ajax_nopriv_add_search_registration_numbers', array($this, 'add_search_registration_numbers'));
     31       
     32        // Hook to handle auto-draft deletion
     33        add_action('admin_init', array($this, 'handle_auto_draft_deletion'));
     34    }
     35   
     36    /**
     37     * Handle auto-draft deletion via admin actions
     38     */
     39    public function handle_auto_draft_deletion()
     40    {
     41        // Check if we're trying to delete an auto-draft
     42        if (isset($_GET['action']) && $_GET['action'] === 'trash' && isset($_GET['post'])) {
     43            $post_id = intval($_GET['post']);
     44            $post = get_post($post_id);
     45           
     46            if ($post && $post->post_status === 'auto-draft' &&
     47                in_array($post->post_type, array('cbedu_students', 'cbedu_subjects', 'cbedu_results'))) {
     48               
     49                // Force delete auto-draft instead of trashing
     50                wp_delete_post($post_id, true);
     51               
     52                // Redirect back to the list
     53                wp_redirect(admin_url('edit.php?post_type=' . $post->post_type . '&deleted=1'));
     54                exit;
     55            }
     56        }
     57       
     58        // Handle bulk deletion
     59        if (isset($_GET['action']) && $_GET['action'] === 'trash' && isset($_GET['post']) && is_array($_GET['post'])) {
     60            foreach ($_GET['post'] as $post_id) {
     61                $post_id = intval($post_id);
     62                $post = get_post($post_id);
     63               
     64                if ($post && $post->post_status === 'auto-draft' &&
     65                    in_array($post->post_type, array('cbedu_students', 'cbedu_subjects', 'cbedu_results'))) {
     66                   
     67                    // Force delete auto-draft instead of trashing
     68                    wp_delete_post($post_id, true);
     69                }
     70            }
     71        }
    3172    }
    3273
     
    4182
    4283        add_action('save_post', array($this, 'save_student_fields'));
    43         add_action('save_post', array($this, 'cbedu_check_unique_registration_number'));
     84        add_action('save_post', array($this, 'cbedu_check_unique_registration_number'));       
     85       
     86        // Clean up auto-draft posts
     87        add_action('wp_scheduled_delete', array($this, 'cleanup_auto_drafts'));
     88       
     89        // Allow deletion of auto-draft posts
     90        add_filter('user_has_cap', array($this, 'allow_auto_draft_deletion'), 10, 4);
     91       
     92        // Disable autosave for our custom post types
     93        add_action('admin_print_scripts', array($this, 'disable_autosave'));
     94    }
     95   
     96    /**
     97     * Disable autosave for custom post types
     98     */
     99    public function disable_autosave()
     100    {
     101        global $post;
     102       
     103        if ($post && in_array($post->post_type, array('cbedu_students', 'cbedu_subjects', 'cbedu_results'))) {
     104            wp_dequeue_script('autosave');
     105        }
     106    }
     107   
     108    /**
     109     * Allow users to delete auto-draft posts for our custom post types
     110     */
     111    public function allow_auto_draft_deletion($allcaps, $caps, $args, $user)
     112    {
     113        // Check if this is a delete operation
     114        if (isset($args[0]) && in_array($args[0], array('delete_post', 'delete_posts'))) {
     115            // Check if we have a post ID
     116            if (isset($args[2])) {
     117                $post_id = $args[2];
     118                $post = get_post($post_id);
     119               
     120                // If it's an auto-draft of our custom post types, allow deletion
     121                if ($post && in_array($post->post_type, array('cbedu_students', 'cbedu_subjects', 'cbedu_results'))) {
     122                    if ($post->post_status === 'auto-draft') {
     123                        $allcaps['delete_posts'] = true;
     124                        $allcaps['delete_published_posts'] = true;
     125                        $allcaps['delete_others_posts'] = true;
     126                    }
     127                }
     128            }
     129        }
     130       
     131        return $allcaps;
     132    }
     133   
     134    /**
     135     * Clean up old auto-draft posts for cbedu custom post types
     136     */
     137    public function cleanup_auto_drafts()
     138    {
     139        global $wpdb;
     140       
     141        // Delete auto-drafts older than 7 days for our custom post types
     142        $post_types = array('cbedu_students', 'cbedu_subjects', 'cbedu_results');
     143       
     144        foreach ($post_types as $post_type) {
     145            $wpdb->query($wpdb->prepare(
     146                "DELETE FROM {$wpdb->posts}
     147                WHERE post_type = %s
     148                AND post_status = 'auto-draft'
     149                AND DATE_SUB(NOW(), INTERVAL 7 DAY) > post_date",
     150                $post_type
     151            ));
     152        }
    44153    }
    45154
     
    73182        wp_nonce_field('cbedu_save_student_nonce_action', 'cbedu_save_student_nonce');
    74183
    75 
     184        // Get all meta values
    76185        $id_number = get_post_meta($post->ID, 'cbedu_result_std_id', true);       
    77186        $std_registration_number = get_post_meta($post->ID, 'cbedu_result_std_registration_number', true);
     
    79188        $mother_name = get_post_meta($post->ID, 'cbedu_result_std_mother_name', true);
    80189        $dob = get_post_meta($post->ID, 'cbedu_result_std_dob', true);
    81 
    82190        $gender = get_post_meta($post->ID, 'cbedu_result_std_gender', true);
    83191        $phone = get_post_meta($post->ID, 'cbedu_result_std_phone', true);
     
    92200        $birth_registration_number = get_post_meta($post->ID, 'cbedu_result_std_birth_registration_number', true);
    93201        $nid_number = get_post_meta($post->ID, 'cbedu_result_std_nid_number', true);
    94 
    95 
    96         // Output HTML inputs for each field
    97202?>
    98         <table>
    99             <tr>
    100                 <td>
    101                     <label for="cbedu_result_std_id"><?php esc_html_e('ID Number:', 'edu-results'); ?></label>
    102                 </td>
    103                 <td>
    104                     <input class="regular-text" style="padding: 7px 10px;" type="text" id="cbedu_result_std_id" name="cbedu_result_std_id" value="<?php echo esc_attr($id_number); ?>" />
    105                 </td>
    106             </tr>
    107             <tr>
    108                 <td>
    109                     <label for="cbedu_result_std_registration_number"><?php esc_html_e('Registration Number:', 'edu-results'); ?></label>
    110                 </td>
    111                 <td>
    112                     <input class="regular-text" style="padding: 7px 10px;" type="text" id="cbedu_result_std_registration_number" name="cbedu_result_std_registration_number" value="<?php echo esc_attr($std_registration_number); ?>" />
    113                 </td>
    114             </tr>
    115             <tr>
    116                 <td>
    117                     <label for="cbedu_result_std_father_name"><?php esc_html_e('Father Name:', 'edu-results'); ?></label>
    118                 </td>
    119                 <td>
    120                     <input class="regular-text" style="padding: 7px 10px;" type="text" id="cbedu_result_std_father_name" name="cbedu_result_std_father_name" value="<?php echo esc_attr($father_name); ?>" />
    121                 </td>
    122             </tr>
    123             <tr>
    124                 <td>
    125                     <label for="cbedu_result_std_mother_name"><?php esc_html_e('Mother Name:', 'edu-results'); ?></label>
    126                 </td>
    127                 <td>
    128                     <input class="regular-text" style="padding: 7px 10px;" type="text" id="cbedu_result_std_mother_name" name="cbedu_result_std_mother_name" value="<?php echo esc_attr($mother_name); ?>" />
    129                 </td>
    130             </tr>
    131             <tr>
    132                 <td>
    133                     <label for="cbedu_result_std_dob"><?php esc_html_e('Date of Birth:', 'edu-results'); ?></label>
    134                 </td>
    135                 <td>
    136                     <input class="regular-text" style="padding: 7px 10px;" type="date" id="cbedu_result_std_dob" name="cbedu_result_std_dob" value="<?php echo esc_attr($dob); ?>" />
    137                 </td>
    138             </tr>
    139             <tr>
    140                 <td><label for="cbedu_result_std_gender"><?php esc_html_e('Gender:', 'edu-results'); ?></label></td>
    141                 <td>
    142                     <select id="cbedu_result_std_gender" name="cbedu_result_std_gender">
    143                         <option value="Male" <?php selected($gender, 'Male'); ?>><?php esc_html_e('Male', 'edu-results'); ?></option>
    144                         <option value="Female" <?php selected($gender, 'Female'); ?>><?php esc_html_e('Female', 'edu-results'); ?></option>
    145                         <option value="Other" <?php selected($gender, 'Other'); ?>><?php esc_html_e('Other', 'edu-results'); ?></option>
    146                     </select>
    147                 </td>
    148             </tr>
    149 
    150             <tr>
    151                 <td><label for="cbedu_result_std_phone"><?php esc_html_e('Phone Number:', 'edu-results'); ?></label></td>
    152                 <td><input class="regular-text" type="text" id="cbedu_result_std_phone" name="cbedu_result_std_phone" value="<?php echo esc_attr($phone); ?>" /></td>
    153             </tr>
    154             <tr>
    155                 <td><label for="cbedu_result_std_email"><?php esc_html_e('Email Address:', 'edu-results'); ?></label></td>
    156                 <td><input class="regular-text" type="email" id="cbedu_result_std_email" name="cbedu_result_std_email" value="<?php echo esc_attr($email); ?>" /></td>
    157             </tr>
    158             <tr>
    159                 <td><label for="cbedu_result_std_blood_group"><?php esc_html_e('Blood Group:', 'edu-results'); ?></label></td>
    160                 <td>
    161                     <select id="cbedu_result_std_blood_group" name="cbedu_result_std_blood_group">
    162                         <option value=""><?php esc_html_e('Select Blood Group', 'edu-results'); ?></option>
    163                         <option value="A+" <?php selected($blood_group, 'A+'); ?>><?php esc_html_e('A+', 'edu-results'); ?></option>
    164                         <option value="A-" <?php selected($blood_group, 'A-'); ?>><?php esc_html_e('A-', 'edu-results'); ?></option>
    165                         <option value="B+" <?php selected($blood_group, 'B+'); ?>><?php esc_html_e('B+', 'edu-results'); ?></option>
    166                         <option value="B-" <?php selected($blood_group, 'B-'); ?>><?php esc_html_e('B-', 'edu-results'); ?></option>
    167                         <option value="AB+" <?php selected($blood_group, 'AB+'); ?>><?php esc_html_e('AB+', 'edu-results'); ?></option>
    168                         <option value="AB-" <?php selected($blood_group, 'AB-'); ?>><?php esc_html_e('AB-', 'edu-results'); ?></option>
    169                         <option value="O+" <?php selected($blood_group, 'O+'); ?>><?php esc_html_e('O+', 'edu-results'); ?></option>
    170                         <option value="O-" <?php selected($blood_group, 'O-'); ?>><?php esc_html_e('O-', 'edu-results'); ?></option>
    171                     </select>
    172                 </td>
    173             </tr>
    174             <tr>
    175                 <td><label for="cbedu_result_std_guardian_phone"><?php esc_html_e('Guardian Phone Number:', 'edu-results'); ?></label></td>
    176                 <td><input class="regular-text" type="text" id="cbedu_result_std_guardian_phone" name="cbedu_result_std_guardian_phone" value="<?php echo esc_attr($guardian_phone); ?>" /></td>
    177             </tr>
    178             <tr>
    179                 <td><label for="cbedu_result_std_fathers_qualification"><?php esc_html_e('Father\'s Qualification:', 'edu-results'); ?></label></td>
    180                 <td><input class="regular-text" type="text" id="cbedu_result_std_fathers_qualification" name="cbedu_result_std_fathers_qualification" value="<?php echo esc_attr($fathers_qualification); ?>" /></td>
    181             </tr>
    182             <tr>
    183                 <td><label for="cbedu_result_std_fathers_occupation"><?php esc_html_e('Father\'s Occupation:', 'edu-results'); ?></label></td>
    184                 <td><input class="regular-text" type="text" id="cbedu_result_std_fathers_occupation" name="cbedu_result_std_fathers_occupation" value="<?php echo esc_attr($fathers_occupation); ?>" /></td>
    185             </tr>
    186             <tr>
    187                 <td><label for="cbedu_result_std_mothers_occupation"><?php esc_html_e('Mother\'s Occupation:', 'edu-results'); ?></label></td>
    188                 <td><input class="regular-text" type="text" id="cbedu_result_std_mothers_occupation" name="cbedu_result_std_mothers_occupation" value="<?php echo esc_attr($mothers_occupation); ?>" /></td>
    189             </tr>
    190             <tr>
    191                 <td><label for="cbedu_result_std_mothers_qualification"><?php esc_html_e('Mother\'s Qualification:', 'edu-results'); ?></label></td>
    192                 <td><input class="regular-text" type="text" id="cbedu_result_std_mothers_qualification" name="cbedu_result_std_mothers_qualification" value="<?php echo esc_attr($mothers_qualification); ?>" /></td>
    193             </tr>
    194             <tr>
    195                 <td><label for="cbedu_result_std_birth_registration_number"><?php esc_html_e('Birth Registration Number:', 'edu-results'); ?></label></td>
    196                 <td><input class="regular-text" type="text" id="cbedu_result_std_birth_registration_number" name="cbedu_result_std_birth_registration_number" value="<?php echo esc_attr($birth_registration_number); ?>" /></td>
    197             </tr>
    198             <tr>
    199                 <td><label for="cbedu_result_std_nid_number"><?php esc_html_e('NID Number:', 'edu-results'); ?></label></td>
    200                 <td><input class="regular-text" type="text" id="cbedu_result_std_nid_number" name="cbedu_result_std_nid_number" value="<?php echo esc_attr($nid_number); ?>" /></td>
    201             </tr>
    202             <tr>
    203                 <td><label for="cbedu_result_std_address"><?php esc_html_e('Address:', 'edu-results'); ?></label></td>
    204                 <td>
    205                     <textarea id="cbedu_result_std_address" name="cbedu_result_std_address" rows="4" cols="50"><?php echo esc_textarea($address); ?></textarea>
    206                 </td>
    207             </tr>
    208 
    209         </table>
     203        <div class="cbedu-meta-box-wrap">
     204            <!-- Basic Information Section -->
     205            <div class="cbedu-field-section">
     206                <h3 class="cbedu-section-header"><?php esc_html_e('Basic Information', 'edu-results'); ?></h3>
     207                <div class="cbedu-section-content">
     208                    <div class="cbedu-field-row">
     209                        <div class="cbedu-field-group">
     210                            <label class="cbedu-field-label" for="cbedu_result_std_id">
     211                                <?php esc_html_e('ID Number', 'edu-results'); ?>
     212                                <span class="required">*</span>
     213                            </label>
     214                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_id" name="cbedu_result_std_id" value="<?php echo esc_attr($id_number); ?>" placeholder="<?php esc_attr_e('Enter student ID', 'edu-results'); ?>" />
     215                        </div>
     216                       
     217                        <div class="cbedu-field-group">
     218                            <label class="cbedu-field-label" for="cbedu_result_std_registration_number">
     219                                <?php esc_html_e('Registration Number', 'edu-results'); ?>
     220                                <span class="required">*</span>
     221                            </label>
     222                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_registration_number" name="cbedu_result_std_registration_number" value="<?php echo esc_attr($std_registration_number); ?>" placeholder="<?php esc_attr_e('Enter registration number', 'edu-results'); ?>" />
     223                        </div>
     224                    </div>
     225
     226                    <div class="cbedu-field-row">
     227                        <div class="cbedu-field-group">
     228                            <label class="cbedu-field-label" for="cbedu_result_std_dob">
     229                                <?php esc_html_e('Date of Birth', 'edu-results'); ?>
     230                            </label>
     231                            <input class="cbedu-field-input" type="date" id="cbedu_result_std_dob" name="cbedu_result_std_dob" value="<?php echo esc_attr($dob); ?>" />
     232                        </div>
     233
     234                        <div class="cbedu-field-group">
     235                            <label class="cbedu-field-label" for="cbedu_result_std_gender">
     236                                <?php esc_html_e('Gender', 'edu-results'); ?>
     237                            </label>
     238                            <select class="cbedu-field-select" id="cbedu_result_std_gender" name="cbedu_result_std_gender">
     239                                <option value=""><?php esc_html_e('Select Gender', 'edu-results'); ?></option>
     240                                <option value="Male" <?php selected($gender, 'Male'); ?>><?php esc_html_e('Male', 'edu-results'); ?></option>
     241                                <option value="Female" <?php selected($gender, 'Female'); ?>><?php esc_html_e('Female', 'edu-results'); ?></option>
     242                                <option value="Other" <?php selected($gender, 'Other'); ?>><?php esc_html_e('Other', 'edu-results'); ?></option>
     243                            </select>
     244                        </div>
     245
     246                        <div class="cbedu-field-group">
     247                            <label class="cbedu-field-label" for="cbedu_result_std_blood_group">
     248                                <?php esc_html_e('Blood Group', 'edu-results'); ?>
     249                            </label>
     250                            <select class="cbedu-field-select" id="cbedu_result_std_blood_group" name="cbedu_result_std_blood_group">
     251                                <option value=""><?php esc_html_e('Select Blood Group', 'edu-results'); ?></option>
     252                                <option value="A+" <?php selected($blood_group, 'A+'); ?>>A+</option>
     253                                <option value="A-" <?php selected($blood_group, 'A-'); ?>>A-</option>
     254                                <option value="B+" <?php selected($blood_group, 'B+'); ?>>B+</option>
     255                                <option value="B-" <?php selected($blood_group, 'B-'); ?>>B-</option>
     256                                <option value="AB+" <?php selected($blood_group, 'AB+'); ?>>AB+</option>
     257                                <option value="AB-" <?php selected($blood_group, 'AB-'); ?>>AB-</option>
     258                                <option value="O+" <?php selected($blood_group, 'O+'); ?>>O+</option>
     259                                <option value="O-" <?php selected($blood_group, 'O-'); ?>>O-</option>
     260                            </select>
     261                        </div>
     262                    </div>
     263                </div>
     264            </div>
     265
     266            <!-- Contact Information Section -->
     267            <div class="cbedu-field-section">
     268                <h3 class="cbedu-section-header"><?php esc_html_e('Contact Information', 'edu-results'); ?></h3>
     269                <div class="cbedu-section-content">
     270                    <div class="cbedu-field-row">
     271                        <div class="cbedu-field-group">
     272                            <label class="cbedu-field-label" for="cbedu_result_std_phone">
     273                                <?php esc_html_e('Phone Number', 'edu-results'); ?>
     274                            </label>
     275                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_phone" name="cbedu_result_std_phone" value="<?php echo esc_attr($phone); ?>" placeholder="<?php esc_attr_e('+880...', 'edu-results'); ?>" />
     276                        </div>
     277
     278                        <div class="cbedu-field-group">
     279                            <label class="cbedu-field-label" for="cbedu_result_std_email">
     280                                <?php esc_html_e('Email Address', 'edu-results'); ?>
     281                            </label>
     282                            <input class="cbedu-field-input" type="email" id="cbedu_result_std_email" name="cbedu_result_std_email" value="<?php echo esc_attr($email); ?>" placeholder="<?php esc_attr_e('student@example.com', 'edu-results'); ?>" />
     283                        </div>
     284
     285                        <div class="cbedu-field-group">
     286                            <label class="cbedu-field-label" for="cbedu_result_std_guardian_phone">
     287                                <?php esc_html_e('Guardian Phone', 'edu-results'); ?>
     288                            </label>
     289                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_guardian_phone" name="cbedu_result_std_guardian_phone" value="<?php echo esc_attr($guardian_phone); ?>" placeholder="<?php esc_attr_e('+880...', 'edu-results'); ?>" />
     290                        </div>
     291                    </div>
     292
     293                    <div class="cbedu-field-row">
     294                        <div class="cbedu-field-group cbedu-field-full">
     295                            <label class="cbedu-field-label" for="cbedu_result_std_address">
     296                                <?php esc_html_e('Address', 'edu-results'); ?>
     297                            </label>
     298                            <textarea class="cbedu-field-textarea" id="cbedu_result_std_address" name="cbedu_result_std_address" rows="3" placeholder="<?php esc_attr_e('Enter full address...', 'edu-results'); ?>"><?php echo esc_textarea($address); ?></textarea>
     299                        </div>
     300                    </div>
     301                </div>
     302            </div>
     303
     304            <!-- Family Information Section -->
     305            <div class="cbedu-field-section">
     306                <h3 class="cbedu-section-header"><?php esc_html_e('Family Information', 'edu-results'); ?></h3>
     307                <div class="cbedu-section-content">
     308                    <div class="cbedu-field-row">
     309                        <div class="cbedu-field-group">
     310                            <label class="cbedu-field-label" for="cbedu_result_std_father_name">
     311                                <?php esc_html_e("Father's Name", 'edu-results'); ?>
     312                            </label>
     313                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_father_name" name="cbedu_result_std_father_name" value="<?php echo esc_attr($father_name); ?>" placeholder="<?php esc_attr_e("Enter father's name", 'edu-results'); ?>" />
     314                        </div>
     315
     316                        <div class="cbedu-field-group">
     317                            <label class="cbedu-field-label" for="cbedu_result_std_fathers_occupation">
     318                                <?php esc_html_e("Father's Occupation", 'edu-results'); ?>
     319                            </label>
     320                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_fathers_occupation" name="cbedu_result_std_fathers_occupation" value="<?php echo esc_attr($fathers_occupation); ?>" placeholder="<?php esc_attr_e('Enter occupation', 'edu-results'); ?>" />
     321                        </div>
     322
     323                        <div class="cbedu-field-group">
     324                            <label class="cbedu-field-label" for="cbedu_result_std_fathers_qualification">
     325                                <?php esc_html_e("Father's Qualification", 'edu-results'); ?>
     326                            </label>
     327                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_fathers_qualification" name="cbedu_result_std_fathers_qualification" value="<?php echo esc_attr($fathers_qualification); ?>" placeholder="<?php esc_attr_e('Enter qualification', 'edu-results'); ?>" />
     328                        </div>
     329                    </div>
     330
     331                    <div class="cbedu-field-row">
     332                        <div class="cbedu-field-group">
     333                            <label class="cbedu-field-label" for="cbedu_result_std_mother_name">
     334                                <?php esc_html_e("Mother's Name", 'edu-results'); ?>
     335                            </label>
     336                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_mother_name" name="cbedu_result_std_mother_name" value="<?php echo esc_attr($mother_name); ?>" placeholder="<?php esc_attr_e("Enter mother's name", 'edu-results'); ?>" />
     337                        </div>
     338
     339                        <div class="cbedu-field-group">
     340                            <label class="cbedu-field-label" for="cbedu_result_std_mothers_occupation">
     341                                <?php esc_html_e("Mother's Occupation", 'edu-results'); ?>
     342                            </label>
     343                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_mothers_occupation" name="cbedu_result_std_mothers_occupation" value="<?php echo esc_attr($mothers_occupation); ?>" placeholder="<?php esc_attr_e('Enter occupation', 'edu-results'); ?>" />
     344                        </div>
     345
     346                        <div class="cbedu-field-group">
     347                            <label class="cbedu-field-label" for="cbedu_result_std_mothers_qualification">
     348                                <?php esc_html_e("Mother's Qualification", 'edu-results'); ?>
     349                            </label>
     350                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_mothers_qualification" name="cbedu_result_std_mothers_qualification" value="<?php echo esc_attr($mothers_qualification); ?>" placeholder="<?php esc_attr_e('Enter qualification', 'edu-results'); ?>" />
     351                        </div>
     352                    </div>
     353                </div>
     354            </div>
     355
     356            <!-- Government Documents Section -->
     357            <div class="cbedu-field-section">
     358                <h3 class="cbedu-section-header"><?php esc_html_e('Government Documents', 'edu-results'); ?></h3>
     359                <div class="cbedu-section-content">
     360                    <div class="cbedu-field-row">
     361                        <div class="cbedu-field-group">
     362                            <label class="cbedu-field-label" for="cbedu_result_std_birth_registration_number">
     363                                <?php esc_html_e('Birth Registration Number', 'edu-results'); ?>
     364                            </label>
     365                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_birth_registration_number" name="cbedu_result_std_birth_registration_number" value="<?php echo esc_attr($birth_registration_number); ?>" placeholder="<?php esc_attr_e('Enter birth registration number', 'edu-results'); ?>" />
     366                        </div>
     367
     368                        <div class="cbedu-field-group">
     369                            <label class="cbedu-field-label" for="cbedu_result_std_nid_number">
     370                                <?php esc_html_e('NID Number', 'edu-results'); ?>
     371                            </label>
     372                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_nid_number" name="cbedu_result_std_nid_number" value="<?php echo esc_attr($nid_number); ?>" placeholder="<?php esc_attr_e('Enter NID number', 'edu-results'); ?>" />
     373                        </div>
     374                    </div>
     375                </div>
     376            </div>
     377        </div>
    210378    <?php
    211379    }
     
    220388        // Save the custom field values when the post is saved
    221389        if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
     390            return;
     391        }
     392
     393        // Skip auto-draft, trash, and inherit posts
     394        $post_status = get_post_status($post_id);
     395        if (in_array($post_status, array('auto-draft', 'trash', 'inherit'))) {
     396            return;
     397        }
     398
     399        // Check post type
     400        if (get_post_type($post_id) !== 'cbedu_students') {
    222401            return;
    223402        }
     
    346525        // Output HTML input for subject code
    347526    ?>
    348         <table>
    349             <tr>
    350                 <td>
    351                     <label for="cbedu_subject_code"><?php esc_html_e('Subject Code:', 'edu-results'); ?></label>
    352                 </td>
    353                 <td>
    354                     <input class="regular-text" type="text" id="cbedu_subject_code" name="cbedu_subject_code" value="<?php echo esc_attr($subject_code); ?>" />
    355                 </td>
    356             </tr>
    357         </table>
     527        <div class="cbedu-meta-box-wrap">
     528            <div class="cbedu-field-section">
     529                <h3 class="cbedu-section-header"><?php esc_html_e('Subject Information', 'edu-results'); ?></h3>
     530                <div class="cbedu-section-content">
     531                    <div class="cbedu-field-row">
     532                        <div class="cbedu-field-group">
     533                            <label class="cbedu-field-label" for="cbedu_subject_code">
     534                                <?php esc_html_e('Subject Code', 'edu-results'); ?>
     535                            </label>
     536                            <input class="cbedu-field-input" type="text" id="cbedu_subject_code" name="cbedu_subject_code" value="<?php echo esc_attr($subject_code); ?>" placeholder="<?php esc_attr_e('e.g., MATH101', 'edu-results'); ?>" />
     537                            <p class="cbedu-field-description"><?php esc_html_e('Enter a unique code for this subject', 'edu-results'); ?></p>
     538                        </div>
     539                    </div>
     540                </div>
     541            </div>
     542        </div>
    358543    <?php
    359544    }
     
    368553        // Save the custom field value when the post is saved
    369554        if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
     555            return;
     556        }
     557
     558        // Skip auto-draft, trash, and inherit posts
     559        $post_status = get_post_status($post_id);
     560        if (in_array($post_status, array('auto-draft', 'trash', 'inherit'))) {
     561            return;
     562        }
     563
     564        // Check post type
     565        if (get_post_type($post_id) !== 'cbedu_subjects') {
    370566            return;
    371567        }
     
    440636
    441637    ?>
    442         <table>
    443             <?php
    444             $this->render_registration_number_input($post);
    445             ?>
    446             <tr>
    447                 <td>
    448                     <label for="cbedu_result_std_roll"><?php esc_html_e('Roll:', 'edu-results'); ?></label>
    449                 </td>
    450                 <td>
    451                     <input class="regular-text" style="padding: 7px 10px;" type="text" id="cbedu_result_std_roll" name="cbedu_result_std_roll" value="<?php echo esc_attr($roll); ?>" />
    452                 </td>
    453             </tr>
    454             <tr>
    455                 <td><label for="cbedu_result_std_name"><?php esc_html_e('Student Name:', 'edu-results'); ?></label></td>
    456                 <td><input type="text" style="padding: 7px 10px;width: 100%;" id="cbedu_result_std_name" name="cbedu_result_std_name" value="<?php echo esc_attr($student_name) ?>" readonly /></td>
    457             </tr>
    458             <tr>
    459                 <td><label for="cbedu_result_std_fathers_name"><?php esc_html_e('Father\'s Name:', 'edu-results'); ?></label></td>
    460                 <td><input type="text" style="padding: 7px 10px;width: 100%;" id="cbedu_result_std_fathers_name" name="cbedu_result_std_fathers_name" value="<?php echo esc_attr($fathers_name); ?>" readonly /></td>
    461             </tr>
    462             <tr>
    463                 <td><label for="cbedu_result_std_mothers_name"><?php esc_html_e('Mother\'s Name:', 'edu-results'); ?></label></td>
    464                 <td><input type="text" style="padding: 7px 10px;width: 100%;" id="cbedu_result_std_mothers_name" name="cbedu_result_std_mothers_name" value="<?php echo esc_attr($mothers_name); ?>" readonly /></td>
    465             </tr>
    466             <tr>
    467                 <td>
    468                     <label for="cbedu_result_std_student_type"><?php esc_html_e('Student Type:', 'edu-results'); ?></label>
    469                 </td>
    470                 <td>
    471                     <input class="regular-text" style="padding: 7px 10px;" type="text" id="cbedu_result_std_student_type" name="cbedu_result_std_student_type" value="<?php echo esc_attr($student_type); ?>" />
    472                 </td>
    473             </tr>
    474             <tr style="margin-top: 10px;margin-bottom:10px;">
    475                 <td>
    476                     <label><?php esc_html_e('Result Status:', 'edu-results'); ?></label>
    477                 </td>
    478                 <td>
    479                     <input type="radio" id="cbedu_result_std_result_status_passed" name="cbedu_result_std_result_status" value="Passed" <?php checked($result_status, 'Passed'); ?> />
    480                     <label for="cbedu_result_std_result_status_passed" style="margin-right: 10px;"><?php esc_html_e('Passed', 'edu-results'); ?></label>
    481 
    482                     <input type="radio" id="cbedu_result_std_result_status_failed" name="cbedu_result_std_result_status" value="Failed" <?php checked($result_status, 'Failed'); ?> />
    483                     <label for="cbedu_result_std_result_status_failed"><?php esc_html_e('Failed', 'edu-results'); ?></label>
    484                 </td>
    485             </tr>
    486             <tr>
    487                 <td>
    488                     <label for="cbedu_result_std_gpa"><?php esc_html_e('GPA:', 'edu-results'); ?></label>
    489                 </td>
    490                 <td>
    491                     <input class="regular-text" style="padding: 7px 10px;" type="text" id="cbedu_result_std_gpa" name="cbedu_result_std_gpa" value="<?php echo esc_attr($gpa); ?>" />
    492                 </td>
    493             </tr>
    494             <tr>
    495                 <td>
    496                     <label for="cbedu_result_std_was_gpa"><?php _e('GPA <abbr title="Without additional subject">(WAS)</abbr>:', 'edu-results'); ?></label>
    497                 </td>
    498                 <td>
    499                     <input class="regular-text" style="padding: 7px 10px;" type="text" id="cbedu_result_std_was_gpa" name="cbedu_result_std_was_gpa" value="<?php echo esc_attr($was_gpa); ?>" />
    500                 </td>
    501             </tr>
    502         </table>
     638        <div class="cbedu-meta-box-wrap">
     639            <!-- Student Selection Section -->
     640            <div class="cbedu-field-section">
     641                <h3 class="cbedu-section-header"><?php esc_html_e('Student Selection', 'edu-results'); ?></h3>
     642                <div class="cbedu-section-content">
     643                    <div class="cbedu-field-row">
     644                        <div class="cbedu-field-group">
     645                            <label class="cbedu-field-label" for="cbedu_result_std_registration_number">
     646                                <?php esc_html_e('Registration Number', 'edu-results'); ?>
     647                                <span class="required">*</span>
     648                            </label>
     649                            <input class="cbedu-field-input cbedu-registration-number-autocomplete" type="text" id="cbedu_result_std_registration_number" name="cbedu_result_std_registration_number" value="<?php echo esc_attr($current_reg_number); ?>" placeholder="<?php esc_attr_e('Start typing...', 'edu-results'); ?>" />
     650                            <p class="cbedu-field-description"><?php esc_html_e('Type to search and select student registration number', 'edu-results'); ?></p>
     651                        </div>
     652                        <div class="cbedu-field-group">
     653                            <label class="cbedu-field-label" for="cbedu_result_std_roll">
     654                                <?php esc_html_e('Roll Number', 'edu-results'); ?>
     655                            </label>
     656                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_roll" name="cbedu_result_std_roll" value="<?php echo esc_attr($roll); ?>" placeholder="<?php esc_attr_e('Enter roll number', 'edu-results'); ?>" />
     657                        </div>
     658                    </div>
     659                   
     660                    <div class="cbedu-field-row">
     661                        <div class="cbedu-field-group">
     662                            <label class="cbedu-field-label" for="cbedu_result_std_name">
     663                                <?php esc_html_e('Student Name', 'edu-results'); ?>
     664                            </label>
     665                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_name" name="cbedu_result_std_name" value="<?php echo esc_attr($student_name); ?>" readonly style="background-color: #f0f0f1; cursor: not-allowed;" />
     666                        </div>
     667                        <div class="cbedu-field-group">
     668                            <label class="cbedu-field-label" for="cbedu_result_std_fathers_name">
     669                                <?php esc_html_e("Father's Name", 'edu-results'); ?>
     670                            </label>
     671                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_fathers_name" name="cbedu_result_std_fathers_name" value="<?php echo esc_attr($fathers_name); ?>" readonly style="background-color: #f0f0f1; cursor: not-allowed;" />
     672                        </div>
     673                        <div class="cbedu-field-group">
     674                            <label class="cbedu-field-label" for="cbedu_result_std_mothers_name">
     675                                <?php esc_html_e("Mother's Name", 'edu-results'); ?>
     676                            </label>
     677                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_mothers_name" name="cbedu_result_std_mothers_name" value="<?php echo esc_attr($mothers_name); ?>" readonly style="background-color: #f0f0f1; cursor: not-allowed;" />
     678                        </div>
     679                    </div>
     680                </div>
     681            </div>
     682
     683            <!-- Result Details Section -->
     684            <div class="cbedu-field-section">
     685                <h3 class="cbedu-section-header"><?php esc_html_e('Result Details', 'edu-results'); ?></h3>
     686                <div class="cbedu-section-content">
     687                    <div class="cbedu-field-row">
     688                        <div class="cbedu-field-group">
     689                            <label class="cbedu-field-label" for="cbedu_result_std_student_type">
     690                                <?php esc_html_e('Student Type', 'edu-results'); ?>
     691                            </label>
     692                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_student_type" name="cbedu_result_std_student_type" value="<?php echo esc_attr($student_type); ?>" placeholder="<?php esc_attr_e('e.g., Regular, Private', 'edu-results'); ?>" />
     693                        </div>
     694                       
     695                        <div class="cbedu-field-group">
     696                            <label class="cbedu-field-label">
     697                                <?php esc_html_e('Result Status', 'edu-results'); ?>
     698                            </label>
     699                            <div style="display: flex; gap: 20px; align-items: center; margin-top: 8px;">
     700                                <label style="display: flex; align-items: center; gap: 6px; cursor: pointer; font-weight: normal;">
     701                                    <input type="radio" id="cbedu_result_std_result_status_passed" name="cbedu_result_std_result_status" value="Passed" <?php checked($result_status, 'Passed'); ?> />
     702                                    <?php esc_html_e('Passed', 'edu-results'); ?>
     703                                </label>
     704                                <label style="display: flex; align-items: center; gap: 6px; cursor: pointer; font-weight: normal;">
     705                                    <input type="radio" id="cbedu_result_std_result_status_failed" name="cbedu_result_std_result_status" value="Failed" <?php checked($result_status, 'Failed'); ?> />
     706                                    <?php esc_html_e('Failed', 'edu-results'); ?>
     707                                </label>
     708                            </div>
     709                        </div>
     710                    </div>
     711
     712                    <div class="cbedu-field-row">
     713                        <div class="cbedu-field-group">
     714                            <label class="cbedu-field-label" for="cbedu_result_std_gpa">
     715                                <?php esc_html_e('GPA', 'edu-results'); ?>
     716                            </label>
     717                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_gpa" name="cbedu_result_std_gpa" value="<?php echo esc_attr($gpa); ?>" placeholder="<?php esc_attr_e('e.g., 4.50', 'edu-results'); ?>" />
     718                        </div>
     719
     720                        <div class="cbedu-field-group">
     721                            <label class="cbedu-field-label" for="cbedu_result_std_was_gpa">
     722                                <?php esc_html_e('GPA (WAS)', 'edu-results'); ?>
     723                            </label>
     724                            <input class="cbedu-field-input" type="text" id="cbedu_result_std_was_gpa" name="cbedu_result_std_was_gpa" value="<?php echo esc_attr($was_gpa); ?>" placeholder="<?php esc_attr_e('e.g., 4.50', 'edu-results'); ?>" />
     725                            <p class="cbedu-field-description"><?php esc_html_e('GPA Without Additional Subject', 'edu-results'); ?></p>
     726                        </div>
     727                    </div>
     728                </div>
     729            </div>
     730        </div>
    503731    <?php
    504732    }
     
    509737     * @param object $post The post object.
    510738     * @throws Some_Exception_Class If there is an error retrieving the registration number or the students.
    511      * @return void
    512      */
    513     private function render_registration_number_input($post)
    514     {
    515         // Get current value
    516         $current_value = get_post_meta($post->ID, 'cbedu_result_std_registration_number', true);
    517    
    518         // Translatable string with text domain
    519         $label = __('Registration Number:', 'edu-results');
    520    
    521         echo '<tr><td><label for="cbedu_result_std_registration_number">' . esc_html($label) . '</label></td>';
    522         echo '<td><input style="padding: 7px 10px;width: 100%;" type="text" id="cbedu_result_std_registration_number" name="cbedu_result_std_registration_number" class="cbedu-registration-number-autocomplete" value="' . esc_attr($current_value) . '" placeholder="Start typing...">';
    523         echo '</td></tr>';
    524     }
    525    
    526 
    527 
    528739    /**
    529740     * Saves the result fields for a given post ID.
     
    534745    {
    535746        if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
     747            return;
     748        }
     749
     750        // Skip auto-draft, trash, and inherit posts
     751        $post_status = get_post_status($post_id);
     752        if (in_array($post_status, array('auto-draft', 'trash', 'inherit'))) {
     753            return;
     754        }
     755
     756        // Check post type
     757        if (get_post_type($post_id) !== 'cbedu_results') {
    536758            return;
    537759        }
     
    624846        if (get_post_type($post_id) !== 'cbedu_results') return;
    625847
     848        // Skip auto-draft, trash, and inherit posts
     849        $post_status = get_post_status($post_id);
     850        if (in_array($post_status, array('auto-draft', 'trash', 'inherit'))) return;
     851
    626852        // Get the registration number from the 'cbedu_results' post meta
    627853        $registration_number = get_post_meta($post_id, 'cbedu_result_std_registration_number', true);
     854
     855        // Skip if no registration number is set
     856        if (empty($registration_number)) return;
    628857
    629858        // Find the 'cbedu_students' post with this registration number
     
    642871            // Check if the title is different from the current title of 'cbedu_results' post
    643872            if (get_the_title($post_id) !== $student_post_title) {
     873                // Unhook to prevent infinite loop
     874                remove_action('save_post', array($this, 'update_cbedu_results_title_on_save'));
     875               
    644876                // Update the title of 'cbedu_results' post               
    645877                wp_update_post(array(
     
    647879                    'post_title' => $student_post_title
    648880                ));
     881               
     882                // Re-hook the action
     883                add_action('save_post', array($this, 'update_cbedu_results_title_on_save'));
    649884            }
    650885        }
     
    662897        // Check for autosave
    663898        if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
     899
     900        // Skip auto-draft, trash, and inherit posts
     901        $post_status = get_post_status($post_id);
     902        if (in_array($post_status, array('auto-draft', 'trash', 'inherit'))) return;
    664903
    665904        // Check the post type
  • edu-results-publishing/trunk/inc/lib/custom-functions.php

    r3022038 r3422911  
    1 <?php
     1<?php
     2
    23namespace cbedu\inc\lib\CBEDUCustomFunctions;
    34
    4 if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
     5if (! defined('ABSPATH')) exit; // Exit if accessed directly
    56
    6 class CBEDUCustomFunctions {
     7class CBEDUCustomFunctions
     8{
    79    private $prefix;
    810    private $required_taxonomies = [
     
    1315    ];
    1416
    15     public function __construct($prefix) {
     17    public function __construct($prefix)
     18    {
    1619        $this->prefix = $prefix;
    1720        add_action('save_post', array($this, 'check_taxonomy_requirements'), 10, 3);
     
    1922    }
    2023
    21     public function check_taxonomy_requirements($post_id, $post, $update) {
    22         if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE || $post->post_type != $this->prefix . 'results') return;
     24    //auto save if taxonomy not selected
     25    public function check_taxonomy_requirements($post_id, $post, $update)
     26    {
    2327
     28        // 1) Safety checks
     29        if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
     30            return;
     31        }
     32
     33        if (! $post || $post->post_type !== $this->prefix . 'results') {
     34            return;
     35        }
     36
     37        if (! current_user_can('edit_post', $post_id)) {
     38            return;
     39        }
     40
     41        // 2) ONLY run when user is trying to publish
     42        //    (Publish button / publish action)
     43        $new_status      = isset($_POST['post_status']) ? sanitize_text_field($_POST['post_status']) : '';
     44        $original_status = isset($_POST['original_post_status']) ? sanitize_text_field($_POST['original_post_status']) : '';
     45
     46        // If not trying to publish right now, do nothing (covers autosave, "Save Draft", updates while draft, etc.)
     47        if ($new_status !== 'publish') {
     48            return;
     49        }
     50
     51        // Optional: if it's already published and user is just updating it, skip
     52        // (remove this block if you ALSO want to enforce taxonomies on updates to published posts)
     53        if ($original_status === 'publish') {
     54            return;
     55        }
     56
     57        // 3) Validate required taxonomies
    2458        $missing_taxonomies = [];
     59
    2560        foreach ($this->required_taxonomies as $taxonomy) {
    26             $terms = wp_get_post_terms($post_id, $taxonomy);
     61            $terms = wp_get_post_terms($post_id, $taxonomy, ['fields' => 'ids']);
    2762            if (empty($terms) || is_wp_error($terms)) {
    2863                $missing_taxonomies[] = $taxonomy;
     
    3065        }
    3166
    32         if (!empty($missing_taxonomies)) {
    33             remove_action('save_post', array($this, 'check_taxonomy_requirements'));
     67        if (empty($missing_taxonomies)) {
     68            return;
     69        }
    3470
    35             wp_update_post([
    36                 'ID'          => $post_id,
    37                 'post_status' => 'draft',
    38             ]);
     71        // 4) Force back to draft + show notice
     72        remove_action('save_post', [$this, 'check_taxonomy_requirements'], 10);
    3973
    40             add_action('save_post', array($this, 'check_taxonomy_requirements'), 10, 3);
     74        wp_update_post([
     75            'ID'          => $post_id,
     76            'post_status' => 'draft',
     77        ]);
    4178
    42             add_filter('redirect_post_location', function ($location) use ($missing_taxonomies) {
    43                 return add_query_arg('cbedu_taxonomy_errors', implode(',', $missing_taxonomies), $location);
    44             });
    45         }
     79        add_action('save_post', [$this, 'check_taxonomy_requirements'], 10, 3);
     80
     81        add_filter('redirect_post_location', function ($location) use ($missing_taxonomies) {
     82            return add_query_arg('cbedu_taxonomy_errors', implode(',', $missing_taxonomies), $location);
     83        });
    4684    }
    4785
    48     public function display_admin_notice() {
     86
     87    public function display_admin_notice()
     88    {
    4989        if (!empty($_GET['cbedu_taxonomy_errors'])) {
    5090            $taxonomy_slugs = explode(',', sanitize_text_field($_GET['cbedu_taxonomy_errors']));
    5191            $taxonomy_names = [];
    52    
     92
    5393            foreach ($taxonomy_slugs as $slug) {
    5494                $taxonomy_obj = get_taxonomy($slug);
     
    5898            // Prepare the list of taxonomy names for display
    5999            $taxonomies_list = esc_html(implode(', ', $taxonomy_names));
    60        
     100
    61101            // Use sprintf for formatting and make the string translatable
    62102            $error_message = sprintf(
     
    64104                $taxonomies_list
    65105            );
    66        
     106
    67107            echo '<div class="error"><p>' . $error_message . '</p></div>';
    68108        }
    69            
    70109    }
    71110}
  • edu-results-publishing/trunk/inc/lib/custom-posts.php

    r3019484 r3422911  
    127127            'labels' => $labels,
    128128            'public' => true,
    129             'publicly_queryable' => true,
     129            'publicly_queryable' => false,
    130130            'show_ui' => true,
    131131            'show_in_menu' => false,
  • edu-results-publishing/trunk/inc/lib/shortcode.php

    r3019484 r3422911  
    5757        ob_start(); ?>
    5858        <div class="cbedu-results-search-form-area">
    59             <form action="javascript:void(0)" method="post" id="cbedu-results-form">
    60                 <!-- Examination Dropdown -->
    61                 <div class="cbedu-results-search-form-single-element-area">
    62                     <div class="cbedu-results-search-form-single-element">
    63                         <label for="examination"><?php _e('Examination:', 'edu-results'); ?></label>
    64                         <select name="examination" id="examination" required>
    65                             <option value=""><?php _e('Select Examination', 'edu-results'); ?></option>
    66                             <?php
    67                             $examinations = get_terms('cbedu_examinations', array('hide_empty' => false));
    68                             foreach ($examinations as $examination) {
    69                                 echo '<option value="' . esc_attr($examination->slug) . '">' . esc_html($examination->name) . '</option>';
    70                             }
    71                             ?>
    72                         </select>                   
    73                     </div>
    74                     <div class="cbedu-error-message" id="cbedu-examination-error"></div>
    75                 </div><!--/ Examination Dropdown -->
    76 
    77 
    78                 <!-- Year Dropdown -->
    79                 <div class="cbedu-results-search-form-single-element-area">
    80                     <div class="cbedu-results-search-form-single-element">
    81                         <label for="year"><?php _e('Year:', 'edu-results'); ?></label>
    82                         <select name="year" id="year" required>
    83                             <option value=""><?php _e('Select Year', 'edu-results'); ?></option>
    84                             <?php
    85                                 $years = get_terms('cbedu_session_years', array('hide_empty' => false));
    86                                 foreach ($years as $year) {
    87                                     echo '<option value="' . esc_attr($year->slug) . '">' . esc_html($year->name) . '</option>';
     59            <div class="cbedu-search-form-header">
     60                <h2>🎓 Student Result Search</h2>
     61                <p>Enter your details below to view your examination results</p>
     62            </div>
     63           
     64            <form action="javascript:void(0)" method="post" id="cbedu-results-form" class="cbedu-modern-form">
     65                <div class="cbedu-form-grid">
     66                    <!-- Examination Dropdown -->
     67                    <div class="cbedu-form-field">
     68                        <label for="examination">
     69                            <span class="label-icon">📝</span>
     70                            <?php _e('Examination', 'edu-results'); ?>
     71                            <span class="required">*</span>
     72                        </label>
     73                        <div class="cbedu-select-wrapper">
     74                            <select name="examination" id="examination" required>
     75                                <option value=""><?php _e('Select Examination', 'edu-results'); ?></option>
     76                                <?php
     77                                $examinations = get_terms('cbedu_examinations', array('hide_empty' => false));
     78                                foreach ($examinations as $examination) {
     79                                    echo '<option value="' . esc_attr($examination->slug) . '">' . esc_html($examination->name) . '</option>';
    8880                                }
    89                             ?>
    90                         </select>                   
    91                     </div>
    92                     <div class="cbedu-error-message" id="cbedu-year-error"></div>
    93                 </div><!--/ Year Dropdown -->
    94 
    95                 <!-- Board Dropdown -->
    96                 <div class="cbedu-results-search-form-single-element-area">
    97                     <div class="cbedu-results-search-form-single-element">
    98                         <label for="board"><?php _e('Board:', 'edu-results'); ?></label>
    99                         <select name="board" id="board" required>
    100                             <option value=""><?php _e('Select Board', 'edu-results'); ?></option>
    101                             <?php
    102                                 $boards = get_terms('cbedu_boards', array('hide_empty' => false));
    103                                 foreach ($boards as $board) {
    104                                     echo '<option value="' . esc_attr($board->slug) . '">' . esc_html($board->name) . '</option>';
    105                                 }
    106                             ?>
    107                         </select>                   
    108                     </div>
    109                     <div class="cbedu-error-message" id="cbedu-board-error"></div>
    110                 </div><!--/ Board Dropdown -->
    111 
    112                 <!-- Department/Group Dropdown -->
    113                 <div class="cbedu-results-search-form-single-element-area">
    114                     <div class="cbedu-results-search-form-single-element">
    115                         <label for="department_group"><?php _e('Department/Group:', 'edu-results'); ?></label>
    116                         <select name="department_group" id="department_group" required>
    117                             <option value=""><?php _e('Select Department/Group', 'edu-results'); ?></option>
    118                             <?php
    119                                 $groups = get_terms('cbedu_department_group', array('hide_empty' => false));
    120                                 foreach ($groups as $group) {
    121                                     echo '<option value="' . esc_attr($group->slug) . '">' . esc_html($group->name) . '</option>';
    122                                 }
    123                             ?>
    124                         </select>                   
    125                     </div>
    126                     <div class="cbedu-error-message" id="cbedu-department-group-error"></div>
    127                 </div><!--/ Department/Group Dropdown -->
    128 
    129                 <!-- Registration Number Input -->
    130                 <div class="cbedu-results-search-form-single-element-area">
    131                     <div class="cbedu-results-search-form-single-element">
    132                         <label for="registration_number"><?php _e('Registration Number:', 'edu-results'); ?></label>
    133                         <input type="text" name="registration_number" id="registration_number" placeholder="<?php echo esc_attr($placeholder); ?>" required>                   
    134                     </div>
    135                     <div class="cbedu-error-message" id="cbedu-registration-number-error"></div>
    136                 </div><!--/ Registration Number Input -->
    137 
    138                 <!-- Roll Input -->
    139                 <div class="cbedu-results-search-form-single-element-area">
    140                     <div class="cbedu-results-search-form-single-element">
    141                         <label for="roll"><?php _e('Roll:', 'edu-results'); ?></label>
    142                         <input type="text" name="roll" id="roll" placeholder="Enter Roll" required>                   
    143                     </div>
    144                     <div class="cbedu-error-message" id="cbedu-roll-error"></div>
    145                 </div><!--/ Roll Input -->
    146 
     81                                ?>
     82                            </select>
     83                        </div>
     84                        <div class="cbedu-error-message" id="cbedu-examination-error"></div>
     85                    </div>
     86
     87                    <!-- Year Dropdown -->
     88                    <div class="cbedu-form-field">
     89                        <label for="year">
     90                            <span class="label-icon">📅</span>
     91                            <?php _e('Year', 'edu-results'); ?>
     92                            <span class="required">*</span>
     93                        </label>
     94                        <div class="cbedu-select-wrapper">
     95                            <select name="year" id="year" required>
     96                                <option value=""><?php _e('Select Year', 'edu-results'); ?></option>
     97                                <?php
     98                                    $years = get_terms('cbedu_session_years', array('hide_empty' => false));
     99                                    foreach ($years as $year) {
     100                                        echo '<option value="' . esc_attr($year->slug) . '">' . esc_html($year->name) . '</option>';
     101                                    }
     102                                ?>
     103                            </select>
     104                        </div>
     105                        <div class="cbedu-error-message" id="cbedu-year-error"></div>
     106                    </div>
     107
     108                    <!-- Board Dropdown -->
     109                    <div class="cbedu-form-field">
     110                        <label for="board">
     111                            <span class="label-icon">🏛️</span>
     112                            <?php _e('Board', 'edu-results'); ?>
     113                            <span class="required">*</span>
     114                        </label>
     115                        <div class="cbedu-select-wrapper">
     116                            <select name="board" id="board" required>
     117                                <option value=""><?php _e('Select Board', 'edu-results'); ?></option>
     118                                <?php
     119                                    $boards = get_terms('cbedu_boards', array('hide_empty' => false));
     120                                    foreach ($boards as $board) {
     121                                        echo '<option value="' . esc_attr($board->slug) . '">' . esc_html($board->name) . '</option>';
     122                                    }
     123                                ?>
     124                            </select>
     125                        </div>
     126                        <div class="cbedu-error-message" id="cbedu-board-error"></div>
     127                    </div>
     128
     129                    <!-- Department/Group Dropdown -->
     130                    <div class="cbedu-form-field">
     131                        <label for="department_group">
     132                            <span class="label-icon">📚</span>
     133                            <?php _e('Department/Group', 'edu-results'); ?>
     134                            <span class="required">*</span>
     135                        </label>
     136                        <div class="cbedu-select-wrapper">
     137                            <select name="department_group" id="department_group" required>
     138                                <option value=""><?php _e('Select Department/Group', 'edu-results'); ?></option>
     139                                <?php
     140                                    $groups = get_terms('cbedu_department_group', array('hide_empty' => false));
     141                                    foreach ($groups as $group) {
     142                                        echo '<option value="' . esc_attr($group->slug) . '">' . esc_html($group->name) . '</option>';
     143                                    }
     144                                ?>
     145                            </select>
     146                        </div>
     147                        <div class="cbedu-error-message" id="cbedu-department-group-error"></div>
     148                    </div>
     149
     150                    <!-- Registration Number Input -->
     151                    <div class="cbedu-form-field">
     152                        <label for="registration_number">
     153                            <span class="label-icon">🎫</span>
     154                            <?php _e('Registration Number', 'edu-results'); ?>
     155                            <span class="required">*</span>
     156                        </label>
     157                        <input type="text" name="registration_number" id="registration_number"
     158                               placeholder="<?php echo esc_attr($placeholder); ?>" required>
     159                        <div class="cbedu-error-message" id="cbedu-registration-number-error"></div>
     160                    </div>
     161
     162                    <!-- Roll Input -->
     163                    <div class="cbedu-form-field">
     164                        <label for="roll">
     165                            <span class="label-icon">🔢</span>
     166                            <?php _e('Roll', 'edu-results'); ?>
     167                            <span class="required">*</span>
     168                        </label>
     169                        <input type="text" name="roll" id="roll" placeholder="Enter Roll" required>
     170                        <div class="cbedu-error-message" id="cbedu-roll-error"></div>
     171                    </div>
     172                </div>
    147173               
    148174                <!-- Submit Button -->
    149                 <div class="cbedu-results-search-form-single-element cbedu-results-search-form-submit">
    150                     <input type="submit" value="<?php echo esc_attr($button_text); ?>">
     175                <div class="cbedu-form-submit-wrapper">
     176                    <button type="submit" class="cbedu-submit-btn">
     177                        <span class="btn-icon">🔍</span>
     178                        <span class="btn-text"><?php echo esc_html($button_text); ?></span>
     179                        <span class="btn-arrow">→</span>
     180                    </button>
    151181                </div>
    152                
    153182            </form>       
    154183
    155             <div id="cbedu-ajax-result-preloader" style="display: none;">
    156                 <div class="cbedu-ajax-preloader-ellipsis"><div></div><div></div><div></div><div></div></div>
     184            <div id="cbedu-ajax-result-preloader" class="cbedu-preloader-wrapper" style="display: none;">
     185                <div class="cbedu-preloader-content">
     186                    <div class="cbedu-ajax-preloader-ellipsis"><div></div><div></div><div></div><div></div></div>
     187                    <p class="cbedu-preloader-text">Loading your results...</p>
     188                </div>
    157189            </div>
     190           
    158191            <!-- CBEDU Results Display -->
    159192            <div id="cbedu-results-display"></div>
  • edu-results-publishing/trunk/readme.txt

    r3022038 r3422911  
    22Contributors: hmbashar
    33Donate link: https://www.buymeacoffee.com/hmbashar
    4 Tags: Result, WP Result Plugin, EDU Results, academic, student, education, examination, report card, gradebook, transcript, college management, university result
     4Tags: Result, WP Result Plugin, EDU Results, academic
    55Requires at least: 4.7
    6 Tested up to: 6.4.2
    7 Stable tag: 1.0.2
     6Tested up to: 6.9
     7Stable tag: 1.2.0
    88Requires PHP: 7.0
    99License: GPLv2 or later
     
    1031038. Search Form with Result Sheet
    1041049. Result Sheet
     10510. New Search Form
     10611. New Result Sheet style.
     10712. New Student fields
    105108
    106109== Changelog ==
     110
     111= 1.2.0 =
     112* Enhanced features and improvements
     113* Bug fixes and performance optimization
     114* Updated compatibility with WordPress 6.9
    107115
    108116= 1.0.2 =
Note: See TracChangeset for help on using the changeset viewer.