Pregunta

Tengo una clase Document que es responsable de mantener el documento que finalmente se gzipped y luego impreso en la página. En ese documento sostiene DOCTYPE del documento. El problema que estoy enfrentando es cómo implementar correctamente mostrando el Doctype.

Por ejemplo: podría crear una matriz de doctypes populares que son los más utilizados, y luego si introduce 'estricta', sería recoger automáticamente HTML 4.01 Strict. Si no hay un tipo de documento conocido, se podría asumir que está entrando en un tipo de documento personalizado y simplemente mostrar lo que ha introducido. Esto parece una propenso a errores y clumbsy.

    $document->setDoctype("strict");

    ..... in a class far, far, away........
    function setDocType($type)
    {
        if(in_array($type, $this->doctypes))
         {
             $this->doctype = $this->doctypes[$type];
         }
         else
         {
             $this->doctype = $type;
         }
    }

Otra manera de hacerlo sería tener simplemente para entrar en todo el tipo de documento cada vez.

$document->setDoctype('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">');

¿Cómo hacer frente a este problema?

¿Fue útil?

Solución

Depende de si desea permitir entrar doctypes personalizados. Si se tiene en cuenta esa situación una excepción probablemente debería lanzar una excepción cuando alguien intenta utilizar tipo de documento no definido. También podría proporcionar un método para la definición de un tipo de documento a medida y la fuerza que utilicen este método antes de establecer el tipo de documento real.

Me gustaría hacer algo como esto:

class Document {
    private $doctypes = array(
        'html4' => '...',
        'xhtml1strict' => '...'
    );

    private $doctype = null;

    public function addCustomDocType($name, $definition) {
        if (empty($this->doctypes[$name])) {
            $this->doctypes[$name] = $definition;
        } else {
            throw new Exception('Definition already exists');
        }
    }

    public function setDocType($name) {
        if (!empty($this->doctypes[$name])) {
            $this->doctype = $this->doctypes[$name];
        } else {
            throw new Exception('Doctype not found');
        }
    }
}

La segunda solución en la que debe escribir la definición tipo de documento es la OMI feo y yo lo evitaría.

Otros consejos

Creo que sólo debe obtener de la lista de tipo de documento W3C. http://www.w3.org/QA/2002/ 04 / válida-DTD-list.html

¿Los usuarios autorizados a entrar en un tipo de documento a medida?

Tal vez crear una clase base

Doc

Y extenderlo a cada tipo, por ejemplo:

StrictDoc extiende Doc etc.

Y va a establecer su propio tipo de documento para cada uno. Si desea añadir a los tipos doc, sólo tiene que crear otra clase que se extiende Doc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top