Adobe Character Animator 2023

Adobe Character Animator: Eigenen Character erstellen

1.) Vorlage/ Muster besorgen und diese (z.B. ) mit Photoshop anpassen.

2. ) In den Pro-Modus wechseln

3.) „Anpassen“ auswählen

4.) PSD-Datei in „Projekt“ reinschieben und anschließen mit einem Doppelklick öffnen

5.) Datei anschließend exportieren („Datei“ -> „Exportieren“ -> „Marionette…“) als .puppet-Datei

6.) Zu Home wechseln

7.) Start-Modus verwenden und Marionette auswählen/ Importieren.

 

WordPress: Custom Post Type Menü mit einem Untermenü für z.B. „Einstellungen“

WordPress: Custom Post Type Menü mit einem Untermenü für z.B. „Einstellungen“ oder „Optionen“

Ziel ist es, das oben in der Grafik abgebildeten Menü mit den Unterpunkten zu bauen.

<?php

/**

Plugin Name: SYSv2 
Plugin URI: https://www.deine-url-der-hompage.de 
Description: Ticketsystem
Version: 1 
Author: Hans
Author URI: https://www.deine-url-der-hompage.de

Ticketsystem 

**/


function ah_custom_post_type()
{
$labels = array(
'name' => 'sysV2 Einträge',
'singular_name' => 'sysV2',
'menu_name' => 'sysV2',
'parent_item_colon' => '',
'all_items' => 'Alle Einträge',
'view_item' => 'Eintrag ansehen',
'add_new_item' => 'Neuer Eintrag',
'add_new' => 'Hinzufügen',
'edit_item' => 'Eintrag bearbeiten',
'update_item' => 'Update Eintrag',
'search_items' => '',
'not_found' => '',
'not_found_in_trash' => '',
);
$rewrite = array(
'slug' => 'sysV2',
'with_front' => true,
'pages' => true,
'feeds' => true,
);
$args = array(
'labels' => $labels,
// 'supports' => array( 'title', 'editor', 'excerpt', 'thumbnail', 'comments', 'trackbacks', ),
'supports' => array( 'title', 'editor', 'excerpt', 'thumbnail', 'comments', ),
'taxonomies' => array( 'category', 'post_tag' ),
'hierarchical' => false,
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'show_in_nav_menus' => true,
'show_in_admin_bar' => true,
'menu_position' => 5,
'can_export' => false,
'has_archive' => true,
'exclude_from_search' => false,
'publicly_queryable' => true,
'rewrite' => $rewrite,
'capability_type' => 'page',
);
register_post_type( 'sysV2', $args );

}
// Hook into the 'init' action
add_action( 'init', 'ah_custom_post_type', 0 );


add_action('admin_menu', 'add_tutorial_cpt_submenu_example');

function add_tutorial_cpt_submenu_example()
{

add_submenu_page(
'edit.php?post_type=sysV2', //$parent_slug
'SYS - EINSTELLUNGEN', //$page_title
'Einstellungen', //$menu_title
'manage_options', //$capability
'sys_einstellungen',//$menu_slug
'sys_subpage_example_render_page'//$function
);
}

//add_submenu_page callback function

function inctasys_subpage_example_render_page()
{
echo '<h2> SYSv2 - EINSTELLUNGEN </h2>
<br>
Kostenloses TicketSystem 

';
}

Im oberen Abschnitt (fett) wird der Custom Post Type erstellt. Mit der Funktion ‚add_tutorial_cpt_submenu_example‘  wird der Unterpunkt „Einstellungen“ erstellt (hier in Rot dargestellt).

 

WordPress: Plugin-Programmierung

WORDPRESS: PLUGIN PROGRAMMIERUNG

1.] im Ordner „Plugins“ eine PHP-Datei anlegen. Der Name dabei ist nicht relevant.
2.] den Namen des Plugins hinter „Plugin Name:“eingeben.

Den Plugin Namen darf es nicht im offiziellen Verzeichnis von WordPress geben, daher vorher im Online-Verzeichnis nachschauen.

3.] das Plugin erscheint im WordPress-Backend unter „Installierte Plugins“. Nach der Aktivierung ist es angemeldet und jede Änderung im Code steht direkt zur Verfügung.
HOOKS: Aktionen und Filter

Eine WordPress-Homepage besteht aus einer ganzen Reihe von Funktionen und Datenbankabfragen, wobei WordPress und das Theme zusammenarbeiten, um Text, Bilder, Stylesheets und andere Dateien auszugeben. Der Browser interpretiert all dies und fasst sie alle zu einer Webseite zusammen. Es wird sich an entsprechender Stelle „eingehakt“ und entweder den Wert (add_filter) oder eine Aktion (add_action) ausgeführt.
In seinem gesamten Code hat WordPress „Hooks“ enthalten, damit die Leute ihren eigenen Code an diese Hooks „hängen“ können. Viele der Customizer-Theme-Code-Snippets sind in PHP geschrieben.

Aktionen- und Filter

> Mit Aktionen kann man an einem bestimmten Punkt der Seitenverarbeitung zusätzliche Funktionen hinzufügen. Beispielsweise möchte man möglicherweise zusätzliche Widgets oder Menüs hinzufügen oder der Seite eine Werbebotschaft hinzufügen.

> Mit Filtern kann man Daten abfangen und ändern, während sie verarbeitet werden. Du kannst beispielsweise eine andere CSS-Klasse in ein WordPress-HTML-Element einfügen oder einige der Seitenblöcke ändern.

Weiterführende Informationen zu den Hooks:

https://codex.wordpress.org/Plugin_API/Action_Reference
https://codex.wordpress.org/Plugin_API/Filter_Reference

4.] add_action und add_filter: Titel der Webseite wird geändert mit add_filter und mit add_action wird bei jeder Veränderung eines Beitrages eine E-Mail versendet.
<?php

/* 
Plugin Name: widbasa_tut
Description: WordPress Plugin 
Author: WiDBASA
Version: 1.0


*/

// Filter

add_filter ("the_title" , "widbasa_title");

function widbasa_title( $title )
{
return "Titel: " . $title;
}


// Aktion
/* 
Bei Veränderung (Aktualisierung) eines Beitrages, wird
im Hintergund eine E-Mail versendet   
*/
add_action('edit_post', 'widbasa_post');
function widbasa_post ($id) {
wp_mail( "mail@widbasa.de",
"Info",
"Der Beitrag #{$id} wurde verändert"); 
}
Plugin-Informationen erweitert.
Der Titel wurde über den add_action entsprechend angepasst.

GRUNDLEGENDER AUFBAU

Funktionsprinzip Plugins/Templates

Theoretisch könnte man seinen Code auch in die function.php (im entsprechenden Theme-Ordner) einfügen. Technisch würde das funktionieren, wird aber nicht empfohlen. In der function.php sollten sich nur auf das Layout/ die Optik kümmern.

 


PrOgrAMMIERUNG EINES ShortCodeS
add_shortcode ("widbasa_shortcode", "widbasa_shortcode_function");

function widbasa_shortcode_function () 
{

// NICHT MIT ECHO ARBEITEN!!! 
return "<div class='meineClasse'> Hello World </div>";

}

Diesen kann man über seinen WordPress-Editor einfach einbinden:

Möchte man noch JavaScript und CSS einbinden, kann man das folgendermaßen machen:

add_action("wp_enqueue_scripts", "widbasa_scripts");

function widbasa_scripts (){

// CSS
wp_enqueue_style( 'widbasa_styles', plugins_url( 'style.css', __FILE__ ) );
// JAVASCRIPT
wp_enqueue_script( 'widbasa_script', plugins_url( 'script.js', __FILE__ ) );

}

In diesem Beispiel ist die CCS- und JavaScript-Datei im Plugin-Pfad. Über den Befehl „plugins_url“ werden die Dateien style.css/ script.js eingebunden.

Inhalt von script.js könnte zum Testzweck einfach sein:

alert("Guten Tag");

Das ist nur eine einfache Ausgabe in separaten Fenster.

Inhalt der style.css könnte sein:

.meineClasse 
{
padding: 10px; 
color: green; 
background-color: red; 
display: block; 

}

JAVA-SCRIPT: Basics

JAVA-SCRIPT: BASICS

 

<!DOCTYPE html>
<html lang="de">

<head>

<title>Hallo Welt</title>

<meta charset="utf-8"/>

<script type="text/javascript">

function meldung (text)
{ 
var name;
name = "Max Muster";

var zahl1;
var zahl2;

zahl1=parseFloat (document.getElementById("zahl1").value);
zahl2=parseFloat (document.getElementById("zahl2").value);
// parseFloat wandelt Zeichenkette in Double-Zahl um

ergebnis= zahl1 + zahl2;
document.getElementById("ergebnis").innerHTML=ergebnis;

// alert("Hallo, das ist eine Meldung"+ "\n" + text + "\n" + name + "\n" + ergebnis);
}


function geldanlage ()
{
var kapital=1000;
var zinssatz=4.7;
var laufzeit=10;
var werte=kapital+"<br>"; 

for(var i=1;i<=laufzeit;i++)
{ 
kapital=kapital+kapital*zinssatz/100;
werte=werte+kapital.toFixed(2) + "<br>"; 
}
document.getElementById("ausgabe").innerHTML=werte;

}


function usereingabe()
{
var username;
var heute = new Date();
username=prompt("Bitte Namen eingeben", "Dein Name..."); 
document.getElementById("username").innerHTML=heute.toLocaleString('de-DE') + "<br> User "+username; 
}


</script>

</head>

<!-- Onload=Seitenstart -->

<body onload="usereingabe()">

<div id="username"></div>

<h2>Arbeiten mit Javascript</h2>

<label>
<fieldset>
<h4>1. Zahl</h4>
<input type=text id="zahl1"></input><br>
<h4>2. Zahl</h4>
<input type=text id="zahl2"></input><br><br>
<input type="button" value="Addieren" id="druecken" onclick="meldung('Guten Morgen')">
<br><br>

<div id="ergebnis"></div>

</fieldset>
</label>

<input type="button" value="Geldanlage" id="anlage" onclick="geldanlage()">
<br><br>

<div id="ausgabe"></div>

</body>


</html>

Ajax und php: laender

OOP: Formular mit Datenbankabfrage/Speicherung

OOP PHP: DATENBANKZUGRIFF

Zu function getZugangsdaten():
Besser wäre es, die Daten zu verschlüsseln.
Beispiel:
eins = 1
fünf = 5
tier = Vogel
$init_array = parse_ini_file(„sample.ini“);
diese Datei in einem passwort-geschützten Verzeichnis (htaccess) ablegen.

db.class.php

<?php
// >Zugriff auf eine MySQL-Datenbank als Klasse
class db 
{
private $server="";
private $user="";
private $passwort;
private $datenbank="";
public $pdo;

function getZugangsdaten ()
{ 
$this->server="localhost";
$this->user="root";
$this->passwort="passwort";
$this->datenbank="seminar"; 
} // so nicht machen! Besser wäre, wenn die Daten in einer Datei angelegt sind, die verschlüsselt sind
function __construct()
{
self::getZugangsdaten(); // Weil es eine Methode einer Klasse, daher self
try { 
$this->pdo = new PDO ("mysql:host=$this->server;dbname=$this->datenbank;port=3306;charset=utf8",$this->user,$this->passwort);
}
catch (PDOException $e){
echo "Datenbankfehler: " . $e->getMessage()."<br>"; 
}
} 
function runsql($sql,$args = NULL) // 2 Parameter ist optional
{
if (!$args)
{
return $this->pdo->query($sql);
}

$stmt = $this->pdo->prepare($sql); // Vorbereiten des SQL
$stmt->execute($args);
return $stmt; 
} 
function newKunde ($args)
{
// die(print_r($args));
$sql="insert into kunden (anrede,vorname,nachname,strasse,plz,wohnort,gebdat) values (:w1,:w2,:w3,:w4,:w5,:w6,:w7)";
$stmt = $this->pdo->prepare($sql); // Vorbereiten des SQL
$stmt->bindParam(":w1", $args[0]);
$stmt->bindParam(":w2", $args[1]);
$stmt->bindParam(":w3", $args[2]);
$stmt->bindParam(":w4", $args[3]);
$stmt->bindParam(":w5", $args[4]);
$stmt->bindParam(":w6", $args[5]);
$stmt->bindParam(":w7", $args[6]); 
$stmt->execute(); 
} 
}

?>

datenbank.php

<?php
// >Zugriff auf eine MySQL-Datenbank als Klasse
class db 
{
private $server="";
private $user="";
private $passwort;
private $datenbank="";
public $pdo;

function getZugangsdaten ()
{ 
$this->server="localhost";
$this->user="root";
$this->passwort="passwort";
$this->datenbank="seminar"; 
} // so nicht machen! Besser wäre, wenn die Daten in einer Datei angelegt sind, die verschlüsselt sind
function __construct()
{
self::getZugangsdaten(); // Weil es eine Methode einer Klasse, daher self
try { 
$this->pdo = new PDO ("mysql:host=$this->server;dbname=$this->datenbank;port=3306;charset=utf8",$this->user,$this->passwort);
}
catch (PDOException $e){
echo "Datenbankfehler: " . $e->getMessage()."<br>"; 
}
} 
function runsql($sql,$args = NULL) // 2 Parameter ist optional
{
if (!$args)
{
return $this->pdo->query($sql);
}

$stmt = $this->pdo->prepare($sql); // Vorbereiten des SQL
$stmt->execute($args);
return $stmt; 
} 
function newKunde ($args)
{
// die(print_r($args));
$sql="insert into kunden (anrede,vorname,nachname,strasse,plz,wohnort,gebdat) values (:w1,:w2,:w3,:w4,:w5,:w6,:w7)";
$stmt = $this->pdo->prepare($sql); // Vorbereiten des SQL
$stmt->bindParam(":w1", $args[0]);
$stmt->bindParam(":w2", $args[1]);
$stmt->bindParam(":w3", $args[2]);
$stmt->bindParam(":w4", $args[3]);
$stmt->bindParam(":w5", $args[4]);
$stmt->bindParam(":w6", $args[5]);
$stmt->bindParam(":w7", $args[6]); 
$stmt->execute(); 
} 
}

?>

new.php

<?php
echo "<h1>neuen Kunden aufnehmen</h1>";
?>

<html>
<head>
</head>

<body>

<form method="post" action="save.php">

<table>
<tr><td>Anrede</td>
<td>
<select name="anrede">
<option value="Herr">Herr</option>
<option value="Herr">Frau</option>
<option value="Herr">Firma</option>
</select>
</td></tr>

<tr><td>Vorname</td> <td><input type="text" name="vorname"></td></tr>
<tr><td>Nachname</td> <td><input type="text" name="nachname"></td></tr>
<tr><td>Strasse</td> <td><input type="text" name="strasse"></td></tr>
<tr><td>PLZ</td> <td><input type="text" name="plz"></td></tr>
<tr><td>Wohnort</td> <td><input type="text" name="wohnort"></td></tr>
<tr><td>Geburtstag</td> <td><input type="date" name="gebdat"></td></tr>

<tr><td><input type="submit" name="Speichern" value="Speichern"></td>
<td><input type="reset"></td></tr>

</table>

</form>

</body>

</html>

save.php

<?php

require_once ("classes/db.class.php");
$meineDb = new db();
$args = array ();

$args[]=$_POST["anrede"];
$args[]=$_POST["vorname"];
$args[]=$_POST["nachname"];
$args[]=$_POST["strasse"];
$args[]=$_POST["plz"];
$args[]=$_POST["wohnort"];
$args[]=$_POST["gebdat"];

$meineDb->newKunde($args);
unset($_POST); // Arrayinhalt löschen
header("Location: datenbank.php");


?>

Beispiel: Objektorientierte Programmierung (OOP)

BEISPIEL: OOP UNTER PHP

Beschreibung in den Kommentaren

Ergebnis im Browser:

oop.php

<?php
// Nutzen der Klasse person.class.php
require_once ("classes/person.class.php");
require_once ("classes/kind.class.php");
// neues Object instanziieren (ableiten)

$ich = new person ("Franzel", "Tütenfröhlich", "01.01.1984");
echo "ID-Nummer: ".$ich::$pid."<br>";

//setzen der Eigenschaften
$ich->vorname="Franzel"; 
$ich->nachname="Tütenfröhlich";

$du = new person ("","","");
echo "ID-Nummer: ".$du::$pid."<br>";
$du->vorname="Annabella";
$du->nachname="Zippenstiel";
$du->setGebdat("07.12.1976");

// Aufruf der Methode
echo "Meine Name ist: " .$ich->anzeigeName()." <br>";
echo "Dein Name ist: " .$du->anzeigeName()." <br>";
echo "Ich bin geboren am: ".$du->getGebdat()."<br>";

$er = new Person("Gerd", "Gurke", "12.09.1987");
echo "ID-Nummer: ".$er::$pid."<br>";
echo "Sein Name ist: ".$er->anzeigeName()."<br>";
$kiddy = new kind("Pauline", "Paulchen", "2.2.2001", "Mädchen");
echo "Mein Kind ist ein " .$kiddy->getGeschlecht(). " und heißt: ".$kiddy->anzeigeName();
echo "ID-Nummer: ".$kiddy::$pid."<br>";
?>

person.class.php

<?php
// Klasse für eine Person
class person
{

// Eigenschaften der Klasse
public static $pid=0; //static ohne ein Objekt verwendbar
public $vorname;
public $nachname;
private $gebdat; // Alle Eigenschafen einer Klasse sollten immer
// private sein und nur pber get und set-Methoden 
// veändert werden dürfen (Interface)


function setGebdat ($value)
{
$this->gebdat=$value; 

}

function getGebdat ()
{
return $this->gebdat;

}

//************************************************************************************************************
function __construct($vname, $nname, $gebdat) // Der eigene Konstrukor der Klasse
// zum Vorinstallieren der EIgenschaften, spart Schreibarbeit
{
self::$pid++; // Zugriff auf static mit self:: 
$this->vorname=$vname;
$this->nachname=$nname;
$this->setGebdat($gebdat);
}
//************************************************************************************************************

function getPID()
{
return self::$pid;
}

function anzeigeName() {
//$this ist eine Referenz auf das Objekt selbst
return $this->vorname." ". $this ->nachname;
}



}


?>

 

<?php 
// Kindklasse erbt von person.class.php alle public-eigenschaften und public-methoden
require_once ("person.class.php");

class kind extends person // extends bedeutet beerbt Klasse personimplements
{
public $geschlecht;

function __construct($vname,$nname,$gebdat,$geschlecht)
{
parent:: __construct($vname, $nname, $gebdat); // Aufruf des BasisKonstruktor
$this->geschlecht = $geschlecht;
}

function getGeschlecht() {
return $this->geschlecht;
}

}

?>

WordPress: Individueller Code im Head

WORDPRESS: CODE IM HEAD (NUR AUF DER STARTSEITE)

MOTIVATION / HINTERGRUND

Ich wollte für meine Startseite einen individuellen Befehl im HEAD-Bereich einfügen. Um etwas genauer zu sein, eine Weiterleitung auf eine andere Seite. Ich hatte geschaut, ob ich das direkt in den Theme-Daten mache, aber das schien mit in meiner Konstellation bzw. mit dem vom mir verwendeten Theme etwas aufwendig zu sein. Daher habe ich nach einer Plugin-Lösung gesucht und einiges getestet.

PLUGIN

Das Plugin „Head, Footer and Post Injections“ von S.

Wenn man unter „ONLY THE HOME PAGE“ den entsprechenden Befehl einträgt, wird dieser auch nur auf der Startseite ausgeführt. Das Plugin könnte theoretisch noch mehr.  Nur für mich war dieses Feature relevant.

 

Composer

COMPOSER UNTER WINDOWS

Damit man solche FrameWorks wie OXID,  Lavarel, Flarum etc. installieren kann, braucht man den Composer. Die Installation erfolgt durch einen SSH-Zugang. Bei meinem Webhosting-Paket war das nicht inklusive. Ich müsste das Paket auf Server umstellen und das kostet statt 4,99 € dann 19,99 €.

Ich habe erstmal auf das Upgrade verzichtet und das ganze lokal compiliert. Dazu sind folgende Schritte notwendig:

1.] Installation vom Composer.exe von https://getcomposer.org/download/

2.] CMD starten und „Composer“ eingeben

3.] Installationsbefehl vom entsprechenden Paket eingeben

4.] Dateien auf den Webserver hochladen und Installationsseite öffnen