web-dev-qa-db-fra.com

Comment modifier la structure de l'article?

Parfois, nous devons personnaliser la structure de Joomla! des articles avec des champs personnalisés afin de proposer aux utilisateurs différentes textarea/input où il peut entrer des données telles que la date, l'emplacement, le texte 1, le texte 2, etc.

Ensuite, il est plus facile de gérer le design en amont. Avec les règles CSS, chaque contenu est correctement conçu.

Je sais que je peux le faire avec des composants CCK tels que K2, Seblod, etc.

Y at-il une autre façon sans composant, avec php et en ajoutant quelques modifications à Joomla?

4
Sébastien Gicquel

Je crois avoir votre solution, mais ne piratez PAS le noyau. Nous nous sommes sentis obligés de le faire au fil des ans, et nous en payons le prix, même aujourd'hui, en manquant les mises à jour, en revisitant les hacks chaque fois que nous mettons à jour, et incompatibilité générale avec d'autres composants.

Ce que nous faisons maintenant est la suivante:

  1. Nouvelle table #__content_ext avec un champ clé identique à #__content et une colonne pour chaque champ personnalisé souhaité.
  2. Nouvelle table #__categories_ext avec un champ clé identique à #__categories et une colonne pour chaque champ personnalisé que vous souhaitez peut-être.
  3. Ajouter des champs personnalisés à com_content (nous utilisons et aimons Aixeena CCK qui peut ajouter des champs personnalisés au contenu, aux catégories, et aux menus ) .

À ce stade, vous exploitez tout le code/la logique dans com_content sans un seul noyau. Cependant, vos champs personnalisés sont tous stockés dans les colonnes params et attribs des tables Joomla, ce qui n’est pas idéal pour une utilisation de base de données typique dans un autre code personnalisé dont vous pourriez avoir besoin. C'est là qu'intervient la "magie":

Écrivez un plugin de contenu simple en utilisant l'exemple de code ci-dessous pour créer/mettre à jour les extensions de table décrites ci-dessus. Cela place tous vos champs personnalisés dans des tables personnalisées disponibles pour toutes les tâches pour lesquelles vous en avez besoin en SQL.

public function onContentAfterSave($context=null, $article=null, $isNew=0) {
    if($context == 'com_categories.category') {
        $params = new JRegistry;
        $params->loadString($article->params);
        $myObj = $params->toObject();
        // Use properties from $article and $myObj to create/update #__categories_ext
        // Use $article->id as the primary key if #__categories_ext
        // Your SQL goes here....

    }elseif($context=='com_content.article'){
        $attribs = new JRegistry;
        $attribs->loadString($article->attribs);
        $myObj = $attribs->toObject();
        // Use properties from $article and $myObj to create/update #__content_ext
        // Use $article->id as the primary key if #__content_ext
        // Your SQL goes here....

    }
}

Certes, les données sont stockées deux fois - une fois en tant que contenu personnalisé, et une autre fois dans votre table personnalisée, mais plier cette règle de normalisation dépasse largement le coût du travail et du deuil qu'un piratage de base coûte si vous souhaitez maintenir le site à jour selon les versions de Joomla. . Vous avez également laissé des choses dans un tel état, vous pouvez utiliser tous les com_content et autres extensions qui utilisent com_content sans aucune conséquence de vos hacks.

10
GDP

Je devais faire cela aussi récemment et j'ai suivi quelques exemples en ligne.

Il existe quelques bons exemples, y compris la documentation Joomla ici

Un autre tutoriel de Nice peut être trouvé ici - Ajouter des champs de contenu personnalisés à Joomla

Je réalise que vous ne voulez pas utiliser de CCK, mais vous devriez jeter un œil à Fields Attach ce qui est très bon et simple.

J'espère que ces aide.

3
jonboy

Outre l'extension du noyau, il existe quelques extensions qui permettent d'étendre le contenu de joomla avec des champs personnalisés.

Sinon, les suggestions et les tutoriels fournis dans les autres réponses vous "permettront de continuer".

2
FFrewin