New Zealand batted on for an hour before declaring their first innings at 593 for eight, with Franklin unbeaten on 122 on Saturday.
South Africa were 48 for one wicket at lunch, losing captain Graeme Smith, and still needed another 546 to avoid the follow-on.
Franklin, who resumed on 93 after sharing a record eighth wicket stand of 256 with captain Stephen Fleming Friday, took 40 minutes and 35 balls to add the seven runs he needed for his century, reaching the landmark with an off-drive for four off Dale Steyn.
With his hundred completed, the left-handed Franklin hammered two more boundaries in the same Steyn over and lofted Makhaya Ntini, South Africa's leading bowler, over wide mid-on for six.
Patel, who had to wait until the third morning to step on to the field in his first Test, batted confidently to make 27 not out. He and Franklin added 58 in 13 overs before the declaration.
Franklin, who had previously made two first-class centuries, including a double hundred, faced 268 balls in his six-hour innings, hitting 14 fours and a six.
South Africa's bowlers largely looked powerless to stop the runs on an easy-paced pitch, although Patel on six edged Ntini dangerously close to Boeta Dippenaar at first slip. Dippenaar made the match's most significant error Friday when he dropped Fleming on 136, with the New Zealand captain going on to score a ground record 262.
Fleming quickly introduced his spinners into the attack after Smith and Dippenaar made a confident start to the South African innings, with left-armer Daniel Vettori bowling the tenth over and off-spinner Patel joining him three overs later.
Smith pushed forward at Patel's third ball and the ball looped off the toe of his bat for Patel to take a return catch. Smith stood his ground but television umpire Marais Erasmus confirmed the ball went to Patel on the full.