This is really easy to achieve, you simply use activation blocks for door opening instead of opening the door directly, and then as said before you use area activation blocks in front of the door to stop it from being able to be manually opened, or simply make the door not public but make the activation block that is connected to the door public.
This also applies to every other situation where you want an output from a non-logic block, such as gravity modules. The answer is you hide the gravity module but connect it to an activation block, the activation block is then daisy chained to whatever reaction you want to happen when you change gravity.
One thing to note about the area activation blocks is that it is impossible to completely cover any door that isn't exactly square, you can see past them where you have wedge blocks:
The only solution I know for this is
1- remove the door that is behind a corner block and replace it with an activation area block
2- Have thick doors ... If you want to put wedging around the edges do it with a 1 block gap between the actual door and the frame, then place the activation area block behind the wedged door frame:
Any other solutions to this problem are welcome - having doors that are 5 blocks deep so that they can't be opened manually but still have a wedged frame is a little annoying.